AutoLISPで作ったコマンド、思ってたのと違う所に図形が描かれてしまう!!
そんなときはオブジェクトスナップが影響しているかも。
例えば
ここにコマンドSTARがあります。
(defun c:STAR ( / L P B C D E F)
(defun L (A) (polar P (* pi(/ A 180)) 600))
(setq P (getPoint "星の中心点を選択:") B (L 90.0) C (L 306.0) D (L 162.0) E (L 18.0) F (L 234.0))
(command-s "._LINE" B C D E F B "")
(princ))
ユーザーがクリックした場所を中心に、星五角形を描くコマンドです。
図形がいろいろある中このコマンドを実行したら、形が崩れてしまいました。
画面上がズームアウトされていいると、作図される個所が密集し、さらにオブジェクトスナップの影響が大きく下のような形になってしまいました。
このように、AutoLISPで点を指定して図形を描く場合でもオブジェクトスナップが影響して、プログラムしたはずの位置とは違うところに描かれる場合があります。
図形を描く自作コマンドを作った時には、オブジェクトスナップをオフにしましょう。
オブジェクトスナップの設定変更
オブジェクトスナップを管理するシステム変数は OSMODE です。
システム変更するsetvar関数を使って、
(setvar "OSMODE" 0)
で値を0にすることでオフにできます。
コマンド終了後に元の設定に戻すには、オブジェクトスナップをオフにする前にgetvar関数で既存のオブジェクトスナップ値を変数にを代入しておいて、最後にsetvar関数で戻すことができます。
(setq OS (getvar "OSMODE"))
(setvar "OSMODE" 0)
コマンド
(setvar OS)
しかし、これだとエラー中断やESCでキャンセルしたときに最後の (setvar OS) が実行されずにオブジェクトスナップがオフになってしまうのでエラー処理を入れることをおススメします。
エラー処理も忘れずに
自作コマンドの最後にオブジェクトスナップの値を戻す処理を入れておいても、ユーザーキャンセルや何かのエラーで最後まで実行されなければオブジェクトスナップが元の設定に戻りません。
なので、AutoCADの設定を変更する処理を入れたとこには、必ずキャンセル/エラーが起きた時に実行されるエラー処理に元の設定に戻す処理を入れておきましょう。
エラー処理についてはコチラの記事を参考にしてください。
対策後のコマンド
オブジェクトスナップオフとエラー処理を加えたコマンドがこちらです。
(defun c:STAR ( / *error* L P B C D E F)
;-----------------------------------------
;エラー処理
(defun *error* (msg)
(if OS (setvar "OSMODE" OS))
(princ))
;-----------------------------------------
;システム変数の変更と設定保存
(setq OS (getvar "OSMODE"))
(setvar "OSMODE" 0)
;-----------------------------------------
(defun L (A) (polar P (* pi(/ A 180)) 600))
(setq P (getPoint "星の中心点を選択:") B (L 90.0) C (L 306.0) D (L 162.0) E (L 18.0) F (L 234.0))
(command-s "._LINE" B C D E F B "")
;-----------------------------------------
;システム変数を初めの設定設定に戻す
(if OS (setvar "OSMODE" OS))
;-----------------------------------------
(princ))
まとめ
- 作図するコマンドはオブジェクトスナップも影響するので、オブジェクトスナップをオフにする。
- 最初に元の設定を変数に入れておいて、最後に戻す。
- エラー中断、ユーザーがキャンセルすることも想定してエラー処理をいれる。
関連記事
システム変数について
エラー処理(エラー中断かユーザーキャンセルされたときにされる処理)についての記事一覧
オブジェクトスナップを変更するコマンド
星を作図するコマンド
Comments