こちらの続きです。
レイヤーの扱いを考える4 - C#ATIA
以前、"Unofficial CATIA User Forum"にUPしたVBAの
レイヤー毎に形状セットで分割するマクロです。
Partファイルに入っている1番最初の形状セットの
GSD要素を分割するため、複数形状セットが有ったり
リンクしている要素がある場合は想定していません。
(IGESファイル等を開いたばかりの状態を想定しています)
'vba Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub CATMain() Dim T As Long T = timeGetTime Call LayerStart CATIA.RefreshDisplay = True MsgBox CDbl(timeGetTime - T) / 1000 & "秒" End Sub Sub LayerStart() 'レイヤ分けマクロ Dim ActDoc As partDocument Dim oFac As HybridShapeFactory Dim oSel 'As Section Dim oPart As Part Dim HBshapes As HybridShapes Dim HBbodies As HybridBodies Dim Hbody As HybridBody Dim oVisProperties As VisPropertySet Dim oRef As Reference Dim Layertype As Long Dim Layer As Long Dim colTemp As Collection Dim oSurf As AnyObject Dim i As Long Dim j As Long Dim LoopCount As Long Set ActDoc = CATIA.ActiveDocument Set oPart = ActDoc.Part Set HBbodies = oPart.HybridBodies Set HBshapes = HBbodies.item(1) Set oSel = ActDoc.selection Set oFac = oPart.HybridShapeFactory On Error Resume Next If CATIA.HSOSynchronized Then CATIA.HSOSynchronized = False'⑦ End If LoopCount = HBshapes.Count Do i = i + 1 Set oRef = HBshapes.item(i) With oSel 'サーフェスのレイヤチェック Call .Clear Call .add(oRef) Set oVisProperties = .VisProperties Call oVisProperties.GetLayer(Layertype, Layer)'① 'サーフェスのコピーと削除 Call .Clear .Search "CATGmoSearch.&Layer=" & CStr(Layer) & ",all"'② Set colTemp = New Collection For j = 1 To .Count'③ Call colTemp.add(.item(j).Value) Next .Copy .Clear Set Hbody = HBbodies.add()'④ Hbody.name = "Layer" & CStr(Layer)'④ Call .add(Hbody) .Paste .Clear For Each oSurf In colTemp Call oFac.DeleteObjectForDatum(oSurf)'⑤ Next Set colTemp = Nothing End With '再ループ i = i - 1 LoopCount = HBshapes.Count'⑥ 'End If Loop Until i >= LoopCount If Not CATIA.HSOSynchronized Then CATIA.HSOSynchronized = True'⑦ End If oPart.Update Set oRef = Nothing Set ActDoc = Nothing Set oSel = Nothing Set oPart = Nothing Set HBshapes = Nothing Set HBbodies = Nothing Set Hbody = Nothing Set oVisProperties = Nothing End Sub
今見ると、結構めちゃくちゃな事してます・・・。
①形状セット内の要素をループさせて、最初の要素のレイヤー
を取得します。
②Sectionで検索し、同一のレイヤーの物を選択状態にします。
③後に削除するために、選択されたものをコレクションとして
保持します。
現在マクロでは「形状セット変更」は見つかっておらず
代案として コピー → ペースト → 元を削除 を
行っているためです。
④移動先の形状セット作成とリネーム
⑤③で作成した元データのコレクションを削除
⑥⑤で元の形状セットの要素数が変わってしまっているため
再度Countを取得してます。(ここがヒドイ・・・)
⑦これは以前教わった関数ですが、比較的遅いとされている
Sectionのパフォーマンスが改善されるものです。
オートメーションマニュアルには細々記載されていますが、
要はTrueは通常の状態で、Falseで高速に処理します
と言うことですよね?
これと同様の機能をC#化したいと思います。