C#ATIA

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

メッシュの六角形分割に挑む6

こちらの続きです。
メッシュの六角形分割に挑む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をエクスポートして再インポートした
方が早いかも。


今までやった事の無い処理の連続になりそうなのですが、
この方法ならゴールに辿り着ける予感はしてます。
処理速度が問題になるかも知れませんが・・・。