api におけるパスの長さを求めるオブジェクトについて

api におけるパスの長さを求めるオブジェクトについて

ce232069
Explorer Explorer
479件の閲覧回数
5件の返信
メッセージ1/6

api におけるパスの長さを求めるオブジェクトについて

ce232069
Explorer
Explorer

パスの長さを求めるときにgetParameterExtents()とgetLengthAtParameter()を用いるのですが、閉ループのパスの長さを求めようとすると、

Projection of the selected spline/curve would result in a degenerate segment and cause future modeling problems!

とエラーが出てしまいます。どのようにすればいいか教えていただきたいです

 

0 件のいいね
解決済み
480件の閲覧回数
5件の返信
返信 (5)
メッセージ2/6

kandennti
Mentor
Mentor
解決済み

@ce232069 さん こんにちは。

 

"閉ループのパス"で思い付いたのが、スイープのパスだったのでそちらでご説明を。

 

この様な感じのものをイメージしました。(f3dファイルを添付しておきます)

1.png

こちらのパスは4本のスケッチ曲線で出来ています。

この様な場合、長さであればCurveEvaluator3Dオブジェクトを利用しなくても、

スケッチ曲線のlengthプロパティからの方が取得が簡単だと思います。

 

添付データに対して、次のスクリプトで結果のダイアログを表示します。

 

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.fusion as fusion

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface
        des: fusion.Design = app.activeProduct
        root: fusion.Component = des.rootComponent

        # 今のタイムライン位置を取得
        statePosition = des.timeline.markerPosition

        # スイープ取得
        sweepFeat: fusion.SweepFeature = root.features.sweepFeatures[0]

        # パス要素をリストとして取得(確認しやすいため)
        # タイムラインを直前に移動させる必要あり
        sweepFeat.timelineObject.rollTo(True)
        pathEntities = list(sweepFeat.path)

        # パス要素の要素のlengthプロパティをリストで取得
        lengthLst = [ent.entity.length for ent in pathEntities]

        # タイムライン位置を戻す
        des.timeline.markerPosition = statePosition

        # 合計を表示
        ui.messageBox(f"パス長さ合計{sum(lengthLst)}Cm")

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

 

 

"getParameterExtentsメソッドをどうしても利用したい"等のお話であれば、

具体的なf3dファイルを添付して頂けると助かります。

 

※そのエラーメッセージは、長さの取得では出ない様な気がするのですが・・・。

メッセージ3/6

ce232069
Explorer
Explorer

対応ありがとうございます!

ce232069_0-1687535472884.png

 

この一本の閉ループフィットライン曲線の長さを求めたいのですが、エラーが出てしまいます

コードの一部は以下の通りです。

 

include=sketch.include(curve)

item=include.item(0)

data=item.geometry.evaluater

(returnval,start,end)=data.getParameterExtents()

(returnval,length)=data.getLengthAtParameter(start,end)

 

実行すると、

Projection of the selected spline/curve would result in a degenerate segment and cause future modeling problems!

となってしまいます。説明不足で申し訳ありません。

 

閉ループがない一本の曲線ならエラーなく実行できます。

0 件のいいね
メッセージ4/6

kandennti
Mentor
Mentor
解決済み

@ce232069 さん ありがとうございます。

 

自己交差した1本のスプラインと解釈しました。

こちらではこのようなデータを作成しました。(添付しておきます)

1.png

 

最初はプロファイルとなっている部分のみの長さを求めているのかと

思ったのですが、記載されたコードから全体の長さを取得すると解釈しています。

1.png

 

こちらでこのようなスクリプトを作成しましたが、自己交差の有無問わず

エラーが出ない為、状態を再現出来ませんでした。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.fusion as fusion

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface

        msg: str = 'スケッチ曲線を選択 / ESC-キャンセル'
        selFilter: str = 'SketchCurves'
        sel: core.Selection = select_ent(msg, selFilter)
        if not sel:
            return

        crv: fusion.SketchCurve = sel.entity

        eva: core.CurveEvaluator3D = crv.geometry.evaluator
        _, sPrm, ePrm = eva.getParameterExtents()
        _, length = eva.getLengthAtParameter(sPrm, ePrm)

        ui.messageBox(f"パス長さ合計{length}Cm")

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


def select_ent(
    msg: str,
    filter: str
) -> core.Selection:

    try:
        app: core.Application = core.Application.get()
        ui: core.UserInterface = app.userInterface
        sel = ui.selectEntity(msg, filter)
        return sel
    except:
        return None

但し、最初のリプライに記載しましたが、単に長さを取得するだけであれば

CurveEvaluator3Dを使用せずに、単純にlengthプロパティで取得可能です。
・・・
        crv: fusion.SketchCurve = sel.entity

        ui.messageBox(f"パス長さ合計{crv.length}Cm")
・・・

 

 

一つだけ疑問だったのが、

include=sketch.include(curve)

ですが、GUIの場合はこちらのコマンドを使用した事と同じです。

1.png

この処理の必要性がわかりませんでした。(必要無い気がします)

エラーとなるf3dファイルを添付して頂けると、もう少しお手伝い出来るかも

知れません。

メッセージ5/6

ce232069
Explorer
Explorer

細かいところまで対応ありがとうございます!

長さの取得だけならCurveEvaluator3D必要ないんですね。対応ありがとうございました

メッセージ6/6

mari.shimode
Community Manager
Community Manager

@ce232069 さん、こんにちは。コミュニティのご利用ありがとうございます。

 

問題を解決されているようですので、kandennti さんの返信 2 件に「解決策として承認」ボタンをこちらで押しました。


解決策を承認するとトピックに解決済みのチェックマークが付き、同じ問題を抱えた方が回答または方法を参考にすることができます。

今後返信で問題が解決、または解決に至らなくとも参考になった場合、各返信の右下に表示されている承認ボタンを押してください。

 

またコミュニティをご利用ください。

 



Mari Shimode
Community Manager