C#ATIA

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

3D曲線のパイプの中心線を求める1

もう、諦めちゃいたいな・・・。
こんな感じのスケッチにスプラインを描いて、パイプコマンドで
ボディを作ります。

Fusion360の場合、直線の時と異なりスプラインを軸とする
パイプはエッジが出来る事に気が付きました。

このエッジを元に、何とか中心線を求められないものかと・・。


苦手なのですが、Nurbs曲線情報を出力するスクリプトを作成。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

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

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

        ent = sel.entity
        dumpNurbs3dInfo(ent.geometry)

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

def dumpNurbs3dInfo(
    crv):

    if hasattr(crv, 'asNurbsCurve'):
            crv = crv.asNurbsCurve

    _, controlPoints, degree, knots, isRational, weights, isPeriodic = crv.getData()

    dumpPoints3D(controlPoints, 'controlPoints')

    app: adsk.core.Application = adsk.core.Application.get()
    app.log(f'degree:{degree}')
    app.log(f'knots:\n{knots}')
    app.log(f'isRational:{isRational}')
    app.log(f'weights:\n{weights}')
    app.log(f'isPeriodic:{isPeriodic}')


def dumpPoints3D(pnts, name = ''):
    app: adsk.core.Application = adsk.core.Application.get()
    des: adsk.fusion.Design = app.activeProduct
    root: adsk.fusion.Component = des.rootComponent

    skt: adsk.fusion.Sketch = root.sketches.add(root.xYConstructionPlane)
    if len(name) > 0:
        skt.name = name
    
    skt.isComputeDeferred = True
    for p in pnts:
        skt.sketchPoints.add(p)
    skt.isComputeDeferred = False


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

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

コントロールポイントについては、座標値で出力してもわかりに
くいので、スケッチに点を描いてます。

元の中心線の実行結果はこちら。

 degree:5
 knots:
(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06666666666666667, 0.13333333333333333, 0.2, 0.26666666666666666, 0.3333333333333333, 0.39999999999999997, 0.4666666666666666, 0.5333333333333333, 0.6, 0.6666666666666666, 0.7333333333333333, 0.7999999999999999, 0.8666666666666666, 0.9333333333333332, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
 isRational:True
 weights:
(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
 isPeriodic:False

続いて、面の境界(スケッチに取り込んで実行してます)

 degree:3
 knots:
(0.0, 0.0, 0.0, 0.0, 0.12963656899183748, 0.12963656899183748, 0.12963656899183748, 0.18674111370028304, 0.18674111370028304, 0.18674111370028304, 0.2400990292304075, 0.2400990292304075, 0.2400990292304075, 0.28995613192260045, 0.28995613192260045, 0.28995613192260045, 0.3365421101071586, 0.3365421101071586, 0.3365421101071586, 0.40009732146446647, 0.40009732146446647, 0.40009732146446647, 0.4667771758360521, 0.4667771758360521, 0.4667771758360521, 0.5304253435010111, 0.5304253435010111, 0.5304253435010111, 0.5973743283426786, 0.5973743283426786, 0.5973743283426786, 0.6656168714573995, 0.6656168714573995, 0.6656168714573995, 0.7320118972499022, 0.7320118972499022, 0.7320118972499022, 0.793796400010551, 0.793796400010551, 0.793796400010551, 0.8616854163175507, 0.8616854163175507, 0.8616854163175507, 1.0, 1.0, 1.0, 1.0)
 isRational:False
 weights:
()
 isPeriodic:False

・・・degreeすら数値が違う。この方法じゃムリ。

CATIAの場合は、この手の中心線を求める事が手動(スイープ)で
可能だと知っているのですが、Fusion360の場合はそのコマンドが
無いんですよね・・・。諦めちゃった方が楽なのに。