C#ATIA

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

選択時のみ原点平面を表示する

久々にFusion360API

こちらに頭に思い付いた手順をスプリクトにしたのですが
Re: スケッチの線分コマンドのようなスケッチ選択を作成するにはどうすればいいですか - Autodesk Community

考えたら、アクティブなコンポーネントの原点の表示状態は選択時のみの話なので
選択時のみの関数に全て突っ込んでしまった方が、コード的にやさしい気がしました。
しかもPythonの例外処理には、必ず実行する "finally" が存在していたのを忘れてました。

#Fusion360 python
#選択時のみ原点平面を表示するサンプル

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        #モロモロ
        app = adsk.core.Application.get()
        ui = app.userInterface
        
        #選択用のフィルタ
        selFilter = 'ConstructionPlanes,PlanarFaces'
        
        #選択
        msg = '平面を選択'
        selection = Sel(app, msg, selFilter)
        if selection is None: return
        
        #選択要素
        selitem = selection.entity
        
        #オブジェクト名
        ui.messageBox('Select Object Type : {}'.format(selitem.objectType))
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

def Sel(app, msg, selFilter):
    ui = app.userInterface
    des = adsk.fusion.Design.cast(app.activeProduct)
    
    light = GetActiveCompOriginLight(des)
    SetActiveCompOriginLight(des, (True,True,True,True))
    
    try:
        return ui.selectEntity(msg, selFilter)
    except:
        return None
    finally:
        SetActiveCompOriginLight(des, light)

#現行コンポーネントの原点表示状態取得
def GetActiveCompOriginLight(des):
    comp = adsk.fusion.Component.cast(des.activeComponent)
    xy = comp.xYConstructionPlane
    xz = comp.xZConstructionPlane
    yz = comp.yZConstructionPlane
    
    return (comp.isOriginFolderLightBulbOn,
            xy.isLightBulbOn,
            xz.isLightBulbOn,
            yz.isLightBulbOn)

#現行コンポーネントの原点表示状態設定
def SetActiveCompOriginLight(des,light_set):
    comp = adsk.fusion.Component.cast(des.activeComponent)
    xy = comp.xYConstructionPlane
    xz = comp.xZConstructionPlane
    yz = comp.yZConstructionPlane
    
    comp.isOriginFolderLightBulbOn = light_set[0]
    xy.isLightBulbOn = light_set[1]
    xz.isLightBulbOn = light_set[2]
    yz.isLightBulbOn = light_set[3]

スケッチの拘束の参照を切り替える

少し前に作成したこちらのマクロ、使いにくくてしょうがない。
クリックしたスケッチ点にHVの拘束を付ける - C#ATIA
何処かに、拘束が重複しないように整えてくれるマクロ、落ちてないでしょうか?
(標準な機能では無いですよね?)

非常に下らないのですが、スケッチの拘束の参照のON OFFを切り替える
マクロを作ってみました。
f:id:kandennti:20180830183944p:plain
最近、この操作を頻繁に行って疲れてきたので。
(そもそもそんな拘束を作りたくないのですが、ルール上仕方なく・・・)

こんなコードです。

'vba スケッチ オフセット拘束 モード切り替えテスト
Sub CATMain()
    'ワークベンチチェック
    If Not CATIA.GetWorkbenchId = "CS0WKS" Then
        MsgBox "スケッチ作業中のみ使用できます"
        Exit Sub
    End If
    
    
    '選択準備
    Dim sel As Variant ' Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    Dim filter As Variant
    filter = Array("Constraint")
    
    Dim msg As String
    msg = "拘束を選択 / ESC=キャンセル"
    
    '選択
    Do
        sel.Clear
        Select Case sel.SelectElement2(filter, msg, False)
            Case "Cancel", "Undo", "Redo"
                Exit Sub
        End Select
        Call ChangeMode(sel.Item(1).value)
    Loop
End Sub

'拘束モード切り替え
Private Sub ChangeMode(ByVal con As Constraint)
    con.Mode = IIf(con.Mode = catCstModeDrivenDimension, _
                   catCstModeDrivingDimension, _
                   catCstModeDrivenDimension)
End Sub

通常の場合であれば、これだけで十分機能するのですが、
問題は通常じゃない時です。

