座標読み込みでz値をラベルに表示する に掲載した SETZMARKER.LSP ファイルは、LISPを使ってカスタムコマンドを作った典型例です。

ここでは、SETZMARKER.LSP を例にして、図形を修正するプログラムによく使われる LISP の関数を解説します。

ファイル名

LISPファイルの拡張子は .LSP にします。

部分カスタマイズファイルによって自動ロードする LISPファイルの拡張子は .MNL にします。

コメント

セミコロン( ; ) より後ろ、改行までがコメントになります。

書き方のマナーとして、 ;;; はファイル先頭のコメント、 ;; は関数直前のコメント、 ; はコード内のコメントに使います。

行の途中までをコメントにするには、 ;| と |; を使います。

defun 関数

defun 関数はユーザーが関数を定義するのに使います。

(defun 関数名 ( 引数名を列挙する / ローカル変数名を列挙する )  関数本体 )

関数名にはスペースとカッコ以外のほとんどの文字が使えます。

関数名の大文字小文字は区別されません。

LISPの式は ( から始まり、 ) で終わります。


関数名を C: から始めると ARES によってコマンドとして扱われます。
コマンド扱いの関数は、引数を定義できません。ローカル変数は定義できます。

(defun C:SETZMARKER ( / ss i n el z dimz)

)

SETZMARKER.LSP ファイルには、C:SETZMARKER 関数が定義され、それはSETZMARKERコマンドとして機能します。

C:SETZMARKER 関数には、ss, i, n, el, z, dimz というローカル変数が定義されています。これらは C:SETZMARKER 関数が終了すると破棄されます(アクセスできません)。

defun は、define function の略です。

setq 関数

setq 関数は変数に値を代入するのに使います。

(setq 変数 式 ...)
(setq i 0 n (sslength ss))

setq 関数は変数1 式1 変数2 式2 ... のように指定すると、複数の変数を変更できます。

戻り値は最後に設定した値になります。

setq は、set quote の略です。

getvar 関数 と setvar 関数

getvar 関数は ARES のシステム変数を返します。

setvar 関数は ARES のシステム変数の値を変更します。

(getvar システム変数名)
(setvar システム変数名 新しい値)

システム変数の機能や内容については ARES のヘルプファイルを確認してください。

getvar は get variable の略、setvar は set variable の略です。

データの種類

ARES LISP にはいろいろな種類のデータがあります。

整数、実数、文字列、リスト、シンボル、

図形名、選択セット、ファイル識別子、ダイアログ識別子

VLAオブジェクト、バリアント、セーフ配列

C:SETZMARKER 関数のローカル変数を説明すると、

   ss 選択セット、ssget 関数で選択した複数の図形が格納されます。

   i ループカウンター、整数型

   n 選択セットの図形数、ループ終了判定に使用

   el 図形リスト、リスト entity list の略です

   z Z座標値、実数型

   dimz システム変数DIMZINを一時的に格納、整数型

となります。

図形を画面上から選択する

図形を画面上から選択するには、entsel, nentsel, ssget のいずれかの関数を使います。

(entsel プロンプト)
戻り値は、( 図形名 クリック位置)
(nentsel プロンプト)
戻り値は、( 一番内側の図形 クリック位置 クリック位置 一番外側から内側の図形 )
(ssget 指定方法 座標 フィルタ)
戻り値は、選択セット

これらの関数は使う用途が異なっています。

entsel は一般的な1個の図形を選択するときに使います。

nentsel はブロックや寸法といった複雑な図形の内部の図形を選択するときに使います。

ssget は複数の図形をさまざまな条件で選択するのに使います。

今回は1回の選択で、座標入力で作図されるブロックを複数選択したいので、ssget 関数を使いフィルターを指定します。

entsel は entity selection の略、nentsel は nested entity selection の略、ssget は selection set get の略です。

ssget関数のフィルターについて

C:SETZMARKER 関数で使っている ssget 関数のフィルターは下記のようになっています。

