Как узнать геом.элемент, к которому привязана аннотация?

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

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Wireless_Fidelity » 05 июл 2012 14:56

Такой же, как и предложенный: поиск пикселей по цвету. В дереве спецификаций это сделать проще, т.к. можно предварительно выделить элемент рыжим через Selection. А в Associated Geometry ключевыми будут белые линии между элементами разных уровней.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Artem » 05 июл 2012 15:10

Спасибо.Жаль-надеялся на волшебную кнопку/сочетание активирующее дерево...не судьба
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение void » 23 июл 2012 15:09

Всем большое спасибо за ответы и участие!
Уточню. Две абсолютно одинаковые сборки и по структуре, и по содержанию (одна создана на основе другой в pdm, потому все аннотации на уровнях сборок утрачены, а в партах аннотации остались на месте). Надо аннотации на всех уровнях сборки, там, где были, воссоздать.

А за идею с обращением к окнам Artem, спасибо, в другие разы в более локальных задачах может пригодиться...

Сейчас по-прежнему не знаю, как задачу с САА решить

Надо:
- получить аннотацию ->
- грань, к которой она привязана ->
- элемент в дереве, которому принадлежит эта грань
- запомнить его и парт, к которому он принадлежит (записать в txt)
- определить и запомнить, какая именно это грань из множества других в этом элементе (чтобы именно к ней в дельнейшем прикрепить аннотацию)
(последний пункт самый сложный)



Решение видится в таком виде:
1. получаем аннотацию;
2. находим грани\ребра, к которым она прикреплена (примеры из энциклопедии)

CATITPS * piTPS = NULL; // Technological Product Specification (TPS)
HRESULT rc = ipiTole -> QueryInterface (IID_CATITPS, (void **)&piTPS ); // аннотация
I I
V
CATITTRSList * piTTRSList = NULL;
rc = piTPS -> GetTTRS (&piTTRSList); // список TTRS (Technologicaly and Topologicaly Related Surfaces)
I I
V
CATITTRS * piTTRS = NULL;
rc = piTTRSList -> Item (i, &piTTRS); // один TTRS
I I
V
CATLISTV(CATBaseUnknown_var) CompList;
HRESULT rc = piTTRS -> GetComponents (CompList); // список компонентов TTRS
I I
V
CATBaseUnknown_var spBaseComp;
spBaseComp = CompList; [i] // один компонент TTRS
I I
V
CATIRGE * piRGE = NULL;
rc = spBaseComp -> QueryInterface (IID_CATIRGE, (void**)& piRGE); // RGE (Reference Geometrical Elements).
I I
V
CATIRGETopology * piRGETopo = NULL;
HRESULT rc = ipiRGE -> QueryInterface (IID_CATIRGETopology, (void**)& piRGETopo);
I I
V
CATLISTP (CATCell) * pCellList = NULL;
rc = piRGETopo -> GetCells (&pCellList); //список топологических ячеек
I I
V
CATCell * pCell = (*pCellList)[i]; - ячейка
I I
V
CATFace * pFace = (CATFace*) pCell; - получили грань!

3.Далее надо найти, какому элементу дерева эта грань\ребро принадлежит.

Пока не могу разобраться, как это сделать...

Есть метод GetGeometry:

CATOrientation ori;
CATGeometry *piGeom = pFace->GetGeometry(&ori);

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

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Artem » 23 июл 2012 17:01

в vb
1) В имени грани -первое встречающиеся слева имя фичера
2)добавляй в selection + смотришь параллельно CATIA.StatusBar - тут тоже имя будет....
после получения имени MPart.FindObjectByName(Name)
Функции аналогичные комовским находятся в CATIAинтерфейсах
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение void » 24 июл 2012 15:39

Artem писал(а):в vb
1) В имени грани -первое встречающиеся слева имя фичера
2)добавляй в selection + смотришь параллельно CATIA.StatusBar - тут тоже имя будет....
после получения имени MPart.FindObjectByName(Name)


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

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Artem » 24 июл 2012 15:55

Но геометрия ограничена только самой гранью, а как же получить элемент в дереве?
каков вопрос таков ответ...
Имена одинаковые у граней? Если да то вот пример из соседней темы:
Set reference1 = part1.CreateReferenceFromName("REdge:(Edge:(Face:(Brp:(GSMBiDim.14;%6);None:();Cf11:());Face:(Brp:(GSMBiDim.14;%24);None:();Cf11:());None:(Limits1:();Limits2:());Cf11:());GSMBiDim.14;Z0;G3491)")

И уже основываясь на референсе строй...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение void » 24 июл 2012 16:18

Уважаемый Артём!
Наверное было не совсем точно написано, но фраза
Но геометрия ограничена только самой гранью, а как же получить элемент в дереве?

относилась исключительно к строке
CATGeometry *piGeom = pFace->GetGeometry(&ori);

Под геометрией имелся в виду указатель на объект CATGeometry *piGeom

