こちらの内容の ”上側の面を判断” のみをちょっと考えてみました。
[API] Determining all the top faces of the design - Autodesk Community
4番目のレスはフォーラムの調子が悪く、画像の添付は出来ない
改行は無効になる で読みづらい上、伝わりきらないとは感じてます。
一応こんな感じです。
#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 # 平らな面のみ取得 planeSurface = adsk.core.SurfaceTypes.PlaneSurfaceType body :adsk.fusion.BRepBody = root.bRepBodies[0] faces = [f for f in body.faces if f.geometry.surfaceType == planeSurface] # 測定用Plane - このままじゃ測定に利用出来ない dist = 100000 upVec = adsk.core.Vector3D.create(0,1,0) #上方向ベクトル - 単位ベクトルじゃなくてもOK upVec.normalize() upVec.scaleBy(dist) pnt3D = adsk.core.Point3D origin = pnt3D.create(0,0,0) origin.translateBy(upVec) plane = adsk.core.Plane.create(origin, upVec) # コンストラクション平面 - これも測定に使えない # planes = root.constructionPlanes # planeIpt = planes.createInput() # planeIpt.setByPlane(plane) # baseFeats = root.features.baseFeatures # baseFeat = baseFeats.add() # baseFeat.startEdit() # plane = planes.add(planeIpt) # baseFeat.finishEdit() # 上向きベクトルと直交する面のみ measureMgr :adsk.core.MeasureManager = _app.measureManager faces = [f for f in faces if measureMgr.measureAngle(plane, f).value < 0.001] # 平面とサーフェスの最短距離測定が出来ない!! # ダミーのボックス作成 tmpMgr = adsk.fusion.TemporaryBRepManager.get() bound = adsk.core.OrientedBoundingBox3D.create( origin, plane.vDirection, plane.uDirection, dist, dist, 1) box = tmpMgr.createBox(bound) baseFeats = root.features.baseFeatures baseFeat = baseFeats.add() baseFeat.startEdit() box = root.bRepBodies.add(box,baseFeat) baseFeat.finishEdit() # ダミーのボックスとサーフェスの最短距離測定 faces_dist = [] for f in faces: faces_dist.append([f,measureMgr.measureMinimumDistance(f, box).value,]) baseFeat.deleteMe() # 一番近い面 uprFace = min(faces_dist, key=(lambda x: x[1])) # 面選択 _ui.activeSelections.clear() _ui.activeSelections.add(uprFace[0]) except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
イマイチなんです。
・平面-サーフェス最短距離が測れない。
過去にも経験していました。
スプリクトで2要素間の距離測定をしたい2 - C#ATIA
・上記の理由から、一時的にベースフューチャを作成し削除している。
・マイナス方向は正しく処理されていない。(原因は僕)
もっと清楚な方法があると思うんだけどなぁ。