こちらでスクリプトとして公開しました。
Re: Polygons to circles - Autodesk Community
気軽に始めたのですが、想像以上に作る事になりました。
色々とあったので、覚書です。
・変換出来る可能性がある閉じた連続線(ポリゴンを)を見つけ出す
必要があるのですが、最初は全ての直線1本づつ
Sketch.findConnectedCurvesメソッドを使用し、Path.isClosedプロパティ
で閉じている事を確認しました。
Fusion 360 Help
Fusion 360 Help
この方法では、検索が遅い事が分かりました。
その為、スケッチのプロファイルのProfile.profileLoopsプロパティ
の1個目が外周のループとなると言う記述を見付けた為、
全プロファイルの1個目のループのみをチェックさせることで
検索量の削減が出来ました。
Fusion 360 Help
・ポリゴンが円に変換可能かどうかは、ポリゴンとなるLineの
1個目・1/3個目・2/3個目の始点を通過する3点通貨の円を基準として
処理させました。(雑です)
本来は、最小二乗法で仮想的な円を求めるべきなのですが、計算式が
分かりませんでした。(理解している時間が無い)
仮想の円を元に、全ての始点がトレランス以内に入っているか?
(あぁ今考えればパラメータからゴニョゴニョ求めてますが、
中心点と始点との距離だけで判断出来たな・・・)
中心線・始点・終点から理論的な弦の長さを求め、線の長さが
トレランス以内に入っているか?(文字だけじゃ伝わらない)
で判断させました。
改善の余地はありますが、処理時間増大の原因はここでは無いので
放置しておきます。
・テストしている最中に気が付いたことです。
userInterface.selectEntityメソッドで、ユーザーに処理するスケッチを
選択してもらうのですが、selectEntityはクリアしても選択が
解除されません。(未だにこれは改善されません)
Solved: Can't clear the activeSelections - Autodesk Community
スクリプト実行中に選択したままの状態では、処理が少し遅くなる
事に気が付きました。その為、リンク先の最後に記述している
テキストコマンドを使用した方法で強制的に選択を解除させました。
・変換可能なポリゴンはコンストラクション化さているのですが、
これが大幅に処理を遅くしている原因の1個でした。
for line in lines: line.isConstruction = True
こんな感じで、1本1本isConstruction プロパティを書き換えていたの
ですが、これが以上に遅いんです。
(Sketch.isComputeDeferred = True で計算を止めていても遅い)
まとめてコンストラクション化させられないか?探したのですが、
該当するメソッドが見当たらない為、こちらもテキストコマンドを
利用しています。ここで大幅に処理速度が短縮されました。
・円を描く部分も処理を遅くしているもう一つの原因なのですが、
代案が見つからず・・・。
わずかな効果ですが、3点通過円より中心と半径円の方が処理が
早かったためそちらを使用しました。
・Undo歴が多くなると処理が遅くなるようだと言う知識があった
のですが、この辺りがトランザクションと関連しています。
Undo歴を増やさない為のサンプルがこちらにあります。
FusionHackathonSamples/TransactionSample.py at master · brianekins/FusionHackathonSamples · GitHub
雑な説明ですが、中身が空のコマンドのダイアログを作成し実行し
関数を実行することで、Undo歴が1個のみになる と言う
仕組みの様です。
この方法を採用して実行した結果がこちらの添付画像です。
【宣伝】ポリゴンなスケッチラインを円に書き換えるスクリプト - Autodesk Community
・Undo歴は野放し -> 1040秒
・Undo歴がスッキリ -> 2265秒
"スッキリ" を手に入れる為に、これだけの処理時間差は受け入れがたい
と判断しました。
まだ、悩み・もがき苦しんだ内容が有った様な気もしたのですが、
大体こんな感じです。
最初に作成したものは、添付されていたDXFデータが処理出来ないの
では? と思うほど遅く、それ比べればかなり高速化したのですが、
まだまだ実用的な速度じゃないですね。
相当速度が改善する方法が見つからない限り、これの続きはしないと
思います。