例えば、こんな状態です。(普段は拘束名は表示しないのです。邪魔なので。)
f:id:kandennti:20180830184000p:plain
過剰拘束の状態なのですが、オフセット7,8,12の何れかを参照にすれば
解消されますよね。

上記のマクロでオフセット7を選択すると
f:id:kandennti:20180830184007p:plain
消えたのではなく、黒くなって見えにくくなっちゃいます。

一度スケッチャーから抜け、再度入ると正しく表示してくれます。
f:id:kandennti:20180830184016p:plain

スケッチ解析を見てみると
f:id:kandennti:20180830184028p:plain
クリックしたオフセット7が "不明" なのは理解できますが、
過剰拘束が解消したオフセット8,12は問題無いのですが、黒いんです。
そもそも黒い拘束は何を意味しているのでしょうか??

Helpのスケッチャーの "色の使用" を見ても黒色の説明が無さそう・・・。
(そもそも黒なのか?)
何となくUpdate待ちのような気がしたので、Updateさせることに
しました。

'拘束モード切り替え
Private Sub ChangeMode(ByVal con As Constraint)
    con.Mode = IIf(con.Mode = catCstModeDrivenDimension, _
                   catCstModeDrivingDimension, _
                   catCstModeDrivenDimension)
    Dim pt As Part
    Set pt = KCL.GetParent_Of_T(con, "Part")
    
    Call pt.UpdateObject(con)
End Sub

結論から書くと、これでは問題の解消にはなりませんでした。

    'Call pt.UpdateObject(con)
    Call pt.Update

こうすると上手く出来るのですが(何故か最初は失敗する事が多い)、
作業しているスケッチより、PartのTreeの上部でエラーが出ている場合、
上手く行かないような気がするので、単純なUpdateはしたくないのが
本音です。

仕方が無いので、作業中のスケッチをUpdateすることにしました。

'拘束モード切り替え
Private Sub ChangeMode(ByVal con As Constraint)
    con.Mode = IIf(con.Mode = catCstModeDrivenDimension, _
                   catCstModeDrivingDimension, _
                   catCstModeDrivenDimension)
    Dim pt As Part
    Set pt = KCL.GetParent_Of_T(con, "Part")
    
    Dim skt As Sketch
    Set skt = KCL.GetParent_Of_T(con, "Sketch")
    
    Call pt.UpdateObject(skt)
End Sub

これも最初に失敗する事があるのですが、比較的安定して正しく表示
されるようになりました。
f:id:kandennti:20180830184042p:plain

一応、CATIA.RefreshDisplay の切り替えのみをテストしましたが、
効果がないです。 それを考えると表示だけの問題では無さそうです。
(そもそもこんな拘束を作りたくない・・・)

CAD利用技術者試験4

こちらの続きです。
CAD利用技術者試験3 - C#ATIA

結果が出ました。十分遅いとは思うのですが、思ったよりは早かったです。

f:id:kandennti:20180829180608p:plain

実は、最後の問題のモデルは完成しなかったんです。
帰りの電車の中で、赤印部分に "貫通穴あけるの忘れた"
と気が付いてはいたのですが

f:id:kandennti:20180829180741p:plain

途中で形状を勘違いして進めていた事に気が付いたのですが、
初期段階まで履歴を戻る必要が有り(シェルが関係する部分だった為)
残り時間を考慮しどうすべきか?直ぐに判断しなければならなかったのですが・・・。
最後の問い(体積・重心)以外は間違えたまま進めても答えられる為、
"履歴を戻ってエラー地獄になるより、1問捨てたほうが良いだろう”
と判断しました。
結果的に時間内に修正できたのですが、
”最後の問いまで、答えに関係ないから後で作ろう” と思っていた
上記の貫通穴をすっかり忘れてました。
(答えに選択肢が無い状態です)

過去問の傾向から、5択の問題でも2択までは何となく絞れるので
後は運任せの選択で良い方に転がったようです。
(ある意味練習の成果かも知れませんが)

・・・2級は、お見せ出来る点数じゃないのでナイショです。

スピン中心

昨夜の書き込みのこれ、すごくありがたいです。
Tips & Tricks - Page 5 - Autodesk Community
こちらの MESSAGE 82 のものです。

