Получение исполнений детали с помощью API5/API7

Автор Валерий Изранов, 23.07.19, 16:17:44

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

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

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

Цитата: Вират Лакх от 19.12.19, 09:28:092) iDocument.SaveAs('d:\\sborka.a3d')

Но она вначале должна открыться из Старой папки...

Вират Лакх

Я в описании сказал, что "Макрос на питоне сохраняет текущую сборку", т.е. ранее открытый и активный документ.
Но можно и открыть самому, смотря что должна выполнять программа.
Тогда iDocument = iApplication.ActiveDocument заменить на iApplication.Documents.Open(FilePart, False, True) # указать видимость документа и права доступа.
FilePart - путь к файлу.

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

Это странная штука "длина сессии в мин" при регистрации. Был я, и вдруг меня нет на форуме.

Может быть Sabahs -автор текста
В сообщении от 02.02.18, 10:56:29 #7 по ссылке https://forum.ascon.ru/index.php/topic,31007.msg246609.html#msg246609 :

"IKompasDocument3D - он один для файла, исполнения имеют свой интерфейс и уже от них нужно получать IPart7:=IEmbodiment.Part - компонент исполнения."

откликнется?


Вират Лакх

Вам нужно перебрать исполнения сборки и сохранить содержимое каждого? Тогда чем Вам моё не устраивает? Не понятно ничего? Я почти так же, как сказал Sabahs, делаю.
"IKompasDocument3D - он один для файла" -> iKompasDocument3D = KompasAPI7.IKompasDocument3D(iDocument) - получаю интерфейс документа-модели.
"исполнения имеют свой интерфейс" -> for e in range(ecount): iEmbodimentsManager.SetCurrentEmbodiment(e) - последовательно переключаю текущее исполнение.
"от них нужно получать IPart7:=IEmbodiment.Part - компонент исполнения" -> iTopPart = iKompasDocument3D.TopPart - верхний компонент текущего исполнения.
Скорее всего, можно было не переключать исполнения сборки, а сделать типа как написал Sabahs: iEmbodimentsManager.Embodiment(e).Part
Но этот способ работает с версии компаса 16.0 и выше, а переключения должны работать с 14.0 и выше.

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


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

Вират Лакх, задача с первого взгляда простая:
Сборку в которую входит 1 деталь, у детали 3 исполнения нужно скопировать из Старой папки в Новую папку.

Gefakra

Здраствуйте, к теме с API. Возможно ли к созданной детали, создать и добавить новое свойство(не из стандартных т.е библиотеке), для программирования исползую C#


проблемам в том, что после обьявления
IAplication newAplication = (IAplication)kompas.ksGetApplication7();
IKompasDocument kompasDoc = newAplication.ActivDocument;
IpropertyMng newProperty = (IpropertyMng)kompasDoc;

не добавить метод .addProperty, пишет что queryInterface не потдерживаеться. подскажите что делать ?

p3452

Цитата: Gefakra от 04.06.20, 09:42:42не добавить метод .addProperty, пишет что queryInterface не потдерживаеться. подскажите что делать ?
Можно так:
IPropertyMng newProperty = (IPropertyMng) newAplication;
newProperty.AddProperty(...);
Или так:
IPropertyMng newProperty = (IPropertyMng)kompasDoc.Application;
newProperty.AddProperty(...);

Gefakra

04.06.20, 10:50:32 #49 Последнее редактирование: 04.06.20, 12:51:43 от Gefakra
Цитата: p3452 от 04.06.20, 10:04:27Можно так:
IPropertyMng newProperty = (IPropertyMng) newAplication;
newProperty.AddProperty(...);
Или так:
IPropertyMng newProperty = (IPropertyMng)kompasDoc.Application;
newProperty.AddProperty(...);

Сработало, но к детали свойство не добавляется, пытаюсь вызвать метод IProperty.Update; но не выходит.
подозреваю что здесь нужен IPropertyKeeper, подскажите пожалуйста, что делать?
code
   IApplication newAplikation = (IApplication)kompas.ksGetApplication7();            
   IKompasDocument kompasDoc = newAplikation.ActiveDocument;
   IPropertyMng newProprty = (IPropertyMng)newAplikation;
   newProprty.AddProperty("12","12");