Получаю грань pFace, из нее геометрию piGeom, но у нее нет имени... Насколько понимаю, это просто кусок геометрии? А дальше как элемент дерева получить?
Или это вообще неверный путь?..

Если делать на vb, насчет имени ссылки типа
"REdge:(Edge:(Face:(Brp:(GSMBiDim.14;%6);None:();Cf11:());Face:(Brp:(GSMBiDim.14;%24);None:();Cf11:());None:(Limits1:();Limits2:());Cf11:());GSMBiDim.14;Z0;G3491)"

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

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Artem » 24 июл 2012 17:31

1)Если в разные сборки вставлена одна и та же деталь БЕЗ пересоздания/пересохранения, то естественно имя одинаково...Если нет, то читай предыдущие посты про определение ближайшей поверхности...ну заодно и вот с этим ознакомся - http://www.plm-forum.ru/forum/viewtopic.php?f=140&t=2879
2)С рейдом работал давно, подсказать не смогу особо - у CATFace /CATIFace /CATIAFace - нет имени?
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение zerganalizer » 25 июл 2012 13:21

На face не работает, случайно, метод .Parent? Тогда он даст фичер в дереве, содержащий вашу грань.
Автоматизирую все, что логично.
Аватара пользователя
zerganalizer
Moderator
 
Сообщения: 901
Зарегистрирован: 20 май 2008 15:20

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение Artem » 25 июл 2012 15:23

извиняюсь но
2)добавляй в selection + смотришь параллельно CATIA.StatusBar - тут тоже имя будет....
т.к. возвращается имя последнего фичера....На замену можно прошшупать Selection.FindObject, ну и первый вариант вполне себе мной проверен и используется на всю катушку...
Parent так же, к сожалению, работает не корректно(аналогично - возвращает последний фичер в дереве, а не "родной")
Пусть можно записать, к какому элементу в дереве принадлежит, а как потом к этой самой грани привязать аннотацию в новой сборке?

1)создание GetTechnologicalObject("CATAnnotationSets") / AnnotationFactory.CreateText или
selection1.Add MySurface
CATIA.StartCommand ("Text with leader")

Сообщение Wireless_Fidelity » 05 июл 2012 12:16
Оказывается, всё у меня есть. Единственное, что пришлось поправить, это привязка к ребру. Раньше, когда писался код, CreateText почему-то выдавал ошибку.
Пример создания аннотации с выноской. Пользователь выбирает точку, в которой аннотация должна быть создана, а затем ребро, к которому привязана:

Sub CATMain()

Set myDocument = CATIA.ActiveDocument
Set myPart = CATIA.ActiveDocument.Part
Set mySel = CATIA.ActiveDocument.Selection
......
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как узнать геом.элемент, к которому привязана аннотация?

Сообщение void » 27 июл 2012 15:59

Всем еще раз спасибо за ответы! Продолжаю (тупо -))) копаться в САА Энциклопедии, ибо вообще ничего на САА делать не приходилось... (а тут сразу фейсы!..)

zerganalizer писал(а):На face не работает, случайно, метод .Parent? Тогда он даст фичер в дереве, содержащий вашу грань.

Метода Parent вообще нет, если я не ошибаюсь...


Напишу здесь, вдруг кому интересно...

Наконец-то попался пример, где разбирается работа с фейсами CAATopClashIntersect.m в CAATopologicalOperators.edu
Там есть bodyA и bodyВ. Надо получить их пересечение, проанализировать все его грани и определить для каждой грани, к которому боди А или В она относится.

Но решается задача "не мудрствуя лукаво", если я правильно понимаю...
Код: Выделить всё
Для боди А и В запоминают все грани в массивы
piBodyA->GetAllCells(listOfFacesA,2);
piBodyB->GetAllCells(listOfFacesB,2);

Получают пересечение
pBoolOpe =::CATCreateDynBoolean(piGeomFactory,&topdata, CATBoolIntersection, piBodyA, piBodyB);
CATBody * pBodyIntersect = pBoolOpe->GetResult();

Получают все грани этого пересечения
pBodyIntersect->GetAllCells(listOfFaces,2);

А затем перебором определяют, к какому боди каждая грань относится
CATCell * myptr = listOfFaces[k];
pJournal->FindFirsts(myptr, originObjects, ThroughAllCreateAndModify);

CATCell * pCell = (CATCell *) (originObjects[j]);
            if  ( [b]listOfFacesA.Locate(pCell)[/b] ) isInBodyA = 1;
            // or to BodyB ?
            else if ( [b]listOfFacesB.Locate(pCell)[/b] ) isInBodyB =1;
            else{
               cout << "Unknown faces - check how your part has been created" << endl;
               cout << "OR journal problem" << endl;
            }


В крайнем случае придется этим способом воспользоваться... Но перебор всех элементов в дереве огромной сборки не очень оптимален...

"Будем искать..."
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Пред.

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

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

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

cron