こちらの続きです。
複数面に線を描きたい3 - C#ATIA
気が重い。2枚のサーフェス上に1本の線を描くことは恐らく
出来ないと思われるため、各点から相手の点に向かってお互いに
UV的な直線を作ってみます。
手がかりを掴みたく、こちらを作りました。
#Fusion360API Python script 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 # get body body :adsk.fusion.BRepBody = root.bRepBodies.item(0) # get face face :adsk.fusion.BRepFace = body.faces.item(0) # get point pnt1 :adsk.fusion.ConstructionPoint = root.constructionPoints.item(0) pnt2 :adsk.fusion.ConstructionPoint = root.constructionPoints.item(1) # BRepFace.evaluator faceEva :adsk.core.SurfaceEvaluator = face.evaluator # get parameter prm1 = adsk.core.Point2D.cast(None) prm2 = adsk.core.Point2D.cast(None) _, prm1 = faceEva.getParameterAtPoint(pnt1.geometry) _, prm2 = faceEva.getParameterAtPoint(pnt2.geometry) print('prm1:{}'.format(faceEva.isParameterOnFace(prm1))) print('prm2:{}'.format(faceEva.isParameterOnFace(prm2))) # init line2D lin2D = adsk.core.Line2D.create(prm1, prm2) # get BRepFace.geometry.evaluator geoEva :adsk.core.SurfaceEvaluator = face.geometry.evaluator # init curve3D list crvs = geoEva.getModelCurveFromParametricCurve(lin2D) # add sketch skt :adsk.fusion.Sketch = root.sketches.add(root.xYConstructionPlane) skt.isComputeDeferred = True sktCrvs :adsk.fusion.SketchCurves = skt.sketchCurves for crv in crvs: if hasattr(crv,'asNurbsCurve'): crv = crv.asNurbsCurve if crv.objectType == 'adsk::core::NurbsCurve3D': sktElm = sktCrvs.sketchFittedSplines.addByNurbsCurve(crv) else: s = crv.startPoint e = crv.endPoint sktElm = sktCrvs.sketchLines.addByTwoPoints(s,e) skt.isComputeDeferred = False except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
これでは片側しか線を描かない為、こちらのItem部分を修正して2回実行します。
・・・ # get face face :adsk.fusion.BRepFace = body.faces.item(1) ・・・
紫が手動で作ったもので、青の点が表示されているものが今回のもの。
上手くいかないのはやる前から分かっていたのですが、いざ目の前にすると辛い。
ん~お互いの面が共有するエッジ上で通過点を取得し、それぞれ2点から
エッジ上の点に向かってUV的な直線を描けば良いのですが、
どうやれば良いのかな? Fusion360のコマンド使うと履歴的に汚くなるので
内部的にゴリゴリやりたい。
・・・気が重い。