Как получить IKompasDocument3D?

Автор Mary, 10.01.19, 14:15:46

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

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

Mary

День добрый.

Макрос. Компас открыт.
Детали перебираю в сборке - каждую открываю невидимкой и IKompasDocument3D получаю как IApplication.ActiveDocument
От IKompasDocument3D с помощью propertyManager получаю и редактирую произвольные свойства детали.

Вопрос 1:
Если открываемая деталь уже открыта на другой вкладке - как получить указатель на ее IKompasDocument3D?
IApplication.Documents  - дает только Null

Вопрос 2:
Локальная деталь - как отрыть для редактирования на месте и получить указатель на ее IKompasDocument3D?
редактирование на месте через API5, part5IDocument3D  = part5.BeginEdit() возвращает указатель на исходную сборку, а не деталь.
для редактирования на месте через  API7 нужны параметры открытия документа OpenDocumentParam. Если беру OpenDocumentParam от IPart7, настраиваю видимость, read-only - в редактирование на месте не заходит.
OpenDocumentParam от IApplication.Documents - не получить, т.к. см. вопрос1.

Во вложении - пример на питоне 2

Буду признательна за помощь

ТрындецЪ

Если документ открыт, то iDoc = iApplication.Documents.Item(iPart7.FileName)
вернёт указатель на документ, если нет, то None
Вират Лакх большую работу проделал с макросом Обозначение компонентов. Там код открыт и можно найти все доступные способы добраться до источников компонентов.

Upd:Вот тут мы уже перетирали проблему локальных деталей
+ Благодарностей: 1

once

#2
По второму вопросу, у меня было что-то подобное, при редактировании ругался на неправильный индекс. Попробуй когда получил OpenDocumentParam, установить ApplyingIndex равным 0, после этого заработало.
+ Благодарностей: 1

Mary

 C iApplication.Documents.Item(iPart7.FileName) - получилось, спасибо.  Но как??? iApplication.Documents -то "None"? Или у него просто метод print не определен?

Указанный макрос смотрела, ответа на свой вопрос не нашла: редактирование на месте запускается без получения указателей, свойства редактируются в источнике через ISoursePart7Params. Не подходит

Mary

#4
С Applyingindex действительно почти заработало. BeginEdit запускается, но возвращает указатель на IKompasDocument3D исходной сборки.

В обсуждении локальных деталей ТАМ вобщем-то такой же результат.

Вопрос про получение IKompasDocument3D - открыт.
Мб можно как-то от IPart?

Вират Лакх

Подписываюсь на тему.
Цитата: Mary от 10.01.19, 15:02:30
C iApplication.Documents.Item(iPart7.FileName) - получилось, спасибо. Но как??? iApplication.Documents -то "None"?
Команда print у коллекций iApplication.Documents и iSpecificationDescription.BaseObjects отображает None. Чтобы узнать, на самом ли деле он None, приходится узнавать количество элементов этих коллекций.
Цитата: Mary от 10.01.19, 15:02:30
Или у него просто метод print не определен?
У интерфейсов компаса нет методов print, это внутренняя инструкция python.

Если перебираете сборку, то сначала проверяете по имени IDocuments.Item(iPart7.FileName), что документ уже не открыт, если вернёт nil, то открываете невидимкой.

Mary

Sabahs, первый вопрос уже решен. Актуально - как получить IKompasDocument3D для локально редактируемой детали.

once

#8
Скорее всего никак, документ должен быть открыт, т.е. модель не должна редактироваться на месте. Вам точно нужен IPropertyManager, может IPropertyKeeper?

once

Открывайте документ в невидимом режиме, не редактируйте на месте. После открытия документ становится активным, у него и получите IKompasDocument3D. Тем более, что не любое свойство можно поменять редактируя на месте.

Mary

И IPropertyManager нужен, и IPropertyKeeper.
Локальную-то деталь в окне не открыть. Такими темпами придётся от них совсем отказаться

IPropertyKeeper можно получить от IPart7 - интерфейс компонента 3D документа, а для локальной детали он получается четко.
IPropertyManager - создаётся IApplication.
Вопрос зачем Вам IKompasDocument3D, что с ним делать?

