API для ассоциации чертежа и детали в сборке

Программирование для CATIA.

API для ассоциации чертежа и детали в сборке

Сообщение void » 19 мар 2016 20:06

Коллеги, добрый день!

Подскажите, пожалуйста, можно ли, выбрав на чертеже деталь, получить PartNumber этой детали в ассоциированной с чертежом сборке?
Подобная функция есть в интерфейсе Drafting'а - Tools/Analyse/Show Geometry In All Viewpoints.
Там при наведении на чертеж подсвечивается соответствующая деталь в сборке.
Есть ли для нее API?

Насколько понимаю, можно определить корневую сборку, связанную с чертежом

Set oViewerActive = CATIA.ActiveDocument.DrawingRoot.ActiveSheet.Views.ActiveView
Set genlinks = oViewerActive.GenerativeLinks

name = genlinks.FirstLink.name 'PartNumber корневой сборки


При этом если у сборки есть два вида на чертеже, то число компонентов равно нулю.

cnt = oViewerActive.Components.count

Что за компоненты? Или это со сборкой никак не связано?

Заранее спасибо за ответы!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Artem » 21 мар 2016 11:06

Можно завязать определенную область на виде с ограниченным списком деталек - через GetProjectionPlane можно найти координаты проекций 3д точек на плоскость вида. Это могут быть центры тяжести деталек +рисуешь круг (R=макс описанный вокруг детали - подсказка на лям. - васик не дает определение макс. расстояния -рисуешь вокруг детали из ц.т. шар ....нуу предположим в километр радиусом)) -и теперь уже определяешь МИНИМАЛЬНОЕ расстояние детали до шара - что васик вполне себе разрешает...далее "километр" - определенную выше величину).
Нуу или тут недалеко скрипт рисующий параллелепипед вокруг деталек был (viewtopic.php?f=140&t=2067) - вот проекции его точек и определяй на 2д + последующий обход с созданием замкнутого контура (гугл -"обход контура метод жука" - вроде самый простой алгоритм)
Попроще будет работа с цветом: описание см тут:
viewtopic.php?f=140&t=3596
viewtopic.php?f=140&t=3304
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 21 мар 2016 11:46

Спасибо за ответ и ссылки!
Случайно, не знаете, с помощью САА это можно делать?

Насколько понимаю, выбор на поле чертежа (SelectElement2) по-прежнему ограничивается 2d-точкой и view???
(просто давно не приходилось за скрипты браться)
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Artem » 21 мар 2016 12:06

2d-точкой и view
почему это только точкой - селекшн дает возможность интерактивно место мыши определять(IndicateOrSelectElement2D кажись) - из вышеназванных алгоритмов мы получаем область/и и проверяем в текущее время мышь в ней/них или нет
по рейду - давно это было не подскажу - но думаю там попроще будет. Ждемс коллег с ответами
PS. Пальцем в небо (как минимум, есть ссылка на раздел с инфой): viewtopic.php?f=140&t=4041
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 21 мар 2016 12:18

Спасибо за ссылочку!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 21 мар 2016 21:04

CATIDftGenGeom - это для CAA.

Если же код захочется вызывать из скрипта, то придется еще решить вопрос получения "выбранной на чертеже детали", т.к. для скриптов каждая generateditem получается из Selection как вид целиком - DrawingView.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: API для ассоциации чертежа и детали в сборке

Сообщение Artem » 22 мар 2016 10:17

А если переименовать generateditem на что-то ассоциативное(рейд или Wapi + Search + overload properties +Alt_Enter) и ловить CATIA.StatusBar (скрипт)?
PS. Про вышеназванные мной алгоритмы забыл сказать - цвет лучше Т.к. при работе с GetProjectionPlane не отлавливается смещение после Broken view
PSS. А еще можно поработать с командой - overload properties 1)Запускаем команду(wapi) 2) Или прячем или убираем окно Characteristics в невидимую область 3)Грабим инфу с Characteristics через винапи (возможно придется применять timer - короче отдельный поток/приложение) 4) Profit...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 19 апр 2016 17:34

Коллеги, добрый день еще раз!

Wireless_Fidelity писал(а):CATIDftGenGeom - это для CAA.


Очень помогло! Спасибо! То, что надо!

Подскажите, пожалуйста:

1. Как а CAA выбрать линию на чертеже? Какой интерфейс или edu посмотреть? Выбор (selection) на CAA без окна может быть реализован?

