Как в макрос добавить подсчёт количества открытых файлов?

Автор komplive, 10.10.23, 21:23:59

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

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

komplive

Здравствуйте, коллеги!
В интернете нашёл макрос для заполнения обозначения и наименования в деталях (сборках) исходя из названия файла. Я немного доработал этот макрос, сделал, чтобы после заполнения этих свойств файл сохранялся и закрывался?
Подскажите пожалуйста, а можно сделать так, чтобы макрос вычислял сколько файлов открыто в Компас-3D, и выполнял эти для всех открытых файлов по очереди? Что надо добавить в мой макрос?

Текст макроса:

# -*- coding: utf-8 -*-
#|заполнить свойства из файла

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
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

#  Подключим описание интерфейсов 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))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов 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))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

file_name=kompas_document_3d.Name[:-4].split(' - ')
iPart.marking=file_name[0]
iPart.name=' '.join(file_name[1:])
iPart.Update()
kompas_document.Close(True)


komplive


p3452

IDocuments - Коллекция документов, открытых в КОМПАС-3D...
IEnumerator - перечислитель, который осуществляет перебор элементов коллекции.
Получение нумератора:      KompasAPI7.IDocuments.GetEnumerator();

Специалисты по Python подскажут более подробно.
+ Благодарностей: 1

Валерий Изранов

Цитата: komplive от 10.10.23, 21:23:59макрос для заполнения обозначения и наименования в деталях (сборках) исходя из названия файла

Нет, это должно быть не так.
Правильно, когда наименование и обозначение присваиваются самой Модели
и только потом ее сохраняют на диск с именем файла в виде Наименование_Обозначение.
Тоже самое и  для Чертежа, и для Спецификации
+ Благодарностей: 1

Дмитрий22

Цитата: Валерий Изранов от 11.10.23, 06:30:46Нет, это должно быть не так.
Правильно, когда наименование и обозначение присваиваются самой Модели
и только потом ее сохраняют на диск с именем файла в виде Наименование_Обозначение.
Тоже самое и  для Чертежа, и для Спецификации
Не всегда в самом начале проектирования видна полная структура изделия, чаще бывает, что не видна, она появляется в процессе проектирования. Заниматься двойной работой (сначала присваивать, потом все менять не хочется). Наименование и обозначение на ранней стадии пустые, а детали сохранять надо, поэтому иногда даем бутафорные имена файлам (Первые цифры проекта + Наименование + Дата + Время). Правильно, может и правильно, но реальность вносит свои коррективы.
+ Благодарностей: 1

Валерий Изранов

Цитата: Дмитрий22 от 11.10.23, 07:02:01поэтому иногда даем бутафорные имена файлам (Первые цифры проекта + Наименование + Дата + Время)

Возможно что и нужно. Только ЭТО автор темы собирается с помощью своей программы внести
в "законные" Наименование и Обозначение. Получится ли и будет ли толк?
+ Благодарностей: 1

komplive

Цитата: Валерий Изранов от 11.10.23, 06:30:46Нет, это должно быть не так.
Правильно, когда наименование и обозначение присваиваются самой Модели
и только потом ее сохраняют на диск с именем файла в виде Наименование_Обозначение.
Тоже самое и  для Чертежа, и для Спецификации
Согласен, при проектировании обычно так правильней делать. А вот когда надо корректировать готовую сборку (деталь), и из-за этого меняются все обозначения, то проще сначала переименовать файлы (например через тотал командер), а потом с помощью этого макроса менять свойства деталей. Всё очень удобно. Только вот хочется ещё упростить задачу, т.к. этих деталей может 7, в другой раз 15 или ещё больше. Чтобы вручную это не делать - нужен подобный макрос.

Валерий Изранов

Если с помощью Тотал переименовать файл компонента Сборки, то о новом имени надо "сообщить" Сборке.
Иначе файл с новым именем она не признает. Задача не из легких.

komplive

Цитата: Валерий Изранов от 11.10.23, 07:52:29Если с помощью Тотал переименовать файл компонента Сборки, то о новом имени надо "сообщить" Сборке.
Иначе файл с новым именем она не признает. Задача не из легких.
Это как раз-таки легко решается, если старая сборка с деталями в архиве, то при открытии заменяю все компоненты.

Но вопрос то не в этом, а как доработать макрос?

Валерий Изранов


Nipal

Получить коллекцию документов IDocuments, дальше Ваш код вставить в цикл перебора всех открытых документов по их количеству IDocuments.Count.
Дальше в цикле получаете не активный документ, а документ по индексу IDocuments.Item, проверяете что тип документа IKompasDocument.DocumentType соответствует 3D, т.к. могут быть открыты и другие документы, получаете от IKompasDocument интерфейс 3D документа IKompasDocument3D ну и дальше Ваш код.

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

file_name=kompas_document_3d.Name[:-4].split(' - ')
iPart.marking=file_name[0]
iPart.name=' '.join(file_name[1:])
iPart.Update()
kompas_document.Close(True)
+ Благодарностей: 3

komplive

Спасибо!
Вот так должно быть?
сделал так: #  Получи интерфейс активного документа
documents = application.Documents
for i in range(documents.Count): kompas_document=documents.Item(i)
Documents = application.Documents
iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)
file_name=kompas_document_3d.Name[:-4].split(' - ')iPart.marking=file_name[0]
iPart.name=' '.join(file_name[1:])iPart.Update()
kompas_document.Close(True)

Я просто ещё новичок в этом деле. Подскажите как правильно прописать код макроса?

Nipal

Я на питоне не пишу, но быть должно не так.
Выше полный алгоритм дал, индекс в коллекции документа начинается с нуля соответственно последний документ в коллекции имеет индекс documents.Count-1.
Код должен быть внутри цикла, 3D документ нужно получать от kompas_document убедившись, что он является 3D документом.