Есть сборка, в ней есть деталь вставленная с библиотеки *.kle. Возникла проблема, что файлы с этой библиотеки грузятся не с нее, а с кеш папки... Изменить файл через свойства детали и выбор пути не помогает, т.к требует именно m3d, помогите написать скрипт, а автозамены. Или хотябы функцию как изменить внешний файл
(https://downloader.disk.yandex.ru/preview/4fd237e20bbd79b5d6e47c5c792eb9da65a85eead58774d3c4d2f418104f52d7/606dbf32/gXUEVo716DQTEiX4g-mRpAc6Ck1TRgFJvnUNBSOp_gLylJmzidNLtMOy47-p3e7oyyhxc-YcRPFpbOoITkrJ6w%3D%3D?uid=0&filename=2021-04-07_13-12-32%20%282%29.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&owner_uid=0&tknv=v2&size=2560x1297)
Точнее как изменить файл-источник у детали в сборке, по-средствам API
iPart7.FileName = 'Полный путь'
iPart7.Update()
Вират Лакх, а можно поподробней?
plscomeback, есть результат по данному вопроссу?
Цитата: biomotor от 02.06.21, 09:32:05Вират Лакх, а можно поподробней?
Даже не знаю, что тут можно написать подробнее. Есть сборка, в неё компоненты. У каждого компонента IPart7 есть свойство FileName. Его можно получить и установить. После присвоения нового значения (другого абсолютного пути), чтобы изменения вступили в силу, нужно вызвать IModelObject.Update()
IModelObject - родительский интерфейс, но IPart7 этот метод наследует, так что можно написать IPart7.Update()
Вират Лакх, проблему решил, но не IPart7, а Part0-PartX.
Спасибо за совет.
Цитата: biomotor от 03.06.21, 09:09:01проблему решил, но не IPart7, а Part0-PartX.
"Part0-PartX" - новые интерфейсы в SDK?)
нет, имена переменных,
интерфейсы вроде SlcMan = iDocument3D.GetSelectionMng() и SlcMan.GetObjectByIndex (n)
и параметр fileName
Цитата: biomotor от 03.06.21, 09:09:01Вират Лакх, проблему решил, но не IPart7, а Part0-PartX.
Спасибо за совет.
У меня такая же проблема, но с разработкой скриптов не сталкивался.
Можете скинуть исходный файл скрипта или подсказать с чего мне начать.
TxRide, могу скинуть готовый код, которым я пользуюсь:
(Ошибка будет в том случае если компас не запущен!
В этом случае последующие скрипты работать не будут, нужно будет завершить скрытый процесс компаса или перезапустить ПК)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
# Полный путь к библиотеке
FPath = 'C:\Program Files\ASCON\KOMPAS-3D v19\Libs\MyLib.kle'
# Подключим описание интерфейсов 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))
# Подключим описание интерфейсов 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
# Если ни один документ не открыт выход
if kompas_document == None: quit()
# Получим тип документа
DocType = kompas_object.ksGetDocumentType(0)
# Если документ не деталь или сборка выход
if DocType != (5 or 6): quit()
# Получим указатель на интерфейс текущего документа трехмерной модели
iDocument3D = kompas_object.ActiveDocument3D()
# Получим указатель на интерфейс менеджера выделенных объектов
SlcMan = iDocument3D.GetSelectionMng()
# Выход из программы при отсутствии выделенного объекта
if not SlcMan.GetObjectByIndex(0): quit()
# Получим количество выделенных объектов
Count = SlcMan.GetCount()
# Получим указатель на интерфейс библиотеки моделей
IModelLibrary = kompas_object.GetModelLibrary()
# Выберем объект из библиотеки
FileName = IModelLibrary.ChoiceModelFromLib(FPath, 0)[0]
# Меняем все выделенные библиотечные объекты
Part = {}
for n in range(0, Count):
Part[n] = SlcMan.GetObjectByIndex(n)
Part[n].fileName = FileName
for n in range(0, Count):
Part[n].Update()
biomotor, спасибо, буду разбираться :beer:
Большое спасибо. Разобрался. Все работает отлично!
TxRide, допилить бы функцию добавления, а не только изменения файла....
Цитата: biomotor от 18.11.21, 09:38:51TxRide, допилить бы функцию добавления, а не только изменения файла....
Что конкретно?
Михаил88, помните мы с Вами обсуждали уже.
Добавление в сборку библиотечного элемента через то же меню....
Можно сделать, сейчас вышлю код.
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
# Подключим описание интерфейсов 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)
kompas_document_3d1 = kompas_api7_module.IKompasDocument3D1(kompas_document_3d)
kompas_document_3d1.ExecuteProcessOfInsertComponentFromFile(r'C:\Библиотека.kle|Drilling screw ISO 15481 - ST4,2 x 16 - H.m3d',
kompas6_constants.prAddPartFromFile)
kompas_document_3d1.LibProcess(kompas6_constants.prAddPartFromFile)
Сюда вставляете свой путь C:\Библиотека.kle|Drilling screw ISO 15481 - ST4,2 x 16 - H.m3d
Так вы предлагали делать добавление компонента в сборку?
Михаил88, это немного не то.
Помните Вы вызывали встроенное окно компаса с выбором файла из библиотеки,
в файле .py был прописан только путь к библиотеке.
тоже самое бы только чтобы добавить файл...
https://forum.ascon.ru/index.php?topic=35564.msg291147#msg291147
вот то же самое только добавить а не заменить...
а именно:
# Выберем объект из библиотеки
FileName = IModelLibrary.ChoiceModelFromLib(FPath, 0)[0]
я сделал свое окно библиотеки.
изображение_2021-11-23_113735.png
с окном , которое вызывается я поработал, но мне оказалось не очень удобно. По этому решил сделать свое. Аналогично тому как вы делали. Только добавил предпросмотр и окно где видны комментарии. Все данные беру напрямую из библиотеки kle.
biomotor, вообще если честно я не понял почему не то. Лучше по подробнее описать , как эта процедура должна выглядеть и что конкретно должно происходить в окне компаса. Лучше со скриншотами.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache
# Полный путь к библиотеке
FPath = r'C:\Program Files\ASCON\KOMPAS-3D v19\Libs\MyLib.kle'
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
# Подключим описание интерфейсов 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))
# Подключим описание интерфейсов 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
# Получим указатель на интерфейс библиотеки моделей
iModelLibrary = kompas_object.GetModelLibrary()
# Выберем объект из библиотеки
FileName = iModelLibrary.ChoiceModelFromLib(FPath, 0)[0]
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
kompas_document_3d1 = kompas_api7_module.IKompasDocument3D1(kompas_document_3d)
kompas_document_3d1.ExecuteProcessOfInsertComponentFromFile(FileName, kompas6_constants.prAddPartFromFile)
kompas_document_3d1.LibProcess(kompas6_constants.prAddPartFromFile)
Что у вас там не получается мне не понятно, вот. Надо было просто соединить вашу часть кода с моей и все.
У меня работает. При запуске появляется окно библиотеки с выбором деталей, выбираете нажимаете выбрать, запускается процесс вставки детали. Дальше у же код сами доработаете.
Михаил88, напрямую? можно поподробнее?
блин, не пойму, что за шляпа, тот код что я скинул перестал запускаться.... ((((
Подскажите как вы наполняете библиотеку?
Я наполнял через встроенный редактор библиотек, но столкнулся с проблемой когда мой сосед по парте решил тоже в неё что-то добавить.
Работать с библиотекой может только один человек за раз.
У вас случайно нет решения этой проблемы?
Цитата: TxRide от 26.11.21, 16:14:53Подскажите как вы наполняете библиотеку?
Я наполнял через встроенный редактор библиотек, но столкнулся с проблемой когда мой сосед по парте решил тоже в неё что-то добавить.
Работать с библиотекой может только один человек за раз.
У вас случайно нет решения этой проблемы?
Наполняю через встроенный редактор. У меня нет таких проблем, библиотека расположена у меня на локальной машине.