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

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

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

Сообщение void » 03 июл 2012 17:49

Здравствуйте!

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

Есть сборка с расставленными аннотациями на любых уровнях (парты/продукты). Есть вторая точно такая же сборка, но без аннотаций. Надо в ней аннотации расставить точно также, как в первой сборке. (Сначала записав, потом прочитав из текстового файла)

Сложность в том, что трудно определить, к какой именно грани/ребру/вершине элемента аннотация прикреплена (геометрию, которую можно увидеть в окне Associated Geоmetry -> Geometry Connection Managment, но нельзя определить ее имя). Насколько я понимаю, с помощью VBA это сделать невозможно.
Да, с помощью метода annotation.GetSurfaces(enumValues) можно получить строку типа

PartNumber/BodyName/elementName/Face

Но какой конкретно Face???

И с другой стороны, очень мало методов для создания аннотаций через VBA.

При помощи САА пока непонятно, как это можно сделать. Только-только начинаю с ним разбираться... Пока не понятна даже логика...

Теряюсь, каким путем идти:

1. Из опыта с VBA напрашивается привычная последовательность действий:
обход дерева сборки -> для каждой встреченной аннотации запомнить парт/продукт, к которому она прикреплена, запомнить значения, тип и пр, а также геометрический элемент... который определить невозможно. И далее, как действовать, непонятно...

Возможен ли такой подход при использовании САА??? Если да, то через какой интерфейс можно получить аннотации текущей сборки? Возможно ли это вообще? опять же как считать/определить геометрию, к которой аннотация привязана?

2. Или же надо идти в совершенно другом направлении, приведенном в примерах:
получить список всех AnnotationSets открытого документа -> для каждой аннотации запомнить тип, значение, и опять как узнать к чему она привязана? К какой геометрии? Как от геометрии (Face/Rib) перейти к элементу? И надо ли находить парт/продукт, к которому эта геометрия относится? И через какие интерфейсы это можно делать?

3. Или же это для САА вообще простая задача, которую я никак осилить не могу в силу отсутствия опыта работы с САА? )))

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

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

Сообщение Artem » 04 июл 2012 08:59

http://www.plm-forum.ru/forum/viewtopic.php?f=140&t=2758 - на первый взгляд далековато от твоей темы, но способы решения подойдут и к твоей задаче.....
http://www.plm-forum.ru/forum/viewtopic.php?f=140&t=3270 - а вот и аналогичная твоей тема...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение void » 04 июл 2012 11:15

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

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

Сообщение Artem » 04 июл 2012 11:49

Это не мне тогда надо было...учитывая что бонусов не намечалось - просто выяснил вопрос на будущее....Рекомендую рейд catispecobject +catispecattribute прошерстить рекурсивно ...если ничего не получишь, то прямая работа с дочерними окнами...
Последний раз редактировалось Artem 04 июл 2012 12:02, всего редактировалось 1 раз.
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение Artem » 04 июл 2012 11:52

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

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

Сообщение void » 04 июл 2012 12:17

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

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

Сообщение Artem » 04 июл 2012 12:35

в гугол postmessage sendmessage WM_GETTEXT GetWindowText
Ps.ну самый примитивный и абсолютно не универсальный способ - чтобы аннотации расставляли твоим макросом/командой, а ты параллельно с расстановкой скидывал бы куда-нибудь названия поверхностей/координаты и т.п. (учитывая наличие caa rade полагаю вряд ли этот способ понравится начальству/пользователям)
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение zerganalizer » 04 июл 2012 13:15

Уверен - даже если вы прочтете номер фейса у одной модели, номер фейса на другой модели может быть совсем другим. Приведу пример - сделайте экстракт с фейса, посмотрите номер фейса в фиче экстракта, запишите его. Удалите этот экстракт и сделайте новый с того же фейса, посмотрите номер, сравните с записанным и забудьте о вашей задаче, по крайней мере, про этот подход забудьте. Именование топологии в кате - муторная тема, я ее немало изучал, и кое-какие наработки сделал, но не уверен что и они помогут решить вашу задачу. Вся проблема будет в том, чтобы номера фейсов на одинаковых геометрических элементах совпадали. Но даже если они совпадают - фича извлечения фейса по номеру пока, вроде, есть только в моем коммерческом проекте, который вскоре, возможно, будет обсуждаться на форуме.

Brep-имя фейса выдает эта команда - annotation.GetSurfaces(enumValues) ?
Автоматизирую все, что логично.
Аватара пользователя
zerganalizer
Moderator
 
Сообщения: 901
Зарегистрирован: 20 май 2008 15:20

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

Сообщение void » 04 июл 2012 14:41

Artem писал(а):Ps.ну самый примитивный и абсолютно не универсальный способ - чтобы аннотации расставляли твоим макросом/командой


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

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

Сообщение Artem » 04 июл 2012 15:08

абсолютно не универсальный способ
- имелось ввиду что для НОВЫХ заводимых в пдм сработает, если бы получил обломм по двум указанным направлениям в предыдущих постах, как "куда деваться" вариант прокатил бы...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение void » 04 июл 2012 16:07

zerganalizer писал(а):Уверен - даже если вы прочтете номер фейса у одной модели, номер фейса на другой модели может быть совсем другим.


А Вы все описанное с помощью Аutomation изучали или CAA???
Да, многократно приходилось сталкиваться, что Automation с фейсами не работает. А вот САА?

Brep-имя фейса выдает эта команда - annotation.GetSurfaces(enumValues) ?


пример из помощи Automation

Код: Выделить всё
Dim enumValues () as Variant
ReDim enumValues (SurfCount - 1)
annotation.GetSurfaces(enumValues)
Dim Name As String

For i = LBound(enumValues) to UBound(enumValues)
    Name = enumValues(i)
    msgBox Name
Next


Name - строка "PartNumber/BodyName/elementName/Face" - просто Face в конце написано...
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение void » 04 июл 2012 16:36

Artem писал(а):как "куда деваться" вариант прокатил бы...


Спасибо за участие! Мне любой совет сейчас важен! Буду через интерфейсы искать путь решения.
Тут масштабы уже готового огромные, а про аннотации задача - не ключевая, но выполнить ее надо...
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

Сообщение zerganalizer » 05 июл 2012 00:20

Насколько мне известно, к фейсу нельзя обратиться без его Brep-имени. Если аннотация привязана при ее вставке именно к фейсу, то, боюсь, вы не сможете узнать вашей командой - на какой именно фейс прикреплена ваша аннотация.
Автоматизирую все, что логично.
Аватара пользователя
zerganalizer
Moderator
 
Сообщения: 901
Зарегистрирован: 20 май 2008 15:20

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

Сообщение Wireless_Fidelity » 05 июл 2012 08:35

Здравствуйте.

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

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

Сообщение void » 05 июл 2012 08:45

Wireless_Fidelity писал(а):Здравствуйте.

Получение аннотируемой геометрии и пляски с BREP-ом это, конечно, очень интересно, но я бы начал с ответа на второй принципиальный вопрос: а как создать аннотацию, привязанную к ребру? Насколько я помню, никак.


Вообще никак или никак с помощью Automation???
Тут много отвечают, но мне не всегда понятно, в ответе идет речь про Automation или CAA?

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

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

Сообщение Wireless_Fidelity » 05 июл 2012 09:25

На CAA можно решить (почти) любую задачу. С вопросом по интерфейсам в первую очередь следует обратиться к Encyclopedia, а во вторую в группу по CAA RADE на LinkedIn.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение Artem » 05 июл 2012 09:57

Отчегож уж так прям и нельзя то......гугл в помощь - 1)создание GetTechnologicalObject("CATAnnotationSets") / AnnotationFactory.CreateText
или
Код: Выделить всё
selection1.Add MySurface
CATIA.StartCommand ("Text with leader")

2)чтение данных о поверхности : query link panel прям так и напрашивается чтоб окошко на winapi(sendmes./postmes.) прошли и параллельно данные о выделенном объекте читать из selection
3)Выставление/получение координат текста внутри TPSView -
Код: Выделить всё
Dim r As Text
Set r = s.Item(1).Value
Dim ox As Double: Dim oy As Double
MsgBox r.Get2dAnnot.X
r.Get2dAnnot.Leaders.Item(1).GetPoint 1, ox, oy
MsgBox ox

4)Создание TPSView - гуглим TPSViewFactory.CreateView
5)ну и самое сложное - чтение данных о плоскости существующего TPSView ссылочка уже была : viewtopic.php?f=140&t=1364 в этом пункте без рейда походу никак
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение Wireless_Fidelity » 05 июл 2012 10:04

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

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

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

GetTechnologicalObject("CATAnnotationSets") / AnnotationFactory.CreateText не идет? просто в инете полно не полно, но два три примера с этими командами есть...
Ну и еще...это что такое за безобразие - пдм вмешивается в нутро парта/продукта без нашего участия....так по хорошему не должно быть , а если с нашим ( скажем, запускается некий макрос/команда, которые в качестве дополнительного функционала "нечаянно" убивают 3Dтектовку), то надо править данный макрос или разговаривать с разработчиками для изменения команды....
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение Wireless_Fidelity » 05 июл 2012 11:16

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

Код: Выделить всё
Sub CATMain()

Set myDocument = CATIA.ActiveDocument
Set myPart = CATIA.ActiveDocument.Part
Set mySel = CATIA.ActiveDocument.Selection

'-----------------------------------
' LAUNCH INTERACTIVE POINT SELECTION
'-----------------------------------
' get ZY plane feature (where annotation will be located)
Dim refPlaneYZ As Reference
Set refPlaneYZ = myPart.OriginElements.PlaneYZ

Dim plnPlaneYZ As Plane
Set plnPlaneYZ = myPart.FindObjectByName(refPlaneYZ.DisplayName)

' start selection on a plane
Dim ArrSelFilter(0)
ArrSelFilter(0) = "ZeroDim"

Dim ArrLocation2D(1)
Dim ArrLocation3D(2)

Dim bObjectSelected As Boolean

Dim sResult ' As String
sResult = mySel.IndicateOrSelectElement3D(refPlaneYZ, _
                                        "Click to select annotation position", _
                                        ArrSelFilter, _
                                        False, _
                                        True, _
                                        False, _
                                        bObjectSelected, _
                                        ArrLocation2D, _
                                        ArrLocation3D)

If (sResult <> "Normal") Then
    MsgBox "Annotation position has not been specified"
    Exit Sub
End If

'--------------------
' ANNOTATION CREATION
'--------------------
Set UserSurfs = myPart.UserSurfaces

Set MyAnnotationSets = myPart.AnnotationSets
Set MyAnnotationSet = MyAnnotationSets.Add("ISO")
Set MyAnnotationFactory = MyAnnotationSet.AnnotationFactory
Set MyAnnotations = MyAnnotationSet.Annotations

Dim refPlaneZX As Reference
Set refPlaneZX = myPart.OriginElements.PlaneZX

' ask user to select an edge
Dim aSelFilter(0)
aSelFilter(0) = "Edge"
sResult = mySel.SelectElement2(aSelFilter, "Select edge", False)
If (sResult <> "Normal") Then
    MsgBox "Edge has not been selected"
    Exit Sub
End If

'Set SurfaceReference = myPart.CreateReferenceFromObject(refPlaneZX)
Set MyUserSurfaces = myPart.UserSurfaces
Set MyUserSurface = MyUserSurfaces.Generate(CATIA.ActiveDocument.Selection.Item(1).Value)

Dim anPartInfo As Annotation
Set anPartInfo = MyAnnotationFactory.CreateText(MyUserSurface)

Dim txtPartInfo As Text
Set txtPartInfo = anPartInfo.Text()

Dim drwtxtPartInfo As DrawingText
Set drwtxtPartInfo = txtPartInfo.Get2dAnnot()

'-------------------------------------
' SETTING ANNOTATION POSITION AND TEXT
'-------------------------------------
anPartInfo.SetXY ArrLocation2D(0), ArrLocation2D(1)

' add a leader
Call anPartInfo.AddLeader

' set new text
drwtxtPartInfo.Text = _
"MachineType" & _
Chr(10) & Chr(13) & _
"Envelope Size: " & "Stock Volume: " & _
Chr(10) & Chr(13) & _
"Part Volume: " & "Part Weight: " & _
Chr(10) & Chr(13) & _
"Material: " & _
Chr(10) & Chr(13) & _
"User" & "date" & _
Chr(10) & Chr(13) & _
"FileName"



' update annotation set
myPart.UpdateObject MyAnnotationSet

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

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

Сообщение void » 05 июл 2012 11:43

