Статьи > Тестирование статей
Аналог панели свойств
alz:
После считывания параметров выбранных объектов панель объединяет из в классе UnitedProperty, в котором определен список вариантов для выбора, в него можно например расположить 2 варианта Да и Нет для определения какого либо булевого параметра, или же целый набор, например список цветов для выбора цвета объекта, для этого переопределяем метод AfterUnitedAction(UnitedProperty property, List<UnitedProperty> properties), ну и конкретно в этом случае добавляем вспомогательные объекты, в этом методе мы заполняем список вариантов, в который записываем основные цвета, 3 последних выбранных цвета и кнопку, по которой будет открываться окно выбора цвета.
--- Код - C# [Выбрать] --- 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), };
Обработка нажатия на кнопку выбора цвета, добавленную в список варинатов в этой строке, флагом чего служит параметр IsAction
--- Код - C# [Выбрать] --- //добавляем кнопку выбора цвета property.Variants.Add(new Property { Name = property.Name, Value = "Выбрать", IsAction = true });
производится в методе ResultAction(Property property), который должен вернуть объект, который, если не является null будет записан в NewValue параметра, что вызовет изменение объектов в чертеже
--- Код - C# [Выбрать] --- public override object ResultAction(Property property) { if (property.Name == "Цвет") { ColorDialog dialog = new ColorDialog(); System.Windows.Forms.DialogResult dialogResult = dialog.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK) { //если цвета параметра в списках нет то добавляем в список последних цветов if (!property.IsVarious && !LastColors.Contains(dialog.Color) && !BaseColors.Contains(dialog.Color)) LastColors.Add(dialog.Color); //ограничиваем список последними тремя цветами, не входящими в основной пул if (LastColors.Count > 3) LastColors.RemoveAt(0); return dialog.Color; } } return null; }
Навигация
Перейти к полной версии