PowerMill優秀なのですが、操作性がイマイチな部分が有り、一番困っていたのは
このスピンの中心点です。
特に細かい部分を確認する為にズームしてスピンさせると、見たい部分がどっかに
行っちゃうんです。 PowerMillは基本的にスピンの中心は画面の中央に設定されています。
Fusion360も同様で、ズーム時のスピンが辛い)

この内容、過去にサポートさんにも相談してマクロを作ったりしてイロイロ試したのですが
ここまで見事な解決策まで辿り着けませんでした。


ちょっぴり使い勝手が悪い為、kukelykさんが修正して(MESSAGE 84)くれているの
ですが、単体のマクロでの呼び出しであればOKだけど、コンテキストメニューから呼び出すと
PowerMillが固まってしまうとの事。(確かにPAUSEダイアログは邪魔です)

お互いの良いとこ取りしたマクロにし、モデルのコンテキストメニュー呼び出しで使う事に
しました。(ズーム時は、何も無いスペースで右クリック出来ない可能性が高いので)


最初のマクロを作った方ですが、PowerMillでAutodesk Expert Eliteなられた方で
今までPowerMillにはいなかったんですよね。
kukelykさんや5axisさんも十分値するんだけどなぁ。

スロット形状の長手方向の寸法

いつもイライラしてしまうのですが、3Dから2D落としたものに
寸法を入れるときですが
f:id:kandennti:20180822121940p:plain
赤印はスロットの中心で寸法を作成しているのですが、
実際に欲しいのは青印の長手方向での寸法です。

中心線は、交点を検出してくれないです。
点を作って拘束させてゴニョゴニョしたり、
形状の複写をし、中心線とトリムして任意の端点作ってみたり
接線作ってホゲホゲしたり すれば一時的には出来上がるのですが
修正・変更した際に寸法だけが置いてけぼりになってしまうので困ります。
(3D上でリンクした点を作っておけば事足りるのですが、客先も嫌がるだろうし)
世間の皆様はどうやっているのでしょうか?

利用方法から、設計上Rの中心の寸法で十分のような気がするのですが。
(どうせバカ穴だろうし・・・)

クリックしたスケッチ点にHVの拘束を付ける

何となく、近い将来必要に迫られる気がしたので、作りました。
スケッチャーWB時のみ、クリックしたスケッチの点に原点からHとVの
拘束を付けます。

'vba 選択したスケッチの点にHVの拘束を作成  using-'KCL0.0.12'

Sub CATMain()
    'ワークベンチチェック
    If Not CATIA.GetWorkbenchId = "CS0WKS" Then
        MsgBox "スケッチ作業中のみ使用できます"
        Exit Sub
    End If
    
    'モロモロ取得
    Dim skt As Sketch
    Set skt = GetActiveSketch()
    
    Dim ax2d As Axis2D
    Set ax2d = skt.AbsoluteAxis
    
    Dim cons As Constraints
    Set cons = skt.Constraints
    
    Dim pt As Part
    Set pt = KCL.GetParent_Of_T(skt, "PartDocument").Part
    
    Dim refH As Reference
    Set refH = pt.CreateReferenceFromObject(ax2d.HorizontalReference)
    
    Dim refV As Reference
    Set refV = pt.CreateReferenceFromObject(ax2d.VerticalReference)
    
    '選択準備
    Dim sel As Variant ' Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    Dim filter As Variant
    filter = Array("Point2D")
    
    Dim msg As String
    msg = "点を選択 / ESC=キャンセル"

    Dim refP As Reference
    
    '選択
    Do
        sel.Clear
        Select Case sel.SelectElement2(filter, msg, False)
            Case "Cancel", "Undo", "Redo"
                Exit Sub
        End Select
        Set refP = sel.Item(1).Reference
        Call InitConstraint(refP, refH, refV, cons)
    Loop
End Sub

'拘束作成
Private Sub InitConstraint(ByVal refP As Reference, _
                           ByVal refH As Reference, _
                           ByVal refV As Reference, _
                           ByVal cons As Constraints)
    Dim con(1) As Constraint
    With cons
        Set con(0) = .AddBiEltCst(catCstTypeDistance, refH, refP)
        Set con(1) = .AddBiEltCst(catCstTypeDistance, refV, refP)
    End With
    
    Dim i As Long
    For i = 0 To UBound(con)
        If Not con(i).Status = catCstStatusOK Then
            Call RemoveConstraint(con(i))
        End If
    Next
End Sub

'拘束削除
Private Sub RemoveConstraint(ByVal con As Constraint)
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    With sel
        .Clear
        .Add con
        .Delete
    End With
End Sub

'アクティブなスケッチ取得
Private Function GetActiveSketch() As Sketch
    Dim sel As Selection
    Set sel = CATIA.ActiveDocument.Selection
    
    Dim skt As Sketch
    
    With sel
        Call .Clear
        Call .Search("CATPrtSearch.Sketch,in")
        Set skt = .Item(1).value
        Call .Clear
    End With
    Set GetActiveSketch = skt
End Function

突貫で作ったのでちょっと雑です。

スケッチの点は "自動寸法拘束" が付かないんですよね。
f:id:kandennti:20180821192025p:plain
付かなくて正解なんですけど。(恐らく邪魔)

過拘束も新たに作成しようとしている分はチェックしています。

三角形の数

子供の夏休みの宿題の中に、パズルっぽい楽しそうな問題が有りました。

この絵の中に三角形は幾つ有るでしょうか? と言う問題です。
f:id:kandennti:20180818131227p:plain
これは何か有名な問題か何かでしょうか?


単に数えてしまえば良いだけなのですが、大人の為
何とか計算で導き出せないものか? と考えてみました。

まず、ピラミッドが1段の場合は、当然1個です。
f:id:kandennti:20180818131252p:plain
このサイズを1ユニットとしておきます。

2段の場合、5個となります。
f:id:kandennti:20180818131300p:plain
1ユニットのものが4個と4ユニットのもの(外周部分)が1個です。
数学の三角数の派生っぽさもあるのですが、外周部分にも三角形が
現れる為、すんなり行かない様なにおいがします。

3段目の場合、13個です。
f:id:kandennti:20180818131308p:plain
1ユニット-9個
4ユニット-3個
9ユニット-1個
この絵を描くのが結構手間なので、CATIAでイロイロ駆使して
簡単に書けるようにしてみましたよ。


ここまでをまとめると、こんな感じになります。
f:id:kandennti:20180818131336p:plain
こうしてみると、数列のような雰囲気を感じます。
これを元に4段を予想するのが大人。

1段前との差(増加分)を "等差数列" と解釈すれば "12" となり
13 + 12 = 25
"等比数列" と解釈すれば "16" で
13 + 16 = 29
最初に書いたように、増え方がすんなりでは無いように感じるので
29と予想してみました。

で、4段は
f:id:kandennti:20180818131349p:plain
1ユニット-16個
4ユニット-6個
9ユニット-3個
16ユニット-1個
逆4ユニット-1個
計27個・・・予想が外れました。

逆4ユニットはここです。
f:id:kandennti:20180818131507p:plain
まさか、逆側の三角形が現れるとは思っていませんでした。
小学生向けの問題だったので、これに気が付くかどうか?
が問題作成者の狙いの様に感じます。

大人はここで諦めない。まとめるとこんな感じです。
f:id:kandennti:20180818131520p:plain
"加速具合" と言う怪しげな項目を増やしました。
"1段前との差" が "増加具合" なら、その差は "加速具合" です?

数学ガールシリーズの数列のヤツをちょっと読みましたが(理解は出来ない)
導関数って名称でしたっけ? きっと数学的には適切な用語があるはずです。

ここで5段を予想。加速具合を "8" と考え、
8 + 14 + 27 = 49
で "49" と予想。

さぁ、数えてみよう!
f:id:kandennti:20180818131530p:plain





1ユニット-25個
4ユニット-10個
9ユニット-6個
16ユニット-3個
25ユニット-1個
逆4ユニット-3個
計48個・・・あと1個探したのですが見つからない。
逆9ユニットはあと1段増えないと現れてはくれません。

ん~僕レベルでは見つけられなかったです。
子供には伝えましたよ。
素直に数えろ!
と。