C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

Custom Featuresに挑む2

こちらの続きです。
Custom Featuresに挑む1 - C#ATIA

思うように作成出来ずに挫折しかかってます。

作りたいものを進めるのは諦め、しばらくはCustom Featuresの機能する部分を
確かめる事にしました。

挫折した部分の1つがパラメーターです。
ダイアログに表示させている項目の値を、コマンド実行時に保存させ編集時には
再表示させるためには不可欠な要素です。
Fusion 360 Help
Fusion 360 Help

"Custom Pocket" をお借りし、この様な項目を追加しました。
f:id:kandennti:20210126120143p:plain
両方とも、コマンドの実行には何も影響を与えません。単に作成の際に入力させ
編集時に再度表示させるのが目的です。

実際に実行時には問題ありません。
しかし編集時のダイアログを開くと・・・
f:id:kandennti:20210126120215p:plain
1項目抜けてます。

抜けている綱目は、Int型の単位の無いものです。
(実は、Fusion360のパラメータの数値は、Int(整数)は無くfloat(実数)だけの様です)
単位無しでパラメータを作っているものの、勝手に単位を付けられちゃってます。
f:id:kandennti:20210126120233p:plain


色々と挑戦していますが、この "単位の無い" パラメータが現状扱えないみたいです。
"単位が扱えない" よりは、逃げ道があるのですが、何とも困ってます。

まぁパラメータについては、不具合がある事を公言されてはいますが
Fusion 360 Help
単位無しについては、記載されていないですね。


恐らく今の所、長さと角度だけかな・・・。
(ドキュメントが不正確なのも困るけど、面倒な気持ちは痛いほど理解できる)

形状セット内のサーフェスと線類を別の色にする

サーフェスと線類が混在し選択された状態で別々の色を付けたい と
昨年末辺りでご相談頂いていたのですが、遅くなりました。

CATIAの場合は色を変更する為には一度選択状態にする必要がありますが、
一辺にサーフェスと線類を別々に色付けする事は出来ません。

その為、サーフェスのみ 線類のみ の選択状態にする必要があります。

'catvba
Option Explicit

Sub CATMain()

    '準備
    Dim doc As PartDocument
    Set doc = CATIA.ActiveDocument
    
    Dim sel As Selection
    Set sel = doc.Selection
    sel.Clear
    
    Dim pt As Part
    Set pt = doc.Part
    
    '一個目の形状セット
    Dim hyBdy As HybridBody
    Set hyBdy = pt.HybridBodies.Item(1)

    '選択処理を軽くするための魔法
    'http://catiadoc.free.fr/online/interfaces/interface_Application.htm#HSOSynchronized
    CATIA.HSOSynchronized = False
    
    '意図的に形状セット内の全GSD要素を選択
    Dim entity As AnyObject
    For Each entity In hyBdy.HybridShapes
        sel.Add entity
    Next
    
    
    '---本題はここから---
    
    'HybridShapeFactory取得
    'http://catiadoc.free.fr/online/interfaces/interface_HybridShapeFactory.htm#GetGeometricalFeatureType
    Dim hyFact As HybridShapeFactory
    Set hyFact = pt.HybridShapeFactory

    '選択要素からHybridShapeFactoryでジオメトリのタイプを
    '判断し選択から外す
    'For文は逆順に行わないとインデックスがズレます
    'Surfaceは5です
    Dim idx As Long
    Dim geoType As Long
    For idx = sel.Count2 To 1 Step -1
    
        'idx番目のジオメトリのタイプを取得
        geoType = hyFact.GetGeometricalFeatureType(sel.Item(idx).Reference)
        
        'サーフェス以外は選択を解除する
        If Not geoType = 5 Then
            Call sel.Remove(idx)
        End If
    Next

    'この時点でサーフェスのみが選択状態になっている
    
    '色を変更する為のVisPropertySetを取得
    'http://catiadoc.free.fr/online/interfaces/interface_VisPropertySet.htm
    Dim vis As VisPropertySet
    Set vis = sel.VisProperties

    'SetRealColorの引数はR,G,Bで
    '4番目は良く分かってません(以前教わったような気はしてます)
    '赤色に変更してます
    Call vis.SetRealColor(255, 0, 0, 1)
    sel.Clear



    '無駄ですが、もう一度形状セット内の全GSD要素を選択
    For Each entity In hyBdy.HybridShapes
        sel.Add entity
    Next

    '選択要素からHybridShapeFactoryでジオメトリのタイプを
    '判断し選択から外す
    'Curveは2 Lineは3 Circleは4です
    For idx = sel.Count2 To 1 Step -1
    
        'idx番目のジオメトリのタイプを取得
        geoType = hyFact.GetGeometricalFeatureType(sel.Item(idx).Reference)
        
        'サーフェス以外は選択を解除する
        Select Case geoType
            Case 2, 3, 4
                '何もしない
            Case Else
                Call sel.Remove(idx)
        End Select
    Next

    'この時点で線のみが選択状態になっている
    
    '緑色に変更してます
    Call vis.SetRealColor(0, 255, 0, 1)
    sel.Clear

End Sub

形状セット内にはサーフェスと線が1個づつですが、全ての色を変更します。
実行前は左で実行後は右です。
f:id:kandennti:20210125190650p:plain

上記にSetRealColorで4番目の引数について

    'SetRealColorの引数はR,G,Bで
    '4番目は良く分かってません(以前教わったような気はしてます)

