public override void AfterUnitedAction(UnitedProperty property, List<UnitedProperty> properties)
{
//цвета по слою и по блоку
Color byLayer = Color.FromColorIndex(ColorMethod.ByAci, 255);
Color byBlock = Color.FromColorIndex(ColorMethod.ByAci, 255);
//получаем слой, которому принадлежат выделенные объекты, если он один то (ПОСЛОЮ) будет перекрашен в цвет слоя
string layer = string.Empty;
foreach (UnitedProperty unitedProperty in properties)
{
if (unitedProperty.Name == "Слой")
{
if (!unitedProperty.IsVarious)
{
layer = unitedProperty.Value.ToString();
}
break;
}
}
if (Layers.ContainsKey(layer)) byLayer = Layers[layer].Color;
if (property.Name == "Цвет" && property.Value is Color selectedColor)
{
//список цветов в вариантах
List<Color> colors = new List<Color>();
//если цвета параметра в списках нет то добавляем в список последних цветов
if (!property.IsVarious && !LastColors.Contains(selectedColor) && !BaseColors.Contains(selectedColor)) LastColors.Add(selectedColor);
//ограничиваем список последними тремя цветами, не входящими в основной пул
if (LastColors.Count > 3) LastColors.RemoveAt(0);
//добавляем в список основные цвета
colors.AddRange(BaseColors);
//добавляем в список последние цвета
foreach (Color color in LastColors) if (!colors.Contains(color)) colors.Add(color);
//проходим по цветам и формируем параметры
foreach (Color color in colors)
{
//получаем отображаемый цвет компонента
Color objectColor = color;
if (color.IsByLayer) objectColor = byLayer;
else if (color.IsByBlock) objectColor = byBlock;
//создаем новый параметр
Property prop = new Property
{
Value = color,
Name = property.Name,
};
//если параметр идентичен выбранному, то обозначаем это
if (!property.IsVarious && property.Value.ToString() == prop.Value.ToString()) prop.IsSelected = true;
//добавляем компоненты параметра
prop.Components.AddRange(GetPathColorComponents(objectColor));
//добавляем компонент с названием цвета во второй столбец первого ряда
prop.Components.Add(new ValueComponent
{
ComponentHeight = 18,
MarginLeft = 5,
Value = color.ColorNameForDisplay,
ComponentRow = 0,
ComponentColumn = 1,
});
property.Variants.Add(prop);
}
//добавляем кнопку выбора цвета
property.Variants.Add(new Property { Name = property.Name, Value = "Выбрать", IsAction = true });
}
else return;
//если выбраны разные цвета то добавляем пункт разных, и обозначаем что он выбран
if (property.IsVarious) property.Variants.Insert(0, new Property { Name = property.Name, IsVarious = true, IsSelected = true });
if (property.IsVarious && property.Variants.Count == 1) property.Variants.Clear();
}
/// <summary>
/// список слоев автокада
/// </summary>
private Dictionary<string, LayerData> Layers { get; set; } = new Dictionary<string, LayerData>();
/// <summary>
/// список последних используемых цветов
/// </summary>
private List<Color> LastColors { get; set; } = new List<Color>();
/// <summary>
/// Список базовых цветов
/// </summary>
private List<Color> BaseColors { get; set; } = new List<Color>
{
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByLayer, 256),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByBlock, 0),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 1),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 2),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 3),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 4),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 5),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 6),
Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 7),
};