Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: AlinaM от 19.03.21, 11:50:28

Название: Ссылка на чертеж из модели
Отправлено: AlinaM от 19.03.21, 11:50:28
Здравствуйте!
Скажите пожалуйста, есть ли способы программно сделать следующее!
Как из модели детали(сборки), узнать создан ли на него чертеж и если создан, то узнать имя файла чертежа?
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 19.03.21, 12:12:02
Программно - получить от Сборки, Детали список "внешних файлов". В этом списке будут и чертежи...
Без программирования - через меню: Файл->Информация о документе->Внешние ссылки->Файлы чертежей...
Название: Re: Ссылка на чертеж из модели
Отправлено: IgorT от 19.03.21, 13:00:25
Цитата: p3452 от 19.03.21, 12:12:02...
Без программирования - через меню: Файл->Информация о документе->Внешние ссылки->Файлы чертежей...
Это для какой версии К актуально?  8-)   У себя в 15.2 не вижу подобного. :cl:
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 19.03.21, 13:31:31
Цитата: IgorT от 19.03.21, 13:00:25Это для какой версии К актуально? 
В v18 это уже было, за более ранние - не скажу.
Название: Re: Ссылка на чертеж из модели
Отправлено: KiDim от 19.03.21, 13:35:10
Цитата: IgorT от 19.03.21, 13:00:25Это для какой версии К актуально?  8-)   У себя в 15.2 не вижу подобного. :cl:
Да нет, есть.
Инфо о документе.png
Название: Re: Ссылка на чертеж из модели
Отправлено: IgorT от 19.03.21, 15:30:05
Это-то есть... Не могу найти где же тут ссылка на оформленный по модели чертёж?
Название: Re: Ссылка на чертеж из модели
Отправлено: AlinaM от 22.03.21, 16:54:33
Цитата: p3452 от 19.03.21, 12:12:02Программно - получить от Сборки, Детали список "внешних файлов". В этом списке будут и чертежи...
Добрый день, большое спасибо!
Название: Re: Ссылка на чертеж из модели
Отправлено: AlinaM от 22.03.21, 17:00:06
Цитата: p3452 от 19.03.21, 12:12:02В этом списке будут и чертежи...
Смежный вопрос! В данном списке, показаны почти все типы документов кроме Спецификации (если мы говорим о модели сборки)
Не подскажете, возможно ли, программно, находясь в сборке, узнать имя файла СП, если она создана?
Название: Re: Ссылка на чертеж из модели
Отправлено: IgorT от 22.03.21, 20:26:03
Да где же они там?  :cl:
Не нахожу у себя в 15-ой версии....
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 22.03.21, 21:08:52
Цитата: AlinaM от 22.03.21, 17:00:06Не подскажете, возможно ли, программно, находясь в сборке, узнать имя файла СП, если она создана?
- SpecificationDescriptions.Count > 0 - есть спецификация
- SpecificationDocumentName - Имя подключенного файла документа спецификации (!?)

Возможно, более опытные подскажут точнее!
Название: Re: Ссылка на чертеж из модели
Отправлено: AlinaM от 23.03.21, 13:02:39
Цитата: p3452 от 22.03.21, 21:08:52SpecificationDocumentName
метод возвращает пустое значение, хотя SpecificationDescriptions.Count > 0
Название: Re: Ссылка на чертеж из модели
Отправлено: Slaviation от 23.03.21, 13:23:45
Добрый день.
Может список подключенных к объекту документов IProductDataManager::ObjectAttachedDocuments?
Название: Re: Ссылка на чертеж из модели
Отправлено: AlinaM от 23.03.21, 13:43:38
Цитата: Slaviation от 23.03.21, 13:23:45IProductDataManager
осталось только узнать, как получить объект IProductDataManager :w:
Название: Re: Ссылка на чертеж из модели
Отправлено: Sabahs от 23.03.21, 13:48:46
От IKompasDocument.
Название: Re: Ссылка на чертеж из модели
Отправлено: IgorT от 23.03.21, 14:11:59
Господа! Покажите, пожалуйста, где-же в модели находятся ссылки на оформленные с неё чертежи. Для К15.2
Не получается найти :%:
Название: Re: Ссылка на чертеж из модели
Отправлено: 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;
}
Название: Re: Ссылка на чертеж из модели
Отправлено: AlinaM от 14.04.21, 16:45:19
Цитата: p3452 от 24.03.21, 05:58:21Благодаря подсказке опытных:
Большое спасибо!
Подскажите, пожалуйста, решаема ли обратная задача!
Т.е., можно ли удалить ссылки на чертежи из модели?
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 21.06.21, 13:11:46
Да это возможно, если этот вопрос еще актуален, могу написать, как это сделать.
Название: Re: Ссылка на чертеж из модели
Отправлено: Toptotal от 21.06.21, 13:50:44
Цитата: Slaviation от 23.03.21, 13:23:45Может список подключенных к объекту документов
Очень хочется увидеть это в столбце Тотала и по ним отсортировать/искать. Как вывести и возможно заменить из изменения атрибутов?
Может доработаете плагин свой?
Название: Re: Ссылка на чертеж из модели
Отправлено: KrissKross от 09.09.21, 18:09:53
Цитата: Михаил88 от 21.06.21, 13:11:46Да это возможно, если этот вопрос еще актуален, могу написать, как это сделать.
Интересно посмотреть
Как можно удалить и добавить чертежи и спецификации к 3Д модели?
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 09.09.21, 19:15:15
Цитата: KrissKross от 09.09.21, 18:09:53Интересно посмотреть
Как можно удалить и добавить чертежи и спецификации к 3Д модели?

Интерфейс IProductDataManager (Менеджер Дерева СЧИ). Метод DeleteProductObject - Удалить объект из дерева СЧИ по идентификатору.
Название: Re: Ссылка на чертеж из модели
Отправлено: KrissKross от 09.09.21, 19:48:14
Благодарю

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

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

P.S.
Сейчас проверил в ручную в самом Компасе
во первых добавление связанных чертежей и спецификаций происходит разными командами
и при этом нельзя добавлять произвольные файлы, кроме cdw и spw
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 09.09.21, 20:34:31
Я это использовал только для удаления привязанных чертежей и спецификаций. Которые можно посмотреть в Управление связанными чертежами и спецификациями. В некоторых случаях очень сильно помогает ускорить работу компаса.
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 10.09.21, 07:00:34
удаление связаных СП и чертежей.rar
Название: Re: Ссылка на чертеж из модели
Отправлено: KrissKross от 11.09.21, 09:45:08
Благодарю!
Название: Re: Ссылка на чертеж из модели
Отправлено: maskedball от 19.11.21, 17:54:42
Цитата: 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?
Название: Re: Ссылка на чертеж из модели
Отправлено: maskedball от 19.11.21, 18:11:42
Отбой, я просто использовал старую версию библиотеки Interop.KompasAPI7...  :embarrassed:
Название: Re: Ссылка на чертеж из модели
Отправлено: 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)
Название: Re: Ссылка на чертеж из модели
Отправлено: kuser от 11.12.21, 14:20:22
Здравствуйте.

А как все-таки присоединить документ-чертеж к модели детали или сборки?
По предоставленному коду в посте #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: ('',)

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

Название: Re: Ссылка на чертеж из модели
Отправлено: Toptotal от 12.12.21, 00:16:02
Цитата: KrissKross от 09.09.21, 19:48:14получается вообще для любых файлов - т.е. сбылась мечта идиота - мы можем прикреплять к файлу ссылки на произвольные документы
По секрету скажу, в любой фаил любого формата можно вставить сколько хочешь файлов и они там будут. Но не связанных и ссылки на них не сделать.
Название: Re: Ссылка на чертеж из модели
Отправлено: plscomeback от 29.01.22, 22:30:32
Цитата: 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)

спасибо, а как лучше сделать если нужно копнуть глубже чем топ уровень?
Название: Re: Ссылка на чертеж из модели
Отправлено: 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 за содействие
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 03.03.22, 11:41:07
Цитата: 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;
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 03.03.22, 11:52:10
Цитата: 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 чертежей (просто пример)
Название: Re: Ссылка на чертеж из модели
Отправлено: KrissKross от 03.03.22, 14:19:34
to p3452
подтверждаю, код - работает
productDataMenager.ObjectAttachedDocuments[propertyKeeper] = drawing;
чтобы до конца понять новый интерфейс IProductDataManager
может кто прояснит в общем и в частностях

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

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

С уважением!
Название: Re: Ссылка на чертеж из модели
Отправлено: Михаил88 от 03.03.22, 14:41:50
Цитата: KrissKross от 03.03.22, 14:19:34Как расшифровывается - дерево СЧИ?

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

нужно просто взять и поэкспериментировать с методами и свойствами этого интерфейса. Я каких то подробных описаний не находил.
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 03.03.22, 14:55:42
Цитата: KrissKross от 03.03.22, 14:19:34Как расшифровывается - дерево СЧИ?
Тоже хотелось бы знать... - нет расшифровки ни в документации ни в Справке!?
Название: Re: Ссылка на чертеж из модели
Отправлено: p3452 от 03.03.22, 15:08:38
Цитата: Михаил88 от 03.03.22, 14:41:50Может быть менеджер дерева составных частей изделия
Это точно?
- Это опять к вопросу об адекватности Интерфейса Компас-а, т.к. согласно этому самому "интерфейсу" у Компаса есть всего ЧЕТЫРЕ вида "дерева":
- История построения (называется "Дерево")
- Структурное представление (называется "Дерево: структура")
- Исполнение (называется "Дерево: исполнения")
- Зоны (называется "Дерево: зоны")
???
Название: Re: Ссылка на чертеж из модели
Отправлено: Indicat от 28.10.22, 23:41:12
Здравствуйте!

Запускаю макрос (на основе из поста №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 версии тоже работать не будет