p3452

Цитата: Gefakra от 04.06.20, 10:50:32Сработало, но к детали свойство не добавляется, пытаюсь вызвать метод IProperty.Update; но не выходит.
Вы вдумайтесь в то, что написано в справке SDK!
Что означают два параметра у AddProperty()?
Где и как их взять?!
Проделайте ручками в КОМПАС-е то, что хотите сделать программно, может быть тогда наступит понимание...

Gefakra

Цитата: p3452 от 04.06.20, 14:10:34Вы вдумайтесь в то, что написано в справке SDK!
Что означают два параметра у AddProperty()?
Где и как их взять?!
Проделайте ручками в КОМПАС-е то, что хотите сделать программно, может быть тогда наступит понимание...
получаеться: открыть менеджер свойст, создать свойство, добавить свойство
создать свойство есть, добавить это IpropertyKeeper.SetPropertyValue
значет остаеться установить сами значени, как то нет понимания как это сделать, и как подключить интерфей IpropertyKeeper через
IChooseBodies7::Bodies.

Gefakra

я не очень понимаю эти два параметра:( VARIANT libname, VARIANT val );

 Libname ( VARIANT)
 - полный путь к библиотеке на диске VT_BSTR, либо указатель на документ VT_DISPATCH. Теку­щий документ - VT_EMPTY,
 
val( VARIANT)
 - новое свойство VT_EMPY, создать по прототипу другого свойства - VT_DISPATCH.
 из этого вытекает вопрос как должен выглядеть параметр, и как его добавить к объекту через IpropertyKeepr.SetPropertyValue?, не удаёться подключить интерфейс через IBody7


Вират Лакх

Цитата: Gefakra от 04.06.20, 09:42:42Возможно ли к созданной детали, создать и добавить новое свойство(не из стандартных т.е библиотеке)...
Сработало, но к детали свойство не добавляется...
Устал читать :)
Свойство создается не для детали/компонента, а добавляется в документ-модель. Все тела и компоненты, включая верхний компонент, имеют свойства, присутствующие в документе.
Неполный пример на питоне. Создание нового свойства в текущем документе, в котором надо выбирать значение из списка. При этом идентификатор созданного свойства будет всегда разный.
from pythoncom import VT_EMPTY, VT_ARRAY, VT_BSTR
from win32com.client import VARIANT
empty = VARIANT(VT_EMPTY, None)
listv = VARIANT(VT_ARRAY|VT_BSTR, ['aaa', 'bbb', 'ccc'])
iPropertyMng = KompasAPI7.IPropertyMng(iApplication)
iProperty = iPropertyMng.AddProperty(empty, empty)
iProperty.Name = 'Bukvi'
iProperty.Comment = 'Comment'
iProperty.UseListVal = True
iProperty.ListVal = listv
iProperty.Update()
Цитироватья не очень понимаю эти два параметра:( VARIANT libname, VARIANT val )
Первый - где создать свойство: в библиотеке свойств, в указанном документе или текущем документе.
Второй - само свойство: новое (с новым идентификатором и параметрами) или копию/прототип уже существующего свойства из другого или текущего документа или из библиотеки.
Когда свойство будет в документе, вы телу сможете в это свойство присвоить значение.
iPropertyKeeper = KompasAPI7.IPropertyKeeper(iBody7)
iPropertyKeeper.SetPropertyValue(iProperty, 'bbb', True)

Gefakra

