Ссылка на чертеж из модели

Автор AlinaM, 19.03.21, 11:50:28

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

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

Михаил88

Цитата: KrissKross от 09.09.21, 18:09:53Интересно посмотреть
Как можно удалить и добавить чертежи и спецификации к 3Д модели?

Интерфейс IProductDataManager (Менеджер Дерева СЧИ). Метод DeleteProductObject - Удалить объект из дерева СЧИ по идентификатору.

KrissKross

Благодарю

но пару уточняющих вопросов
Во первых что это за такое Дерево СЧИ
Во вторых загадочный Интерфейс IProductDataManager - работает и для чертежей и для спецификаций
и получается вообще для любых файлов - т.е. сбылась мечта идиота - мы можем прикреплять к файлу ссылки на произвольные документы

Желательно привести код - по добавлению и удалению - чертежей и спецификаций
с наскока не понятно, много входных параметров неизвестного происхождения

P.S.
Сейчас проверил в ручную в самом Компасе
во первых добавление связанных чертежей и спецификаций происходит разными командами
и при этом нельзя добавлять произвольные файлы, кроме cdw и spw

Михаил88

Я это использовал только для удаления привязанных чертежей и спецификаций. Которые можно посмотреть в Управление связанными чертежами и спецификациями. В некоторых случаях очень сильно помогает ускорить работу компаса.

Михаил88

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

KrissKross


maskedball

Цитата: p3452 от 24.03.21, 05:58:21Благодаря подсказке опытных:
/// C#: Список подключенных документов Сборки
string availAttachFile(IKompasDocument pDoci)
{
 if (pDoci == null) return "ER: pDoci == null";
 
 IKompasDocument3D doci3D = kompasApp.ActiveDocument as IKompasDocument3D;
 if (doci3D == null) return "ER: doci3D == null";
 
 IPart7 part7 = doci3D.TopPart;
 if (part7 == null) return "ER: part7 == null";
 
 IProductDataManager productDataMenager = pDoci as IProductDataManager;
 if (productDataMenager == null) return "ER: productDataMenager == null";
 
 dynamic arrAttachDoc = productDataMenager.ObjectAttachedDocuments[(IPropertyKeeper)part7];
 
 string st = "";
 int nom = 0;
 if (arrAttachDoc != null)
 foreach (var tDoc in arrAttachDoc)
 st = st+ (++nom).ToString()+ " :  ["+  tDoc.ToString()+ "]\n";
 
 //MessageBox.Show("Список подключенных документов:\n"+ st);
 return st;
}

Подскажите пожалуйста как получить доступ к интерфейсу IProductDataManager?
У меня к проекту поключены следующие библиотеки: Interop.Kompas6API5.dll, Interop.Kompas6Constants.dll, Interop.Kompas6Constants3D, Interop.KompasAPI7. Но в них нет описания для IProductDataManager. Компилятор не знает что это такое.
Скажите какую библиотеку нужно подключить, чтобы появилось описание интерфейса IProductDataManager?

maskedball

Отбой, я просто использовал старую версию библиотеки Interop.KompasAPI7...  :embarrassed:

Slaviation

Добрый день.

# -*- coding: utf-8 -*-
#~ Есть сборка с присоединенным к ней чертежом.
#~ В сборке есть деталь с присоединенным чертежом.
#~ Тест определяет чертежи, присоединенные и к сборке и к вставке детали.

import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument

# Документы, присоединенные к сборке
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
product_data_manager = kompas_api7_module.IProductDataManager(kompas_document_3d)
product_objects = product_data_manager.ProductObjects(kompas6_constants.ksPOTEmbodimentsObject)
attached_documents = product_data_manager.ObjectAttachedDocuments(product_objects)
print(attached_documents)

# Документы, присоединенные к вставке детали
part7 = kompas_document_3d.TopPart.PartsEx(kompas6_constants_3d.ksAllParts)[0]
property_keeper =  kompas_api7_module.IPropertyKeeper(part7)
attached_documents = product_data_manager.ObjectAttachedDocuments(property_keeper)
print(attached_documents)
+ Благодарностей: 4

kuser

Здравствуйте.