2. Можно ли как-то сделать интегрированное решение:
    часть на Automation и из Automation вызвать функцию dll или нечто подобное? Только не exe, долго работает. Т.е. выполняется часть на Automation, затем передача управления модулю на САА (выбор линии на чертеже), который возвращает PartNumber выбранной сборки. Далее продолжает работать Automation (выбор точек, через них стрелка с полочкой для нанесения позиции.

    Или наоборот из dll'ки САА вызвать Automation, чтобы попроще писать.


Т.к. задача довольно обширная, на Automation делается быстро и просто. А на CAA долго разбираться. Но на Automation нельзя по линии на чертеже определить деталь...

Заранее спасибо!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 22 апр 2016 09:53

1. Как а CAA выбрать линию на чертеже? Какой интерфейс или edu посмотреть? Выбор (selection) на CAA без окна может быть реализован?

Интерактивный выбор осуществляется с помощью AquisitionAgent.

2. Можно ли как-то сделать интегрированное решение:
    часть на Automation и из Automation вызвать функцию dll или нечто подобное? Только не exe, долго работает. Т.е. выполняется часть на Automation, затем передача управления модулю на САА (выбор линии на чертеже), который возвращает PartNumber выбранной сборки. Далее продолжает работать Automation (выбор точек, через них стрелка с полочкой для нанесения позиции.

    Или наоборот из dll'ки САА вызвать Automation, чтобы попроще писать.


Такой подход представляется мне наиболее перспективным, особенно для решений, не связанных с интенсивным использованием API низкого уровня (например, топологического). Для расширения возможностей Automation следует разработать собственные компоненты, как указано в статье Creating Interfaces for Automation в энциклопедии.

Но на Automation нельзя по линии на чертеже определить деталь...

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

Код: Выделить всё
MsgBox TypeName(CATIA.ActiveDocument.Selection.Item(1).Value)


то будет выведено DrawingView, а не какой-нибудь Line2D. Поэтому, как мне видится, придётся решить несколько задач:
  • получение выделенного объекта геометрии в виде AnyObject (CAA)
  • получение у геометрии 3D-объекта (тела), из которого она была получена (CAA)
  • анализ тела, рисование выноски на чертеже (Automation)

Компонент CAA можно для простоты сделать один, назвав его, например, GenDraftingServices и реализовав соответствующие методы.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 22 апр 2016 12:19

Коллега, спасибо большое!!!

Теперь утвердились в правильности интегрированного подхода (хотя бы на первое время) и в возможности его реализации.

Первый пункт на САА выполнен! Уфф. Для выбранной 2D линии получаем PartNumber сборки.

Теперь осталось интегрировать все это с Automation. Функцию CAA сделать экспортной.
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 22 апр 2016 15:14

void писал(а):Теперь осталось интегрировать все это с Automation. Функцию CAA сделать экспортной.


Обязательно изучите статью и юзкейс, простым экспортом доступ не предоставить.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 23 апр 2016 17:49

Коллеги, добрый день еще раз!

Для примера пытаемся запустить интерфейс CAAAnalysisInterfaces.edu из vb.

1. CAAAnalysisInterfaces.edu скомпилирован. dll и tlb получены, скопированы в bin

2. Открыт новый vb проект. Reference на CAAAniTypeLib.tlb добавлена.

Как теперь обратиться к этому интерфейсу из vb правильно?

Есть пошаговая инструкция https://catiatutor.com/accessing-caa-v5 ... languages/
Но там в конце код на vb не рабочий, что вообщем-то очевидно. (Или я что-то не понимаю?)

Код: Выделить всё
Dim CATIATUTORObj As DrawingFactory

Set CATIATUTORObj =  GetObject(“”, “CATIA.Application”)

Call CATIATUTORObj.MyFunction();


В файле CAAIAniExport.idl проекта CAAAnalysisInterfaces.edu есть описание, как к интерфейсу обратить через САА


Код: Выделить всё
 CATIAAnalysisModel_var spModelVB (piModel);
 
   CATUnicodeString String ("CAAIAniExportVBExt");
   CATBSTR Bstr;
   String.ConvertToBSTR(&Bstr);
   CATBaseDispatch * piDispa = NULL;
   spModelVB -> GetItem(Bstr,piDispa);
   CAAIAniExport * piIdlObject =  NULL;
 
   if (piDispa)
   {
     piDispa -> QueryInterface(IID_CAAIAniExport,(void **)& piIdlObject);
     piDispa -> Release();
   }
   if (piIdlObject)
   {
     String = "MyFilePath";
     String.ConvertToBSTR(&Bstr);
     piIdlObject -> Export(NULL,Bstr);
    piIdlObject -> Release();
   }


Как тоже самое на vb сделать? Может быть, сие кто-то пробовал делать?

Получается нечто такое

Код: Выделить всё

    Sub CATMain()

        Dim ep As CAAAniTypeLib.AniExport
        Dim ipi As SAMITF.AnalysisCase
        Dim str As String

        'эта строка неверна, но как получить объект типа CAAAniTypeLib.AniExport не знаю
        'ep = GetObject(, “CATIA.Application”)

        ipi = Nothing
        str = ""

        Call ep.Export(ipi, str)

        MsgBox(str)

    End Sub


Заранее спасибо!!!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 23 апр 2016 19:27

Доступ к расширениям ведется через GetItem. Например, CATIA.GetItem("MyExtension").
Важно отметить, что для некоторых объектов (например, у Document) этот GetItem не работает.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 23 апр 2016 19:48

Насколько понимаю из примера, должно быть так
Код: Выделить всё
Dim ep As CAAAniTypeLib.AniExpor
 ep = CATIA.GetItem("CAAIAniExportVBExt")


Но они пишет

Необработанное исключение типа "System.NotImplementedException" в ConsoleApp.exe
Дополнительные сведения: Метод или операция не реализована.


Чего-то не хватает.. Сделано не так..
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 23 апр 2016 21:05

Не подскажите еще, как 2d точку на чертеже выбрать с помощью CAA, то, что здесь описано viewtopic.php?f=140&t=3304
Какие интерфейсы?

Заранее спасибо!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 23 апр 2016 21:22

CATIA запущена с нужным окружением, dll из юзкейса собраны и подгружаются?
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: API для ассоциации чертежа и детали в сборке

Сообщение void » 11 май 2016 03:09

Коллеги, прошу помощи!

Создаю текст на чертеже:
Код: Выделить всё
            CATIDftText *piDftText = NULL;
            double txtpos1[2] = {100, 100};

            if (SUCCEEDED(piDrwFact->CreateDftText(txtpos1,&piDftText)))
            {
              CATUnicodeString textString("Part Number");
              wchar_t *ptxtChar = new wchar_t[textString.GetLengthInChar() + 1];
              textString.ConvertToWChar(ptxtChar);
              piDftText->SetString(ptxtChar);
              delete [] ptxtChar;
              ptxtChar = NULL;

              CATIDftTextProperties *piDftTextProp = NULL;
              if (SUCCEEDED(piDftText->GetTextProperties(&piDftTextProp)))
              {
                piDftTextProp->SetFontSize(10);
                piDftTextProp->SetColor(125);
                piDftTextProp->Release(); piDftTextProp=NULL;
              }

              piDftText->SetTextWidth(40);
              piDftText->SetWrappingMode(DftWrappingOn);

              piDftText->Release();piDftText=NULL;
            }



Он появляется, но получается он таким - невидимым, пока не поменяешь ему свойства в интерфейсе
444.jpg
444.jpg (7.23 КБ) Просмотров: 14286


Подскажите, пожалуйста, чего не хватает? Весь код из примеров..
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: API для ассоциации чертежа и детали в сборке

Сообщение Wireless_Fidelity » 11 май 2016 16:08

void писал(а):Коллеги, прошу помощи!

Создаю текст на чертеже:
Код: Выделить всё
            CATIDftText *piDftText = NULL;
            double txtpos1[2] = {100, 100};

            if (SUCCEEDED(piDrwFact->CreateDftText(txtpos1,&piDftText)))
            {
              CATUnicodeString textString("Part Number");
              wchar_t *ptxtChar = new wchar_t[textString.GetLengthInChar() + 1];
              textString.ConvertToWChar(ptxtChar);
              piDftText->SetString(ptxtChar);
              delete [] ptxtChar;
              ptxtChar = NULL;

              CATIDftTextProperties *piDftTextProp = NULL;
              if (SUCCEEDED(piDftText->GetTextProperties(&piDftTextProp)))
              {
                piDftTextProp->SetFontSize(10);
                piDftTextProp->SetColor(125);
                piDftTextProp->Release(); piDftTextProp=NULL;
              }

              piDftText->SetTextWidth(40);
              piDftText->SetWrappingMode(DftWrappingOn);

              piDftText->Release();piDftText=NULL;
            }



Он появляется, но получается он таким - невидимым, пока не поменяешь ему свойства в интерфейсе
444.jpg


Подскажите, пожалуйста, чего не хватает? Весь код из примеров..


Оффтопик. Создавайте новую тему.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron