C#ATIA

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

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

少し前に作成したこちらのマクロ、使いにくくてしょうがない。
クリックしたスケッチ点に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 の切り替えのみをテストしましたが、
効果がないです。 それを考えると表示だけの問題では無さそうです。
(そもそもこんな拘束を作りたくない・・・)