• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как создать панель свойств?

Автор Andrei88, 28.03.23, 11:49:03

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

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

Andrei88

Добрый день!
Пытаюсь сделать для своего макроса панель свойств. Отдельное окно городить не хочется.
Пробовал перенести пример отсюда. Получилось следующее:
MyDlg=application.CreatePropertyManager(True)
MyDlg.Caption="Диалог Шаронова"
MyDlg.SpecToolbar=kompas6_constants.pnEnterEscHelp
DlgTab=MyDlg.PropertyTabs.Add("Одна закладка")
GridCtrl=kompas_api7_module.IPropertyGrid(DlgTab.PropertyControls.Add(kompas6_constants.ksControlGrid))
GridCtrl.Name="&Размеры"
GridCtrl.NameVisibility=kompas6_constants.ksNameAlwaysVisible
GridCtrl.ColumnCount = 5
GridCtrl.CurrentRow=0
GridCtrl.CurrentColumn=0
GridCtrl.Value = "№"
GridCtrl.CurrentColumn=1
GridCtrl.Value = "Длина"
GridCtrl.CurrentColumn=2
GridCtrl.Value = "Ширина"
GridCtrl.CurrentColumn=3
GridCtrl.Value = "Высота"
GridCtrl.CurrentColumn=4
GridCtrl.Value = "Угол"
#GridCtrl.CellText[1, 0] = "1"
GridCtrl.EnableDeleteRows = True
GridCtrl.UpdateParam()
MyDlg.ShowTabs()
Как обратиться к CellText - не догадался. У kompas_api7_module.IPropertyGrid такого атрибута нет. Но есть у kompas_api7_module.IPropertyGrid_vtables, но как с его прикрутить и как общаться?
В итоге получил отдельную панель в Компасе. Однако, заданные заголовки не отобразились - в заголовках столбцов просто Col0..Col4
Еще один вопрос - как переделать текст, чтоб вместо создаваемой отдельной панели эта таблица рисовалась в панели параметров, как у "родных" функций Компаса?
Заранее благодарен за ответы
Шаронов Андрей

Andrei88

Удалось найти, как писать в ячейки таблицы:
GridCtrl.SetCellText(0, 0, "№")
"Вкуривание" исходника KompasAPI7.py дает, оказывается, не меньшие результаты, чем чтение хелпа к SDK :-) "Это свойство реализовано, как метод" - вольный перевод комментария :-)
В итоге получился вот такой текст:
MyDlg=application.CreatePropertyManager(False)
MyDlg.Caption="Диалог Шаронова"
MyDlg.SpecToolbar=kompas6_constants.pnEnterEscHelp
DlgTab=MyDlg.PropertyTabs.Add("Одна закладка")
GridCtrl=kompas_api7_module.IPropertyGrid(DlgTab.PropertyControls.Add(kompas6_constants.ksControlGrid))
GridCtrl.Name="&Размеры"
GridCtrl.NameVisibility=kompas6_constants.ksNameAlwaysVisible
GridCtrl.ColumnCount = 5
GridCtrl.SetCellText(0, 0, "№")
GridCtrl.SetCellText(0, 1, "Длина")
GridCtrl.SetCellText(0, 2, "Ширина")
GridCtrl.SetCellText(0, 3, "Высота")
GridCtrl.SetCellText(0, 4, "Угол")
GridCtrl.EnableDeleteRows = True
GridCtrl.UpdateParam()
MyDlg.ShowTabs()
Но вопрос о том, как вместо создания своей панели эту таблицу запихать в существующую панель параметров остается.
С уважением
Шаронов Андрей

Andrei88

