• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Не читаются параметры главного исполнения

Автор EvgenyBy, 15.11.13, 17:32:56

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

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

EvgenyBy

Тут наверно какая то ошибка в API :?:
вот пример который читает обозначение и другие параметры исполнений:


  if Supports(KompasApp.ActiveDocument, IKompasDocument3D, d3) then
    if Supports(d3, IEmbodimentsManager, em) then
      for i := 0 to em.EmbodimentCount -1 do
      begin
        Memo1.Lines.Add(em.GetEmbodimentMarking(i,ksVMFullMarking,false));
        e := em.Embodiment[i];
        Memo1.Lines.Add(e.GetMarking(ksVMFullMarking,false));
        Memo1.Lines.Add(e.Name);
        Memo1.Lines.Add(e.Material);
        Memo1.Lines.Add(FloatToStr(e.Mass));
        Memo1.Lines.Add(FloatToStr(e.Density));
     end;


проверял на тестовых примерах
Samples\New\Configurations\Pin\Pin.m3d
Samples\New\Configurations\Pin\Plug.m3d
Samples\New\Configurations\Bush\Bush .m3d

так вот для 0-го элемента все свойства которые возвращает интерфейс IEmbodiment - пустые
хотя  IEmbodimentsManager.GetEmbodimentMarking(0...) читает обозначение правильно.
Как можно прочитать остальные свойства при таком раскладе?
+ Благодарностей: 1

Не пробовали так e:=em.TopEmbodiment - основное исполнение.

EvgenyBy

      e := em.TopEmbodiment;
      Memo1.Lines.Add(e.GetMarking(ksVMFullMarking,false));

