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

C#ATIA

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

今更、3DDXFのインポートに挑む3

こちらの続きです。
今更、3DDXFのインポートに挑む2 - C#ATIA

桁違いのボリュームになってしまいましたが、最初に書いた
高速化出来そうな2点についてです。

"ファイルの読み込み方が1文字づつ"

これは、単純に全部一度に読み込んでしまっているだけです。
その後 "3DFACE" で1枚分の情報にSplitし、さらに改行で
Splitして、座標データを取得してみました。

"点、線、面を全ての面でインスタンスを作っている"

emilyさんのコードを見ると
・点1~3(4)を作成(形状セットに未挿入)
 ↓
・直線1~3(4)を作成(形状セットに未挿入)
 ↓
・フィルを作成(形状セットに未挿入)
 ↓
・フィルデータム化(これだけを形状セットに挿入)
この処理を1枚毎に行っています。四角ポリゴンの場合
10個インスタンスを生成しています。
CATIAのマクロの場合、インスタンスの生成数を減らして
やると処理時間が短くなる傾向があります。

自分が行った方法はこんな感じです。
・ベースとなる点4個、折れ線2本、フィル2個を生成
CatGeometryContainerクラスのSetState関数で行っています。
これらはemilyさん同様、形状セットに未挿入のままです。

1枚毎の処理としては
・点1~3(4)の座標値変更・更新
 ↓
・折れ線更新
 ↓
・フィル更新
 ↓
・フィルデータム化(これだけを形状セットに挿入)
この場合、最大更新回数は6回ですが、インスタンスの生成は
1回だけです。 これらの処理はCatGeometryContainerクラスの
GetFace関数で行っています。

このような処理方法を思いついたのは、ここなさんが作成した
こちらのマクロです。
スピードテスト1 - C#ATIA

こちらのフォントのアウトラインを作成するサンプルも、同様の手法で
行っています。
GraphicsPathの処理の方向に悩む3 - C#ATIA




このマクロは処理時間の途中経過も、イミディエイトウィンドウに出力する
ようにしてみました。
S800の "Body" をインポートした際は、こんな感じでした。

Get3DFACE:0.608
GetSuccessFace:44.663
AddFace:52.077

内容はこんな感じです。
・DXFを読み取り、座標値取得 → 0.6秒
・面の作成 → 44秒
・形状セットへ挿入 → 8秒
座標値取得の方法を努力しても効果が薄いです。
形状セットへの挿入もわりと処理時間がかかるのですが、
他の方法が無いと思います。
8割ほどかかる面の作成を改善するのが、効果が大きいの
ですが、現状上記の方法より速い処理方法は知りません。

アプローチを変えると無いことも無いと思いますが。