読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

Viewに基準線を入れる1

すっかりペースダウンです。 VBAC#にするだけを考えれば
そこそこネタはあるのですが、業務が忙しくなりC#化している暇がないです。


自分の場合、客先で使用しているCADの関係もあり、2Dは他のCADを使用
しているのですが、3D→2D化自体はCATIAを使用しています。
その場合、DXF(又はDWG)経由で行うのですが、原点の位置がわからなく
なってしまいます。
手動でチマチマ描くのも面倒なため、マクロで一気に書いています。

'vba
Sub CATMain()
    'アクティブなシートの全てのビューの原点に十字をつける
    Dim Actdoc As DrawingDocument
    Dim ActSheet As DrawingSheet
    Dim Views As DrawingViews
    Dim StartView As DrawingView
    
    Set Actdoc = CATIA.ActiveDocument
    Set ActSheet = Actdoc.Sheets.ActiveSheet
    Set Views = ActSheet.Views
    Set StartView = Views.ActiveView
    
    
    Dim i As Long
    Dim Fac As Factory2D
    Dim View As DrawingView
    
    For i = 3 To Views.Count
        Set View = Views.item(i)
        If Not IsAbsLine(View) Then
            Call View.Activate
            Set Fac = View.Factory2D
            Call Create_Line(Fac, Actdoc, -20, 0, 20, 0)
            Call Create_Line(Fac, Actdoc, 0, -20, 0, 20)
        
            Set Fac = Nothing
            Set View = Nothing
        End If
    Next i
    Call StartView.Activate
End Sub

Private Sub Create_Line(ByRef Fac As Factory2D, _
                        ByVal Doc As Document, _
                        ByVal X1 As Double, _
                        ByVal Y1 As Double, _
                        ByVal X2 As Double, _
                        ByVal Y2 As Double)

    Dim L2D As Line2D
    Dim oSel As selection
    
    Set oSel = Doc.selection
    Set L2D = Fac.CreateLine(X1, Y1, X2, Y2)
    Call oSel.Clear
    oSel.add L2D
    With oSel.VisProperties
        .SetRealLineType 4, 0
        .SetRealWidth 1, 0
    End With
    L2D.name = "Abs_Line"'①
    Call oSel.Clear
End Sub

Private Function IsAbsLine(ByVal View As DrawingView) As Boolean'②
    IsAbsLine = False
    For Each L In View.GeometricElements
        If L.name = "Abs_Line" Then
            IsAbsLine = True
            Exit For
        End If
    Next
End Function

断面や矢視の向き、線の長さが40mm固定等、ウンヌンありますが、
とりあえず事が足りているのでこのまま使っています。
①:このマクロで作成したラインに"Abs_Line"と言う名称を付けています。
  理由としては、複数回マクロを実行した際に同じラインが何度も
  作成されてしまうの事を防ぐためです。
②:①で作成したラインがView内に存在しているか?をチェックしています。

かなり前に作ったマクロなため、色々とイマイチな部分がありますね・・・。