Звенья кинематической пары, как определить?

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

Звенья кинематической пары, как определить?

Сообщение luckylama » 18 ноя 2009 19:56

Пытаюсь при помощи VBA экспортировать структуру кинематической модели в текстовый файл. Как автоматически определить элементы, входящие в Joint?
Такой функции в VBA найти не удалось.

В состав Joint обычно входят Constraints. Этого было бы достаточно, но из Constraints получается вытянуть только ссылки на объекты в specification tree
GetConstraintElement(1).DisplayName

Есть другие идеи?
luckylama
Новичок
Новичок
 
Сообщения: 2
Зарегистрирован: 18 ноя 2009 17:42

Re: Звенья кинематической пары, как определить?

Сообщение booSter » 19 ноя 2009 16:55

В CAA/C++ есть интерфейс CATIKinJoint предоставляющий объект Join и в нём есть метод GetProductList, который и достаёт искомые звенья.
VB-аналога этого метода - нет.

Кстати констрэинтов у джойна может быть больше одного...

Возможно удастся добыть объект по референсу через Selection.Search / SelectedElement.Value
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Звенья кинематической пары, как определить?

Сообщение Artem » 30 ноя 2009 17:03

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

Dim productDocument1 As ProductDocument
Set productDocument1 = CATIA.ActiveDocument

Dim selection1 As Selection
Set selection1 = productDocument1.Selection

selection1.Search "Type=*,all"

Dim jj() 'As Joint
ReDim jj(0)
For i = 1 To selection1.Count
    If selection1.Item(i).Type = "Joint" Then
        ReDim Preserve jj(UBound(jj) + 1)
        Set jj(UBound(jj)) = selection1.Item(i).Value
    End If
Next

selection1.Clear
Dim cc() As Constraint
Dim Data As String
Dim InsN As String
Dim MyName As String
Dim MyFatherName As String

Dim MyProduct As Product
Dim MyPart As Part
Dim MyElemF As AnyObject
Dim MyElem As Reference

On Error Resume Next
For i = 1 To UBound(jj)
    selection1.Clear
    selection1.Add jj(i)
    selection1.Search "CATAsmSearch.MfConstraint,sel"
    ReDim cc(0)
    For j = 1 To selection1.Count
        ReDim Preserve cc(UBound(cc) + 1)
        Set cc(UBound(cc)) = selection1.Item(j).Value
    Next
    selection1.Clear
    For j = 1 To UBound(cc)
        For k = 1 To 3
            Err.Clear
            Set MyElem = cc(j).GetConstraintElement(k)
            If Err.Number <> 0 Then
                Err.Clear
                Exit For
            End If
            InsN = Left(Right(MyElem.DisplayName, Len(MyElem.DisplayName) - InStr(MyElem.DisplayName, "/")), _
            InStr(Right(MyElem.DisplayName, Len(MyElem.DisplayName) - InStr(MyElem.DisplayName, "/")), "/") - 1)
            Call selection1.Add(MyElem)
            MyFatherName = Left(Right(CATIA.StatusBar, Len(CATIA.StatusBar) - InStr(CATIA.StatusBar, "/")), _
            InStr(Right(CATIA.StatusBar, Len(CATIA.StatusBar) - InStr(CATIA.StatusBar, "/")), "/") - 1)
            MyName = Left(CATIA.StatusBar, InStr(CATIA.StatusBar, "/") - 1)
            Set MyProduct = productDocument1.Product.Products.Item(InsN)
            Set MyPart = MyProduct.ReferenceProduct.Parent.Part
            Set MyElemF = MyPart.FindObjectByName(MyFatherName)
            selection1.Clear
            MsgBox MyElem.DisplayName + "    " + MyElemF.Name + "   " + MyPart.Name + "    " + MyProduct.PartNumber
        Next
    Next
Next
End Sub

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

Re: Звенья кинематической пары, как определить?

Сообщение luckylama » 16 дек 2009 18:51

Спасибо, Артем. Беда в том, что не все джойнты имеют констрэйнты. Например U-Joint. Пришлось таки лезть в CAA.
luckylama
Новичок
Новичок
 
Сообщения: 2
Зарегистрирован: 18 ноя 2009 17:42

Re: Звенья кинематической пары, как определить?

Сообщение Artem » 17 дек 2009 13:54

Ну я с кинематикой не работал, так что по поводу констрейнов комментов не дам. Как минимум на примере из помощи (Ujoint_axis_with_kin.CATProduct - по нему собсно и смотрел макрос) думаю прошел бы такой вариант:
1)выделение джоинта см. макрос
2)вызываем меню - посылаем катькиному окну сообщение c:FrmActivate+Ынтер (а вот главному или дочернему окну статус бара точно не скажу)
3)ну дальше шукаем по дочерним окнам менюшки. Информация про спины хранится у нас в простых листбоксах (Instance и ID смотрю с помощью Au3InfoA). Думаю, в курсе, что с этим делать - для остальных - ключевые слова в поиске sendmessage + LB_GETTEXT.
Ну а если есть доступ к рейду то да...лучше не забивать себе голову работой с окошками.
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14


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

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

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

cron