C#ATIA

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

指定した平面から、穴の中心点を作成する1

自分は加工屋なので、データをCATIA→CAMソフトに頻繁にIgesでやり取り
しているのですが、"曲線およびサーフェスタイプ"を'Bスプライン'の設定で行っています。
f:id:kandennti:20150520110314p:plain

色々試した結果、この設定が一番取りこぼしが少なかったです。
デフォルト設定は'標準'で、取り込み側のソフトにもよりますが'標準'ではかなり
面抜け・面化けを経験しました。よく「CATIAのIgesは悪い」と見かけるのですが
原因はこの辺りかと。(V4の場合は、CADのトレランスが甘いからでしょう)

但し、'Bスプライン'設定での欠点もあります。
直線・円弧はスプラインとなり、平面・円筒面も曲面となってしまいます。
受け取り側のソフトにもよりますが、特に困るのは、円弧から中心点が作成
できなかったり、円筒面から軸を作成できなかったりする点です。
(CATIA V5はこの辺も無難に作成出来ちゃうので、助かります)

穴あけ加工のNCデータを作成する際には、(穴としての)3Dの面よりも中心点が
必要になる場合が多いと思います(違う?)。 以前は面倒ですが、同じデータを
'Bスプライン'と'標準'に切り替え2回エクスポート・インポートさせていました。
(ある金型メーカーさんでは、穴加工部分は3Dではモデリングしない と
聞いたことがあります)


この方法では、あまりに効率が悪いので
「指定した面の境界から円の中心点を作成するマクロ」を作成し、一緒に
'Bスプライン'設定でエクスポートすることにしています。

'vba
Dim oDoc 'As PartDocument
Dim oSel 'As Section
Dim oPart As Part
Dim oFac As HybridShapeFactory

Sub CatMain()
    Dim InputObjectType(0)

    InputObjectType(0) = "PlanarFace"
    Set oDoc = CATIA.ActiveDocument
    Set oSel = oDoc.selection
    Set oPart = oDoc.Part
    Set oFac = oPart.HybridShapeFactory
    
    With oSel
        Do
            .Clear
            Result = .SelectElement2(InputObjectType, "中心を作成する面を選択して下さい // [Esc]=キャンセル", False)
            If Result = "Cancel" Then Exit Do
            Set SelectRef = .item(1).Reference '①
            .Clear
            Call CreatePoint(SelectRef)
        Loop While Result = "Normal"
        .Clear
    End With
End Sub

'データム中心点作成
Private Sub CreatePoint(ByVal oRef As Reference)
    Dim oHBody As HybridBody
    Dim oExtract As HybridShapeExtract
    Dim colDel As New Collection
    
    Set oHBody = oPart.HybridBodies.add()
    Set oExtract = oFac.AddNewExtract(oRef)
    
    With oExtract
        .PropagationType = 3
        .ComplementaryExtract = False
        .IsFederated = False
    End With
    Call oPart.UpdateObject(oExtract)
    Call colDel.add(oExtract)
    
    Dim oBoundary As HybridShapeBoundary
    Dim oRef2 As Reference
    
    Set oRef2 = oPart.CreateReferenceFromObject(oExtract)
    Set oBoundary = oFac.AddNewBoundaryOfSurface(oRef2) '②
    Call oPart.UpdateObject(oBoundary)
    oHBody.AppendHybridShape oBoundary 'これは必要③
    Call colDel.add(oBoundary)
    
    Dim oPointCenter As HybridShapePointCenter
    With oSel
        .Clear
        .add oBoundary
        .Search "Topology.CGMEdge,sel" '④
        
        On Error Resume Next
        
        For i = 1 To .Count
            Set oRef3 = .item(i).Reference
            Set oPointCenter = oFac.AddNewPointCenter(oRef3)
            Call colDel.add(oPointCenter)
            If Err.Number = 0 Then
                Call oHBody.AppendHybridShape(oPointCenter)
                Call oPart.UpdateObject(oPointCenter)
                Set oRef4 = oPart.CreateReferenceFromObject(oPointCenter)
                Dim oPoint As HybridShapePointExplicit
                Set oPoint = oFac.AddNewPointDatum(oRef4)
                Call oHBody.AppendHybridShape(oPoint)
                Call oPart.UpdateObject(oPoint)
            End If
        Next
        
        Dim tmp
        For Each tmp In colDel
            Call oFac.DeleteObjectForDatum(tmp) '⑤
        Next
        
        On Error GoTo 0
    End With
End Sub

大まかな流れとしては、選択した面から境界を取得し分解。
分解した要素全てに中心点を作成し、成功したものだけを形状セットに入れ
データム化。最後に余計な境界線などを削除しています。
(相変わらず、やり方が強引ですね・・・)

①:通常は ".item(1).Value" でオブジェクトを渡すのですが、
  後々の処理を考えるとReferenceの方が好都合なので、そのようにしています。

②:選択面から境界線を作成しています。面から直接トポロジ-エッジを検索できない
  のでこのようにしています。(と言うことを、今確認しました)

③:通常、一時的な要素(今回は最終的に点が必要で、境界自体は不要)は
  HybridShapeFactoryで作成するだけで済ませているのですが、一度形状セット
  に入れないと正しく処理できなかったので一度入れています。

④:トポロジ-エッジの検索を行い、「境界を分解した状態」で選択を保った状態に
  しています。以前ここなさんが提示していた分解コマンドの方法です。

⑤:途中で作成した不要な要素を削除しています。


「マクロで作成した不要な要素を、全てを削除できているかどうか?」
を確認する方法は、CATDUAを利用するとわかります。
CATDUAのクリーン実行 → マクロ実行 → CATDUAのクリーン実行
で、2度目の実行後のレポートで何も処理されなければ、マクロ内で
全て処理できていると思います。