タイトルがあやふやなのですが、要はこちらの内容に関連してます。
Quantum effect - getParameterAtLength() - Autodesk Community
黒い線が3D的な1本の曲線として、赤矢印が始点で青矢印が終点とします。
曲線上に点を描いて、その位置は3Dな座標値として知ることは出来ますが、
点と曲線との相対的な位置関係はパラメータ(1つの実数)で表現できます。
Fusion360で作成したNURBS曲線は始点が0.0で終点は1.0になるようです。
・・・CATIAと違う。
質問者さんの内容を簡単に書くと、終点より先(緑ライン)の紫の座標を取得したいけど
終点より先はパラメータ0.0(始点のパラメータ)を返してくる。おかしくないかな?
との事の様です。
確かにそうでした。
サーフェスにも類似したオブジェクトが有り、そちらでは範囲外のパラメータを
使用しても正しい結果が返ってくることを知っていました。
この辺で試しています。
https://kantoku.hatenablog.com/entry/2019/11/11/160818
サーフェスの場合、範囲外のパラメータを使用しても正しい結果が得られますよ
と言う意味でサンプルを作ったのですが、結果的にバグですとのレスが付きました。
と、ここまでが前置きで、行き場の無くなったサンプルをここに残しておきます。
import adsk.core, adsk.fusion, traceback
_app = adsk.core.Application.cast(None)
_ui = adsk.core.UserInterface.cast(None)
def run(context):
try:
global _app, _ui
_app = adsk.core.Application.get()
_ui = _app.userInterface
des :adsk.fusion.Design = _app.activeProduct
root :adsk.fusion.Component = des.rootComponent
msg :str = 'Select'
selFiltter :str = 'Faces'
sel :adsk.core.Selection = selectEnt(msg ,selFiltter)
if not sel: return
surf :adsk.fusion.BRepFace = sel.entity
surfEva :adsk.core.SurfaceEvaluator = surf.evaluator
surfBound :adsk.core.BoundingBox2D = surfEva.parametricRange()
surfPnts = PointAtParameterTest(surfEva, surfBound)
dumpSkt(root, surfPnts, 'surfEva')
geo :adsk.core.Surface = surf.geometry
geoEva :adsk.core.SurfaceEvaluator = geo.evaluator
geoBound :adsk.core.BoundingBox2D = geoEva.parametricRange()
geoPnts = PointAtParameterTest(geoEva, surfBound)
dumpSkt(root, geoPnts, 'geoEva')
except:
if _ui:
_ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def PointAtParameterTest(
eva :adsk.core.SurfaceEvaluator,
bound :adsk.core.BoundingBox2D
) -> list:
try:
maxPrm :adsk.core.Point2D = bound.maxPoint
minPrm :adsk.core.Point2D = bound.minPoint
newPrm :adsk.core.Point2D = maxPrm.copy()
newPrm.x += 1.0
newPrm.y += 1.0
_, maxPnt = eva.getPointAtParameter(newPrm)
newPrm = minPrm.copy()
newPrm.x -= 1.0
newPrm.y -= 1.0
_, minPnt = eva.getPointAtParameter(newPrm)
return [maxPnt, minPnt]
except:
return []
def dumpSkt(
comp :adsk.fusion.Component,
pnts :list,
name :str):
skt :adsk.fusion.Sketch = comp.sketches.add(comp.xYConstructionPlane)
skt.name = name
[skt.sketchPoints.add(p) for p in pnts]
def selectEnt(
msg :str,
filtterStr :str) -> adsk.core.Selection :
try:
sel = _ui.selectEntity(msg, filtterStr)
return sel
except:
return None
スクリプト実行後、面を指定すると面の外(最大・最小値の外)に2個点を作成します。
面上ならともかく、面の外側と言うところが全く役立たないです。
手元に残しておくと、間違いなくコードを無くすので覚書です。