Создание панели свойств/параметров

Автор Semargl1990, 01.01.22, 08:05:11

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Semargl1990

Добрый день!
Подскажите как создать простой панель свойств, чтобы
при нажатий кнопки на панели инструментов появилось
такой панель параметров, который запрашивает указание объекта,
например поверхности. Похожий панель свойств реализован в операций расстояние и угол: 
Панель свойств.PNG
Какие нужны интерфейсы, какой порядок/алгоритм при созданий такой панели свойств(что после чего подключать и т.д.). Примеры со степов смотрел, но пока сложновато понять логику создания панели.
Прошу помочь данным вопросом.

Semargl1990

Создал такой панель свойств:
Панель свойтсв 1.PNG
Вот код:
            IPropertyManager PropMng = Kompas.Instance.KompasApp.CreatePropertyManager(false);
            PropMng.Caption = "Панель из библиотеки";

            PropMng.SpecToolbar = SpecPropertyToolBarEnum.pnEnterEscHelp;

            IPropertyTabs tabs = PropMng.PropertyTabs;

            IPropertyTab tab = tabs.Add("Параметры гайки");

            IPropertyControls ctrls = tab.PropertyControls;


            IPropertyGrid GridCtrl = (IPropertyGrid)ctrls.Add(ControlTypeEnum.ksControlGrid);
            GridCtrl.Name = "&Размеры";
            GridCtrl.NameVisibility = PropertyControlNameVisibility.ksNameAlwaysVisible;


            GridCtrl.ColumnCount = 5;
            GridCtrl.CellText[0, 0] = "№";
            GridCtrl.CellText[0, 1] = "Длина";
            GridCtrl.CellText[0, 2] = "Ширина";
            GridCtrl.CellText[0, 3] = "Высота";
            GridCtrl.CellText[0, 4] = "Угол";
            GridCtrl.CellText[1, 0] = "1";

            GridCtrl.EnableDeleteRows = true;

            GridCtrl.UpdateParam();

            PropMng.ShowTabs();

Как теперь сделать так, чтобы при нажатий на кнопку х на панели свойств, закрыть его?
И как сделать так, чтобы при нажатий на кнопку удалить, удалить строку в PropertyGrid? 
+ Благодарностей: 2

На события подписаться IPropertyManagerNotify.
+ Благодарностей: 1

Semargl1990

Благодаря IPropertyManagerNotify.ButtonClick эвента удалось достучаться до кнопок "V" и "X" с помощью энумераторов SpecPropertyButtonEnum.pbEnter,SpecPropertyButtonEnum.pbEnter.
Однако не удалось достучаться до кнопки удаления (корзина) в PropertyGrid, т.к. не смог найти ни энумератов, ни buttonID в справке.
Создал даже свою кнопку в PropertyGrid подключив битмапы Gayka.res к проекту, однако значки на панели далёко отличаются от рисунков bmp.
Что еще заметил, если объявить PropMng через IPropertyManager то эвенты IPropertyManagerNotify не появляются, если объявить PropMng через PropertyManager то эвенты IPropertyManagerNotify появляются.
Еще один момент если прописать GridCtrl.EnableEdit[1, 1] = true; то ячейка не становиться редактируемым. 
В соответствий с выше изложенным возникли следующие вопросы:
1. Как достучаться до кнопки удаления (корзина) в PropertyGrid, какой buttonID задать для входа в IPropertyManagerNotify.ButtonClick или .ControlCommand?
2. Почему битмапы из Gayka.res показываются как какие-то каракули, как можно исправить?
3. В чем отличие IPropertyManager и PropertyManager, почему один поддерживает работу с эвентами, а другой нет?
4. Почему метод EnableEdit в PropertyGrid не работает?
+ Благодарностей: 1

Golovanev

По большому счету свою панель свойств можно создать очень просто.... В Delphi это я делаю простым созданием формы, далее делаю по библиотечной команде Show (подъем формы не модально).
И опля... Любые стандартные и нестандартные контролы на моей форме, я делаю с ними все что угодно, я их корректно и просто отслеживаю. Окно КОМПАСА доступно, Подписавшись на события селектирования в КОМПАСЕ я легко могу выбрать все что угодно... и т.д. 

И зачем тогда мне этот геморрой с "родной" панелью КОМПАСА ? Если все можно сделать гораздо интереснее и проще...

Гениальны простые решения.

Semargl1990

Формами пользовался, однако захотел создать "аутентичную" библиотеку. Подумал что так удобнее работать, иначе это форма вечно под ногами мешается)
Хочу докопаться до истины с PropertyGrid.
Вот что получилось создать:
Панель свойств 2.PNG 
Как теперь сделать:
1. Чтобы редактировались ячейки PropertyGrid?
2. Что можно было достучаться до кнопки удаление? 
3. Почему битмап значок показывается как квадратик, а не крестик как я нарисовал?

Semargl1990

Вообще хотел сделать так, чтобы при изменений данных в ячейке Сетки перестраивалось фантом операций выдавливание, например.
Панель свойств 3.PNG

Semargl1990

Как все таки создать такой контрол - Базовая плоскость,
чтобы в этот контрол пришел выделенный объект? Какие нужны интерфейсы?
Панель свойств 4.PNG

PS

Пример IPropertyGrid на С++
+ Благодарностей: 2

Vi2

Цитата: Semargl1990 от 18.01.22, 20:28:16Как все таки создать такой контрол - Базовая плоскость,
чтобы в этот контрол пришел выделенный объект? Какие нужны интерфейсы?
Такого контрола, создаваемого по ControlTypeEnum, скорее всего, нет, но его можно смоделировать.