Пытаюсь все же сделать панель в разделе "Параметры". На основе примеров Gayka1 и UserSymbolWithLeader попытался изобразить текст:
procParam=application.CreateProcessParam()
procParam.SpecToolbar=kompas6_constants.pnEnterEscHelp
procParam.Caption="Панель Шаронова"
procParam.AutoReduce=False
propTabs=procParam.PropertyTabs
propTab=propTabs.Add("Первая закладка")
Controls=propTab.PropertyControls
propTab.Visible=True
propTab.Active=True
propTab.Expanded=True
#Добавляем строку выбора вида платы - текстовое поле с заголовком-гиперссылкой
SelectView=kompas_api7_module.IPropertyPreviewText(Controls.Add(kompas6_constants.ksControlPreviewText))
SelectView.Name="Вид платы"
SVExCtrl=kompas_api7_module.IPropertyControl1(SelectView)                                                   #Создаем модуль расширенных настроек поля выбора вида
SVExCtrl.HyperLinkNameStyle=True                                                                            #Отбражение названия, как гиперссылки
SelectView.Enable=True
SelectView.Visible=True
SelectView.NameVisibility=True
SelectView.UpdateParam()
#Добавляем поле установки шага сетки - поле ввода дробной величины со счетчиком
SelectStep=kompas_api7_module.IPropertySpinEdit(Controls.Add(kompas6_constants.ksControlSpinReal))
SelectStep.Name="Шаг сетки"
SelectStep.Step=0.25
SelectStep.SetValueRange(0, 5)
SelectStep.Enable=True
SelectView.Visible=True
SelectView.NameVisibility=True
SelectStep.Value=1.25
Увы, в панели параметров ничего не создается - даже кнопки применения и отмены. Установка procParam.AutoReduce в True не помогает. При этом в варианте отдельной панели через PropertyManager панель создается:
MyDlg=application.CreatePropertyManager(False)
#MyDlg=application.CreateProcessParam()
MyDlg.Caption="Наложение сетки"
MyDlg.SpecToolbar=kompas6_constants.pnEnterEscHelp
#MyDlg.AutoReduce=False
DlgTab=MyDlg.PropertyTabs.Add("Одна закладка")
#Добавляем строку выбора вида платы - текстовое поле с заголовком-гиперссылкой
SelectView=kompas_api7_module.IPropertyPreviewText(DlgTab.PropertyControls.Add(kompas6_constants.ksControlPreviewText))
SelectView.Name="Вид платы"
SVExCtrl=kompas_api7_module.IPropertyControl1(SelectView)                                                   #Создаем модуль расширенных настроек поля выбора вида
SVExCtrl.HyperLinkNameStyle=True                                                                            #Отбражение названия, как гиперссылки
SelectView.UpdateParam()
#Добавляем поле установки шага сетки - поле ввода дробной величины со счетчиком
SelectStep=kompas_api7_module.IPropertySpinEdit(DlgTab.PropertyControls.Add(kompas6_constants.ksControlSpinReal))
SelectStep.Name="Шаг сетки"
SelectStep.Step=0.25
SelectStep.SetValueRange(0, 5)
SelectStep.Enable=True
SelectStep.Value=1.25
MyDlg.ShowTabs()
У IProcessParam нет метода ShowTabs(). Возможно, есть какая-то аналогичная функция?

Kaimen

# Создать процесс 2D
process_2d = kompas_document_2d1.LibProcess(ks_constants.ksProcess2DCursor)
# Получить параметры процесса
# В параметрах процесса создать панель свойств
process_param = application.CreateProcessParam()
# Получить интерфейс процесса
process = KAPI7.IProcess(process_2d)
# Установить параметры процесса
process.ProcessParam = process_param
# Подписаться на события процесса и панели свойств
# запустить процесс
process.Run(True, False)
# После остановки процесса отписаться от всех событий
+ Благодарностей: 2

Andrei88

Kaimen, спасибо огромное! Получилось!
Прошу прощения за еще один вопрос - а можно ли сделать, чтобы вместо режима точки сразу выбирался режим выбора элемента на чертеже с соответствующим курсором?
С уважением
Шаронов Андрей

Kaimen

OCR_SELECT = 0xFFFE  # Курсор в виде SELECT
OCR_SNAP = 0xFFFD  # Курсор в виде SNAP
OCR_CATCH = 0xFFFC  # Курсор в виде CATCH
OCR_DEFAULT = 0  # Курсор в виде креста
process.CursorId = OCR_CATCH