Цитата: Вират Лакх от 05.06.20, 10:48:10Устал читать :)
Свойство создается не для детали/компонента, а добавляется в документ-модель. Все тела и компоненты, включая верхний компонент, имеют свойства, присутствующие в документе.
Неполный пример на питоне. Создание нового свойства в текущем документе, в котором надо выбирать значение из списка. При этом идентификатор созданного свойства будет всегда разный.
from pythoncom import VT_EMPTY, VT_ARRAY, VT_BSTR
from win32com.client import VARIANT
empty = VARIANT(VT_EMPTY, None)
listv = VARIANT(VT_ARRAY|VT_BSTR, ['aaa', 'bbb', 'ccc'])
iPropertyMng = KompasAPI7.IPropertyMng(iApplication)
iProperty = iPropertyMng.AddProperty(empty, empty)
iProperty.Name = 'Bukvi'
iProperty.Comment = 'Comment'
iProperty.UseListVal = True
iProperty.ListVal = listv
iProperty.Update()Первый - где создать свойство: в библиотеке свойств, в указанном документе или текущем документе.
Второй - само свойство: новое (с новым идентификатором и параметрами) или копию/прототип уже существующего свойства из другого или текущего документа или из библиотеки.
Когда свойство будет в документе, вы телу сможете в это свойство присвоить значение.
iPropertyKeeper = KompasAPI7.IPropertyKeeper(iBody7)
iPropertyKeeper.SetPropertyValue(iProperty, 'bbb', True)

на создании самого свойства всё и стопориться, непонятно как это сделать на C#

Gefakra

IApplication newAplikation = (IApplication)kompas.ksGetApplication7();
IKompasDocument kompasDoc = newAplikation.ActiveDocument;

//IPropertyMng newProprty = (IPropertyMng)newAplikation;

IPropertyMng newProprty = (IPropertyMng)kompasDoc.Application;
IProperty prop = newProprty.AddProperty(kompasDoc, b);
prop.Name = "qwerty";
prop.ReadOnly = true;
prop.ListVal = "123";
prop.Update();

prop возрашает null

Gefakra

Цитата: Вират Лакх от 05.06.20, 10:48:10Устал читать :)
Свойство создается не для детали/компонента, а добавляется в документ-модель. Все тела и компоненты, включая верхний компонент, имеют свойства, присутствующие в документе.
Неполный пример на питоне. Создание нового свойства в текущем документе, в котором надо выбирать значение из списка. При этом идентификатор созданного свойства будет всегда разный.
from pythoncom import VT_EMPTY, VT_ARRAY, VT_BSTR
from win32com.client import VARIANT
empty = VARIANT(VT_EMPTY, None)
listv = VARIANT(VT_ARRAY|VT_BSTR, ['aaa', 'bbb', 'ccc'])
iPropertyMng = KompasAPI7.IPropertyMng(iApplication)
iProperty = iPropertyMng.AddProperty(empty, empty)
iProperty.Name = 'Bukvi'
iProperty.Comment = 'Comment'
iProperty.UseListVal = True
iProperty.ListVal = listv
iProperty.Update()Первый - где создать свойство: в библиотеке свойств, в указанном документе или текущем документе.
Второй - само свойство: новое (с новым идентификатором и параметрами) или копию/прототип уже существующего свойства из другого или текущего документа или из библиотеки.
Когда свойство будет в документе, вы телу сможете в это свойство присвоить значение.
iPropertyKeeper = KompasAPI7.IPropertyKeeper(iBody7)
iPropertyKeeper.SetPropertyValue(iProperty, 'bbb', True)
А что если у модели есть ненесколько тел, и для каждого тела нужно задать уникальное свойство?!

Вират Лакх

Уникальное свойство или уникальное значение свойства?
Ещё раз. Свойства одни для документа. При добавлении свойства в документ оно появляется у всех тел и компонентов. И можно каждому объекту задать свои значения этого свойства.

Gefakra

23.09.20, 14:17:21 #58 Последнее редактирование: 23.09.20, 14:29:34 от Gefakra
..

Gefakra

Цитата: Вират Лакх от 23.09.20, 14:12:35Уникальное свойство или уникальное значение свойства?
Ещё раз. Свойства одни для документа. При добавлении свойства в документ оно появляется у всех тел и компонентов. И можно каждому объекту задать свои значения этого свойства.
Уникальное значение, или атрибуты