Надпись подчёркивается по установке свойства IPropertyControl1.HyperLinkNameStyle в true. Сам интерфейс IPropertyControl1 получается от IPropertyControl. Клик по надписи отслеживается по событию ControlCommand(control,buttonID) для этого контрола.

Сам контрол может быть текстовым боксом без возможности редактирования.
+ Благодарностей: 1

Semargl1990

Как сделать активным контрол по щелчку мыши?
Чтобы появилась штрихпунктир как в контроле сетка?
Панельсвойств 5.PNG

PS

Цитата: Semargl1990 от 23.01.22, 14:32:13Как сделать активным контрол по щелчку мыши?
Чтобы появилась штрихпунктир как в контроле сетка?
Попробуйте IPropertyControl1::PredefineNumber

Semargl1990

Делаю так:
//Создание предварительного текста
            PropertyPreviewText PrvTxtPlnCtrl = (PropertyPreviewText)ctrls.Add(ControlTypeEnum.ksControlPreviewText);
            PrvTxtPlnCtrl.Name = "Поверхность";
         
            PropertyPreviewText PrvTxtDotCtrl = (PropertyPreviewText)ctrls.Add(ControlTypeEnum.ksControlPreviewText);
            PrvTxtDotCtrl.Name = "Точка";

            //Дополнительный контрол предварительного текста
            IPropertyControl1 PrvTxtPlnPropCtrl1 = (IPropertyControl1)PrvTxtPlnCtrl;
            PrvTxtPlnPropCtrl1.HyperLinkNameStyle = true;

           [b] PrvTxtPlnPropCtrl1.PredefineNumber = 1;[/b]

            //Дополнительный контрол предварительного текста
            IPropertyControl1 PrvTxtDotCtrlPropCtrl1 = (IPropertyControl1)PrvTxtDotCtrl;
            PrvTxtDotCtrlPropCtrl1.HyperLinkNameStyle = true;

            [b]PrvTxtDotCtrlPropCtrl1.PredefineNumber = 2[/b];
Получаю:
Панель свойств 7.PNG
Что-то не то, или я не так делаю?
Мне надо чтобы при нажатий на слова поверхность выделялось этот контрол штрихпунктиром,
и в 3д сборке мог указать только поверхность.
Нажал на точка и выделялось этот контрол штрихпунктиром в
3д сборке мог указать только точку.
Соответсвенно мог получить ksEntity этих объектов.
 

Semargl1990

Вообще, что значить синий штрихпунтир вокруг контрола? Активность контрола?

Semargl1990

Неужто никто не сталкивался с такой задачей? Может есть примеры, можно и не в С#.

andykl

#15
Цитата: Semargl1990 от 26.01.22, 08:59:50Вообще, что значить синий штрихпунтир вокруг контрола? Активность контрола?

Штрихпунктир вокруг контрола визуально обозначает что этот контрол находится в фокусе и "ожидает" от пользователя указание объекта, в вашем случае это "плоскость" и "точка"

Цитата: Semargl1990 от 24.01.22, 19:26:56Делаю так:
//Создание предварительного текста
            PropertyPreviewText PrvTxtPlnCtrl = (PropertyPreviewText)ctrls.Add(ControlTypeEnum.ksControlPreviewText);
            PrvTxtPlnCtrl.Name = "Поверхность";
         
            PropertyPreviewText PrvTxtDotCtrl = (PropertyPreviewText)ctrls.Add(ControlTypeEnum.ksControlPreviewText);
            PrvTxtDotCtrl.Name = "Точка";

            //Дополнительный контрол предварительного текста
            IPropertyControl1 PrvTxtPlnPropCtrl1 = (IPropertyControl1)PrvTxtPlnCtrl;
            PrvTxtPlnPropCtrl1.HyperLinkNameStyle = true;

           [b] PrvTxtPlnPropCtrl1.PredefineNumber = 1;[/b]

            //Дополнительный контрол предварительного текста
            IPropertyControl1 PrvTxtDotCtrlPropCtrl1 = (IPropertyControl1)PrvTxtDotCtrl;
            PrvTxtDotCtrlPropCtrl1.HyperLinkNameStyle = true;

            [b]PrvTxtDotCtrlPropCtrl1.PredefineNumber = 2[/b];
Получаю:
Панель свойств 7.PNG
Что-то не то, или я не так делаю?
Мне надо чтобы при нажатий на слова поверхность выделялось этот контрол штрихпунктиром,
и в 3д сборке мог указать только поверхность.
Нажал на точка и выделялось этот контрол штрихпунктиром в
3д сборке мог указать только точку.
Соответсвенно мог получить ksEntity этих объектов.
 


По событию клика на контроле получаем этот контрол и делаем его(на C++ CheckState = ksCheckCurrent) активным.
а чтобы указать, например, поверхность надо запустить процесс Process3DSelectEntity
и фильтровать выбор по типу объекта o3d_face

Сам только разбираюсь в этом. Если что не так, поправьте

p3452

AddIn - это для любителей "сложностей",
"Панель свойств" в AddIn - это для любителей "больших сложностей"...
Зачем?

Альмир

Почему пользовательская панель мешает нормальной работе Компаса?
1) Написана панель свойств, которая запускается при открытии документа типа "деталь"
2) В нем можно выбрать типы операций, раздел спецификации, выбор материала
3) В иных типах документов панель не отображается

Проблемы при запущенной библиотеки с панелью:
1) При выходе из эскизы нажатием кнопки типа "Выдавливание и т.п." - операция прерывается, нужно нажать кнопку повторно
2) При редактировании спецификации со сборочного чертежа (Редактировать состав объекта), спецификация не отображается

В общем и целом, такое ощущение что коряво написан код библиотеки. Прошу посмотреть код, либо испытать в Компасе и указать на ошибки.
https://disk.yandex.ru/d/mZ-DU8Opqxr7Gg