Mary

Все так.
С помощью IKompasDocument3D получаю конкретное свойство:
property_ = propMng.GetProperty(IKompasDocument3D,  propID)

В SDK значится для первого аргумента: путь к библиотеке, указатель на документ,  текущий документ - vt_empty.

С IPart7.FileName или None - property не возвращается. С IKompasDocument3D все ок. И будет редактироваться свойство в том документе, чей IKompasDocument3D был подставлен.

Можно попробовать войти в режим редактирования локальной детали и посмотреть, что вернёт.
property_ = propMng.GetProperty(VT_EMPTY,  propID)

Mary

Exception - global name 'VT_EMPTY' is not defined.

Подставляю просто 0, получаю noneType object

Как добыть настоящий VT_EMPTY?

ТрындецЪ

Цитата: Mary от 11.01.19, 15:51:01
Как добыть настоящий VT_EMPTY?
Вот так добавлял новое свойство:
emptyVal = VARIANT(pythoncom.VT_EMPTY, None)
property = property_mng.AddProperty(emptyVal , emptyVal)

Обсуждали тут https://forum.ascon.ru/index.php/topic,30837.msg244699.html#msg244699
+ Благодарностей: 1

Mary

VT_EMPTY - получился, а вот свойство - нет(
+ Благодарностей: 1

Вират Лакх

z1 = iPart7.BeginEdit(iApplication.Documents.GetOpenDocumentParam())
или
z1 = iPart7.BeginEdit(iPart7.GetOpenDocumentParam())
дают всё-таки правильный интерфейс
print z1 # <KompasAPI7.IKompasDocument3D instance at 0x64229128>
Это подтверждается техническими требованиями:
print z1.TechnicalDemand3D.IsCreated, z1.TechnicalDemand3D.Text.Str

Но вот всё остальное (в т.ч. TopPart) относит к базовому интерфейсу открытого документа (как бы типа того).
Я предположил, что у IKompasDocument3D надо получить IPartDocument или IAssemblyDocument, но всё равно результат один - информация о компоненте как части сборки, а не его источник:
z2 = KompasAPI7.IPartDocument(z1)
print z2 # <KompasAPI7.IPartDocument instance at 0x64259784>
print z2.Name
print z2.PathName
print z2.TopPart.Marking

В СДК IPartDocument вообще пустой, а в IAssemblyDocument только DismantleMode - Разнесенная сборка.
А это, видимо, как раз интерфейсы документов компонентов?
+ Благодарностей: 2

Kaimen

Можно выгрузить локальную деталь во временный файл изменить её свойства, обратно взять в сборку и удалить временный файл.
Например так:

    iDocument = iApplication.ActiveDocument                               
    iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
    SelectionManager = iKompasDocument3D.SelectionManager       
    SelectedObjects = SelectionManager.SelectedObjects         
    if SelectedObjects.IsLocal: iPart7 = SelectedObjects

    path_part = os.path.expandvars("$temp\\") + iPart7.FileName.replace(">", "_")
    iPart7.SaveAs(path_part)

    iDocument_part = iApplication.Documents.Open(path_part, False, False)             
    iKompasDocument3D_part = KAPI7.IKompasDocument3D(iDocument_part)
    iPart7_part = iKompasDocument3D_part.TopPart

    iPart7_part.Marking = "АБВГ-10.01.000"
    iPart7_part.Name = "Вставка"

    iPart7_part.Update()
    iKompasDocument3D_part.RebuildDocument()

    iDocument_part.Close(1)
    iPart7.IsLocal = True
    iPart7.Update()
    iKompasDocument3D.RebuildDocument()
    if os.path.isfile(path_part): os.remove(path_part)
+ Благодарностей: 4

ТрындецЪ

Цитата: Kaimen от 18.01.19, 10:51:17
Можно выгрузить локальную деталь во временный файл изменить её свойства, обратно взять в сборку и удалить временный файл.
Этот вариант на данный момент единственный из доступных. Спасибо!
Кто-то ранее предлагал идти по этому пути.
+ Благодарностей: 1