В событии PlacementChange интерфейса ksProcess2DNotify\IProcess2DNotify
получить текущие координаты курсора
BOOL PlacementChange( double X, double Y, double Angle, BOOL Dynamic );
Найти ближайший к заданной точке объект вида
obj_ref=ks_document_2d.ksFindObj(x, y, 10)
получим указатель на найденный объект и дальше делаем с ним что хотим





Andrei88

Kaimen, еще раз спасибо огромное! Буду пробовать.
С уважением
Шаронов Андрей

Andrei88

Доброе утро!
Увы, поменять курсор так и не получилось. Вот такой код:
OCR_SELECT = 0xFFFE  # Курсор в виде SELECT
OCR_SNAP = 0xFFFD  # Курсор в виде SNAP
OCR_CATCH = 0xFFFC  # Курсор в виде CATCH
OCR_DEFAULT = 0  # Курсор в виде креста
kompas_document_2d1=kompas_api7_module.IKompasDocument2D1(kompas_document)                                  #Получение объекта двумерного документа с расширенными возможностями
#Создание панели процесса
process_2D=kompas_document_2d1.LibProcess(kompas6_constants.ksProcess2DCursor)
procParam=application.CreateProcessParam()
process=kompas_api7_module.IProcess(process_2D)
process.CursorId = OCR_CATCH
procParam.SpecToolbar=kompas6_constants.pnEnterEscHelp
procParam.Caption="Панель Шаронова"
procParam.AutoReduce=True
propTabs=procParam.PropertyTabs
propTab=propTabs.Add("Первая закладка")
Controls=propTab.PropertyControls
propTab.Visible=True
propTab.Active=True
propTab.Expanded=True
#Добавляем строку выбора вида платы - текстовое поле с заголовком-гиперссылкой
SelectView=kompas_api7_module.IPropertyPreviewText(Controls.Add(kompas6_constants.ksControlPreviewText))
SelectView.Name="Вид платы"
SVExCtrl=kompas_api7_module.IPropertyControl1(SelectView)                                                   #Создаем модуль расширенных настроек поля выбора вида
SVExCtrl.HyperLinkNameStyle=True                                                                            #Отбражение названия, как гиперссылки
SelectView.Enable=True
SelectView.Visible=True
SelectView.NameVisibility=True
SelectView.UpdateParam()
#Добавляем поле установки шага сетки - поле ввода дробной величины со счетчиком
SelectStep=kompas_api7_module.IPropertySpinEdit(Controls.Add(kompas6_constants.ksControlSpinReal))
SelectStep.Name="Шаг сетки"
SelectStep.Step=0.25
SelectStep.SetValueRange(0, 5)
SelectStep.Enable=True
SelectView.Visible=True
SelectView.NameVisibility=True
SelectStep.Value=1.25
process.ProcessParam=procParam
process.Run(False, False)
Курсор, как раньше выглядел крестиком, так и остался.
И еще такой вопрос - получится ли описанным Вами способом выделить вид на чертеже? Просто обрабатываю вид с трехмерной модели платы, а ее контур не является единым объектом, а состоит из линий, которые по-отдельности выделять будет сложно. Извиняюсь, что столько сразу вопросов :-)

Kaimen

Все меняется.
OCR_SELECT = 0xFFFE  # Курсор в виде SELECT
OCR_SNAP = 0xFFFD  # Курсор в виде SNAP
OCR_CATCH = 0xFFFC  # Курсор в виде CATCH
OCR_DEFAULT = 0  # Курсор в виде креста

kompas_document = application.ActiveDocument
# Остановить текущий процесс
application.StopCurrentProcess(False, kompas_document)
kompas_document_2d1 = KAPI7.IKompasDocument2D1(kompas_document)  # Получение объекта двумерного документа с расширенными возможностями
# Создание панели процесса
process_2D = kompas_document_2d1.LibProcess(ks_constants.ksProcess2DCursor)

