C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

データム化された要素の入っている形状セットの取得

”マクロがPCによって動くものと動かないものがある”と相談を頂きました。
状況が良くわからないので、完全な答えには辿り着けない可能性も有りますが。。。

点を選択後、点の含まれている形状セットの取得部分が問題のようです。

まず、こんなデータを用意しました。
f:id:kandennti:20180704124318j:plain
点1は通常の状態で、点2はデータム化されています。

続いてこんなマクロを作りました。

'catvba
Sub CATMain()
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim sel As Variant ' Selection
    Set sel = doc.Selection
    
    '選択
    Dim msg As String
    msg = "点を選択"
    
    Dim filter As Variant
    filter = Array("Point")
    
    sel.Clear
    Select Case sel.SelectElement2(filter, msg, False)
        Case "Cancel", "Undo", "Redo"
            Exit Sub
    End Select
    
    '選択要素の取得
    Dim point As AnyObject
    Set point = sel.Item(1).value
    
    '結果
    Debug.Print "********"
    Debug.Print "point typename : ", TypeName(point)
    Debug.Print "point.Parent typename : ", TypeName(point.Parent)
    Debug.Print "point.Parent.Parent typename : ", TypeName(point.Parent.Parent)
    Debug.Print "point.Thickness.Parent.Parent typename : ", TypeName(point.Thickness.Parent.Parent)
End Sub

点を選択し、Parentのオブジェクトタイプをイミディエイトウィンドウに表示します。
もう答えは書いているのですが・・・。

GSD要素がデータム化されている場合とされていない場合では、画面上や手動操作では
大きな違いを感じませんが、マクロではかなりの違いが有ります。

このマクロで点1を選択した際の結果はこちら

********
point typename :            HybridShapePointOnPlane
point.Parent typename :     HybridShapes
point.Parent.Parent typename :            HybridBody
point.Thickness.Parent.Parent typename :  HybridBody

質問者さんのコードでは、"point.Parent.Parent" となっており、HybridBodyが
取得できています。

続いて点2を選択した際の結果はこちら

********
point typename :            HybridShapePointExplicit
point.Parent typename :     Parameters
point.Parent.Parent typename :            Part
point.Thickness.Parent.Parent typename :  HybridBody

"point.Parent.Parent" は、HybridBodyではなくPartになります。
そもそも point.Parent が、点1では HybridShapes なのに対し
点2では Parameters になります。

データム化されている・されていないを判断し処理を分けるのも
良いかもしれませんが、共通のプロパティ Thickness を利用すると
処理を分ける必要も無さそうです。

    Dim HybrBody As HybridBody
    Set HybrBody = point.Thickness.Parent.Parent


Thicknessプロパティ は HybridShapeオブジェクトで実装されています。
以前から思うのですが、何故GSD要素に "厚み" が必要なのかな?
(ライセンス無いのでわからないのですが ボリューム?)