C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

マウスカーソルの座標値を取得する4

こちらの続きです。
マウスカーソルの座標値を取得する3 - C#ATIA
3D空間でマウスの位置が取得できるようになったので、マウスの位置で
曲率と勾配角度を動的に取得したいです。そう、CATIAのオンザフライの機能を
実現したいと細々とやってます。
テストモデルはこのような感じで、勾配解析を行った状態です。
f:id:kandennti:20180606104408p:plain
勾配角度はZ軸(青い線)方向とします。紫色は垂直面で、青緑?色が水平面です。
最小R(曲率の逆数)は無事に取得できているようなのですが、
勾配が上手く取得出来ていません。

    app = adsk.core.Application.get()
    des = adsk.fusion.Design.cast(app.activeProduct)
    comp = des.rootComponent
    
    #pnt - サーフェス上の任意の点
    #maxTangent - サーフェス上の任意の点の法線3Dベクトル
    axisZ = comp.zConstructionAxis.geometry
    tang = adsk.core.InfiniteLine3D.create(pnt, maxTangent)
    measMng = app.measureManager
    ang = measMng.measureAngle(axisZ, tang).value

比較的最近実装されたmeasureManagerオブジェクトを利用し、
2つの無限直線の角度を求めています。
結果はこちら
f:id:kandennti:20180606104420p:plain
左が水平面で右が垂直面です。 両方90°です…。
R面を測定していても水平に近い部分で90°弱になり、
垂直に近い部分で0°強になる為、個人的な直感とは逆です。
又、アンダーカットとなる部分ではマイナスの値で返ってきて
欲しいのですが、全てプラスです。(atan関数なんだろうなぁ)

よく見たらVecter3Dオブジェクトに2つのベクトル間の角度を求める
メソッドがあった為、コードを修正。

    ・・・
    vecZ = comp.zConstructionAxis.geometry.direction
    ang = vecZ.angleTo(maxTangent)

こちらの方が、はるかにコードが短かったです。
でも結果は同じです。

真面目に計算しなきゃなら無そうなので、悩み中です。