こちらの続きです。
メッシュの六角形分割に挑む5 - C#ATIA
質問者さんから、閉じたMeshBodyが欲しい との事。
ボディの分割でのテストコードを作り処理自体は可能なのですが、
失敗した時の対応が難しく、結果的に断念しました。
”あぁ、もう無理” と思っていたのですが、別の方法を思いつきました。
単純に目的のMeshBodyと六角柱でブーリアンの積を行えば
色々と面倒な事が省ける上、ブーリアンに失敗した時もエラー
メッセージが出ない(空のMeshBodyが出来上がる)事を
GUIで確認出来たので、こっち方向に切り替える事にしました。
先を見越すと、大量のブーリアン処理を行う予感がするので、
別の作業用のドキュメントを新作し、そこで処理させるかも
知れない為、MeshBodyを他のドキュメントにコピペする
だけのテストコードを作りました。
# Fusion360API Python script import traceback import adsk.fusion import adsk.core def cloneMeshBody( mesh: adsk.fusion.MeshBody, doc: adsk.fusion.FusionDocument = None) -> adsk.fusion.MeshBody: app: adsk.core.Application = adsk.core.Application.get() ui = app.userInterface sels: adsk.core.Selections = ui.activeSelections sels.clear() sels.add(mesh) app.executeTextCommand(f'Commands.Start CopyCommand') if not doc: doc = mesh.parentComponent.parentDesign.parentDocument if doc.design.designType != adsk.fusion.DesignTypes.DirectDesignType: doc.design.designType = adsk.fusion.DesignTypes.DirectDesignType doc.activate() app.executeTextCommand(f'Commands.Start PasteCommand') app.executeTextCommand(u'NuCommands.CommitCmd') des: adsk.fusion.Design = app.activeProduct root: adsk.fusion.Component = des.rootComponent return root.meshBodies[0] def run(context): ui = adsk.core.UserInterface.cast(None) try: app: adsk.core.Application = adsk.core.Application.get() ui = app.userInterface root: adsk.fusion.Component = app.activeProduct.rootComponent mesh: adsk.fusion.MeshBody = root.meshBodies[0] newDoc: adsk.fusion.FusionDocument = app.documents.add( adsk.core.DocumentTypes.FusionDesignDocumentType ) des: adsk.fusion.Design = newDoc.design des.designType = adsk.fusion.DesignTypes.DirectDesignType cloneMeshBody(mesh, newDoc) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
コピペするだけなので、画像も要らないでしょう。
ひょっとしたら、コピペよりSTLをエクスポートして再インポートした
方が早いかも。
今までやった事の無い処理の連続になりそうなのですが、
この方法ならゴールに辿り着ける予感はしてます。
処理速度が問題になるかも知れませんが・・・。