(setq ss (ssget '((0 . "INSERT")(2 . "JDMARKER")( 8 . "POINT"))))

フィルターを定義するには、DXF コードの知識が必要です。

( 0 . "INSERT") は、選択する図形をブロック参照(INSERT)に限るという意味です。

( 8 . "POINT") は、POINT 画層の図形のみ選択するという意味です。

( 2 . "JDMARKER") は、ブロック名が JDMARKER のブロックのみ選択するという意味です。

併せて、 POINT 画層の JDMARKER ブロックのみが選択されます。


選択セット関連の関数について

C:SETZMARKER 関数で使っている選択セット関連の関数は次の通りです。

(ssget 選択方法 座標 フィルタ)
複数図形を選択して選択セットを作成する
(sslength 選択セット)
選択セットに含まれる図形数を取得する
(ssname 選択セット 番号)
選択セットから番号指定で図形名を取得する
(setq 選択セット nil)
選択セットを破棄する

ssget - sslength - while ループ - ssname - entget は、複数図形を編集するド定番の使い方なので覚えてください。

sslength は selection set length, ssname は selection set name, entget は entity get の略です。

図形リストの操作について

C:SETZMARKER 関数で使っている図形リスト操作関連の関数は次の通りです。

(entget 図形名)
図形名から図形リストに変換する
(assoc DXFコード 図形リスト)
図形リストからDXFコードを使って項目を取得する
(cdr 項目)
項目 ( DXFコード . 値 ) から、値を取得する。
項目が座標の場合は、( DXFコード X座標 Y座標 Z座標) が (X座標 Y座標 Z座標)になる
(subst 新しい項目 古い項目 図形リスト)
図形リストの項目を差し替える
(entmod 図形リスト)
図形を更新する

図形リストは LISP の用語では 連想リスト (associative list) になっています。

連想リストは ( キー値 . 値 ) の項目が複数集まってリストになっています。

図形リストや選択セットのフィルタは、DXFコードをキー値にしています。

すべての図形リストの -1 にはその図形の図形名が格納されています。

ブロック参照(INSERT)の 10 はブロックの挿入位置で座標値です。

属性文字(ATTRIB)の 1 は属性の文字値で文字列です。

属性文字(ATTRIB)の 2 は属性の名前で文字列です。

assoc は associate with , subst は substitue , entmod は entity modify の略です。

entnext 関数 次の図形を取得する

(entnext 図形名)

ssget 関数が返す選択セットの中には、メインの図形のみ格納されます。

ブロック参照(INSERT)の従属図形の属性(ATTRIB)、ヘビーウェイトポリライン(POLYLINE)の従属図形の頂点図形(VERTEX)、ブロック参照、ヘビーウェイトポイラインの従属図形の最後を示すシーケンス終了(SEQEND)は含まれません。

SETZMARKERコマンドでは、属性(ATTRIB)図形を変更したいので、ブロック参照(INSERT)の次の図形、その次の図形にアクセスする必要があります。

entnext 関数で、ある図形の次の図形を取得できます。

図形の最後に達したら nil 値を返します。

JDMARKER ブロック参照は次のようになっています。

図形

名前

意味

INSERT

JDMARKER

メイン図形、ブロック参照

ATTRIB

NAME

点名、線名、領域名を表示する属性

ATTRIB

LENGTH

線ラベルでは長さ、面ラベルでは周長を表示する属性

点ラベルでは未使用

ATTRIB

AREA

面ラベルでは面積を表示する属性

点ラベル、線ラベルでは未使用

SEQEND

なし

点ラベルでは未使用になっている、属性名 LENGTH の属性図形の属性値に、点マーカーのZ座標値を設定しようという目論見です。

JDLOADFILE コマンドで作成した点マーカーには必ず属性名 LENGTH の 属性が含まれているので、LENGTHを見つけたところで打ち切りにしていますが、ヘビーウェイトポリラインの座標値を修正するときのように、要素数がはっきりしない場合は、SEQEND 図形の検出で entnext での次の図形の検索を打ち切りにします。

entnext は entity next の略です。

rtos 関数 と システム変数 DIMZIN の関係

ブロック参照の挿入位置(DXFコード10)は実数のリストであり、Z座標値は実数です。

(setq  z (last (cdr (assoc 10 el))))

属性(ATTRIB)の属性値は文字列で設定する必要があるので、実数を文字列に変換します。

(rtos 実数 表現方法 桁数)

rtos 関数の表現方法と桁数は省略可能です。

省略した場合はシステム変数 LUNITS と LUPREC を使います。

システム変数 LUNITS

形式

意味

1

指数表現

4.56e8 のように表示

2

十進表現

3.14 のように表示

3

建築設計

12インチ=1フィートで
1インチ未満が分数になる

4

機械設計

12インチ=1フィートで
1インチ未満が小数になる

5

分数表現

1未満が分数になる

SETZMARKER コマンドでは、(rtos z 2 4) となっているので小数点は4桁になります。

Z の値が 9.5 だったときに、"9.5" と表示するか "9.5000" と表示するかは、システム変数 DIMZIN で指定できます。

システム変数 DIMZIN

意味

0

0インチも0フィートも省略する
十進ではどちらも省略しない

1

0インチも0フィートも省略しない

2

0インチは省略、0フィートも省略しない

3

0インチは省略しない、0フィートは省略

+4

0.5000 を ".5000" にする 先頭0省略

+8

0.5000 を "0.5" にする 末尾0省略

12

4+8なので先頭の0も末尾の0も省略する

rtos は real number to string の略です。

回答が見つかりましたか?