こんにちわ
現在,apiを用いて3Dモデルの形状認識を行おうとしております.
対象とするモデルは,stepなどの中間ファイルからインポートしたソリッドモデルです.
ドキュメントを検索していると,フィーチャーを検索 という機能があることを見つけました.
しかし,現状apiを用いて動作させる方法が分かりません.
apiからの動作が可能かどうか教えていただきたいです.
また,fusionのapiを用いた形状認識(フィーチャー認識)についてご意見あればよろしくお願いいたします.
解決済! 解決策の投稿を見る。
回答者: kandennti. 解決策の投稿を見る。
@MM0501 さん こんにちは。
ドキュメントのどの辺りに記載されているのでしょうか?
https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-A92A4B10-3781-4925-94C6-47DA85A4F65A
もし、APIで提供されていない場合であれば、裏技チックな方法で
実現可能のような気がしています。(必ず出来る と言う保証は無いのですが)
@kandennti さん
恐らくこちらの機能のことです。
この機能は恐らくSolidworksなどのフィーチャー認識に類似した機能なのですが、履歴ありにすると使えない隠れた便利機能だったりします。これが履歴あっても使えたらなぁと最近はず~っと思っているのですが……。
恐らくいつか履歴ありでも使えるようになるに違いないと思っています。
@MM0501 さん
見落としの可能性はあるのですが、恐らくAPIでは提供されていない機能です。
裏技ですが、テキストコマンドを使用します。(APIでテキストコマンドを実行する事が出来ます)
テキストコマンドの利用方法は、古いのですがこちらに記載しました。
https://forums.autodesk.com/t5/fusion-api-and-scripts/use-textcommands/m-p/9645688
https://forums.autodesk.com/t5/fusion-api-and-scripts/use-textcommands2/m-p/9937161
処理速度は遅いもののAPIからGUIを操作するようなイメージです。
但し通常のAPIより開発が困難です。 ・・・の為、今晩取り組んでみます。
最近でもこんな感じのものを作成しています。
https://forums.autodesk.com/t5/fusion-api-and-scripts/generate-face-groups-via-python-script/m-p/128...
@Bunga777 さん
機能自体は、以前の会社で何度も使用していたため知ってましたよ!
フィレット削除や穴埋めに使ってました。
@MM0501 さん
スクリプトを作成してみました。実行後ソリッドボディを選択すると
穴のみのフィーチャの検索を行い、出来上がったフィーチャ名を表示します。
# 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
# デザインモードチェック
if des.designType == fusion.DesignTypes.ParametricDesignType:
ui.messageBox("ダイレクトモードに切り替えて下さい")
return
# 選択
msg: str = "ソリッドボディを選択"
selFilter: str = "SolidBodies"
sel: core.Selection = select_ent(msg, selFilter)
if not sel: return
feats = exec_find_hole_features(
sel.entity
)
if not feats: return
# メッセージ
if len(feats) < 1:
msg = "見つかりませんでした"
else:
names = "\n".join([f.name for f in feats])
msg = f"以下が見つかりました\n{names}"
ui.messageBox(msg, "穴検索")
except:
if ui:
ui.messageBox("Failed:\n{}".format(traceback.format_exc()))
def exec_find_hole_features(
body: fusion.BRepBody,
) -> list[fusion.HoleFeature]:
"""
ダイレクトモードでのフューチャー検索-穴を行う
"""
app: core.Application = core.Application.get()
ui: core.UserInterface = app.userInterface
# ソリッドチェック
if not body.isSolid: return
# ボディのコンポーネント
comp: fusion.Component = body.parentComponent
# 穴フィーチャのバックアップ
holes: fusion.HoleFeatures = comp.features
holeFeatLst = [h for h in holes]
# 選択
sels: core.Selections = ui.activeSelections
sels.clear()
sels.add(body)
# コマンド実行
cmds = [
u"Commands.Start FusionFindFeaturesCommand", #コマンド呼び出し
u"Commands.SetBool SelectAllFeaturesInput 1", #全てON
u"Commands.SetBool SelectAllFeaturesInput 0", #全てOFF
u"Commands.SetBool SelectHoleFeatureInput 1", #穴ON
u"NuCommands.CommitCmd", #実行
]
[app.executeTextCommand(cmd) for cmd in cmds]
# 見つけた穴フィーチャ
return [h for h in holes if not h in holeFeatLst]
def select_ent(
msg: str,
filterStr: str
) -> core.Selection:
"""
要素の選択
"""
try:
app: core.Application = core.Application.get()
ui: core.UserInterface = app.userInterface
sel = ui.selectEntity(msg, filterStr)
return sel
except:
return None
お探しの情報が見つからないときは、コミュニティで質問しましょう。困っている人がいたら、情報を教えてあげましょう。