procParam = application.CreateProcessParam()
procParam.SpecToolbar = ks_constants.pnEnterEscHelp
procParam.Caption = "Панель Шаронова"
procParam.AutoReduce = True
propTabs = procParam.PropertyTabs
propTab = propTabs.Add("Первая закладка")
Controls = propTab.PropertyControls
propTab.Visible = True
propTab.Active = True
propTab.Expanded = True
# Добавляем строку выбора вида платы - текстовое поле с заголовком-гиперссылкой
SelectView = KAPI7.IPropertyPreviewText(Controls.Add(ks_constants.ksControlPreviewText))
SelectView.Name = "Вид платы"
SVExCtrl = KAPI7.IPropertyControl1(SelectView)  # Создаем модуль расширенных настроек поля выбора вида
SVExCtrl.HyperLinkNameStyle = True  # Отбражение названия, как гиперссылки
SelectView.Enable = True
SelectView.Visible = True
SelectView.NameVisibility = True
SelectView.UpdateParam()
# Добавляем поле установки шага сетки - поле ввода дробной величины со счетчиком
SelectStep = KAPI7.IPropertySpinEdit(Controls.Add(ks_constants.ksControlSpinReal))
SelectStep.Name = "Шаг сетки"
SelectStep.Step = 0.25
SelectStep.SetValueRange(0, 5)
SelectStep.Enable = True
SelectView.Visible = True
SelectView.NameVisibility = True
SelectStep.Value = 1.25

process = KAPI7.IProcess(process_2D)
process.Dynamic = True
process.Critical = True
process.CursorId = OCR_CATCH
process.ProcessParam = procParam
process.Run(True, False)

По указателю на объект получить объект владелец - это будет вид.
См:
TransferReference
IKompasAPIObject
+ Благодарностей: 1

Andrei88

Kaimen, еще раз огромное спасибо - добавил у себя строчку
process.Dynamic = Trueи тоже курсор начал изменяться.
Буду пробовать выделение.
С уважением
Шаронов Андрей

Andrei88

Возможно, кому-то пригодится. Прилагаю текст обработчика события по клику мышью:
def ProcessCallBack(command_id, params):
    #Если событие - клик мыши (params[3]=False - непосредственный признак клика)
    if ((command_id==kompas6_constants.ksProcess2DPlacementChanged) and (params[3]==False)):
        obj_ref=iDocument2D.ksFindObj(params[0], params[1], 10)
        Object=kompas_object.TransferReference(obj_ref, iDocument2D.reference)
        #Если мы случайно не выделили весь вид
        if not (Object is None):
            if not (type(Object)==kompas_api7_module.IAssociationView or type(Object)==kompas_api7_module.IView):
                MyPannel.SelMgr.UnselectAll()  # Снимаем выделение с других объектов
                Object=Object.Parent                                            #Переходим к объекту-родителю (он-то точно будет видом)
            MyPannel.SelMgr.Select(Object)                                      #И теперь выбираем вид
Подписку на события делаю, как здесь

Andrei88

Прикрутил прямоугольный фантом - возможно, кому пригодится - хотя бы, как начало для поисков :-)
        process_2D = self.kompas_document_2d1.LibProcess(kompas6_constants.ksProcess2DCursor)
        self.phantom=process_2D.Phantom2D
        self.phantom.PhantomType=kompas6_constants.ksRectanglePhantom
Обработчик событий процесса (CallBack-функция) стал таким:
#Функция-обработчик событий процесса
def ProcessCallBack(command_id, params):
    if (command_id == kompas6_constants.ksProcess2DPlacementChanged):
        scale = MyPannel.GetScale()
        if(params[3] == False):
            Board.DrawOutline(params[0], params[1], (scale[0]/scale[1]))
        else:
            MyPannel.phantom.X=params[0]+(Board.Width*(scale[0]/scale[1]))
            MyPannel.phantom.Y = params[1] + (Board.Heigh*(scale[0]/scale[1]))
Функция GetScale считывает состояние элемента управления "Масштаб" на панели, последние две строчки обработчика изменяют величину фантома