Artem писал(а):2)чтение данных о поверхности : query link panel прям так и напрашивается чтоб окошко на winapi(sendmes./postmes.) прошли и параллельно данные о выделенном объекте читать из selection


Спасибо за ответ!
А со вторым пунктом можно по-подробнее? Ранее не приходилось способ через обращения к окнам использовать...

Есть катийный пример Annotations_Part_04.CATPart , там появляется query link panel, а в тех CATPart'ах, с которыми приходится работать, там такого пункта меню не появляется (видимо аннотации другим способом создаются)... Есть только AssosiatedGeometry -> GeometryConnectionManagment ...

А с этих окном тоже через winApi работать? И как? Двигать курсор мыши?
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

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

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

query link panel напрашивается т.к. работает со стрелочками на клавиатуре сразу , а вот Geometry Connection Managment большой и жирный проблема и несьедобен, т.к. для работы стрелочек требуется один раз кликнуть не на элементе причем, а на дереве...не ну в прииинципе мооожно 1)получить координаты и размеры окна с деревом.2)потом в нем попиксельно поискать белый цвет надписи 3)потом послать левую кнопку мыши в эту точку окна. Учитывая что с этим не работали будет тяжеловато...но не все потеряно - в инете практически все все есть(правда не всегда на том языке который нужен)...желаю успехов.....
Еще один засекреченный способ русских десантников,возможно даже тибетских монахов....Есть такая программа артмани, если играли, то в курсе о чем я....возможно стоить порыть в направлении чтения памяти процесса, а потом по окружению(неким константным байтам/законам + смещение) выцеплять нужную строчку....
Ps. catispecobject +catispecattribute ничего не нашли? По всей сборке бы прошлись чего-нибудь и нарыли бы...может быть...
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

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

Сообщение zerganalizer » 05 июл 2012 12:37

Я не понял главного - как вы возьмете номер фейса из одного парта, на которой (и только на ней) висит аннотация и в ДРУГОМ парте угадаете, что там фейс с тем же номером есть и расположен он там же, где и в первом парте? Мне на ум приходит только описанный в моей ветке об извлечении ребер поиск ближайшей грани к точке (какой?).
Автоматизирую все, что логично.
Аватара пользователя
zerganalizer
Moderator
 
Сообщения: 901
Зарегистрирован: 20 май 2008 15:20

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

Сообщение Wireless_Fidelity » 05 июл 2012 13:25

Моё мнение, чтение из памяти это сразу пипец, ибо подходит исключительно для хака, а не для создания пользовательского приложения.

С выделением объекта в дереве на WinAPI у меня есть решение на VBA, причём работает оно для стандартного дерева модели (которое specifications tree). Работает стабильно, но не думаю, что это лучшее решение.
Если сборки реально одинаковые (копии/клоны), то номер ребра будет тем же. Если же нет, то, как было предложено выше, сопоставить рёбра через наборы характеризующих их точек (две крайние и серединка) не должно быть сложно. Работать будет долго, но надёжно.

Альтернативно получению информации об аннотациях через WinAPI можно предложить экспортировать документ в какой-нибудь формат, поддерживающий аннотации (step, должен подойти), затем пробежаться по получившемуся файлу и определить координаты выносок. После чего можно будет воспользоваться методом по поиску ближайших рёбер.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

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

Сообщение Artem » 05 июл 2012 13:34

С выделением объекта в дереве на WinAPI у меня есть решение на VBA
-а какой принцип если не секрет? интересен прежде всего первый клик по дереву после чего заработают стрелки....
Альтернативно получению информации об аннотациях через WinAPI можно предложить экспортировать документ в какой-нибудь формат, поддерживающий аннотации (step, должен подойти), затем пробежаться по получившемуся файлу и определить координаты выносок. После чего можно будет воспользоваться методом по поиску ближайших рёбер.
-неплохой, главное вполне выполнимый вариант, единственно что вроде аннотации в степе поддерживаются вроде бы с 21 версии только....ну и еще аннотацию же можно прицепить и к сурфейсу(можно проанализировать центр тяжести...ну и еще пару тройку точек на поверхности поставить) и даже телу вроде....
Последний раз редактировалось Artem 05 июл 2012 15:00, всего редактировалось 3 раз(а).
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

След.

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

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

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