C#ATIA

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

1つのPartからBody毎にしたProductを作り出す

タイトルの日本語が怪しいのですが、要はこちらのコマンドで
Assy → Part にしたものを、再度Assy状態にしたい と言うことです。

CATProductからCATPartを作成 | CATIAの小技

このコマンドは古いリリースでは表側に無く、裏コマンドだったんですよね。
"データを軽くして客先に支給したい" "ノウハウの流出防止の為" 等
イロイロと理由はあるかと思いますが、少なくても干渉チェックは
Assy状態の方が楽ですね。


で、Part→Productにする為のマクロは、恐らく世間にもあると思います。
が、Freeであるものかどうかは不明です。
(僕は見つけられませんでした)

ボディだけですが、マクロを作ってみました。

'vba
'PartからProductテスト

Option Explicit

Sub CATMain()
    Dim ActDoc As PartDocument
    Set ActDoc = CATIA.ActiveDocument
    
    Dim ActPath As Variant
    ActPath = Array(ActDoc.FullName)
    
    Dim TopDoc As ProductDocument
    Set TopDoc = CATIA.Documents.Add("Product")
    
    Dim Prods As Products
    Set Prods = TopDoc.Product.Products
    
    Dim Sel As Selection
    Set Sel = TopDoc.Selection
    
    Dim BeforePDoc As PartDocument
    Set BeforePDoc = Include_Part(Prods, ActPath)
    
    Dim Pt As Part
    Set Pt = BeforePDoc.Part
    
    Dim LeafBodies As Collection
    Set LeafBodies = Get_LeafBodyLst(Pt.Bodies)
    
    Dim Bdy As Body
    Dim NewPDoc As PartDocument
    For Each Bdy In LeafBodies
        Set NewPDoc = Init_Part(Prods, Bdy.Name)
        With Sel
            .Clear
            .Add Bdy
            .Copy
            .Clear
            .Add NewPDoc.Part
            .PasteSpecial "CATPrtResultWithOutLink" '"CATPrtResult"
        End With
        NewPDoc.Part.Update
    Next
    
    With Sel
        .Clear
        .Add Prods.Item(1)
        .Delete
    End With
End Sub

'ルートで空ではないボディ取得
Private Function Get_LeafBodyLst(ByRef Bdys As Bodies) As Collection
    Set Get_LeafBodyLst = Nothing
    Dim Bdy As Body
    Dim Lst As Collection: Set Lst = New Collection
    For Each Bdy In Bdys
        If Bdy.InBooleanOperation = False And Bdy.Shapes.Count > 0 Then
            Lst.Add Bdy
        End If
    Next
    If Lst.Count < 1 Then Exit Function
    Set Get_LeafBodyLst = Lst
End Function

Private Function Init_Part(ByRef Prods As Variant, _
                           ByVal PtNum As String) As PartDocument
    Call Prods.AddNewComponent("Part", PtNum)
    Set Init_Part = Prods.Item(Prods.Count).ReferenceProduct.Parent
End Function

Private Function Include_Part(ByRef Prods As Variant, _
                              ByVal Path As Variant) As PartDocument
    Call Prods.AddComponentsFromFiles(Path, "All")
    Set Include_Part = Prods.Item(Prods.Count).ReferenceProduct.Parent
End Function

何てことはありません。ひたすらコピペしているだけなので。
例外処理等、細かな事はしていませんので、たったこれだけです。


実は、悩んでいるのはここからなんです。
このマクロでは、新たに作成したPartやProductは保存していません。
各Partは、元のBody名で保存するのがスジだろうと思うのですが、
困ったことに日本語が含まれている可能性が有り、CATIA V5では
日本語ファイル名はNGだからです。

そこでカタカナをローマ字に変換する手法や関数が無いのか?
調べては見たのですが・・・

・力技っぽいもの(ちょっと遅そう)
かなローマ字変換ユーザー関数 - ExcelとかVBAとかの練習帳

・カタカナをローマ字に変換は無いものの、流用出来そうな物
文字種変換〔StrConv〕(WSH)

・カタカナを探し出す方法
正規表現でカタカナを検索 | inside of tactsystem

ん~完全でなくても良いんですが、どれもこれも個人的には響かなかったです。
(半角カタカナが、更に扱いを悪くしているような・・・)
正攻法なら正規表現なのですが、分厚い本が出版できるほどの
奥深いものなので、僕には理解が出来ないです。

何か良い方法無いでしょうかね?