тоже пусто :(


EvgenyBy

так примеры стандартные
Samples\New\Configurations\Pin\Pin.m3d   - 3
Samples\New\Configurations\Pin\Plug.m3d  - 3
Samples\New\Configurations\Bush\Bush .m3d - 16 (я добавил уже несколько для теста, было меньше)

Да не хочет возвращать, домой приду ещё данный интерфейс поковыряю.

Slaviation

А менеджер исполнений точно берётся от документа? Не от головного парта?

Возможно так и задумано, т.к. это всё есть у документа.
+ Благодарностей: 1

EvgenyBy

Да, но тут проблема в том что документ возвращает свойства _активного_ исполнения, а не главного.

#9
А кто Вам мешает запомнить текущее исполнение, установить текущим главное и получить свойства, а затем установить текущим исполнение которое Вы запомнили.
+ Благодарностей: 1

EvgenyBy


EvgenyBy

А еще при переключении исполнений - документ получает статус "изменен"  :(((

BD11

#12
Что делать если я в сборку вставляю деталь и хочу поменять ее исполнение? Мне нужно зайти в редактирование этой детали и там выбрать нужное исполнение? А то прямо из сборки не выходит, вот мой код:

// Вставляю деталь в сборку
iPart = (IPart7)iPart.Parts.AddFromFile(openFD.FileName, true, true);

// Хочу получить интерфейс IEmbodimentsManager для моей детали
IEmbodimentsManager iEM = (IEmbodimentsManager)iPart;
myKompasObject.ksMessage("Количество исполнений: " + iEM.EmbodimentCount.ToString());

BD11

Плохо описал проблему. Количество исполнений детали я могу узнать прямо из сборки (код приведен выше), так же могу узнать номер исполнения детали прямо из сборки, но параметры этого исполнения (название, массу и т.д.) не выходит. Ниже приведу свой код в котором я вставляю в сборку деталь, узнаю количество исполнений детали, меняю исполнение детали и хочу узнать название исполнения, но вылетает ошибка. Что я делаю не так? Или параметры исполнения можно узнать только открыв деталь?  :`(


iPart = (IPart7)iPart.Parts.AddFromFile(openFD.FileName, true, true);
IEmbodimentsManager iEM = (IEmbodimentsManager)iPart;
myKompasObject.ksMessage("Количество исполнений: " + iEM.EmbodimentCount.ToString());
iEM.SetCurrentEmbodiment(2);
myKompasObject.ksMessage("Исполнение № " + iEM.CurrentEmbodimentIndex.ToString());
myKompasObject.ksMessage(iEM.CurrentEmbodiment.Name); // Ошибка!
iPart.Update();
myDocument3D.RebuildDocument();



Если открыть деталь, то можно узнать интересующие параметры. Но есть подводный камень - можно узнать параметры всех исполнений, кроме первого! Ниже привел работающий код, в котором узнаю количество исполнений детали, устанавливаю нужное мне исполнение (x) и хочу узнать название и массу установленного исполнения. Так вот не выходит узнать параметры первого исполнения (x=0). С параметры второго (x=1) и третьего (x=2) проблем нет. Это косяк Компас API?

iEM iEM = (iEM)iApplication.Documents.Open(openFD.FileName);
myKompasObject.ksMessage("Количество исполнений: " + iEM.EmbodimentCount.ToString());
int x;
iEM.SetCurrentEmbodiment(x);
myKompasObject.ksMessage("Номер исполнения: " + iEM.CurrentEmbodimentIndex.ToString() + " || " + "Название: " + iEM.CurrentEmbodiment.Name + " || " + "Масса: " + iEM.CurrentEmbodiment.Mass.ToString());
      

BD11

Приведу пример. У меня есть деталь имеющая три исполнения:
01.png

Далее узнаю параметры исполнения открыв деталь (код привел выше). Узнаю параметры третьего исполнения (x=2) - все ОК:
02.png

Теперь узнаю параметры первого исполнения (x=0):
03.png

Slaviation

Параметры исполнения, не открывая детали, можно узнать установив это исполнение текущим.
IEmbodimentsManager::SetCurrentEmbodiment(VARIANT Index);
+ Благодарностей: 1

BD11

Slaviation, меня сейчас больше волнует почему нельзя узнать свойства первого исполнения (описал выше и приложил картинки)? Это баг Компаса (у меня сейчас 14V x32)?

Причем первое исполнение можно установить SetCurrentEmbodiment(0), но узнать название, массу не выходит. Установить второе (и последующие) исполнения и узнать их название и массу без проблем. Выходит, что надо делать "фиктивное" первое исполнение, которое нигде не будет использоваться, решение проблемы, но глупо.

Свойства первого исполнения можно узнать, только обходным путём http://forum.ascon.ru/index.php/topic,25319.msg183834.html#msg183834
+ Благодарностей: 1

Slaviation

#18
ЦитироватьВыходит, что надо делать "фиктивное" первое исполнение, которое нигде не будет использоваться, решение проблемы, но глупо.
Потестил задачку, тест (на Python) в прицепе. Для запуска нужен КОМПАС-3D не ниже 13, Python и его расширение PyWin32.
Свойства ВСЕХ исполнений (массу, наименование и т.п.) получил через интерфейс IProperty, не открывая компонент сборки в отдельном окне.
Взять их через IEmbodiment, не открывая компонент сборки в отдельном окне нельзя.
+ Благодарностей: 2

BD11

Sabahs, да, да, про обходной путь я читал. Так и думал в итоге сделать - открыть деталь и записать все свойства исполнений в массив, без использования IEmbodimentsManager.Embodiment(Index).Mass, а меняя текущее исполнение ну нужное и считывая данные "напрямую" IEmbodimentsManager.Mass. Как в той теме и написано "криво же нереально" :-)))

Slaviation, было бы здорово обойтись без "обходного" путя, но не понял как с помощью IProperty работать с иполнениями. Без IEmbodimentsManager не обойтись же. Slaviation, если пример использования IProperty в архиве, то к сожалению не могу сейчас посмотреть.
+ Благодарностей: 1