C#ATIA

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

全てNURBS面のボディを作成する

通常、モデリングした際に出来上がる面は、平面であれば平面で
円筒面は円筒です。・・・謎な文章ですね。

円筒であれば中心軸を作成出来ます。
しかし中間ファイル(Step,Iges等)や他CADのネイティブファイルで
受け取ったデータの場合、円筒面に見えるのですが、軸を作成が
出来ない面が有ります。それは円筒面ではなくNURBS面です。

テストするデータが欲しいのですが、生憎Fusion360(CATIAも)で
普通にモデリングすると、円筒に見えるNURBS面、平面に見える
NURBS面、球体に見えるNURBS面・・・等を作成出来ません。

その為(テストデータを作る為)、スクリプトを作成しました。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.fusion as fusion

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface

        msg: str = 'Select'
        selFilter: str = 'Bodies'
        sel: core.Selection = selectEnt(msg, selFilter)
        if not sel:
            return

        body: fusion.BRepBody = sel.entity
        nurbs: fusion.BRepBody = body.convert(
            fusion.BRepConvertOptions.ProceduralToNURBSConversion
        )
        res: fusion.BRepBody = draw_bodies([nurbs])[0]
        
        [app.log(f.geometry.classType()) for f in res.faces]

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


def draw_bodies(
    bodyLst: list,
    targetOcc: fusion.Occurrence = None
) -> list:

    app: core.Application = core.Application.get()
    des: fusion.Design = app.activeProduct
    if not targetOcc:
        comp: fusion.Component = des.rootComponent
    else:
        comp: fusion.Component = targetOcc.component

    baseFeat: fusion.BaseFeature = None
    if des.designType == fusion.DesignTypes.ParametricDesignType:
        baseFeat = comp.features.baseFeatures.add()

    bodies: fusion.BRepBodies = comp.bRepBodies
    resBodies = []
    if baseFeat:
        baseFeat.startEdit()
        resBodies = [bodies.add(body, baseFeat) for body in bodyLst]
        baseFeat.finishEdit()

        return baseFeat.bodies
    else:
        return [bodies.add(body) for body in bodyLst]


def selectEnt(
    msg: str,
    filterStr: str
) -> core.Selection:

    try:
        app: core.Application = core.Application.get()
        ui: core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filterStr)
        return sel
    except:
        return None

スクリプト実行後、ボディを選択すると見た目が同じなボディが
作成しされます。

例えば、こんなボディでスクリプトを実行すると、
軸は作成出来ませんし、平らな面でスケッチも作成出来ません。