システム変数は、AutoCADの設定を決めている変数。
AutoLISP 関数のgetvar ではシステム変数の値を得ることができて、setvarでは変数の値を変更できます。
システム変数とは
システム変数は、特定のコマンドの動作をコントロールする設定です。
Autodesk Knowledge Network
システム変数は、現在の画層、レイアウト、文字スタイル、寸法設定などなど、AutoCADのいろんな設定を決めている変数です。めちゃくちゃたくさんあります。が、使うのはごく一部です。
この変数を見れば現在の設定がわかるし、この変数を変更すればAutoCADの設定を変更することができます。
システム変数の一覧はAutoCADのヘルプページ (F1で出てくる)にあります。
例 現在の画層設定のシステム変数 ”CLAYER”
現在の画層設定のシステム変数は、”CLAYER” です。この変数の中に、現在の画層の情報があり、この情報を変更すれば現在の画層も変更します。
コマンドラインに、普通のコマンドと同じように、CLAYER と入力してみてください。
このように、通常のコマンドと違い、システム変数には左側に歯車のマークが出てきます。
CLAYER は現在の画層をコントロールするシステム変数なので、ここで別の画層名を入れれば、それが現在の画層になります。
AutoLISP でシステム変数操作
AutoLISP 関数 getvar で情報を取り出す
getvar は、システム変数の値を得る機能を持ったAutoLISP関数です。
引数はシステム変数名です。
(getvar "CLAYER")
で、現在の画層名を得ることができます。
コマンドラインに入力して試してみてください。現在の画層名が戻り値になり、コマンドラインに現れます。
AutoLISP 関数 setvar で情報を上書きする
setvar は、システム変数の値を変更する機能を持ったAutoLISP関数です。
引数はシステム変数名と、上書きして新しく入れたい値です。
例えば、現在の画層を 0 にしたい場合は、
(setvar "CLAYER" "0")
と入力します。現在の画層を 0 以外にして、コマンドラインに入力して試してみてください。
現在の画層が 0 になります。
AutoLISPでシステム変数を変更することで、自作コマンド内でAutoCADの各種設定を変更することができるよ。
まとめ
- システム変数は、AutoCADのシステムをコントロールしている変数。
- システム変数をそのままコマンドラインに入力すると、変数の値を見たり変更したりできる。
- AutoLISP関数 getvar はシステム変数の情報を得る機能がある。
- AutoLISP関数 setvar はシステム変数の情報を上書きする機能がある。
関連記事
コマンドの途中でシステム変数を変更し最後に元の値に戻す。
というプログラムを作った場合、最後に元の値を戻す以前にエラーやキャンセルでコマンドが中断されることも想定する必要があります。
Comments
初めまして、貴ホームページを拝読しております。
わたくし(AutoLISPど素人)にとって、読みやすく・分かりやすいです。ありがたいです。
お願いがありまして(場違いかもしれませんが)、
下記「円を切断する(部分削除ではありません)」LISPプログラムでうまく動作するでしょうか。AutoCAD2024を使用しております。問題があるようでしたら修正のご助言をいただけないでしょうか。
目的は「円をpt1とpt2の位置で切断」したいのですが。
よろしくお願い申し上げます。
(defun c:cutc (/ os pt1 pt2 ent pt3 )
(setq os (getvar “osmode”))
(setvar “osmode” 512) ; NEA[近接点]
(setq pt1 (getpoint “\n円上の1番目の切断点:”))
(setq pt2 (getpoint “\n円上の2番目の切断点:”))
(setq ent (entget (ssname (ssget pt1) 0)))
(setq pt3 (cdr (assoc 10 ent)))
(command “break” pt1 pt2)
(command “arc” pt1 “e” pt2 pt3)
(setvar “osmode” os)
)
はじめまして。
つたないブログですが参考にしていただけたのなら幸いです。
コマンド cutc 確認しました。
ダブルクォーテーションマークが全角文字になっていました。
ダブルクォーテーションマークを半角にしたところ動作しました。
(defun c:cutc (/ os pt1 pt2 ent pt3 )
(setq os (getvar "osmode"))
(setvar "osmode" 512) ; NEA[近接点]
(setq pt1 (getpoint "\n円上の1番目の切断点:"))
(setq pt2 (getpoint "\n円上の2番目の切断点:"))
(setq ent (entget (ssname (ssget pt1) 0)))
(setq pt3 (cdr (assoc 10 ent)))
(command "break" pt1 pt2)
(command "arc" pt1 "e" pt2 pt3)
(setvar "osmode" os)
)
お世話になります。
遅くなりまして申し訳ありません。
ありがとうございました。
ご指摘の通りにしましたら出来ました。感謝しております。
勉強になりました。
今後ともよろしくお願い申し上げます。