Как параметризировать объекты

Автор empty_project, 24.02.21, 17:15:46

« предыдущая - следующая »

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

empty_project

Здравствуйте. Никак не могу понять, как наложить ограничение с помощью Python на вот такую деталь (рисунок 1). Мне нужно, чтобы после запуска макроса я получил результат, как если бы я выделил все линии и нажал в меню "Ограничения" на "Параметризировать объекты" (рисунок 2). Код, с помощью которого я получаю такую деталь следующий:

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH


def ensure_module(module: str):
    return gencache.EnsureModule(module, 0, 1, 0)


def query_interface(api: str, interface):
    return Dispatch(api)._oleobj_.QueryInterface(interface.CLSID, pythoncom.IID_IDispatch)


class Utilities:
    API5 = "Kompas.Application.5"
    API7 = "Kompas.Application.7"
    API5_MODULE = "{0422828C-F174-495E-AC5D-D31014DBBE87}"
    API7_MODULE = "{69AC2981-37C0-4379-84FD-5DD2F3C0A520}"
    KOMPAS_CONSTANTS_MODULE = "{75C9F5D0-B5B8-4526-8681-9903C567D2ED}"
    KOMPAS_CONSTANTS_3D_MODULE = "{2CAF168C-7961-4B90-9DA2-701419BEEFE3}"

    @staticmethod
    def get_kompas_object():
        kompas_api5_module = ensure_module(Utilities.API5_MODULE)
        kompas_object_interface = query_interface(Utilities.API5, kompas_api5_module.KompasObject)
        kompas_object = kompas_api5_module.KompasObject(kompas_object_interface)
        MH.iKompasObject = kompas_object
       
        return kompas_object
   
    @staticmethod
    def get_kompas_api7():
        kompas_constants = ensure_module(Utilities.KOMPAS_CONSTANTS_MODULE).constants
        kompas_constants_3d = ensure_module(Utilities.KOMPAS_CONSTANTS_3D_MODULE).constants
        kompas_api7_module = ensure_module(Utilities.API7_MODULE)
        kompas_application_interface = query_interface(Utilities.API7, kompas_api7_module.IApplication)
        application = kompas_api7_module.IApplication(kompas_application_interface)
        MH.iApplication  = application
       
        return kompas_api7_module, application, kompas_constants, kompas_constants_3d
       

if __name__ == "__main__":
    kompas_object = Utilities.get_kompas_object()
    module7, app7, const7, _ = Utilities.get_kompas_api7()

    Documents = app7.Documents
    kompas_document = app7.ActiveDocument
    kompas_document_2d = module7.IKompasDocument2D(kompas_document)
    iDocument2D = kompas_object.ActiveDocument2D()

    obj = iDocument2D.ksLineSeg(237, 158, 207, 139, 1)
    obj = iDocument2D.ksLineSeg(237, 158, 257, 158, 1)
    obj = iDocument2D.ksLineSeg(257, 158, 257, 78, 1)
    obj = iDocument2D.ksLineSeg(257, 78, 237, 78, 1)
    obj = iDocument2D.ksLineSeg(237, 78, 207, 97, 1)
    obj = iDocument2D.ksLineSeg(207, 97, 207, 115, 1)
    obj = iDocument2D.ksLineSeg(207, 115, 216, 115, 1)
    obj = iDocument2D.ksLineSeg(216, 121, 216, 115, 1)
    obj = iDocument2D.ksLineSeg(207, 121, 216, 121, 1)
    obj = iDocument2D.ksLineSeg(207, 139, 207, 121, 1)
    obj = iDocument2D.ksLineSeg(207, 137, 234, 137, 1)
    obj = iDocument2D.ksLineSeg(234, 137, 234, 132, 1)
    obj = iDocument2D.ksLineSeg(257, 132, 234, 132, 1)
    obj = iDocument2D.ksLineSeg(257, 150, 247, 150, 1)
    obj = iDocument2D.ksLineSeg(247, 150, 247, 143, 1)
    obj = iDocument2D.ksLineSeg(257, 143, 247, 143, 1)
    obj = iDocument2D.ksLineSeg(237, 78, 237, 118, 2)
    obj = iDocument2D.ksLineSeg(234, 132, 234, 118, 2)
    obj = iDocument2D.ksLineSeg(234, 118, 237, 118, 2)