А как все-таки присоединить документ-чертеж к модели детали или сборки?
По предоставленному коду в посте #23 уважаемого Михаила88 (спасибо вам за него) отвязал ошибочный чертеж от детали.
А как теперь привязать нужный?
В iProductDataManager наряду с DeleteProductObject, используемого в упомянутом коде, есть также AddProductObject.
В SDK сказано, что метод добавляет объект дерева СЧИ по идентификатору и имеет такой синтаксис:


LPDISPATCH AddProductObject( IPropertyKeeper * Parent, BSTR Name, ksProductObjectTypeEnum ObjectType );

Я попробовал такую команду:

iProductDataManager.AddProductObject(IPropertyKeeper,"C:\\путь\\до\\чертежа\\Чертеж.cdw",1)

В ответ однако не получил, True, а получил что-то типо:

<win32com.gen_py.69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.IPropertyKeeper instance at 0x2076879937984>
Но ничего не добавилось и iProductDataManager.ObjectAttachedDocuments(iPropertyKeeper) выдает пустой tuple: ('',)

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


Toptotal

Цитата: KrissKross от 09.09.21, 19:48:14получается вообще для любых файлов - т.е. сбылась мечта идиота - мы можем прикреплять к файлу ссылки на произвольные документы
По секрету скажу, в любой фаил любого формата можно вставить сколько хочешь файлов и они там будут. Но не связанных и ссылки на них не сделать.

plscomeback

Цитата: Slaviation от 22.11.21, 07:21:14Добрый день.

# -*- coding: utf-8 -*-
#~ Есть сборка с присоединенным к ней чертежом.
#~ В сборке есть деталь с присоединенным чертежом.
#~ Тест определяет чертежи, присоединенные и к сборке и к вставке детали.

import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
kompas_document = application.ActiveDocument

# Документы, присоединенные к сборке
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
product_data_manager = kompas_api7_module.IProductDataManager(kompas_document_3d)
product_objects = product_data_manager.ProductObjects(kompas6_constants.ksPOTEmbodimentsObject)
attached_documents = product_data_manager.ObjectAttachedDocuments(product_objects)
print(attached_documents)

# Документы, присоединенные к вставке детали
part7 = kompas_document_3d.TopPart.PartsEx(kompas6_constants_3d.ksAllParts)[0]
property_keeper =  kompas_api7_module.IPropertyKeeper(part7)
attached_documents = product_data_manager.ObjectAttachedDocuments(property_keeper)
print(attached_documents)

спасибо, а как лучше сделать если нужно копнуть глубже чем топ уровень?

KrissKross

Код C# для добавления чертежа к 3Д модели

            string drawing = @"H:\Test\Чертеж.cdw";

            IPropertyKeeper propertyKeeper = part7 as IPropertyKeeper;

            IProductDataManager productDataManager = document3d as IProductDataManager;

            productDataManager.set_ObjectAttachedDocuments(propertyKeeper, drawing);

уточнение для Python
метод называется немного по другому - SetObjectAttachedDocuments

и да в справке описание данного метода НЕТ
может данная возможность на бета-тестировании или просто забыли внести описание

Огромная благодарность Михаил88 за содействие

p3452

Цитата: KrissKross от 02.03.22, 19:45:29Код C# для добавления чертежа к 3Д модели

            string drawing = @"H:\Test\Чертеж.cdw";

            IPropertyKeeper propertyKeeper = part7 as IPropertyKeeper;

            IProductDataManager productDataManager = document3d as IProductDataManager;

            productDataManager.set_ObjectAttachedDocuments(propertyKeeper, drawing);

уточнение для Python
метод называется немного по другому - SetObjectAttachedDocuments

и да в справке описание данного метода НЕТ
может данная возможность на бета-тестировании или просто забыли внести описание

Огромная благодарность Михаил88 за содействие

- В четырех строчках кода, три разных интерфейса!?
- В Справке описание метода, есть (ObjectAttachedDocuments).
- Для C# метод такой же как и для Python (ObjectAttachedDocuments).
- Для Ваших переменных код будет такой:
productDataMenager.ObjectAttachedDocuments[propertyKeeper] = drawing;
+ Благодарностей: 1

Михаил88

Цитата: p3452 от 03.03.22, 11:41:07- Для C# метод такой же как и для Python (ObjectAttachedDocuments).
на python так не работает
надо так

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))

kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart
iPropertyKeeper = kompas_api7_module.IPropertyKeeper(iPart7)
iProductDataManager = kompas_api7_module.IProductDataManager(kompas_document)
iProductDataManager.SetObjectAttachedDocuments(iPropertyKeeper, ('C:\\Users\\User\\Desktop\\Чертеж.cdw',
                                                                 'C:\\Users\\User\\Desktop\\Чертеж111.cdw',))

можно привязывать 1 или несколько документов. В данном примере привязка 2 чертежей (просто пример)
+ Благодарностей: 1

KrissKross

to p3452
подтверждаю, код - работает
productDataMenager.ObjectAttachedDocuments[propertyKeeper] = drawing;
чтобы до конца понять новый интерфейс IProductDataManager
может кто прояснит в общем и в частностях

Как расшифровывается - дерево СЧИ?

и объяснит все свойства интерфейса, а то гляжу в книгу и вижу фигу
Geometry - Список подключенных документов
MetaProductInfo - Метаданные дерева СЧИ
...
ReferenceDataInfo - Справочные данные свойства

С уважением!

Михаил88

Цитата: KrissKross от 03.03.22, 14:19:34Как расшифровывается - дерево СЧИ?

Может быть менеджер дерева составных частей изделия

Михаил88

Цитата: KrissKross от 03.03.22, 14:19:34и объяснит все свойства интерфейса, а то гляжу в книгу и вижу фигу
Geometry - Список подключенных документов
MetaProductInfo - Метаданные дерева СЧИ
...
ReferenceDataInfo - Справочные данные свойства

нужно просто взять и поэкспериментировать с методами и свойствами этого интерфейса. Я каких то подробных описаний не находил.

p3452

Цитата: KrissKross от 03.03.22, 14:19:34Как расшифровывается - дерево СЧИ?
Тоже хотелось бы знать... - нет расшифровки ни в документации ни в Справке!?

p3452

Цитата: Михаил88 от 03.03.22, 14:41:50Может быть менеджер дерева составных частей изделия
Это точно?
- Это опять к вопросу об адекватности Интерфейса Компас-а, т.к. согласно этому самому "интерфейсу" у Компаса есть всего ЧЕТЫРЕ вида "дерева":
- История построения (называется "Дерево")
- Структурное представление (называется "Дерево: структура")
- Исполнение (называется "Дерево: исполнения")
- Зоны (называется "Дерево: зоны")
???

Indicat

Здравствуйте!

Запускаю макрос (на основе из поста №23) в Компас 21 (21.0.6):

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache


#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))


kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart
iPropertyKeeper = kompas_api7_module.IPropertyKeeper(iPart7)

iProductDataManager = kompas_api7_module.IProductDataManager(kompas_document)
ObjectAttachedDocuments1 = iProductDataManager.ObjectAttachedDocuments(iPropertyKeeper)
print(ObjectAttachedDocuments1)

UniqueMetaObjectKey = iPropertyKeeper.UniqueMetaObjectKey
print(UniqueMetaObjectKey)
print(iProductDataManager.DeleteProductObject(UniqueMetaObjectKey))

ObjectAttachedDocuments2 = iProductDataManager.ObjectAttachedDocuments(iPropertyKeeper)
print(ObjectAttachedDocuments2)

1. В строке
ObjectAttachedDocuments1 = iProductDataManager.ObjectAttachedDocuments(iPropertyKeeper) получаю пустой список, хотя привязанные документы есть.

2. Попробовал получать iPropertyKeeper от kompas_document_3d
iPropertyKeeper = kompas_api7_module.IPropertyKeeper(kompas_document_3d)Список есть! Но в нем кроме привязанных документов еще вижу строку с именем файла самой модели (первым в списке). Хорошо, пусть будет так.

3. Далее
print(iProductDataManager.DeleteProductObject(UniqueMetaObjectKey))возвращает true. Отлично, изменения прошли!

4. Смотрю список
ObjectAttachedDocuments2 = iProductDataManager.ObjectAttachedDocuments(iPropertyKeeper)А он не пустой! Строка с именем файла модели исчезла, а все реально привязанные документы на месте и видны в компасе.


Вопрос: как правильно получать список привязанных файлов и удалять на них ссылки в КОМПАС 21? в 20 версии все прекрасно работает.

PS: до привязки файлов к модели еще не добрался, но предполагаю, что код от 20 версии тоже работать не будет