C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

クリックした面に法線を作成する

こちらでコメント頂いたのですが、時間がナカナカ確保できずに
サンプルを作れませんでした。

3Dの文字モデリングマクロ8 - C#ATIA

正直な所、完成した状態がイメージし切れていないため、クリックした
面のクリックした位置に法線を作成するマクロを作成してみました。

'vba sample_CreateLineNormal_ver0.01  using-'ver0.0.10'
'クリックした面に法線を作成

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute(Array("PartDocument", "ProductDocument")) Then Exit Sub

    'ユーザー選択
    Dim Elm As Variant 'SelectedElement
    Set Elm = KCL.SelectElement("面を選択", "Face")
    If KCL.IsNothing(Elm) Then Exit Sub
    
    'クリック座標取得
    Dim Pos(2) As Variant 'Double
    Call Elm.GetCoordinates(Pos)
    
    '各必要なもの取得
    Dim Pt As Part
    Set Pt = Elm.Document.Part
    
    Dim Fact As HybridShapeFactory
    Set Fact = Pt.HybridShapeFactory
    
    Dim DelList As Collection
    Set DelList = New Collection
    
    '選択面Ref
    Dim SurfRef As Reference
    Set SurfRef = Elm.Reference
    
    'クリック位置の点
    Dim PntRef As Reference
    Set PntRef = CreatePntRef(Pt, Fact, Pos)
    Call DelList.Add(PntRef)
    
    '法線
    Dim LinRef As Reference
    Set LinRef = CreateNormalRef(Pt, Fact, SurfRef, PntRef, 10#)
    Call DelList.Add(LinRef)
    
    'データム化
    Dim Dtm As HybridShapeLineExplicit
    Set Dtm = ToDatum(Pt, Fact, LinRef)
    
    '形状セット作成
    Dim HBdy As HybridBody
    Set HBdy = Pt.HybridBodies.Add()
    Call HBdy.AppendHybridShape(Dtm)
    
    'お掃除
    Dim Ref As Reference
    For Each Ref In DelList
        Call Fact.DeleteObjectForDatum(Ref)
    Next
    
    MsgBox "Done"
End Sub

'データム化
Private Function ToDatum( _
                    ByVal Pt As Part, _
                    ByVal Fact As HybridShapeFactory, _
                    ByVal Ref As Reference) As HybridShapeLineExplicit
    Dim Dtm As HybridShapeLineExplicit
    Set Dtm = Fact.AddNewLineDatum(Ref)
    Call Pt.UpdateObject(Dtm)
    
    Set ToDatum = Dtm
End Function

'点
Private Function CreatePntRef( _
                    ByVal Pt As Part, _
                    ByVal Fact As HybridShapeFactory, _
                    ByVal Ary As Variant) As Reference
    Dim Pnt As HybridShapePointCoord
    Set Pnt = Fact.AddNewPointCoord(Ary(0), Ary(1), Ary(2))
    Call Pt.UpdateObject(Pnt)
    
    Dim Ref As Reference
    Set Ref = Pt.CreateReferenceFromObject(Pnt)
    
    Set CreatePntRef = Ref
End Function

'法線
Private Function CreateNormalRef( _
                    ByVal Pt As Part, _
                    ByVal Fact As HybridShapeFactory, _
                    ByVal SurfRef As Reference, _
                    ByVal PntRef As Reference, _
                    ByVal Lng As Double) As Reference
    Dim Lin As HybridShapeLineNormal
    Set Lin = Fact.AddNewLineNormal(SurfRef, PntRef, 0#, Lng, False)
    Call Pt.UpdateObject(Lin)
    
    Dim Ref As Reference
    Set Ref = Pt.CreateReferenceFromObject(Lin)
    
    Set CreateNormalRef = Ref
End Function

ProductとPartで動くようにしたつもりですが、Productは未テストです。

念の為、法線は面の表方向に作成されます。
もし意図していない方向に作成される場合は、面の向き自体が逆になっている
はずです。

Fusion360やSpace-e等、比較的3DCADでは面の表裏を色を変えて表示したり
することで、視覚的にわかるようになっているものなのですが、CATIA V5は
ダメなんですよね・・・ 視覚的にわからないです。
OpenGLは表裏で2回描写するのだから、それ程難しくないと思うのですが)

接合等、複数の面をオフセットする際の "正" の方向は、接合された面の最初の
面の向きに依存しているように感じます。