と記載していますが、こちらのサイトではより詳しく記載されています。
VisPropertySetオブジェクト|CATIAマクロの作成方法 | LiCLOG
助かります。

Custom Featuresに挑む1

タイトルが異なりますが、こちらの続きです。
Fusion360 Ver2.0.9636 - C#ATIA

他人のコードを読むのが苦手の為なるべく避けているのですが、
さすがに新機能なので避けることが出来ずにチラッと読みました。

サンプルがここからDL出来る2個(Round Emboss , Custom Pocket)
しか見当たらないです。
Fusion 360 Help
Custom Features的なこと以外にも、"あ~厚みはこんな風に取得するんだ" と
今さらながら感心しました・・・。

・依頼通り、Command Definitionでコマンドを作る。
・但し、ボタンを押して実行する新作用のコマンドと一度作成した後
 修正用のコマンドの2個の Command Definitionが必要。
 (ネイティブコマンドのログを見ていても、異なる事は気が付いていました)
・CustomFeatureDefinitionを作る際、2個のCommand Definitionを抱き合わせる。
Fusion 360 Help
・CustomFeatureInputでCustomFeatureを作る。
 その際、参照すべき形状類はaddDependencyで、数値等はaddCustomParameter
 に突っ込んでおくと、編集時に利用出来る・・・と言う事かな?
Fusion 360 Help
 このページとリンク元のページの説明書きに、”Ruled Surface feature” って
 書いてあるのは "Custom Feature" の間違いだと思うので、後で突っ込んでおく。
f:id:kandennti:20210122170536p:plain
 まぁドキュメントは作るの面倒なので原本使いまわすよね。
 (気持ちは十分な程、わかる)
・編集時は、まずタイムラインをCustomFeatureの手前に戻して、トランザクション
 食い止めろ(この辺が良く分かっていない)と言う事らしい。
・変更前の選択要素や数値類はCustomFeatureのdependenciesとparametersから
 引っ張り出してダイアログに反映させるみたい。
・編集後、CustomFeatureより後ろのタイムラインでエラーを出したくなきゃ
 dependenciesで参照をなるべく保て って事かな・・・自信無い。
 (まぁそうだと思う。)
 Executeイベント後は自動で計算するからね と言う事らしい。

今までの "要素を作るだけ" のコマンドに比べて、2.5~3倍ぐらいは手間がかかりそう。
アドインはこちらを使っていたのですが、
GitHub - tapnair/Fusion360AddinSkeleton: Framework to simplify the creation of Fusion 360 Addin
Custom Featuresは対応出来ないっぽい。

こちらを覚えなきゃダメかな。
GitHub - tapnair/apper: Fusion 360 Addin Framework


・・・結局、挑む手前で終わってます。

キャンバスの表示/非表示

こちらを挑戦しました。
Command to toggle canvas visibility inside a Fusion file? - Autodesk Community

キャンバスの表示の切り替えがAPIで出来るか? って事です。
もう、直感で出来るのはわかります。但し、コードにするのは大変です。
が、やりました。しんどいのでルートコンポーネントのみです。

もう、ブラウザツリーの要素の表示/非表示やリネームやらなんやらは
出来る自信あります。ただ、大変です・・・。

Fusion360 Ver2.0.9636

タイトルが異なりますが、こちらの続きです。
Custom Features - C#ATIA

ドキュメントより後になったのは初めてでしたが、無事Updateされました。

アントリムも感動ですが、やはりAPIのCustom Featuresはもっと感動です。
アドインに革命が起こったと思っても良いレベルです。

APIからTextCommandsが利用出来るようになった時以来の感動。

あぁ、単に何時のバージョンで導入されたかの覚書です。

スケッチの向き3

こちらの続きです。
スケッチの向き2 - C#ATIA

ようやく完成したので、こちらで公開しました。
GitHub - kantoku-code/Fusion360_X_Horizontal: When you start working on a sketch,Rotate the X axis of the sketch so that it is horizontal.


なるべくルートコンポーネントのスケッチの作業と同じような動作を
行うようにしたつもりです。
個人的に動きは満足しています。が、コード的にはちょっぴり不満足です。
前回記載した通り、スケッチに入った抜けたはイベントが提供されていない為
こんな仕組みで行っています。

f:id:kandennti:20210120150914p:plain
皆こんな絵よくかけるよなぁ・・・。
①OnSketchEventクラスでThreadを立ち上げます。Fusion360APIとは無関係で
 Pythonの機能です。
②Threadで0.1秒毎に、_onSketchCheckHandlerクラスを呼び出します。
 これは、CustomEventオブジェクトです。
GUI側の監視します。"スケッチに入った抜けた" は分からないのですが
 "今はスケッチに入っているか?" は拾い出せるので、沢山の "今" を作りました。
④実際に作業者がスケッチに入ったり抜けたりします。
 ・・・良く考えたら絵が違うな。別に通知しているわけじゃないです。
 監視されているだけです。
⑤"スケッチに入った抜けた" が分かったら、視点をX軸が水平になるように
 回転させます。

不満なのは⑤の部分です。本当はこの様にしたかったんです。
f:id:kandennti:20210120152009p:plain
_onSketchCheckHandlerクラスは判断出来た時に回転させていますが、
判断だけを行わせたかったんです。
最初はそのようにコードを書いたのですが、ちっとも反応してくれない為
諦めました。

"CustomEventオブジェクト" と言う名称なのだから、トリガーが発生した際のみ
イベントが発生するようにしたいんだけどなぁ。