您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
149 行
6.2 KiB
149 行
6.2 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Unity.Mathematics;
|
|
using UnityEditor.UIElements;
|
|
using UnityEditor.VersionControl;
|
|
using UnityEditorInternal;
|
|
using UnityEngine;
|
|
using UnityEngine.Perception.GroundTruth;
|
|
using UnityEngine.UIElements;
|
|
using System.Threading.Tasks;
|
|
using Newtonsoft.Json.Linq;
|
|
using Task = System.Threading.Tasks.Task;
|
|
using Random = UnityEngine.Random;
|
|
|
|
namespace UnityEditor.Perception.GroundTruth
|
|
{
|
|
[CustomEditor(typeof(SemanticSegmentationLabelConfig))]
|
|
class SemanticSegmentationLabelConfigEditor : LabelConfigEditor<SemanticSegmentationLabelEntry>
|
|
{
|
|
protected override LabelConfig<SemanticSegmentationLabelEntry> TargetLabelConfig => (SemanticSegmentationLabelConfig) serializedObject.targetObject;
|
|
|
|
protected override void OnEnableExtended()
|
|
{
|
|
m_MoveButtons.style.display = DisplayStyle.None;
|
|
}
|
|
|
|
public override void PostRemoveOperations()
|
|
{ }
|
|
|
|
protected override void SetupPresentLabelsListView()
|
|
{
|
|
base.SetupPresentLabelsListView();
|
|
|
|
VisualElement MakeItem() =>
|
|
new ColoredLabelElementInLabelConfig(this, m_SerializedLabelsArray);
|
|
|
|
void BindItem(VisualElement e, int i)
|
|
{
|
|
if (e is ColoredLabelElementInLabelConfig addedLabel)
|
|
{
|
|
addedLabel.m_IndexInList = i;
|
|
addedLabel.m_LabelTextField.BindProperty(m_SerializedLabelsArray.GetArrayElementAtIndex(i)
|
|
.FindPropertyRelative(nameof(SemanticSegmentationLabelEntry.label)));
|
|
addedLabel.m_ColorField.BindProperty(m_SerializedLabelsArray.GetArrayElementAtIndex(i)
|
|
.FindPropertyRelative(nameof(SemanticSegmentationLabelEntry.color)));
|
|
addedLabel.UpdateMoveButtonVisibility(m_SerializedLabelsArray);
|
|
}
|
|
}
|
|
|
|
m_LabelListView.bindItem = BindItem;
|
|
m_LabelListView.makeItem = MakeItem;
|
|
}
|
|
|
|
protected override SemanticSegmentationLabelEntry CreateLabelEntryFromLabelString(SerializedProperty serializedArray, string labelToAdd)
|
|
{
|
|
var standardColorList = new List<Color>(SemanticSegmentationLabelConfig.s_StandardColors);
|
|
for (int i = 0; i < serializedArray.arraySize; i++)
|
|
{
|
|
var item = serializedArray.GetArrayElementAtIndex(i);
|
|
standardColorList.Remove(item.FindPropertyRelative(nameof(SemanticSegmentationLabelEntry.color)).colorValue);
|
|
}
|
|
|
|
Color foundColor;
|
|
if (standardColorList.Any())
|
|
foundColor = standardColorList.First();
|
|
else
|
|
foundColor = Random.ColorHSV(0, 1, .5f, 1, 1, 1);
|
|
|
|
return new SemanticSegmentationLabelEntry
|
|
{
|
|
color = foundColor,
|
|
label = labelToAdd
|
|
};
|
|
}
|
|
|
|
protected override SemanticSegmentationLabelEntry ImportFromJsonExtended(string labelString, JObject labelEntryJObject,
|
|
List<SemanticSegmentationLabelEntry> previousEntries, bool preventDuplicateIdentifiers = true)
|
|
{
|
|
bool invalid = false;
|
|
Color parsedColor = Color.black;
|
|
|
|
if (labelEntryJObject.TryGetValue("Color", out var colorToken))
|
|
{
|
|
var colorString = colorToken.Value<string>();
|
|
if (ColorUtility.TryParseHtmlString(colorString, out parsedColor))
|
|
{
|
|
if (preventDuplicateIdentifiers && previousEntries.FindAll(entry => entry.color == parsedColor).Count > 0)
|
|
{
|
|
Debug.LogError("File contains a duplicate Label Color: " + colorString);
|
|
invalid = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Error parsing Color for Label Entry" + labelEntryJObject +
|
|
" from file. Please make sure a string value is provided in the file and that it is properly formatted as an HTML color.");
|
|
invalid = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Error reading the Color field for Label Entry" + labelEntryJObject +
|
|
" from file. Please check the formatting.");
|
|
invalid = true;
|
|
}
|
|
|
|
return new SemanticSegmentationLabelEntry
|
|
{
|
|
label = invalid? InvalidLabel : labelString,
|
|
color = parsedColor
|
|
};
|
|
}
|
|
|
|
protected override void AddLabelIdentifierToJson(SerializedProperty labelEntry, JObject jObj)
|
|
{
|
|
jObj.Add("Color", "#"+ColorUtility.ToHtmlStringRGBA(
|
|
labelEntry.FindPropertyRelative(nameof(SemanticSegmentationLabelEntry.color)).colorValue));
|
|
}
|
|
|
|
protected override void AppendLabelEntryToSerializedArray(SerializedProperty serializedArray, SemanticSegmentationLabelEntry semanticSegmentationLabelEntry)
|
|
{
|
|
var index = serializedArray.arraySize;
|
|
serializedArray.InsertArrayElementAtIndex(index);
|
|
var element = serializedArray.GetArrayElementAtIndex(index);
|
|
var colorProperty = element.FindPropertyRelative(nameof(SemanticSegmentationLabelEntry.color));
|
|
colorProperty.colorValue = semanticSegmentationLabelEntry.color;
|
|
var labelProperty = element.FindPropertyRelative(nameof(ILabelEntry.label));
|
|
labelProperty.stringValue = semanticSegmentationLabelEntry.label;
|
|
}
|
|
}
|
|
|
|
internal class ColoredLabelElementInLabelConfig : LabelElementInLabelConfig<SemanticSegmentationLabelEntry>
|
|
{
|
|
protected override string UxmlPath => UxmlDir + "ColoredLabelElementInLabelConfig.uxml";
|
|
|
|
public ColorField m_ColorField;
|
|
|
|
public ColoredLabelElementInLabelConfig(LabelConfigEditor<SemanticSegmentationLabelEntry> editor, SerializedProperty labelsArray) : base(editor, labelsArray)
|
|
{ }
|
|
|
|
protected override void InitExtended()
|
|
{
|
|
m_ColorField = this.Q<ColorField>("label-color-value");
|
|
}
|
|
}
|
|
}
|