Метод SetProjectionObjects - выбор вставок или тел для проецирования в чертеж

Автор IOreshin, 15.07.24, 21:07:45

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

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

IOreshin

Здравствуйте!
Столкнулся с тем, что надо сделать много однотипных чертежей для деталей, полученных с помощью модуля "Трубопроводы", которые находятся в сборке в виде тел.
В 22 версии Компаса, как минимум, вручную при создании чертежа можно выбрать для проецирования нужное тело и оно спроецируется в чертеж, причем штамп заполнится по свойствам выбранного тела.
Для автоматизации, как минимум, создания болванок таких чертежей попробовал использовать метод SetProjectionObjects в интерфейсе IAssociationView, но столкнулся с тем, что не смог добиться адекватной работы функции. Примеры кода ниже в двух вариантов - для проецирования компонента (для простоты в сборке вставлена лишь одна деталь) и проецирования тела.

Код для проецирования детали из сборки
# -*- coding: utf-8 -*-

import pythoncom
import win32com.client

class PartCDW():
    def __init__(self):
        self.module = win32com.client.gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
        self.app = win32com.client.Dispatch('Kompas.Application.7')
        self.const = win32com.client.gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

    def make_cdw_part(self):
        #получение интерфейса активной сборки
        self.source_doc = self.app.ActiveDocument
        self.source_doc_path = self.source_doc.PathName

        #создание чертежа
        self.iDocuments = self.app.Documents
        self.iDocuments.Add(1)

        #создание вида по активной сборке
        self.doc_cdw = self.app.ActiveDocument
        self.doc2D = self.module.IKompasDocument2D(self.doc_cdw)
        self.views_mng = self.doc2D.ViewsAndLayersManager
        self.iViews = self.views_mng.Views
        self.iView = self.iViews.Add(2)
        self.asso_view = self.module.IAssociationView(self.iView)
        self.asso_view.SourceFileName = self.source_doc.PathName
       
        #возвращение в сборку(не знаю насколько необходимо)
        #и создание SAFEARRAY с компонентом
        self.act_doc = self.iDocuments.Item(self.source_doc_path)
        self.act_doc.Active = True
        self.doc3D = self.module.IKompasDocument3D(self.act_doc)
        self.parts = self.doc3D.TopPart.PartsEx(self.const.ksUniqueParts)
        safe_array = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH,self.parts)
        print(safe_array)

        #возвращение в чертеж(не знаю насколько необходимо)
        #и установка проецирования компонента
        self.doc_cdw.Active = True
        self.asso_view = self.module.IAssociationView(self.iView)
        smt = self.asso_view.SetProjectionObjects(safe_array)
        self.asso_view.Update()
       
test = PartCDW()
test.make_cdw_part()

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

Код для проецирования тела из сборки
# -*- coding: utf-8 -*-

import pythoncom
import win32com.client

class BodyCDW():
    def __init__(self):
        self.module = win32com.client.gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
        self.app = win32com.client.Dispatch('Kompas.Application.7')
        self.const = win32com.client.gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

    def make_cdw_body(self):
        #получение интерфейса активной сборки
        self.source_doc = self.app.ActiveDocument
        self.source_doc_path = self.source_doc.PathName

        #создание чертежа
        self.iDocuments = self.app.Documents
        self.iDocuments.Add(1)

        #создание вида по активной сборке
        self.doc_cdw = self.app.ActiveDocument
        self.doc2D = self.module.IKompasDocument2D(self.doc_cdw)
        self.views_mng = self.doc2D.ViewsAndLayersManager
        self.iViews = self.views_mng.Views
        self.iView = self.iViews.Add(2)
        self.asso_view = self.module.IAssociationView(self.iView)
        self.asso_view.SourceFileName = self.source_doc.PathName
       
        #возвращение в сборку(не знаю насколько необходимо)
        #и создание SAFEARRAY с телом
        self.act_doc = self.iDocuments.Item(self.source_doc_path)
        self.act_doc.Active = True
        self.doc3D = self.module.IKompasDocument3D(self.act_doc)
        self.bodies = self.module.IFeature7(self.doc3D.TopPart).ResultBodies
        body = self.bodies[0]
        self.arr = (body,)
       
        safe_array = win32com.client.VARIANT(
            pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH,self.arr)
        print(safe_array)

        #возвращение в чертеж(не знаю насколько необходимо)
        #и установка проецирования компонента
        self.doc_cdw.Active = True
        self.asso_view = self.module.IAssociationView(self.iView)
        smt = self.asso_view.SetProjectionObjects(safe_array)
        self.asso_view.Update()
       
test = BodyCDW()
test.make_cdw_body()

Тут по итогу ничего не происходит, проецируется целиком вся модель, хотя вид safe_array полностью совпадает с тем, какой передается в случае проецирования детали.
Пробовал различные варианты для передачи в SetProjectionObjects, но ничего адекватного не получил.

Поэтому прошу помощи, может кто-то сталкивался или увидит ошибку в коде.




Slaviation

Добрый день.
Создал сборку из двух тел (два тела в сборке.png), запустил  пример кода "Код для проецирования тела из сборки". В чертеже, как и задумано в коде, получил вид с одним телом (Проекционный вид с одним телом.png).
В строке 47, в SetProjectionObjects, можно сразу передавать self.arr.
smt = self.asso_view.SetProjectionObjects(self.arr)
Т. е. строку 39 с созданием массива safe_array можно не использовать.
Проверял в КОМПАС-3D v23.
+ Благодарностей: 1

IOreshin

Тогда остается вопрос почему точно такая же запись не работает в 22 версии.
Составление safe_array был последним шансом на успех, чтобы полностью учесть требования API
Входные параметры:

Objects

- cписок объектов VT_ARRAY | VT_DISPATCH.


UU


IOreshin

Еще есть подозрение на разные указатели на тело в чертеже и в 3D модели.
Через GetProjectionObjects можно получить диспатчи на проецируемые объекты в виде, который, кстати, работает только если предварительно руками выбрать тела. Если просто создать вид без выбора тел для проецирования и вызвать GetProjectionObjects, то ответ - None.
Так вот, если GetProjectionObjects и возвращает диспатчи, то они отличаются от диспатчей в 3D модели. Может тут собака закопана в 22 версии?

333

Здесь ошибки нет
Проецируется документ целиком
Выбранных объектов нет