Статьи > Тестирование статей

Аналог панели свойств

<< < (2/2)

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;                  }

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии