標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

非表示になっている CADのメニューを AutoLISP で強制的に表示する

メニューを menuload コマンドでロードしても、ロードはされるが表示されないという場合があって難儀した (どうも、最後にアンロードした時の表示状態がずっと記憶されているようだ)

過去の案件だと menuload ではなく、(vla-load (vla-get-menugroups (vlax-get-acad-object)) "メニュー名") なら表示されるという解決方法もあったのだが、今回はダメだった。

でも、このコマンドを実行すると、ActiveX のオブジェクトを示すIDっぽい番号がコマンドラインに表示される。これを手掛かりにオブジェクトをたどっていけば、メニューを無理やり表示させることもできるのでは?

CAD の Lisp で扱う ActiveX オブジェクトは (vlax-dump-object オブジェクト T) で仕様が表示できる。これを手掛かりに芋づる式に表示したいメニュー項目を表示状態にしてみよう。

(setq menugroups  (vla-get-menugroups (vlax-get-acad-object)))
(if (menugroup "メニュー名")
    (setq custom  (vlax-invoke-method menugroups "Item" "メニュー名"))
    (setq custom  (vla-load menugroups "メニューファイル"))
)
(setq toolbars   (vlax-get-property  custom "Toolbars")
      count      (vlax-get-property  toolbars "Count")
)
(while (> count 0)
    (setq count    (1- count)
          toolbar1 (vlax-invoke-method toolbars "Item" count))
    (vlax-put-property toolbar1 "Visible" T)
)

うまいこといきました。