Я изначально хотел записать макрос для ограничений и посмотреть получившийся код, однако именно с ограничениями макрос не записывается. Я прочитал в SDK-хелпе, что для создания ограничения мне нужен интерфейс IDrawingObject1, который я могу получить у IDrawingObject, который я могу получить у IDrawingObjects с по­мощью метода Item, который я могу получить у IViews, который я могу получить у ViewsAndLayersManager. По итогу у меня получилось что-то такое:
    IViews = kompas_document_2d.ViewsAndLayersManager.Views
    IDrawingObjects = IViews._oleobj_.QueryInterface(module7.NamesToIIDMap['IDrawingObjects'], pythoncom.IID_IDispatch)
    drawing_objects = module7.IDrawingObjects(IDrawingObjects)
    drawing_object = drawing_objects.Item(0)
   
    IDrawingObject1 = drawing_object._oleobj_.QueryInterface(module7.NamesToIIDMap['IDrawingObject1'], pythoncom.IID_IDispatch)
    drawing_object1 = module7.IDrawingObject1(IDrawingObject1)
Создать ограничение можно с помощью NewConstraint() у IDrawingObject1 или вызвать метод Associate(). Я так понял, что Associate должен решать именно мою проблему, причем сразу же, т.к. с NewConstraint мне придется все ограничения создавать вручную. Однако я не понимаю как именно он может "автоматизировать процесс наложения ассоциативных связей", т.к. на вход он ничего не получает. И как-то у меня дальше не получается ничего, совсем завис, подскажите пожалуйста.

msvteh

25.02.21, 19:48:29 #1 Последнее редактирование: 25.02.21, 20:51:19 от msvteh
смотрите пример "Обозначения центров..." где применяется метод Associate
https://forum.ascon.ru/index.php?topic=29314.80

empty_project

Цитата: msvteh от 25.02.21, 19:48:29смотрите пример "Обозначения центров..." где применяется метод Associate
https://forum.ascon.ru/index.php?topic=29314.80

Я просмотрел все страницы и все вложения "Обозначения центров...", там нигде нет использования метода Associate.
Все, что я нашел в примерах по слову Associate, это три строчки:
associate = True # Параметризовать ли обозначения центров (True - да, False - нет)
if associate:
    iCentreParam.baseCurve = Circle.Reference

msvteh


msvteh

подправил
def get_kompas_object():
.....

return kompas_object, kompas_api5_module

if __name__ == "__main__":
    kompas_object , module = Utilities.get_kompas_object()

добавил
    kompas_document_2d1 = module7.IKompasDocument2D1(kompas_document_2d)
    selection_manager = kompas_document_2d1.SelectionManager
    drawing_container = module7.IDrawingContainer(drawing_object)

    Objects_LineSeg = drawing_container.Objects(1)#ksDrLineSeg Отрезок
    selection_manager.Select(Objects_LineSeg)

    iParametrizationParam = module.ksParametrizationParam(kompas_object.GetParamStruct(const7.ko_ParametrisationParam))
    iParametrizationParam.Init()
    #Параметризовать группу объектов
    group = 0 # параметризуется группа выделенных объектов.
    iDocument2D.ksParametrizeObjects(group,iParametrizationParam)

получил
Screen_shot1.jpg

pr0100

Можно еще вот так:
# -*- coding: utf-8 -*-
#|Параметризовать выделенные объекты
import pythoncom
from win32com.client import Dispatch, gencache
#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
#Параметризовать
kompas_object.ksExecuteKompasCommand(10159, False)

empty_project