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

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

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

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

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

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

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

Как получить контейнер объектов с разрушенного объекта.

Автор Doom, 11.08.23, 21:46:20

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

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

Doom

К примеру есть макрообъект и с него нужно снять параметры нескольких отрезков. Удобно разрушить его и обработать составные части - но тут нужно получить их ввиде например возвращаемого массива или массива ссылок. Как это сделать если ksDestroyObjects выдает только ответ об успешном выполнении? А перебирать и искать те ли это объекты это не дело.

А за тем восстановить его при необходимости(ksCMEditUndo).

Scull_

Киньте SDK v21, чтобы работало на смартфоне, у меня в профилактории нет доступа до цивилизации.

Doom

а как я так сделаю? :)

Могу на диск загрузить там вроде как есть онлайн просмотр.
https://disk.yandex.ru/d/eOVjMRzye5_yhg

но браузер сильно подвисает при этом.

Doom

Действительно былоб очень удобно если ksDestroyObjects возвращал список новых объектов на которые разрушился изначальный объект.

Scull_


Doom

+ Благодарностей: 1

Doom

Можно ли этот список получить через подписку на события например - ksObject2DNotifyEnum::koCreateObject
 - ведь после разрушения Компас создает же объекты значит есть события или как (помню что есть еще управление ядром Компаса при котором минуются логическое представление порядка событий -- или я что то путаю ?)?

Doom

Примеры с событиями с большим избытком информации - не удается все реализовать в Python.. Можете скинуть примерчик где например разрушается осевая линия на чертеже и через события отлавливается отрезок и получить его рефернес?

Doom

Цитата: Doom от 11.08.23, 21:46:20А за тем восстановить его при необходимости(ksCMEditUndo).

Тут такое дело вот я разрушил объект и получается так что мне нужно 3 раза нажать на кнопку отменить что бы вернуть изначальный объект..
Получается что происходят как минимум 3 события ?

Doom

Нашел в хелпе EndProcess - Завершение редактирования/создания объекта

Возвращаемое значение: - не используется.
 
И как мне выудить список из всего этого?

Doom

В общем как отследить объекты решил велосипедным способом.
Осталось понять как вернуть объект до события начала разрушения.
Мне нужно посчитать кол-во всех операций что бы с этим числом нажать ksCMEditUndo - прям огородный огород :)

msvteh

#11
что сложного перебрать нужные объекты внутри макроэлемента?
objects_macro_ilineSegment = module_7.IDrawingContainer(iMacroObject).Objects(1)# массив отрезки
+ Благодарностей: 2

Doom


msvteh

#13
получаете коллекцию макроэлементов IDrawingContainer::MacroObjects, потом от IMacroObjects::MacroObject получаете по индексу IMacroObject.
или от массива IDrawingContainer::Objects(27) получаете IMacroObject



Doom

Цитата: msvteh от 12.08.23, 18:41:34objects_macro_ilineSegment = module_7.IDrawingContainer(iMacroObject).Objects(1)# массив отрезки

У меня здесь ошибку выбивает - и там судя по всему не линии.
Вот если так -
objects_macro_ilineSegment = module_7.IDrawingContainer(iMacroObject).Lines

Cont возвращает всегда 0
Создал вручную макроэлемент и добавил из библиотеки объект и оба у них равно нулю.

Сам код:

uDoc7 = api7_.ActiveDocument

Doc2D7 = KAPI7.IKompasDocument2D(uDoc7)

viewsAndLayersManager = Doc2D7.ViewsAndLayersManager

views = viewsAndLayersManager.Views
views = KAPI7.IViews(views)

# view = views.ActiveView

for views_item in views:
   
    views_item = KAPI7.IView(views_item)

    drawing_container = KAPI7.IDrawingContainer(views_item)
    macro_objects = drawing_container.MacroObjects
   
    for itemObj in macro_objects:
       
        macro_object = KAPI7.IMacroObject(itemObj)
       
        print(macro_object.LibraryName)
       
        drawing_container_lines = KAPI7.IDrawingContainer(macro_object)
   
        lines = drawing_container_lines.Lines #Objects(1) #Lines()
       
        print(lines.Count)

И как определить является ли макрообъект - стандартной деталью ?

Doom

Обнаружил что объект macro_object = KAPI7.IMacroObject(itemObj) имеет не все свойства и методы.

тут ошибка :|

drawing_container_lines = macro_object._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IDrawingContainer'], pythoncom.IID_IDispatch)

Doom

Цитата: Doom от 13.08.23, 01:00:49И как определить является ли макрообъект - стандартной деталью ?

1) if macro_object.Command != -1:

2) if macro_object.LibraryFileName:


Почему у 3D реализована эта функция а у 2D нет ?

для 3D -
Standard - Признак стандартного компонента
standardComponent

Doom

Попробовал извлечь линейные размеры из макрообъекта - все работает.

SymbolsContainer2D = KAPI7.ISymbols2DContainer(macro_object)
LDimensions = SymbolsContainer2D.LineDimensions

print(LDimensions.Count)

Выводы: IDrawingContainer - там что то не то с макрообъектами - не может часть свойств и методов предоставить - это сохраняется вплоть до 21 версии..

Решение только такое:


    macro_object = KAPI7.IMacroObject(line_object)
    print(macro_object.Name)
   
    # линии---------------------------------------------------------------
    drawing_container = KAPI7.IDrawingContainer(macro_object)
   
    # попытка извлечь Lines - ошибка
    lines_ = drawing_container.Objects(1)
           
    # попытка привести к типу ILines - ошибка
    # lines_ = KAPI7.ILines(lines_)
   
    # проверяем на существование вместо Count
    if lines_:
        for iline in lines_:
            iline = KAPI7.ILineSegment(iline)
            print('длина: ', iline.Length)
   
    # линии-------------------------------------------------------------

msvteh

#18
пример запустить на чертеже с макро где есть отрезки.

Doom