もう、諦めちゃいたいな・・・。
こんな感じのスケッチにスプラインを描いて、パイプコマンドで
ボディを作ります。
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の場合はそのコマンドが
無いんですよね・・・。諦めちゃった方が楽なのに。