AutoLISP 標準教科書
2025 版

株式会社 エリプス
Autodesk、Autodesk ロゴ、AutoCAD、AutoCAD LT、DWF、DWG は、
米国オートデスク社およびその他の国における登録商標です。
その他の社名および製品名は、各社の商標または登録商標です。
本書の無断複写・複製は著作権上の例外を除き、禁じられています。
本書の著作権は株式会社エリプスにあります。

序章

目次

目

本書のご使用について
1

著作権に関して

序

次章

1. 本書のご使用について・・・・・・・・・・・・・・・・・・・・・・・・・・・・・序 - 1

本書は米国 Autodesk 社が提供する AutoLISP と DCL( ダイアログ コントロール言語 ) の解説書ですが、
この AutoLISP と DCL は米国 Autodesk 社の登録商標です。
また、本書の内容及び掲載したプログラムの著作権は著者にあります。
個人で使用される以外のご使用に関しましては、著作権法の範囲内でのご使用をお願いいたします。

2

免責に関して本書の内容については正確な記述に努めましたが、著者および出版社は本書の内容とサンプルプログ
ラムに関しましては何ら保証するものでは無く、また運用した結果について責任を負いません。

第1部
第１章

AutoLISP

AutoLISP の基本

第 1 節・AutoLISP&DCL・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-2① AutoLISP とは・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-2② DCL と は・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-3③ VisualLISP エディタ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-4

AutoCAD のヘルプからの引用文には、[ 出典：AutoCAD2025 ヘルプ ] と明記して④ Visual Studio Code・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-5

おりますが、内容を損なわない範囲で筆者の言葉で書き換えた箇所もございます。

第 2 節・AutoCAD が提供する AutoLISP・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-6① ACAD.lsp と ACADDOC.lsp の自動ロードと自動実行・・・・・・・・・・・・・・・・・・・・・1-6

3

お問い合わせに関して

本書の内容に関するお問い合わせは、以下のメールアドレスでお受けいたします。
autolisp@ellipse.ne.jp② ACAD.lsp と ACADDOC.lsp の相違・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-8③ APPLOAD・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-10

第 3 節・AutoLISP の作成から実行まで・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-12① AutoLISP の書式・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-12② AutoLISP の作成から読み込み・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-13③サポートファイルの検索パスを作成する・・・・・・・・・・・・・・・・・・・・・・・・・・1-14

4

内容の訂正に関して

第 4 節・AutoLISP の式・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-16①ユーザー関数と補助関数の呼び出し方・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-16

本書の内容の訂正やプログラムの修正は、以下の Web に記載いたします。
https://www.ellipse.ne.jp/autolisp.html② AutoLISP の処理を確認する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-17③変数に値をセットする・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-19④ AutoLISP プログラム ファイル内のコメント・・・・・・・・・・・・・・・・・・・・・・・・・・1-20

第 5 節・AutoLISP のデータ タイプ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1-22
5

掲載したプログラムの取得方法に関して① AutoLISP のデータ タイプ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-22

第 6 節・AutoLISP の変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-26
本書に掲載したプログラムは、以下の Web からダウンロードできます。
https://www.ellipse.ne.jp/autolisp.html①ローカル変数とグローバル変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-26②引数とローカル変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-27③システム変数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-28

序 -1

本書のプログラムは、AutoCAD2025 で作成しました。

④システム変数を取得する getvar 関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-38

またプログラムの検証は、AutoCAD2023 と AutoCAD2024 で⑤システム変数に代入する setvar 関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-40

行いました。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-42⑥定義済み変数（定数）

目次 -1

目次

目次

2章

AutoLISP の関数

第 2 節・ユーザー入力関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-152①ユーザー入力関数（キーボード入力）・・・・・・・・・・・・・・・・・・・・・・・・・・・1-153

第 1 節・リスト操作関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-46②ユーザー入力関数（マウス＆キーボード入力）・・・・・・・・・・・・・・・・・・・・・・1-155①リストから要素を取り出す関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-47

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-166③ユーザー入力関数（キーワード）②リストに要素を加える関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-50③リストの要素を入れ替える関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-54④リストを調べる関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-59

第 3 節・ジオメトリック ユーティリティ・・・・・・・・・・・・・・・・・・・・・・・・・・・1-170①ジオメトリック ユーティリティ関数・・・・・・・・・・・・・・・・・・・・・・・・・・・1-171

第 2 節・算術演算関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 1-62

・・・・・・・・・・・・・・・・・・・・・・・・・1-173②オブジェクト スナップ（文字列で指示）①四則計算の演算関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-63②角度の演算関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-64③最大・最小の演算関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-65④論理の演算関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-65

第 3 節・文字列処理関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-66

・・・・・・・・・・・・・・・・・・・・・・1-174③オブジェクト スナップ（システム変数で設定）

第 4 節・テキスト ファイルの入出力・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-188①主なファイル処理関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-189

第 5 節・AutoLISP のエラー処理・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-198① AutoLISP のエラーコード・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-199①主な文字列処理関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-67② *error* 関数を使用する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-201

第 4 節・ジオメトリック関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-72③ *error* 関数でのエラー処理・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-202①距離のジオメトリック関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-73④ alert 関数でエラー内容をダイアログで表示・・・・・・・・・・・・・・・・・・・・・・・1-205②角度のジオメトリック関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-76⑤ UNDO コマンドでエラーを処理する・・・・・・・・・・・・・・・・・・・・・・・・・・・1-206③座標計算のジオメトリック関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-98

第 5 節・データ変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-100①実数↔整数への変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-101②文字→数値への変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-103③数値→文字への変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-106④座標系同士の変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-110⑤計測単位同士の変換関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-118

第 6 節・ 比較関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-120
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-121①比較演算関数（修飾子）②比較演算関数（論理演算子）・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-122
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-123③比較演算関数（式）第 7 節・ 条件関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-124①条件関数 (repeat、while)・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-126② 条 件 関 数 (if、cond)・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-132

第４章

オブジェクトを操作する

第 1 節・オブジェクトの処理（単一図形）・・・・・・・・・・・・・・・・・・・・・・・・・1-208
・・・・・・・・・・・・・・・・・・・・・1-209①オブジェクト処理関数（オブジェクトを取得する）
・・・・・・・・1-217②オブジェクト処理関数（オブジェクトのリストとエンティティ名を取得する）
・・・・・・・・・・・・・・・・・・・・1-222③オブジェクト処理関数（オブジェクトの削除と作成）
・・・・・・・・・・・・・・・・・・・・・・・1-223④オブジェクト処理関数（オブジェクトの更新）

第 2 節・オブジェクトの処理（複数図形）・・・・・・・・・・・・・・・・・・・・・・・・・1-235
・・・・・・・・・・・・・・・・・・・・・・・・1-236①選択セット操作関数（オブジェクトを選択）
・・・・・・・・・・・・・1-239②選択セット操作関数（オブジェクトの選択セットへの追加と削除）③選択セット操作関数（選択セットの情報を取得）・・・・・・・・・・・・・・・・・・・・・1-240

第 3 節・選択セットのフィルタ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-252①範囲を指示して選択する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-253②オブジェクト タイプで選択する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-254

第３章

AutoCAD と対話する

第 1 節・表示をコントロールする・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-140①メッセージ表示コントロール関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-141②画面の表示コントロール関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-144③コマンドラインへの表示をコントロールするシステム変数・・・・・・・・・・・・・・・・・1-146④ダイアログの表示を非表示にできる代表的なコマンド・・・・・・・・・・・・・・・・・・・1-147

目次 -2③関係演算子で選択する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-255④論理演算子で選択する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-256

第 4 節・拡張データ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-261①アプリケーション名を登録する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-263②図形に拡張データ (XDATA) を付加する・・・・・・・・・・・・・・・・・・・・・・・・・・1-264③拡張データを取得する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-267④拡張データをフィルタする・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1-270

目次 -3

目次

目次

第2部

DCL( ダイアログ コントロール言語 )第 5 節・・Radio_Button・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-50
第 6 節・・Toggle_Button ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-52
第 7 節・・Slider・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-54

第1章

ダイアログとタイルの構造

第 1 節・・ダイアログ ボックスの構成・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-2① AutoCAD が提供するダイアログ ボックス・・・・・・・・・・・・・・・・・・・・・・・・・・2-2②ユーザー作成のダイアログ ボックス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-4

第 8 節・・Popup_List・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-56
第 9 節・・List_Box ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-58
第 10 節・ Icon_Image・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-60
第 11 節・ リストの作り方・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-62① AutoLISP の最初にリストを記述する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-62

第 2 節・・base.dcl ファイルと acad.dcl ファイル・・・・・・・・・・・・・・・・・・・・・・2-5②図面の全画層名を取得して、リストを作成する・・・・・・・・・・・・・・・・・・・・・・・2-62

第 3 節・・タイルのレイアウト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-6
第 4 節・・space と width・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-11
第 5 節・・タイルの属性・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-15③外部のテキスト ファイルを読み込んで、リストを作成する・・・・・・・・・・・・・・・・・2-63

第 12 節・・コールバック関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-64
・・・・・・・・・・・・・・・・・・・・・・・2-64① Action 式コールバック（Edit_Box に記述する例）

第 6 節・・個別タイルの構成・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-18①テキストタイル・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-18②編集ボックス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-18

・・・・・・・・・・・・・・・・・・・・・・2-64② Action 式コールバック（Button に割り当てる例）

第 13 節・・エラーを回避する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-65①ファイルの呼び出し時のエラーチェック・・・・・・・・・・・・・・・・・・・・・・・・・・・2-65③トグル ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-19②データの型を変換する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-65④ラジオ ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-20③ tile が空白の場合の処理・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-66⑤ラジオ ボックス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-21⑥スライダー・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-22⑦ポップアップ リスト・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-23⑧リスト ボックス・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-24⑨イメージ タイル・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-26⑩ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-28

第 7 節・・AutoCAD の OK_Cancel ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・2-29① AutoCAD が提供する Ok_only ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・2-29② AutoCAD が提供する Ok_cancel ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・2-29③ AutoCAD が提供する Ok_cancel_help ボタン・・・・・・・・・・・・・・・・・・・・・・・・2-30

第 8 節・・ユーザー定義の OK_Cancel ボタン ・・・・・・・・・・・・・・・・・・・・・・・2-31①ユーザーが作成する Ok_cancel ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-31②ユーザーが作成する Ok_cancel_help ボタン・・・・・・・・・・・・・・・・・・・・・・・・・2-32

第2章

タイルの機能とコールバック関数

第 1 節・・ダイアログ ボックスの開始関数と終了関数・・・・・・・・・・・・・・・・・・・2-34
第 2 節・・タイル処理関数と属性処理関数・・ ・・・・・・・・・・・・・・・・・・・・・・・2-35① Set_Tile・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-36② Get_Tile・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-38

第3章

タイルをコントロールする

第 1 節・・Ok_Cancel_Help ボタン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-68
第 2 節・・図形の数を表示する・・・・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・2-77
第 3 節・・システム変数を読み込み、変更する・・・・・・・・・・・・・・・・・・・・・・・2-82
第 4 節・・図枠の数値を入力する・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-87
第 5 節・・画像でプログラムを選択する・・・・・・・・・・・・・・・・・・・・・・・・・・2-93
第 6 節・・スライダーをコントロールする・・・・・・・・・・・・・・・・・・・・・・・・2-101
第 7 節・・図枠を自動的に作成する・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2-105
第 8 節・・多角形を視覚的に作図する・・・・・・・・・・・・・・・・・・・・・・・・・・・2-111
第 9 節・・ユーザー独自の O スナップ機能を作成する・・・・・・・・・・・・・・・・・・ 2-118
第 10 節・ 拡張データ (XDATA) を付加する・・・・・・・・・・・・・・・・・・・・・・・・2-123
第 11 節・ 指定した画層に文字を記入する・・・・・・・・・・・・・・・・・・・・・・・・・2-129
第 12 節・ レイアウトページを選択する・・・・・・・・・・・・・・・・・・・・・・・・・・2-135
第 13 節・ 指定した画層にブロックを挿入する・・・・・・・・・・・・・・・・・・・・・・2-139
第 14 節・ 外部の画層ファイルを読み込み、必要な画層だけ取り込む・・・・・・・・・・2-144

第4章

ダイアログをコントロールする③ Mode_Tile・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-40

第 1 節・・ダイアログを一時的に隠す（オブジェクト情報を取得）・・・・・・・・・・・・2-150④ Action_Tile・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-44

・・・・・・・・・・・・・・・・・2-155
第 2 節・・ダイアログを一時的に隠す（位置情報を取得）

第 3 節・・Text_Tile・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-46

第 3 節・・別のプログラム（ダイアログ）を起動する・・・・・・・・・・・・・・・・・・・2-158

第 4 節・・Edit_Box ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2-48

第 4 節・・[Help] にコマンドを割り当てる・・・・・・・・・・・・・・・・・・・・・・・・・2-168

目次 -4

目次 -5

目次

INDEX
1. 本書で作成した AutoLISP & DCL・・ ・・・・・・・・・・・・・・・・・・・・・・・索引 -2

第１部 AutoLISP

2. 本書で使用した AutoLISP 関数 & システム変数・・・・・・・・・・・・・・・・・・・索引 -3
3. 本 書 で 使 用 し た 一 般 用 語・・・・・・・・・・・・・・・・・・・・・・・・・・ 索 引 -5

第 1 章 AutoLISP の基本
AutoCAD のカスタマイズ用言語である AutoLISP は他の開発言語とどのように違っているのでしょうか。

この章では以下のことを学びます。

目次 -6

第 1 節

AutoLISP & DCL

第 2 節

AutoCAD が提供する AutoLISP

第 3 節

AutoLISP の作成から実行まで

第 4 節

AutoLISP の式

第 5 節

AutoLISP のデータ タイプ

第 6 節

AutoLISP の変数

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

第1節

AutoLISP & DCL

1

1 Dialog Control Language (DCL) の特徴
ダイアログコントロール言語または略して DCL は、AutoLISP および Visual LISP の作成者がAutoLISP の歴史

ルーチンに統合できるダイアログボックスを作成できるようにするマークアップ言語です。

AutoLISP は LISP をベースとしたプログラミング言語で、AutoCAD の機能拡張の作成と利用に

つまり、AutoLISP ルーチンは、使い慣れた論理的なインターフェイスを介して、ユーザーから使用できます。

さまざまな入力データを収集できます。

この AutoLISP は 1986 年から AutoCAD で使えるようになりましたが、1997 年の AutoCAD R14

DCL がない場合、AutoLISP はコマンドラインからのみユーザー入力を取得できます。

から、基本関数の拡張や ActiveX への対応、リアクターといった機能がアドオンとして追加されました。これらの追加された関数には vl- 、vlax-、vla-、vlr- と接頭辞が付きます。

2 DCL を併用した AutoLISP のプログラム

Autodesk はこれらの言語の拡張と開発環境も含めて Visual LISP と呼び、1999 年の AutoCAD

下図のダイアログは、第 2 部 3 章 4 節で解説しているダイアログ ボックスです。

2000 からは標準で実装されました。

このダイアログ ボックスに A、B、C、D の数値を入力すると、左の図のような図枠が作成

2

AutoLISP の基本

AutoLISP の基本

1 AutoLISP とは

2 Dialog Control Language (DCL) とはされます。

AutoLISP の特徴

第2部3章4節①プログラムは何らかの値を返す関数の集合体です。
②アルゴリズムとデータは記述上リストと言われる同じ構造をしています。
③関数をデータのように扱えて、関数をプログラム実行中に生成することができます。
④リストと高階関数が使えます。

3 VisualLISP の特徴
Visual LISP は AutoLISP での開発を支援する統合開発環境（IDE ＝ Integrated Development
Environment）です。
このため Visual LISP はプログラミング言語ではなく、開発環境を指しているとも言えます。
AutoLISP のプログラム自体は、一般のテキストエディタでも書くことができますが、Visual LISP
環境を使用すると次のような利点があります。

もしダイアログ ボックスを使用しない場合は、コマンドラインに以下のようなメッセージが①プログラム開発中、AutoCAD にプログラムを簡単にロードしてテストすることができます。

表示されます。

②プログラムのステップ実行や変数値の監視などデバックに欠かせない機能を利用できます。

コマンドラインに文字だけを表示するよりは、ダイアログ ボックスを使うほうが、より視覚的③テキストエディタには、関数の検索機能や、コードを見やすくするための色分け、カッコのに分かりやすく、従って間違いも少なくなります。

対応などプログラマを支援する機能が含まれています。
④ AutoCAD の図面データベースの内容を表示させることができます。
⑤プロジェクト機能を使って、複数のファイルにまたがるプログラムの管理が容易に行えます。
⑥ VLX アプリケーションといった扱いが容易なプログラムにパッケージ化することができます。
拡張子
FAS
VLX
PRJ
PRV

1-1

形式
バイナリー
バイナリー
テキスト
テキスト

VisualLISP ファイルの拡張子
説明コンパイルされたプログラムファイル。
コンパイルされたアプリケーションファイル。
複数のファイルにまたがるプログラムを管理するプロジェクトファイル。
LISP や DCL などをまとめて、一つのパッケージを作成します。

AutoLISP とは

DCL とは1-2

第 1 章－ AutoLISP の基本

3 VisualLISP エディタ

4 Microsoft Visual Studio CodeAutoLISP を作成するために、2 つのエディタが提供されています。

1 Microsoft Visual Studio (VS) コードを利用する (AutoCAD2021 版以降 )AutoLISP の基本

従来からの [VisualLISP エディタ ] と 2021 版から使用できる [Visual Studio Code] です。

AutoLISP の基本

第 1 章－ AutoLISP の基本

システム変数 (LISPSYS) で、AutoLISP の開発環境を変更できます。
LISPSYS <0>・・・・・AutoCAD 付属の VisualLISP エディタ

1 VisualLISP エディタを利用する① [ 管理 ] タブ -> [ アプリケーション ] パネル -> [Visual LISP エディタ ] から開きます。

LISPSYS <1><2>・・・Microsoft 提供の Visual Studio (VS) コード

AutoLISP 開発環境を切り替えるには、

AutoCAD 2020 以前 のエディタ
日本語が正しく表示されないときは、
プルダウンメニューの [ ツール ] →システム変数 LISPSYS の現在の値を変更した後、AutoCAD の再起動が必要です。

[ ウィンドウの属性 ] → [ フォント ]既定のエディタとして Visual LISP IDE (VL IDE) が設定されますが、AutoLISP 関数はから、日本語を選択します。
0
括弧や変数、文字が色分けして表示されます。

AutoLISP ソース (LSP) ファイルは、保存およびコンパイル時に ASCII (MBCS) 文字セットを使用します。
既定のエディタとして Visual Studio (VS) Code が設定され、AutoLISP 関数は Unicode 文字

編集可能なファイルは、LISP、DCL、SQL、C/C++、SLD ファイルです。
② AutoLISP だけでなく、DCL の作成も可能です。

Unicode 文字を完全にはサポートしません。

1を完全にサポートします。
AutoLISP ソース (LSP) ファイルは、保存時は VS Code のエンコード セットを使用し、コンパイル時は Unicode 文字セットを使用します。
既定のエディタとして Visual Studio (VS) Code が設定され、AutoLISP 関数は Unicode 文字

2

を完全にサポートします。
AutoLISP ソース (LSP) ファイルは、保存時は VS Code のエンコード セットを使用し、コンパイル時は ASCII (MBCS) 文字セットを使用します。

AutoCAD 2021 以降は UNICODE をベースとした文字列の扱いになりました。
AutoCAD で文字列を表示したり、AutoLISP のプログラムを書くのも UNICODE を使います。
従前の SHIFT_JIS は扱えません。
UNICODE でプログラミングする場合は、新しいシステム変数 LISPSYS を 1 または 2 にします。

1-3

CDL も括弧や変数、文字が色分けして表示されます。

このシステム変数を 0 以外にすると AutoLISP の開発環境が Visual LISP から Visual Studio Code

また、コメントは背景色がグレーで表示されます。

に変更になります。

VisualLISP エディタ

Visual Studio Code1-4

第 1 章－ AutoLISP の基本

第2節

第 1 章－ AutoLISP の基本

AutoCAD が提供する AutoLISP

1 ACAD.lsp と ACADDOC.lsp の自動ロードと自動実行

2 2 つの LSP の保存場所と内容
起動時や図面を開くたびにロードされる 2 つの LISP プログラム（acad20**.lsp と acad20**doc.
lsp）は、テキスト ファイルですからテキスト エディタで確認できます。

1 AutoCAD の起動時に自動的に図面内に読み込まれる AutoLISP① ACAD.LSP と ACADDOC.LSP です。この 2 つのファイルは、AutoCAD のバージョンによって、

AutoLISP の基本

AutoLISP の基本

インストールされている場所は、初期値では (Program Files¥Autodesk¥ACAD 20**¥support) にあります。( バージョンによって変わる場合があります。
）
acad20**doc.lsp

acad20**.lsp

ACAD20**.LSP または ACAD20**.LSP となっています。
② ACAD.LSP ファイル（AutoCAD が起動した直後に、一度だけロードされます。）
特定の AutoLISP プログラムを常に使用する場合は、acad.lsp ファイルに記述します。
AutoCAD を起動すると、サポート ファイル検索パスを使用して acad.lsp ファイルが検索されます。acad.lsp ファイルが見つかると、メモリにロードされます。
③ ACADDOC.LSP ファイル（図面を開くごとに、ロードされます。）
acaddoc.lsp ファイルは、各ドキュメント ( 図面 ) の初期化に使用することを目的としています。このファイルは、新しい図面を開始するたびに ( または、既存の図面を開くたびに ) 使用できる AutoLISP プログラムのライブラリをロードしたいときに使用します。
④既定では、acad.lsp ファイルは AutoCAD の起動時に 1 回しかロードされませんが、
acaddoc.lsp ファイルはそれぞれのドキュメント ( 図面 ) が開かれるたびにロードされます。
つまり、acad.lsp ファイルの読み込みはアプリケーションの起動ルーチンの一部であり、
acaddoc.lsp ファイルの読み込みはドキュメントの初期化処理の一部であると言えます。

Autodesk\AutoCAD 20**\Support\

ユーザーが作成した AutoLISP は、この lisp に追加することは可能ですが、
AutoCAD が提供する acad.lsp と acdadoc.lsp の内容を編集することはできません。
acad20**.lsp

また、これらの起動ファイルの既定の動作は、システム変数 ACADLSPASDOC の設定によりacad.lsp の初期値は <0> ですが、システム変数 (acadlspasdoc) で変更できます。

実行可能ファイルのロード元を信頼できるフォルダのみに制限するシステム変数。

0
1
2

1-5

システム変数（secureload）
警告を表示せずに、すべての場所から実行可能ファイルをロードします。（非推奨）実行可能ファイルが、システム変数 TRUSTEDPATHS で指定された信頼する場所にある
場合にのみロードします。
実行可能ファイルの場所が、システム変数 TRUSTEDPATHS で指定されている場合にのみロードすることができます。

AutoCAD が提供する AutoLISP

acad.lsp の内容の一部抜粋(if (not (= (substr (ver) 1 11) "Visual LISP"))(load "acad20**doc.lsp"))

変更できます。

システム変数（acadlspasdoc）
acad.lsp ファイルをすべての図面にロードするか、セッションで開かれる最初の図面だけにロードするかをコントロールします。
（初期値 : 0）0
セッションで開かれた最初の図面にのみ acad.lsp をロードします。
1
図面が開かれるたびに acad.lsp をロードします。

Autodesk\AutoCAD 20**\Support\ja-jp\;; Silent load.
(princ)acad.lsp にユーザー定義を記述した例 (P1-79)

acad20**doc.lsp

acaddoc.lsp の内容の一部抜粋(defun ai_AppLoaded (appname apptype)(apply 'or(mapcar'(lambda (j)(wcmatch(strcase j T)
acaddoc.lsp にユーザー定義を記述した例 (P1-79)

AutoCAD が提供する AutoLISP

1-6

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

2 ACAD.lsp と ACADDOC.lsp の相違① acaddoc.lsp ファイルは、各ドキュメント ( 図面 ) の初期化に使用することを目的としています。

AutoCAD が提供する ACAD.LSP（最初の図面でのみ有効 < 初期値 >）①特定の AutoLISP プログラムを使用する場合は、acad.lsp ファイルに追加して記述します。
AutoCAD を起動すると、サポート ファイル検索パスを使用して acad.lsp ファイルが検索されます。acad.lsp ファイルが見つかった場合、それがメモリにロードされます。
② AutoCAD を起動すると、各図面セッションが開始されるたびに acad.lsp ファイルがロードされます。 acad.lsp ファイルは、アプリケーション固有の起動ルーチン用に使用することを目的としているため、acad.lsp ファイル内で定義されているすべての関数と変数は、最初の図面でのみ有効です。すべての図面で使用できるようにするには、そのルーチンを acad.lsp ファイルから acaddoc.lsp に移動します。

このファイルは、新しい図面を開始するたびに ( または、既存の図面を開くたびに ) 使用できる AutoLISP ルーチンのライブラリをロードします。
② AutoCAD を起動すると、プログラムは、ライブラリ パスで acaddoc.lsp ファイルを検索します。このファイルが見つかると、メモリにロードされます。acaddoc.lsp ファイルは、システ
ム変数 ACADLSPASDOC の設定に関係なく、常に各図面に対してロードされます。
③ユーザーは、すべての AutoLISP ルーチンに対して 1 つの acaddoc.lsp ファイルを持ちます。
AutoCAD は、ライブラリ パスで定義されている順序で acaddoc.lsp ファイルを検索します。
したがって、この機能を使用すると、各図面フォルダ内に異なる acaddoc.lsp ファイルを格納でき、特定の種類の図面や特定の作業用に特定の AutoLISP プログラムをロードすることがで③ acad.lsp と acaddoc.lsp の機能は、システム変数 ACADLSPASDOC で変更できます。システム
変数 ACADLSPASDOC を 0( 既定 ) に設定すると、acad.lsp ファイルがアプリケーション起動時に 1 度だけロードされます。ACADLSPASDOC を 1 に設定すると、acad.lsp ファイルは新しい図面を開始するたびに再ロードされます。
④ acad.lsp ファイルには、1 つ以上のルーチンの AutoLISP プログラムを格納できますし、一連きます。
④ acaddoc.lsp ファイルには、1 つ以上のルーチンの AutoLISP プログラムを格納できますし、
一連の load 関数の呼び出しだけを格納することもできます。後者の方法の方が、修正が容易になります。次のコードを acaddoc.lsp ファイルとして保存すると、新しいドキュメントが開かれるたびに MyLISP4.lsp、MyLISP5.lsp、MyLISP6.lsp の各ファイルがロードされます。

の load 関数の呼び出しだけを格納することもできます。後者の方法の方が修正が容易になります。
次のコードを acad.lsp ファイルとして保存すると、各図面セッションが開始されるたびに
MyLISP1.lsp、MyLISP2.lsp、MyLISP3.lsp の各ファイルがロードされます。

(load "MyLISP4")(load "MyLISP5")(load "MyLISP6")(load "MyLISP1")(load "MyLISP2")(load "MyLISP3")

予約済みの acaddoc.lsp ファイルは変更しないでください。Autodesk が提供する
予約済みの acad.lsp ファイルは変更しないでください。Autodesk が提供する acad.lsp ファ

acaddoc.lsp ファイルには、AutoCAD が必要とする AutoLISP 定義関数が含まれています。

イルには、AutoCAD が必要とする AutoLISP 定義関数が含まれています。このファイルは、

このファイルは、acaddoc.lsp ファイルがロードされる直前にメモリにロードされます。

acad.lsp ファイルがロードされる直前にメモリにロードされます。

1-7

ACAD.lsp

ACADDOC.lsp

1-8

AutoLISP の基本

AutoCAD が提供する ACADDOC.LSP（すべての図面で有効）

1 ACAD.LSP
AutoLISP の基本

2 ACADDOC.LSP

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

2 ACAD.lsp と ACADDOC.lsp の相違① acaddoc.lsp ファイルは、各ドキュメント ( 図面 ) の初期化に使用することを目的としています。

AutoCAD が提供する ACAD.LSP（最初の図面でのみ有効 < 初期値 >）①特定の AutoLISP プログラムを使用する場合は、acad.lsp ファイルに追加して記述します。
AutoCAD を起動すると、サポート ファイル検索パスを使用して acad.lsp ファイルが検索されます。acad.lsp ファイルが見つかった場合、それがメモリにロードされます。
② AutoCAD を起動すると、各図面セッションが開始されるたびに acad.lsp ファイルがロードされます。 acad.lsp ファイルは、アプリケーション固有の起動ルーチン用に使用することを目的としているため、acad.lsp ファイル内で定義されているすべての関数と変数は、最初の図面でのみ有効です。すべての図面で使用できるようにするには、そのルーチンを acad.lsp ファイルから acaddoc.lsp に移動します。

このファイルは、新しい図面を開始するたびに ( または、既存の図面を開くたびに ) 使用できる AutoLISP ルーチンのライブラリをロードします。
② AutoCAD を起動すると、プログラムは、ライブラリ パスで acaddoc.lsp ファイルを検索します。このファイルが見つかると、メモリにロードされます。acaddoc.lsp ファイルは、システ
ム変数 ACADLSPASDOC の設定に関係なく、常に各図面に対してロードされます。
③ユーザーは、すべての AutoLISP ルーチンに対して 1 つの acaddoc.lsp ファイルを持ちます。
AutoCAD は、ライブラリ パスで定義されている順序で acaddoc.lsp ファイルを検索します。
したがって、この機能を使用すると、各図面フォルダ内に異なる acaddoc.lsp ファイルを格納でき、特定の種類の図面や特定の作業用に特定の AutoLISP プログラムをロードすることがで③ acad.lsp と acaddoc.lsp の機能は、システム変数 ACADLSPASDOC で変更できます。システム
変数 ACADLSPASDOC を 0( 既定 ) に設定すると、acad.lsp ファイルがアプリケーション起動時に 1 度だけロードされます。ACADLSPASDOC を 1 に設定すると、acad.lsp ファイルは新しい図面を開始するたびに再ロードされます。
④ acad.lsp ファイルには、1 つ以上のルーチンの AutoLISP プログラムを格納できますし、一連きます。
④ acaddoc.lsp ファイルには、1 つ以上のルーチンの AutoLISP プログラムを格納できますし、
一連の load 関数の呼び出しだけを格納することもできます。後者の方法の方が、修正が容易になります。次のコードを acaddoc.lsp ファイルとして保存すると、新しいドキュメントが開かれるたびに MyLISP4.lsp、MyLISP5.lsp、MyLISP6.lsp の各ファイルがロードされます。

の load 関数の呼び出しだけを格納することもできます。後者の方法の方が修正が容易になります。
次のコードを acad.lsp ファイルとして保存すると、各図面セッションが開始されるたびに
MyLISP1.lsp、MyLISP2.lsp、MyLISP3.lsp の各ファイルがロードされます。

(load "MyLISP4")(load "MyLISP5")(load "MyLISP6")(load "MyLISP1")(load "MyLISP2")(load "MyLISP3")

予約済みの acaddoc.lsp ファイルは変更しないでください。Autodesk が提供する
予約済みの acad.lsp ファイルは変更しないでください。Autodesk が提供する acad.lsp ファ

acaddoc.lsp ファイルには、AutoCAD が必要とする AutoLISP 定義関数が含まれています。

イルには、AutoCAD が必要とする AutoLISP 定義関数が含まれています。このファイルは、

このファイルは、acaddoc.lsp ファイルがロードされる直前にメモリにロードされます。

acad.lsp ファイルがロードされる直前にメモリにロードされます。

1-7

ACAD.lsp

ACADDOC.lsp

1-8

AutoLISP の基本

AutoCAD が提供する ACADDOC.LSP（すべての図面で有効）

1 ACAD.LSP
AutoLISP の基本

2 ACADDOC.LSP

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

2 一時的に使用する

3 APPLOAD[ アプリ ロード ]① AutoLISP を一時的に使用するには、APPLOAD[ アプリ ロード ] コマンドを使い、表示される

AutoLISP の基本

AutoLISP の基本[ アプリケーションのロード / ロード解除 ] パネルに表示される LISP を指定します。

1 常時使用する① AutoLISP を常時使用するには、APPLOAD[ アプリ ロード ] コマンドを使い、表示される[ アプリケーションのロード / ロード解除 ] パネルにある [ スタートアップ登録 ] で指定します。

② [ アプリケーション ] パネル → [ アプリロード ] を使います。
[ アプリケーションのロード / ロード解除 ] パネルに表示される AutoLISP を選択して、[ ロード ] ボタンを押します。
② [ アプリケーション ] パネル → [ アプリロード ] を使います。
[ アプリケーションのロード / ロード解除 ] パネルの [ スタートアップ登録 ] で常時使用する
LISP を指定します。

③ロードした AutoLISP は、その図面内でのみ有効です。
新規の図面や他の図面で使用するためには、再度 AutoLISP をロードする必要があります。
③ [ スタートアップ登録 ] の [ 追加 ] ボタンを押して、使用する LISP を指定します。

④正常にロードされた時は、コマンドラインに通知されます。

どの図面に対しても、LISP は使用できます。

もし、LISP に誤りがあるときは、その旨通知されますが、誤りの箇所はわかりません。

1-9

AutoLISP をロードする

AutoLISP をロードする

1-10

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

AutoLISP の作成から実行まで[ ツール ] → [AutoLISP] → [Visual LISP エディタ ] を用いて作成しますが、Windows 付属のAutoLISP の基本[ メモ帳 ] や [ ワードパット ] などのテキスト エディタでも作成できます。
Visual LISP エディタで記述

メモ帳で記述1 AutoLISP の書式

2 AutoLISP の作成から読み込み
線分を描くプログラムを作成して、LISP プログラムの作成から実行までの流れは以下の通りです。
① Visual LISP エディタを開き、線分プログラム (MyLine.lsp) を作成します。

AutoLISP の基本

第3節（拡張子は、lsp になります。
）②このファイルの名前を <MyLine.lsp> にして、AutoCAD と同じフォルダに保存します。
または、保存したフォルダに AutoCAD のサポート ファイルの検索パスを通します。

(defun C:Myline( / p1 p2)(setq p1 (getpoint "¥n 始点を指示："))(setq p2 (getpoint p1 "¥n 終点を指示："))(command "LINE" p1 p2 "")(princ))

最初の左括弧 < ( > から、最後の右括弧 < ) > までが、1 つのプログラムになります。
defun・・・関数の宣言です。
C:・・・関数名（この場合は <MyLine>）の前に C: を付けると、自分の関数を AutoCAD のコマンドと同じ様に使うことができます。
もし、付けない場合 <defun MyLine()> では、コマンドラインから <(MyLine)> のように括弧でくくって呼び出さないといけません。

MyLine・・自分が作成した関数です。拡張子の lsp は必要ありません。
（） ・・変数を記述します。強制ではありませんが、空白にして変数を使用した場合は、③プルダウンメニューから [ ツール ] → [AutoLISP]→ [ アプリケーション ロード ] を選択します。
④又は、[ 管理 ] タブ→ [ アプリケーション ] パネル→ [ アプリロード ] を選択します。

プログラムが終了した後でも、変数がメモリーに残ります。
ただし、変数が無くても ( ) は必要です。

defun<declare function>

1-11

AutoLISP の作成から実行まで

AutoLISP の作成から実行まで

1-12

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本④ [ アプリケーションのロード / ロード解除 ] ダイアログから <MyLine.lsp> を選択します。
[ ロード］ボタンを押して、メモリに読み込みます。

3 サポート ファイルの検索パスを作成する① [ ツール ] → [ オプション ] ダイアログを開きます。

AutoLISP の基本

AutoLISP の基本[ ファイル ] タブの [ サポート ファイルの検索パス ] をクリックします。

⑤正常に読み込まれた LISP ファイルは、[ ロードされたアプリケーション ] の中に登録されています。
この中にロードされた LISP は、キーボードから LISP 名を入力することによって使用できます。

② [ 追加 ] ボタンを押します。
ユーザー専用のファイル保存フォルダを指定します。
（指定するフォルダは予め作成しておきます。
）⑥ AutoCAD のコマンドラインから、<MyLine> と入力します。（拡張子の lsp は要りません。）
コマンドラインに < 始点を指示：> のメッセージが出ます。
マウスで点 P1 を指示すると、次に < 終点を指示：> のメッセージが出ます。
終点 (P2) を指示すると、点 P1 と点 P2 間に線分が作図されます。

P2

P1

プログラムのメンテナンスを考慮すると、AutoCAD のフォルダとは別のフォルダを作成し、プログラム専用のフォルダにした方が良いでしょう。

1-13

AutoLISP の作成から実行まで

AutoLISP の作成から実行まで

1-14

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

第4節

AutoLISP の式

2 AutoLISP の処理を確認する

数を使用するのと同じように AutoCAD のコマンド ラインや AutoLISP の他の式で使用できます。

コマンドラインからでも、LISP は使えます。

コマンドは関数の特殊な形式にすぎないので、ユーザー独自の AutoCAD コマンドを作成すること

キーボードから次のように入力します。

ができます。

コマンドラインの次の行にメッセージが表示されます。

(+ 3 2)5

一般的に AutoCAD が提供する関数を組み込み関数と呼ばれ、ユーザーが作成した AutoLISP など

このように加算は < + > ですが、引き算は < - >、掛け算は < * >、割り算は < / > の記号を使用の関数はユーザー関数とか補助関数と呼ばれています。

します。また、式の始めと終わりは必ず（）で囲まれていなければいけません。

ユーザー関数の書式は次のように、関数名の前に <C:> を付加します。
(defun C:MyLisp() )・・・ユーザー関数① AutoLISP は、括弧で囲まれた中に関数や数値をスペースで区切って表します。
括弧は式の重要な要素です。すべての括弧は対を構成しなければなりません。

また、補助関数の書式では次のように、関数名の前には <C:> は必要ありません。

つまり、どの左括弧にもそれに対応する右括弧が必要です。

(defun MyLISP() ) ・・・補助関数② AutoLISP の式は、何かの関数 ( 演算子 ) とそのあとに計算される項目を含んでいる必要があ
このユーザー関数や補助関数では、関数名の前に defun<declare function> を付けて、LISP 関数

ります。計算される項目を関数の引数とも呼びます。

であることを宣言します。

したがって、( + 3 2 ) では、+ が関数、数値 3 と 2 が引数になります。

<C:> を付けたユーザー関数と付けない補助関数の呼び出し方の違いを以下に示します。
③上の式で、式の関数と引数との区切りにスペースを使っていることに注意してください。

1 ユーザー関数と補助関数の呼び出し方
DEFUN

不要ですが、式が複雑になったときに読みやすくするためにスペースを入れることは構いません。

関数を定義します。

AutoCAD のコマンド名を定義します。C: を付けると AutoCAD と同じように使用出来ます。
C: を付けない場合は、コマンドラインからの入力時に関数名を () で囲みます。

④ AutoLISP では、括弧の中の 1 番目が関数の名前である場合、これを式と認識してその結果を返します。しかし、1 番目が LISP の関数でない場合は、エラーになります。
（式の中では、単なるリストと認識して、そのまま文字列または数値を返すこともあります。
）( 例 ) ( / 10 2 )① (defun C: MyLisp ()・・・・・

括弧の中の要素の間にはかならずスペースが必要です。括弧と式の要素の間にはスペースは→ コマンド ラインから、MyLisp と入力します。

)( 10 2 )→5→; エラー : 関数が間違っています :通常の表記② (defun MyLisp ()・・・・・→ コマンド ラインから、(MyLisp) と入力します。

LISP の表記

結果(2+3)×(4-2)( * ( + 2 3 ) ( - 4 2 ))10

( 9 + 3)÷6(/ (+9 3) 6)

2(2 + 4 - 3) ×5( * ( - ( + 2 4 ) 3 ) 5)

15)

メモリーに読み込む時は、どちらも (load "MyLisp") ですが、実行時に ( ) を付けるか付けないかの違いです。

1-15

AutoLISP の式

AutoLISP の式

1-16

AutoLISP の基本

AutoLISP の基本

AutoLISP では、ユーザー自身が関数を定義できます。一度定義すると、それらの関数を標準の関第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

必要な括弧の数が表示されます。

setq 関数

コマンド：( + 3 2

AutoLISP の基本

3 変数に値をセットする(_ >・・・括弧が 1 つ足りないので ) を入力する。

5

・・・答えが表示される。

変数に値を代入します

AutoLISP の基本⑤ AutoLISP で一番よく起きるエラーは、括弧の付け忘れです。その場合は、LISP が終わるまでに変数に値をセットする関数です。同じ機能に <'>( アポストロフィー ) があります。
変数 [pt] に値 <10.0> をセットするには、）を 1 つ入力します。

正しく計算されます。

→ (setq pt 10.0) または、(setq pt '10.0) となります。
①一般的なプログラムでは、変数に値を代入するには、（変数が a、値が 10 の場合）
→ a = 10
② LISP では、setq という関数を使います。上記の例では→ ( setq a 10 )③値が文字 ( AutoCAD ）の場合は、文字列を <" "> で囲みます。

⑥ 他のファイルからテキストをクリップボードにコピーして、コマンドラインに貼り付けることも可能です。
（P1-33 box1.lsp の①から③を貼り付けました。）
Step-1 （左図）メモ帳に記述した 3 行の文字列。 （右図）マウスで選択して、コピーします。

→ ( setq a “AutoCAD” )このように、AutoLISP の変数には、数値や文字列が代入できます。
list 関数

任意の数の式を受け取り、それらを 1 つのリストに結合します

複数の要素を 1 つのリストにします。
変数 [pt] に複数の要素 <10.0 20.0> をセットするには、→ (setq pt (list 10.0 20.0)) または、(setq pt '(10.0 20.0)) となります。

Step-2

AutoCAD のコマンドラインから、右ボタンを押して [ 貼り付け ] を選びます。

変数に 2 つ以上の値を代入する場合④ 2 次元の点 (X 座標、Y 座標 ) では
→ ( setq a ‘(10.0 20. 0))

または、 (setq a (list 10.0 20.0))⑤代入する値が 3 次元座標 (X,Y,Z) の場合は→ ( setq a ‘(10.0 20.0 30.0 )) または、 (setq a (list 10.0 20.0 30.0))
Step-3

貼り付けた文字列を順番に処理して、作図を行います。（長方形が作図されました）⑥変数の値を確認するには、！（感嘆符）を使います。
キーボードから、( setq a ‘(10.0 20.0 30.0 )) と入力した後に、! a と入力します。
コマンドラインに < (10.0 20.0 30.0)> の数値が表示されます。

1-17

AutoLISP の式

AutoLISP の式

1-18

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

AutoLISP の基本

AutoLISP のプログラムにコメントを記述することは大切です。
コメントはプログラムの作成者だけでなく、将来他のプログラマが必要に応じてプログラムを改良する時に有益です。

2 プログラムの使用方法の説明にコメントを付けます。
;-------------------------------------------------------------------------------------------------------;;<<<<< リストの処理 >>>>>

AutoLISP の基本

4 AutoLISP プログラム ファイル内のコメント; イメージ ファイルとテキスト ファイルを順番に読み込んで、DCL に表示する。
; 各ファイルは、AutoCAD のパスの通ったディレクトリに保存しておくこと。

コメントは以下のような場合に作成します。
①プログラム ファイル名、サブ関数名、DCL ファイル名などを明記する。
② LISP プログラムの使用方法などを明記する。
③ LISP プログラム内に、適宜コメントを挿入する。
コメントは 1 つ以上のセミコロン < ; > で始まり、その行の終わりまで続きます。
改行ごとに、その行の初めにセミコロン < ; > を付けます。
プログラムの中にコメントを入れる場合は、< ;||; >（インライン コメント）の形になります。

この中の全ての文字は無視されます。

;-------------------------------------------------------------------------------------------------------;(defun make_list_box(make-image-list file-name-list / rep-num rep-start)(start_list make-image-list)(setq rep-start 0)(setq rep-num (length file-name-list))(repeat rep-num(add_list (nth rep-start file-name-list))(setq rep-start (1+ rep-start)))(end_list)

1 LISP プログラムの名前や関数名、作成者名、作成日等を記述します。

プログラムの先頭に以下のように、判りやすいレイアウトで作成するのが良いでしょう。

3 プログラム内の注釈にコメントを付けます。
①１行コメント
コメントは 1 つ以上のセミコロン ( ; ) で始まり、その行の終わりまで続きます。
(start_image "pop_w1a")(fill_image 0 0 x y -2); タイルを -2 の色で塗り潰し(slide_image 0 0 x y (nth image-num sub-name-list)) ; スライドファイルを表示(end_image)②インライン コメント
( ;|・・|; ) 内のすべてのテキストは無視されます。これにより、コメントを 1 行のコード内に入れたり、複数の行に続けることができます。

(command "layer" "on" "g_wan" "s" "g_wan" "")< ; > が必要なのは行の先頭だけですから、それ以降は自由にレイアウトを組むことができます。
LISP プログラム全体に同じデザインで統一すれば、他のプログラマが参考にする場合にも判りや
すくなります。

(command "circle" a_e 0.00211)(command "layer" ;| 画層を初期値にセット |;"s" "0" "")(command "layer" "lo" "g_wan" "off" "g_wan" "")関数名以外では、新規作成日や修正の履歴や作成者も記述しておきます。

1-19

AutoLISP の式

AutoLISP の式

1-20

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

AutoLISP のデータタイプ

2 文字列
文字列はテキストのことです。文字列は LISP の式のプロンプトによく使われますが、LISP で

1 AutoLISP のデータタイプ

操作することもできます。

AutoLISP で使用される主要なデータ タイプの例を示します。

Point!

データをタイプに分けることでデータを正確に評価できて、プログラムを迅速に実行できます。
番号
①
②
③
④
⑤
⑥
⑦
⑧

データ タイプ

整数
実数
文字列
リスト
選択セット
図形名
FILE（ファイル ディスクリプタ）
SYM（シンボル）
SUBR（定義関数名）(prompt “AutoCAD” )AutoLISP の基本

AutoLISP の基本

第5節

コマンドラインに <AutoCAD> の文字が表示される。

例

10
0.314
“abc”
文字列は、 “ と “ で囲まれます。
(10.0 20.0 30.0 )<Selection Set : 1>
<Entity name : 60000014c><File : a2165>
pt1
MyLine.lsp

1 整数と実数(setq A “LISP” )変数Ａに LISP の文字がセットされる。

prompt はコマンドラインに文字を表示させる関数です。
setq は次の変数にその後の数値や文字を代入させる関数です。

3 リスト
データ要素を並べて括弧で囲んだものをリストと呼びます。リストは AutoLISP の基本データ構
造です。

整数は、-2,147,483,648 から +2,147,483,647 以内のすべての整数です。整数だけを含む式の値は、常に整数になります。
たとえば、 ( / 25 2) の値は 12 です。12.5 にはなりません。LISP は計算結果の小数部を切り捨てて整数にします。
これに対して、実数は小数部を含む値です（浮動小数点）。上の式を使って( / 25 2.0 ) とすると、その値は 12.5 になります。
整数の 12 はつねに 12 です。実数の 12.345 と 12.346 は同じではありませんが、小数点以下の桁を切り捨てれば同じになってしまいます。

リストには、整数、実数、文字列などがいくつあっても、また混在していても構いません。
また、リストの中にリストが入っていても（入れ子）構いません。
リストには 2 つのタイプがあります。
1 つは、計算を目的とするもの。もう 1 つは、複数のデータ（要素）を組み合わせて 1 つのセッ
トにすることを目的とするものです。この代表には、X,Y,Z の座標値があります。
Point!
( + 2 3 )

括弧の中が計算されて、5 が返される。

( 5.0 10.0 15.0 )最初の 5.0 がＸ座標、二番目の 10.0 がＹ座標、整数のこの明快な性質は、個数をカウントするような用途に向いています。一方、実数は座標値や角度などを正確に計算する場合に向いています。

最後の 15.0 が Z 座標の組み合わせになる。
Point!
( * 25 2 )12( * 25.0 2 )12.5

4 選択セット
選択セットは、複数の図形（エンティティ）の集まりのことです。
対話形式で、選択セットに図形を追加したり、削除することができます。
Point!

実数の表記では、最初の 0 は省略できません。つまり、0.314 は .314 とはできません。
LISP では、0.1 と -0.1 との間をとる実数は必ず 0 から始まります。

1-21

AutoLISP のデータタイプ

直前に選択された選択セット（選択された図形群）を、シンボル ss1 へ
割り当てます。
(setq ss1 (ssget "P"))

返り値 <SelectionSet 1>

AutoLISP のデータタイプ

1-22

第 1 章－ AutoLISP の基本

5 図形名

8 SUBR< 定義関数名 >AutoCAD の図形 ( オブジェクト ) を基本図形 ( エンティティ ) と呼んでいます。

SUBR は AutoLISP 関数またはコンパイル済み関数です。

この基本図形は、作図コマンド (Line や Arc) によって描かれて、個別にユニークな識別番号が与

これらの関数には、四則計算のような単純な演算子から、指定するオブジェクトの情報を図面えられます。

データベースから取得するための複雑なものまであります。

この名前は英数字のコードで、図面内でその図形 ( オブジェクト ) をユニークに識別するものです。
この名前を使って AutoLISP はオブジェクトを選択し、処理しています。

Point!

基本図形名は、AutoCAD が自動的に割り当てるもので、ユーザーが決めることはできません。
また、ファイルが変われば、基本図形名も変わります。
Point!

AutoLISP の基本

AutoLISP の基本

第 1 章－ AutoLISP の基本

defun またはロード時に指定した名前を以下に示します。

SUBR

組み込みのコンパイル済み関数

EXRXSUBR

外部 ARX 関数

USUBR

ユーザー定義関数

図形を選択する関数 (entsel) で図形を指示すると、下記のような情報がコマンドラインに表示されます。この中の < > 内が図形名です。

データ タイプを確認する(<Entity name : 60000022> (50.0 50.0 0.0)
図形名

指示した座標TYPE

6 FILE（ファイル ディスクリプタ）

変数のデータ タイプを確認します。

① (setq pt (list 10 20 30))

AutoLISP は、ディスクのテキストファイルを読み書きできます。

→ コマンド ラインに !pt と入力すると、(10 20 30) が表示されます。

ファイル ディスクリプタ（記述子）は、あらかじめ開いておいたファイルにプログラムからアク→ コマンド ラインに (TYPE pt) と入力すると、LIST が表示されます。

セスするときに使用します。つまり、ファイル ディスクリプタ（記述子）とは目的のファイルを示す変数と考えられます。

② (setq text1 "AutoLISP")→ コマンド ラインに !text1 と入力すると、"AutoLISP" が表示されます。

Point!
(setq text1 (open File_A “r” ))テキストファイル (File_A) を読み込みモードで→ コマンド ラインに (TYPE text1) と入力すると、STR が表示されます。

開いて、変数 text1 にセットする。
(close text1)

オープンしているファイル (text1) を閉じる。
最後は、必ずこの記述が必要。

7 シンボルAutoLISP では、シンボルを用いて値を格納します。
シンボル名は大文字と小文字を区別せず、下記を除く任意の英数字及び特殊記号の組み合わせを使用できます。
(
)
.
'
"
;

1-23

シンボル名で使用できない文字( 左括弧 )
( 右括弧 )( ピリオド )( アポストロフィ )( クォーテーション )( セミコロン )AutoLISP のデータタイプ

TYPE 関数が返すデータ タイプを以下の表に示します。
返り値
ENAME
EXRXSUBR
FILE
INT
LIST
PAGETBPICKSETREALSAFEARRAY
STR
SUBR
SYM
VARIANT
VLA-object
nil

データ タイプ
図形名
外部 ObjectARX アプリケーション
ファイル ディスクリプタ
整数リスト
関数ページング テーブル
選択セット
実数
セーフ配列
文字列
LISP ソース ファイルからロードされたユーザー定義関数
シンボル
バリアント
ActiveX オブジェクト
値が無い

AutoLISP のデータタイプ

1-24

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

第6節

AutoLISP の変数

引数は別の関数から特定の値を持った変数を関数内に取り込みます。
従って、引数は [ 受け取る変数 ] とも言えます。

ローカル変数は、1 つの関数内だけに使用され、プログラムが終了するとその値は無くなり (nil)AutoLISP の基本

AutoLISP の基本

1 ローカル変数とグローバル変数

2 引数とローカル変数

それに対して、ローカル変数を [ 与える変数 ] とも言えますます。
グローバル変数は、定義関数の外でも有効です。そのため、関数間でその値を共有できます。
AutoLISP における、ローカル変数とグローバル変数の関係は次のようになります。

AutoLISP における、引数とローカル変数の関係は次のようになります。
(defun MyLisp ( 引数 < 与える変数 > / ローカル変数 < 受け取る変数 > )・(defun C:MyLisp ( / a )(setq a 3)・)

(setq b ( + a 3)))

下記のプログラム (test2.lsp) には、補助関数 (test1) を含んでいます。
この中で、変数 ( a と b) は引数、変数 (c) はローカル変数です。

上記の関数では、変数 <a> は関数の内部でしか使用出来ませんが（ローカル変数）、

関数 test1 は変数 a と b の乗算だけです。test1 に 2 つの数値を与えれば、乗算して変数 <b> は、この関数が終了した後でもメモリに残ります（グローバル変数）。

返してくれる関数です。
関数 test2 はローカル変数 (c) を持ちます。

もし、変数 <b> もローカル変数にするには、①(defun C:MyLISP ( / a b)

← 最初にローカル変数として宣言します。

(defun test1 (a b)・(* a b)・))②(defun C:test2( / c)(defun C:MyLISP ( / a )(setq c (test1 2 3))・)・(setq b nil)

← プログラムの最後に、<nil> をセットします。

)

関数 test2 を実行すると→ 6 が返ります。
→ !a と入力すると <nil> が返ります。
→ !b と入力すると <nil> が返ります。

Point!
Common LISP の慣習で、グローバル変数を明示するために、
変数名の前後に <*( アスタリスク )> を追加することもあります。
→(setq *b * (+ a 3))

このように、グローバル変数名とローカル変数名の名前の付け方を→ !c と入力すると <nil> が返ります。
結果として、ローカル変数 (c) だけでなく、引数の (a と b) の値も <nil> になっています。
これから、引数 (a と b) は特殊なローカル変数と言えます。

決めておいた方が良いでしょう。

1-25

AutoLISP の変数

AutoLISP の変数

1-26

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

AutoLISP の基本

getvar 関数と setvar 関数を使用すると、AutoCAD のシステム変数の値を調べたり変更することができます。これらの関数は、変数名を文字列で指定します。setvar 関数では、システム変数に応じたタイプの値を指定します。AutoCAD の システム変数には、整数、実数、文字列、2D 点、3D 点といっシステム変数種類

保管先

関連コマンドAPERTURE

整数

ACAD.CFG

OSNAP

AutoLISP の基本

表示関係のシステム変数

3 システム変数

オブジェクト スナップ範囲の大きさをピクセル単位で指定します。
（1 ～ 50）

たさまざまなタイプがあります。setvar に引数として指定する値は、このいずれかのタイプです。

BLIPMODE

整数

図面

マーカー（図形や座標点を指示したときに画面上に残る点）の表示を制御します。
0 = オフ（マーカー表示しない < 既定値 >）1 = オン（マーカー表示する）
CMDECHO

整数

AutoLISP の COMMAND 関数を使用する時、
0 = エコーバックしません。
1 = プロンプトとユーザーの入力をエコーバックします。< 既定値 >CMDDIAGETVAR

システム変数の値を取得します。

システム変数 [CMDDIA] の現在の値を取得します。
(setq a (getvar "cmddia"))→ コマンドラインに !a と入力します。

1→ コマンドラインに <1> が表示されます。

（1 = PLOT コマンドでダイアログ ボックスを使用します。）
SETVAR

システム変数に値を代入します。

システム変数 [CMDDIA] を <0> にします。
(setvar "cmddia" 0)

PLOT

1 = PLOT コマンドでダイアログ ボックスを使用します。< 既定値 >整数

図面

図形を画面上で動的に表示します。
0 = ドラッグ モード <ON>。 ドラッグ機能が有効です。
1 = ドラッグ モード <OFF>。ドラッグ機能が無効です。
2 = 自動。
FILEDIA

ドラッグ機能が自動的に働きます。< 既定値 >整数

ACAD.CFG

0 = ファイル ダイアログ ボックスを表示しない。

（ 0 = PLOT コマンドでダイアログ ボックスを使用しません。）

1-27

ACAD.CFG

0 = PLOT コマンドでダイアログ ボックスを使用しません。

DRAGMODE

コマンド : !a整数

AutoLISP の変数

1 = ファイル ダイアログ ボックスを表示する。< 既定値 >AutoLISP の変数

1-28

第 1 章－ AutoLISP の基本
FILLMODE

第 1 章－ AutoLISP の基本
整数

図面

SOLID、PLINE、TRACE、DONUT

塗り潰しの表示を制御します。
（再作図で更新）PICKBOX整数

ACAD.CFG

図形を指示するときのボックス カーソルの大きさをピクセル単位で指定します。

AutoLISP の基本

AutoLISP の基本

0 = オフ（塗り潰しません）
1 = オン（塗り潰します < 既定値 >）HIGHLIGHT

整数

図形を選択した時の、ハイライト表示を制御します。
0 = オフ（選択した図形はハイライトしません）
1 = オン（選択した図形はハイライトします < 既定値 >）
PLINEWIDMIRRTEXT

整数

図面

実数

図面

PLINE

MIRROR
ポリラインの幅を指定します。既定値は <0>

0 = MIRROR コマンドを実行したとき、文字の表示方向は変更しません。< 既定値 >1 = MIRROR コマンドを実行したとき、文字を鏡像表示します。

MIRRTEXT = 0

MIRRTEXT = 1

QTEXTMODE

整数

図面

文字の省略モードを制御します。
（再作図で更新されます。
）
0 = オフ文字省略モードをオフにします。文字が表示されます。< 既定値 >1 = オン

文字省略モードをオンにします。文字の代わりにボックスが表示されます。
QTEXTMODE = 0

PDMODE整数

図面

QTEXTMODE = 1

POINT、DIVIDE、MEASURE

点の表示モードを指定します。

REGENMODE

整数

図面

オート再作図モードを制御します。
0 = オフ1 = オン < 既定値 >SNAPBASE

2 次元点

図面

現在のビューポートでのスナップ原点を指定します。
PDSIZE

整数

図面

SNAPUNIT

2 次元点

図面

現在のビューポートに対する X と Y のスナップ間隔を指定します。

点の表示サイズを指定します。

1-29

POINT、DIVIDE、MEASURE

AutoLISP の変数

AutoLISP の変数

1-30

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本

システム変数種類

保管先

EXTMAX

3 次元点

図面

初期値関係のシステム変数
関連コマンド図形範囲の右上の頂点座標を表示します。新しく図形を描くと図面範囲は自動的に広がります。
EXTMIN

3 次元点

システム変数種類

保管先

ANGBASE

実数

図面

関連コマンドAutoLISP の基本

AutoLISP の基本

限界関係のシステム変数

角度 <0> の方向。
（現在の UCS）

図面

北 <90 度 >図形範囲の左下の頂点座標を表示します。新しく図形を描くと図面範囲は自動的に広がります。
LIMMAX

2 次元点

図面

LIMITS西 <180 度 >ワールド座標で表示される現在の空間の図面範囲の右上頂点を設定します。
LIMMIN

2 次元点

図面

LIMITS

ワールド座標で表示される現在の空間の図面範囲の左下頂点を設定します。
LIMMAX
EXTMAX

東 <0 度 >南 <270 度 >ANGDIR

整数

LIMMIN

UNITS

0 = 角度を反時計回りに計測します。< 既定値 >1 = 角度を時計回りに計測します。
angdir<0>

angdir<1>

AUNITS

整数

角度の単位モードを制御します。

EXTMIN

図面

図面

UNITS

例

0 = 十進数

35.00

1=度/分/秒

45d0'0"2 = グラジェント

60.00g

3 = ラジアン

0.785398r

4 = 測量用単位

N 45d0'0" E

図形範囲 (EXTMIN、EXTMAX) が、図面範囲 (LIMMIN、LIMMAX) を超えた場合、図面範囲も自動的に広がります。

1-31

AutoLISP の変数

AutoLISP の変数

1-32

第 1 章－ AutoLISP の基本
AUPREC

第 1 章－ AutoLISP の基本
整数

図面

UNIT

CHAMMODE整数CHAMFER

面取りを作成するときの入力方法を設定します。

角度の小数点以下の桁数を指定します。
（0 ～ 8）

1 = 面取り距離と角度を指定します。

[AUPREC] を <2> に設定して、下図を [MEASUREGEOM] で角度を確認すると、角度 = 34.32 ﾟが表示されます。

CHAMFERA

しかし、寸法で角度を記入すると下図のように 34°と表示されます。角度寸法の設定は、[DIMADEC]( 寸法角度精度 )実数

図面

AutoLISP の基本

AutoLISP の基本

0 = 2 つの面取り距離を指定します。< 既定値 >CHAMFERCHAMMODE が 0 に設定されているとき、面取りの 1 本目の距離を指定します。

で設定します。

CHAMFERB

実数

図面

CHAMFERCHAMMODE が 0 に設定されているとき、面取りの 2 本目の距離を指定します。

LUNITS

整数

図面

線分の単位モードを設定します。

1 本目の距離 (CHAMFERA)

UNITS

2 本目の距離 (CHAMFERB)

例

1 = 指数表記

3.25E + 01

2 = 十進表記

25.80

3 = 工業図面表記

2' - 2.50"

4 = 建築図面表記

2' - 2 1/2"

5 = 分数表記

2 1/2

CHAMFERC

実数

図面

CHAMFERCHAMMODE が 1 に設定されているとき、面取りの長さを設定します。
CHAMFERDLUPREC

整数

図面

図面

CHAMFERCHAMMODE が 1 に設定されているとき、面取りの角度を設定します。

長さの小数点以下の桁数を指定します。

[LUPREC] を <4> に設定して、下図を [MEASUREGEOM] で実数

1 本目の距離 (CHAMFERC)

1 本目からの角度 (CHAMFERD)

長さを確認すると、長さ = 89.0507 が表示されます。
しかし、寸法で長さを記入すると下図のように 89.05 と表示されます。長さ寸法の設定は、[DIMDEC]( 寸法精度 ) で設定します。
FILLETRAD

整数

図面

FILLETFILLET コマンドで使用する円弧の半径を指定します。

1-33

AutoLISP の変数

AutoLISP の変数

1-34

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本
情報関係のシステム変数

OSMODE

システム変数種類

保管先

関連コマンドCECOLOR

文字列

図面

COLOR

整数

図面

現在の基本図形の色を指定します。< 既定値 "BYLAYER">
CELTYPE

文字列

図面

LINETYPE

現在の基本図形の線種を指定します。< 既定値 "BYLAYER">
CLAYER

文字列

図面

64 = 挿入基点

3 = 端点 + 中点

2 = 中点

128 = 垂線

5 = 端点 + 中心

4 = 中心256 = 接線

7 = 端点 + 中点 + 中心

8 = 点

512 = 近接点

9 = 端点 + 点

16 = 四半円点

1024 = 図心

10 = 中点 + 点

32 = 交点

2048 = 仮想交点

11 = 端点 + 中点 + 点

8192= 平行

16383 = すべて選択

4096 = 延長

16384 = すべて解除

LAYER(setvar "OSMODE" 16383) → [ すべて選択 ]現在の画層を指定します。
LASTPOINT

1 = 端点(setvar "OSMODE" 16384) → [ すべて解除 ]文字列

現在の空間の UCS 座標で表示される最後の入力点を指定します。キーボードから点入力の際に<@> で参照される点です。
LTSCALE

実数

図面

図面全体の尺度を設定します。線種尺度はゼロを指定できません。
CELTSCALE

実数

図面

PSLTSCALE

現在のオブジェクトの線種尺度を設定します。新しいオブジェクトの線種尺度は、LTSCALE[ 線
種

尺度 ] コマンドの設定に従います。

整数

図面

ペーパー空間の線の尺度を制御します。
0 = 線の尺度は、その図形がある空間の作図単位に従います。
1 = 線の尺度は、ペーパー空間の作図単位に従います。

LTSCALECELTSCALE

1-35

AutoLISP の変数

AutoLISP の変数

1-36

AutoLISP の基本

AutoLISP の基本

オブジェクト スナップのビット コードです。次の値の合計で指定します。

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本
getvar 関数

4 システム変数を取得する getvar 関数

システム変数 [LIMMIN] と [LIMMAX] から図面範囲の領域を示す四角形を作図します。

このときに使用する関数が [getvar] です。

P2(LIMMAX)

AutoLISP の基本

AutoLISP の基本

システム変数の値をコマンドラインから取得することができます。

LIMMIN と LIMMAX から図枠を作成する① getvar 関数を使用して、現在開いている図面の図面範囲を調べます。
新規に図面をオープンすると、初期値の図面範囲はミリ系で A3 の大きさになっています。
つまり、横 420 ×縦 297 の大きさです。
図面範囲のコマンドでは、最初に左下の座標を聞いてきて、次に右上の座標を聞いてきます。
このとき、左下の座標がシステム変数 [LIMMIN] にセットされ、右上の座標がシステム変数[LIMMAX] にセットされます。
次のように記述します。
(setq P1 (getvar “LIMMIN” ))・・・

図面範囲の左下の座標を変数 P1 に代入する。

→コマンドラインに、(0.0 0.0) が表示されます。
(setq P2 (getvar “ LIMMAX” ))・・・

図面範囲の右上の座標を変数 P2 に代入する。

→コマンドラインに、(420.0 297.0) が表示されます。

P1(LIMMIN)
Step1 ー システム変数 [LIMMIN] から、図面範囲の最小座標（左下）を取得します。
Step2 ー システム変数 [LIMMAX] から、図面範囲の最大座標（右上）を取得します。
Step3 ー長方形 [rectang] コマンドを使い、左下を [LIMMIN]、右上を [LIMMAX] として作図します。
Step4 ー プログラムの最後に、<nil> を表示させないように (princ) を記述します。

(defun C:Box1( / P1 P2)②キーボードから <!P1> と入力すると、コマンドラインに (0.0 0.0) が表示されます。

1(setq P1 (getvar "LIMMIN")); 図面範囲の左下の座標

2(setq P2 (getvar "LIMMAX")); 図面範囲の右上の座標

キーボードから <!P2> と入力すると、コマンドラインに (420.0 297.0) が表示されます。

; 長方形コマンド [rectang] で長方形を作図する

3(command "RECTANG" P1 P2) ; 長方形を作図

4(princ)) ;endPoint!
システム変数には、次の 3 通りがあります。
①確認しかできない変数の例
・・[DISTANCE]( 読み込み専用 )( 保存されません )→ Step1］→ Step2］

番号
関数名① getvar "LIMMIN"② getvar "LIMMAX"③ RECTANG④ princ→ Step3］→ Step4］

説 明システム変数 (LIMMIN) から図面範囲の最小座標（左下）を取得
システム変数 (LIMMAX) から図面範囲の最大座標（右上）を取得
長方形コマンド（２点を指示して作図）
最後の行に、<nil> を表示させません

princ は、P1-141 を参照②変更は出来るが保存はできない変数の例
・・[HIGHLIGHT]( 保存されません )③変更も保存も可能な変数の例
・・[CHAMFERA]( 保存先は図面 )1-37

AutoLISP の変数

AutoLISP の変数

1-38

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本
getvar & setvar

5 システム変数に代入する setvar 関数

半径 <0> でフィレットします。終了後、フィレット半径を既定値に戻します。

このときに使用する関数が [setvar] です。

AutoLISP の基本

AutoLISP の基本

システム変数をコマンドラインからコントロールすることができます。

フィレットの半径を <0> にした後、既定値に戻す① setvar 関数を使して、先ほどの図面範囲を変更します。
先ほどの図面の図面範囲はミリ系で A3 の大きさになっていますが、これをインチ系の A3 の
大きさ、つまり、横 12 ×縦 9 の大きさに変更します。
左下の座標のシステム変数 [LIMMIN] に <0,0> をセットし、右上の座標のシステム変数[LIMMAX] に <12,9> をセットします。
次のように記述します。
Step1 ー 現在のシステム変数 [FILLETRAD] の値を変数 <fr> に代入します。
（後で戻すため）(setq P1 (setvar “LIMMIN” (list 0 0 )))→コマンドラインに、(0 0) が表示されます。

Step2 ー システム変数 [FILLETRAD] の値を <0> にセットします。

(setq P2 (setvar “ LIMMAX” (list 12 9)))→コマンドラインに、(12 9) が表示されます。

Step3 ーフィレット [fillet] コマンドを使い、2 本の線分をフィレットします。
②キーボードから <!P1> と入力すると、コマンドラインに (0.0 0.0) が表示されます。

（2 本の線分は、ユーザーが指示します。<pause> を 2 回使います。
）

キーボードから <!P2> と入力すると、コマンドラインに (12.0 9.0) が表示されます。
Step4 ー システム変数 [FILLETRAD] の値を初期値に戻します。
③ [ 設定 ] → [ 図面範囲 ] を選びます。
Step5 ー プログラムの最後に、<nil> を表示させないように (princ) を記述します。

[ 左下のコーナー ] に対して、<!P1> と入力します。
[ 右上のコーナー ] に対して、<!P2> と入力します。

(defun C:Fillet0( / fr)④ [ ツール ] → [ 情報 ] → [ 図面情報 ] で確認します。
左下の座標が (0,0)、右上の座標が (12,9) であることが分かります。( 右図 )ミリ系の既定値インチ系の既定値

1(setq fr (getvar "filletrad"))2(setvar "filletrad" 0)3(command "fillet" pause pause) ; フィレットを実施

4(setvar "filletrad" fr) ; フィレット半径を元に戻す

5(princ); フィレット半径を得る; フィレット半径を <0> にセット

) ;end番号
関数名① getvar "filletrad"② "filletrad" 0③ pause pause④ setvar "filletrad"⑤ princ→ Step1］→ Step2］→ Step3］→ Step4］→ Step5］

説 明システム変数 [filletrad] の値を取得（最後に戻すため）
フィレットの半径を <0> にセット
pause は入力待ち（ユーザーが 2 カ所指示するのを待ちます）
システム変数 [filletrad] の値を元に戻します
最後の行に、<nil> を表示させません

pause は、P1-42 を参照

1-39

AutoLISP の変数

AutoLISP の変数

1-40

第 1 章－ AutoLISP の基本

第 1 章－ AutoLISP の基本
pi

6 定義済み変数（定数）

定数
PAUSE
PI
T
nil

<pi> は円周率ですから、LISP の関数では angle 関数や getangle 関数、getorient 関数で使用されます。

AutoCAD の定義済み変数（定数）
説 明
2 つの円記号から成る文字列 (¥¥) として定義されています。この変数は、ユーザー
入力待ち ( 一時停止 ) を行うために command 関数で使用します。
定数 π ( パイ ) として定義されています。これは、約 3.14159 に評価されます。
定数 T として定義されています。これは、nil でない値として使用します。
「何も無い」という意味です。[ 値が無い ]、[ ファイルが無い ]、[ リストが無い ] など。
また、IF 関数において真 (T) でない時の偽 (nil) としても使われます。

AutoLISP の基本

AutoLISP の基本

次に示す定義済み変数（定数）は、AutoLISP でよく使用します。

円周率のπですが、キーボードにはこの記号が無いので、pi で代用。

π2
0 度は <0> ラジアンπ0

90 度は < 約 1.57079> ラジアン
180 度は < 約 3.14159> ラジアン
270 度は < 約 4.71238> ラジアン

これらの変数の値は、setq 関数で変更できます。しかし、他のアプリケーションが3π2

これらの値が一定であることを前提にしている可能性がありますから、これらの変数は変更すべきではありません。
T

PAUSE

command 関数の実行中に、ユーザーの選択待ちにします。

LINE（線分）コマンドで表示されるプロンプトは、以下の通りです。
LINE 1 点目を指定 :→ マウスで 1 点目を指示します。(pt1)

次の点を指定 または [ 元に戻す (U)]:→ マウスで 2 点目を指示します。(pt2)

変数 <a> と <b> の値が等しいかどうかをチェックして、等しければ（Ｔ）A の式を行い、等しくなければ（nil）Ｂの式を行う LISP は以下のようになります。
(If (= a b)
(setq c (+ a b))→ 等しければ (T)、a と b を加算します。

(setq c (- a b))→ 等しくなければ (nil)、a から b を減算します。

これを LISP で記述した場合は、(command "LINE" pt1 pt2 "") となります。
もし、"LINE" の後で pt1 と pt2 をユーザーに画面上から指示させるためには、[pause] 関数を使って以下のように記述します。
→ 最後の <""> は空打ちです。

pause 関数を使用すると、pt1 と pt2 が事前に判っていなくても、"LINE" コマンドが使用出来ます。
このように、画面上で指示を待つタイプのコマンドで使用出来ます。
次の例は、移動コマンドの例です。

nil

IF 関数において真 (T) でない時やリストが空であるとき。

値が代入されていない AutoLISP の変数を、nil といいます。これは、空白とは異なり ( 空白は文字とみなされます )、また 0( ゼロ ) とも異なります (0 は数値とみなされます )。
そのため、変数の現在値をチェックするほかに、変数に値が代入されているかどうかを調べるためにテストできます。
各変数は少量のメモりを消費するため、値が必要としなくなったときには、その変数名を再び使用するか、またはその変数に nil を代入します。変数に nil を代入すると、その変数の値を格納するために使用されていたメモリが解放されます。変数 < pt1> が不要になったときは、次の(command "MOVE" pause "" pause pause)

1-41→ a と b を比較します。

)

指示された pt1 点と pt2 点に線分を作図します。

(command "LINE" pause pause "")nil でない値として使用します。
（式が正しい）（リストが空でない）

式を使用してその変数の値をメモリから解放できます。

オブジェクトを選択 :→ 最初の pause（"" は選択終了のエンター）

基点を指定 または [ 移動距離 (D)]→ 二番目の pause< 移動距離 >: 目的点を指定→ 三番目の pause

AutoLISP の変数(setq pt1 nil)!pt1

→ キーボードから、!pt1 と入力します。

nil→ nil が返ります。

AutoLISP の変数

1-42

第 1 章－ AutoLISP の基本

7 AutoLISP の変数のまとめ
1 AutoCAD の定数（定義済み変数）
AutoLISP の基本

AutoCAD の関数（Line や Circle）と同様に、これらの定義された変数はユーザー側で変更できません。
① pause・・ユーザーの選択待ちの関数です。
② pi・・円周率です。ユーザー側で (setq pi 10) とすると、そのセッションでは円周率は<10> になってしまいます。

③T・・真偽判定などに使われる重要な定数です。

④ nil・・上記同様の重要な定数です。

2 システム変数
システム変数には、動作環境に関する設定値や AutoCAD のコマンドの設定値が格納されています。

AutoLISP の中心となる関数のグループです。
リストの処理方法が他のプログラムとは特徴的ですが、CAD データを扱うには最も適した関数と言えます。

この章では以下のことを学びます。

現在開いている図面のシステム変数を確認するには、キーボードから (getvar " システム変数名 ")第 1 節

リスト処理関数と入力します。

第 2 節

算術演算関数

第 3 節

文字列処理関数

第 4 節

ジオメトリック関数

第 5 節

データ変換関数

何も宣言しなければグローバル変数になります。

第 6 節

比較関数

関数内で宣言すれば、ローカル変数になります。

第 7 節

条件関数

またシステム変数を変更するには、(setvar " システム変数名 " 値 ) と入力します。
ただ、システム変数には確認するだけで変更できない変数もあります。

3 ユーザーが指定できる変数①グローバル変数・・ユーザー関数 (defun 関数）が終了した後でも、メモリーに残ります。

②ローカル変数・・その関数内だけで有効です。関数が終了すると <nil> にセットされます。

グローバル関数とローカル関数の関係は次の通りです。

(defun C:test( a / b)
(setq c (+ a b)))

変数 [a] と [b] はローカル変数、[c] はグローバル変数です。
このうち、[a] は引数とも呼ばれます。
役割としては、[a] が [ 受け取るローカル変数 ]、[b] が [ 与えるローカル変数 ] になります。

Point!
ユーザーが指定する変数名（シンボル名）が、すでに定義済みかどうか調べるにはキーボードから、(atoms-family 1 '(" シンボル名 ") ) と入力します。
定義されていなければ、nil が返ります。
左図では、"mylisp" で調べると (nil) が返ります。
しかし、"pi" で調べると ("PI") が返りましたので、"pi" は AutoCAD のシンボルとしてすでに使われていることが判ります。

1-43

第 2 章 AutoLISP の関数

AutoLISP の変数

第 2 章－ AutoLISP の関数

第1節

第 2 章－ AutoLISP の関数

リスト操作関数1 リストから要素を取り出す関数

円を作図し、その図形情報を確認すると、以下のように <( )> が連結して表示されます。
CAR((-1 . < 図形名 : 7ef03550>) (0 . "CIRCLE") (330 . < 図形名 : 7ef01cf8>) (5 . "222") (100 . "AcDbEntity")(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") (101066.45 1562.17 0.0) (40 . 97.2096) (210 0.0 0.0 0))(car (list 10 20 30 40))CADR

LISP は LISt Processor という名前の通り、リストは LISP における基本的なデータ構造です。
この節では、要素をリストに加えたり、削除したり、入れ替えたり、新たに組み直したりする関数を学びます。

②リストに要素を加える関数
関 数
説 明(list [ expr ...])
任意の数の式を受け取り、それらを 1 つのリストに結合します。
(cons new-first-element lst) リストの先頭に要素を追加します。また、ドットリストを作成します。
(append lst ...)
任意の数のリストを受け取り、それらを 1 つのリストにまとめます。
(apply 'function list)
指定された関数に引数のリストを渡し、その関数を実行します。
(foreach name lst [ expr ...]) リストの個々の要素をリストに渡します。
(mapcar function list1 ...
関数にリストの各要素を引数として渡します。
listn)③リストの要素を入れ替える関数
関 数
説 明
リストで古い項目を検索し、古い項目があるたびに新しい項目で置(subst newitem olditem lst)
き換えたリストを返します。
(reverse lst)
要素の順番を反転させたリストを返します。
指定された式がリスト内に存在するかどうかを検索し、初めに検出(member expr lst)
した式以降のリストを返します。（サブリストを作成します。）(acad_strlsort)
文字列のリストを文字コード順にソートします。
④リストを調べる関数
関 数(length lst)
(listp item)(tblsearch table-name symbol [setnext])(tblnext table-name [rewind])

1-45

説 明
リストの要素数を表す整数を返します。
指定された項目がリストかどうかを調べます。
シンボル テーブル内のシンボル名を検索します。
シンボル テーブル内の次の項目を取得します。

リスト操作関数

AutoLISP の関数→ 10
リストの中の指定した 2 番目の要素を返します(cadr (list 10 20 30 40))
CDDR

使用頻度の高い AutoLISP のリスト操作関数を、次の表に示します。（順不同）①リストから要素を取り出す関数
関 数
説 明(car lst)
リストの先頭の要素を返します。
(cadr lst)
リストの 2 番目の要素を返します。
(cddr lst)
リストの 3 番目の要素を返します。
(cdr lst)指定されたリストの先頭の要素以外のすべての要素を含むリストを返します。
(last lst)
リストの最後の要素を返します。
(nth n lst)
リストの n 番目の要素を返します。（n は 0 から始まります。）
連想リストの要素を検索し、指定された要素が含まれる連想リスト項目を返(assoc item alist)
します。

リストの中の指定した 1 番目の要素を返します→ 20

リストの中の指定した 3 番目の要素を返します(cddr (list 10 20 30 40))
CDR

リストの先頭の要素以外のすべての要素を含むリストを返します(cdr (list 10 20 30 40))
LAST

→ (20 30 40)
指定したリストの最後の要素を返します(last (list 10 20 30 40))
NTH

→ 30

AutoLISP の関数1

これら 1 つ 1 つの <( )> が連結されたものをリストと呼びます。

→ 40
リストの中の指定した番目の要素を返します(nth 2 (list 10 20 30 40))

→ 30（番号は <0> から始まります。）

この関数には、2 つの引数を指定します。最初の引数は、どの項目を返すかを指定する整数です。
最初の引数として 0( ゼロ ) を指定するとリストの最初の項目が返され、1 を指定すると 2 番目の項目が返されます。2 番目の引数には、項目を取り出すリストを指定します。
(setq a (list 1 2 3 4 5))(setq b (nth 3 a))
!b

→4
ASSOC

連想リストの中から、指定された項目を取り出します(setq pt '((a 10)(b 20)(c 30)))→ ((A 10) (B 20) (C 30))

(assoc 'a pt)→ (A 10)(assoc 'd pt)→ nil（指定された項目が無い場合）(cdr (assoc 'a pt))

→ (10)

リスト操作関数1-46

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数<car><cadr><cddr>

リストの要素を取り出す

この四角形を作図する関数名を Box2.lsp として、作成してみましょう。

List 関数を使うと、複数の数値を組み合わせて、X,Y,Z の座標を構成することができます。

1

その反対に、すでに組み合わされている座標から、X の数値、Y の数値、Z の数値だけを取り出す

2(setq p1 (getpoint “¥n 一点目を指示：” ))関数が <car>、<cadr>、<cddr> です。

3(setq p3 (getpoint p1 “¥n 二点目を指示：” ))①まず、X の座標 10.0

Y の座標 20.0

Z の座標 0.0のリストを作ってみましょう。

(setq P1 (list 10.0 20.0 0.0)) となります。
②このリストから、X 座標を取り出す関数が <car> です。X 座標の変数を Px とすると(setq Px (car P1))となります。

(defun C:Box2( / p1 p2 p3 p4); 関数の宣言

getpoint は、
P1-52 を参考

;p1 の座標を取得;p3 の座標を取得;p1 と p3 を組み合わせて、p2 と p4 の座標を作成

4(setq p2 (list (car p3) (cadr p1)));p2 の座標5(setq p4 (list (car p1) (cadr p3)));p4 の座標

6(command “LINE” p1 p2 p3 p4 “C” )list は、P1-50を参考; 線分コマンドで作成) ;end(setq Py (cadr P1))となります。

番号④同様に、Z 座標を取り出す関数は <cddr> です。Z 座標の変数を Pz とすると(setq Pz (cddr P1))

関数名

①

defun

②

getpoint③

getpoint p1④⑤

setq p2
setq p4⑥

commandとなります。

下図の四角形を作図するプログラムで考えてみましょう。
マウスで点 P1(X1,Y1) と点 P3(X3,Y3) を指示することによって、他の 2 点 (P2 と P4) を求めます。
P4(X1,Y3)

P3(X3,Y3)

説 明
関数の宣言になります。defun C: プログラム名 ( ) は決まりです。
( / p1 p2 p3 p4) は、この中だけで使用する変数名です。これを省いた場合はメモリ上に残りますので、他の関数でも使用できます。この場合は、このプ
ログラムが終了するとメモリから開放されます。
プロンプトに表示されるメッセージを見て、ユーザーが指示した点の座標を
変数 p1 にセットします。
ユーザーがマウスで 2 点目を指示した点の座標を変数 p2 にセットします。
getpoint p1 とすると、p1 からラバーバンドが表示されます。
点 p3 の X 座標と点 p1 の Y 座標から、点 p2 の座標を作ります。
点 p1 の X 座標と点 p3 の Y 座標から、点 p4 の座標を作ります。
4 つの点が取得できたので、線分コマンドで四角形を作図します。
最後の ” C” は最初の点 (P1) まで結ぶ (Close) 意味です。

最後の括弧 ) は忘れてはいけません。
AutoLISP はこのように、始めの括弧と終わりの括弧の中に記述していきます。
括弧の数が合わないときは、エラーになります。
P2(X3,Y1)

P1(X1,Y1)

点 P2 の X 座標は、点 P3 の X 座標と同じです。また、Y 座標は点 P1 の Y 座標と同じです。
これより、点 P2 の座標は、点 P3 の X 座標と点 P1 の Y 座標を組み合わせたものになります。
①点 P3 の X 座標を取り出す。

X3 = (car P3)②点 P1 の Y 座標を取り出す。

Y1 = (cadr P1)③上記 2 つの数値を list 関数で 1 つにして、点 P2 の座標にする。
(setq P2 (list (car P3) (cadr P1)))④同様にして、点 P4 の座標は1-47

(setq P4 (list (car P1) (cadr P3))) になります。

リスト操作関数

メモリにある数値には “ と “ で囲むことはいりませんが、ユーザーがキーボードから入力しなければならないものは、” と “ で囲みます。この場合は、<LINE> と <C> です。

Point!

car、cadr、cddr と nth との関係
(setq a (list 10 20 30)) であるとき、X 座標は、(car a) = (nth a 0)

→ x = 10

Y 座標は、(cadr a) = (nth a 1)

→ y = 20

Z 座標は、(cddr a) = (nth a 2)

→ z = 30

リスト操作関数

1-48

AutoLISP の関数

AutoLISP の関数③同様に、Y 座標を取り出す関数は <cadr> です。Y 座標の変数を Py とすると

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
FOREACH

2 リストに要素を加える関数

リストの全ての要素に対して式を評価します

書式：(foreach 変数 リスト 評価する式 )複数の要素を 1 つのリストにします。
変数 [pt] に複数の要素 <10.0 20.0 30.0> をセットするには、→ (setq pt (list 10.0 20.0 30.0)) または、(setq pt '(10.0 20.0 30.0)) とします。
リストの先頭に指定した要素を付加したリストを作成します(cons '10 '(20 30 40))

→ (10 20 30 40)(cons '(10 20) '(30 40))

→ ((10 20) 30 40)(cons 'a 10)→ (A . 10)

ます。
コマンド : (foreach a '(1 2 3) (1+ a))→ 4（最後の値 <1+3> が返る）

(foreach a '(a b c)(print a))→ (print a)(print b)(print c) と同じ

A

CONS

下記のように、リストではなくアトムの場合は、ドット・ペアを返します。

AutoLISP の関数→ 評価する式が無いときは、nil を返し

任意の数の式を受け取り、それらを 1 つのリストに結合しますBCC→ foreach 関数は、リスト内の各要素を表示して、最後の要素 <C> を返します。

ドット・ペアは、
P1-55 を参考

MAPCAR指定された各要素を引数として、関数を実行した結果を返します(mapcar '1+ '(1 2 3 ))→ (2 3 4 )最初の引数で与えられた関数を、2 番目の引数 ( リスト ) 内の連続する要素に適用します。
APPEND

複数のリストを 1 つにまとめます

append 関数は、任意の数のリストを 1 つのリストにまとめます。
したがって、この関数の引数は、すべてリストになります。
(append (list 10 20) (list 30 40))

→ (10 20 30 40)(setq a '(30 40)) (append (list 10 20) a)→ (10 20 30 40)(1+ 1) -> 2 、(1+ 2) -> 3、(1+ 3) -> 4

(mapcar 'setvar '("cmdecho" "osmode") '(0 1)) → (setvar "cmdecho" 0) (setvar "osmode" 1) と
同じ
APPLY

指定された関数に引数のリストを渡し、その関数を実行します(apply '+ '(1 2 3))→6(apply 'strcat '("Auto" "LISP"))→ "AutoLISP"

Point!
既存のリストを変更する関数は 3 つあります。
append 関数は、新しい項目を末尾に追加したリストを返します。
cons 関数は、新しい項目を先頭に追加したリストを返します。
subst 関数は、古い項目があるたびにそれを新しい項目で置き換えたリストを返します。
これらの関数は元のリストを変更せず、変更された新しいリストを返します。
従って元のリストを変更するには、明示的に古いリストを新しいリストで置き換えることになります。

Point!

下記の①②③は同じ線分 (<0,0> から <20,20>) を作図します。

変数 [pt_lst] に (0,0) と (20,20) と ("") のリストをセットします。
(setq pt_lst '((0 0) (20 20) ("")))→ ((0 0) (20 20) (""))① (command "line")(foreach a pt_lst (command a))② (command "line")(mapcar 'command pt_lst)③ (command "line")(apply 'command pt_lst)

1-49

リスト操作関数(20 20)

リスト操作関数

(0 0)

1-50

AutoLISP の関数

list 関数

第 2 章－ AutoLISP の関数<getpoint><list>

マウスで座標リストを作成する

第 2 章－ AutoLISP の関数
点（座標）リストを作成する

・・・

getpoint①マウスで画面上の位置を指示したときに座標が取得できます。
(setq pt (getpoint "¥n 位置を指定：")) と入力します。
→コマンド : (setq pt (getpoint "¥n 位置を指定："))③リストに変数を使用することもできます。
(setq pt1 10.0 pt2 20.0 pt3 30.0)(setq pt (list pt1 pt2 pt3))→ pt には (10.0 20.0 30.0) がセットされます。

④ list 関数の代わりに、quote 関数を使用してリストを作成できます。
quote 関数は、次に示すように式を評価せずに返します。
(setq p1 (quote (10.0 20.0 30.0)))→ pt には (10.0 20.0 30.0) がセットされます。

⑤ quote 関数の代わりに点の (') を使用することもできます。

マウスで適当な位置を指示します。

以下のコードは、上のコードと同じ結果になります。

→位置を指定：(756.301 488.818 0.0)

setq p1 '(10.0 20.0 30.0))→ pt には (10.0 20.0 30.0) がセットされます。

( ) の中の数値が、
XYZ の座標値です。画面で指示する位置は平面ですが、Z 座標値も入力されています。
設定の数値が入ります。

キーボードから座標を入力して四角形を作図する

AutoLISP の関数

AutoLISP の関数

これは高度（ELEVATION）の初期値が <0.0000> に設定されていますので、Z 座標には自動的に高度②システム変数 <ELEVATION> には、現在の空間の現在のビューポートでの現在の UCS を基準にした
現在の高度が格納されています。

pt4(100,200)

pt3(300,200)

pt1(100,100)

pt2(300,100)

この高度を変更するには、setvar 関数を使います。
(setvar "ELEVATION" 100.0)→ マウスで画面を指示すると、Z 座標には自動的に<100.0> がセットされます。

①と同様に画面上で適当な位置を指示してみます。
コマンド : (setq pt (getpoint "¥n 位置を指定："))位置を指定：(901.028 731.872 100.0)→ Z 座標に <100.0> がセットされています。

高度（ELEVATION）を元の位置 <Z = 0.0> に戻すには、再度 setvar 関数を使います。
(setvar "ELEVATION" 0.0)

Step1 －各コーナーの座標をセットします。
(setq pt1 (list 100.0 100.0))(setq pt2 (list 300.0 100.0))

キーボードから座標リストを作成する

・・・

list

(setq pt3 (list 300.0 200.0))(setq pt4 (list 100.0 200.0))①キーボードから XYZ の座標を作成するには、list 関数を使います。
(setq pt (list 100.0 200.0))→ X 座標に <100.0>、Y 座標に <200.0> をセット

この時の Z 座標は、その時点のシステム変数 <ELEVATION> の値が自動的にセットされます。
ですから、<ELEVATION> の値が <0.0> のときは、実際の座標値は (100.0 200.0 0.0) になります。
②現在の <ELEVATION> ではない Z 座標値であれば、list の中に明示的に記述します。
(setq pt (list 100.0 200.0 300.0))

Step2 －線分コマンドで作図する場合。
(command "LINE" pt1 pt2 pt3 pt4 "C")→ "C" は Close の C です。

Step3 －長方形コマンドで作図する場合。
(command "RECTANG" pt1 pt3)

→ Z 座標に <300.0> がセットされますが、システム
変数 <ELEVATION> は <0.0> のままです。

1-51

リスト操作関数

リスト操作関数1-52

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
特殊なリスト（ドット・ペア）の作成

3 リストの要素を入れ替える関数
SUBST

特殊なリスト ( ドット・ペア ) とは。

リストの中の古いデータを新しいデータと入れ替えます

点の座標のリストは、(X Y Z) の組み合わせで表示されます。(100.0 200.0 300.0) である場合は、
X 座標が <100.0>、Y 座標が <200.0>、Z 座標が <300.0> であることが判ります。

(setq en1 (list 10 20 30 40))
(setq en1 (subst 50 20 en1))

一方、画面上のオブジェクト（例えば線分）は、画層や色、線種などの情報を持っています。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

(10 50 30 40)→ 要素 <20> が <50> と入れ替わっています。

古いリストに同じデータが複数ある場合は、すべて新しいデータと置き換わります。

①上図のような線分を作成して、キーボードから以下のように入力します。
(setq ent1 (entlast))→（例）< 図形名 : 7ef03990> が返ってきます。

関数 entlast は、最後に作成したオブジェクトを変数にセットします。

(setq en1 (subst 50 30 en1))

AutoLISP の関数

AutoLISP の関数(setq en1 (list 10 30 30 40))

線分

この図形の中身を調べる関数が、entget です。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

(10 50 50 40)→ 2 つの要素 <30> が <50> と入れ替わっています。

② (setq ent2 (entget ent1)) と入力すると、このオブジェクトの情報が表示されます。
((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A2") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 605.415 418.055 0.0)

REVERSE

リストの要素の順番を反転させたリストを返します(reverse (list 10 20 30 40))

→ (40 30 20 10)(reverse (list '(100,100) '(200,200)))→ ((200,200) (100,100))

MEMBER指定された式がリスト内に存在するかどうかを検索します(member '20 '(10 20 30))

→ (20 30)

(member '(30 30) '((10 10)(20 20)(30 30)))→ ((30 30))

リストが見つかると、それ以降のリストを返します。
ACAD_STRLSORT

文字列のリストを文字コード順にソートします(setq list_x (list "Abc" "123" "Acb" "231"))(acad_strlsort list_x)→ ("123" "231" "Abc" "Acb")(11 1137.5 418.055 0.0) (210 0.0 0.0 1.0))
上のリストは、( ) が連なっていますが、この 1 つ 1 つの ( ) がドット・ペアと呼ばれます。
このリストから判るのは、オブジェクトの種類 <(0 . "LINE")>、画層 <(8 . "0")>、
始点座標 <(10 605.415 418.055 0.0)>、終点座標 <(11 1137.5 418.055 0.0)> 等です。
③このリストには、必ず 2 つの要素が格納されています。この 2 つの要素はピリオド (.) で区切られます。 2 つの要素の内、最初の要素をグループコードと呼びます。
上記の中の (8 . "0") では、グルー

プコードの <8> は画層を意味します。

その次の <"0"> は線分の画層の名前を意味します。
上記の線分のグループコードに関する主なものを示します。

線分のグループ コード
グループコード意 味
0
オブジェクトタイプ ("LINE")
8
画層名10
始点 (WCS)
DXF: X 値、APP: 3D 点
11
終点 (WCS)
DXF: X 値、APP: 3D 点
210
押し出し方向 ( 省略可能、既定 = 0, 0, 1)
DXF: X 値、APP: 3D ベクトル
entlast は、P1-209 を参考
entget は、P1-218 を参考

1-53

リスト操作関数

リスト操作関数1-54

第 2 章－ AutoLISP の関数
assoc 関数

第 2 章－ AutoLISP の関数
特殊なリスト（ドット・ペア）を取り出す

2 つの要素からなるリスト（連想リスト）のグループコードを検索して、一致する 1 組の要素を取り出すことができます。
書式は、(assoc グループコード

cons 関数

特殊なリスト ( ドット・ペア ) を作成する①画層名が <"1"> のドット・ペアを作成してみましょう。
要素を組み合わせて、ドット・ペアを作成する関数は cons です。

ドット・ペア < 連想リスト >) です。

以下のように記述します。
(cons 8 “1” )図面に最後に追加された図形を調べ、その画層名を取得するには次のようにします。

cons 関数には 2 つの引数が必要です。第１の引数はグループコード、第２の引数はそのコードの

Step1

情報です。
（画層のグループコードは <8> です。
）→ 最後の図形のエンティティ データを取り出します。

コマンド : !ent1→ コマンドラインに <!ent1> と入力します。

②上記のように入力して、この情報を変数 ent1 にセットします。
(setq ent1 (cons 8 “1” ))(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")(10 1273.2 631.227 0.0) (11 1281.86 638.497 0.0) (210 0.0 0.0 1.0))③キーボードから、!ent1 と入力します。次のドット・ペアが返されます。

AutoLISP の関数(setq ent1 (entget (entlast)))((-1 . < 図形名 : 214a777d450>) (0 . "LINE") (330 . < 図形名 : 214a77701f0>) (5 . "295")

AutoLISP の関数となります。

(8. “1” )
Step2

Step3

(setq ent2 (assoc 8 ent1))→ グループ コード <8> のリストを取り出します。

コマンド : !ent2→ コマンドラインに <!ent2> と入力します。

(8 . "0")→ グループ コード <8> のドット・ペアが表示されます。

(setq obj_lay (cdr ent2))→ リストの 2 番目以降を取り出します。

コマンド : !obj_lay→ コマンドラインに <!obj_lay> と入力します。

"0"→ 画層名の <"0"> が表示されます。

cons 関数に変数も使用出来ます。
変数 pt に X の座標値 <100.0>、Y の座標値 <100.0> をセットします。
(setq pt (list 100.0 100.0))
コマンドラインから次のように入力します。
コマンド : (cons 10 pt)→ (10 100.0 100.0) が返ります。グループコード <10> は線分の始点の座標です。
entmake は、
P1-222 を参考

entmake 関数で、四角形を作図する

entmake 関数は、entget 関数の反対の役割をします。従って entmake 関数の引数は、entget 関数が返すのと同じ形式の図形定義データになります。下図の四角形を entmake 関数で作成します。
pt4(0,100)

pt3(100,100)

Step1

グループコード <10> は線分の始点の座標
グループコード <11> は線分の終点の座標

Step2
Step3

pt1(0,0)pt2(100,0)

Step1 －線分 (pt1-pt2) の作図(entmake (list (cons 0 "line") '(10 0.0 0.0 0.0) '(11 100.0 0.0 0.0)))
Step2 －線分 (pt2-pt3) の作図(entmake (list (cons 0 "line") '(10 100.0 0.0 0.0) '(11 100.0 100.0 0.0)))
Step3 －線分 (pt3-pt4) の作図(entmake (list (cons 0 "line") '(10 100.0 100.0 0.0) '(11 0.0 100.0 0.0)))
Step4 －線分 (pt4-pt1) の作図(entmake (list (cons 0 "line") '(10 0.0 100.0 0.0) '(11 0.0 0.0 0.0)))

1-55

リスト操作関数

リスト操作関数1-56

第 2 章－ AutoLISP の関数
subst、entmod

第 2 章－ AutoLISP の関数
特殊なリスト（ドット・ペア）を入れ替える

4 リストを調べる関数

図形リスト内のドット・ペア（連想リスト）を入れ替えるには、subst 関数を使います。
これは、図形リストの古いドット・ペアと新しいドット・ペアとを入れ替えます。

LENGTH

指定したリストの要素数を返します(length (list 10 20 30 40))→4((-1 . < 図形名 : 7ef03550>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "222") (100 .

最後に作図したオブジェクトを取得して、en1 にセット

→ (setq en1 (entlast))"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1403.87

この図形 <en1> の要素数を得るには、length 関数で確認できます。

1390.95 0.0) (11 1816.94 1540.2 0.0) (210 0.0 0.0 1.0))

コマンド : !en1

書式は、(subst

新しいドット・ペア

古いドット・ペア

図形リスト ) です。

P1-50 の図形 ent1 のリストは次のようになっています。

→ コマンドラインに < !en1 > と入力。

この図形 ent1 の画層名は "0" ですが、"1" に変更するには、以下のようにします。

"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1403.87①画層が "1" のドット・ペア（連想リスト）を事前に作成します。

1390.95 0.0) (11 1816.94 1540.2 0.0) (210 0.0 0.0 1.0))(setq new_lay (cons 8 “1” ))→ 新しいドット・ペア (8 . "1") を作成して変数 new_lay に代入します。

→ 図形名が変数 ent1 にセットされます。

③図形 ent1 のリストを取得します。取得する関数は、entget です。
(setq old_obj (entget ent1))→ 最後に作成した図形 (entlast) の図形リスト
を変数 old_obj にセットします。

④図形リスト old_obj から画層のドット・ペア（連想リスト）を取得します。
(setq old_lay (assoc 8 old_obj))(length en1)
LISTP​②最後に作図した図形を変数 ent1 にセットします。
(setq ent1 (entlast))

AutoLISP の関数

AutoLISP の関数((-1 . < 図形名 : 7ef03550>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "222") (100 .

→ 図形リスト old_obj の画層のドット・ペア
を変数 old_lay に代入します。

→ 12
指定された項目が、リストかどうか調べます(listp '(100 100))→T(listp '100)→ nil(listp (+ 10 20))→ nil

TBLSEARCH

シンボル テーブル内のシンボル名を検索します

書式は：(tblsearch シンボルテーブル 検索するシンボル名）①寸法スタイル [dimstyle] に <ISO-21> が有るかどうかを調べます。
(tblsearch "dimstyle" "ISO-21")→ nil（無い場合）②寸法スタイル [dimstyle] に <standard> が有るかどうかを調べます。
(tblsearch "dimstyle" "standard")⑤図形リスト old_obj の画層のドット・ペア（連想リスト）を new_lay と入れ替えます。
(setq new_obj (subst new_lay old_lay old_obj))→ T の場合は、その情報を表示します。

（一例）((0 . "DIMSTYLE") (2 . "Standard") (70 . 0) (3 . "") (4 . "") (5 . "") (6 . "") (7 . "") (40 . 1.0) (41 . 0.18)(42 . 0.0625) (43 . 0.38) (44 . 0.18) (45 . 0.0) (46 . 0.0) (47 . 0.0) (48 . 0.0) (140 . 0.18) (141 . 0.09)⑥ subst 関数で入れ替えた後は、必ず entmod 関数でデータの更新処理を行います。

(142 . 0.0) (143 . 25.4) (144 . 1.0) (145 . 0.0) (146 . 1.0) (147 . 0.09) (71 . 0) (72 . 0)(73 . 1) (74 . 1)

(entmod new_obj)(75 . 0) (76 . 0) (77 . 0) (78 . 0) (170 . 0) (171 . 2) (172 . 0) (173 . 0) (174 . 0) (175 . 0) (176 . 0) (177 . 0)

これで ent1 の画層は、"0" から "1" に変更されます。

(178 . 0) (270 . 2) (271 . 4) (272 . 4) (273 . 2) (274 . 2) (340 . < 図形名 : 7ef01c88>) (275 . 0) (280 . 0)

( 連想リスト )(281 . 0) (282 . 0) (283 . 1) (284 . 0) (285 . 0) (286 . 0) (287 . 3) (288 . 0))"Association List" の訳語ですが、[ 連結リスト ] とか [ 結合リスト ] の方が、判りやすいかと思います。

1-57

リスト操作関数

リスト操作関数1-58

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
シンボル テーブル内の次の項目を取得します

書式は：(tblnext シンボルテーブル [rewind]）①図面内の最初の画層を取得します。
(tblnext "layer" )→ AutoCAD は画層は必ず 1 つ持ちます。

((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous"))
戻り値の意味は、以下のとおりです。
(0 . "LAYER") シンボル タイプ(defun C:tbl_lay( / lay_all layname laydata)1(setq lay_all " 画層一覧：") ; テキスト 画面に表示する最初の表題を設定

2(setq layname (tblnext "LAYER" T)) ; 最初の画層の情報を取得する

3(while layname ; layname が nil を返すまで繰り返す

4(setq laydata (cdr (assoc 2 layname))) ; ;layname の画層名だけを取得する

5(setq lay_all (strcat lay_all "¥n" laydata)) ; 画層名を 1 つの文字列にする

6(setq layname (tblnext "LAYER")) ; 次の画層 ( 無ければ nil を返す )(70 . 0) フラグ

7(princ lay_all) ; 画層名一覧の文字列を表示する(62 . 7) 色番号、非表示の場合は負数

8(textscr) ; テキスト ウィンドウに切り替えて表示する(6 . "CONTINUOUS") 線種名

AutoLISP の関数

strcat は、
P1-67 を参考);while(2 . "0") シンボル名

textscr は、
P1-140 を参考(princ));end②次の画層を取得します。
(tblnext "layer" )while は、
P1-129 を参考→ nil（これ以上無い場合）

AutoLISP の関数

TBLNEXT

テキスト ウィンドウに表示した画層一覧

Point!
tblnext 関数は、繰り返し使用されるたびに、指定したテーブル内の次の項目を返します。rewind 引数が指定され、その値が nil 以外の場合は、シンボル テーブルの最

例題は、
P2-149 を参考

初に戻り、シンボル テーブルの最初の項目が取得されます。
→②において、(tblnext "layer" T) とすると、返り値は <nil> ではなく、最初に戻り
再度、<((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous"))> の値が返ります。
有効な シンボルテーブルには、"LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK"、"UCS"、"APPID"、"DIMSTYLE"、"VPORT" があります。引数は、大文字と小文字は区別されません。

tbl_lay.lsp
目的：
主要関数：

図面の画層一覧を表示する
図面内の全画層名を取得し、テキスト スクリーンに表示します。
<tblnext><while><assoc><cdr><strcat><princ><textscr>

Point!

上記プログラムの②の (tblnext "LAYER" T) を (tblnext "BLOCK" T) に、⑥の "LAYER" を "BLOCK" に変更すると、下図のように、この図面にあるブロックの一覧を表示できます。

[ ブロック挿入 ] ダイアログ

1-59

リスト操作関数テキスト ウィンドウに表示したブロック一覧

リスト操作関数1-60

第 2 章－ AutoLISP の関数

算術演算関数

1 四則計算の演算関数＋

AutoLISP には、整数や実数を処理するための関数がありますが、その書式は通常の数式の記述方法とは異なります。
AutoLISP は CAD の業務に特化した LISP ですから、特に三角関数を初めとする角度の計算方法を理解することが重要です。

(setq a 10 b 20 c 30)( ＋ a b c)

この節では、最も良く利用される基本的な算術演算関数を学びます。

AutoLISP の関数

使用頻度の高い AutoLISP の算術演算関数を、次の表に示します。（順不同）①四則計算の算術演算関数
関 数
説 明(+ (add) [ number number] ...)
すべての数値の合計を返します。
(- (subtract) [number number] ...) 1 番目の数値から 2 番目以降の数値を引いた差を返します。
(* (multiply) [number number] ...) すべての数値の積を返します。
(/ (divide) [number number] ...)
1 番目の数値をそれ以外の数値の積で割った商を返します。
(1+ (increment) number)
数値を 1 増加します ( インクリメントします )。
(1- (decrement) number)
数値を 1 減少します ( デクリメントします )。
定数 e( 実数 ) を指定された値で累乗した結果を返します(exp number)( 逆自然対数 )。
(expt base power)
指定された値で数値をべき乗した結果を返します。
(sqrt number)
数値の平方根を実数で返します。
(log number)
数値の自然対数を実数で返します。
②角度の算術演算関数
関 数(atan num1 [num2])(cos ang)(sin ang)③最大・最小の算術演算関数
関 数
説 明(abs number)
引数の絶対値を返します。
(gcd int1 int2)
2 つの整数の最大公約数を返します。
(max [ number number ...]) 指定された数値の中の最大値を返します。
(min [ number number ...]) 指定された数値の中の最小値を返します。
(rem [ num1 num2 ...])
1 番目の数値を 2 番目の数値で除算し、剰余を返します。
④論理の算術演算関数
関 数(~ (bitwise NOT) int)
(logand [ int int ...])(logior [ int int ...])(lsh [ int numbits])(minusp number)(zerop number)

1-61

－

説 明
引数のビット方式の NOT(1 の補数 ) を返します。
整数のリストのビット方式の AND( 論理積 ) の結果を返します。
整数のリストのビット方式の OR( 論理和 ) の結果を返します。
指定されたビット数だけ整数を論理的にビット シフトした結果を返します。
数値が負かどうかを調べます。
数値がゼロに評価されるかどうかを調べます。

算術演算関数→ 60
2 番目以降の引数の総和を第 1 引数から引いた値を返します(setq a 10 b 20 c 30)( － a b c)＊

→ － 40 (10-20-30)
全ての引数の積を返します(setq a 10 b 20 c 30)( ＊ a b c)/

→ 6000 (10 × 20 × 30)
1 番目の引数を 2 番目以降の引数の積で割った値を返します(setq a 30.0 b 20.0 c 10.0)( ＊ a b c)
1+

説 明
数値のアークタンジェント ( 逆正接 ) をラジアン単位で返します。
角度のコサイン ( 余弦 ) をラジアン単位で返します。
ラジアン単位の実数で表した角度のサイン ( 正弦 ) の値を返します。

引数の総和を返します

AutoLISP の関数

第2節

第 2 章－ AutoLISP の関数→ 0.15 (30 ÷ 20 ÷ 10)
引数に１を加えた値を返します (1 と＋の間を空けてはいけません。
）(setq a 10 )(setq a (1+ a )1-→ a = 11
引数から１を引いた値を返します (1 と－の間を空けてはいけません。
）(setq a 10 )(setq a (1- a )
EXPT

→a=9
引数の乗を返します(expt 2 3)

→ 8 (2 × 2 × 2)

(expt 2.0 4.0)

→ 16.0 (2.0 × 2.0 × 2.0 × 2.0)

SQRT

実数の平方根を返します(sqrt 9)→ 3.0

(sqrt 3)

→ 1.73205

算術演算関数1-62

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

2 角度の演算関数
SIN

3 最大・最小の演算関数
角度の正弦を返します（角度は、ラジアンで指示します。）

MAX(sin 0.0)→ 0.0(setq a 10 b 20 c 30)(sin ( / pi 2))→ 1.0(max a b c)(sin pi)→ 1.22465e-016
MIN
COS

最大の値を返します→ 30
最少の値を返します

角度の余弦を返します（角度は、ラジアンで指示します。）(cos 0.0)→ 1.0(cos ( / pi 2))→ 6.12323e-017(cos pi)→ -1.0ATAN(min a b c)
ABS

数値のアークタンジェント ( 逆正接 ) をラジアン単位で返します→ 10
引数の絶対値を返します(abs -65.4)→ 65.4(abs 3.14)→ 3.14

AutoLISP の関数

AutoLISP の関数(setq a 10 b 20 c 30)

書式：(atan num1 num2)
REM

num1 引数のみを指定した場合は、num1 のアークタンジェント ( ラジアン単位 )。
num1 と num2 引数の両方を与えた場合、atan 関数は、num1/num2 のアークタンジェント
をラジアン単位で返します。
(atan 1.0)

→ 0.785398(atan -1.0)→ -0.785398(atan 2.0 3.0)

→ 0.588003(atan 2.0 -3.0)→ 2.55359

割り算の余りを返します（第１引数を第２引数で割った余り。
）(rem 30 4)→2(rem 3 4.0)

→ 3.0

4 論理の演算関数

Point!
線分の極座標入力は、直線距離と角度を入力します。

pt2

右図のように、点 pt1 から点 pt2 へ線分を作成するために必要な情報は、直線距離（Ｃ）と角度 ( θ ) です。

minusp

数値が負かどうかを調べます

数値が負の時はＴ、それ以外は nil を返します。

今、X 軸の距離 (A) と Y 軸の距離 (B) が与えられた時（直交座標）、
これから、
直線距離
（Ｃ）
と角度 ( θ ) の値を求めることになります。

C(minusp -10.0)→T(minusp 10.0)

→ nil

B

①直線距離は、Ｃ ＝ A ＋ B より、Ｃ (pt1-pt2) を求めます。
222②角度 ( θ ) を求める関数は、ATAN 関数になります。
(atan 51.96 30.0)→ 1.04718（ラジアン）が返ります。

zerop
pt1

A

数値がゼロに評価されるかどうかを調べます

評価結果が 0( ゼロ）の時はＴ、それ以外は nil を返します。

180°： 3.14（ラジアン）＝θ：1.04718（ラジアン）から、(zerop 0.0)→T

θ = 60°になります。

(zerop 0.001)→ nil

ラジアンを角度の文字列に変換する関数 (angtos) を使うと以下のようになります。
(angtos (atan 51.96 30.0)) → "60"1-63

算術演算関数

算術演算関数1-64

第 2 章－ AutoLISP の関数

第3節

第 2 章－ AutoLISP の関数

文字処理関数① AutoCAD が提供する文字処理関係のコマンド
AutoCAD には、文字列を処理するための関数があります。下図は、[ 文字検索 ] コマンドを実行し

1 主な文字列処理関数
STRCASE

英字の大文字と小文字を変換します

たときに表示される [ 検索と置換 ] のダイアログ ボックスです。

(strcase "AutoLISP")→ AUTOLISP （全部大文字になります。
）

このダイアログには、文字処理をコントロールする多くの機能が提供されています。

(strcase "AutoLISP" T)→ autolisp （全部小文字になります。
）

文字列内のすべてのアルファベット文字 ( 全角文字を含む ) を大文字または小文字に変換します。
この関数には 2 つの引数を指定します。文字列を大文字で返すか小文字で返すかを指定する
オプションの引数です。2 番目の引数を指定しないと、その引数は nil に評価され、strcase は

STRCAT②ユーザーが作成した文字処理関係の AutoLISP（第 2 部 3 章 8 節より）
下図はユーザーが作成したヘルプのコメントです。ダイアログの [Help] ボタンを押すと解説文を

文字列を結合します(strcat "Auto" "LISP")→ "AutoLISP"(strcat "@" "100" "<" "45")→ "@100<45"（極座標入力で使用します。
）

複数の文字列を 1 つの文字列に結合します。これは、通常の文字列の中に変数文字列を挿入するときに便利です。

表示します。左側のように記述すれば、右のダイアログが表示されます。
(strcat"¥n 最初に正三角形か正方形を選択します。""¥n ""¥n １辺・・・一辺の長さを指定します。""¥n ""¥n 外接・・・中心と辺の中点の長さを指定します。""¥n ""¥n 内接・・・中心と頂点の長さを指定します。""¥n ""¥nOK ボタンを押してを処理を継続してください。")

この節では、AutoCAD の組み込みコマンドと同様の文字列の処理の仕方を学びます。
使用頻度の高い AutoLISP の 文字列処理関数を、次の表に示します。（順不同）
文字列処理関数
関 数(strcase string [ which])(strcat [string1 [string2] ...)
(strlen [string] ...)
(substr string start [length])(read [string])(wcmatch string pattern)

1-65

説 明
すべてのアルファベットを大文字または小文字に変換した文字列を返します。
複数の文字列を連結した文字列を返します。
文字列の文字数を示す整数を返します。
文字列の部分文字列を返します。
文字列から取得した最初のリストまたはアトムを返します。
ワイルドカードを使用して、文字列のパターン マッチングを行います。

文字処理関数STRLEN

文字列の長さを返します(strlen "AutoLISP")→8(strlen "123 456")→ 7（空白も 1 文字と数えます。
）(strlen " 文字列 ")→ 6（日本語は 2 バイトです。
）(strlen)→0(strlen "")→0(strlen "ABC" "123")→ 6（引数の文字列が複数あると、その合計を返します。
）

SUBSTR

文字列の指定した番目から指定した数の文字を返します(substr "AutoLISP" 5 2)

→ "LI" （1 から数えます。
）(substr "AutoLISP" 5)→ "LISP"（個数を省略すると、最後の文字まで返します。
）

substr 関数は、文字列の部分文字列 ( サブストリング ) を返します。この関数には、2 つの必須
引数と 1 つの省略可能な引数を指定します。最初の引数には、文字列を指定します。
2 番目の引数には、部分文字列に含める文字列の先頭の文字の位置を指定する正の整数です。
3 番目の引数を指定する場合は、部分文字列の文字数を指定します。
3 番目の引数を指定しないと、substr は指定した開始文字以降のすべての文字を返します。

文字処理関数

1-66

AutoLISP の関数

AutoLISP の関数

大文字に変換された文字列を返します。

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

moji_len.lsp
目的：
主要関数：

文字列の中にある空白文字を除外する
このプログラムは、コマンドラインに貼り付けられた文字列から、文字列に含まれる空白文字を除外します。
<getstring><strlen><repeat><substr><strcat><alert>

Step4 ー (setq ans (strcat ・・) 10
コマンドラインに貼り付けた元の文字列と空白を取り除いた新しい文字列を、
ダイアログとコマンドラインに表示する文字を連結します。
<¥n> は改行コードです。

Step1 ー (getstring T "¥n コマンドラインに文字列を貼り付けてください：")) 1" コマンドラインに文字列を貼り付けてください：" のメッセージを表示して、コマンドラ
インへの英数字の貼り付けを受け入れます。（空白のある文字列）"¥n メッセージ ")② (princ ans_moji) 12→ getstring の後に <T> を入れると、空白 < スペース > を受け入れます。もし <T> を付けないと、スペースキーを押した時点で終了してしまいます。
（<T> 以外の英数字でも構いません。
）（コマンドラインに "Auto LISP with Dialog Control Language" の文字を貼り付けた例。）

AutoLISP の関数

元の文字列と空白を取り除いた文字列をダイアログに表示します。
元の文字列と空白を取り除いた文字列をコマンドラインに表示します。
③ (princ) 13
コマンドラインに結果を表示させません。
Step5 －①の結果

Step5 －②の結果

AutoLISP の関数(getstring T

Step5 ー① (alert ans_moji) 11

Step2 ー ① (strlen moji_old) 2
strlen 関数で文字の長さを取得します。英数字は <1> ですが、日本語は <2> を返します。
② (moji_new "") 3
新しい文字列の初期値を ""（空）にセットします。repeat 関数で順番に文字を追加します。

Point!
文字列入力関数

Step3 ー ① (setq i 1) 4

Getstring→ Step1

substr 関数で文字を順番に取り出していくカウントを <1> にセットします。
② (repeat moji_len・・・) 5文字の個数分だけ以下のプログラムを繰り返します。
③ (substr moji_old i 1) 6

Strlen
文字列処理関数

Substr→ Step2 ～ 4Strcat

入力した文字列から 1 つ読み込んで変数 <moji> に代入します。
substr 関数の書式は、(substr 文字列 何番目 文字数 ) です。
④ (if (/= moji " ") 7
読み込んだ文字が、<" "> でなければ、次の 1 行目の作業を行います。

文字列出力関数⑤ (strcat moji_new moji) 8
取得した文字を最初に用意した文字列 <moji_new> と結合します。
strcat 関数の書式は、(strcat 元の文字列 追加する文字 ) です。
⑥次の文字を取り出すため、カウント <i> を 1 つ増やして、⑤に戻ります。 9

Princ , Alert→ Step5

princ はコマンドラインに結果を表示します。
alert はダイアログに結果を表示します。
princ は、P1-141 を参考
alert は、P1-198 を参考

1-67

文字処理関数

文字処理関数1-68

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
READ(defun C:moji_len( / moji_old moji_len moji_new i moji ans_moji)

文字列から取得した最初のリストまたはアトムを返します; クリップボードからコマンドラインに空白のある英数字の文字列を貼り付ける

1(setq moji_old(getstring T "¥n コマンドラインに文字列を貼り付けてください："))2(setq moji_len (strlen moji_old))3(setq moji_new ""); 入力された文字数を取得; 空白を取り除いた文字列の初期値を <""> にセット

→ Step1］(read "100 200 300")→ 100 [ 整数値 ](read " 建具 外構 寸法線 ")→ 建具 [ シンボル ]（注：文字列では無い）→ Step2(read "( 建具 外構 寸法線 )")→ ( 建具 外構 寸法線 ) [ 最初のリスト ](read "(a b c)(c d)")→ (a b c) [ 最初のリスト ];repeat 関数で文字列から 1 つずつ文字を取り出し、空白を取り除いて文字を再度連結する(setq i 1)

5(repeat moji_len

read 関数は任意の LISP データの文字列を分析して、文字列内の最初の式を適切なデータタイプ; 文字の数だけ繰り返す

6(setq moji (substr moji_old i 1))

7(if (/= moji " ")に変換して返します。

; 文字を 1 つずつ取り出す; 文字が <" ">（1 文字空白）でなければ、以下の処理を行う(setq moji_new (strcat moji_new moji))

8

AutoLISP の関数;substr 関数で文字を順番に取り出していくカウントを <1> にセット

; 新しい文字列に追加→ Step3

書式

) ;if
9

(setq i (1+ i)); コマンドラインとダイアログに表示するために文字を 1 つに連結する

10; 文字を連結する"¥n 元の文字は：" moji_old

		

"¥n "

		

"¥n 結合文字は：" moji_new		);strcat

比較する文字列

マッチングするパターンを含んだ文字列 )比較するときは、大文字と小文字を区別します。

) ;repeat		(wcmatch

ワイルドカードを使用して、文字列のパターン マッチングを行います

2 つの引数がマッチしたときは、<T> を返します。しなかったときは、<nil> を返します。

; 次の文字を取り出すため、カウント <i> を 1 つプラスして⑤に戻る(setq ans_moji (strcat

WCMATCH(wcmatch "LISP" "Lisp")→ nil(wcmatch "LISP" "LISP")→T(wcmatch "LISP" "L*")→T→ Step4
比較する文字列が複数あるときは、その中のいずれかを満足していれば <T> を返します。
(wcmatch "LISP" "Lisp,L???" ));setq11(alert ans_moji); ダイアログに元の文字列と新しい文字列を表示する

12(princ ans_moji); コマンドラインに元の文字列と新しい文字列を表示する

13(princ)AutoLISP の関数

4→ Step5; コマンドラインに結果を表示させない→ T（2 番目にマッチしている）

円記号 <¥> の検索（<¥> 記号はエスケープ文字として使用されるので、文字列内で <¥> 記号を作成するには、2 つの円記号 <¥¥> が必要です。
）(wcmatch "LISP" "?¥¥?)→ nil) ;end番号
関数名説 明① getstring T
getstring の後に <T> を入れると、空白 < スペース > も受け入れます。
② strlen
文字の長さを取得する関数です。
③ (setq moji_new "") 新しい文字の初期値を ""（空）にセットして、スタートします。
④ (setq i 1)
文字を順番に取り出していくカウントを <1> にセットします。
⑤ repeat
文字の個数分だけ次のプログラムを繰り返します。
⑥ substr
取得した文字列から 1 つずつ読み込みます。
⑦ (if (/= moji " ")読み込んだ 1 文字が、<" "> かどうかをチェックします。
⑧ strcat
取得した文字列を順番に連結していきます。
⑨ (setq i (1+ i))
次の文字を取り出すため、カウント <i> を 1 つ増やして⑤に戻ります。
⑩ strcat
結果を表示するために、元の文字列と新しい文字列を連結します。
⑪ alert
連結した文字列をダイアログに表示します。
⑫ princ ans_moji
連結した文字列をコマンドラインに表示します。
⑬ princ⑫の結果を再表示しません。
getstring は、P1-153 を参考
repeat は、P1-124 を参考

1-69

文字処理関数

ワイルド カード文字
定 義
1 つの数字にマッチします
1 つのアルファベット文字にマッチします
1 つの非英数字にマッチします
空文字列を含む任意の文字シーケンスにマッチし、検索パターンの先頭、* ( アスタリスク )
中間、末尾のどこにでも使用できます。
? ( クエスチョン マーク ) 任意の 1 文字にマッチします
パターンの先頭の文字の場合、パターン以外の任意の文字にマッチしま~ ( ティルダ )す[...]
囲まれた文字のいずれか 1 文字にマッチします[~...]
囲まれた文字以外の 1 文字にマッチします- ( ハイフン )角括弧内で使用され、文字の範囲を指定します, ( カンマ )2 つのパターンを区切ります` ( 逆クォーテション )特殊文字をエスケープします ( 次の文字を文字どおりに読みます )文字# ( シャープ記号 )@ ( アット記号 ). ( ピリオド )文字処理関数1-70

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

第4節

ジオメトリック関数

1 距離のジオメトリック関数

下図は [ 情報 ] の中にある [ ジオメトリック計算 ] を行うメニューです。

DISTANCE

既知の 2 点間の距離を返します。

①の [ 距離 ] を選択すると、次のようなメッセージが表示されます。
(setq p1 (getpoint "¥n1 点目を指示："))

1 点目を指定 :2 点目を指定 または [ 複数点 (M)]: 長さ = 86.3058、 XY 平面の角度 = 2、XY 平面からの角度 = 0
デルタ X = 86.2691、デルタ Y = 2.5166、デルタ Z =(setq p2 (getpoint p1 " ￥n2 点目を指示："))0.0000(setq dis1 (distance p1 p2))②の [ 角度 ] を選択すると、次のようなメッセージが表示されます。
角度の頂点を指定 :頂点からの角度の 1 点目 :頂点からの角度の 2 点目 :角度 = 52 ﾟ

①

1

2 点目

58
86.30

1 点目

2

コマンド : !dis1→ コマンドラインに !dis1 と入力します。

694.475→ コマンドラインに距離が表示されます。

distance 関数②頂点

角度 (52° )AutoLISP の関数

AutoLISP の関数

2 点目

三角形の三辺の長さを合計する三角形の 3 点を選択して、三辺の長さの合計を計算します。
p1(50,50)

1 点目

上記の①を AutoLISP では以下のように記述します。
(distance 1 点目

2 点目 )(angle 1 点目

2 点目 )(defun C:dist1( / p1 p2 p3 dis1 dis2 dis3 dis_sum)​
この節では、このようにオブジェクトの長さや角度などの計算方法を学びます。
使用頻度の高い AutoLISP のジオメトリック関数を、次の表に示します。
①距離のジオメトリック関数
関 数(distance pt1 pt2)②角度のジオメトリック関数
関 数(angle pt1 pt2)
(polar pt ang dist)

説
2 点間の 3D 距離を返します。

明説 明
2 つの端点で定義される線分の角度をラジアン単位で返します。
指定された点から指定された角度と距離だけ離れた UCS 3D 点を返します。

③座標計算のジオメトリック関数
関 数
説 明(inters pt1 pt2 pt3 pt4 [onseg]) 2 本の線分の交点を検出します。
指定された点にオブジェクト スナップ モードを適用して取得し(osnap pt mode)
た 3D 点を返します。
指定された文字オブジェクトを計測し、その文字を囲むボック(textbox elist)
スの対角頂点の座標を返します。

1-71

p3(100,0)p2(0,0)

同様に②を AutoLISP では以下のように記述します。

ジオメトリック関数(setq p1 (list 50 50))

→ p1 の座標を (50,50) にセットします。

(setq p2 (list 0 0))→ p2 の座標を (0,0) にセットします。

(setq p3 (list 100 0))→ p3 の座標を (100,0) にセットします。

(setq dis1 (distance p1 p2))

→ p1 から p2 の長さを計算します。

(setq dis2 (distance p2 p3))

→ p2 から p3 の長さを計算します。

(setq dis3 (distance p3 p1))

→ p3 から p1 の長さを計算します。

(setq dis_sum (+ dis1 dis2 dis3))→ 三辺の長さの合計を計算します。

(princ dis_sum)(princ)→ コマンドラインに表示します。

) ; end<241.421> が表示されます。

ジオメトリック関数

1-72

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
選択した線分の長さを計算する

Step4 ー 選択した線分の終点 (pe) の座標を取得します。 4

線分を選択し、その図形情報から始点と終点の座標を取得して、線分の長さを計算します。
<entsel><car><entget><assoc><cdr><distance>

コマンド : (setq pe (cdr (assoc 11 en2)))

dist2.lsp
目的：
主要関数：

(539.923 711.483 0.0)pe
→ (assoc 11 en2) から終点 (11 539.923 711.483 0.0)<11 と座標のセット > を取り出します。
→ cdr 関数で 2 番目以降（Ｘ、Ｙ、Z 座標）を取り出します。
en1
Step5 ー distance 関数で、線分の長さ (dis1) を計算します。 5
ps
コマンド : (setq dis1 (distance ps pe))

AutoLISP の関数

コマンド : (setq en1 (entsel "¥n 線分を指示："))線分を指示：(< 図形名 : 7ef03998> (314.077 600.574 0.0))

AutoLISP の関数→ 338.968

Step1 ー マウスで既存の線分を選択します。(en1) 1

Step6 ー princ 関数で、結果を表示します。 6
Step7 － princ 関数だけの場合は、コマンドラインには、何も表示しません。 7→ entsel 関数は、図形名と選択した位置の座標値を取得します。
(defun C:dist2( / en1 en2 ps pe dis1)

Step2 ー 図形情報から、図形名だけを取得します。(en2) 2
1(setq en1 (entsel "¥n 線分を指示："))コマンド : (setq en2 (entget (car en1)))2(setq en2 (entget (car en1))); 図形情報を en2 に代入((-1 . < 図形名 : 7ef03998>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A3") (100 .

3(setq ps (cdr (assoc 10 en2))); 始点の座標を取得"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")4(setq pe (cdr (assoc 11 en2))); 終点の座標を取得(10 233.691 566.153 0.0) (11 539.923 711.483 0.0) (210 0.0 0.0 1.0))

5(setq dis1 (distance ps pe))

; 始点と終点の距離を計算

6(princ dis1)

7(princ)→ (car en1) から図形名 <7ef03998> が取得できます。
（en1 は図形名と座標値の組み合わせ < ドット・ペア > なので、car 関数でリストの先頭

Step3 ー選択した線分の始点 (ps) の座標を取得します。 3
コマンド : (setq ps (cdr (assoc 10 en2)))(233.691 566.153 0.0)
→ (assoc 10 en2) から始点 (10 233.691 566.153 0.0)<10 と座標のセット > を取り出します。
→ cdr 関数で 2 番目以降（Ｘ、Ｙ、Z 座標）を取り出します。

1-73

ジオメトリック関数→ Step1］→ Step2］→ Step3］→ Step4］→ Step5］→ Step6］→ Step7］) ;endを取得します。
）→ entget 関数は、図形の情報を開示します。（これを変数 <en2> にセットします。）; 結果を表示; 線分の指示番号
関数名① entsel② entget③

cdr(assoc 10)④cdr(assoc 11)⑤⑥⑦

distance
princ dis1
princ

説 明
ユーザーにオブジェクトを選択させます。図形名と座標値が取得できます。
図形名から図形情報を取得します。
(assoc 10) の 10 は始点のグループ コードです。その 2 番目以降が始点の座標です。
(assoc 11) の 11 は終点のグループ コードです。その 2 番目以降が終点の座標です。
2 点間の距離を計測する関数です。
princ の後に距離の数値を表示します。
最後の行に、<nil> を表示させません。

entsel は、P1-210 を参考
entget は、P1-218 を参考

ジオメトリック関数

1-74

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

ANGLE①角度を使った関数

既知の 2 点間の角度を返します。（返り値はラジアン）

・・・

angle

angle 関数は、
すでに分かっている 2 点間の角度を計算します。返される値はラジアンで表示されます。
0度

0 ラジアン(setq p1 (getpoint "¥n1 点目を指示："))45 度

0.25 πラジアン ( 約 0.785 ラジアン )(setq p2 (getpoint p1 " ￥n2 点目を指示："))90 度

0.5 πラジアン ( 約 1.57 ラジアン )180 度

πラジアン ( 約 3.14 ラジアン )360 度

2 πラジアン ( 約 6.28 ラジアン )(setq ang1 (angle p1 p2))
コマンド : !ang1→ コマンドラインに ang1 と入力します。

0.646632→ コマンドラインに角度が表示されます。

POLAR

基点からの角度（ラジアン）と距離で次点の座標を返します。

（例） 点 A(0,0) と点 B(100,100) の角度 (Ang1) を求めてみましょう。
(setq A (list 0.0 0.0))(setq B (list 100.0 100.0))

AutoLISP の関数(setq Ang1 (angle A B))
基点 <p1> からの角度 <ang1> と距離 <dis1> を入力して、次点 <p2> を求めます。
(polar 基点 角度 距離 )上記の 3 行をコマンドラインに入力すると、コマンドラインに 0.785398 が表示されます。

p2
③ )
s1
(di
離
距
①
p1

②角度を使った関数

・・・

polar

線分コマンドで、始点を指示した後、終点をキーボードから入力するときに、始点からの長さと角度② 角度 (ang1)

で終点の座標を指示することもあります。
（極座標入力）このときに、使用される関数が Polar 関数です。

(setq p1 (getpoint "¥n 基点を指示：")); ① p1 の座標を取得する(setq ang1 (getangle "¥n 角度を指示：")); ②の角度を取得する ( ラジアン )書式は次のようになります。

(setq dis1 (getdist "¥n 距離を指示：")); ③の距離を取得する

ただし、この場合の角度はラジアンです。

(setq p2 (polar p1 ang1 dis1)); ①②③を引数として、polar 関数で p2 を計算する

線分コマンドで終点の位置が、始点からみて、長さが 100、角度が 30 度の場合、次のように(command "LINE" p1 p2 ""); 線分コマンドで p1 から p2 の線分を作図する

キーボード入力します。

Point!

(polar 基点 角度

距離 )@100<30

しかし、これをプログラムで記述するときは、30 度をラジアンに換えなければいけません。
180 度が pi( πの記号はキーボードには無いので、pi と表します。) ですから、30 度は (/ pi 6) にpolar 関数で使用する角度はラジアンです。

なります。

②の角度を取得するときに [getangle] 関数ではなく [getreal] 関数で数値を取すなわち、プログラムでは、(polar 基点 (/ pi 6) 100) になります。

得した場合は、度数を角度のラジアンに変換する処理が必要になります。
十進数→ラジアンへ変換するコード (* pi (/ 度数 180.0)) を追加します。

（例） 最初の点をユーザーにマウスで指示 (P1) させて、二点目をその点から、長さ 100、角度 30 度の位置の座標 (P2) を求めるには次のように記述します。

(setq ang1 (getreal "¥n 角度を入力：")) ; 角度を度数で取得(setq P1 (getpoint “¥n 始点を指示：” ))(setq ang1 (* pi (/ ang1 180.0)) )(setq P2 (polar P1 (/ pi 6) 100.0)); 度数をラジアンに変換する(command “LINE” P1 P2 ““)度数からラジアンへの変換は、P1-78、1-79 を参考

1-75

ジオメトリック関数

ジオメトリック関数

1-76

AutoLISP の関数

2 角度のジオメトリック関数

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
度数 (degree) からラジアン (radian) への変換

先ほどのプログラムに、この関数を混在させる場合、以下のようにします。
(defun dtr(a)すから、プログラムを作成する場合は、そのプログラムの中でこの変換作業をしなければいけません。

ang.lsp の前に記述します。

(* pi (/ a 180.0))

前ページの polar 関数ではラジアンが使われます。しかし、ユーザーは度数で入力する場合もありま)(defun C:ang( / dist1 ang1 P1 P2)
次のケース①とケース②のコードを比べて見ましょう。

(setq dist1 (getdist “¥n 距離を入力：” ))ケース①では、2 行目の角度の取得に [getangle] を使っています。これはラジアンを取得しますから(setq ang1 (getreal “¥n 角度を入力：” ))このコードは正しく動きます。

(setq ang1 (dtr ang1))
ケース②(setq dist1 (getdist “¥n 距離を入力：” ))(setq dist1 (getdist “¥n 距離を入力：” ))(setq ang1 (getangle “¥n 角度を入力：” ))(setq ang1 (getreal “¥n 角度を入力：” ))(setq P1

(getpoint “¥n 始点を指示：” ))(setq P1

(getpoint “¥n 始点を指示：” ))(setq P2

(polar P1 ang1 dist1))(setq P2

(polar P1 ang1 dist1))(command “LINE” P1 P2 ““)(command “LINE” P1 P2 ““)

しかし、ケース②ではエラーになります。2 行目の [getreal] は実数を取得する関数ですが、4 行目のang1 に入るのはラジアンでなければいけません。
つまり、[getreal] を使うときは、ang1 をラジアンに変換した数値を入れなければいけないのです。

(setq P1

(getpoint “¥n 始点を指示：” ))(setq P2

(polar P1 ang1 dist1))(command “LINE” P1 P2 ““))
上記プログラムの dtr(a) 関数の ( ) には引数が 1 つ必要です。
( 例 ) dtr(90.0)→ 1.5708 が返ります。

しかし、この場合のようにすべてのプログラムに同じ関数を記述するのは、効率がいいとは言えません。そこで、よく使用する関数を 1 つにまとめておいて、そこから参照するようにしたほうが効率よくなります。
AutoCAD はそのために acad.lsp と acaddoc.lsp を用意してあります。

①角度を度数 (ang1) からラジアン (rad1) への変換
Point!

(* pi (/ ang1 180.0))

acda.lsp に記述されている関数は、新規ファイルがロードされるごとに、メモリに読み込まれます。
しかし、acaddoc.lsp に記述されている関数は、一度読み込まれると他の図面にも有効です。

②角度をラジアン (rad1) から度数 (ang1) への変換(* (/ rad1 pi) 180.0)

P1-8,9 を参考

従って、ケース②は以下のように 3 行目を追加します。

acad.lsp

acad.lsp 又は acaddoc.lsp に書き入れた例(setq dist1 (getdist “¥n 距離を入力：” ))(setq ang1 (getreal “¥n 角度を入力：” ));;;***********************(setq ang1 (* pi (/ ang1 180.0)));;(setq P1

(getpoint “¥n 始点を指示：” ))(setq P2

(polar P1 ang1 dist1))(defun DTR(a)(* pi (/ a 180.0)))(command “LINE” P1 P2 ““)acaddoc.lsp;;;***********************

Point!

;;①度数 (ang1) からラジアン (rad1) への変換式

1-77

度数からラジアンへ変換②ラジアン (rad1) から度数 (ang1) への変換式

180° : pi(3.14) = ang1 : rad1 より

180° : pi(3.14) = ang1 : rad1 より

rad1 = (pi × ang1) / 180 が成立

ang1 = (180 × rad1) / pi が成立

これを LISP 式で表すと、これを LISP 式で表すと、

解 1 rad1 = (* pi (/ ang1 180.0))

解 1 ang1 = (* (/ rad1 pi) 180.0)

解 2 rad1 = (/ (* pi ang1) 180.0)

解 2 ang1 = (/ (* 180.0 rad1) pi)

ジオメトリック関数

ラジアンから度数へ変換(defun RTD(a)(* 180.0 (/ a pi)));;;***********************

ジオメトリック関数

1-78

AutoLISP の関数

AutoLISP の関数

ケース①

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

nitoubun.lsp

主要関数：

線分 (p1-p2) と線分 (p3-p4) の交点 (p5) から、2 本の線分の二等分線 (p5-p6) を作図します。
<entsel><assoc><trans><inters><distance><angle>p2p6

線分のグループ コード
グループコード
意 味100
サブクラス マーカー (AcDbLine)39
厚さ ( 省略可能、既定 = 0)
10
始点 (WCS)
DXF: X 値、APP: 3D 点
20,30
DXF: 始点の Y および Z の値 (WCS)
11
終点 (WCS)
DXF: X 値、APP: 3D 点
21,31
DXF: 端点の Y および Z の値 (WCS)
210
押し出し方向 ( 省略可能、既定 = 0, 0, 1)
DXF: X 値、APP: 3D ベクトル
220,230
DXF: 押し出し方向の Y および Z の値 ( 省略可能 )Step1 ー 線分 (p1-p2) の始点と終点の座標を求めます。

p1① (setq ob1 (entsel " 一本目の線を指示：")) 1(< 図形名 : 7ef03990> (1387.56 1667.17 0.0))

AutoLISP の関数

p5

p3

p4

② ob1 から図形名だけを取り出します。
ob1 は図形名と座標値のリストですから、1 番目の図形名を取り出す関数は、car です。
(car ob1)

Step1 － 1 本目の線分を選択します。

Step2 － 2 本目の線分を選択します。

→ 図形名と指示した位置の座標を取得→ < 図形名 : 7ef03990> を取得③ entget 関数で、< 図形名 : 7ef03990> の中身を開示します。
((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A2") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")(10 1301.34 1642.56 0.0) (11 1784.79 1802.54 0.0) (210 0.0 0.0 1.0))④始点の座標は (10 1301.34 1642.56 0.0) の中に格納されていますので、
assoc 関数で、このリストを取り出します。

→ (10 1301.34 1642.56 0.0)

⑤ 10 の次からのリストが X、Y、Z 座標です。 2
cdr 関数で、リストの 2 番目以降を取り出します。 → (301.34 1642.56 0.0) を取得⑥終点の座標は、 (11 1784.79 1802.54 0.0) ですから同様にして取り出します。 4⑦始点と終点の座標をワールド座標からユーザー座標に変更します。 3 5

Step3 ～ 8 － 2 等分角の線分を作成します。

Step9 －最後に座標系等を元に戻します。

Step2 ー同様にして、線分 (p3-p4) の始点と終点の座標を求めます。 6 7 8 9 10

ワールド座標系とユーザー座標系が同じ場合は、変更する必要はありません。
しかし、事前に変更されていることもありますから、そのような時でもエラーにならないような処置をしておくことが大切です。
ユーザー座標系は、P1-110 を参考

1-79

ジオメトリック関数

ジオメトリック関数

1-80

AutoLISP の関数

目的：

二等分線を作図する

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
Step5 ー交点 (p5) から端点 p2 への角度を求めます。 16 17

Step3 －線分 (p1-p2) と線分 (p3-p4) の交点を求めます。 11
最後の引数に <nil> を加えると、2 本の線分が実際に交差していなくても仮想交点の(setq ang1 (angle p5 p2))

座標を計算します。

同様に、交点 (p5) から端点 p4 への角度を求めます。

(setq p5 (inters p1 p2 p3 p4 nil))(setq ang2 (angle p5 p4))
Step6 ー ang1 と ang2 の半分の角度を ang2 に加えた角度が 2 等分線の角度になります。 18

Step4 ー交点 p5 から遠い方の端点を p2 と p4 にします。 12 13 14 15(setq ang3 (+ (/ (- ang1 ang2)2) ang2))

線分 p1-p2 と交点 p5 の距離を比較して、p1 より p2 が p5 より遠ければそのまま、
p2 の方が p1 より p5 に近ければ、p1 と p2 の座標を入れ替えます。

① ang1 > ang2 の時は線分 (p1-p2)

ang1 < ang2 の時は①の反対側にと線分 (p3-p4) の中間に作図する。

次の Step5 で交点 p5 から点 p2 への角度を求めるのですが、もし p5 と p2 が同じ座標作図する。

（同様に p5 と p4 が同じ座標）であれば、角度が計算できません。（下図①のケース）

p4

AutoLISP の関数

このエラーを避けるために、角度を計算する各点は必ず離れている点を指定する必要が

p2
p6

あります。
（下図②のケース）交点 p5 と線分 (p1-p2) の各点の座標の距離を比較して、p5 から遠くにある方の点を p2

ang2

ang1

にしています。線分 (p3-p4) も同様の処理をします。
​

p4(if (> (distance p5 p1) (distance p5 p2))
p1

(setq s p1 p1 p2 p2 s))
もし、p1 が p2 より p5 から遠くにあれば、p1 と p2 を入れ替えます。
まず、p1 の座標を仮の変数 
 にセットして、p2 の座標を p1 に移し、最後に仮の変数
 の座標を p1 に移します。

p3

p2

p3
p5

ang2

p1

ang1

p5
p6

線分 (p3-p4) も同じ処理を行います。

Step7 －スナップ角度を ang3 に合わせます。
（カーソルが ang3 と同じ角度に傾きます。
） 19① p5 と p2、p4 が同じ座標の場合（エラーになる）② p5 より遠い方を p2 と p4 にする

p1

p2(setvar "SNAPANG" ang3)
Step8 ー直交モードにして、線分を作図します。 20（上記 Step6 のようにどちらの向きにも作図できます。
）

an

an

g1

g1

(setvar "ORTHOMODE" 1)
Step9 ー作図が終わると、スナップ角度、直交モード、座標系をワールドに戻します。 21 22 23 24(setvar "SNAPANG" 0)
p2 p5
p4

1-81

ang2

p3

p1 p5
p3

ジオメトリック関数

ang2

p4

(setvar "ORTHOMODE" 0)(command "UCS" "W")

ジオメトリック関数

1-82

AutoLISP の関数

同様に線分 p3-p4 で、交点 p5 から遠い方を p4 にします。

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数;p5 から p2 の角度 ang1 と p4 の角度 ang2 を求める

AutoLISP の関数;; 二本の線情報を取得する

1(setq ob1 (entsel "¥n 一本目の線を指示："))2(setq p1 (cdr (assoc 10 (entget (car ob1)))))

3(setq p1 (trans p1 0 1))

4(setq p2 (cdr (assoc 11 (entget (car ob1)))))

5(setq p2 (trans p2 0 1));1 本目の線分を選択

16(setq ang1 (angle p5 p2))

;p5-p2 の角度を求める

17(setq ang2 (angle p5 p4));p5-p4 の角度を求める;ang1 と ang2 の半分の角度が 2 等分線の角度になる; 始点を取得→ Step1; ユーザー座標に変換

18

Point!

; 終点を取得; ユーザー座標に変換(setq ang3 (+ (/ (- ang1 ang2)2) ang2)) ; 中間の角度; カーソルのアングルを変える

19(setvar "SNAPANG" ang3); スナップ角度を ang3 に合わせる

20(setvar "ORTHOMODE" 1); 直交モードをオンにする

6(setq ob2 (entsel " 二本目の線を指示："));2 本目の線分を選択

21(command "LINE" p5 pause "")7(setq p3 (cdr (assoc 10 (entget (car ob2))))); 始点を取得

22(setvar "SNAPANG" 0)8(setq p3 (trans p3 0 1))

23(setvar "ORTHOMODE" 0)

9(setq p4 (cdr (assoc 11 (entget (car ob2)))))

10(setq p4 (trans p4 0 1))

11(setq p5 (inters p1 p2 p3 p4 nil))→ Step2; ユーザー座標に変換

24; 終点を取得; 交点を求める→ Step3］(setq s p1 p1 p2 p2 s)

13;p5-p1 の方が遠いと(if (> (distance p5 p3) (distance p5 p4))
(setq s p3 p3 p4 p4 s)④→ Step4;;p5 に近い方を p3 にする

15③;p1 と p2 を入れ替える

) ;if

14

番号
① entsel②(if (> (distance p5 p1) (distance p5 p2))

→ Step6］→ Step7］→ Step8; スナップ角度を <0> に戻す; 直交モードをオフにする→ Step9; ワールド座標系に戻す) ;end; ユーザー座標に変換;;p5 に近い方を p1 にする
12(command "UCS" "W");p5 から線分を引く→ Step5;p5-p3 の方が遠いと;p3 と p4 を入れ替える

) ;if

⑤
⑥
⑦
⑧
⑨

ユーザー座標 (trans 関数 ) は、P1-111 を参考

Point!

システム変数 [snapang][snapang] は現在のビューポートでの、スナップとグリッドの回転角度を
現在の UCS を基準に設定します。

⑩
⑪
⑫
⑬
⑭
⑮
⑯
⑰
⑱
⑲

カーソルが 45°

⑳

傾きます。

㉑
㉒
㉓
㉔

関数名

説 明
選択した 1 つ目の線分の図形名と座標値を取得します。
ob1 から図形名を取りだし、グループ コードが <10> のコー(cdr (assoc 10 (entget (car ob1))))
ド情報 (10 は始点座標 ) を取得します。
trans
既存の図形を使う時は、trans 関数で座標系も変換します。
ob1 から図形名を取りだし、グループ コードが <11> のコー(cdr (assoc 11 (entget (car ob1))))
ド情報 (11 は終点座標 ) を取得します。
trans
既存の図形を使う時は、trans 関数で座標系も変換します。
entsel選択した 2 つ目の線分の図形名と座標値を取得します。
ob2 から図形名を取りだし、グループ コードが <10> のコー(cdr (assoc 10 (entget (car ob2))))
ド情報 (10 は始点座標 ) を取得します。
trans
既存の図形を使う時は、trans 関数で座標系も変換します。
ob2 から図形名を取りだし、グループ コードが <11> のコー(cdr (assoc 11 (entget (car ob2))))
ド情報 (11 は終点座標 ) を取得します。
trans
既存の図形を使う時は、trans 関数で座標系も変換します。
inters2 本の線分の交点座標を求めます。
if
1 本目の線分の交点 p5 に近い方を p1 にします。
(setq s p1 p1 p2 p2 s)
p2 の方が p5 に近い場合は、p1 と p2 を入れ替えます。
if
2 本目の線分の交点 p5 に近い方を p3 にします。
(setq s p3 p3 p4 p4 s)
p4 の方が p5 に近い場合は、p3 と p4 を入れ替えます。
angle
p5 から p2 への角度をラジアンで求めます。
angle
p5 から p4 への角度をラジアンで求めます。
(+ (/ (- ang1 ang2)2) ang2)
2 本の線分の中間の角度を計算します。
(setvar "SNAPANG" ang3)
カーソルのスナップ角度を <ang3> に合わせます。
直交モードを <on> にすると、カーソルが <ang3> の角度(setvar "ORTHOMODE" 1)に固定されます。
("LINE" p5 pause "")線分を作図します。始点は p5、終点はユーザーの指示待ち。
(setvar "SNAPANG" 0)
カーソルのスナップ角度を <0> に戻します。
（既定値）(setvar "ORTHOMODE" 0)
直交モードを <off> に戻します。
（既定値）(command "UCS" "W")UCS をワールド座標系に戻します。
（既定値）
inters 関数は、P1-92 を参考

1-83

ジオメトリック関数

ジオメトリック関数

1-84

AutoLISP の関数(defun C:nitoubun( / ob1 p1 p2 ob2 p3 p4 p5 s ang1 ang2 ang3)

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

arc_len.lsp
目的：
主要関数：

Step1 ー (setq en1 (entsel "¥n 円弧を指示："))

円弧の弧長を測定する→ 計測する円弧を選択します。 1(< 図形名 : 7ef039a0> (1316.69 1561.03 0.0)) が取得できます。

選択した円弧の弧長を計算します。
<entsel><entget><assoc><cdr>

円弧には始点・終点の概念はなく、開始角度と終了角度の情報があります。つまりどちらから作図

Step2 ー (setq en2 (entget(car en1)))→ en1 から図形情報を取り出します。 2

以下の情報から、開始角度 (0.722818 ラジアン ) と終了角度 (2.32278 ラジアン ) が判ります。

しても同じ結果になります。 Point!

また、半径の (446.965) が取得できます。

従って円弧の角度は、終了角度から開始角度を減算することで求められますが、円弧が角度 0°をまたがっているかどうかで計算方法が違います。

((-1 . < 図形名 : 7ef039a0>) (0 . "ARC") (330 . < 図形名 : 7ef01cf8>) (5 . "2A4") (100 .

①はまたがっていない場合、②はまたがっている場合です。

"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle")(10 .1541.94 1166.91 0.0) (40 . 446.965) (210 0.0 0.0 1.0) (100 . "AcDbArc")①円弧の角度 (ang1) は、終了角度 (pe) －開始角度 (ps) で計算します。

(50 . 0.722818) (51 . 2.32278))
Step3 ー円弧の開始角度 (50 . 0.722818) と終了角度 (51 . 2.32278) を取得します。 3 4

ang1( 角度 )図形 <en2> から、開始角度の (50 . 0.722818) を取り出す関数は、assoc 関数です。
そして、開始角度 (50 . 0.722818) は、<50> と <0.722818> のペアですから、2 番目の情報

終了角度

開始角度

を取得する関数は cdr 関数になります。終了角度も同様です。
径

半
C(

)

P

0°
②０度 < 右水平方向 > をまたがるときは、以下の計算式を使います。
円弧の角度 (ang2) ＝終了角度 pe ＋ (360 －開始角度 ps)

S2
終了角度

円弧のグループ コード
グループコード
意 味
0
"ARC"
100
サブクラス マーカー (AcDbCircle)39
厚さ ( 省略可能、既定 = 0)
中心点 (OCS)
10
DXF: X 値、APP: 3D 点
20,30
DXF: 中心点の Y および Z の値 (OCS)
40
半径
100
サブクラス マーカー (AcDbArc)
50
開始角度
51
終了角度
押し出し方向 ( 省略可能、既定 = 0, 0, 1)
210
DXF: X 値、APP: 3D ベクトル
220,230
DXF: 押し出し方向の Y および Z の値 ( 省略可能 )

0°
(
PC
径

半

ang2

entsel は、P1-210、entget は、P1-218 を参考

Point!

)

S1 の円弧は始点 (0 , 100)、終点 (100 , 0)、中心 (0 , 0) で作図しました。
S2 の円弧は始点 (50 , 0)、終点 (0 , 50)、中心 (0 , 0) で作図しました。
entget 関数で取得した 2 つの円弧の情報は以下の通りです。

開始角度① S1 の開始角度 (50) と終了角度 (51) は、(50 . 6.28319) (51 . 1.5708) です。
② S2 の開始角度 (50) と終了角度 (51) は、(50 . 6.28319) (51 . 1.5708) です。

③円弧の円周は、直径 (2PC) ×π×円弧角度になります。
例えば、半径 100、円弧角度 45°の場合は、2 × 100 ×π (3.14) × (45/360) ≒ 78.5

1-85

ジオメトリック関数

以上から、円弧はどちらから始めても開始角度と終了角度は同じである
ことが判ります。（開始角度から終了角度は反時計回りです。）

ジオメトリック関数

1-86

AutoLISP の関数

AutoLISP の関数

S1

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

Step4 ー 円弧の半径 (40 . 446.965) を取得します。 5(defun rtd (a) (* 180.0 (/ a pi))) ; ラジアンから度への関数

図形 <en2> から、(40 . 446.965) を取り出す関数は、assoc 関数です。

;rtd 関数は、⑨で使用します。

(defun C:arc_len ( / en1 en2 ps pe pc ang1 ang2 ad)を取得する関数は cdr 関数になります。
Step5 ー 0° ( 右水平方向 ) をまたぐかどうかを判断します。 6 7 8① (if (< pe ps)・・もし pe（終了角度）が ps（開始角度）より小さきときは、
円弧の角度＝終了角度 pe ＋ (360 －開始角度 ps) で計算します。
② pe（終了角度）が ps（開始角度）より大きいときは、円弧の角度＝終了角度 (pe) －開始角度 (ps) で計算します。
Step6 ー ラジアンを度数に変更します。 91(setq en1 (entsel "¥n 円弧を指示："))2(setq en2 (entget (car en1))); 円弧の情報を取得

3(setq ps (cdr (assoc 50 en2))); 円弧の開始角を取得

4(setq pe (cdr (assoc 51 en2))); 円弧の終了角を取得

5(setq pc (cdr (assoc 40 en2))); 円弧の半径を取得

6(if (< pe ps)(setq ang1 (+ pe (- (* pi 2) ps)))8(setq ang1 (- pe ps))
) ;if

AutoLISP の関数→ Step3→ Step4］→ Step5; 大きいときの処理

9(setq ang2 (/ 360 (rtd ang1)))（計算例）0.785 ラジアンを度数にするには、

10(setq ad (/ (* (* 2 pc) pi) ang2))

求めたい度数を <a> とすると、180°： a = π (pi) ： 0.785 になります。

11(prompt "¥n 円弧の長さ：")これから <a> の値は、45°になります。

12(princ ad)

13(princ)Step7 ー 円弧の長さを計算します。 10; 小さいとき処理; 終了角度が開始角度より数）(defun rtd (a) (* 180.0 (/ a pi)))（関→ Step1］→ Step2］; 終了角が開始角より小さければ、1 行目を計算

7

プログラムの前に、ラジアンから度数に変換する関数を記述しておきます。

; 円弧を選択; ラジアンを度数に変換; 弧長の長さを計算

AutoLISP の関数

そして半径 (40 . 446.965) は、<40> と <446.965> のペアですから、2 番目の情報→ Step6］→ Step7］; コマンドラインに表示; 計算結果をコマンドラインに表示) ;end

直径 (2PC) ×π×円弧角度から円弧の長さを求めます。

番号① entsel

Point!

②① arc_len.lsp を実行して、円弧を選択します。
②コマンド ラインに円弧の長さが表示されます。
< 円弧の長さ：65.0532>

③
④
⑤
⑥
⑦

AutoCAD の寸法コマンドで確認します。
③ [ 円弧寸法記入 ] コマンドで、円弧を選択します。
④図面に円弧の長さ寸法が表示されます。
<

1-87

65.05>

ジオメトリック関数

⑧
⑨
⑩
⑪
⑫
⑬

関数名

説 明
取得した円弧の図形名と指示した座標を取得します。
en1 の図形名を car 関数で取り出し、その情報を entget で取得しentgetます。
始点角度のグループ コードの <50> から、始点角度を取得します。
(cdr (aasoc 50 en2))(cdr (assoc 50 en2)) → (cdr (50 . 0.722818)) → (0.722818)
終了角度のグループ コードの <51> から、始点角度を取得します。
(cdr (assoc 51 en2))(cdr (assoc 51 en2)) → (cdr (51 . 2.32278)) → (2.32278)
円弧半径のグループ コードの <40> から、円弧の半径を取得します。
(cdr (assoc 40 en2))(cdr (assoc 40 en2)) → (cdr (40 . 466.965)) → (466.965)0°をまたぐかどうかの判断（終了角度が始点角度より小さいか大(if (< pe ps)
きいかで処理を分岐します。
）
終了角度の方が小さければ <0° > をまたいだ計算を行います。
(+ pe (- (* pi 2) ps))
（360°から開始角度を引いた角度を終了角度に加えます。
）(- pe ps)
またがないときの処理を記述します。
(/ 360 (rtd ang1))
円弧の角度をラジアンから度数に変換して計算します。
(/ (* (* 2 ec) pi) ang2) 円周＝直径×π× ( 中心角を 360°で割った値）
promptコマンドラインに、" 円弧の長さ：" を表示します。
(princ ad)
計算結果の円弧の長さを表示します。
princ
最後の行に、<nil> を表示させません。

ジオメトリック関数

1-88

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

Polar_1.lsp
目的：
主要関数：

Step4 － polar 関数を使い、角度と距離から p2 の座標を計算します。<polar> 4

線分を作成する

polar 関数の書式は、(polar 基点

始点と角度と長さを指定して線分を作図します。
<getpoint><getangle><getdist><polar>

角度 < ラジアン >距離 ) です。

Step5 － "LINE" コマンドで、p1 から p2 までの線分を作図します。<LINE> 5
p2

距離Step5 － P1-P2 の線分を作図

s1)

(di

p2

角度 (ang1)
p1

p1

AutoLISP の関数

AutoLISP の関数

Step1 －マウスで、1 点目 (p1) を指示します。<getpoint> 1① 1 点目を指示：(defun C:Polar_1( / p1 ang1 dis1 p2)
p1

1(setq p1 (getpoint “¥n1 点目を指示：” ))2(setq ang1 (getangle p1 “¥n 角度を指示：” ))3(setq dis1 (getdist p1 “¥n 距離：” ));1 点目を指示; 角度を入力; 距離を入力;p1、ang1、dis1 から p2 の座標を求める

4(setq p2 (polar p1 ang1 dis1));p1-p2 に線分を作図

Step2 －キーボードから角度を入力します。<getangle> 25②角度を指示：(command “LINE” p1 p2 “” )) ;end→ Step1］→ Step2］→ Step3］→ Step4］→ Step5］

角度をキーボードで数値入力
するか、またはマウスで画面p1上を指示します。

Step3 －キーボードから距離を入力します。<getdist> 3③距離：

距離をキーボードで数値入力
するか、またはマウスで画面上を指示します。

p1

番号
関数名
① getpoint② getangle③ getdist④ polar⑤ command説 明
ユーザーがマウスで指示した座標を変数 p1 にセットします。
ユーザーがマウスかキーボードで入力した数値を変数 ang1 にセットします。
ユーザーがマウスかキーボードで入力した数値を変数 dis1 にセットします。
polar 関数で計算した座標を変数 p2 にセットします。
線分コマンドで、点 p1 から点 p2 まで線分を作図します。

getpoint は P1-156、getangle は P1-155、getdist は P1-156 を参考

1-89

ジオメトリック関数

ジオメトリック関数

1-90

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

Polar_2.lsp
目的：
主要関数：

2 点の中点から線分を作成する(defun C:Polar_2( / p1 p2 ang1 dis1 p3)

2 点を指示して、その中点から線分を作図します。
<getpoint><angle><distance><polar>

Step1 －マウスで、1 点目 (p1) を指示します。
（左の円の中心を指示します。） 1
1 点目を指示：1(setq p1 (getpoint “¥n1 点目を指示：” ));1 点目を取得

2(setq p2 (getpoint “¥n2 点目を指示：” ));2 点目を取得

3(setq ang1 (angle p1 p2))

4

(setq dis1 (/ (distance p1 p2) 2));p1-p2 の距離の半分をセット

5(setq p3 (polar p1 ang1 dis1));p1 から角度 ang1、距離 dis1 の距離が p3

6(command “LINE” p3 pause "") ; 線分を作成→ Step1］→ Step2］;p1-p2 の角度を ang1 にセット

→ Step3

p1

AutoLISP の関数

AutoLISP の関数) ;endStep2 －マウスで、２点目 (p2) を指示します。
（右の円の中心を指示します。） 2
2 点目を指示：2 点間の中点までの角度 (ang1) と距離(dis1) はプログラムが計算します。

p2

角度は (angle p1 p2)→ ラジアンで取得
距離は (/ (distance p1 p2) 2)→ p1-p2 の距離の半分が中点までの距離

番号
関数名① getpoint② getpoint
③

angle

④

distance

⑤

polar

⑥

command

Step3 － polar 関数を使い、p1 と p2 の中点座標 (p3) を計算します。 3 4 5
2 点の中点 p3 から線分を開始します。 6
中点座標を計算し、始点 (p3) にセット

p1

p3

線分の終点 (p4) を指示

説 明
マウスで指示した座標を変数 p1 にセットします。
マウスで指示した座標を変数 p2 にセットします。
2 点間の角度の数値を変数 ang1 にセットします。
書式は、(angle 1 点目 2 点目）です。
2 点間の距離を取得する関数。p1 と p2 の距離を 2 で割って、中点までの距離を出しています。
書式は、(distance 1 点目 2 点目）です。
polar 関数で計算した座標を変数 p3 にセットします。
書式は、(polar 基点 角度 < ラジアン > 距離）です。
線分コマンドを使用して、中点 p3 から線分を出しています。
始点の P3 から始まった後、pause でユーザーの入力待ち状態で止めています。
2 点目を指示すると、<""> で線分コマンドを終了させます。

getpoint は P1-156 を参考

p2

p1

p3

p2

p4

1-91

ジオメトリック関数

ジオメトリック関数

1-92

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

para1.lsp

Step3 － p1 と p2 を結ぶ線分を作成します。 6

2 点に平行な線分を作成する

目的：
主要関数：

マウスで指示した 2 点に平行な線分を作成します。
<getpoint><angle><distance><polar>
p2

p2

p3
距離

p1

s1)

(di

Step4 －作成した線分を、複写コマンドを使い、p3 の位置に複写します。 7

角度 (ang1)

Step1 －マウスで、1 点目 (p1) と 2 点目 (p2) を指示します。 1 2

AutoLISP の関数

AutoLISP の関数

p1

p2
p3

p2

距離

p2

s1)

(di

p1
p1
p1

(defun C:para1( / p1 p2 p3 ang1 dis1)
1(setq p1 (getpoint "¥n どこから："))指示した 2 点から、p1 と p2 の角度 (ang1) を計算します。 32(setq p2 (getpoint p1 "¥n どこへ：")) ; 線分の終点を取得→ ang1 (angle p1 p2)

3(setq ang1 (angle p1 p2))

4

(setq dis1 (getdist "¥n 幅を入力："))5(setq p3 (polar p1 (+ ang1 (* pi 0.5)) dis1)) ;p3 の位置を計算

6(command "LINE" p1 p2 "")7(command "COPY" "L" "" p1 p3)

Step2 －平行線の幅 (dis1) の入力を促します。 4
p2②→ Step1; 始点と終点の角度を計算; オフセットの幅を入力; 線分を作図; 線分を複写) ;end幅を入力：2 点目を指定 :（①から②）①

p1

コマンド : (setq dis1 (getdist "¥n 幅を入力：")); 線分の始点を取得→ Step2→ Step3］→ Step4］→ マウスで 1 点目を指示すると、<2 点目を指定 :>のメッセージが表示されます。
（キーボードからでも入力できます。）

番号
関数名① getpoint② (getpoint p1)③

POLAR 関数を使い、p1 から 90°の角度を計算します。(p3) 5
ang1 から 90°の方向は、(+ ang1 (* pi 0.5)) になります。<90°→ 0.5pi、180°→ pi>（進行方向 <p1-p2> の左側に平行線を作図します。
）

④
⑤
⑥
⑦

説 明
マウスで指示した座標を変数 p1 にセットします。
getpoint の後に p1 を付けると、p1 からのラバーバンドが表示されます。
2 点間の角度の数値を変数 ang1 にセットします。
angle
書式は、(angle 1 点目 2 点目）です。
getdist
距離の数値を変数 dis1 にセットします。
polar 関数で計算した座標を変数 p3 にセットします。
polar
書式は、(polar 基点 角度 < ラジアン > 距離）です。
("LINE" p1 p2 "") p1 から p2 に線分を作図します。
("COPY" "L" "")最後の図形 <Last>（線分）を p1 を基点として、p3 の位置に複写します。
getpoint、getdist は P1-156 を参考

1-93

ジオメトリック関数

ジオメトリック関数

1-94

第 2 章－ AutoLISP の関数
1 辺の長さと中心を指定して正三角形を作図し、自由な位置に回転する
線分の端点 (pt0) を中心に正三角形を作図して、頂点を線分の端点 (pt4) 方向に合わせます。
<getpoint><getdist><polar><entlast><ROTATE>

目的：
主要関数：

pt1

AutoLISP の関数(setq pt0 (getpoint "¥n 三角形の中心を指示："))2(setq dist1 (getdist pt0 "¥n 一辺の長さは？ "))3(setq dist2 (/ dist1 2))

pt3

一辺の長さ

; 中心の座標を取得; 三角形の 1 辺の長さを取得→ Step1;1 辺の長さの半分を計算（三角形の重心を求めるため）; 三角形の重心を基点に各頂点の座標を計算する

4(setq pt1 (polar pt0 (/ pi 2) ( / ( * ( * dist2 (sqrt 3)) 2 ) 3))) ;pt1 の座標

5(setq pt2 (polar pt1 ( / ( * 4 pi) 3) dist1)) ;pt2 の座標

6(setq pt3 (polar pt2 0 dist1)) ;pt3 の座標

pt0

pt0
三角形の中心
pt2

1

pt4

pt4

pt1

(defun c:ang_3hen()→ Step2］→ Step3］→ Step4］; 計算した各頂点にポリラインを作図

7(command "PLINE" pt1 pt2 pt3 "C")8

(setq obj1 (entlast))

9(command "ROTATE" obj1 "" pt0 "R" pt0 pt1 pause) ; 三角形を回転する; 三角形を回転するために選択→ Step5］→ Step6］→ Step7］(princ));end

Step1 －三角形の一辺の長さ <（例）100> を入力し、三角形の中心を指示します。 1 2 3①直角三角形の辺の長さの比率はA

正三角形を作図します。

CD : AC : AD = 1 : 2 : √3 ですから、

pt1

CD が <50> であれば、AD の長さは、50 √3になります。

pt4

2
O √3
B

D

マウスで回転方向 (pt4) を指示します。
pt1

pt2

pt4

②正三角形の中心 <O> までの距離は
1

C

AO : OD = 2 : 1 ですから、

pt0

pt0

AO の長さは、(50 √3 × 2/3) になります。
pt2

Step2 －√3 は LISP 式では (sqrt 3) です。 4

pt3
pt3

従って、AO の長さ (50 √3 × 2/3) は、( / ( * ( * 50 (sqrt 3)) 2 ) 3) となります。
頂点 A は中心 O から角度 90° (pi / 2)、長さは ( / ( * ( * 50 (sqrt 3)) 2 ) 3) の位置になります。
Step3 －頂点 B は、頂点 A から角度 240° (4/3 × pi)、長さは 100 の位置になります。 5(4/3 × pi) は LISP 式では、( / ( * 4 pi) 3) になります。
Step4 －頂点 C は、頂点 B から角度 0°、長さは 100 の位置になります。 6
Step5 －頂点 ABC をポリラインで作図します。 7
Step6 －この三角形は最後に作図した図形ですから、この図形を取得する関数は、entlast です。 8

番号
関数名① getpoint② getdist③ (/ dist1 2)④ polar⑤ polar⑥ polar⑦ PLINE⑧ entlast⑨

ROTATE説 明
マウスで指示した座標を取得して、変数 <pt0> にセットします。
キーボードか画面上からマウスで距離の入力を受け付けます。
三角形の 1 辺の長さの半分を計算します。前ページの CD の距離です。
pt0 からの方向と距離で、pt1 の座標を計算します。
pt1 からの方向と距離で、pt2 の座標を計算します。
pt2 からの方向と距離で、pt3 の座標を計算します。
ポリラインで三角形を作図します。"C" でクローズします。
最後に作成したオブジェクトを取得する関数です。
回転コマンドの参照 <R> を使って、マウスで回転方向を指示します。
<pause> でユーザーが点 pt4 を指示するのを待ちます。

getpoint、getdist は P1-156 を参考
entlast は、P1-209 を参考

Step7 －回転コマンドを使用するとき、オプション "R" を使ってマウスで回転の方向を指示できます。
（参照する角度は点 <pt0-pt1>、新しい角度は点 <pt0-pt4> です。） 9

1-95

ジオメトリック関数

ジオメトリック関数

1-96

AutoLISP の関数

ang_3hen.lsp

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
3 次元空間での交点計算

3 座標計算のジオメトリック関数（線分の交点計算）

下図の 2 本の線分は、pt1(-100,0) と pt2(100,0) の線分と pt3(0,100,100) と pt4(0,-100,100) の線分

2 次元空間での交点計算
INTERSです。

2 本の線分の交点を求めます。
（作図では 5 番目の引数に <nil> を付けるのが安全）

線分 pt1-pt2 は Z=0 の平面上にあり、線分 pt3-pt4 は Z=100 の位置にありますから、この 2 本の線分が交差することはありません。

線分 A(p1,p2) と線分 B(p3,p4) の交点 <p5> を求めます。

しかし、pt1 と pt2 の座標値を X と Y だけで指定した場合は、inters 関数で交点を求めることがで①② < 線分 A と線分 B が交差している場合 >きます。点のいずれかが 2D の場合、inters 関数は線分を現在の作図平面に投影して、2D の交点③ < 線分 A と線分 B が交差していない場合 >のみを検出します。
①と②

③

p3

p3

4 点の全てが 3D 座標 (X,Y,Z を持つ ) の場合は、この 2 本の線分は交点を持たず、nil が返ります。
真上から見た図

斜め上から見た図

p1

p2

p5

p1

p2

AutoLISP の関数

AutoLISP の関数

pt3(0,100,100)
pt3

p5

pt4
p4

p4

①線分同士が交わる場合

pt1(-100,0)

pt2(100,0)

pt2(setq p5 (inters p1 p2 p3 p4))

pt1

②線分同士が必ず交わる場合

pt5（交点）(setq p5 (inters p1 p2 p3 p4 T))③線分同士が交わらない場合（交わっている場合でも有効）

pt4(0,-100,100)(setq p5 (inters p1 p2 p3 p4 nil))
2 本の線分が交差しているか、していないかの検証にも使います。
(setq pt5 (inters p1 p2 p3 p4))
→ もし、pt5 の値が <nil> であれば、この 2 本の線分は交差していないことになります。
Point!
p3(300,200)

p1(100,100)

p2(200,100)p5
×(setq p1 '(100 100));p1 の座標をセット(setq p2 '(200 100));p2 の座標をセット(setq p3 '(300 200));p3 の座標をセット(setq p4 '(300 0));p4 の座標をセット(command "LINE" p1 p2 "") ;p1-p2 の線分を作図(command "LINE" p3 p4 "") ;p3-p4 の線分を作図;2 本の線分から、p5 の座標を計算します。

p4(300,0)(setq p5 (inters p1 p2 p3 p4 nil))→

1-97

p5 = (300.0 100.0) が返ります。

ジオメトリック関数(setq pt1 (list -100 0))→ 点 pt1 に (-100 0) をセット

(setq pt2 (list 100 0))→ 点 pt2 に (100 0) をセット

(setq pt3 (list 0 100 100))→ 点 pt3 に (0 100 100) をセット

(setq pt4 (list 0 -100 100))→ 点 pt4 に (0 -100 100) をセット

(command "LINE" pt1 pt2 "")→ 点 pt1 から点 pt2 へ線分を作図(command "LINE" pt3 pt4 "")→ 点 pt3 から点 pt4 へ線分を作図(setq pt5 (inters pt1 pt2 pt3 pt4 nil))→ 2 本の線分の交点を求める

コマンドラインから、!pt5 と入力します。

→ (0.0 0.0) が返ります。

すべての点は、現在の UCS で表されます。4 点の全てが 3D 座標 の場合、inters 関数は 3D 座標の交点をチェックします。
もし、pt1 の座標が (-100,0,0) であり、pt2 の座標が (100,0,0) であれば、この 2 本の交点は検出されません。

ジオメトリック関数

1-98

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

第5節

データ変換関数1 実数 ↔ 整数への変換関数（REAL ↔ INT）

AutoCAD のシステム変数に [CDATE] があります。これは、現在の日時を 10 進数形式で表示する関

FLOAT

数です。
①キーボードから次のように入力します。
(setq date1 (getvar "CDATE"))→ <2.02007e+07> が返ります。
​②これだけでは判りづらいので文字列に変換します。
(setq date1 (rtos (getvar "CDATE")))→ <"20200720.1516"> が返ります。

(substr date1 1 4)

→ <"2020"> が返ります。

④ 5 番目から 2 つは月になります。
(substr date1 5 2)

(float 3.14)→ 3.14(float 3)

→ 3.0

FIX

③最初から 4 つ目までが西暦の年になります。

→ <"07"> が返ります。

数値を実数に変換します。

数値を整数に変換します。

(fix 3.14)→3(fix 3)→3⑤ 7 番目から 2 つは日になります。
→ <"20"> が返ります。

AutoLISP の関数

AutoLISP の関数(substr date1 7 2)

⑥ 10 番目から 2 つは時になります。（9 番目は小数点 <.> のため無視します。)(substr date1 10 2)→ <"15"> が返ります。

切り捨て・切り上げ・四捨五入⑦ 12 番目から 2 つは分になります。
(substr date1 12 2)→ <"16"> が返ります。

①円周率 (3.14159・・・) の小数点 3 桁以下を切り捨てる処理。

このように [CDATE] だけの情報 <2.02007e+07> では何のことか判りませんが、数値情報を文字情報に変換することで(setq a (* pi 100))→ 314.159・・・（円周率を 100 倍します。
）

本日の日時情報であることが理解できます。

(setq a (float (fix a)))→ 314.0（fix で整数止めにした後、実数に変換）

この節では、整数や実数、文字列情報などをお互いに変換しあう関数を学びます。

(setq a (/ a 100))→ 3.14（314.0 を 100 で割って、元に戻します。
）

使用頻度の高い AutoLISP の変換関数を、次の表に示します。（順不同）!a→ コマンドラインに 3.14 が表示されます。

①実数 ↔ 整数への変換関数（REAL ↔ INT）
関 数
説 明
(float number)
数値を実数に変換して返します。
(fix number)
実数の小数点以下を切り捨てて整数に変換して返します。

②円周率 (3.14159・・・) の小数点 3 桁目を切り上げて、小数点 2 桁にする処理。

②文字 → 数値への変換関数（STR → INT、REAL)
関 数
説 明(atoi string)
文字列を整数に変換して返します。
(atof string)
文字列を実数に変換して返します。
角度を表す文字列をラジアン単位の実数 ( 浮動小数点 ) 値に
(angtof string [mode])
変換して返します。
(distof string [mode])
実数（浮動小数点）を表す文字列を、実数値に変換して返します。
③数値 → 文字への変換関数（INT、REAL → STR）
関 数
説 明
(itoa int)
整数を文字列に変換して返します。
(rtos number [mode [precision]]) 実数を文字列に変換して返します。
(angtos angle [mode [precision]]) ラジアン単位の角度の値を文字列に変換して返します。
④計測単位同士の変換関数
関 数(trans pt from to [disp])(cvunit value from to)

1-99

＆

座標系同士の変換関数(setq a (* pi 100))→ 314.159・・・（円周率を 100 倍します。
）(setq a (+ a 0.9))→ 315.059・・（小数点 1 桁に、0.9 を加えます。
）(setq a (float (fix a)))→ 315.0（fix で整数止めにした後、実数に変換）(setq a (/ a 100))→ 3.15（315.0 を 100 で割って、元に戻します。
）!a→ コマンドラインに 3.15 が表示されます。

③円周率 (3.14159・・・) の小数点 3 桁目を四捨五入する処理。
(setq a (* pi 100))→ 314.159・・・（円周率を 100 倍します。
）(setq a (+ a 0.5))→ 314.659・・（小数点 1 桁に、0.5 を加えます。
）(setq a (float (fix a)))→ 314.0（fix で整数止めにした後、実数に変換）(setq a (/ a 100))→ 3.14（314.0 を 100 で割って、元に戻します。
）!a→ コマンドラインに 3.14 が表示されます。

説 明ある座標系から別の座標系に、点 ( または変位 ) を変換します。
ある計測単位から別の計測単位に値を変換します。

データ変換関数

データ変換関数1-100

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
fix による計算誤差

2 文字 → 数値への変換関数（STR → REAL、INT）①前ページでは、π ( 円周率 ) を整数に丸めるときに fix 関数を使いました。
ATOF②減算する関数を使った時に、以下のようになる場合があります。
(fix (- 20.9 10.9)) → <9> が返ります。(<10> ではありません。)

文字列を実数に変換します。

(atof "3.14")→ 3.14(atof "3")

→ 3.0

ATOI
(atoi "3.14")→3(atoi "3")→3

AutoLISP の関数③実数を文字列に変換する関数 [rtos] で確認してみると、以下のような循環小数になっています。
コマンド : (rtos (- 20.9 10.9)2 20)

文字列を整数に変換します。

DISTOF

実数（浮動小数点）を表す文字列を、実数値に変換します。

→ "9.999999999999998"（十進法で小数点以下 20 桁まで表示）(setq txt1 "3.14")→ 変数 text1 に、"3.14" を代入。

(setq txt1 (distos txt1 2 1))→ txt1 を十進表記で小数点以下 1 桁表示。

コマンド : !txt1→ コマンドラインに !txt1 と入力します。

3.1→ コマンドラインに <3.1> が表示されます。

④システム変数 [LUPREC]（長さの単位の表示精度を設定）を <2> で再度計算してみます。
(rtos (- 20.9 10.9))→ <"10"> が返ります。
システム変数 [LUPREC]

モード

1
2
3
4
5

rtos の表示形式コード
指数表記
十進表記
工業図面表記建築図面表記分数表記

表示形式< モード > を省略した場合、LUNITS の現在値を使用します。
ANGTOF

角度を表す文字列を角度の実数 ( 浮動小数点 ) 値に変換します。

(setq ang1 (getstring "¥n 角度を入力：")) → "45" を入力。

⑤このようにシステム変数 [LUPREC] の表示精度によって、返り値が違う場合が起こります。

(setq ang1 (angtof ang1))→ ang1 をラジアンに変換します。

コマンド : !ang1→ コマンドラインに !ang1 と入力します。

0.785398→ コマンドラインに <0.785398> が表示されます。

こうした誤差を回避するために、一度文字列に変換してから fix 関数を使うのが無難です。
(fix (atof (rtos (- 20.9 10.9)))) → <10>
こうすると、システム変数 [LUPREC] で丸めて、整数部だけが正確に返ります。

0
1
2
3
4

モード

angtof の表示形式コード
度（十進数）
度/分/秒
グラジェント
ラジアン
測量単位

表示形式

< モード > を省略した場合、AUNITS の現在値を使用します。

1-101

データ変換関数

データ変換関数

1-102

AutoLISP の関数(fix pi) → <3> が返ります。

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

distof 関数

長さと距離の文字列を実数に変換する

書式(distof 変換する文字列

AutoCAD のダイアログ ボックスの数値文字

モード )distof 関数 ( 距離・長さの文字列を実数に変換 ) は、rtos 関数と反対の働きをします。

下図は AutoCAD の [ARRAYCLASSIC] コマンドのダイアログ ボックスです。

結果の文字列の形式は、AutoCAD のシステム変数の値によってコントロールできます。

①の [ 複写の回数 ] と②の [ 全体の複写角度 ]モードは、[LUNITS] に従って設定し、小数点以下の表示は [LUPREC] で指定します。

は数値の入力ですが、ダイアログ ボックスの変換式(distof "5.2500E+01" 1)(distof "52.5" 2)(distof "4'-4.5¥"" 3)(distof "4'-4 1/2¥"" 4)(distof "52 1/2" 5)モード
1 = 指数表記
2 = 十進表記
3 = 工業図面表記
4 = 建築図面表記
5 = 分数表記

LUNITS（長さの単位）

52.5
52.5
52.5
52.5
52.5

値は文字情報になっています。

結果

LUPREC（長さの表示精度）

つまり、①の値は <4> ではなく <"4"> です。

1
2

また②の値は <360> ではなく <"360"> です。
この数値を AutoCAD 側で数値に変換しています。
コマンド : _arraypolar

AutoLISP の関数

AutoLISP の関数

オブジェクトを選択 : 認識された数 : 1
オブジェクトを選択 :種類 = 円形状 自動調整 = はい
配列複写の中心を指定 または [ 基点 (B)/ 回転軸 (A)]:
項目数を入力 または [ 項目間の角度 (A)/ 式 (E)] <4>: ①← (atoi 関数で整数に変換）
全体の複写角度を入力 または [ 式 (EX)] <360>: ②← (angtof 関数で角度に変換）

angtof 関数

角度を表す文字列を実数に変換する

書式(angtof 変換する文字列

ユーザー作成のダイアログ ボックスの数値文字

モード )角度を表す文字列をラジアン単位の実数に変換します。ANGTOF 関数は ANGTOS 関数の反対の働きをします。

下図はユーザー作成の [S_Edit21.lsp] のダイアログ ボックスです。

結果の文字列の形式は、AutoCAD のシステム変数の値によってコントロールできます。

S_Edit2.lsp は、第 2 部 3 章 5 節 (P2-99) を参考

モードは、[AUNITS] に従って設定し、小数点以下の表示は [AUPREC] で指定します。
①の [1 本目 ] と②の [ 角度 ] は数値の入力で(setq a "30.0000") の時
変換式(setq b (angtof a 0 ))(setq b (angtof a 1 ))(setq b (angtof a 2 ))(setq b (angtof a 3 ))(setq b (angtof a 4 ))モード
0 = 十進数（度）1=度/分/秒
2 = グラジェント
3 = ラジアン
4 = 測量単位

AUITS（角度の単位）

すが、ダイアログ ボックスの値は文字情報に結果
b = 0.523599
b = 0.523599
b = 0.471239
b = 4.86726
b = 0.523599

なっています。
つまり、①の値は <100> ではなく <"100">です。また②の値は <60> ではなく <"60">です。
この数値を AutoLISP 側で数値に変換してい

AUPREC（角度の表示精度）
1

2

ます。

(setvar "CHAMFERC" (atof sen1)) ①← (atof 関数で実数に変換）(setvar "CHAMFERD" (angtof kaku 0)) ②← (angtof 関数で角度に変換）(prompt "¥n1 本目の線分と 2 本目の線分を選択：")(command "CHAMFER")

1-103

データ変換関数

データ変換関数1-104

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

3 数値 → 文字への変換関数（REAL、INT → STR）
ITOA

実数（長さ・距離）を文字列に変換する

書式(rtos 数値

モード 表示精度 )rtos 関数 ( 実数を文字列に変換 ) は、AutoCAD で使用される数値を、出力で使用できる文字列値に、整数を文字列に変換します。

または文字データに変換します。RTOS 関数は DISTOF 関数の反対の働きをします。

(itoa 3)→ "3"結果の文字列の形式は、AutoCAD のシステム変数の値によってコントロールされます。単位と精(itoa -3)→ "-3"

度は、LUNITS と LUPREC の設定 に従います。
（表示精度を省略した場合は、現在の設定が適用）

実数を文字列に変換します。
（rtos 実数 モード 小数以下の桁数）(setq txt1 3.14)→ 変数 text1 に、3.14 を代入。

(setq txt1 (rtos txt1 2 1))→ txt1 を十進表記で小数点以下 1 桁表示。

コマンド : !txt1→ コマンドラインに !txt1 と入力します。

"3.1"→ コマンドラインに "3.1" が表示されます。

モード

1
2
3
4
5

rtos の表示形式コード
指数表記
十進表記
工業図面表記建築図面表記分数表記

モード
1 = 指数表記
2 = 十進表記
3 = 工業図面表記
4 = 建築図面表記
5 = 分数表記

LUNITS（長さの単位）

結果b = "5.2500E+01"
b = "52.5"
b = "4'-4.5¥""
b = "4'-4 1/2¥""
b = "52 1/2"
LUPREC（長さの表示精度）

表示形式

angtos 関数< モード > を省略した場合、LUNITS の現在値を使用します。
< 小数点以下の桁数 > を省略すると、AutoCAD のシステム変数 LUPREC の現在値を使用します。
ANGTOS(setq a 52.5) の時
変換式(setq b (rtos a 1 4))(setq b (rtos a 2 2))(setq b (rtos a 3 2))(setq b (rtos a 4 2))(setq b (rtos a 5 2))

AutoLISP の関数

RTOS

AutoLISP の関数

rtos 関数

角度を文字列に変換します。
（angtos 角度 モード 小数点以下の桁数）

ラジアン単位の角度を文字列に変換する

書式(angtos 数値

モード 表示精度 )angtos 関数 ( 角度を文字列に変換 ) は、AutoCAD で使用される数値を、出力で使用できる文字列
値に、または文字データに変換します。ANGTOS 関数は ANGTOF 関数の反対の働きをします。
結果の文字列の形式は、AutoCAD のシステム変数の値によってコントロールされます。単位と精(setq ang1 (getangle "¥n 角度を入力："))→ 45 を入力（0.785398< ラジアン >）。

度は、AUNITS と AUPREC の設定 に従います。
（表示精度を省略した場合は、現在の設定が適用）(setq ang1 (angtos ang1 0 0))→ ang1 を角度に変換（小数点以下なし）。

コマンド : !ang1→ コマンドラインに !ang1 と入力します。

"45"→ コマンドラインに "45" が表示されます。

(setq a 3.14159) の時
変換式(setq b (angtos a 0 0))(setq b (angtos a 1 4))(setq b (angtos a 2 4))(setq b (angtos a 3 4))(setq b (angtos a 4 0))

0
1
2
3
4

モード

angtos の表示形式コード
度（十進数）
度/分/秒
グラジェント
ラジアン
測量単位

表示形式

モード
0 = 度（十進数）
1=度/分/秒
2 = グラジェント
3 = ラジアン
4 = 測量単位

AUITS（角度の単位）

結果b = "180"b = "179d59'59¥""b = "199.9998g"
b = "3.1416r"
b = "N 90d W"
AUPREC（角度の表示精度）< モード > を省略した場合、angtos 関数は AutoCAD のシステム変数 AUNITS の現在値を使用します。
< 小数点以下の桁数 > を省略すると、AutoCAD のシステム変数 AUPREC の現在値を使用します。

1-105

データ変換関数

データ変換関数1-106

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
実数を文字列に変換

angtos 関数

角度（ラジアン）を文字列に変換

相対座標入力で線分コマンド (LINE) を使う

極座標入力で線分コマンド (LINE) を使う

終点 (pt2)

終点 (pt2)

AutoLISP の関数

100

直

線

距

離

=

10

0

（Ｙ軸）

垂直距離 ＝

角度 =45°水平距離 = 100
始点 (pt1)（Ｘ軸）

始点 (pt1)

線分コマンドの時、始点をマウスで指示をして、終点の位置をキーボードから相対座標入力する

線分コマンドの時、始点をマウスで指示をして、終点の位置をキーボードから極座標入力する

場合は、(@X の増加分 ,Y の増加分 ) の形になります。

場合は、(@ 直線距離 < 角度 ) の形になります。

LISP のプログラムでは、次のようにユーザーに X と Y の値を要求します。

LISP のプログラムでは、次のようにユーザーに直線距離と角度を要求します。

(setq dist_x (getreal "¥nX の増加分："))→ ユーザーが <100> と入力。

(setq dist_xy (getreal "¥n 直線距離："))→ ユーザーが <100> と入力。

(setq dist_y (getreal "¥nY の増加分："))→ ユーザーが <100> と入力。

(setq ang_1 (getangle "¥n 角度："))→ ユーザーが <45> と入力。

キーボードからの入力では、(@100,100) ですから、この形に文字を連結します。（要素は 4 つ）

キーボードからの入力では、(@100<45) ですから、この形に文字を連結します。
（要素は 4 つ）

しかし、<100> は数字ですので、文字に変換しなければなりません。

ここで、直線距離の <100> と角度の <45> を文字に変換しなければなりません。

実数を文字列に変換する rtos 関数を使用します。

直線距離は、実数を文字列に変換する rtos 関数を使用します。

(setq dist_x (rtos dist_x))(setq dist_xy (rtos dist_xy))(setq dist_y (rtos dist_y))

また、角度（ラジアン）を文字列に変換する angtos 関数を使用します。

これで、終点 pt2 の座標が決まりましたので、以下のように連結します。
(setq pt2 (strcat "@" dist_x "," dist_y))→ strcat 関数は、文字を連結する関数です。

(setq ang_1 (angtos ang_1))
これで、終点 pt2 の座標が決まりましたので、以下のように連結します。
(setq pt2 (strcat "@" dist_xy "<" ang_1))→ strcat 関数は、文字を連結する関数です。

マウスで始点 (pt1) を指示し、終点 (pt2) は計算で決まりましたので、線分コマンドを使用して次マウスで始点 (pt1) を指示し、終点 (pt2) は計算で決まりましたので、線分コマンドを使用して次のように記述します。

のように記述します。

(command "LINE" pt1 pt2 "")(command "LINE" pt1 pt2 "")この例のように、ユーザーがキーボードから入力した数値を他の文字と連結する時は、数値を文字列に変更しておく必要があります。

この例のように、ユーザーがキーボードから入力した数値を他の文字と連結する時は、数値を文字列に変更しておく必要があります。

1-107

データ変換関数

データ変換関数

1-108

AutoLISP の関数

rtos 関数

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
UCS を切り替えて作図する

4 座標系同士の変換関数②今、UCS の原点を p1 の位置に設定し、① ( 図 1) は WCS と UCS が一致した座標系において、
TRANS

ある座標系から別の座標系に、点 ( または変位 ) を変換します。

p1(100,100) から p2(200,200) に作図した線分です。線分 (p1-p2) の中点から円を作図します。
（図 1）

書式

（図 2）

(trans pt from to [disp])

p2(200,200)

pt は 3D 点または 3D 変位（ベクトル）を表す 3 つの実数のリスト
from は座標系コード 1
to は座標系コード 2

座標座標系コード 1
座標系コード 2切り替え(Trans 座標 座標系コード 1 座標系コード 2 [ 切り替え ])数説 明
基準点（変移）基準点を表す座標系コード
変換先の座標系コード
最後のオプション引数では、<T> か < 非 nil> のとき、最初の引数は変移と見なされます。省略されるか <nil> のときは点と見なされます。

次の表に、to 引数と from 引数に使用できる有効な整数コードを示します。

③ ( 図 1) より、円の中心は (150,150)、半径を <50> として、LISP で以下のように記述します。
(command "CIRCLE" "150,150" 50)
線分の中点に作図するつもりでしたが、右上に大きく離れてしまいました。
（図 3）

作図の途中で UCS 座標系を変更したときは、trans

座標系コード
座 標 系

コード
0
1

p2

ワールド (WCS)
ユーザー ( 現在の UCS)
ディスプレイ。コード 0( ゼロ ) または 1 と組み合わせて使用する場合、現在のビューポートの DCS、コード 3 と組み合わせて使用する場合、現在のモデル空間
ビューポートの DCS
ペーパー空間 DCS、PSDCS( コード 2 専用 )

2
3
（図 1）

( 図 1) は、
WCS と UCS が一致した座標において、(100,100) の位置に点 (point)(100,100)があります。
この点情報を取得すると以下のように表示されます。
((-1 . < 図形名 : 7ef03550>) (0 . "POINT") (330 . < 図形名 : 7ef01cf8>) ・・・（中略）(0,0)
WCS 原点 =UCS 原点 (0,0)（図 2）

WCS 原点 (0,0)

換する必要があります。
この場合、円を作図する前に点 p1 と点 p2 の座標を
次のように変換します。
(setq p1 (trans p1 0 1)) ;WCS から UCS へ変換(setq p2 (trans p2 0 1)) ;WCS から UCS へ変換④線分の端点 (p1 と p2）を trans 関数で WCS から UCSに変換したあと、円を作図すると期待通りの円が作図必要があります。
⑤一連の作業が終わった時は、元の座標系 (WCS) に戻す

作図の原点 (0,0) は点の位置に移動します。

ことが必要です。(command "UCS" "W")

再度、この点情報を取得すると以下のように表示されます。

Point!

しかし、点の座標は以前と同じ (100,100) です。

p2

このように、UCS を変更する前の図形に関係して作図(10 100.0 100.0 0.0) から点の座標は (100,100) と確認できます。

(10 100.0 100.0 0.0) (210 0.0 0.0 1.0) (50 . 0.0))

（図 4）

できます。
（図 4）
するときは、その図形を現在の UCS 座標系に変換する((-1 . < 図形名 : 7ef03550>) (0 . "POINT") (330 . < 図形名 : 7ef01cf8>) ・・・（中略）
WCS 原点 (0,0)

p1
UCS 原点 (0,0)

関数で対象となる図形（図 3 では線分）の座標を変(10 100.0 100.0 0.0) (210 0.0 0.0 1.0) (50 . 0.0))

今、( 図 2) のように UCS の原点を点の座標 (100,100) に設定したとき、UCS 原点 (0,0)

1-109

WCS 原点 (0,0)

p1
UCS 原点 (0,0)

WCS 原点 (0,0)

ユーザーが AutoCAD を操作しているときは、現在の UCS 座標で行っていますが、作成したデータは WCS 座標や OCS 座標（平面図形の場合）で保存されます。
lisp 関数のユーザー対話型の関数 (getpoint、entsel 等）の返す座標値は現在の UCS

これにより、ユーザーがマウスやキーボードから入力する座標値は UCS 座標であり、座標です。現在の座標系が WCS の場合は、現在の UCS 座標が WCS 座標と一致して作成された図形が保持する座標値は WCS 座標であることがわかります。

いることになります。

データ変換関数

データ変換関数

1-110

AutoLISP の関数

AutoLISP の関数

引

UCS 原点 (0,0)

p1(100,100)

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

trans 関数①

ユーザー座標系の原点から作図をする(defun C:ucs_o ( / pt1)

原点からの座標が判らない位置 ( ×印 ) から作図を開始する場合は、以下のように行います。
①作図を開始したい位置 pt1( ×印 ) にユーザー座標系の原点を移動します。
② UCS アイコンが移動したことが、画面上で確認できます。

Step1

Step2

Step3

(setq pt1 (getpoint "¥n 新しい原点を指示："))2(command "UCS" pt1 "")3(command "LINE" pt1 pause "")4(command "UCS" "W");UCS の原点を pt1 に移動; 線分を作図; ワールド座標系に戻す) ;end③×印が原点 (0,0) に変更になりましたから、この座標を原点として作図を開始します。
終了したときは、再度 UCS コマンドでワールド座標系 (W) に戻します。

1→ Step1］→ Step2］→ Step3］→ Step4
］

番号
関数名
説 明
① getpoint
マウスで指示した点を、変数 <pt1> に代入します。
② "UCS" pt1 ""ユーザー座標系の原点を pt1 に移動します。終了の <""> は必要です。
③ "LINE" pt1 pause "" pause はユーザーの指示待ちです。<""> で線分コマンドは終了します。
④ "UCS" "W"
最後に元のワールド座標系に戻します。

ワールド座標系の < 原点 >pt1

平行移動したユーザー座標の原点

pt1

この動作を AutoLISP での記述は以下のようになります。

UCS アイコンが変わります！

Step1 － UCS コマンドで、×印の位置 (pt1) に原点を移動する。 1(setq pt1 (getpoint "¥n 新しい原点を指示：")) → getpoint 関数で、先に移動する位置を取得。
Step2 － trans 関数で、ワールド座標系からユーザー座標系に変更する。 2(command "UCS" pt1 "")→ UCS コマンドで、pt1 を新しい原点にします。

Point!
[ 表示 ] → [ 表示設定 ] → [UCS アイコン ] →Step3 －×印の新しい原点（ユーザー座標系）から作図を開始する。 3(command "LINE" pt1 pause "")[ プロパティ ] から UCS アイコンのスタイル→ 線分コマンドで作図します。

の確認と変更ができます。

Step4 －終了するときは、ワールド座標系に戻す。 4(command "UCS" "W")

→ 作図が終了すると、ワールド座標系に戻します。
[UCS は原点の位置 ][UCS を平行移動 ][UCS をオブジェクトに合わせる ]ユーザー座標系に変更した場合は、trans 関数で座標系の変換が必要です。

1-111

データ変換関数

データ変換関数

1-112

AutoLISP の関数

AutoLISP の関数

getpoint は P1-150 を参考

第 2 章－ AutoLISP の関数
trans 関数②

第 2 章－ AutoLISP の関数
線分の中点から垂直線を作図する②線分の始点の座標を取得します。 4
始点の座標は、図形名の中では (10 1289.02 1245.67 0.0) です。

① UCS コマンドで線分を X 軸に変更する。

(10 X 座標 Y 座標 Z 座標 )→ <10> は始点座標であることを表しています。

②垂直線の始点を取得するために、斜めの線分の中点を指示する。

cdr 関数で座標値を取り出します。

→ (cdr (assoc 10 en2))③直交モードに変更する。

③取り出した座標値をユーザー座標系に変更します。 5④マウスが直交モードに固定されるので、そのまま線分の終点を指示する。
⑤ UCS コマンドでワールド座標系に戻し、直交モードも解除する。

この動作を AutoLISP では以下のように記述します。

(trans 現在の座標値 WCS<0> UCS<1>) → (trans st_pt 0 1)
④同様にして、線分の終点の座標も取得します。 6 7

Step3 －①線分の始点から終点への角度を計算し、変数 <ang1> に代入します。 8
角度を計算する関数は angle です。

Step1 －① (entsel "¥n 垂線を引く線分を指示：") 1

AutoLISP の関数

変数 <en1> には、図形名と指示した位置の座標が代入されます。
(< 図形名 : 7ef03990> (1369.08 1282.59 0.0))② en1 は図形名と座標値のリストですから、car 関数で前半の図形名を取得します。 2

距離を計算する関数は distance です。

→ (/ (distance st_pt en_pt) 2)③始点 (st_pt) から、角度 ang1、距離 dis1 の位置が、線分の中点 (mid_pt) になります。 10
ただし、この場合の始点 (st_pt) は原点 (0.0 , 0.0) と同じになります。
en_pt→ < 図形名 : 7ef03990>③この図形名の中身を展開する関数は entget です。 2

mid_pt((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A2") (100 .
(10 1289.02 1245.67 0.0) (11 2028.05 1642.56 0.0) (210 0.0 0.0 1.0))

×

1

ang

"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")
st_pt

dis1

dis1

Step4 －①カーソルを直交モードに固定します。 11(setvar "ORTHOMODE" 1)→ <1> は直交モード ON、<0> は OFF です。

②線分コマンドで中点を指示し、終点は pause 関数でユーザーの指示待ちです。 12

en_pt
mid_ptStep2 －①カーソルを直交モードにして水平・垂直の線分を作成するために、ユーザー座標系を変更
st_pt

して線分を X 軸にします。 3("UCS" "OB" en1)

→ "OB" は選択した線分を X 軸にします。

マウスで選択した位置に近い方の端点が原点になります。遠い方の端点が、X 軸の正方向になります。

1-113

直交モードは、P1-170 を参考

データ変換関数

データ変換関数

1-114

AutoLISP の関数②線分の始点から終点までの距離（長さ）の半分を計算し、変数 <dis1> に代入します。 9" 垂線を引く線分を指示：" のメッセージを表示して、垂線を引きたい線分を指示します。

(car en1)→ (angle st_pt en_pt)

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

Step5 －①ユーザー座標系をワールド座標系に戻します。 13(defun C:sui_lin ( / en1 en2 st_pt en_pt ang1 dis1 mid_pt)(command "UCS" "W")
②直交モードも解除します。 14(setvar "ORTHOMODE" 0)1(setq en1 (entsel "¥n 垂線を引く線分を指示："))2(setq en2 (entget (car en1))); 線分を選択; 線分の情報を取得→ Step1; 選択した線分を X 軸に UCS 変換する

en_pt

mid_pt3(command "UCS" "OB" en1)

4

(setq st_pt (cdr (assoc 10 en2)))5(setq st_pt (trans st_pt 0 1))

6(setq en_pt (cdr (assoc 11 en2)))7(setq en_pt (trans en_pt 0 1)) ; ユーザー座標系に変更; 線分をユーザー座標系の X 軸に変更
; 始点の座標を取得; ユーザー座標系に変更→ Step2; 終点の座標を取得; 中点座標を計算する処理

8(setq ang1 (angle st_pt en_pt))

9(setq dis1 (/ (distance st_pt en_pt) 2))

10(setq mid_pt (polar (list 0.0 0.0) ang1 dis1)); 始点から終点への角度を計算（0°か 180°）; 始点と終点の距離の半分を計算→ Step3; 中点の位置を計算; 直交モードを ON にして線分を作図（Step2 の③について）
trans 関数でユーザー座標系に変更しない場合は、下図のように予想外の結果になります。

11(setvar "ORTHOMODE" 1)

12(command "LINE" mid_pt pause ""); 直交モードをオン; 中点から線分を作図→ Step4; 座標系と直交モードを元に戻す

mid_ptmid_pt13(command "UCS" "W")14

(setvar "ORTHOMODE" 0); 元のワールド座標系に戻す; 直交モードをオフ→ Step5(princ)
en_pt

);end

en_pt

st_pt

st_pt
Point!

UCS を変更した後は元の UCS に戻す必要がありますが、AutoCAD のコマンド ラ
インに表示される UCS コマンドのオプションから UCS を切り替えます。
[ 面 (F)/ 名前の付いた UCS(NA)/ オブジェクト (OB)/ 直前 (P)/ ビュー (V)/ ワールド (W)/X/Y/Z/Z 軸 (ZA)]

AutoLISP の中で、多くの座標系を使用する
場合は、名前を付けておきます。
[UCS] → [NA] から [ 登録 (S)] をします。
この UCS を使用するときは、[UCS] → [NA]から [ 呼び出し (R)] を選択します。

1-115

データ変換関数番号
関数名
説 明① entselentsel 関数で X 軸にする線分を選択します。
② entget (car en1)
en1 は、図形名と座標点の組み合わせなので、図形名だけを取得。
③ "UCS" "OB" en1
UCS コマンドで、選択した線分を X 軸に変更します。
④ cdr (assoc 10 en2)
en2 の図形情報から線分の始点の座標を取得します。
⑤ trans st_pt 0 1
始点の座標をユーザー座標系に変更します。
⑥ cdr (assoc 11 en2)
en2 の図形情報から線分の終点の座標を取得します。
⑦ trans en_pt 0 1
終点の座標をユーザー座標系に変更します。
⑧ angle st_pt en_pt
始点から終点の角度をラジアンで取得します。
（0°か 180°）⑨ / (distance st_pt en_pt) 2 始点から終点までの距離の半分（中点）を計算します。
polar (list 0.0 0.0) ang1⑩
ユーザー座標系の原点（始点）と終点の中点座標を計算します。
dis1⑪ "ORTHOMODE" 1
直交モードに切り替えます。
⑫ "LINE" mid_pt pause ""線分コマンドで中点から始めます。終点は pause でユーザー待ち。
⑬ "UCS" "W"
座標系をワールド座標系に戻します。
⑭ "ORTHOMODE" 0
直交モードをオフにします。
entsel は P1-210、getget は P1-218 を参考

データ変換関数

1-116

AutoLISP の関数

AutoLISP の関数

st_pt第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
単位の変換

5 計測単位同士の変換関数

acad.unt ファイルは、マイルからキロメートル、華氏から摂氏など、実際に使用される単位間のさま㎡（平米）を坪面積に変換してみましょう。
（１㎡＝ 0.3025 坪）(setq heibei (getreal " 何㎡ですか？ "))→ キーボードから <100> を入力します。

を変換して返します。2 種類の単位系は、acad.unt で定義されている単位の式を表す文字列によって(setq tubo

→ ㎡に 0.3025 を掛けて、坪数を計算します。

指定されます。

(setq s_heibei (rtos heibei 2 1))→ ㎡の実数値を文字列に変換します。

(setq s_tubo→ 坪数の実数値を文字列に変換します。

ざまな変換を定義しています。cvunit 関数は、ある単位系で表された値を受け取り、別の単位系に値

acad.unt ファイル

( * heibei 0.3025))(rtos tubo

2 1))

(setq ans (strcat s_heibei " ㎡は " s_tubo " 坪です。"))
cvunit 関数は、互換性のない単位間の(prompt ans)

変換は行いません。

100 ㎡は 30.3 坪です。

AutoLISP の関数

たとえば、インチからグラムへの変換→ 文字列を連結します。(strcat 関数 )→ コマンド ラインに結果を表示させます。
→ コマンドラインに <100 ㎡は 30.3 坪です。> が表示されます。

は行いません。

坪面積を㎡（平米）に変換してみましょう。
（１坪＝ 3.30578 ㎡）

cvunit 関数を使って単位変換(setq tubo (getreal " 何坪ですか？ "))→ キーボードから <100> を入力します。

(setq heibei ( / tubo 0.3025))→ 坪を 0.3025 で割って、㎡を計算します。

(setq s_tubo (rtos tubo 2 1))→ 坪数の実数値を文字列に変換します。

(setq s_heibei→ ㎡の実数値を文字列に変換します。

(rtos heibei 2 1))(setq ans (strcat s_tubo " 坪は " s_heibei " ㎡です。"))(prompt ans)

①距離

→ 文字列を連結します。(strcat 関数 )→ コマンド ラインに結果を表示させます。

100 坪は 330.6 ㎡です。

→ コマンドラインに <100 坪は 330.6 ㎡です。> が表示されます。

インチからメートルへ変換(cvunit 100 "inches" "meters")→ 2.54
下表は距離と面積の換算表です。

メートルからインチへ変換(cvunit 2.54 "meters" "inches" )→ 100.0メートル m②角度（円の全体角度 360°を <1> とする）
円周率へ変換(cvunit 1 "circle" "radian")→ 6.28319（２π）

度（十進法）へ変換(cvunit 1 "circle" "degree")

１日を分へ変換→ 1440.0

分を日へ変換(cvunit 1440 "minute" "day")

1-117

距

離

面

積

インチ in39.3701
39,370.10
112
36
63,360フィート ft
3.28084
3,280.84
0.083333
1
3
5,280

ヤード yd
1.09361
1,093.61
0.027777
0.33333
1
1,760

マイル mile
0.000621
0.621371
0.000015
0.000189
0.000568
1

平方ヤード yd2
1.19599
119.599
1,195.99
0.111111
1
4,480

エーカー ac
0.000247
0.02471247.110.000020.0002061→ 360.0③時間(cvunit 1 "day" "minute")

1
1,000
0.02540.30480.9144
1,609.34

キロメートル km
0.001
10.000025
0.00030.000914
1.609344→ 1.0

データ変換関数

平方メートル m2
1100
1,000,000
0.09290.836127
4,046.86

アール a
0.01
1
10,0000.000928
0.008361
40.4686

平方キロ km2
0.000001
0.000110.0000008
0.004047

平方フィート ft2
10.7639
1,076.39
10,764,263
1
9
43,560

データ変換関数

1-118

AutoLISP の関数

acad.unt を使った単位変換

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

第6節

比較関数

下図は AutoCAD の [ クイック選択 ] のダイアログです。
このダイアログでは、図面の中の線分を長さを指定して選択しようとしています。

1 比較演算関数（修飾子）=

全ての引数が数値的に等しい場合に、Ｔを返します。
（等しくなければ、nil）(setq a 2)
対象となる図形ごとに使用する比較演算( = a 2)→T関数は異なります。

( = a 3)

→ nil

例えば、円を比較するのに終点の座標やAutoLISP の関数

比較演算を行うときは、このように対象(setq a 2)

数を選ぶ必要があります。

( /= a 2)→ nil( /= a 3)→Tと変わるところはありません。比較演算関数は次節の条件関数と連動して良く使用されますし、
第 3 章と第 4 章の中心になる関数のグループです。
使用頻度の高い AutoLISP の 比較演算関数を、次の表に示します。
①比較演算関数（修飾子）
関 数

説 明
すべての引数が数値的に等しい場合は T を返し、それ以外の場(= (equal to) numstr [numstr] ...)合は nil を返します。
(/= (not equal to) numstr [numstr] 引数が数値的に等しくない場合は T を返し、引数が数値的に等...)しい場合は nil を返します。
各引数がその右側の引数よりも数値的に小さい場合は T を返(< (less than) numstr [numstr] ...)
し、それ以外の場合は nil を返します。
(<= (less than or equal to) numstr 各引数がその右側の引数よりも数値的に小さいか等しい場合は[numstr] ...)
T を返し、それ以外の場合は nil を返します。
(> (greater than) numstr [numstr] 各引数がその右側の引数よりも数値的に大きい場合は T を返...)し、それ以外の場合は nil を返します。
(>= (greater than or equal to)
各引数がその右側の引数よりも数値的に大きいか等しい場合はnumstr [numstr] ...)
T を返し、それ以外の場合は nil を返します。

③比較演算関数（式）関 数(eq expr1 expr2)(equal expr1 expr2 [fuzz])

1-119

各引数が等しくなければ、Ｔを返します。
（等しければ、nil）とする図形の種類や目的に合った演算関

この節では、修飾子とか論理演算子といった難しい言葉が出てきますが、使用方法は通常の数式②比較演算関数（論理演算子）
関 数(and [expr ...])(not item)(or [expr...])(null item)/=

説 明
指定された引数の AND( 論理積 ) を返します。
指定された項目の評価が nil になるかどうかを調べます。
式のリストの OR( 論理和 ) を返します。
指定された項目の内容が nil かどうかを調べます。

<

AutoLISP の関数

角度の比較はありえません。

第 1 引数が第 2 引数より小さければ、Ｔを返します。
（大きければ、nil）(setq a 2)
( < a 3)→T

( < a 1)

→ nil

<=

第 1 引数が第 2 引数より小さいか等しい場合に、Ｔを返します。

(setq a 2)
( <= a 2)→T( <= a 1)

→ nil

>

第 1 引数が第 2 引数より大きければ、Ｔを返します。
（小さければ、nil）(setq a 2)
( > a 1)

→T

( > a 2)

→ nil

>=

第 1 引数が第 2 引数より大きいか等しい場合に、Ｔを返します。

(setq a 2)(> = a 2)→T(> = a 3)

→ nil

説 明
2 つの式が同一物かどうかを調べます。
2 つの式の評価結果が等しいかどうかを調べます。

比較関数

比較関数

1-120

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
修飾子と論理演算子

2 比較演算関数（論理演算子）

修飾子と論理演算子はテスト式で使用します。
各引数がすべてＴの場合に、Ｔを返します。

修飾子と論理演算子も関数で、評価結果として真 (True)、または偽 (nil) を返します。

(setq a 2 b 3)
( and (= a 2) (= b 3))→T( and (= a 2) (= b 4))

→ nil

OR

①(> 5 8)修飾子 > は、左の数値が右の数値より大きいかどうかをテストします。この場合、5 は 8 より大きくありませんから、評価値は nil になります。

式を順番に評価して、nil でない式が 1 つでもあれば、Ｔを返します。

修飾子 ( >、<、>=、<=) は、2 つ以上の引数を持つことができます。

AutoLISP の関数(setq a 2 b 3)
( or (= a 2) (= b 4))→ T （どちらかが正しいので、Ｔ）( or (= a 3) (= b 4))→ nil（どちらも誤りなので、nil）

NOT② (> 5 8 7 2)
引数が 2 つ以上ある場合は、2 番目以降のすべての引数が 1 番目の引数より大きい時に <T> を返します。上記の場合は、5 > 8 > 7 > 2 ではありませんから、<nil> を返します。
③論理演算子 (and、not、null、or) は、値として <T> か <nil> を返す点では修飾子と同じです。

シンボルは nil の場合に、Ｔを返します。

しかし、論理演算子では修飾子が評価した値に対して、さらに評価を加えることが可能です。
(例)(setq a 2 b nil)(not a)→ nil(not b)

→T

NULL

T
<not> は引数が <nil> の場合に <T> を返しますから、結果は <T> になります。

3 比較演算関数（式）

指定された引数が、nil であるかどうかを判断します。

pt1、pt2、pt3、pt4 に以下のように値をセットします。

(setq a 2 b "AutoLISP" c nil)
( null a)→ nil（空でないから nil）

( null b)→ nil（空でないから nil）

( null c)→ T （空だから T）

関数
atom
boundplistp
minuspnotnull
numberpzerop

データ内容を判定する関数
判定方法
データがリストならばアトムが値を持っていればデータがリストならばデータが負の数値ならばデータが値を持っていなければリストが値を持っていなければデータが数値ならばデータがゼロの数値ならば

変換結果
nil
T
T
T
T
T
T
T

P で終わっている修飾子 (boundp、listp、minusp、zerop) の P は、修飾子 (Predicate)の頭文字です。

1-121(not ( > 5 8 ))比較関数

(setq pt1 '(10 20 30))

→ (10 20 30)(setq pt2 '(10 20 30))

→ (10 20 30)(setq pt3 pt1)

→ (10 20 30)(setq pt4 pt2)

→ (10 20 30)

eq

同一のオブジェクト ( つまりアドレスが等しい ) 場合に真を返します。

(eq pt1 pt2)

→ nil（参照先 < アドレス > が違う）

(eq pt1 pt3)

→ T （参照先 < アドレス > が同じ）

(eq pt2 pt4)

→ T （参照先 < アドレス > が同じ）

(eq pt3 pt4)

→ nil（参照先 < アドレス > が違う）

equal

2 つの式の評価結果が等しい場合に真を返します。

(equal pt1 pt2)

→ T （評価結果 < 値 > が同じ）

(equal pt1 pt3)

→ T （評価結果 < 値 > が同じ）

(equal pt2 pt4)

→ T （評価結果 < 値 > が同じ）

(equal pt3 pt4)

→ T （評価結果 < 値 > が同じ）

比較関数

1-122

AutoLISP の関数

AND第 2 章－ AutoLISP の関数

第7節

第 2 章－ AutoLISP の関数
分岐関数 (if、cond)

条件関数（繰り返し関数・分岐関数）① if は条件式を評価し、その結果が真ならば then 式を実行します。条件式が偽であれば else 式を繰り返し関数 (repeat、while)

実行します。else 式は省略することができます。その場合、条件式で偽と判定されると nil を返①同じ処理を繰り返して行うとき、繰り返しの回数が分かっている場合に repeat 関数を使います。

します。これを図に示すと、以下のようになります。

repeat の前に回数（正の整数）をセットし、その後に繰り返しの処理を記述します。
条件式(setq kaisuu (getint "¥n 円の回数 "))偽 (nil)AutoLISP の関数(setq hankei (getreal "¥n 円の半径 "))実行式(setq pt2 (getpoint "¥n 終点を指示 "))(command "LINE" pt1 pt2 "")実行式; 線分を作図します。

);progn; 円を作図します。

);if(command "CIRCLE" center hankei);kaisuu 回繰り返します。

② cond は複数の式を引数として受け取ります。各式の先頭には条件をチェックする記述があり、);repeat

条件が成立した場合、その実行式を評価します。条件が不成立であれば、次の式に移ります。

②同じ処理を繰り返して行うとき、繰り返しの回数が分かっていない場合に while 関数を使います。
while の前に条件式をセットし、真 (T) であれば実行式を処理します。

; 円の半径を入力します。（円の大きさは固定）(setq hankei (getreal "¥n 円の半径 ")); 円の中心を指示します。

(setq center (getpoint "¥n 円の中心 "))したときは、同じ式にある実行式を評価します。そして、いちばん最後に評価された実行式のしたがって、一度条件式が選択されたら、それ以降の式は評価されません。もし、どの条件式も不成立であれば、cond は nil を返します。これを図に表すと以下のようになります。

条件式; どの図形を作図するかを尋ねます。
（<L> か <C> か <R> を入力）

while

偽 (nil)真 (T);center が入力されていれば実行します。

たとえば、条件式① が不成立であれば、次の式に移り条件式② をチェックします。条件が成立
返り値が cond の返り値となります。

そして、実行式の末尾に再度条件式をセットし、最初の while に戻ります。

(setq ans (getstring "¥nLine Circle Rectang"))

実行式; 円を作図します。

(command "CIRCLE" center hankei); 円の中心を指示します。

条件式(setq center (getpoint "¥n 円の中心 "));ans が "L" であれば、線分を作図します。

偽 (Else);ans が "C" であれば、円を作図します。

((= ans "C") (command "Circle" pause pause));ans が "R" であれば、長方形を作図します。

((= ans "R") (command "Rectang" pause pause));a 上記以外の場合、[ 終了します。] と表示します。

;center が入力されなければ終了します。

();whileAutoLISP の 繰り返し関数を、次の表に示します。
（順不同）
条件関数（条件に合う間、コマンドを繰り返す関数）
関 数
説 明(repeat int [ expr ...])
指定された回数だけ各式を評価し、最後の式の値を返します。
テスト式を評価して nil でなければ、他の式を評価します。
(while testexpr [ expr ...])
テスト式の評価が nil になるまでこの処理を繰り返します。

条件関数

COND
条 件 式①(cond((= ans "L") (command "Line" pause pause ""))

(while (/= center nil)

1-123

実行式

(setq pt1 (getpoint "¥n 始点を指示 "))(setq center (getpoint "¥n 円の中心 ")); 円の半径を入力します。

偽 (Else)真 (Then)(progn ; 始点と終点の座標を取得します。

回数; 円の中心を指示します。

IF( 条件式 )(if (= ans "Y")repeat(repeat kaisuu(setq ans (getstring "¥n 線分を作図しますか？ <Y>/<N>); もし、<Y> であれば、以下を実行します。

真 (T); 回数分だけ繰り返します。

; 線分を作図するかどうかを尋ねます。（<Y> か <N> を入力）

T

(prompt "¥n 終了します。")));cond条 件 式②
偽 (Else)条 件 式③
偽 (Else)T

真 (Then)真 (Then)真 (Then)真 (Then)

実行式

実行式

実行式

実行式

T は真に評価されるので、この式は無条件に実行されます。

AutoLISP の 分岐関数を、次の表に示します。
（順不同）
条件関数（条件によって処理を分岐する関数）
関 数
説 明(if testexpr thenexpr [elseexpr]) 条件に応じて式を評価します。
(cond [( test result ...) ...])
条件を順番に評価して、T の式を実行します。

条件関数

1-124

AutoLISP の関数; 円を作図する回数を入力します。

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数

1 条件関数（条件に合う間、コマンドを繰り返す関数）

Re_Copy.lsp
目的：

REPEAT

主要関数：

指示した回数だけ、繰り返して実行します。

(setq count 1)→ count の初期値をセットします。

(repeat 5→ 5 回繰り返します。

(setq a (1+ count ))→ count に 1 加算します。

(setq count (1+ count))→ count の数を 1 づつ増やします。

)→6( 変数 <a> と <count> の値）指定した回数だけ右側へ連続複写する円を選択し、複写の回数を入力すると、その回数分だけ円を右側へ直径間隔で複写します。
<entsel><car><entget><getint><polar>

Step1 ー 複写する円を選択します。 1(setq ent1 (entget (car (entsel "¥n 円を指示してください。"))))
Step2 ー 選択したオブジェクトが円かどうかを判断します。 2 3 4(if (/= ent2 "CIRCLE")
Step3 ーオブジェクトが円であれば、複写の回数の入力を聞いてきます。 5

指定した回数だけ同心円を作図する①同心円の中心を指示します。

(setq kai(getint "¥n 何回複写しますか："))Step4 ー 円の直径（半径の 2 倍）を取得し、右側へ複写する円の中心座標を計算します。 6 7 8→ (getpoint "¥n 円の中心を指示：")(setq new_Pt (polar new_Pt 0.0 (* 2 a2)))②円の個数を入力します。
→ (getint "¥n 円の個数を入力：")

Step5 ー 入力した個数分の円を作図します。 9 10 11③円の個数分、繰り返します。

(command "CIRCLE" new_Pt a2)→ (repeat ct1)
④半径を入力します。
→ (getdist cp1 "¥n 半径を入力：")

Step1 －複写する円を選択します。

⑤円を作図します。

Step2 ～ 4 －円を複写する座標を計算処理します。

→ 中心は <cp1>、半径は <rad>(defun C:ReCircle( / cp1 ct1 rad)1

(setq cp1 (getpoint "¥n 円の中心を指示："))2(setq ct1 (getint "¥n 円の個数を入力："))3(repeat ct1; 円の中心座標を指示; 作図する円の数を入力; 指定した数だけ作図を繰り返す

4(setq rad (getdist cp1 "¥n 半径を入力：")) ; 半径を取得

5(command "CIRCLE" cp1 rad) ; 円を作図する);repeat(Step5) －指定した回数分だけ円を作図します。
（例は、4 回複写）

);end
番号
関数名
説 明
① getpoint
円の中心座標を <cp1> にセットします。
② getint
円の個数を <ct1> にセットします。
③ repeat ct1<ct1> の回数だけ、円を作図します。
④ getdist cp1
円の半径を <rad> にセット（cp1 からラバーバンドが表示されます）⑤ ("CIRCLE" cp1 rad) 円の中心 <cp1> と半径 <rad> で円を作図します。

1-125

条件関数

条件関数

1-126

AutoLISP の関数

AutoLISP の関数

repeat 関数

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
WHILE(defun C:Re_Copy( / ent1 ent2 kai a1 a2)
1(setq ent1 (entget (car (entsel “¥n 円を指示してください。” ))))

2

(setq ent2 (cdr (assoc 0 ent1)))(if (/= ent2 “CIRCLE” )4; 円でなければ、メッセージを表示して終了する(setq count 1)→ count の初期値をセットします。

(while (< count 5)→ count が 5 より小さい時、実行します。

(setq a count)→ 変数 <a> に <count> の値を代入します。

(setq count (1+ count ))→ count の数を 1 づつ増やします。

(prompt “¥n 選択した図形は円ではありません。” )(progn; 円であれば、以下を実行する

5(setq kai(getint “¥n 何回複写しますか：” ))6(setq a1 (cdr (assoc 10 ent1))) ; 円の中心座標を取得

7(setq a2 (cdr (assoc 40 ent1))) ; 円の半径を取得

8(setq new_Pt (polar a1 0.0 (* 2 a2)))(repeat kai

9AutoLISP の関数→ Step1］; 複写の回数をセット→ Step2 ～ 4)→ 4( 変数 <a> の値）、5( 変数 <count> の値）

while 関数

; 次の円の中心座標を計算

指定が中止されるまで円を作図する①円の中心を指示します。

; 回数分複写する

10(command “CIRCLE” new_Pt a2)

11(setq new_Pt (polar new_Pt 0.0 (* 2 a2)))→ (getpoint "¥n 円の中心を指示："); 円を作図する; 次の円の中心を計算→ Step5②円の半径を入力します。

AutoLISP の関数

3; 図形のタイプ (CIRCLE) をセット

条件が nil になるまで、繰り返して実行します。

→ (getdist cp1 "¥n 円の半径を入力："));repeat);progngetdist 関数は、マウスからでもキーボードからでも);if入力できます。

(princ)③中心と半径が入力された時 ( 真 <T>)、作図します。

) ;end→ (while dia)
④円を作図します。

番号
①
②
③
④
⑤
⑥
⑦
⑧
⑨
⑩
⑪

関数名

説 明
entsel で選択した図形の情報を取得します。ent1 には図形の中身
entselがセットされます。
図形 ent1 の図形タイプは グループコード <0> にあります。
(cdr (assoc 0 ent1))
cdr 関数で図形のタイプ ( 線分とか円とか ) の情報が得られます。
if (/= ent2 “CIRCLE” )ent2 が円かどうかを判定します。
選択した図形が円でなければ、このメッセージを表示して終了し
promptます。円であれば、progn 以下に進みます。
getint円の複写の回数を取得します。
(cdr (assoc 10 ent1))
円の中心座標を取得します。
(cdr (assoc 40 ent1))
円の半径を取得します。
(polar a1 0.0 (* 2 a2))
次の円の中心座標を計算します。
repeat kai
kai 数回繰り返します。
"CIRCLE" new_Pt a2
円を作図します。
（中心座標 <new_Pt>、半径 <a2>）
polar new_Pt 0.0 (* 2 a2) 次の円の中心座標を計算します。
entget は、P1-208、P1-217 を参考
entsel は、P1-208、P1-210 を参考⑤円の中心を指示します。
⑥円の半径を入力します。
(defun C:WhCircle( / cp1 rad)1

(setq cp1 (getpoint "¥n 円の中心を指示："))2(setq rad (getdist cp1 "¥n 円の半径を入力："))3(while (and (/= cp1 nil) (/= rad nil)) ; 円の中心と半径が入力されていれば、以下を実行; 円の中心座標を取得; 円の半径を取得

4(command "CIRCLE" cp1 rad) ; 円を作図

5

(setq cp1 (getpoint "¥n 円の中心を指示：")) ; 円の中心座標を取得

6(setq rad (getdist cp1 "¥n 円の半径を入力：")) ; 円の半径を取得) ;while) ;end円のグループ コード
グループコード意 味
0
オブジェクトの種類（LINE、CIRCLE、ARC 等）
39
厚さ ( 省略可能、既定 = 0)10
中心点 (OCS)
DXF: X 値、APP: 3D 点
20,30
DXF: 始点の Y および Z の値 (OCS)
40
半径
210
押し出し方向 ( 省略可能、既定 = 0, 0, 1)
DXF: X 値、APP: 3D ベクトル

1-127

→ 中心は <cp1>、半径は <rad>

条件関数

番号
関数名
説 明
① getpoint
円の中心座標を <cp1> にセットします。
② getdist cp1
円の半径を <rad> にセットします。
③ while<cp1> と <rad> の両方が入力された時だけ、以下を実行します。
④ "CIRCLE" cp1 rad 円の中心 <cp1> と半径 <rad> で円を作図します。
⑤ getpoint
円の中心の入力を促します。(<cp1> が <nil> の時、
このプログラムは終了）⑥ getdist
円の半径の入力を促します。(<rad> が <nil> の時、
このプログラムは終了）

条件関数

1-128

第 2 章－ AutoLISP の関数
while_off.lsp
目的：
主要関数：

第 2 章－ AutoLISP の関数
Step3 －基準線からのオフセット間隔を入力します。空打ちすると終了します。

間隔の違うオフセットを連続して行う
線分を作図した後、続けてオフセットコマンドに移ります。
オフセット間隔の入力を続ける限り、オフセットを続けます。
<pause><entlast><getpoint><getdist><OFFSET>

Step1 ー ① “通り芯の一本目を引いてください。" をコマンドラインに表示します。 1② 1 本目の基準線を作図します。 2(command "LINE" pause pause “” )pause 関数は、ユーザーが線分の始点と終点を指示するのを待ちます。
③ (setq ent (entlast)) の entlast は最後に作図したオブジェクトを取得します。 3(defun C:while_off ( / ent pt dist)
Step2 ー ①作図した線分をオフセットする側を指示します。 4

AutoLISP の関数(setq pt (getpoint "¥n オフセットする側を指示："))②オフセット間隔を指定します。 5(getdist “¥n オフセット間隔：” )→ getdist 関数は、画面上でも指示できます。

1(prompt “¥n 通り芯の一本目を引いてください。
” ) ; メッセージを表示

2(command “LINE” pause pause “” )3

(setq ent (entlast)); 線分を作図 (pause はユーザー指示待ち )AutoLISP の関数; 基準線からの連続オフセット→ Step1; 線分を変数 ent に代入（オフセット時に使用）; あらかじめ、オフセットする側と距離を取得する

Step3 ー①オフセットの間隔が入力される限り、オフセットを続けます。 6(while dist・・→ (while ( = dist T)・・と同じです。

4(setq pt (getpoint “¥n オフセットする側を指示：” )) ; 方向を取得

5(setq dist (getdist “¥n オフセット間隔：” )) ; 間隔を取得;while 関数で、距離が入力される限り、オフセットを続ける②オフセットを行います。 7
offset コマンドの書式は、（offset オフセット距離

オブジェクト6

オフセットの側）③オフセットの間隔を指示します。 8（この間隔は、最初の線分 < 基線 > からの距離です。
）; 距離が入力されていれば、以下を実行

7(command “OFFSET” dist ent pt “” )8(setq dist (getdist “¥n オフセット間隔：” )); オフセットを行う→ Step3; 次の距離入力を求める(princ)) ;end※ While 関数の中で、変数 <dist> が <nil（空打ちしない）> でない限り、オフセットを続けます。

Step2 －オフセットする方向を指示します。

(while dist

) ;while(setq dist (getdist "¥n オフセット間隔："))

Step1 －基準線を作図します。

→ Step2

番号
関数名① prompt
②
③
④
⑤
⑥
⑦
⑧

説 明
コマンドラインに表示させる文になります。
ユーザーが入力するまで、プログラムをストップします。
pause
pause が 2 回あるのは、線分の始点と終点の入力を待っているからです。
entlast最後に（直前に）作図された図形です。それを変数 ent にセットします。
getpoint
ユーザーにオフセットする側を指示させて、その座標を変数 pt にセットします。
getdist
ユーザーにオフセット間隔を指示させて、その長さを変数 dist にセットします。
while dist while ( = dist T ) と同じです。距離入力があったかどうかチェックしています。
command オフセットコマンドを使います。最後の <""> はオフセットの終了になります。
ユーザーにオフセット間隔を指示させて、その長さを変数 dist にセットします。
再度間隔の入力を促します。
getdist⑥に戻り、入力のチェックを行っています。
（dist が真である限り、続けます。
）
entlast は、P1-209 を参考
getpoint、getdist は、P1-156 を参考

1-129

条件関数

条件関数

1-130

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
PROGN

2 条件関数（条件によって処理を分岐する関数）

IF 式で複数の式を実行します。

(setq a 3)
IF

条件がＴの時、1 番目の式を実行します。（Ｔでない時は、2 番目の式を実行）(setq a 3)
(if (= b a)

→ 変数 <b> の値と <a> を比較します。

(progn→条件式が正しいときの処理→ 変数 <b> の値と <a> を比較します。

(setq b (+ a 1))→ b が a と同じである時の処理。

(setq b (+ a 2))→ b が a と違う時の処理。

)

Point!

(setq c (+ a 1))→ Then 式 <T>(setq d (+ a 2))→ Then 式 <T>);prog(progn→条件式が間違っているときの処理(setq c (- a 1))→ Else 式 <nil>(setq d (- a 2))→ Else 式 <nil>);prog

条件判断に基づいて実行の流れを変える制御関数としての If 関数は、

AutoLISP の関数

AutoLISP の関数(if (= b a));if

次のようになります。

複数の式をまとめる <Progn>

条件式が正しければ ( 真 )、Then 式 ( 最初の式 ) が実行され、違っていれば ( 偽 )、Else 式 ( 次の式 ) が実行されます。

実行する処理が複数ある場合は Progn を加えます。
前ページを progn で記述すると以下のようになります。

( If ( 条件式 )( Then の処理 )・・・ 条件式が真 (T) のとき、実行する( Else の処理 )・・・ 条件式が偽 (nil) のとき、実行する)(setq A (getint “¥n1 か 2 の数値を入力してください。
” ))(if (or ( = A 1 ) ( = A 2 ));A が <1> か <2> のときの処理を記述(progn;A が <1> か <2> の場合(if ( = A 1 );A が <1> かどうかを調べる

ユーザーに数値の 1 か 2 を入力させて、1 だったら線分コマンド、2 だったら円コマンド、(command “LINE” );A が <1> であれば、線分コマンドを実行

1 でも 2 でもない場合は、長方形コマンドになるプログラムを考えてみましょう。

(command “CIRCLE” );A が <2> であれば、円コマンドを実行(setq A (getint “¥n1 か 2 の数値を入力してください。” ))(if ( = A 1 )(command “LINE” );A が <1> かどうかを調べる; 条件が真 <T> であれば、線分コマンドを実行);if(if ( = A 2 )(command “CIRCLE” );A が <2> かどうかを調べる; 条件が真 <T> であれば、円コマンドを実行);if);progn(progn;A が <1> でも <2> でもない場合(command “RECTANG” ); 長方形コマンドを実行);progn);ifprogn は処理が 1 行でも可能です。

);if(if (and ( /= A 1) ( /= A 2))(command “RECTANG” );A が <1> でも <2> でもない時の処理; 条件が真 <T> であれば、長方形コマンドを実行

);if

1-131

条件関数

条件関数

1-132

第 2 章－ AutoLISP の関数

目的：
主要関数：

選択した円に中心線を作図する(defun C:chusin( / ent1 ent2 a1 a2 pt1 pt2 pt3 pt4)

選択した図形が円の時、中心線を作図します。
<entsel><car><entget><assoc><cdr><polar>

Step1 ー 中心線を作図する円を選択します。

(setq ent1 (entget (car (entsel “¥n 円を指示してください。
” ))))

2(setq ent2 (cdr (assoc 0 ent1)))

3(if (/= ent2 “CIRCLE” )(progn円の図形名を変数 <ent1> にセットします。
((-1 . < 図形名 : 7ef039e0>) (0 . "CIRCLE") (330 . < 図形名 : 7ef01cf8>) (5 . "2AC")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle"); 図形が円でなければ、プログラムを終了する; 円であれば以下を実行する→ Step2

5(setq a1 (cdr (assoc 10 ent1))); 円の中心座標を取得する

6(setq a2 (cdr (assoc 40 ent1))); 円の半径を取得する

7(setq pt1 (polar a1 pi (* a2 1.2)));pt1 は a1 から 180°の位置

8(setq pt2 (polar a1 0 (* a2 1.2)));pt2 は a1 から 0°の位置

9(setq pt3 (polar a1 (/ pi 2) (* a2 1.2)))

10(setq pt4 (polar a1 (/ (* 3 pi) 2) (* a2 1.2)))② (setq ent2 (cdr (assoc 0 ent1))) 2
図形名 ent1 の図形を取得します。
→ (assoc 0 ent1) から、(0 . "CIRCLE") が取得できます。

;pt3 は a1 から 90°の位置→ Step3;pt4 は a1 から 270°の位置;2 本の線分を作図する→ cdr 関数で、"CIRCLE" が取得できます。
Step2 ー ent2 が円であれば、その中心座標と半径を取得します。 3 411(command “line” pt1 pt2 “” ); 水平線を作図する

12(command “line” pt3 pt4 “” ); 垂直線を作図する→ Step4) ;progn

中心座標 → (setq a1 (cdr (assoc 10 ent1))) 5) ;if

径 → (setq a2 (cdr (assoc 40 ent1))) 6(princ)) ;endStep3 ー円の半径から中心線の長さを計算します。 7 8 9 10
(setq pt1 (polar a1 pi (* a2 1.2))))→ 中心線は直径の 1.2 倍としています。
（円の中心から、180°、0°、90°、270°の方向に半径の 1.2 倍の距離を計算しています。

番号①②

Step4 －計算に基づいて、中心線を作図します。 11 12(command "line" pt1 pt2 "")③(command "line" pt3 pt4 "")④
Step4 －中心線を作図します。

Step1 －円を選択します。

→ Step1; 円の中心からの長さを計算する(10 800.665 699.811 0.0) (40 . 64.0775) (210 0.0 0.0 1.0))

半; 選択した図形のタイプを取得する(prompt “¥n 選択した図形は円ではありません。
” )4① (setq ent1 (entget (car (entsel "¥n 円を指示してください。")))) 1

AutoLISP の関数

1

pt3

pt1

pt2

⑤
⑥
⑦
⑧
⑨
⑩
⑪
⑫

関数名

説 明
entsel で選択した図形の情報を取得します。ent1 には図形
ent1
名と座標がセットされます。
図形 ent1 の図形タイプは グループコード <0> にあります。
ent2
cdr 関数で図形のタイプ ( 線分とか円とか ) の情報が得られます。
if (/= ent2 “CIRCLE” )ent2 が円かどうかを判定します。
選択した図形が円でなければ、このメッセージを表示してprompt
終了します。円であれば、progn 以下に進みます。
(cdr (assoc 10 ent1))
円の中心の座標を取得します。
(cdr (assoc 40 ent1))
円の半径を取得します。
(polar a1 pi (* a2 1.2))
a1 からの角度は 180°、長さは半径 (a2) の 1.2 倍にセット(polar a1 0 (* a2 1.2))
a1 からの角度は 0°、長さは半径 (a2) の 1.2 倍にセット(polar a1 (/ pi 2) (* a2 1.2)
a1 からの角度は 90°、長さは半径 (a2) の 1.2 倍にセット(polar a1 (/ (* 3 pi) 2) (* a2 1.2)) a1 からの角度は 270°、長さは半径 (a2) の 1.2 倍にセット("line" pt1 pt2 "")pt1 から pt2 へ線分を作図します。
("line" pt3 pt4 "")pt3 から pt4 へ線分を作図します。
Point!
このプログラムでは UCS を変更していないので、
trans 関数は使っていませんが、既存の図形を使って作図をするときは、UCS 座標系に変換して作図を行う方が

pt4

1-133

条件関数

安全です。

条件関数

1-134

AutoLISP の関数

chusin.lsp

第 2 章－ AutoLISP の関数

第 2 章－ AutoLISP の関数
COND

第 2 章－ AutoLISP の関数

条件を順番に評価して、Ｔの式を実行します。

(setq a (getint "¥n<1> か <2> か <3> の数値を入力："))(cond((= a 1) (setq b (+ a 1)))

→ a が <1> の時の処理。

((= a 2) (setq b (+ a 2)))

→ a が <2> の時の処理。

((= a 3) (setq b (+ a 3)))

→ a が <3> の時の処理。

(T→ a が <1> でも <2> でも <3> でもない時の処理(setq b (+ a 4))))

ChgCircle.lsp
目的：
主要関数：

選択した円の半径を変更する
選択した円の半径が <10> のときは <5> に、<20> のときは <30> に変更します。
<entsel><car><entget><assoc><cdr><cons><subst><entmod>

Step1 ー 円を選択します。
① (setq ent1 (entget (car (entsel "¥n 円を指示してください。")))) 1
円の図形名を変数 <ent1> にセットします。
((-1 . < 図形名 : 7ef03958>) (0 . "CIRCLE") (330 . < 図形名 : 7ef01cf8>) (5 . "29B")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle")(10 1074.29 1475.39 0.0) (40 . 10.0) (210 0.0 0.0 1.0))②図形名 ent1 の図形タイプ（LINE、CIRCLE 等）を取得し、ent2 にセットします。 2

Point!

ent2 (cdr (assoc 0 ent1))
この条件式は必ず真 (T) になります。
つまり、上の 3 行がすべて不成立 (nil) でも、最後の条件式が必ず実行されます。

③ (if (/= ent2 "CIRCLE") 3 4 5 6 7 8

AutoLISP の関数

AutoLISP の関数

cond 関数の 4 行目に <T> がありますが、<T> は真に評価されますから、選択した図形が円かどうか判断します。
→ 円でなければ、" 選択した図形は円ではありません。" を表示して終了します。
→ 円の時、半径が <10> か <20> によってプログラムが分かれます。

条件判断に基づいて実行の流れを変える制御関数としての Cond 関数は、次のようになります。
Step2 ー ((= rad 10.0) (setq ent1 (subst new_rad_5 old_rad ent1))(entmod ent1)) 9 10
① if 関数は条件式が 1 つだけしか持てなかったのに対して、cond 関数は複数の条件式を並べる
ことができます。つまり、複数の if 式を 1 つにまとめる方法です。

①円の半径が <10> であれば、その半径を <5> に変更します。
② (entmod ent1) でデータを更新します。
（必須です）

ある条件と、それが真のとき実行する式を組みにして何組でも並べることができます。
Step3 ー ((= rad 20.0) (setq ent1 (subst new_rad_30 old_rad ent1))(entmod ent1)) 11 12( cond①円の半径が <20> であれば、その半径を <30> に変更します。
(( 条件式 1) (Then の処理 ))・・・条件式 1 が正しいときに実行する(( 条件式 2) (Then の処理 ))・・・条件式 2 が正しいときに実行する(( 条件式 3) (Then の処理 ))・・・条件式 3 が正しいときに実行する(・・・上記以外のときに実行する

T(Then の処理 ))② (entmod ent1) でデータを更新します。
（必須です）
Step1 －半径 <10> の円を選択したとき。
（左側）
半径 <5> に変更

元の図形です。

);cond② cond 関数は引数に複数の式を並べられますから、条件に基づいて複数の式を実行する時でも半径 <10>

半径 <20>progn を使わなくて済みます。
Step1 －半径 <20> の円を選択したとき。
（右側）③ P1-126 の if 式を cond 式で記述すると、以下のようになります。
(setq A (getint “¥n1 か 2 の数値を入力してください。” ))半径 <30> に変更(cond(( = A 1 ) (command “LINE” ));A が <1> であれば、線分コマンドを実行(( = A 2 ) (command “CIRCLE” ));A が <2> であれば、円コマンドを実行(

T(command “RECTANG” )) ;<1> でも <2> でもなければ、長方形コマンドを実行);cond

1-135

条件関数

条件関数

1-136

第 2 章－ AutoLISP の関数(defun c:ChgCircle( / ent1 ent2 old_rad new_rad rad)1

(setq ent1 (entget (car (entsel "¥n 円を指示してください。"))))

2(setq ent2 (cdr (assoc 0 ent1)))

3(if (/= ent2 "CIRCLE");ent1 の図形タイプ（LINE、CIRCLE 等）を取得

第 3 章 AutoCAD と対話する; 円でなければ(prompt "¥n 選択した図形は円ではありません。")

4(progn→ Step1; 円であれば、以下を実行する

5(setq old_rad (assoc 40 ent1))

6(setq new_rad_5 (cons 40 5.0)) ; あらかじめ、半径が <5> のドット・ペアを作成

7(setq new_rad_30 (cons 40 30.0))8(setq rad (cdr old_rad));(40 . 半径 ) のドット・ペアを取得

会話しながら作業を進めます。
大事なことは相手側 (AutoCAD) からの問い掛けに正確に答; あらかじめ、半径が <30> のドット・ペアを作成えることです。
では、AutoCAD はどのように問い掛けてくるのでしょうか？

; 選択した円の半径を変数 <rad> にセット

AutoLISP の関数(cond ;rad が <10.0> の時は 1 番目の処理を行い、<20.0> の時は 2 番目の処理を行う((= rad 10.0) (setq ent1 (subst new_rad_5 old_rad ent1))

9(entmod ent1))

10((= rad 20.0) (setq ent1 (subst new_rad_30 old_rad ent1))

11(entmod ent1))

12→ Step2→ Step3);cond);progn);if(princ)) ;end

番号
①
②
③
④
⑤
⑥
⑦
⑧
⑨
⑩
⑪
⑫

1-137

関数名

説 明
entsel で選択した図形の情報を取得します。ent1 には図形名と座標がセッ
ent1
トされます。
図形 ent1 の図形タイプは グループコード <0> にあります。
ent2
cdr 関数で図形のタイプ ( 線分とか円とか ) の情報が得られます。
(/= ent2 "CIRCLE") ent2 が円かどうかを判定します。
選択した図形が円でなければ、このメッセージを表示して終了します。
prompt円であれば、progn 以下に進みます。
old_rad
円の半径を取得します。
半径のグループコード <40> と半径 <5> を組み合わせて、ドットペアを
new_rad_5
あらかじめ作成します。
半径のグループコード <40> と半径 <30> を組み合わせて、ドットペア
new_rad_30
をあらかじめ作成します。
rad (cdr old_rad) 選択した円の半径を取得して、半径が <10> か <20> の判断をします。
subst
半径 <10> と半径 <5> を入れ替えます。
(entmod ent1)
データを更新します。
（必須です）
subst
半径 <20> と半径 <30> を入れ替えます。
(entmod ent1)
データを更新します。
（必須です）

条件関数

Word や Excel ではプログラム側からユーザー側に問い掛けてくることはありません。しかし、AutoCAD ではお互いに

この章では以下のことを学びます。
第 1 節

表示をコントロールする

第 2 節

ユーザー入力関数

第 3 節

ジオメトリック ユーティリティ

第 4 節

テキスト ファイルの入出力

第 5 節

AutoLISP のエラー処理

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第1節

表示をコントロールする

1 メッセージ表示コントロール関数

AutoCAD が問い掛けてくる窓口がコマンド ウィンドウです。（またはコマンド ライン）
このウィンドウを通して AutoCAD とユーザーは会話します。

PRIN1

コマンド ラインに式を表示したり、開いているファイルに式を書き出します。

① (prin1 "AutoLISP")→ "AutoLISP""AutoLISP"② (prin1 "AutoLISP")(princ)→ "AutoLISP"→① prin1 はクォーテーションで囲まれた文字列を表示し、戻り値もクォーテーションで囲まテキスト ウィンドウに切り替えます。
使用頻度の高い AutoLISP の 表示コントロール関数を、次の表に示します。（順不同）

AutoCAD と対話する①メッセージ表示コントロール関数
関 数
説 明
コマンド ラインに式を表示したり、開いているファイルに式を書き出(prin1 [expr [file-desc]])
します。
コマンド ラインに式を表示したり、開いているファイルに式を書き出(princ [expr [file-desc]])
します。
コマンド ラインに式を表示したり、開いているファイルに式を書き出(print [expr [file-desc]])します。
(prompt msg)
スクリーンのコマンド ラインに文字列を表示します。
(terpri)
コマンドラインに改行を出力します。
②画面の表示コントロール関数
関 数
説 明(graphscr)
AutoCAD のグラフィックス スクリーンを表示します。
(textpage)
グラフィックス スクリーンからテキスト スクリーンに切り替えます。
グラフィックス スクリーンからテキスト スクリーンに切り替えます。
(textscr)(AutoCAD のスクリーン切り替えファンクション キーと同じ )現在のビューポートまたは現在のビューポートで指定されたオブジェ(redraw [ename [mode]])クト ( 図形 ) を再描画します。
③コマンド ラインへの表示をコントロールするシステム変数
関 数
説 明
CMDECHO command 関数から実行されたコマンドの表示 / 非表示をコントロールします。
④ダイアログの表示を非表示にできる代表的なコマンド
関 数
説 明-hatchコマンドの前に <-> を付けると、[ ハッチング ] ダイアログを表示させない。
-insert
コマンドの前に <-> を付けると、[ ブロック挿入 ] ダイアログを表示させない。
-view
コマンドの前に <-> を付けると、[ ビュー管理 ] のダイアログを表示させない。
-layerコマンドの前に <-> を付けると、[ 画層プロパティ管理 ] ダイアログを表示させない。
-colorコマンドの前に <-> を付けると、[ 色 ] ダイアログを表示させない。
-linetype
コマンドの前に <-> を付けると、[ 線種管理 ] ダイアログを表示させない。
-lweight
コマンドの前に <-> を付けると、[ 線の太さの設定 ] のダイアログを表示させない。
-styleコマンドの前に <-> を付けると、[ 文字スタイル管理 ] ダイアログを表示させない。
-dimstyle
コマンドの前に <-> を付けると、[ 寸法スタイル管理 ] ダイアログを表示させない。

1-139

表示をコントロールする

れた文字列を表示します。
→② (princ) を追加すると、クォーテーションで囲まれた文字列だけを表示します。
PRINC

コマンド ラインに式を表示したり、開いているファイルに式を書き出します。

① (princ "AutoLISP")→ AutoLISP"AutoLISP"② (princ "AutoLISP")(princ)→ AutoLISP→① princ はクォーテーションで囲まれない文字列を表示し、戻り値はクォーテーションで囲まれた文字列を表示します。
→② (princ) を追加すると、文字列だけを表示します。

PROMPT

コマンド ラインに文字列を表示します。

① (prompt "AutoLISP")→ AutoLISPnil② (prompt "AutoLISP")(princ)→ AutoLISP→① prompt はクォーテーションで囲まれない文字列を表示し、戻り値は <nil> を返します。
→② (princ) を追加すると、文字列だけを表示します。

TERPRI

文字列を改行してコマンド ラインに表示します。

①コマンド : (prompt "AutoLISP")→ AutoLISPnil②コマンド : (prompt "AutoLISP")(terpri)→ AutoLISP
nil （← nil が改行されて、次の行に表示される。
）( 例）(prompt "1 点目を指示：") (terpri) (prompt "2 点目を指示：")
コマンドラインには、次のように表示されます。
1 点目を指示：
2 点目を指示：表示をコントロールする

1-140

AutoCAD と対話する[status( 図面情報 )] コマンドのように情報量が多いときは、[F2] キーか [textscr] コマンドで

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

面取り（prompt と princ の組み合わせ）(defun c:trim_1( / cha_a cha_b dis dis1 en1 en2)

Step1 ー ​プログラムの最初に、面取りのシステム変数 <CHAMMODE> を <0> に設定します。 1<CHAMMODE> は面取りを作成するときの入力方法を設定します。
<0> は 2 つの面取り距離を指定し、<1> は面取り距離と角度を指定します。
このプログラムは 2 本線の面取りですから、<CHAMMODE> を <0> にします。
次に、現在の面取りのシステム変数 <CHAMFERA> と <CHAMFERB> を取得します。 2 3
最後に元の設定に戻すためです。
(setq cha_a (getvar "CHAMFERA")) (setq cha_b (getvar "CHAMFERB"))

1(setvar "CHAMMODE" 0)2(setq cha_a (getvar "CHAMFERA"));1 本目の面取りの初期値を取得する

3(setq cha_b (getvar "CHAMFERB"));2 本目の面取りの初期値を取得する

4(setq dis 10.0)

5(prompt "¥n1 本目の面取りの距離は？ <")(princ dis) ; メッセージを表示する

6(setq dis1 (getreal ">"))

7(if (= dis1 nil) (setq dis1 dis)); 面取りモードを <0> にセットする→ Step1; 面取りの初期値を <10.0> にセットする;1 本目の面取りの距離を取得する→ Step2; 空打ちの時は、<dis> の値を <dis1> にセットする;2 本目の面取りの距離

Step2 ー 1 本目の面取りの距離を求めます。 4 5 6 7
以下がコマンドラインに表示されます。

(setq dis 10.0)(setq dis1 (getreal ">"))→1 本目の面取りの距離は？ <10.0><20> と入力します。

(if (= dis1 nil) (setq dis1 dis))

もし、空打ち時は、dis の数値が dis1 に(prompt "¥n1 本目の面取りの距離は？ <")(princ dis)

代入されます。

AutoCAD と対話する

9(setq dis2 (getreal ">"))

10(if (= dis2 nil) (setq dis2 dis1)) ; 空打ちの時は、<dis1> の値を <dis2> にセットする→ Step3;2 本目の面取りの距離を取得する;2 本の線分を指示して面取りする図形を取得する
11(setq en1 (car (entsel "¥n1 本目の線分を選択：")));1 本目の線分を取得する

12(setq en2 (car (entsel "¥n2 本目の線分を選択：")));2 本目の線分を取得する→ Step4→

以下がコマンドラインに表示されます。
2 本目の面取りの距離は？ <20.0>

もし、空打ち時は、dis1 の数値が dis2 に代入されます。

13(command "chamfer" "d" dis1 dis2 "")14(command "chamfer" en1 en2)

15

(setvar "CHAMFERA" cha_a);1 本目の面取り距離を元に戻す

16(setvar "CHAMFERB" cha_b);2 本目の面取り距離を元に戻す; 面取り距離をセットする; 面取りコマンドを実行する→ Step5(princ)) ;endStep4 ー面取りコマンドを使って、2 本の線分を面取りします。 11 12 13 14(setq en1 (car (entsel "¥n1 本目の線分を選択：")))→ 面取りの 1 本目を指示します。

(setq en2 (car (entsel "¥n2 本目の線分を選択：")))→ 面取りの２本目を指示します。

Step5 ー最後にシステム変数 <CHAMFERA> と <CHAMFERB> を元に戻します。 15 16(setvar "CHAMFERA" cha_a) (setvar "CHAMFERB" cha_b)

Step4 － 1 本目の線分を選択

Step4 － 2 本目の線分を選択

結果

番号
関数名
説 明
① "CHAMMODE" 0CHAMMODE <0> は、2 本の面取り。<1> は線分と角度の面取り。
② getvar "CHAMFERA"
1 本目の面取りの距離を取得します。最後に元に戻すため。
③ getvar "CHAMFERB"
2 本目の面取りの距離を取得します。最後に元に戻すため。
④ dis 10.0
面取りの距離の初期値に <10.0> をセットします。
⑤ <")(princ dis)
コマンドラインに、"<10.0" と表示されます。
⑥ (getreal ">"コマンドラインに、">" が表示されます。結果として、"<10.0>"。
⑦ (= dis1 nil) (setq dis1 dis) ユーザーが空打ちした場合は、変数 [dis1] に dis の値をセット。
⑧ <")(princ dis1)
コマンドラインに、"<dis1" の値が表示されます。
⑨ (getreal ">")
コマンドラインに、">" が表示されます。結果として、"<dis1>"。
⑩ (= dis2 nil) (setq dis2 dis1) ユーザーが空打ちした場合は、変数 [dis2] に dis1 の値をセット。
⑪ en1
選択した線分の図形名を取得します。面取り時に指定します。
⑫ en2
選択した線分の図形名を取得します。面取り時に指定します。
⑬ "chamfer" "d" dis1 dis2 "" 面取りコマンドの、1 本目と 2 本目の距離を指定します。
⑭ "chamfer" en1 en2
面取りコマンドで 2 本の線分を指定します。
⑮ "CHAMFERA" cha_a
1 本目の面取りの距離を元に戻します。
⑯ "CHAMFERB" cha_b
2 本目の面取りの距離を元に戻します。
entsel は、P1-210 を参考

1-141

表示をコントロールする

表示をコントロールする

1-142

AutoCAD と対話する(prompt "¥n2 本目の面取りの距離は？ <")(princ dis1)(if (= dis2 nil) (setq dis2 dis1))(prompt "¥n2 本目の面取りの距離は？ <")(princ dis1) ; メッセージを表示する; 面取りコマンドを実行 する

Step3 ー 2 本目の面取りの距離を求めます。 8 9 10
(setq dis2 (getreal ">"))

8

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する
redraw 関数

2 画面の表示コントロール関数
TEXTSCR

文字画面に切り替えます。

作図画面から文字画面に切り替える
GRAPHSCR

作図画面に切り替えます。

文字画面から作図画面に切り替える
REDRAW→ (textscr)→ (graphscr)

現在のビューポートを再描画します。

(redraw ent1 mode))→ ent1 は図形名

削除する図形をハイライト表示する

1(setq ent1 (entsel "¥n 削除するオブジェクトを選択："))2(setq ent2 (car ent1)) ; 選択した図形名を変数 <ent2> にセット

3

(redraw ent2 3) ; 図形 ent2 をハイライト表示する

4(Initget 1 "Yes No")5

(setq ans (getkword " この図形でよろしいですか？ Yes/No："))→ Step1→ Step2］; 次の行のキーを "Y" と "N" に固定

6(if (or (= ans "Y") (ans = "y"))​7(redraw ent2 2) ; 図形を削除

8(redraw ent2 4) ; ハイライト表示を解除;"Y" か "y" のキーが押されたら);if→ Step3］→ Step4］

mode 1 = 図形の再描画
2 = 図形の消去

Step1: オブジェクトを選択

Step2: 選択したオブジェクトをハイライト表示

3 = 図形のハイライト表示(redraw)→ redraw コマンドと同じです。

(redraw ent1 1)→ 図形を再描画します。

(redraw ent1 2)→ 図形を消去します。

(redraw ent1 3)→ 図形をハイライト表示します。

(redraw ent1 4)→ 図形のハイライトを解除します。

QTEXT

Step3: getkword で "Y" ならば、削除

Step4: getkword で "N" ならば、ハイライトを解除

文字と属性の表示と印刷をコントロールします。

① [ ツール ] → [ オプション ] → [ 表示 ] タブから [ 文字の境界フレームのみを表示 ] を選択②コマンド ラインから、[QTEXT] → [ON/OFF] → [REGEN] と入力[QTEXT] コマンドで文字省略モードをオンにすると、図面内の文字や属性文字が文字を囲む境界
ボックスとして表示されます。これによって、図面内に多くの文字が有る時は再描画と再作図にかかる時間が短縮できます。

番号
関数名① entsel② car ent1
③ redraw 3④ initget 1⑤ getkword⑥ if⑦ redraw 2⑧ redraw 4

説 明
削除するオブジェクトを選択します。
（図形名と指示した座標値を取得します。
）
car 関数で図形名だけを取得し、変数 ent2 にセットします。
図形 ent2 をハイライト表示します。
0( ゼロ ) を入力することを禁止します。
キーボード入力は、"Y" か "N" に限定します。
キーボードからの入力が、"Y" か "y" の時の処理を記述します。
"Y" ならば、削除します。
"N" ならば、ハイライトの表示を解除します。

initget、getkword は、P1-166、P1-167 を参考

1-143

表示をコントロールする

表示をコントロールする

1-144

AutoCAD と対話する

AutoCAD と対話する

4 = 図形のハイライト解除

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

3 コマンド ラインへの表示をコントロールするシステム変数
CMDECHOcommand 関数から実行されたコマンドの表示 / 非表示を切り替えます。

4 ダイアログの表示を非表示にできる代表的なコマンド（例）-hatch、-insert

ハッチングやブロック挿入のダイアログを表示させません

AutoLISP の command 関数を実行中に、プロンプトとユーザー入力をエコーバック表示するか

AutoCAD には、ダイアログを表示するコマンドがあります。通常、このダイアログはユーザーをコントロールします。

に処理を判りやすくする機能ですが、AutoLISP で使用する場合は問題があります。

(cmdecho 0 )→ エコーバックを表示しません。

それは、LISP の途中でダイアログが表示されると、ユーザーの選択待ちの状態になるために、(cmdecho 1 )→ エコーバックを表示します。

LISP プログラムが停止してしまうからです。

例①

このトラブルを避けるために、コマンドの前に < － > 記号を付加するとダイアログが非表示にシステム変数 <CMDECHO> が <0> の場合。

なり、LISP プログラムが最後まで動作します。

(defun echo_chk1( )(setq pt1 (list 100 100))→変数 pt1 に XY 座標 (100,100) をセット

(setq pt2 (list 200 200))→

変数 pt2 に XY 座標 (200,200) をセット

(command "LINE" pt1 pt2 "")→pt1 から pt2 に線分を作図する)-hatchハッチングのダイアログを表示させない

普通に <hatch(T)> コマンドを使った場合、ダイアログが表示されます。

表示されます。

例②

AutoCAD と対話する

AutoCAD と対話する

LINE コマンドのメッセージが次に、システム変数 <CMDECHO> を <1> に変更します。

(defun echo_chk 2( )(setvar "cmdecho" 0)→

コマンド ラインにメッセージを表示しない(setq pt1 (list 100 100))(setq pt2 (list 200 200))

hatch の前に < － > 記号を付加して <-hatch> とすると、ダイアログを表示しません。

(command "LINE" pt1 pt2 "")(setvar "cmdecho" 1)→コマンド ラインにメッセージを表示させる)

LINE コマンドのメッセージが表示されません。

コマンド : -hatch
現在のハッチング パターン : ANGLE
内側の点を指定 または [ プロパティ (P)/ オブジェクトを選択 (S)/ 境界を作成 (W)/ 境界を除外 (B)/
拡張 (A)/ 表示順序 (DR)/ 原点 (O)/ 異尺度対応 (AN)/ ハッチングの色 (CO)/ 画層 (LA)/ 透過性 (T)]:最後の <1> は cmdecho が <1> にセットされたことを表示しています。
この表示をしないようにするには、最後に (princ) を追加します。

1-145

表示をコントロールする

表示をコントロールする

1-146

第 3 章－ AutoCAD と対話する-insert

第 3 章－ AutoCAD と対話する
ブロック挿入のダイアログを表示させない

普通に <ClassicInsert> コマンドを使った場合（ダイアログが表示されます。）-layer

画層のダイアログを表示させない

普通に <layer> コマンドを使った場合（ダイアログが表示されます。
）

insert の前に < － > 記号を付加して <-insert> とすると、ダイアログを表示しません。
layer の前に < － > 記号を付加して <-layer> とすると、ダイアログを表示しません。
コマンド : -LAYER
現在の画層 : "0"
オプションを入力 [ 一覧 (?)/ 現在の層の新規作成 (M)/ 現在の層の変更 (S)/ 新規作成 (N)/ 名前変更

コマンド : -INSERT(R)/ 表示 (ON)/ 非表示 (OFF)/ 色設定 (C)/ 線種設定 (L)/ 線の太さ (LW)/ 透過性 (TR)/ マテリアル (MAT)/

ブロック名を入力 または [ 一覧 (?)]:
ビュー管理のダイアログを表示させない

画層 (E)/ 外部参照 (X)]:

AutoCAD と対話する-color

色変更のダイアログを表示させない

AutoCAD と対話する-view

印刷 (P)/ フリーズ (F)/ フリーズ解除 (T)/ ロック (LO)/ ロック解除 (U)/ 画層状態 (A)/ 説明 (D)/ 正規

普通に <view> コマンドを使った場合（ダイアログが表示されます。）
普通に <color> コマンドを使った場合（ダイアログが表示されます。
）

view の前に < － > 記号を付加して <-view> とすると、ダイアログを表示しません。
color の前に < － > 記号を付加して <-color> とすると、ダイアログを表示しません。

コマンド : -VIEW
オプションを入力 [ 一覧 (?)/ 削除 (D)/ 直交投影 (O)/ 呼び出し (R)/ 登録 (S)/ 設定 (E)/ 窓 (W)]:コマンド : -color
オブジェクトの既定の色を入力 [TrueColor(T)/ カラー ブック (CO)] <BYLAYER>:

1-147

表示をコントロールする

表示をコントロールする

1-148

第 3 章－ AutoCAD と対話する-linetype

第 3 章－ AutoCAD と対話する
線種のダイアログを表示させない

普通に <linetype> コマンドを使った場合（ダイアログが表示されます。）-style

文字スタイルのダイアログを表示させない

普通に <style> コマンドを使った場合（ダイアログが表示されます。
）

style の前に < － > 記号を付加して <-style> とすると、ダイアログを表示しません。
linetype の前に < － > 記号を付加して <-linetype> とすると、ダイアログを表示しません。
コマンド : -LINETYPE
現在の線種 : "ByLayer"
オプションを入力 [ 一覧 (?)/ 作成 (C)/ ロード (L)/ 設定 (S)]:コマンド :-STYLE
文字スタイル名を入力 または [ 一覧 (?)] <Standard>:

線の太さの設定のダイアログを表示させない

普通に <lweight> コマンドを使った場合（ダイアログが表示されます。）-dimstyle

寸法スタイルのダイアログを表示させない

AutoCAD と対話する

AutoCAD と対話する-lweight

普通に <dimstyle> コマンドを使った場合（ダイアログが表示されます。
）

lweight の前に < － > 記号を付加して <-lweight> とすると、ダイアログを表示しません。
dimstyle の前に < － > 記号を付加して <-dimstyle> とすると、ダイアログを表示しません。
コマンド : -DIMSTYLE
現在の寸法スタイル : ISO-25 異尺度対応 : いいえ
寸法スタイル編集オプションを入力

コマンド : -LWEIGHT[ 異尺度対応 (AN)/ 登録 (S)/ 呼び出し (R)/ 現在のスタイル変数一覧 (ST)/ スタイル変数一覧 (V)/

現在の線の太さ : BYLAYER
新しく作成されるオブジェクトの既定の線の太さを入力 または [ 一覧 (?)]:

1-149

表示をコントロールする

適用 (A)/ 一覧 (?)] < 呼び出し >:表示をコントロールする

1-150

第 3 章－ AutoCAD と対話する

第2節

第 3 章－ AutoCAD と対話する

ユーザー入力関数

AutoCAD 側からの問い掛けに対して、ユーザーはキーボードやマウスで応答します。
キーボードから入力できるのは、整数と実数、文字列です。一方マウスからは XYZ の座標値が入力できます。

1 ユーザー入力関数（キーボード入力）
GETINT

整数を入力します。

(getint "¥n 複写回数を入力："))しかし、入力するタイプによって使用される関数は違います。下図は、[array( 回転複写 )] におけるコマンド ラインのメッセージですが、上から [ 回数 ]、[ 角度 ] を尋ねています。

もし実数を入力すると、< 整数値を入力してください。> のメッセージが表示されます。

それぞれの問いに対応する数値を入力しなければ、求める図形が作図できません。
GETREAL

実数を入力します。

(getreal "¥n 数値を入力："))もし整数 <3> を入力すると、<3.0>（実数）が返されます。

AutoCAD と対話する

使用頻度の高い AutoLISP のユーザー入力関数を、次の表に示します。（順不同）①ユーザー入力関数（キーボード入力）
関 数
説 明
ユーザーが整数を入力するまで待機 ( 一時停止 ) し、入力された整(getint [msg])
数を返します。
ユーザーが実数を入力するまで待機 ( 一時停止 ) し、入力された実(getreal [msg])
数を返します。
ユーザーが文字列を入力するまで待機 ( 一時停止 ) し、入力された(getstring [cr] [msg])
文字列を返します。

GETSTRING(setq text1 (getstring "¥n 文字を入力："))コマンド : AutoLISP→ コマンドラインに < AutoLISP > と入力します。

コマンド : !text1→ コマンドラインに < !text1 > と入力します。

"AutoLISP"→ "AutoLISP" が表示されます。

②ユーザー入力関数 ( マウス & キーボード入力）
関 数
説 明
ユーザーが角度を入力するまで待機 ( 一時停止 ) し、入力された角(getangle [pt] [msg])
度をラジアン単位で返します。
ユーザーが長方形の 2 番目のコーナーを入力するまで待機 ( 一時
(getcorner pt [msg])
停止 ) します。
(getdist [pt] [msg])
ユーザーが距離を入力するまで待機 ( 一時停止 ) します。
ユーザーが角度を入力するまで待機 ( 一時停止 ) し、入力された角(getorient [pt] [msg])
度をラジアン単位で返します。
ユーザーが点を入力するまで待機 ( 一時停止 ) し、入力された点を(getpoint [pt] [msg])
返します。

Point!

③ユーザー入力関数（キーワード）
関 数
説 明
ユーザーがキーワードを入力するまで待機 ( 一時停止 ) し、入力
(getkword [msg])
されたキーワードを返します。
次のユーザー入力関数の呼び出しで使用するキーワードを設定し(initget [bits] [string])
ます。

Point!

1-151

ユーザー入力関数

文字列を入力します。

Lisp の記述

AutoCAD と対話する

この節では、このようなユーザー入力のタイプごとに異なる関数を学びます。

コマンド ラインに表示される文字列(getint "¥n 複写回数を入力："))→ < 複写回数を入力：> が表示されます。
ユーザーはこの指示を確認して、入力します。

(getint)→何もメッセージは表示されず、ユーザーの入力待ちになります。

(setq text1 (getstring T "¥n 文字を入力："))
上記のように、getstring の次に <T> などの英数字を付加すると（つまり nil ではない）、
空白の文字を受け付けます。
もし getstring だけの場合は、空白のスペースキーを押したとき、入力は終了します。

ユーザー入力関数

1-152

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

Rota1.lsp

四角形を回転する
回転コマンドを使いマウスで点 P1 を指示した後、変数に代入されている数値
で図形を回転させます。
<getreal><getpoint><ROTATE>

目的：
主要関数：

2 ユーザー入力関数（マウス & キーボード入力）
GETANGLE

指示した 2 点間の角度を返します。
（ラジアン）(setq ang1 (getangle "¥n 角度を測定する 2 点を指示："))マウスで点 P1 と点 P2 を指示します。
45°回転
P2

角度 45°①最初に、回転角度を入力させ、変数 ang1 にセットします。

コマンド : !ang1→ コマンドラインに < !ang1 > と入力します。

②次に回転の基点の座標をマウスで指示させます。(P1)

0.785398→ ラジアンの値が表示されます。

③次に回転コマンドを使います。
④ユーザーに回転する図形 ( 四角形 ) を選択させますが、その後の回転の基点と回転角度は先に入力済みですから、プログラムでその数値を使って四角形を回転させます。

(defun C:Rota1( / ang1 p1)

1

AutoCAD と対話する

角度は 45°P1

P1

2(setq ang1 (getreal “¥n 回転角度：” ))3(setq p1 (getpoint “¥n 回転基点：” ))(command “ROTATE” pause “” p1 ang1)) ;end

番号

関数名

①

defun

②
③

getrealgetpoint④"ROTATE"→ ユーザーに、回転角度と基点を求めます。

東（右）の方向を 0°とした反時計回りの角度を返します。
（ラジアン）
北getangle 関数は、システム変数 <ANGDIR> と <ANGBASE> の影響を受けますが、getorient 関数は受けません。
必ず、東（右方向）が 0（ゼロ）ラジアンで反時計回りに計測
します。

西

東

getangle 関数と getorient 関数は次のように使い分けをします。

; 回転角度と基点が確定したので、実行する

4→ 関数を宣言します。
］

getorient→ ユーザーに、オブジェクトを選択させます。
］

説 明関数の宣言です。 Rota1 で宣言する場合は、(defun C:Rota1( / ) になります。
( / ang1 p1) はこのプログラムの中だけで使用できるローカル変数です。
ユーザーから入力された数値を実数として認識します。
ユーザーがマウスで指示した座標を変数 p1 にセットします。
回転コマンドを使用します。
pause はユーザーの指示待ちです。( 図形を指示するまで、プログラムが停止します。““ は選択し終わったという意味になります。）

getangle 関数・・他の座標や図形との相対角度を測るとき。
getorient 関数・・絶対角度を必要とするとき。
（測量など）GETCORNER

南

対角点を指示します。
（基点からボックスが表示されます。
）

getcorner で 1 点目を指示したあとに、
ラバーバンドを表示さすには P1 を getcorner に続けます。
(getcorner P1 "¥n 対角点を指示："))マウスで点 P1 と対角点 P2 を指示します。

P2

回転 (ROTATE) コマンドは、図形を指示し終わると、回転の基点を聞いてきます。
そして、次に回転角度を聞いてきます。
②は [getangle] 関数ではなく、[getreal] 関数であることに注意してください。
P1

1-153

ユーザー入力関数

ユーザー入力関数

1-154

AutoCAD と対話する

P1

第 3 章－ AutoCAD と対話する
GETDIST

第 3 章－ AutoCAD と対話する
getangle 関数

指示した 2 点間の距離を返します。

AutoCAD のコマンドに回転コマンドがありますが、このコマンドではユーザーに回転角度を聞いてP1 と P2 の距離を変数 dist1 に代入します。
(setq dist1 (getdist "¥n2 点間を指示："))四角形を回転する→ p1 と p2 を指示します。

きます。このときの関数が Getangle です。
1. コマンドラインから、以下のように入力します。

P1
×

P2
×

(setq a (getangle))
この式は、コマンドラインを空白にして、角度の入力を待ちます。

コマンド : !dist1→ コマンドラインに < !dist1 > と入力します。

486.269→ 距離の値が表示されます。

GETPOINT

2. キーボードから <45> と入力します。コマンドラインに <0.785398> 数字が表示されます。
これは、45 度をラジアンに変換した数値が返されています。
次に、このラジアンを度数に変換します。

指示した点の座標値を返します。

180°が pi(3.14159) ラジアンですから、180 : pi = a : 0.785398 より、
a = ( / ( * 0.7853 180.0) 3.14159) になります。

(setq p1 (getpoint "¥n 挿入位置を指示："))コマンド : !p1→ コマンドラインに < !p1 > と入力します。

(1301.34 839.554 0.0)

→ 指示した点の座標値が表示されます。

3. コマンドラインに、(setq a ( / ( * 0.7853 180.0) 3.14159)) を入力します。
キーボードから、!a と入力すると、44.9944 の数値が表示されます。
4.[ 回転 ] コマンドを選び、図形を選択し基点を指示した後、< 回転角度：> のメッセージが出たときに、① Get 関数でプロンプト（メッセージ）を使うことができます。関数の後に 2 重引用符 ( “ ) でキーボードから、!a と入力すると、基点を中心として図形が 45 度回転されます。

（getpoint、getcorner、getangle、getdidt）(setq P1 (getpoint “¥n1 点目を指示：” ))¥n は改行キーです。次の行にプロンプトが表示されます。
このとき、コマンドラインに次のようなメッセージが表示されます。

回転コマンドを使い、回転の基点を左下の回転角度にキーボード

四角形を選択します。

コーナーに指示します。

から、!a と入力します。

1 点目を指示：②次の点の座標 (P2) を得るときに、以下のように Getpoint の後に P1 をつけると、P1 からラバー
バンドが表示され、視覚的に分かりやすくなります。
(setq P2 (getpoint P1 “¥n 終点を指示：” ))P2
この前の行で、(initget 32) をP1
ラバーバンド

記述すると、ラバーバンドがハイライト（破線）表示に変わります。

Point!
度数 (a) からラジアンへの変換式は( * pi ( / a 180.0 )) または、( / ( * pi a) 180.0 )ラジアン (a) から度数への変換式は( * ( / a pi) 180.0 ) または、 ( / ( * 180.0 a) pi )1-155

ユーザー入力関数

ユーザー入力関数

1-156

AutoCAD と対話する

AutoCAD と対話する

囲んでコマンドラインに表示する文字列を記述します。

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

MO_RO.lsp
目的：
主要関数：

選択した図形を移動して回転する

Step3 ー getangle 関数で長方形を位置合わせする向きを決めます。 4

選択したオブジェクト（長方形）を線分に位置合わせします。（移動＋回転）<entsel><car><getpoint><getangle><MOVE><ROTATE>(setq ang1(getangle p1 "¥n 方向を指示 :"))
→ 長方形の片方の端を指示します。

en1
p1
p1

ang1( ラジアン )

p2

2(

g
an

ラ

ン

ア

ジ

)

p1 p2
Step4 ー 長方形の <p1> の移動先を決めます。<p2> 5(setq p2 (getpoint "¥n 新しい基点を指示 :"))

Step1 ー 回転移動するオブジェクト（長方形）を選択します。(entsel 関数 ) 1 2→ 点 p1 の移動先を指示します。

(setq en1 (entsel "¥n オブジェクトを選択："))→ 回転移動するオブジェクトを選択します。

p1(< 図形名 : 7ef03958> (1350.56 1111.84 0.0)) が取p2

得できます。
(setq en2 (car en1))

Step5 ～ 6 ー 長方形の移動先の向きを決めます。​6 7< 図形名 : 7ef03958> が取得できます。

Step2 ー getpoint 関数で移動する基点を指示し、変数 <p1> にセットします。 3(setq p1 (getpoint "¥n 移動の基点を指示 :"))

AutoCAD と対話する

AutoCAD と対話する→ en1 から図形名だけ取り出します。

(setq ang2(getangle p2 "¥n 方向を指示 :"))
→ 移動先での方向を指示します。

p1(/ (* (- ang2 ang1) 180.0) pi)

p2

Point!

→ ラジアンを度数に変換します。

→ 長方形の点 p1 を指示します。

Step7 ー移動コマンドを使い、長方形の点 <p1> を点 <p2> に移動させます。 8

p1(command "MOVE" en2 "" p1 p2)→ 長方形を基点 (p1) から目的点 (p2) へ移動します。

Step8 ー 回転コマンドを使い、長方形を点 <p2> を基点に回転させます。 9(command "ROTATE" en2 "" p2 ang3)→ 長方形を基点 (p2)、回転角度 (ang3)
で回転します。

p1 p2

1-157

ユーザー入力関数

ユーザー入力関数

1-158

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する
Getpoint と Lastpoint(defun C:MO_RO ( / en1 en2 p1 p2 ang1 ang2 ang3)
1(setq en1 (entsel "¥n オブジェクトを選択："))2(setq en2 (car en1))

3(setq p1 (getpoint "¥n 移動の基点を指示 :"))

4(setq ang1(getangle p1 "¥n 方向を指示 :"))

; 図形を選択する; 選択した図形を変数 <en2> に代入する; 基点をセットする; 回転の方向を指示する→ Step1→ Step2］→ Step3］; 移動先の点と方向を指示して、移動距離と回転角度を取得する

5(setq p2 (getpoint "¥n 新しい基点を指示 :"))

6

(setq ang2(getangle p2 "¥n 方向を指示 :"))

; 移動先の点を取得する; 回転角度を取得する→ Step4］→ Step5］

1. コマンドラインから、以下のように入力します。
コマンド : (setq p1 (getpoint) )この式は、コマンドラインを空白にして、点の入力を待ちます。
2. マウスで円の中心を選択します。
コマンドラインに円の中心座標が表示されます。
_cen どこの (1252.02 998.001 0.0)

p1

; ラジアンを度数に変換する→ Step6］(command "MOVE" en2 "" p1 p2) ; 選択した図形を p1 から p2 へ移動する ］→ Step7;p2を基点に四角形を回転する(command "ROTATE" en2 "" p2 ang3)→ Step8］(setq ang3(/ (* (- ang2 ang1) 180.0) pi))

789;ang1 と ang2 の角度の差(princ)10) ;end3. キーボードから、!p1 と入力すると、点 p1（円の中心）の座標値が表示されます。

番号
関数名① entsel② (car en1)
③ getpoint④ getangle p1⑤ getpoint⑥ getangle p3
⑦
⑧
⑨
⑩

説 明
回転移動する図形を選択します。
car 関数で、選択した図形の図形名を取得します。
回転移動の基点を指示します。
回転の方向を指示します。（位置合わせの基準線になります。）
移動先の基点を指示します。③の p1 がこの位置にきます。
回転する角度を取得します。
回転角度のラジアンを度数に変換します。⑨の [ROTATE] コマ(/ (* (- ang2 ang1) 180.0) pi)
ンドは、度数を使うためです。
MOVE
選択した図形を移動します。
（基点③の p1 が目的点⑤の p2 へ）
ROTATE移動した図形を回転します。
princ
最後の行に、<nil> を表示させません。

(1252.02 998.001 0.0)
4.[ 線分 ] コマンドを選び、コマンドラインに < 線の開始：> のメッセージが出たときに、キーボード から、!p1 と入力すると、先ほどの点から線分が開始されます。

AutoCAD と対話する

AutoCAD と対話する

コマンド : !p1

p1

entsel は、P1-204 を参考

5. システム変数 [Lastpoint] は、最後の入力座標値を取得します。
Point!

(setq last_pt (getvar "lastpoint")) とすると最後の座標値が、変数 <last_pt> にセットされます。
Polar 関数と ROTATE（回転）コマンドの角度について① Polar 関数で使用する角度はラジアンです。(polar p1 ang1 dis1)
ang1 に入る数値はラジアンですから、度数の場合はラジアンに変換します。
( * pi ( / a 180.0 )) または、( / ( * pi a) 180.0 )② ROTATE（回転）コマンドで使用する回転角度は度数です。(ROTATE 基点 回転角度 )回転角度に入る数値は度数ですから、ラジアンの場合は度数に変換します。
( * ( / a pi) 180.0 ) または、 ( / ( * 180.0 a) pi )1-159

ユーザー入力関数

線分コマンドでキーボードから <!last_pt> と入力すると、上記と同じ結果になります。

キーボードから、<@> を入力すると同じ結果になります。
<@> は「最後の入力点から」という意味です。
p1

ユーザー入力関数

1-160

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

Getpoint 関数と Distance 関数で距離を計算

Getdist 関数で距離を計算（キーボード入力）

1 点目と 2 点目を getpoint で指示して、2 点間の距離を求める。

1 点目を getpoint、2 点目の getdist をキーボードから横と縦の長さを入力して 2 点間の距離を求める。

p2

p2

×

×

p1

×

dist_Y

p1(setq p1 (getpoint "¥n1 点目を指示："))→ getpoint で 1 点目の座標を取得(setq p2 (getpoint p1 "¥n2 点目を指示："))→ getpoint で 2 点目の座標を取得(setq dist (distance p1 p2))

→ distance で 2 点間の距離を計算(princ dist)→ コマンドラインに結果を表示

×

dist_X(setq p1 (getpoint "¥n1 点目を指示："))→ getpoint で 1 点目の座標を取得(setq dist_X (getdist "¥n 横の長さ："))→ キーボードから横の距離を入力(setq dist_Y (getdist "¥n 縦の長さ："))→ キーボードから縦の距離を入力

1 (setq p2 (list (+ (car p1) dist_X) (+ (cadr p1) dist_Y)))→ 横と縦の距離から、p2 の座標を計算

2 (setq dist (sqrt (+ (* dist_X dist_X) (* dist_Y dist_Y)))) → 横と縦の距離から、2 点間の距離を計算(princ dist)

Getdist 関数で距離を計算（マウス入力）→ コマンドラインに結果を表示① p2 の X 座標は、p1 の X 座標値に dist_X を加えた数値です。

1 点目を getpoint、2 点目の getdist をマウスで指示して、2 点間の距離を求める。
p2→ p2 の X 座標は、(+ (car p1) dist_X) です。

同様に、p2 の Y 座標は、p1 の Y 座標値に dist_Y を加えた数値です。
p1 の Y 座標を取り出す関数は CADR です。

→ p2 の Y 座標は、(+ (cadr p1) dist_Y) です。

×p2(X+dist_X , Y+dist_Y)

×

p1

×

p1(X,Y)

dist_Y×(setq p1 (getpoint "¥n 一点目を指示："))→ getpoint で 1 点目の座標を取得(setq dist (getdist p1 "¥n 二点目を指示："))→ マウスで 2 点目を指示(princ dist)→ コマンドラインに結果を表示

dist_X2

2

2② p1 と p2 の直線距離 (dist) は、ピタゴラスの定理より、(dist) = (dist_X) + (dist_Y) が成立します。
これを LISP 式で表すと、dist = (sqrt ((* dist_X) (* dist_X) + (* dist_Y) (dist_Y))) となります。
又は dist = (sqrt (+ (expt dist_X 2) (expt dist_Y 2))) です。

getdist の後に P1 をつけると、P1 からラバーバンドが表示されます。

p2

p1

×
1-161

ユーザー入力関数

dist×
dist_Y

dist_X

ユーザー入力関数

1-162

AutoCAD と対話する

AutoCAD と対話する

p1 の X 座標を取り出す関数は CAR です。

第 3 章－ AutoCAD と対話する

Box2.lsp

四角形を作図する

目的：
主要関数：

四角形の横の長さと縦の長さを求めることによって、四角形を作図します。
<getpoint><getdist><list><car><cadr><LINE>

マウスで点 P1(X1,Y1) を指示し、横の長さと縦の長さを入力することによって、他の 3 点(P2,P3,P4) 求めます。
P3(P2x,P4y)

P4(X1,Y1+distY)(defun C:Box2( / p1 p2 p3 p4 distX distY)1(setq p1 (getpoint “¥n 一点目を指示：” )) ; 四角形の左下を指示する

2(setq distX (getdist p1 “¥n 横の長さ：” ));p1 からの横の長さを入力する

3(setq distY (getdist p1 “¥n 縦の長さ：” ));p1 からの縦の長さを入力する;p1 からの横と縦の長さから、p2、p3、p4 の座標を計算する

4(setq p2 (list ( + (car p1) distX) (cadr p1)));p2 の座標を計算する

5(setq p4 (list (car p1) ( + (cadr p1) distY)));p4 の座標を計算する

6(setq p3 (list (car p2) (cadr p4)));p3 の座標を計算する; 線分コマンドで作図する(command “LINE” p1 p2 p3 p4 “C” )7) ;enddistY

P1(X1,Y1)

distX

P2(X1+distX,Y1)

Step1 －最初にマウスで点 P1 を指示します。 1
Step2 －ユーザーに横の長さ (distX) を入力させます。 2

AutoCAD と対話する; 最後の "C" は Close[ 閉じる ] の C

Step3 －同じように、縦の長さ (distY) を入力させます。 3

番号

関数名

①

getpoint②

getdist p1

③
④
⑤
⑥

getdist p1
setq p2
setq p4
setq p3⑦

LINE→ Step1］→ Step2］→ Step3］→ Step4］→ Step5］→ Step6］→ Step7］

説 明
コマンドラインに表示される文字を見て、ユーザーが指示した点の座標を変数 p1 にセットします。
ユーザーがキーボードから距離を入力するか、マウスで 2 点目を指示した点
か ら計算して、その長さを変数 distX にセットします。
変数 distY も同様に取得します。
点 p1 の座標と distX から、点 p2 の座標を作ります。
点 p1 の座標と distY から、点 p4 の座標を作ります。
点 p2 と点 p4 の座標から、点 p3 の座標を作ります。
4 つの点が取得できたので、線分コマンドで四角形を作図します。
最後の "C” は最初の点 (P1) まで結ぶ (Close) する意味です。

Step4 －点 P2 の X 座標は、点 P1 の X 座標に distX を加えたものです。また、Y 座標は、点 P1 のPoint!

Y 座標と同じです。 4

p1 と p3 だけの座標を使って四角形が作図できます。
Step5 －点 P4 の X 座標は、点 P1 の X 座標と同じです。また、Y 座標は、点 P1 の Y 座標に distYを加えたものです。 5

長方形 [RECTANG] を使用します。
p3 は (list (+ (car p1) distX) (+ (cadr p1) distY)) より(command "RECTANG" p1 p3)

Step6 －したがって、点 P3 の座標は、X の座標が (car P2)、Y の座標が (cadr P4) になります。 6P3

つまり、(setq P3 (list (car P2) (cadr P4))) になります。
Step7 －線分コマンドで、p1、p2、p3、p4 と順番に作図します。 7

distY

distX
P1

1-163

ユーザー入力関数

ユーザー入力関数

1-164

AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

3 ユーザー入力関数（キーワード）
InitgetGetkword(Initget 1 "Yes No")get 関数で使用するオプションを指定します。

(if (or (= ans "Y") (= ans "y"))​< ユーザーが <0> 以外の整数を指定するまで、何度でも繰り返します。>(setq int_No (getint "¥n 整数を入力してください："))→ 1 は空打ちを受け付けません。"Y" 、"y"、"N"、"n" を受け付けます。

(setq ans (getkword " よろしいですか？ Yes/No："))get 関数の前の行で指定します。オプションは、ビットコードの合計で指定します。
(Initget (+ 1 2))

Initget 関数で指定したキーワードを受け付けます。

<¥n は改行コード >→ キーボードからの入力が、"Y" か "y" の時。

(command "LINE" pt1 pt2 "")→ T（"Y" か "y"）であれば、線分を作図する。

(command "CIRCLE" pt1 rad1)→ nil（"N" か "n"）であれば、円を作図する。

);if

ユーザーに整数だけを入力するように制限します。
initget 関数のビットコードを組み合わせて使います。(1 + 2 = 3 )<initget 3> でも可。

Getkword は、Initget と組み合わせて使います。Initget 関数で指定した値だけが、

1 → Null の入力 ( 改行のみ ) を受け付けません。

Getkword に入力できます。それ以外の値を入力すると、入力のやり直しを要求されます。

2 → 0( ゼロ ) の入力を受け付けません。
ここで <0> や [Enter< 改行 >] を押すとエラーメッセージが表示されます。

キーワードの引数には、次の規則があります。
①キーワードごとに 1 つ以上のスペースが必要です。

< 整数値を入力してください .>Initget で入力データを制限する②キーワードには、半角英数字とハイフン ( － ) だけが使用できます。

(initget [ ビットコード ] [ 文字列リスト ])③ Getkword と Initget の組み合わせは以下のようになります。

1
2
4
8
16
32
64

ビットコードInitget のビットコードと意味
説 明
Null の入力 ( 改行のみ ) を受け付けません。
0( ゼロ ) の入力を受け付けません。
負の入力を受け付けません。
LIMCHECK が ON であっても図面範囲を無視します。
（現在は使用されていない。）
ラバーバンドまたはボックスを描くときに破線で表示します。
3 次元点の z 座標を無視します。(getdist 関数だけに有効 )(Initget 1 "Yes No")(setq ans (getkword " よろしいですか？ Yes/No："))
次の文字がコマンドラインに表示されます。
よろしいですか？ Yes/No：④このプロンプトには以下の文字だけが入力できます。
"Y" "y" "Yes" "N" "n" "No"
つまり、Initget で指定したキーワード全部か大文字部分の入力だけが許されます。

上記以外では、[128]、[256]、[512]、[1024] があります。

null 入力関数
GetintGetrealGetdistGetangle
Getorient
Getpoint
Getcorner
Getkword
Getstringgetvar

1-165

AutoCAD と対話する

AutoCAD と対話する

例として、("Yes No") や ("Line" "Circle" "Rectang") など。

Get 関数と有効なビットコード
0( ゼロ ) 入力 マイナス入力 図面範囲

キー入力は、大文字でも小文字でも構いません。
破線の使用 2 次元の距離

禁止

禁止

禁止

無制限

（１）
●
●
●
●
●
●
●
●

（２）
●
●
●
●
●

（４）
●
●
●

（８）

（３２）

（６４）

●

●
●

●
●
●
●
●

⑤キーワードの中の大文字は、複数あっても構いませんが連続していなければなりません。
Yes YEs yES YES は OK ですが、yes YeS は受け付けません。
⑥オペレーターに判りやすくするために次のような工夫も良いでしょう。
(initget "Yes No") →(initget "Y= はい(initget "On Off")(initget "On= する→

N= いいえ ")Off= しない ")キーワードは指定できません。
キーワードは指定できません。

ユーザー入力関数

ユーザー入力関数

1-166

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

initget 関数と getkword 関数の使用例

cond 関数の <T> と <exit>

ユーザーに <1> か <2> か <3> の入力を促し、ケースに従って A1 サイズから A3 サイズの四角形を前ページでは、initget を使ってユーザーの入力を制限しましたが、下記のように initget を使わな作図します。

い場合を考えてみましょう。

1 <T> を使用する(defun C:waku_1( / waku)
1(initget 1 "1 2 3")

2(setq waku (getkword "¥n 用紙の大きさを指定 (1=A1 2= A2 3=A3)："))(defun C:waku_2( / waku)(setq waku (getint "¥n 用紙の大きさを指定 (1=A1 2= A2 3=A3)："))

1

(cond

(cond

3

((= waku "1") (command "RECTANG" "0,0" "841,594"))← A1 サイズの枠を作図

2((= waku 1) (command "RECTANG" "0,0" "841,594"))← A1 サイズの枠を作図

4((= waku "2") (command "RECTANG" "0,0" "594,420"))← A2 サイズの枠を作図

3((= waku 2) (command "RECTANG" "0,0" "594,420"))← A2 サイズの枠を作図

5((= waku "3") (command "RECTANG" "0,0" "420,297"))← A3 サイズの枠を作図

4((= waku 3) (command "RECTANG" "0,0" "420,297"))← A3 サイズの枠を作図

5(← 1、2、3 以外の時の処理) ;cond) ;endT(prompt "¥n 終了します。"))) ;cond) ;endキーワード =1

キーワード =2

キーワード =3
このプログラムでは、initget と getkword を使っておりません。

AutoCAD と対話するあります。
この場合、⑤のように <T> の後に処理を記述しておけばエラーにはなりません。
<T> は真に評価されるので、この処理は必ず実行されます。
上記では、<1><2><3> 以外の数値が入力されたときは、コマンドラインに < 終了します。> のメッセージを表示します。

2 <exit> を使用する⑤の行を次のように変更します。
( T(exit))

この場合、AutoCAD は以下のエラーメッセージを表示して、通常のプロンプトに戻ります。

番号
関数名① initget② getkword③ "RECTANG" "0,0" "841,594")④ "RECTANG" "0,0" "594,420")⑤ "RECTANG" "0,0" "420,297")

1-167

説 明
1,2,3 以外の数字は受け付けません。（空打ちは無効）
1,2,3 のいずれかの数字の入力を促します。
A1 サイズ (841,594) の大きさの四角形を作図します。
A2 サイズ (594,420) の大きさの四角形を作図します。
A3 サイズ (420,297) の大きさの四角形を作図します。

ユーザー入力関数

用紙の大きさを指定 (1=A1 2= A2 3=A3：) 5→ ユーザーが <5> と入力; エラー : quit / exit による中止→ プログラムは中止されます。

ユーザー入力関数

1-168

AutoCAD と対話する①で（1 か 2 か 3）の入力を促していますが、それ以外の数値が入力されることも考慮する必要が第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第3節

ジオメトリック ユーティリティ

1 ジオメトリック ユーティリティ関数[ ジオメトリック ユーティリティ ] の 1 つに下図のステータス バーがあります。

OTHOMODE

このステータス バーのアイコンはクリックするごとに、有効 (On) と無効 (Off) が切り替わります。

カーソルの移動を水平方向および垂直方向に制限します。

ORTHOMODE がオンの場合、カーソルは UCS および現在のグリッド回転角度に対して水平または垂直にしか移動できません。

1

2

3

4

5

6

7

8

(OTHOMODE 0 )→ 直交モードをオフにします。

(OTHOMODE 1 )→ 直交モードをオンにします。
ステータス バーにある直交モード① [ グリッド表示 ]・・グリッドの表示 / 非表示を指定します。
0
1

グリッドを非表示にします。
グリッドを表示します。

② [ スナップ モード ]・・スナップ モードのオン / オフを切り替えます。
スナップ モードをオフにします。
現在のビューポートでスナップ モードをオンにします。

③ [ ダイナミック入力 ]・・作図ツールチップの外観をコントロールします。
01（例 1） 斜めの線分に平行な線分を作図します。
(defun C:orth_on ( / en1)

ダイナミック入力をオフにします。
ダイナミック入力をオンにします。

AutoCAD と対話する④ [ 直交モード ]・・カーソルの移動を水平方向および垂直方向に制限します。
0
1

直交モードをオフにします。
直交モードをオンにします。

⑤ [ 極トラッキング ]・・ユーザー指定の極角度で定義した一時的な位置合わせパスを表示します。
01

極トラッキングをオフにします。
極トラッキングをオンにします。

⑥ [ オブジェクト スナップ トラッキング ]・・トラッキング パスの表示をコントロールします。
0
1

オブジェクト スナップ トラッキングをオフにします。
オブジェクト スナップ トラッキングをオンにします。

⑦ [ オブジェクト スナップ ]・・定常オブジェクト スナップの設定をコントロールします。
0
1

定常オブジェクト スナップをオフにします。
定常オブジェクト スナップをオンにします。

(setq en1 (entsel "¥nX 軸にする線分を選択："))→平行にしたい線分を選択します。

(setq en1 (car en1))→（注 1）図形名を選択します。

(command "UCS" "OB" en1)

→ UCS のオプションで <OB> を選びます。

(setvar "ORTHOMODE" 1)→ "ORTHOMODE" を <1> に切り替えます。

(command "LINE" pause pause "")→線分コマンドを使います。

(setvar "ORTHOMODE" 0)→ "ORTHOMODE" を <0> に戻します。

(command "UCS" "w")→ワールド座標系に戻します。

)（注 1）entsel 関数でオブジェクトを選択すると、以下のような情報を取得します。
(< 図形名 : 7ef02968> (56.7275 74.2105 0.0))
これは、図形名と選択した点座標のセットになっています。これから、1 番目のリストを取得する関数 <car> を使って、線分の図形 < 図形名 : 7ef02968> を変数 en1 にセットします。

⑧ [ 線の太さを表示 / 非表示 ]・・現在の図面で線の太さを表示するかどうかをコントロールします。
0
1

線の太さは表示しません。
線の太さを表示します。

使用頻度の高い AutoLISP のユーザー入力関数を、次の表に示します。（順不同）①ジオメトリック ユーティリティ関数
関 数
説 明
OTHOMODE
カーソルの移動を水平方向および垂直方向に制限します。
OSNAP
指定された点に、オブジェクト スナップ モードを適用します。

1-169

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-170

AutoCAD と対話する

01

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する（例 2） 斜めの線分に垂直な線分を作図します。

2 オブジェクト スナップ（文字列で指示）

Step1①選択した線分に水平または垂直の線分を作図します。
対象となる線分を選択します。
(setq en1 (entsel "¥nX 軸にする線分を選択："))② ent1 の情報は、図形名と指示した座標の組み合わせですから、図形名だけを取り出して、変数 en1 にセットします。car 関数で図形名を取得できます。
entsel は、P1-204 を参考

Step2

OSNAP

指定された点に、オブジェクト スナップ モードを適用します。

osnap 関数は、AutoCAD のオブジェクト スナップ モードの 1 つを使用して、点を検出します。
オブジェクト スナップ モードは、文字列引数で指定します。
次の osnap 関数呼び出しは、pt1 の近くのオブジェクトの中点を検出します。
(setq pt2 (osnap pt1 "midp"))
次の呼び出しは、pt1 に最も近いオブジェクトの中点、端点、または中心点を検出します。

③ UCS コマンドのオプション（オブジェクト <OB>）を選び、選択した図形（線分）を指定します。

どちらの例でも、osnap の条件に合うものが見つかった場合、pt2 にそのスナップ点が代入されます。

選択した線分との垂直線を作成するために、カーソルを複数のスナップ点が条件を満たす場合、点はシステム変数 SORTENTS の設定にしたがって選択され直交モードに切り替えます。

ます。条件に合う点が見つからなかった場合、pt2 は nil に設定されます。

オブジェクト スナップを使用する場合、システム変数 APERTURE によって、

AutoCAD と対話する

AutoCAD と対話する④ (setvar "ORTHOMODE" 1)(setq pt2 (osnap pt1 "midp,endp,center"))

指定した点からオブジェクトまでの許容可能な近接範囲が決まります。

Step3⑤ (command "LINE" pause pause "")線分コマンドを使い、垂直線を作図します。pause はユーザーがマウスで指示するのを待ちます。
線分コマンドは、1 点目と 2 点目を指示しますから、
pause を 2 回使います。

Step4⑥ (setvar "ORTHOMODE" 0)"ORTHOMODE" を元の <0> に戻します。
⑦ (command "UCS" "w")
ユーザー座標系も、元のワールド座標系に戻します。
文字列で指示した場合：(setq pt2 (osnap pt1 "midp"))→ 一時的なので、解除する必要はありません。

1-171

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-172

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

3 オブジェクト スナップ（システム変数で設定）
AutoCAD のオブジェクト スナップ モードをシステム変数 [OSMODE] で指定できます。
OSMODE で指定するには、システム変数に代入する関数 [setvar] を使います。
(setvar "osmode" 1))→ <1> は端点をスナップします。

AutoLISP のプログラムでは、最初に現在のスナップ モードを取得しておいて、最後に戻す処理をすることが重要です。
① (setq old_osnap (getvar "osmode"))・→ 現在のスナップ モードを変数 <old_osnap>に格納します。

② (setvar "osmode" 3)→ スナップ モードを新規に設定します。

・

オブジェクト スナップを複数指定する場合は、これらの値の和を入力します。たとえば、20 と入力
すると、[ 中心 ]( ビットコード 4) と [ 四半円点 ]( ビットコード 16) のオブジェクト スナップを指定したことになります。また、<15359> と入力すると、すべてのオブジェクト スナップを指定したことになります。
複数のオブジェクト スナップを使う時の組み合わせ例
ビット コードモード
3(1+2)
端点 + 中点
5(1+4)
端点 + 中心7(1+2+4)
端点 + 中点＋中心
9(1+8)
端点 + 点10(2+8)
中点 + 点(setvar "osmode" 3) にセットすると、(setvar "osmode" 0) にセットすると、[ 作図補助設定 ] ダイアログの < 端点 >[ 作図補助設定 ] ダイアログの < 端点 > とと < 中点 > がチェックされています。

< 中点 > のチェックが解除されています。

・③ (setvar "osmode" old_osnap)→ プログラムの終了前に、スナップ モードを

0
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384

ビットコードosmode にセットする数値コード
モード
解除 [NON]（モード設定なし）
端点 [END]
中点 [MID]
中心 [CEN]
点 [NOD]
四半円点 [QUA]
交点 [INT]
挿入基点 [INS]
垂線 [PER]
接線 [TAN]
近接点 [NEA]
図心 [GCE]仮想交点 [APP]
延長 [EXT]
平行 [PAR]
現在の定常オブジェクト スナップを無効

Point!

AutoCAD と対話する

AutoCAD と対話する

元に戻します。

数値で指示した場合：(setvar "osmode" 3)
この後、O スナップモードを解除またはクリアするには、
解除→ (setvar "osmode" 0)

クリア→ (setvar "osmode" 1024)

O スナップを設定（端点や交点）している場合でも、

osmode のビットコード <0> は [ 解除 ]、<16384> は [ 無効 ] ですが、

ステータス バーの [ オブジェクト スナップ ] の右ボタン

両方とも同じ結果になります。

から設定を表示して、[ オン ] のチェックを解除すると、
O スナップは無効になります。

1-173

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-174

総合プログラムⅠ

第 3 章－ AutoCAD と対話する

手順図 1・2

4 総合プログラムⅠ
off_3 .lsp
目的：
主要関数：

第 3 章－ AutoCAD と対話する①オフセットしたい線分を選択します。

平行線の長さをマウスで指定する
オフセットする線分を選択し、オフセット距離を入力します。
そのあと、マウスで長さを指定します。
<entsel><getpoint><getdist><car><entget><assoc><trans><angle><polar><inters><LINE><UCS>②オフセットの方向をマウスで指示します。

①

×③キーボードからオフセット間隔を入力します。

③（例）100

手順 1 －下図の①の水平線を上側へ 1290 ミリ平行複写し、その長さを A-B にします。

手順図 3（左）A④④平行線の始点の位置を指示します。

B

②

×（始点）

1

手順 2 －（左）オフセットする側は上側を指示し②、( 右）オフセット間隔を <1290> と入力します。

AutoCAD と対話する⑤平行線の終点の位置を指示します。

×（始点）

⑤

1

×（終点）

手順 3 －（左）平行線の始点の位置③を指示します。（右）平行線の終点の位置④を指示します。

3

4
手順 4
⑥最初に指示した距離 (100) のところに、マウスで×指示した長さだけの平行線が作図されます。
100
手順 4 －選択した線分①から <1290> の位置に、指定した長さ ( ③ - ④ ) だけの線分が作図されます。
3

4

⑥
×

AutoCAD のオフセットコマンドは選択した線分と同じ長さの線分が作成されます。
このコマンドは、マウスで線分の長さを指定することができます。

1

1-175

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-176

AutoCAD と対話する

手順図 3（右）2

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

Step1 －オフセットする基準線を選択し、そのオブジェクトを変数 <ent> にセットします。 1 2

Step5 － pt_sui から pt の角度 (ang1) を求めます。 12

pt_en

この ent は図形名と座標値の組み合わせです。Step3 で始点と終点の座標を取得します。

Step2 －① “オフセットする側を指示：” のメッセージ

pt_sui×pt_enを出して、オフセットの方向をマウスで指

ang1

×
pt

ang

示し、その座標値を変数 <pt> にセットしま

①

す。 3

pt

② “オフセット間隔：” のメッセージを出して、オフセット間隔を変数 <dist> にセットしま②

す。dist 関数はキーボードからでも、マウス

distで画面を指示しても入力できます。 4

pt_st
pt_en

Step6 －①選択したオブジェクトの始点 (pt_st) から角度×

pt_en1

ang1、距離 dist の位置に仮想線分の始点 (pt_st1) の点を求めます。 13

pt_st②同様に、選択したオブジェクトの終点 (pt_en)から角度 ang1、距離 dist の位置に仮想線分の
dist
pt_st

たり編集するときは座標系をワールド座標系からユーザー座標系に変更しておきます。

AutoCAD と対話する

Step7 －① " 始点を指示：" のメッセージを出して、② ang

5 6 7 8pt_en

pt_st1

pt_en1
new_en×

新しいオフセットの始点を指示します。

②ユーザー座標系での始点と終点の角度 (ang)(new_st) 15を取得します。 9② " 終点を指示：" のメッセージを出して、① pt_st新しいオフセットの終点を指示します。

この場合は、必ずしも tarns 関数は必要有りませんが×
new_st(new_en) 16

既存の図形を利用して作図する場合は、trans 関数で座標変換しておく方が安全です。

pt_st
Step4 －①選択したオブジェクトに直角方向の点 (1.0 はpt_en

仮の点）を決めます。 10

Step8 －①新しいオフセットの始点 (new_st) から、ぶ線との交点 (pt_sui) を求めます。 11

pt_en1

ang1 の方向に短い線分 (1 ミリ ) の位置を②選択したオブジェクトと点 pt と点 pt_1 を結

①

②

pt_1

×

pt_suiang1
××
new_en1
new_ennew_st1 とします。 17

×pt

pt_st1②同様に新しいオフセットの終点 (new_en) から、ang1 の方向に短い線分 (1 ミリ ) の位置

ang1
×
×
new_st1
new_stを new_en1 とします。 18
dist
pt_st

1-177

ジオメトリック ユーティリティ

pt_st1

ジオメトリック ユーティリティ

1-178

AutoCAD と対話する

ユーザー座標系に変更します。図形を作成し

ang1

終点 (pt_en1) の点を求めます。 14① pt_enStep3 －①始点 (pt_st) と終点 (pt_en) の座標を求めます。

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

Step9 －①選択した線分から dist の距離にある仮想線
分 (pt_st1 ー pt_en1) と (new_st ー new_st1)の交点を new_st2 とします。 19

pt_en1①
new_en2×
new_en②同様に仮想線分 (pt_st1 ー pt_en1) と (new_en ー new_en1) の交点を new_en2 とします。
20②
new_st2

13(setq pt_st1 (polar pt_st ang1 dist))14(setq pt_en1 (polar pt_en ang1 dist))×
new_en1pt_st1

Step10 －① new_st2 と new_en2 を始点、終点として

15(setq new_st (getpoint "¥n 始点を指示："))16(setq new_en (getpoint new_st "¥n 終点を指示：")) マウスで終点を指定② UCS をユーザー座標系からワールド座標系に(setq new_st1(polar new_st ang1 1.0))

18(setq new_en1(polar new_en ang1 1.0)) ;new_en から 1 ミリの位置が new_en1

19(setq new_st2(inters pt_st1 pt_en1 new_st new_st1 nil))20(setq new_en2(inters pt_st1 pt_en1 new_en new_en1 nil)) ; 交点を求める→ Step7;new_st から 1 ミリの位置が new_st1; 交点を求める→ Step8→ Step9; 線分を作成します。

22

× new_st2

戻します。 22

; マウスで始点を指定

17(command "LINE" new_st2 new_en2 "") ; 指示した長さの線分を作図する

21

dist

→ Step6; 新しい始点と終点の座標を計算します。

× new_en2

線分を作成します。 21;pt_en を基点に pt_en1 の座標を計算; マウスで長さを指定します。

×
new_st1×
new_st;pt_st を基点に pt_st1 の座標を計算(command "UCS" "W") ; ワールド座標系に戻す→ Step10(princ));end

AutoCAD と対話する(defun C:off_3 ( / ent pt dist pt_st pt_en ang pt_1 pt_sui ang1
pt_2 pt_3 new_st new_en new_st1 new_en1
new_st2 new_en2); 基準線を選択し、オフセットする側と間隔を入力します。

1(prompt "¥n 基準線を指示してください。")

2(setq ent (entsel))3(setq pt (getpoint "¥n オフセットする側を指示："))4(setq dist (getdist "¥n オフセット間隔：")); メッセージを表示する; オフセットする線分を選択する→ Step1; オフセット側を指示; オフセット間隔を指定する→ Step2; 基準線の角度と pt への角度を計算します。

5(setq pt_st (cdr (assoc 10 (entget (car ent)))))

6(setq pt_en (cdr (assoc 11 (entget (car ent))))) ; 終点の座標を取得する

7(setq pt_st (trans pt_st 0 1)) ; 始点の座標を UCS 変換する

8

(setq pt_en (trans pt_en 0 1)) ; 終点の座標を UCS 変換する

9(setq ang (angle pt_st pt_en)) ; 始点から終点への角度を求める

10(setq pt_1(polar pt (+ ang (* 0.5 pi)) 1.0)) ; 角度が直角で、1 ミリの位置を計算

11(setq pt_sui (inters pt_st pt_en pt pt_1 nil))12(setq ang1 (angle pt_sui pt))

1-179

; 始点の座標を取得する; 基準線との交点を求める; 交点からの角度を計算する

ジオメトリック ユーティリティ→ Step3→ Step4→ Step5］

番号 関数名説 明① prompt “ から “の文字をコマンドラインに表示します。
② entsel
ユーザーに図形を選択させます。その図形を変数 ent にセットします。
③ getpoint オフセットする側の点を指定させます。その座標を変数 pt にセットします。
④ getdist オフセット間隔を入力させます。
（キーボード又は図面上からでも構いません。
）⑤ assoc 10 選択した線分の始点の座標を取得し、変数 pt_st にセットします。
⑥ assoc 11 選択した線分の終点の座標を取得し、変数 pt_en にセットします。
trans 関数は座標変換の関数です。 <trans 0 1> はユーザー座標系に変換します。
⑦ trans
この後の座標計算はユーザー座標系で行います。
trans 関数は座標変換の関数です。 <trans 0 1> はユーザー座標系に変換します。
⑧ trans
この後の座標計算はユーザー座標系で行います。
⑨ angle選択した線分の角度を求めます。
（始点→終点の角度）
基点 (pt) から角度と長さで、新しい座標を計算します。
⑩ polar
オフセットは選択した線分の直角方向にありますから、角度は線分の角度に 90
度 (0.5 pi) を加えたものになります。
2 本の線分の交点座標を求めます。最後に nil を付けると、線分が交わっていなく⑪ intersても仮想の交点座標が求まります。
⑫ angle選択した線分の直角の角度を計算します。
⑬ polar
pt_st から、角度 ang1、距離 dist の距離の位置を計算します。
⑭ polar
pt_en から、角度 ang1、距離 dist の距離の位置を計算します。
⑮ getpoint ユーザーに平行線の始点の位置を指示させます。
⑯ getpoint ユーザーに平行線の終点の位置を指示させます。
⑰ polar
線分 pt_st1,pt_en1 との交点を求めるために、new_st から直角の位置を求めます。
⑱ polar
線分 pt_st1,pt_en1 の交点を求めるために、new_en から直角の位置を求めます。
⑲ inters
新しい始点 (new_st2) の座標を計算します。
⑳ inters
新しい終点 (new_en2) の座標を計算します。
㉑ LINE
新しい始点 (new_st2) と終点 (new_en2) を線分で結びます。
㉒ UCS "W" 最後は元のワールド座標系に戻します。

ジオメトリック ユーティリティ

1-180

AutoCAD と対話する

UCS は元の座標系に戻しておきます。

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する
Step3 － 線分の始点の座標を取得し、ユーザー座標系に変更します。 4 5

4 総合プログラムⅡ(entget (car obj_0) により、線分のドットペアの組み合わせが表示されます。
((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A2") (100 .

en_hasi.lsp
目的：
主要関数：

線分の端点に接する円を作図する
選択した線分の端に 2 つの接する円を作図し、選択した円を残します。
<entsel><getreal><cadr><car><entget><assoc><trans><distance><angle><polar><entlast><equal><redraw><CIRCLE><UCS>

手順 1

手順 2

接円を作図する線分を選択します。

円の半径を入力します。

"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 971.851 1667.17 0.0)
(11 1600.03 1919.45 0.0) (210 0.0 0.0 1.0))
線分の始点の座標は、assoc 関数で (10 971.851 1667.17 0.0) を取り出し、cdr 関数で 2 番目の座標を取り出します。(pt_st に代入します。
）
次に trans 関数でユーザー座標系に変更します。
この場合は、必ずしも trans 関数は必要有りませんが既存の図形を利用して作図する場合は、trans 関数で座標変換しておく方が安全です。

Step4 － 始点と同様に終点の座標を取得し、ユーザー座標系に変更します。 6 7
Step5 － 図形を選択した座標値が、この線分の始点座標と終点座標のどちらに近いかを判断します。
近い方を始点に変更します。
（始点に近い方に円を作図するため）線分を指示した点に近い端点に 2 つの接円が< 残す円を指示 > のメッセージが出ます。

もし、（指示した点 <obj_pt> と始点 <pt_st> との距離）が（指示した点と終点 <pt_en> と作成され、ハイライト表示されます。

選択した円が残り、他の円は削除されます。

の距離）より大きければ、始点 <pt_st> と終点 <pt_en> を入れ替えます。 8

AutoCAD と対話する

手順 4

AutoCAD と対話する

手順 3

Step6 － 改めて、始点から終点への角度を計算し、変数 <ang0> に代入します。 9
Step7 － 始点の直角方向に円の中心がありますから、その角度をラジアンで求めます。 10 11
ang0 に 90°加算した角度を amg_L、90°減算した角度を ang_R とします。

Step8 － その方向に向かって円の半径の距離が作図する中心になります。 12 13

cen_2

Step1 －接円を作図する線分を選択し、線分を指示した座標値を取得します。 1 2g_an① (entsel " 線を指示：") のメッセージを表示して線分を選択し、変数 <obj_0> に代入します。

R②選択したオブジェクトは図形名と座標値のドットペアです。その後半の座標値を変数

pt_st<obj_pt> にセットします。Step5 で obj_pt の座標が線分のどちらの端点に近いかを比べ代入します。 3

L
g_

g0

an

Step2 － (getreal " 円の半径は？ ") のメッセージを表示して半径の数値を入力し、変数 <hankei> にanるためです。
（obj_pt に近い方の端に接円を作図するため）

cen_1
pt_en

1-181

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-182

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

Step9 － 中心 <cen_1> で円を作図して、変数 <obj_1> にセットします。 14 15

Step16 －選択した円の中心座標が第１の円の中心座標と同じであれば、第１の円のハイライト

entlast 関数は、最後に作図したオブジェクトを取得します。

表示を解除し、第２の円を削除します。 24 25

Step10 －中心 <cen_2> で円を作図して、変数 <obj_2> にセットします。 16 17

obj_1

entlast 関数は、最後に作図したオブジェクトを取得します。

Step11 － 2 つの円をハイライト表示させます。 18 19

マウスでこの円を×(redraw オブジェクト 3) はオブジェクトをハイライト表示させます。

指示

cen_1 = cen_3

Step17 －選択した円の中心座標が第１の円の中心座標と違っていれば、第１の円を削除し、

cen_2

第２の円のハイライト表示を解除します。 26 27

obj_2

マウスでこの円を×
cen_2 = cen_3

cen_1

AutoCAD と対話する

AutoCAD と対話する

指示

obj_2

obj_1

Step12 －残す円を選択し、変数 <obj_3> に代入します。 20(entsel " 残す円を指示：")Step13 － 選択した円の中心座標を取得し、変数 <cen_3> にセットします。 21(cdr (assoc 10 (entget (car obj_3))))

Step14 －円の中心座標をユーザー座標系に変更します。 22(trans cen_3 0 1)

Point!
このプログラムでは UCS を変更していないので、
trans 関数を使う必要はありませんが、既存の図形を使って作図をしますので、念のために UCS 座標系に変換して作図を行っ

Step15 －選択した円の中心座標が、ハイライトされている円の中心座標と同じかどうかを比較します。 23

1-183

Step18 －ユーザー座標系を初期値のワールド座標系に戻します。 28ています。
Step18 では、ワールド座標系に戻しましたが、直前の座標系に戻す方法もあります。
→ (command "UCS" "P")

ジオメトリック ユーティリティ

ジオメトリック ユーティリティ

1-184

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する
20;; 度 ---> ラジアン（Step7 で dtr 関数を使います。）(defun dtr (a)(* pi (/ a 180.0)))

21
22;; ラジアン ---> 度(defun RTD(a)(* 180.0(/ a PI)))

23→ Step12］→ Step13(setq cen_3 (cdr (assoc 10 (entget (car obj_3))))) ; 選択した円の中心 ］→ Step14(setq cen_3 (trans cen_3 0 1)) ; 他の円と同様に UCS を変更］(if (equal cen_1 cen_3) ; 選択した円の中心が、どちらの円であるかを比較 ］→ Step15(setq obj_3 (entsel "¥n 残す円を指示：")) ; 残す円を選択(progn ;1 番目の円と等しければ、以下の処理(defun C:en_hasi( / obj_0 hankei obj_pt pt_st pt_en s ang0
ang_l ang_r cen_1 cen_2 obj_1 obj_2 obj_3 cen_3)

24(redraw obj_1 4) ;1 番目の円のハイライトを解除（円を残す）

25(redraw obj_2 2) ;2 番目の円を削除) ;progn; 接円を作図する条件を取得する(setq obj_0 (entsel "¥n 線を指示："))2(setq obj_pt (cadr obj_0))

3(setq hankei (getreal "¥n 円の半径は？ ")); 接円を作図する線分を選択; 選択した座標を取得（近い方に円を作図するため）; 円の半径を入力→ Step1→ Step2］(progn ;2 番目の円と等しければ、以下の処理
26(redraw obj_1 2);2 番目の円のハイライトを解除（円を残す）

27(redraw obj_2 4);1 番目の円を削除);progn; 選択した線分の 2 つの端点の座標を取得し、obj_pt に近い方を始点にセット

4(setq pt_st (cdr (assoc 10 (entget (car obj_0))))) ;1 つの端点を取得

5(setq pt_st (trans pt_st 0 1)) ; 念のために、UCS を変換

6(setq pt_en (cdr (assoc 11 (entget (car obj_0))))) ; 残りの端点を取得

7(setq pt_en (trans pt_en 0 1)) ; 念のために、UCS を変換) ;if

AutoCAD と対話する→ Step3→ Step4(if (> (distance pt_st obj_pt) (distance pt_en obj_pt))(setq s pt_st pt_st pt_en pt_en s) ;obj_pt に近い方を→ Step5; 始点 (pt_st) にする; 線分に直角方向の座標を計算する

9(setq ang0 (angle pt_st pt_en))10(setq ang_L (+ ang0 (dtr 90))) ;ang0 から <90° > の角度を計算

11(setq ang_R ( - ang0 (dtr 90))) ;ang0 から <-90° > の角度を計算

12(setq cen_1(polar pt_st ang_L hankei));1 つ目の円の中心を計算

13(setq cen_2(polar pt_st ang_R hankei));2 つ目の円の中心を計算; 始点から終点への角度を取得→ Step6］→ Step7→ Step8; 円を 2 つ作図し、ユーザーが選択した円を残す

1-185

14

(command "CIRCLE" cen_1 hankei) ;1 つ目の円を作図

15(setq obj_1 (entlast)) ; 作図した円を取得

16(command "CIRCLE" cen_2 hankei) ;2 つ目の円を作図

17(setq obj_2 (entlast)) ; 作図した円を取得

18(redraw obj_1 3);1 つ目の円をハイライト表示

19(redraw obj_2 3);2 つ目の円をハイライト表示

ジオメトリック ユーティリティ→ Step17→ Step9→ Step10→ Step11);if
28("UCS" "W") ; ユーザー座標系を初期値のワールド座標系に戻す→ Step18
］

):end
番号
関数名
説 明
① entsel
接円を作図する線分を選択し、変数 [obj_0] にセットします。
② cadr
線分を選択した座標を変数 [obj_pt] にセットします。
③ getreal
接円の半径を取得します。
④ cdr (assoc 10 選択した線分の端点の座標を取得します。
⑤ trans
UCS でワールド座標系からユーザー座標系に変換します。
⑥ cdr (assoc 11 選択した線分の他方の端点の座標を取得します。
⑦ trans
UCS でワールド座標系からユーザー座標系に変換します。
(if (>(distance 円を線分の始点から作図するために、近い方を始点座標に切り替えます。
⑧
setq s pt_st 仮の変数 [s] を用意して、始点座標と終点座標の入れ替えを行います。
⑨ angle始点から終点への角度を計算します。
⑩ (dtr 90)
1 つ目の円の中心座標への角度を計算します。
⑪ (dtr 90)
2 つ目の円の中心座標への角度を計算します。
⑫ polar
1 つ目の円の中心座標を計算します。
⑬ polar
2 つ目の円の中心座標を計算します。
⑭ "CIRCLE"
1 つ目の円を作図します。
⑮ (entlast)
作図した円を取得します。
（後でハイライト表示します。
）⑯ "CIRCLE"
2 つ目の円を作図します。
⑰ (entlast)
作図した円を取得します。
（後でハイライト表示します。
）⑱ redraw
1 つ目の円をハイライト表示します。
⑲ redraw
2 つ目の円をハイライト表示します。
⑳ entsel
残す円を選択します。
㉑ cdr (assoc 10 選択した円の中心座標を取得します。
㉒ trans
この座標もユーザー座標系に変換し、座標系を揃えます。
㉓ (if (equal
選択した円の中心座標がどちらの円の中心座標と等しいかを比較べます。
㉔ redraw
もし、1 番目の円の中心座標と等しければ、1 番目の円のハイライトを解除。
㉕ redraw
2 番目の円を削除します。
㉖ redraw
もし、2 番目の円の中心座標と等しければ、2 番目の円のハイライトを解除。
㉗ redraw
1 番目の円を削除します。
㉘ "UCS" "W"
ユーザー座標系を初期値のワールド座標系に戻します。

ジオメトリック ユーティリティ

1-186

AutoCAD と対話する

1

8→ Step16

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第4節

テキスト ファイルの入出力

テキスト ファイルを入出力する関数を使うと、図面にある情報をテキスト ファイルにして外部に保存したり、外部のテキスト ファイルの情報を現在の図面に読み込むことができます。

1 主なファイル処理関数
CLOSE

ファイルを閉じて nil を返します(setq file1 (open "c:¥¥MyLISP.txt" "r") → 開いたファイル (MyLISP.txt) を変数 <file1> にセット。
下図は外部の画層ファイルから画層一覧を読み込み、必要な画層名だけを現在開いている図面の画層に追加するものです。

(close file1)→ 開いたファイルを閉じる。

第 2 部 3 章 14 節を参考
Step2 －外部のテキストファイルから

Step1 －現在の画層は <0> だけです。

FINDFILE

指定したファイル名を検索します

画層名の一覧を読み込みます。

(findfile "acad.lsp")（ある場合）→ "C:¥Program Files¥Autodesk¥AutoCAD 2013¥support¥acad.lsp"（無い場合）→ nil

Step4 －選択した画層名が取り込まれました。

I/O 関数がアクセスできるようにファイルを開きます(open "FileName" "r")→ ファイルの読み込み(open "FileName" "w")

→ ファイルの書き込み(open "FileName" "a")→ ファイルへ付加（<a> は小文字）

AutoCAD と対話する

READ-CHAR

この節では、このように画層一覧やシステム変数一覧を外部にテキストファイルとして保存したり、指定したファイルから、1 文字を読み込みます(read-char file1)→ 開いたファイルから 1 文字を読み込む。

(read-char)→キーボードから入力された最初の文字の ASCII 文字を返す。

READ-LINE

指定したファイルから、文字列を読み込みます

呼び出して利用する関数を学びます。

(setq file1 (open "c:¥¥MyLISP.txt" "r") → 開いたファイル (MyLISP.txt) を変数 <file1> にセット。

使用頻度の高い AutoLISP のファイル処理関数を、次の表に示します。（順不同）(read-line file1)①ファイル処理関数
関 数(close file-desc)(findfile filename)(open filename mode)(read-char [file-desc])(read-line [file-desc])(write-char num [file-desc])(write-line string [file-desc])

1-187

説 明
開いているファイルを閉じます。
指定されたファイルを AutoCAD のライブラリ パスで検索します。
AutoLISP の入出力関数がアクセスできるようにファイルを開きます。
キーボードから１文字を読み込みます。ファイル記述子があれば、開いているファイルから１文字を読み込みます。
キーボードまたは開いているファイルから文字列を 1 行読み込みます。
コマンドラインへ文字コード（整数）で指定する１文字を書き出します。ファイル記述子があれば、開いているファイルに書き出します。
コマンドラインに文字列を書き出します。ファイル記述子があれ
ば、開いているファイルに書き出します。

テキスト ファイルの入出力

WRITE-CHAR→ 開いたファイルから文字列を読み込む。
指定したファイルに、1 文字を書き込みます(write-char ASCII コード file1)→ 開いたファイルに 1 文字を書き込む。

(write-char 67)→ <C67> がコマンド ウインドウに表示される。

WRITE-LINE

指定したファイルに、文字列を書き込みます(setq file1 (open "c:¥¥MyLISP.txt" "w") → 開いたファイル (MyLISP.txt) を変数 <file1> にセット。
(write-line " 文字列 " file1)→ 開いたファイルに文字列を書き込む。

<¥> 記号はエスケープ文字として使用されるので、文字列内で <¥> 記号を作成するには、
2 つの円記号 <¥¥> が必要です。

テキスト ファイルの入出力

1-188

AutoCAD と対話する

Step3 －必要な画層名を選択します。

OPEN

第 3 章－ AutoCAD と対話する
out_var.lsp
目的：
主要関数：

第 3 章－ AutoCAD と対話する
複数のシステム変数の数値を外部ファイルに書き出す

システム変数を外部ファイル（テキスト ファイル）に書き出します。
<getvar><itoa><strcat><open><write_line><close>

Step1 ー getvar 関数でシステム変数を取得し、変数 <var_osmode> に保存します。 1(setq var_osmode (getvar "osmode"))変数 <var_osmode> は数値情報ですが、外部に書き出すには文字列ですので、この数値を文字列に変換します。

(defun C:out_var ( / var_osmode ren_osmode var_LUPREC ren_LUPREC f_var)
1(setq var_osmode (itoa (getvar "osmode")))2(setq ren_osmode (strcat "osmode" var_osmode))3(setq var_LUPREC (itoa (getvar "LUPREC")))4(setq ren_LUPREC (strcat "LUPREC" var_LUPREC))

Point!

; 整数を文字に変換する;2 つの文字を連結する; 整数を文字に変換; 文字を連結→ Step3; ファイルを書き込みモードで開く(setq f_var (open "out_sys.txt" "w")) ; 書き込みモードでテキスト ファイルを開く

5→ Step1］→ Step2］→ Step4］;1 行ずつ書き込む(setq var_osmode (itoa var_osmode))
Step2 －次にシステム変数名と文字列を連結します。文字列を連結する関数は、strcat です。 2
連結した文字列を保存する変数を <ren_osmode> とします。

6(write-line ren_osmode f_var) ;[ren_osmode] の値を書き込む

7(write-line ren_LUPREC f_var)→ Step5; ファイルを閉じる（必須）(close f_var)

8(setq ren_osmode (strcat "osmode" var_osmode));[ren_luprec] の値を書き込む; テキスト ファイルを閉じる) ;end→ Step6］

外部ファイルには、例として <osmode3> のように連結されて保存されます。
Step3 －システム変数 <LUPREC> も同様に処理します。 3 4①②

AutoCAD と対話する

Step4 ーこれらの文字列を順番に外部のテキスト ファイルに書き出します。 5③

ファイル名を <out_sys.txt> とします。
(setq f_var (open "out_sys.txt" "w"))→ ドライブ名を指定しないときは、AutoCAD
既定の図面フォルダに保存されます。

Step5 ー 外部ファイル < out_sys.txt> に、1 行ずつ順番に書き込みます。 6 7(write-line ren_osmode f_var)→ (write-line 書き込む文字列

④
⑤
⑥
⑦
⑧

説 明
文字列として外部のファイルに書き出すため、システム変数 "osmode" の数値
itoaを文字列に変換します。
strcat"osmode" の文字と文字化された数値を連結します。
文字列として外部のファイルに書き出すため、システム変数 "luprec" の数値をitoa
文字列に変換します。
strcat"luprec" の文字と文字化された数値を連結します。
open "w" ファイル変数 <f_var> を書き込みモードでオープンします。
write-line [ren_osmode] の値を書き込みます。
write-line [ren_luprec] の値を書き込みます。
close
テキスト ファイルを閉じます。これを記述しなければ、書き込みされません。

ファイル )
Point!

元のテキストファイル

関数名変更されたテキストファイル5

読み込む（書き込む）ファイルをドライブ指定する場合
ファイルの絶対パスを指定しない場合は、AutoCAD の既定の図面フォルダを指定したことになります。
（初期値は、ドキュメント）パスを指定するには、以下のように <¥> を 2 つ続けるか <¥¥>、</> 記号を使います。
例 1：(setq in_layer (open "C:¥¥autolisp¥¥out_layer.txt" "r"))例 2：(setq in_layer (open "C:/autolisp/out_layer.txt" "r"))Step6 ーファイルを閉じます。
（必須です） 8(close f_var)

1-189

ファイルのディレクトリのパス指定では、スラッシュ記号（/）と円記号（¥）がありますが、¥ を使うときは <C:¥¥myLisp¥¥myText.txt> のように ¥ を２つ並べて記述します。

テキスト ファイルの入出力

テキスト ファイルの入出力

1-190

AutoCAD と対話する

番号

第 3 章－ AutoCAD と対話する
out_layer.lsp
目的：
主要関数：

第 3 章－ AutoCAD と対話する
画層名一覧を外部ファイルに書き出す

システム変数を外部ファイル（テキスト ファイル）に書き出します。
<tblnext><while><assoc><cdr><list><append><nth><open><write_line><1+><close>

Step1 ー画層名の一覧を書き出したい図面を開きます。

(defun C:out_layer( / layname laydata lst new_layer f_layer i); 図面にある全画層名を取得する

1(setq layname (tblnext "LAYER" T)) ; 最初の画層を取得する

2(while layname ; layname が nil を返すまで繰り返す

3(setq laydata (cdr (assoc 2 layname))) ; layname の画層名を取り出す

4(setq lst (append lst (list laydata))) ; 取得した画層名をリストにする5(setq layname (tblnext "LAYER")) ; 次の画層を取得する ( 無ければ nil を返す )); リストにした画層名を順番に外部に書き出す

Step2 ー [ 画層プロパティ管理 ] で存在する画層を確認します。

6(setq new_layer (nth 0 lst)) ; リストの 1 番目を取り出す

7(setq f_layer (open "out_layer.txt" "w")) ; 書き込み用のテキスト ファイルを開く

8(setq i 1) ; 書き出した画層数をコマンドラインに表示するためのカウントをセット

9(while (/= new_layer nil) ; 画層名が無くなるまで書き出しを続ける

10(write-line new_layer f_layer) ; 取り出した画層名をテキスト ファイルに書き出す

11(setq new_layer (nth i lst)) ; 次の行の画層名をセットする

12(setq i (1+ i)) ; 書き出した画層の数を <1> 増やして⑨から繰り返す);whileAutoCAD と対話する

14(close f_layer) ; ファイルを閉じる（必須）(prompt "¥n 書き出した画層の数は：") ; コマンドラインにメッセージを表示する(princ ( - i 1))(princ); 画層の数を表示する);end

Step3 ー（左図）out_layer.lsp を実行すると、画層名の一覧が out_layer.txt の名で書き出されます。
（右図）コマンドラインに書き出した画層の数を表示します。

1-191

テキスト ファイルの入出力

番号
関数名
説 明
① tblnext "LAYER" T 画層テーブルにある最初の画層を取得します。
（最初の画層名は <0>）
② while layname
2 番目以降の画層名がある限り、以下のコードを繰り返します。
cdr (assoc 2
画層のドット・ペア <2> から後半部分 < 画層名 > を取り出して変数③
layname)edata にセットします。
append lst (list
取り出した画層名を順番にリストにしていきます。
④
laydata)append は追加する関数です。
⑤ tblnext "LAYER" 次の画層名を取得します。
（nil の場合は終了）⑥ nth 0 lst
画層名リストの 1 番目を取り出します。nth 関数は <0> から始まります。
open "out_layer.
⑦
ファイル変数 <out_layer.txt> を書き込みモードでオープンします。
txt" "w"⑧ setq i 1
書き出した画層数を カウントするために、初期値の <1> をセットします。
⑨ /= new_layer nil リストに画層名がある限り、書き込みの処理を繰り返します。
⑩ write-line
1 行づつ順番に書き込みます。
⑪ nth i lst
リスト内の次の画層名を取得します。
⑫ setq i (1+ i)
ループ カウンタを <1> つ増やして、最初に戻ります。
⑬ close
最後は、必ずファイルを閉じます。
prompt
書き出した画層の数をコマンドラインに表示します。
new_layer が <nil> となった時点で、<i> は 1 つ多くカウントされて⑭
princ(- i 1)
いるから、書き出した画層の数は <i> の数値から 1 つ少なくする。

テキスト ファイルの入出力

1-192

AutoCAD と対話する

13

第 3 章－ AutoCAD と対話する
in_var.lsp
目的：
主要関数：

第 3 章－ AutoCAD と対話する
外部ファイルからシステム変数を読み込む

外部ファイル < テキスト ファイル > から、システム変数を読み込み、現在の図面のシステム変数を変更します。
<open><read_line><substr><atoi><osmode><close>

Point!
1

2(setq in_var (open "out_sys.txt" "r"))Step2 ーテキスト ファイルから、1 行づつ読み込み、システム変数名と数値に分離します。

(setq *osmode_val (atoi *osmode_val))→ 文字列から数値に変更します。 5→ Step1］;1 行ずつ読み込む(setq *osmode_txt (substr ren_osmode 1 6)); システム変数名を取得

4(setq *osmode_val (substr ren_osmode 7)); システム変数の値を取得

5(setq *osmode_val (atoi *osmode_val))

8(setq ren_LUPREC (read-line in_var)); 文字列を数値に変換;1 行ずつ読み込む(setq *LUPREC_txt (substr ren_LUPREC 1 6))(setq *LUPREC_val (substr ren_LUPREC 7))

9→ Step2; システム変数名を取得; システム変数の値を取得(setq *LUPREC_val (atoi *LUPREC_val)); 文字列を数値に変換; ファイルから取得した数値でシステム変数をセットする(setq ren_LUPREC (read-line in_var)) 6(setq *LUPREC_txt (substr ren_LUPREC 1 6)) 7(setq *LUPREC_val (substr ren_LUPREC 7)) 8(setq ren_osmode (read-line in_var))

7(setq *osmode_txt (substr ren_osmode 1 6)) → 先頭から、6 文字を取り出します。 3→ 7 番目以降を取り出します。 4; ファイルを読み込みモードで開く

3

6→ 1 行づつ読み込みます。 2(setq *osmode_val (substr ren_osmode 7))(setq in_var (open "out_sys.txt" "r"));1 行ずつ読み込んで、システム変数名と設定値を変数に代入

Step1 ー 外部ファイル <out_sys.txt> を読み込み <"r">、変数 <in_var> に代入します。 1(setq ren_osmode (read-line in_var))(defun C:in_var ()→上（②～⑤）を繰り返します。

10(setvar "osmode" *osmode_val);"osmode" を変更する

11(setvar "LUPREC" *LUPREC_val);"LUPREC" を変更する

12(close in_var)(setq *LUPREC_val (atoi *LUPREC_val)) 9; ファイルを閉じる) ;endStep3 ー読み込んだシステム変数の値を現在のシステム変数値と入れ替えます。 10 11→ Step3→ Step4］(setvar "LUPREC" *LUPREC_val)

番号
関数名① open "r"② read-line

Step4 ーファイルを閉じます。
（必須です） 12(close in_var)③

初期値は、OSMODE<0> です。

OSMODE<49> は [ 端点 ]+[ 四半円点 ]+[ 交点 ] です。

④
⑤
⑥
⑦
⑧

テキスト ファイルからシステム変数を読み込み、変更する。

⑨⑩⑪⑫
Point!
1

説 明
外部のテキスト ファイルを読み込みモードで開きます。
開いたファイルから 1 行づつ読み込み、変数にセットします。
読み込んだ文字列の先頭から 6 文字を取り出します。
substr 1 6（システム変数名を取得します。
）
読み込んだ文字列の先頭から 7 文字目以降を取り出します。
substr 7（システム変数の値を取得します。
）
atoi
取り込んだシステム変数は文字列なので、整数に変換します。
read-line
次の 1 行を読み込みます。
読み込んだ文字列の先頭から 6 文字を取り出します。
substr 1 6（システム変数名を取得します。
）
読み込んだ文字列の先頭から 7 文字目以降を取り出します。
substr 7（システム変数の値を取得します。
）
atoi
取り込んだシステム変数は文字列なので、整数に変換します。
setvarシステム変数 [osmode] を変更します。
setvarシステム変数 [luprec] を変更します。
close
テキスト ファイルを閉じます。
（必須）

AutoCAD と対話する

AutoCAD と対話する(setvar "osmode" *osmode_val)(setq in_var (open "out_sys.txt" "r"))→ファイルの絶対パスを指定しない場合は AutoCAD の既定の図面フォルダになります。
ファイルが <C:autolisp> のフォルダにある場合は、C:¥¥autolisp¥¥ を付けます。

1-193

テキスト ファイルの入出力

テキスト ファイルの入出力

1-194

第 3 章－ AutoCAD と対話する
in_layer.lsp
目的：
主要関数：

第 3 章－ AutoCAD と対話する

外部ファイルから画層名一覧を読み込み、現在の図面に画層を追加する(defun C:in_layer( / in_layer layer_name lst new_layer i)

外部ファイル < テキスト ファイル > から画層名一覧を読み込み、現在の図面に画層を追加します。
<open><read_line><list><while><append><close><nth><1+>; 外部にある画層名のテキスト ファイルを読み込む

Step1 ー画層名の一覧を取り込みたい図面を開きます。

1(setq in_layer (open "out_layer.txt" "r")) ; 読み込み用のテキスト ファイルを開く2(setq layer_name (read-line in_layer)) ;1 行目を読み込む

3(setq lst (LIST layer_name)) ; 読み込んだ画層名をリストにする準備（1 つ目をリストにする）

4(while (/= layer_name nil) ;2 行目以降の処理（画層名が有れば、以下を実行する）

5(setq layer_name (read-line in_layer)) ; 次の行を読み込む

6(setq lst (append lst (LIST layer_name))) ; 取得した画層名をリストに追加する);while7(close in_layer) ; ファイルを閉じる（必須）; 画層を追加

Step2 ー取り込みたい画層名ファイルがあることを確認します。

選択した画層だけを取り込む方法は

8(setq new_layer (nth 0 lst)) ; リストの 1 番目を取り出す

9(setq i 1) ; 読み込んだ画層数をコマンドラインに表示するためのカウントをセット

10(while (/= new_layer nil) ; 画層名が無くなるまで読み込みを続ける

11(command "-LAYER" "N" new_layer "") ; 新しい画層を作成する

12(setq new_layer (nth i lst)) ; リストの次の画層名をセットする

13(setq i (1+ i)) ; 読み込んだ画層の数を <1> 増やして⑩から繰り返す);while14(prompt "¥n 読み込んだ画層の数は：") ; コマンドラインにメッセージを表示する(princ (- i 1))(princ); 画層の数を表示する

);end
番号
Step3 ー（左図）in_layer.lsp を実行すると、全画層名が現在の図面に取り込まれます。
（右図）コマンドラインに取り込んだ画層の数を表示します。

①
②
③
④
⑤
⑥
⑦
⑧
⑨
⑩
⑪
⑫
⑬
⑭

関数名
説 明
open "out_layer.
ファイル変数 <out_layer.txt> を読み込みモードでオープンします。
txt" "r"read-line
1 行づつ順番に読み込みます。
LIST layer_name 取り出した画層名を順番にリストにしていきます。
/= layer_name nil リストに画層名がある限り、読み込みの処理を繰り返します。
read-line in_layer 1 行づつ順番に読み込みます。
append lst (LIST
読み込んだ画層名を順番にリストにしていきます。
layer_name)close
最後は、必ずファイルを閉じます。
nth 0 lst
画層名リストの 1 番目を取り出します。nth 関数は <0> から始まります。
setq i 1
読み込んだ画層数を カウントするために、初期値の <1> をセットします。
/= new_layer nil リストに画層名がある限り、画層の新規作成を繰り返します。
"-LAYER" "N"
画層を新規作成します。"-LAYER" は画層のダイアログを表示しません。
nth i lst
リスト内の次の画層名を取得します。
setq i (1+ i)
ループ カウンタを <1> つ増やして、⑩に戻ります。
prompt
読み込んだ画層の数をコマンドラインに表示します。
new_layer が <nil> となった時点で、<i> は 1 つ多くカウントされてprinc
いるから、読み込んだ画層の数は <i> の数値から 1 つ少なくする。
①から⑦の解説は、P2-143 を参考

1-195

テキスト ファイルの入出力

テキスト ファイルの入出力

1-196

AutoCAD と対話する

AutoCAD と対話する

P2-144 参考

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第5節

AutoLISP のエラー処理

1 AutoLISP のエラー コード

AutoLISP には、エラーを処理するための関数がいくつかあります。これらの関数を使用すると、次の表に、AutoLISP で生成されるエラー コードの値を示します。AutoLISP の関数呼び出しによっ次のことが可能です。

て発生したエラーを AutoCAD が検出すると、システム変数 ERRNO に次の値のいずれかが設定さ①プログラム実行中にエラーが発生した情報をユーザーに提供します。
メッセージ ボックスに表示れます。(getvar "errno") を使用すると、AutoLISP のアプリケーションで現在の ERRNO の値を検査できます。

コマンド ラインに表示
システム変数 [ERRNO] は、ゼロにクリアされない場合があります。AutoLISP の関数がエラーをレポートした直後に検査しないと、その値が示すエラーは誤っている可能性があります。
この変数は、図面を新規作成したり図面を開いたとき、必ずクリアされます。
ERRNO の値とその意味は、将来変更される可能性があります。

・[*error*] 関数を使用して、図面の設定などの条件をプログラム実行前に戻します。

AutoCAD と対話する

・[undo] コマンドを実行して、すでに作図した図形を含めて、全てを元の状態に戻します。

③ AutoLISP の関数呼び出しによって発生したエラーを AutoCAD が検出したときに、そのエラーに該当するエラー コードの数値を表示できます。
・AutoLISP の (getvar "errno") 関数を使用して、ERRNO の現在値を検査します。

(setq a (getvar "errno")) →エラー番号が返されます。
使用頻度の高い AutoLISP のエラー処理関数を、次の表に示します。（順不同）
エラー処理関数
関 数(alert string)(*error* string)(exit)(quit)

1-197

説 明
文字列として渡されたエラー メッセージや警告メッセージを警告
ダイアログ ボックスに表示します。
ユーザー定義可能なエラー処理関数です。
現在のアプリケーションを強制的に終了します。
現在のアプリケーションを強制的に終了します。

AutoLISP のエラー処理

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

値

AutoLISP の エラー コード
意 味

エラーはありません
無効なシンボル テーブル名です
無効な図形名または選択セット名です
選択セットの最大数を超えました
無効な選択セットです
ブロック定義が不正に使用されました
xref が不正に使用されました
オブジェクトを選択 : クリックが失敗しました
図形ファイルの終わりです
ブロック定義ファイルの終わりです
最後の図形が見つかりません
ビューポート オブジェクトを不正に削除しようとしました
PLINE[ ポリライン ] 中は操作できません
無効なハンドルです
ハンドルが使用可能になっていません
座標変換要求に無効な引数があります
座標変換要求に無効な空間があります
削除した図形が不正に使用されました
無効なテーブル名です
無効なテーブル関数の引数です
読み込み専用の変数に代入しようとしました
ゼロ値は許されていません
値が範囲外です
複雑な REGEN の処理中です
図形タイプを変更しようとしました
不正な画層名です
不正な線種名です
不正な色名です
不正な文字スタイル名です
不正なシェイプ名です
図形タイプのフィールドが不正です
削除した図形を変更しようとしました
Seqend 従属図形を変更しようとしました

AutoLISP のエラー処理

AutoCAD と対話する② AutoCAD の環境を元の状態に復元します。

1-198

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

1-199

第 3 章－ AutoCAD と対話する

ハンドルを変更しようとしました
ビューポートの可視性を変更しようとしました
図形はロックされている画層にあります
不正な図形タイプです
不正なポリライン図形です
ブロック内の複合化図形が不完全です
無効なブロック名フィールドですブロック フラグ フィールドが重複しています
ブロック名フィールドが重複しています
不正な法線ベクトルです
ブロック名がありません
ブロック フラグがありません
名前のないブロックが無効です
ブロック定義が無効です
必須フィールドがありません
拡張データ (XDATA) のタイプが認識できません
XDATA 内のリストのネストが正しくありません
APPID フィールドの位置が正しくありません
XDATA の最大サイズを超えました
オブジェクトを選択 : null 応答です
APPID が重複しています
ビューポート図形を作成または変更しようとしました
xref、xdef、xdep を作成または変更しようとしました
ssget フィルタ : リストが途中で終わっていますssget フィルタ : テスト オペランドがありません
ssget フィルタ : opcode(-4) 文字列が無効です
ssget フィルタ : ネストが正しくないか条件条項が空です
ssget フィルタ : 条件条項の始まりと終わりが一致していません
ssget フィルタ : 条件条項における引数の数が誤っています (NOT または XOR)
ssget フィルタ : ネストの最大数を超えました
ssget フィルタ : グループ コードが無効です
ssget フィルタ : 文字列テストが無効です
ssget フィルタ : ベクトル テストが無効です
ssget フィルタ : 実数テストが無効です
ssget フィルタ : 整数テストが無効です
ディジタイザがタブレット モードではありません
タブレットが位置合わせされていません
タブレット引数が無効です
ADS エラー : 新規のリザルト バッファを割り当てられません
ADS エラー : null ポインタを検出しました
実行ファイルを開けません
アプリケーションは既にロードされています
最大数のアプリケーションが既にロードされています
アプリケーションを実行できません
互換性のないバージョン番号です
ネストしたアプリケーションをロード解除できません
アプリケーションがロード解除を拒否しました
アプリケーションが現在ロードされていません
メモリが不足しているのでアプリケーションをロードできません
ADS エラー : 変換マトリックスが無効です
ADS エラー : シンボル名が無効です
ADS エラー : シンボル値が無効です
ダイアログ ボックスの表示中は AutoLISP/ADS を操作できません

AutoLISP のエラー処理

2 *error* 関数を使用する
ユーザーが *error* 関数を記述した場合、エラーが発生した後に AutoCAD を確実に特定の状態に戻すことができます。
このユーザー定義関数を使用すると、エラー状況に応じて適切なメッセージを表示します。
ユーザーが *error* 関数を記述していない場合、AutoCAD の操作中にエラーが生じると、次の形式でメッセージを出力します。
① AutoLISP のコードに誤りがある場合の例。
コマンド ラインに次のように表示されます。
→コマンド：引数のタイプが間違っています : point: nil②ユーザーが [Esc] キーを押して、キャンセルした場合の例。
コマンド ラインに次のように表示されます。
→ 関数は取り消されました③このメッセージで、文字列 はエラーの内容を表します。しかし、*error* 関数が定義されている
場合は 、AutoLISP はメッセージを表示しないで、*error* 関数を実行します。
*error* 関数は 文字列 を 1 つの引数として受け取ります。
④下記のように、
ユーザー側で *error* 関数を作成し、AutoLISP のプログラムと一緒にロードするか、
ACAD.lsp または ACADDOC.lsp に記述します。
(defun *error* (errmsg)(princ "¥n エラーが発生しました。プログラムをキャンセルします。")(terpri)(prompt errmsg)

エラーが発生した時、下図のように表示されます。

(princ))AutoLISP のエラー処理

1-200

AutoCAD と対話する

AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

3 *error* 関数 でのエラー処理

次に、③の "LINE" の時に、Esc を押してエラー メッセージを確認してみます。

次の LISP プログラムを使い、どのタイミングでエラーが生じるか見てみましょう。
(defun C:error_test ( )①(setvar "OSMODE" 3)②(setq pt1 (getpoint "¥n1 点目を指示 :"))③

(command "LINE" pt1 pause "" )④

(setvar "OSMODE" 0))

この LISP では、①の (setvar "OSMODE" 3) で、オブジェクト スナップ モードを <3> に設定しています。
（"OSMODE" 3

は、[ 端点 <1>]+[ 中点 <2>]）

ユーザーが [Esc] キーを押して、プログラムをキャンセルするタイミングは、②と③です。
②の getpoint の get 関数は、ユーザーの指示を待つ関数です。

< 次の点を指定

または[ 元に戻す (U)]：> の場面で、Esc を押した時、コマンド ラインに<; エラー : 関数は取り消されました > のメッセージが出ます。(getvar "errno") で確認すると、<93> が表示されました。<93> は AutoCAD の持つエラー メッセージです。
このように、ユーザー関数と AutoCAD の関数のエラー メッセージは違います。

また、③の pause もユーザーの指示を待つ AutoCAD の関数です。
LISP の get 関数でエラーが生じた時のメッセージと AutoCAD のコマンド エラーのメッセージのそれは、①で (setvar "OSMODE" 3) を行い、プログラムの最後の④で (setvar "OSMODE" 0) にし違いを見てみましょう。

てオブジェクト スナップ モードを元に戻す処理をしていますが、②か③でプログラムを中止した

get 関数は、ユーザーの入力待ちの関数ですから、ほとんどの場合ここで LISP はストップします。

場合、<"OSMODE" 3> の設定が残ってしまいます。

その時の AutoCAD のプロンプトには、一例として以下のようなメッセージが表示されます。
これを回避するために、AutoLISP には <*error*> 関数が用意されています。
記述方法は、(defun *error* (msg)) です。
この中の引数 (msg) には、エラー メッセージを引数から受け取りますが、このメッセージは<*error* 関数 > を使わないときに表示されるメッセージと同じで、AutoCAD から渡されます。
LISP のプログラムの最初に、このエラー関数を以下のように記述します。
(defun *error* (msg)<1 点目を指示：> の場面で、Esc を押した時、コマンド ラインに <; エラー : 関数は取り消されました > のメッセージが出ます。(getvar "errno") で確認すると、<2> が表示されました。
エラーコード表で確認すると、<2> は < 無効な図形名または選択セット名です > であることがわかります。

(setvar "osmode" 0)→ "osmode" を初期値 <0> に戻す処理(princ msg)

→ エラー メッセージを表示する。

(princ))
こうすれば、エラーで終了したときでも、変更した <osnap> などのシステム変数値は初期の設定に戻ります。

1-201

AutoLISP のエラー処理

AutoLISP のエラー処理

1-202

AutoCAD と対話する

AutoCAD と対話する

上記の例で、ユーザーが Esc を押して、プログラムを中止したときに、問題になる点が 1 つあります。

第 3 章－ AutoCAD と対話する

第 3 章－ AutoCAD と対話する

では、先ほどの LISP(error_test) に、このエラー関数を追加して確認します。

4 alert 関数 でエラー内容をダイアログで表示①(defun *error* (msg)②(setvar "osmode" 0)[AutoCAD メッセージ ] ボックスを表示して、ユーザーにエラー状況を知らせることもできます。

③(princ msg)

[AutoCAD メッセージ ] ボックスは、プログラムが指定したメッセージを表示する小さなダイアログ④(princ)ボックスです。[AutoCAD メッセージ ] ボックスを表示するには、alert 関数を使用します。

(defun C:error_test 1( )次のように alert 関数を呼び出すと、[AutoCAD メッセージ ] ボックスを表示できます。

(setvar "OSMODE" 3)

書式は (alert " メッセージ ") のように記述します。

)(setq pt1 (getpoint "¥n1 点目を指示 :"))
(command "LINE" pt1 pause "")では、前回のエラー関数を alert に置き換えた LISP を次に示します。

(setvar "OSMODE" 0))(defun *error* (msg)

次の②で <osnap> の設定を初期値の <0> に戻します。
次の③では、エラー メッセージをコマンドラインに表示します。
最後の④の <princ> は、同じメッセージを表示させないためです。
このエラー関数を追加したプログラムで、前回と同じように Esc でキャンセルした時のメッセージ→ エラーになった時に、システム変数を初期値に戻す①(setq alert_msg msg)

→ AutoCAD のエラーメッセージを変数 <alert_msg> に代入②(alert alert_msg)→ 変数 <alert_msg> に代入したメッセージを表示する(princ))(defun C:error_test2 ( )(setvar "OSMODE" 3)

AutoCAD と対話する

は次のようになります。

(setq pt1 (getpoint "¥n1 点目を指示 :"))
(command "LINE" pt1 pause "")→］表示されます。

ここで [Esc] を押すと、エラーメッセージが(setvar "OSMODE" 0))
この LISP では、AutoCAD のエラー メッセージ <msg> を変数 <alert_msg> に代入して、その変数をこのように、コマンドの次に表示されるメッセージは、< 関数は取り消されました > だけが表示

alert 関数で表示させています。
（コマンドラインに表示させるより、視覚的に判りやすい方法です。
）

されます。
（エラー：の文字は表示されません。
）

エラー関数の中に、LISP の中で変更する予定のあるシステム変数を初期値に戻す処置を記述しておくことが大切です！

1-203

AutoLISP のエラー処理

AutoLISP のエラー処理

1-204

AutoCAD と対話する①のエラー関数の定義で、AutoCAD のエラー メッセージを変数 <msg> に受け取ります。

(setvar "osmode" 0)

第 3 章－ AutoCAD と対話する

5 UNDO コマンド でエラーを処理する
前ページでは、[Esc] を押したときに元に戻す処理を行いましたが、下記の④のように⑤で [Esc] を押す前に、すでに線分を作図していれば、この線分は残ってしまいます。
これを回避するために、プログラム実行中にキャンセルした場合、[UNDO] コマンドを使って必ず最初に戻るような処理もできます。

第 4 章 オブジェクトを操作する
前章までの LISP プログラムは図形の作図だけでしたが、実際の作図(defun error_undo (msg)

では図面の編集の作業も必要になります。

(command-s "undo" "b" "y")→ [UNDO] コマンドの [B] で最初に戻す(setvar "osmode" 0)→ エラーになった時に、システム変数を初期値に戻す

図面の編集をするには、図面情報が蓄えられているデータベースの(setq *error* errmsg)→ AutoCAD のエラーメッセージを元 (*error*) に戻す

情報を取得し、個々の図形 ( オブジェクト ) が持っている属性を変更(setq alert_msg msg)

→ AutoCAD のエラーメッセージを変数 <alert_msg> に代入します。

(alert alert_msg)→ 変数 <alert_msg> に代入したメッセージを表示する(princ))

この章では以下のことを学びます。

AutoCAD と対話する(defun C:error_test3 ( / pt1)①

(setq errmsg *error*)→ AutoCAD のエラーメッセージを一時的に待避させる②(setq *error* error_undo)→ AutoCAD の [*error*] に上記の補助関数をセットする③(command "undo" "m")→ [UNDO] コマンドで [m]（マーク）をつける④(command "line" '(0 0) '(100 100) "") →線分を作図する(setvar "OSMODE" 3)⑤→Ｏスナップモードを <3> に設定する(setq pt1 (getpoint "¥n1 点目を指示 :"))

;1 点目の指示を促す(command "LINE" pt1 pause "")→］表示され、(error_undo) が実行されます。

(setvar "OSMODE" 0)

ここで [Esc] を押すと、エラーメッセージが);end④で線分は一旦は作図される（円は事前に作成済み）

1-205⑤でキャンセルされると、メッセージを表示して最初に戻る。

AutoLISP のエラー処理

線分は削除され、OSMODE も元に戻っている第 1 節

オブジェクトの処理（単一図形）

第 2 節

オブジェクトの処理（複数図形）

第 3 節

選択セットのフィルタ

第 4 節

拡張データ

第 4 章－オブジェクトの操作

第1節

第 4 章－オブジェクトの操作

オブジェクトの処理（単一図形）

図面内にある既存のオブジェクトの編集には以下のようなことが考えられます。

1 オブジェクト処理関数（オブジェクトを取得する）
ENTLAST

最後のエンティティの名前を返します①オブジェクトのプロパティ（画層・色・線種など）を変更する。
②オブジェクトのジオメトリ（位置・大きさなど）を変更する。

(setq en1 (entlast))→ 最後に作成した図形のデータを返します。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

< 図形名 : 7ef03560>→ 図形の名前が表示されます。

③オブジェクトを削除したり、新規で作成する。
このようにオブジェクトを編集するには、そのオブジェクトの情報を取得し、その内容を理解しなければなりませが、これを手助けしてくれる関数が多くあります。
この節では、オブジェクトごとに編集する手法を学びます。

entlast

最後に作図した情報を取得する

使用頻度の高い AutoLISP の オブジェクト処理関数を、次の表に示します。（順不同）

オブジェクトの操作②オブジェクト処理関数（オブジェクトのリストとエンティティ名を取得）
関 数
説 明(entget ename [applist]) エンティティ名で指定するオブジェクトの特性リストを返します。
引数にエンティティ名を指定すると、エンティティ名を含む下位のエ(entnext [ename])
ンティティの最初のエンティティ名を返します。
引数を省略すると、データベースの最初のエンティティ名を返します。
③オブジェクト処理関数 ( オブジェクトの削除と作成）
関 数
説 明
エンティティ名で指定するオブジェクトを削除します。
(entdel ename)
同じセッションで、すでに削除したものを指定すると、削除が取り消されます。
(entmake [elist])
図面内に新しいオブジェクトを作成します。
新しいオブジェクトを作成し、それにハンドルと図形名を与え、新し(entmakex [elist])
い図形名を返します。
( ただし、オーナーは割り当てません )④オブジェクト処理関数 ( オブジェクトの更新）
関 数
説 明(entmod [elist])
オブジェクトの定義データを更新します。
(entupd ename)entmod で特性を変更したオブジェクトの表示を更新します。

1-207

オブジェクトの処理（単一図形）

1. 最初に、適当な長さの線分を作図します。
2. コマンドラインから、以下のように入力します。
(setq en1 (entlast) )この式は、最後に作図した図形を取得します。選択する図形は 1 つです。
この図形を変数 en1 にセットします。
3. コマンドラインに(< 図形名 : 7ef03990>) のような情報が表示されます。

( 数値は、 図形ごとに違います。)< 図形名 : 7ef03990> が選択した図形の名前です。1 つの図形には 1 つの名前が付けられます。
4. この図形の中身を表示する関数は、entget です。
(setq en2 (entget en1)) と入力すると、以下のような情報が表示されます。
コマンド : (setq en2 (entget en1))((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2F6") (100 . "AcDbEntity")(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1096.73 1249.12 0.0) (11 1255.82 1247.36 0.0)(210 0.0 0.0 1.0))

オブジェクトの操作①オブジェクト処理関数（オブジェクトを取得）
関 数
説 明(entlast)
図面データベースの最後に追加されたエンティティ名を返します。
メッセージ (msg) を表示してオブジェクトを選択し、そのオブジェク
ト名を最初の要素と選択に使った座標リストを 2 番目の要素とするリ(entsel [msg])
ストを返します。メッセージ (msg) を省略すると、" オブジェクトを選
択：" のプロンプトを表示します。
点を指定してオブジェクト ( 図形 ) を選択するようユーザに要求し、複(nentsel [msg])
合化オブジェクトに含まれる定義データにアクセスできるようにします。

5. この情報から以下のことが判ります。
(0 . "LINE")→この図形は [ 線分 ](410 . "Model")→ Model 空間にある(8 . "0")→画層は [0](10 1096.73 1249.12 0.0)

→始点の座標 [1096.73 1249.12 0.0]

(11 1255.82 1247.36 0.0)

→終点の座標 [1255.82 1247.36 0.0](210 0.0 0.0 1.0)

→押し出し方向（既定値 =0,0,1）(X、Y、Z 座標 )オブジェクトの処理（単一図形）

1-208

第 4 章－オブジェクトの操作
ENTSEL

第 4 章－オブジェクトの操作選択したエンティティ名と選択点の座標を返します

NENTSEL

従属図形 ( 頂点 ) の名前と指定した点の名前を含むリストを返します(setq en1 (entsel))→キーボードから入力します。

(setq en1 (nentsel))→キーボードから入力します。

オブジェクトを選択 :→ 図形を選択します。

オブジェクトを選択 :→ 図形を選択します。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

(< 図形名 : 7ef03560> (1689.74 816.669 0.0))→ 図形の名前と座標が表示されます。

(< 図形名 : 7ef039a0> (18.1866 -0.577688 0.0))→ 図形の名前と指示した座標が表示されます。

ポリライン (PLINE) で作図した四角形(0,100)(100,100)(0,0)(100,0)図形を選択した点の座標
選択した図形名 (AutoCAD が任意に付けます）

entsel図形情報を取得する

nentsel

ポリラインの図形情報を取得する

1. AutoCAD の線分 [LINE] コマンドで上記の線分を作図します。

1. AutoCAD のポリライン [PLINE] コマンドで上記の正方形を作図します。

2. コマンドラインから、以下のように入力します。

2. コマンドラインから、以下のように入力します。

(setq en1 (entsel) )(setq en1 (entget (car (nentsel))))

この式は、コマンドラインに < 図形選択 > の文字を表示して、ユーザーが図形を選択するのを待オブジェクトを選択すると以下のようなメッセージが表示されます。

ちます。図形は 1 つしか選択できません。

((-1 . < 図形名 : 7ef039a0>) (0 . "LWPOLYLINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A4")

その図形を変数 en1 にセットします。

(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0)
(38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 100.0 0.0) (40 . 0.0) (41 . 0.0)(< 図形名 : 7ef03560> (1689.74 816.669 0.0)) のような文字と数値が表示さオブジェクトの操作れます。( 上記の文字と数値は、図形ごとに必ず違います。)(42 . 0.0) (91 . 0) (10 100.0 100.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 0.0 100.0) (40 . 0.0) (41 . 0.0)
(42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))< 図形名 : 7ef03560> が選択した図形の名前です。1 つの図面には 1 つの名前が付けられます。
(1689.74 816.669 0.0) は、マウスで図形を指示した位置の座標値です。

3. ポリラインの開始頂点 (vertext) を示すドット・ペアのグループ コードは <10> ですが、上のリス
トには <10> のドット・ペアが 4 つあります。

4. キーボードから、<!en1> と入力してみましょう。

(10 0.0 0.0)、(10 100.0 0.0)、(10 100.0 100.0)、(10 0.0 100.0)< 図形名 : 7ef03560> (1689.74 816.669 0.0)) の文字が返され、変数 en1 にこの線分の図形情報が取得されているのが分かります。

4. このように、PLINE は図面データベース内では単独の図形（複合図形ではない）として定義されています。ブロック図形や 3D ポリラインのような複合図形では上記と異なるリストが返ります。
[3D ポリライン ] は、P1-219 を参考

1-209

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-210

オブジェクトの操作

3. コマンドラインに第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

entsel 関数で LWPOLYLINE の頂点座標を取得する

nentsel 関数で LWPOLYLINE の頂点座標を取得する

前ページで作図した正方形の 4 つの頂点座標を entsel 関数で取得します。

P1-205 で作図した正方形の 4 つの頂点座標を nentsel 関数で取得します。

(defun C:get_LWPOLY ( / ent ent_len i ent1 )(defun C:get_LWPOLY2 ( / ent ed pt pt_list)1(setq ent (entget (car (entsel)))) ; 四角形の情報のリストを取得

1(setq ent (nentsel "¥nLWPOLYLINE を選択 ")) ;LWPOLYLINE(PLINE) を選択する

2(setq ent_len (length ent)) ; 四角形の情報の数を取得 (35 個 )2(setq ent_data (entget (car ent))) ; 前半の図形名を取得し、その情報を取得する

3(setq i 0) ;nth 関数でドット・ペアを順番に取り出すためのカウンタを <0> にセット

3

(setq pt (assoc 10 ent_data)) ; 頂点座標リスト（グループコード <10>）を順番に取得する

4(repeat ent_len ; 括弧のリストの数だけ繰り返す

5(setq ent1 (car (nth i ent))) ; ドット・ペアのリストから前半のグループ コードを検査

4(while pt ;pt が存在する ( 真 ) 限り、以下のプログラムを実行する

6(if (= ent1 10) ; もし、グループ コードが <10> である時、以下の処理を行う

5(print pt) ; 取得した pt の座標をコマンドラインに表示する。最初は (10 0.0 0.0)

(progn; この図では、最初の pt は (0.0 0.0) になります。

;（グループ コード <10> が頂点座標であるため）; 取得した以降の頂点座標 (10 . 座標値 ) を取得します。

; 改行する（結果を 1 行ずつずらして表示するため）;member 関数は、初めに検出した式以降のリストを返します。

7(terpri)8(princ (cdr (nth i ent))) ;(10 . 頂点座標 ) の後半部分（頂点座標）だけを表示する);progn;1 番目の頂点座標 (10 0.0 0.0) を取得した後は、これ以降の頂点座標を探します。

6

);if
9

(setq ent_data (cdr (member pt ent_data))) ; これ以降のドット・ペアを再構成する; 再度、ドット・ペアのグループから、頂点座標の座標値のみ取得します。

(setq i (1+ i)) ;nth 関数のカウンタを <1> 増やして、④に戻り次のドット・ペアを検査する);repeat7(setq pt (assoc 10 ent_data)) ; 頂点座標のドット・ペア（グループコード <10>）を取得;2 番目の場合は、(10 100.0 0.0) が取得できます。

(princ)); ④に戻って、pt が <nil> になるまで繰り返します。

);end(princ));end
結果がコマンドラインに結果がコマンドラインに表示されます。

表示されます。​(0.0 0.0)(100.0 0.0)

(10 0.0 0.0)(100.0 100.0)(10 100.0 0.0)

番号
①
②
③
④
⑤
⑥
⑦
⑧
⑨

1-211

説 明
(car (entsel)) で取得できるのは < 図形名 : 7ef03a10> なので、この(entget (car (entsel)))
中身を取得する関数が entget 関数です。
(length ent)
取得したドット・ペアの数を取得します。
（repeat 関数で使用するため）(setq i 0)
nth 関数のカウントを開始します。nth 関数は <0> から始まります。
repeat ent_len
取得したドット・ペアの数だけ繰り返します。
ドット・ペアの前半のグループ コードを取得します。
(car (nth i ent))（<10> が頂点座標）
if (= ent1 10)
グループ コードが <10> かどうかをチェックします。
terpri
改行する関数です。これが無いと、1 行に全部表示されます。
(cdr (nth i ent))
取得したドット・ペアの後半部分（座標値が有る）を取得します。
(setq i (1+ i))
カウントを <1> 加えて、④に戻ります。

(10 100.0 100.0)(10 0.0 100.0)

関数名オブジェクトの処理（単一図形）

番号
関数名
説 明
① nentsel
複合化されたオブジェクト（図形）の従属データを取得します。
② (entget (car ent))
entget 関数でオブジェクトの中身を取得します。
③ (assoc 10 ent_data) グループコードが <10> の最初のドット・ペアを取得します。
④ while pt
グループコードが <10> のドット・ペアが存在すれば以下を実行します。
⑤ (print pt)
検出したグループコードをコマンドラインに表示します。
(cdr (member pt
検出したドット・ペア以降のドット・ペアを再構成します。残りのドッ⑥
ent_data))
ト・ペアからグループコードが <10> のドット・ペアを探します。
⑦ (assoc 10 ent_data) 次のグループコードが <10> の最初のドット・ペアを取得します。

オブジェクトの処理（単一図形）

1-212

オブジェクトの操作

オブジェクトの操作(0.0 100.0)

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

entsel & nentsel

ブロックの図形情報を取得する
下図はブロック図形（ブロック名は <light>）

entsel 関数でブロック図形を選択

nentsel 関数でブロックを編集する
前ページで作図したブロック図形 (light) の円の大きさを <50> から <100> に変更します。

① nentsel 関数で、右端のブロックの中の円を選択します。
（同じブロックが 3 つあります。
）(setq ent1 (nentsel "¥n 変更する円を選択 "))① entsel 関数でブロックを選択します。
(setq ent1 (entget (car (entsel))))→ (< 図形名 : 7ef02ad8> (1883.46 1332.43 0.0) ((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)
(1921.85 1368.26 0.0)) (< 図形名 : 7ef02b48>))→ ((-1 . < 図形名 : 7ef03ba8>) (0 . "INSERT") (330 . < 図形名 : 7ef01cf8>) (5 . "2E5")(100 . AcDbEntity")(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "light")(10 1410.61 1368.26 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0)(210 0.0 0.01.0))②前半の図形名を取得し、その情報を取得します。
(setq ent_data (entget (car ent1)))→ ((-1 . < 図形名 : 7ef02ad8>) (0 . "CIRCLE") (330 . < 図形名 : 7ef02ac0>) (5 . "2E3")②上記のリストから判るのは、(0 . "INSERT") から図形はブロック、(2 . "light") からブロック名は(100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 0.0 0.0 0.0) (40 . 50.0) (210 0.0 0.0 1.0))"light"、挿入座標の (10 1410.61 1368.26 0.0) などです。
③上記の半径のドット・ペア (40 . 50.0) を取得します。

nentsel 関数でブロック図形の < 円 > を選択(setq ent_data (assoc 40 ent1))→ (40 . 50.0)① entsel 関数でブロックの < 円 > を選択します。
→ ((-1 . < 図形名 : 7ef03b98>) (0 . "CIRCLE") (330 . < 図形名 : 7ef03b80>) (5 . "2E3")(100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 0.0 0.0 0.0) (40 . 50.0) (210 0.0 0.0 1.0))

オブジェクトの操作②上記のリストから判るのは、ブロック図形の中の円を選択すると、ブロックの情報ではなく円の情報が取得できます。(0 . "CIRCLE") から図形は円、(40 . 50.0) から半径が <50.0> と判ります。
Point!

④新しい半径 (40 . 100.0) と入れ替えます。
(setq ent1 (subst '(40 . 100.0) ent_data ent1))→ ((-1 . < 図形名 : 7ef02ad8>) (0 . "CIRCLE") (330 . < 図形名 : 7ef02ac0>) (5 . "2E3")(100. "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (10 0.0 0.0 0.0) (40 . 100.0) (210 0.0 0.0 1.0))⑤ブロック図形の情報を更新します。下図のように他の同じブロックも同時に更新されました。
(entmod ent1)

ブロック図形を entsel 関数で選択すると、ブロック自体の情報を取得できますが、
nentsel 関数で選択すると、ブロックを構成するオブジェクト（従属図形）の情報を取得します。
3D ポリラインも同様です。nentsel 関数で 3D ポリラインを選択すると、選択したセグメントの頂点座標（3D ポリラインの 2 番目のセグメントを選択すると、そのセグメントの頂点座標）を返します。

1-213

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-214

オブジェクトの操作(setq ent1 (entget (car (nentsel))))第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作
entlast と entsel の相違

2

オブジェクト処理関数（オブジェクトのリストとエンティティ名を取得する）

entlast 関数は最後に作図した図形の名前が取得できますが、entsel 関数は図形名と座標のドット・ペアの形で取得しますから、それから car 関数で第一番目の図形名を取得する過程が加わります。

ENTLAST

ENTSEL

ENTGET

指定したエンティティのデータのリストを返します(setq en1 (entget (entlast)))→ 最後の図形のエンティティ データを取り出します。

コマンド : !en1

CAR で座標を取り除く

図形名

オブジェクトの操作

ENTGET

図形名

ENTGET

データ項目を構成するグループ（代表的な例）
エンティティタイプ
データの記入項目LINE
10 , 20 , 30 （始点）
（線分）
11 , 21 , 31 （終点）
CIRCLE
10 , 20 , 30 （中心点）
（円）
40
（半径）
10 , 20 , 30 （中心点）
ARC
40
（半径）
50
（始点での角度）（円弧）
51（終点での角度）
10 , 20 , 30 （挿入点）
40
（高さ）
1
（文字の値）
TEXT
50（文字の回転角度）（1 行文字）
7（字体名）
11 , 21 , 31 （位置合わせの座標）2（複合図形名）BLOCK
70（複合図形のタイプ フラグ）
（複合図形）
3（複合図形名）10 , 20 , 30 （複合図形の基点）
2（複合図形名）10 , 20 , 30 （挿入基点）
41（X 方向の尺度）
INSERT​ 42（Y 方向の尺度）（図形挿入）
43（Z 方向の尺度）
50（回転角度）

1-215

オブジェクトの処理（単一図形）(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") (10 1439.74 1568.78 0.0) (40 . 248.165)(210 0.0 0.0 1.0) (100 . "AcDbArc") (50 . 0.434579) (51 . 2.23834))
上記のリストから読み取れる主な情報は、(0 . "ARC")→ 図形は円弧(410 . "Model")→ 図形はモデル空間にある(8 . "0")→ 図形の画層は <0>(10 1439.74 1568.78 0.0)

→ 中心座標(40 . 248.165)→ 半径(50 . 0.434579)→ 開始角度（ラジアン）(51 . 2.23834)→ 終了角度（ラジアン）

グループ コード
0
1
2
3～4
5
6
7
8
9
10
11 ～ 18
20
21 ～ 2830
31 ～ 3738
39
40 ～ 4849
50 ～ 58
62

AutoCAD エンティティのグループ コード
意 味
エンティティ タイプ（"LINE" や "CIRCLE" など）最初の文字の値
名前（複合図形や属性など）
その他の文字や名前の値
16 進数文字列として表される図形ハンドラ
線種名
字体名
画層名
変数名
最初の X 座標（線分の始点、円の中心など）
その他の X 座標
最初の Y 座標
その他の Y 座標
最初の Z 座標
その他の Z 座標
図形の高度
図形の厚さ
浮動小数点値
反復される値
角度
色番号

オブジェクトの処理（単一図形）

オブジェクトの操作

図形名 + 座標((-1 . < 図形名 : 7ef03568>) (0 . "ARC") (330 . < 図形名 : 7ef01cf8>) (5 . "225") (100 ."AcDbEntity")

1-216

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

entget取得した図形の中身を見る

ENTNEXT

エンティティ名を含む下位のエンティティの最初のエンティティ名を戻します。

(setq en1 (entnext))→キーボードから入力します。

のは図形情報ですから、この 2 つの組み合わせから第 1 番目の図形情報を取り出します。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

第 1 番目の情報を取り出す関数は <car> です。

< 図形名 : 7ef02a08>→図面の最初の 図形の名前が表示されます。

(setq en2 (entnext en1)

→ en1 の次の図形を取得します。

1. P204 の変数 en1 は、線分の図形情報と指示した位置の座標情報の組み合わせですが、知りたい(car en1)
2. 取り出した図形の中身を表示する関数 <entget> を使い、その情報を変数 en2 に代入します。
(setq en2 (entget (car en1)))

3D ポリライン (3DPOLY) で作図した四角形の頂点座標を取得する(0,100)(100,100)
P1-205 の PLINE とこの

3. コマンドラインから、!en2 と入力してみましょう。下記のような数値が表示されます。

ページの 3D ポリライ((-1 . <Entity name: 3b1e058>) (0 . “LINE” ) (5 . “32” ) (67 . 0) (8 . “0” ) (62 . 256) (6 . “BYLAYER” )ンは異なります。

(48 . 1.00000) (60 . 0) (39 . 0.000000) (10 2.54225 5.60870 0.000000) (11 6.32486 6.96196 0.000000)

PLINE（ポリライン）(210 0.000000 0.000000 1.00000))

A

(0,0)
上記の数字は、1 つの例になりますが、これがこの線分の図形要素のリストになります。
重要な個所だけ見てみましょう。

コマンドで作成された(100,0)

図形は [LWPOLYLINE]です。

3D ポリラインを entsel 関数で選択① entsel 関数で 3D ポリラインを選択します。

((-1 . <Entity name: 3b1e058>)

・・・<-1> 図形要素名(0 . “LINE” )・・・<0> データタイプ ( この場合は” 線分” )(setq en1 (entget (car (entsel))))(8 . “0” )・・・<8> 画層名 ( この場合は” 0” )→ ((-1 . < 図形名 : 7ef02d08>) (0 . "POLYLINE") (330 . < 図形名 : 7ef01cf8>) (5 . "321")(10 2.54225 5.60870 0.000000)

・・・<10> 線分の始点の座標(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 ."AcDb3dPolyline") (66 . 1) (10 0.0 0.0 0.0)

(11 6.32486 6.96196 0.000000)

・・・<11> 線分の終点の座標(70 . 9) (40 . 0.0) (41 . 0.0) (2100.0 0.0 1.0) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0))

それぞれのリストは、2 つの項目からなっています。
最初の部分は、図形要素リストの項目を示すグループコード番号です。

②上記のリストから判るのは、(0 . "POLYLINE") から図形はポリラインですが、頂点座標 (10 のドット・ペア）が見つかりません。

グループコードは DXF のグループコードと同じです。

3D ポリラインを nentsel 関数で選択左のテキストファイルは、右の [ 南立面図 .dwg] を DXF 形式で保存したテキストです。

オブジェクトの操作

図形のグループコードは DXF のグループコードと同義です。（巻末の DXF グループコード表を参照）① nentsel 関数で 3D ポリラインの下辺 A を選択します。
(setq en1 (entget (car (nentsel))))→ ((-1 . < 図形名 : 7ef02d18>) (0 . "VERTEX") (330 . < 図形名 : 7ef02d08>) (5 . "323")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 ."AcDbVertex")(100 . "AcDb3dPolylineVertex") (10 0.0 0.0 0.0) (40 . 0.0) (41 .0.0) (42 . 0.0) (70 . 32) (50 . 0.0) (71 . 0)
(72 . 0) (73 . 0) (74 . 0))②上記のリストから判るのは、(0 . "VERTEX") と頂点座標の (10 0.0 0.0 0.0) です。
nentsel 関数で 3D ポリラインを選択すると、選択したセグメントの頂点座標（3D ポリラインの
1 番目のセグメントを選択すると、そのセグメントの頂点座標）が返ります。

1-217

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-218

オブジェクトの操作

Point!

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

entnext 関数で 3D ポリラインの頂点座標を取得する
前ページで作図した正方形の 4 つの頂点座標を nentsel 関数で取得しようとすると、3D ポリライン⑥ ent4 の従属図形 (ent5) を entnext 関数で取得します。
(setq ent5 (entget (entnext (cdr (car ent4)))))→ ((-1 . < 図形名 : 7ef03960>) (0 . "SEQEND") (330 . < 図形名 : 7ef03958>) (5 . "29C")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (-2 . < 図形名 : 7ef03958>))の全てのセグメントを選択しなければなりません。
しかし、entsel 関数と entnext 関数を使うと、頂点座標は取得できます。
① entsel 関数で 3D ポリラインを選択します。

⑦上記①から⑥までの図形名を抜き出すと以下の通りです。
ent→(0 . "POLYLINE")(setq ent (entget (car (entsel))))

ent1

→

(0 . "VERTEX")

頂点座標は (10 0.0 0.0 0.0)

→ ((-1 . < 図形名 : 7ef03958>) (0 . "POLYLINE") (330 . < 図形名 : 7ef01cf8>) (5. "29B")

ent2

→

(0 . "VERTEX")

頂点座標は (10 100.0 0.0 0.0)(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDb3dPolyline") (66 . 1) (10 0.0 0.0 0.0)

ent3

→

(0 . "VERTEX")

頂点座標は (10 100.0 100.0 0.0)

(70 . 9) (40 . 0.0) (41 . 0.0) (210 . 0.0 0.0 1.0) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0))

ent4

→

(0 . "VERTEX")

頂点座標は (10 0.0 100.0 0.0)

ent5

→

(0 . "SEQEND")② ent の従属図形 (ent1) を entnext 関数で取得します。
(setq ent1 (entget (entnext (cdr (car ent)))))→ ((-1 . < 図形名 : 7ef03968>) (0 . "VERTEX") (330 . < 図形名 : 7ef03958>) (5 . "29D")⑧ "SEQEND" は、[ シーケンス終了 ] の図形であることを示しています。このように (0 . "SEQEND")が表れるまで、entnext 関数で従属図形を検索していきます。

(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbVertex")(100 . "AcDb3dPolylineVertex") (10 0.0 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (70 . 32) (50 . 0.0) (71 . 0)

⑨下記は①から⑧をコード化したものです。

(72 . 0) (73 . 0) (74 . 0))(defun c:get_POLYLINE ( / ent i)1(setq ent (entget (car (entsel)))) ; 四角形の情報のリストを取得(setq ent2 (entget (entnext (cdr (car ent1)))))

2(setq i 1) ;"SEQEND" が見つかった時に、i を nil にセットしてループを終了する→ ((-1 . < 図形名 : 7ef03970>) (0 . "VERTEX") (330 . < 図形名 : 7ef03958>) (5 . "29E")

3(while i(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbVertex")4(setq ent (entget (entnext (cdr (car ent))))) ; 選択した主図形の従属図形を取得(100 ."AcDb3dPolylineVertex") (10 100.0 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (70 . 32) (50 . 0.0)

5(if (/= (cdr (assoc 0 ent)) "SEQEND") ; グループ コードが <0> のドット・ペアの後半が(71 . 0) (72 . 0) (73 . 0) (74 . 0))④ ent2 の従属図形 (ent3) を entnext 関数で取得します。
(setq ent3 (entget (entnext (cdr (car ent2)))))→ ((-1 . < 図形名 : 7ef03978>) (0 . "VERTEX") (330 . < 図形名 : 7ef03958>) (5 . "29F")

オブジェクトの操作(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbVertex"); ループを開始する

		

(progn;"SEQEND" でなければ、以下を行う

6		

(terpri); 改行する（結果を 1 行ずつずらして表示するため）

7		(princ (cdr (assoc 10 ent)));(10 . 頂点座標 ) の後半部分だけを表示する		);progn(setq i nil)8

; 最後の表示が終わると、ループを終了する);if(100 ."AcDb3dPolylineVertex") (10 100.0 100.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0)(70 . 32) (50 . 0.0)

オブジェクトの操作③ ent1 の従属図形 (ent2) を entnext 関数で取得します。

);while(71 . 0) (72 . 0) (73 . 0) (74 . 0))(princ)⑤ ent3 の従属図形 (ent4) を entnext 関数で取得します。

);end(setq ent4 (entget (entnext (cdr (car ent3)))))→ ((-1 . < 図形名 : 7ef03980>) (0 . "VERTEX") (330 . < 図形名 : 7ef03958>) (5 . "2A0")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbVertex")(100 . "AcDb3dPolylineVertex") (10 0.0 100.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (70 . 32) (50 . 0.0)
(71 . 0) (72 . 0) (73 . 0) (74 . 0))

1-219⑩実行すると、コマンドラインに結果が表示されます。

オブジェクトを選択 :(0.0 0.0 0.0)(100.0 0.0 0.0)(100.0 100.0 0.0)
(0.0 100.0 0.0)

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-220

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

3 オブジェクト処理関数 ( オブジェクトの削除と作成）
ENTDELエンティティ名で指定した図形を削除します(entdel (car en1))→ エンティティ名 < 7ef03560 > の図形は削除されます。

4 オブジェクト処理関数（オブジェクトの更新）
ENTMOD

エンティティ リストのデータベースを更新します(setq en1 (entget (entlast)))→ 最後の図形のエンティティ データを取り出します。

(setq en1 (subst (cons 8 "1") (assoc 8 en1)))entdel の引数は、エンティティ名 < 7ef03560 > だけですから、<en1> から座標値を取り除い(entmod en1)

→ 画層 <1> と入れ替えます。

→ entmod 関数で、データベースを更新します。

た前半部分だけを取り出します。
（リストの第 1 番目を取り出す関数は、<car> です。）
ENTMAKE

図面内に新しい図形を作成します

コマンド : !en1((-1 . < 図形名 : 7ef03550>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "222") (100 .

書式：(entmake [elist])"AcDbEntity") (67 . 0) (410 . "Model") (8 . "1") (100 . "AcDbLine") (10 1403.87

注：引数の elist1390.95 0.0) (11 1816.94 1540.2 0.0) (210 0.0 0.0 1.0))

entget 関数が返すのと同じ形式の図形定義データのリストです。elist 引数には、図形の定義に必要な情報がすべて含まれていなければなりません。必要な定義データが抜けていると、

上記のリストから、画層が <1> に変更されたことが判ります。

entmake 関数は nil を返し、その図形は無効になります。省略可能な定義データ ( 画層など ) を(8 . "1")→ (8 . "1") の <8> は、画層を示すグループ コードです。

省略した場合、entmake 関数は既定値を使用します。

下記のコードは座標 (10,20) を中心とする半径 1 00 の赤い円 ( 色 62<1>) を作成します。

注：画層 <1> が存在していなければなりません。

図形の更新までの流れ

省略可能な画層と線種のフィールドは省略されているので、既定値とみなされます。
コマンド : (entmake '((0 . "CIRCLE") (62 . 1) (10 10.0 20.0 0.0) (40 . 100.0)))
コマンドラインには、以下のように図形の定義データのリストが返ります。
((0 . "CIRCLE") (62 . 1) (10 10.0 20.0 0.0) (40 . 100.0))
画層 <0> に作図された赤い円

entget 関数で確認すると、以下のように表示されます。
指定した以外の情報は、自動的に付加されています。
コマンド : (setq en1 (entget(entlast)))

Step1 － entlast 関数で最後の図形を取得します。
(setq en1 (entlast))
Step2 － entget 関数で図形情報を取得します。
(setq en1 (entget en1))
Step3 － assoc 関数で en1 の画層情報を取得します。
(assoc 8 en1)

ENTLAST
ENTGET
ASSOC

7ef01cf8>) (5 . "2AD") (100. "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 1) (100 .

Step4 － cons 関数で、画層名 <1> のドット・ペアを作成します。
(cons 8 "1")

オブジェクトの操作

オブジェクトの操作((-1 . < 図形名 : 7ef039e8>) (0 . "CIRCLE") (330 . < 図形名 :CONS"AcDbCircle") (10 10.0 20.0 0.0) (40 . 100.0) (210 0.0 0.0 1.0))
Step5 － subst 関数で古い画層名と新しい画層名 <1> を入れ替え
エンティティタイプ
CIRCLE（円）

1-221

円のグループ コード
データの記入項目
8
（画層）
10
（中心点）
40
（半径）
62
（色）

オブジェクトの処理（単一図形）

ます。

SUBST

(subst (cons 8 "1") (assoc 8 en1))
Step6 － entmod 関数で、図形のデータベースを更新します。
(entmod en1)

オブジェクトの処理（単一図形）

ENTMOD
1-222

第 4 章－オブジェクトの操作
ChgLay.lsp
目的：
主要関数：

第 4 章－オブジェクトの操作
現在層を指示した図形の画層に変更する

Step3 －画層コマンドで現在層を <0> から <1> に変更します。 5
現在の画層が <1> に変更されました。

現在層を選択した図形の画層に変更します。例えば、現在の画層が <0> のときに、選択した図形の画層が <1> であれば、現在層が <1> に変更されます。
<entsel><car><entget><assoc><cdr><LAYER>

Step1 －現在の画層が <0> の時、画層 <1> の図形（線分）を選択します。 1
コマンドラインに " 現在層にしたい図形を選択：” を表示させて、現在層に変更したい
オブジェクトを選択します。
下図では、現在層は <0> ですが、画層 <1> の線分を指示して画層を <1> に変更します。

画層 <1>、線種 < 破線 >(defun C:ChgLay( / ent1 ent2 ent3 ent4); 選択したオブジェクトの画層に変更します。

(setq ent1 (entsel “¥n 現在層にしたい図形を選択：” ))1

画層 <1>、線種 < 破線 >; オブジェクトの画層名を取得します。

Step2 －変数 <ent1> には下記の情報が取得できます。

2(setq ent2 (entget (car ent1)))

3(setq ent3 (assoc 8 ent2))

4(setq ent4 (cdr ent3)); 図形の画層のドット・ペアを取得→ Step2; 画層名を取得(command “LAYER” “S” ent4 “” )5

① 1 番目のリストが図形名ですから、car 関数で取得します。 2→; 図形の情報を取得; 画層を変更します。

(< 図形名 : 7ef07b28> (918.647 1174.55 0.0))(car ent1)→ Step1］; 画層を変更→ Step3］) ;end< 図形名 : 7ef07b28>(entget (car ent1))((-1 . < 図形名 : 7ef07b28>) (0 . "LINE") (330 . < 図形名 : 7ef06cf8>) (5 . "2E5") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "1") (100 . "AcDbLine") (10 912.822
1174.55 0.0) (11 929.785 1174.55 0.0) (210 0.0 0.0 1.0))③画層名のあるドットペアは、(8 . "1") ですから、これから選択したオブジェクトの画層はオブジェクトの操作"1" であることが判ります。
④画層のドットペア (8 . "1") を、リストから取り出します。 3(assoc 8 ent2)→ (8 . "1")

⑤これから、” 1” の文字だけ取得するには、リストの 2 番目以降の情報を取得する cdr 関数を使います。 4(cdr ent3)

→ "1"

番号

関数名

①

entsel②

entget

③
④

assoc
cdr

⑤

layer

説 明
ユーザーがマウスで選択した図形 ( 図形名と座標 ) を変数 ent1 にセットします。
entsel の後に ” と ” に文字を入力すると、コマンドラインに表示されます。
文字を省いた場合は、< 図形を指示 > のメッセージが表示されます。
ent1 の中には、図形名と座標値が入っていますが、必要なのは図形名ですから
car 関数で第 1 番目の引数 ( 図形名 ) を取得しています。
図形要素リストから画層の項目だけ取り出します。(8 . 画層名 )画層名だけを取り出します。
（cdr 関数は、2 番目以降の要素を取り出します）
画層コマンドを使って、現在の画層を ent4 の画層 ( “1” ) に変更します。
(S はレイヤー変更のオプション、 ““ は画層コマンドの終了 )画層のオプションには、以下の項目があります。
（この中の < 現在の層の変更 (S)> を使います）
オプションを入力[ 一覧 (?)/ 現在の層の新規作成 (M)/ 現在の層の変更 (S)/ 新規作成 (N)/ 名前変更 (R)/ 表示 (ON)/ 非表
示 (OF)/ 色設定 (C)/ 線種設定 (L)/ 線の太さ (LW)/ 透過性 (TR)/ マテリアル (MAT)/ 印刷 (P)/ フリーズ (F)/
フリーズ解除 (T)/ ロック (LO)/ ロック解除 (U)/ 画層状態 (A)/ 説明 (D)/ 正規画層 (E)]:1-223

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-224

オブジェクトの操作②図形名の中身を展開する関数 entget を使います。 2

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

LayChg.lsp
目的：
主要関数：

選択した図形を現在層に変更する

Step4 ー① Step1 で作成した画層のドットペアと Step3 で取得したドットペアを入れ替える関数はsubst です。書式は、(subst 新しいドットペア

選択した図形の画層を現在層に移します。例えば、選択した図形の画層 <1> を現在の画層 <0> に変更します。
<getvar><cons><entsel><entget><assoc><subst><entmod>

図形名 ) です。 6(subst New_lay Old_lay ent1))② subst 関数で入れ替えた後は、必ず entmod 関数で図形情報を更新します。 7
書式は、(entmod 図形名 ) です。

Step1 －①現在の画層名を変数 <C_lay> に取得しておきます。 1(getvar “CLAYER” )古いドットペア→ 現在層の <0> が取得されます。

②この画層名のドットペアを作成します。ドットペアを作成する関数は、cons です。 2(cons 8 C_lay)→ (8 . "0")Step2 －現在の画層が <0> の時、画層 <1> の図形（線分）を選択します。 3
コマンドラインに " 現在層に移したい図形を選択：” を表示させて、現在層に移すオブジェ

画層 <0>、線種 < 実線 >クトを選択します。
下図では、選択したオブジェクトの画層は <1> ですが、現在層 <0> に移します。

線分の画層が < 0 > に変更されました。
( 現在画層は変更されません。)(defun C:LayChg( / C_lay New_lay ent1 ent2 Old_lay); 現在の画層名を取得し、ドットペアを作成します。

1(setq C_lay (getvar “CLAYER” )) ; 現在の画層名を取得する

2(setq New_lay (cons 8 C_lay)) ; 新しい画層名のドット・ペアを作成→ Step1; 現在層に移したいオブジェクトを選択します。

3(setq ent1 (entsel “¥n 現在層に移したい図形を選択：” )); 選択したオブジェクトの画層名のドットペアを取得します。

画層 <1>、線種 < 破線 >4(setq ent2 (entget (car ent1))) ; 選択した図形の情報を取得する

5(setq Old_lay (assoc 8 ent2)) ; 画層名のドット・ペアを取得する→ Step2］→ Step3; 画層のドットペアを入れ替えて、更新します。

Step3 －変数 <ent1> には下記の情報が取得できます。
(< 図形名 : 7ef07b28> (924.267 1174.44 0.0))① 1 番目のリストが図形名ですから、car 関数で取得します。
→

オブジェクトの操作(entget (car ent1))((-1 . < 図形名 : 7ef07b28>) (0 . "LINE") (330 . < 図形名 : 7ef06cf8>) (5 . "2E5") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "1") (100 . "AcDbLine")(10 912.822 1174.55 0.0) (11 929.785 1174.55 0.0) (210 0.0 0.0 1.0))③画層名のあるドットペアは、(8 . "1") ですから、これから選択したオブジェクトの画層は"1" であることが判ります。
④画層のドットペア (8 . "1") を、リストから取り出し、変数 <Old_lay> にセットします。 5

1-225

7

(entmod ent2) ; 図形情報を更新する（必須）→ (8 . "1")

オブジェクトの処理（単一図形）→ Step4) ;end< 図形名 : 7ef07b28>②図形名の中身を展開する関数 entget を使います。 4(assoc 8 ent2)(setq ent2 (subst New_lay Old_lay ent2)) ; 新旧の画層名を入れ替える

番号

関数名

①

getvar②

cons③

entsel④entget

⑤

assoc

⑥

subst

⑦

entmod説 明getvar “CLAYER” で現在画層名が取得できます。
<CLAYER> は現在画層名を格納しているシステム変数です。
8 と C_lay の二つをドットペアの組み合わせにします。( 8. C_lay )ユーザーがマウスで選択した図形 ( 図形名と座標 ) を変数 ent1 にセットします。
entsel の後に ” と ” に文字を入力すると、コマンドラインに表示されます。
文字を省いた場合は、< 図形を指示 > のメッセージが表示されます。
ent1 の中には、図形名と座標値が入っていますが、必要なのは図形名ですから
car 関数で第 1 番目の引数 ( 図形名 ) を取得しています。
図形要素リストから画層の項目だけ取り出します。
古いドットペア (8. “1” ) と、新しいドットペア (8. C_lay) を入れ替えます。
書式は、(subst new old 図形名 ) です。
データを更新します。subst を使用したときは、必ず必要です。

オブジェクトの処理（単一図形）

1-226

オブジェクトの操作(car ent1)

6

第 4 章－オブジェクトの操作
LayChg2.lsp
目的：
主要関数：

第 4 章－オブジェクトの操作
他の画層にある図形を選択して同じ画層に変更する

選択した図形の画層を他の画層にある図形を選んで、同じ画層にします。例えば、選択した図形の画層 <1> を他の画層 <0> にある図形を指示して同じ <0> 画層に変更します。
<entsel><car><entget><assoc><subst><entmod>

Step3 ー① Step1 で取得した画層のドットペアと Step2 で取得したドットペアを入れ替える関数はsubst です。書式は、(subst 新しいドットペア

古いドットペア

図形名 ) です。 7(subst lay_new lay_old en1))② subst 関数で入れ替えた後は、必ず entmod 関数で図形情報を更新します。 8
書式は、(entmod 図形名 ) です。

Step1 ー ① " 画層を変更する図形を指示：" のメッセージを表示して、画層を変更するオブジェクト
を選択します。変数 <en1> には下記の情報が取得できます。 1

左の線分の画層が右の線分の画層と同じになりました(< 図形名 : 7ef03990> (1483.01 1390.27 0.0))② 1 番目のリストが図形名ですから、car 関数で取得します。
(car en1)→< 図形名 : 7ef03990>

左：画層 <1>、線種 < 破線 >③図形名の中身を展開する関数 entget を使います。 2

右：画層 <1>、線種 < 破線 >(entget (car en1))((-1 . < 図形名 : 7ef03990>) (0 . "LINE") (330 . < 図形名 : 7ef01cf8>) (5 . "2A2") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")(10 1402.95 1350.28 0.0) (11 1871.01 1556.41 0.0) (210 0.0 0.0 1.0))④画層名のあるドットペアは、(8 . "0") ですから、これから選択したオブジェクトの画層は"0" であることが判ります。 3
左の線分を選択(defun C:LayChg2( / en1 lay_old en2 lay_new)1(setq en1 (entsel "¥n 画層を変更する図形を指示："))2(setq en1 (entget (car en1))); 図形の情報を取得

3(setq lay_old (assoc 8 en1)); 図形の画層名を取得→ Step1; 変更する画層にある図形を指示して、元の図形の画層を変更する

左：画層 <0>、線種 < 実線 >
右：画層 <1>、線種 < 破線 >4(setq en2 (entsel "¥n 変更する画層にある図形を指示："))5(setq en2 (entget (car en2))); 図形の情報を取得

6(setq lay_new (assoc 8 en2)); 図形の画層名を取得→ Step2; 選択した図形の画層名を入れ替えて、更新する

Step2 ー ① " 変更する画層にある図形を指示：" のメッセージを出して、変更する画層にあるオブジェ

7(setq en1 (subst lay_new lay_old en1))

8(entmod en1)

; 画層名の入れ替え; 図形のデータベースを更新→ Step3(princ)

クトを選択します。 4

オブジェクトの操作

取得したオブジェクトの画層のドットペアが (8 . "1") とします。
右の線分を選択

左：画層 <0>、線種 < 実線 >
右：画層 <1>、線種 < 破線 >1-227

オブジェクトの処理（単一図形）

番号 関数名① entsel② entget③ assoc④ entsel⑤ entget⑥ assoc⑦ subst⑧ entmod説 明
選択したオブジェクトの図形名と座標値のドットペアを取得します。
オブジェクトの図形名の中身を展開します。ドットペアのリストが取得できます。
リストから画層のドットペアを取得します。
（例）(8 . "0")
選択したオブジェクトの図形名と座標値のドットペアを取得します。
オブジェクトの図形名の中身を展開します。ドットペアのリストが取得できます。
リストから画層のドットペアを取得します。
（例）(8 . "1")ドットペアを入れ替えます。(subst new old 図形名 )subst で入れ替えたオブジェクトを更新します。
（必須）

オブジェクトの処理（単一図形）

1-228

オブジェクトの操作) ;end② Step1 と同様にして、このオブジェクトの画層を取得します。 5 6

txt_Ro.lsp

第 4 章－オブジェクトの操作
txt_Ro.lsp
目的：
主要関数：

選択した文字を指示した線分と同じ傾きにして配置する文字を選んで傾いた線分を指示すると、線分と同じ角度に傾きます。その後、文字を自由な位置に移動します。
<entsel><car><entget><assoc><cdr><angle><if><cons><subst><entmod><pause>

第 4 章－オブジェクトの操作
Step2 ー ① " 位置合わせする線分を選択：" のメッセージを表示して、位置合わせする線分を選択します。 5
変数 <lin_ob> には下記の情報が取得できます。
(< 図形名 : 7ef07af8> (933.975 1169.34 0.0))② 1 番目のリストが図形名ですから、car 関数で取得します。
(car lin_ob))

AutoLISP

P

IS
L
o
t

Au

→ < 図形名 : 7ef07af8>③図形名の中身を展開する関数 entget を使います。 6(entget (car lin_ob))((-1 . < 図形名 : 7ef07af8>) (0 . "LINE") (330 . < 図形名 : 7ef06cf8>) (5 . "2DF") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine")(10 924.983 1163.11 0.0) (11 957.785 1185.68 0.0) (210 0.0 0.0 1.0))④線分には角度のあるドットペアは無いので、線分の始点と終点の座標から角度を計算します。始点のドットペアは (10 924.983 1163.11 0.0) ですから、リストからこの要素を取り出します。 7

Step1 ー ① " 変更する文字を選択：" のメッセージを表示して、変更する文字を選択します。 1
変数 <txt_ob> には下記の情報が取得できます。
(< 図形名 : 7ef07ac0> (919.26 1176.18 0.0))→→ (10 924.983 1163.11 0.0)

始点の座標は、ドットペアの 2 番目以降の要素ですから、cdr 関数で取り出します。 8(cdr (assoc 10 lin_ob))② 1 番目のリストが図形名ですから、car 関数で取得します。 2(car txt_ob))(assoc 10 lin_ob)< 図形名 : 7ef07ac0>→ (924.983 1163.11 0.0)

終点の座標も同様にして取り出します。 9 10
(cdr (assoc 11 lin_ob))→ (957.785 1185.68 0.0)

③図形名の中身を展開する entget 関数を使います。 3(entget txt_ob0)((-1 . < 図形名 : 7ef07ac0>) (0 . "MTEXT") (330 . < 図形名 : 7ef06cf8>) (5 . "2D8") (100. "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText")(10 916.12 1178.49 0.0) (40 . 2.5) (41 . 618.96) (46 . 0.0) (71 . 1) (72 . 5) (1 . "AutoLISP")(7 . "STANDARD") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 13.0) (43 . 2.5) (50 . 0.0) (73 . 1)
(44 . 1.0))④角度のあるドットペアは、(50 . 0.0) ですから、これから選択した文字の角度は "0.0" であることが判ります。 4

Step3 ー ①文字の角度は 1 つですが、線分の角度は 2 通りあります。

オブジェクトの操作かを判断し、この傾きでない時は始点と終点の座標を入れ替えます。 11 12
始点 (pt1)

終点 (pt2)

to
Au

o

LI

SP

A
u
t

オブジェクトの処理（単一図形）

P

1-229

LI
S

始点 (pt1)－ 135°

45°
終点 (pt2)

オブジェクトの処理（単一図形）

1-230

オブジェクトの操作

文字の傾きは、<-90° > から <90° > の間ですから、線分の傾きがこの間にあるかどう第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

まず線分の初期値の傾きを angle 関数で取得します。

(defun C:txt_Ro( / txt_ob txt_ob0 txt_ob1 txt_ang_old lin_ob lin_st lin_en ang)

(setq ang (angle lin_st lin_en))
この角度 angle（ラジアン）が、90° (1.57 ラジアン ) から 270° (4.71 ラジアン ) の間であれば、180° (3.14 ラジアン ) を差し引きます。（加えても同じです。）
Step4 ー ①文字角度のドットペアと替えるために、線分の角度のドットペアを 作成します。
ドットペアを作成する関数は、cons です。 13(cons 50 ang)); 角度を変更する文字を選択します。

1(setq txt_ob (entsel "¥n 変更する文字を選択："))2(setq txt_ob0(car txt_ob))3(setq txt_ob1 (entget txt_ob0))

4(setq txt_ang_old(assoc 50 txt_ob1)); 文字図形を取得; 文字の図形名を取得; 文字情報（ドット・ペア）のリストを取得→ Step1; 文字角度のドット・ペアを取得→ (50 . ang)
; 傾いた線分を指示します。

② Step1 で取得した文字角度のドットペアと線分角度のドットペアを入れ替える関数はsubst です。書式は、(subst 新しいドットペア

古いドットペア

図形名 ) ですから、(subst 線分の角度 文字の角度 文字の図形名 )) になります。 14③ subst 関数で入れ替えた後は、必ず entmod 関数で図形情報を更新します。 15
書式は、(entmod 文字の図形名 ) です。

Step5 －線分の角度に傾けた文字を、マウスで自由な位置に移動します。 16

5(setq lin_ob (entsel "¥n 位置合わせする線分を選択："))6(setq lin_ob (entget (car lin_ob)))

7(setq lin_st(assoc 10 lin_ob))8(setq lin_st(cdr lin_st))9(setq lin_en(assoc 11 lin_ob))10(setq lin_en(cdr lin_en)); 線分を選択; 線分情報（ドット・ペア）のリストを取得; 線分の始点の座標のドット・ペアを取得; 始点の座標を変数にセット→ Step2; 線分の終点の座標のドット・ペアを取得; 終点の座標を変数にセット"MOVE" txt_ob0 "" pause pause); 線分の傾きが、(-90° ) から (+90° ) の間にあるかどうかをチェックします。

文字オブジェクト <txt_ob0> の次の <""> は選択が終了の意味です。
①最初の pause は移動の基点の指示を待ちます。②次の pause は目的点の指示を待ちます。

11(setq ang (angle lin_st lin_en)); 始点から終点への角度を計算(if (and (> ang 1.57)(< ang 4.71))①移動の基点を指示します。

②移動の目的点を指示します。

(setq ang (- ang 3.14))

12

Point!

) ;if; もし、角度が 90°から 270°の間だったら; 角度 ang に 180°減算して、角度を反転する→ Step3;（または加算）; 選択した文字の角度を、線分の角度と入れ替えます。

ISO 基準の文字の回転角度(setq txt_ang_new (cons 50 ang))

14(setq txt_ob1 (subst txt_ang_new txt_ang_old txt_ob1))

15(entmod txt_ob1); 線分角度のドット・ペアを作成; 新旧の角度を入れ替える→ Step4; オブジェクトの更新処理; 文字を自由な位置に移動します。
16(command "MOVE" txt_ob0 "" pause pause); 回転した文字をマウスで移動(princ)→ Step5］) ;endPoint!
ang はラジアンですから、<90°～ 270° > は <1.57 ～ 4.71 ラジアン >になります。また、<180° > は <3.14 ラジアン > に置き換えて計算します。

1-231

オブジェクトの処理（単一図形）

オブジェクトの処理（単一図形）

1-232

オブジェクトの操作

オブジェクトの操作③回転移動の結果

13

第 4 章－オブジェクトの操作
番号
関数名① entsel② car③ entget④ assoc⑤ entsel⑥ entget⑦ assoc⑧ cdr⑨ assoc⑩ cdr⑪ angle⑫ if⑬ cons⑭ subst⑮ entmod⑯ "MOVE"

第 4 章－オブジェクトの操作

説 明選択したオブジェクトの図形名と座標値のドットペアを取得します。
ドットペアの第一番目の要素を取得します。
オブジェクトの図形名の中身を展開します。ドットペアのリストが取得できます。
リストから角度のドットペアを取得します。（例）(50 . 角度 )選択したオブジェクトの図形名と座標値のドットペアを取得します。
ドットペアの第一番目の要素を取得し、図形名の中身を展開します。
リストから始点のドットペアを取得します。（例）(10 . 始点 )ドットペアの第二番目の要素を取得します。（始点の座標）リストから終点のドットペアを取得します。（例）(11 . 終点 )ドットペアの第二番目の要素を取得します。（終点の座標）
2 点間の角度を取得します。
角度が <-90° > から <+90° > の間にあるかどうかを判断します。
新しい角度のドットペアを作成します。（例）(50 . 角度 )ドットペアを入れ替える関数です。(subst new old 図形名 )subst で入れ替えたオブジェクトを更新します。（必須）
移動コマンドで文字を移動します。（pause はユーザーの指示待ちです。）

Point!
文字を移動する時に、文字の挿入点を変更する（左下から中央下など）ことによって、選択した文字を線分や円弧の中央に自動的に移動させることができます。
Step1 －文字を記入した場合、挿入基点の初期値は左下です。

第2節

オブジェクトの処理（複数図形）

前節では、オブジェクトを 1 つずつ編集しましたが、複数のオブジェクトをまとめて編集するには選択セットというグループにして編集を行います。
AutoLISP には、この選択セットを処理するための多くの関数があります。
選択セットを作成する最も一般的な方法として ssget 関数があります。この関数を使用して、次のいずれかの方法で選択セットを作成できます。
①図面全体を選択する。
② [ 最後 (L)]、[ 直前 (P)]、[ 窓 (W)]、[ 暗黙 (I)]、[ ポリゴン窓 (WP)]、[ 交差 (C)]、[ ポリゴン交差 (CP)]、[ フェンス (F)] のいずれかのオプションを使用して、選択するオブジェクトを指定する。
③オブジェクトのプロパティ（画層・色・線種など）で選択するオブジェクトを指定する。
④オブジェクトのジオメトリ（位置・大きさなど）で選択するオブジェクトを指定する。
⑤関係演算子で選択するオブジェクトを指定する。
⑥論理演算子で選択するオブジェクトを指定する。
上記のどの方法を使用しても、フィルタリングを使用して属性や条件のリストを指定し、それらに一致するオブジェクトをまとめて選択できます。

(11 0.0 0.0 0.0) は他の挿入基点ですが、無い場合は <0.0 0.0 0.0> になっています。
コマンド : (setq ent1 (entget (entlast)))((-1 . < 図形名 : 7ef335a0>) (0 . "TEXT") (330 . < 図形名 : 7ef21cf8>) (5 . "22C") (100 . "AcDbEntity") (67 . 0)(410 . "Model") (8 . "0") (100 . "AcDbText") (10 58.185 55.1429 0.0) (40 . 24.713) (1 . "AutoLISP") (50 . 0.0) (41. 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 0))

オブジェクトの操作

Step3 －文字の挿入基点を変更するコマンド [JUSTIFYTEXT] で、新しい挿入点を <BC> に変更します。

Step4 －再度、この文字の情報を確認します。今度は新しい挿入点の座標 (11 131.093 47.8268 0.0) が表示されているのが判ります。
コマンド : (setq ent2 (entget (car(entsel))))((-1 . < 図形名 : 7ef335a0>) (0 . "TEXT") (330 . < 図形名 : 7ef21cf8>) (5 . "22C") (100 . "AcDbEntity") (67 . 0)(410 . "Model") (8 . "0") (100 . "AcDbText") (10 58.185 55.1429 0.0) (40 . 24.713) (1 . "AutoLISP") (50 . 0.0)(41. 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 1) (11 131.093 47.8268 0.0) (210 0.0 0.0 1.0) (100 . "AcDbText")(73 . 1))

1-233

オブジェクトの処理（単一図形）

使用頻度の高い AutoLISP の 選択セット操作関数を、次の表に示します。
（順不同）①選択セット操作関数（オブジェクトを選択）関 数
説 明(ssget [mode] [pt1 [pt2]] [pt-list] オブジェクト ( 図形 ) を選択するようユーザーに要求し、
選択セッ[filter-list])
トを返します。
②選択セット操作関数（オブジェクトのセットへの追加と削除）
関 数
説 明
選択セットにオブジェクト ( 図形 ) を追加、または新しい選択セッ(ssadd [ename [ss]])トを作成します。引数を指定しないと、エンティティを含まな
い選択セットを作成します。
(ssdel enamess)
選択セットからオブジェクト ( 図形 ) を除去します。
③選択セット操作関数（選択セットの情報を取得）
関 数
説 明
選択セットに含まれるオブジェクト ( 図形 ) の数を示す整数を返(sslength ss)
します。
指定されたオブジェクト ( 図形 ) が選択セットのメンバーかど(ssmemb enamess)
うかを調べます。含まれている時は、選択セット名を返します。
含まれていない時は、nil を返します。
選択セットの指定されたインデックス番号の要素のオブジェク(ssname ss index)
ト ( 図形 ) 名を返します。番号は、0 から ( エンティティ数 -1)の範囲です。

オブジェクトの処理（単一図形）

1-234

オブジェクトの操作

Step2 －この文字の図形情報を確認すると、挿入基点は (10 58.185 55.1429 0.0) に表示されます。

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

1 選択セット操作関数（オブジェクトを選択）

ssget

複数の図形を選択する

1.entsel 関数は 1 つの図形しか選択できませんが、ssget 関数は窓選択や交差選択を使って、一度にSSGET図形群を選択します

複数の図形を選択することができます。
(ssget)(setq en1 (ssget))オブジェクトを選択 :→ メッセージに従って、複数のオブジェクトを選択します。

<Selection set: 4>→ コマンドラインに選択セットが表示されます。

コマンド : !en1

→ コマンドラインに <!en1> と入力します。

<Selection set: 4>→ 選択セットが確認できます。

この関数は < 図形を指示 > のプロンプトを表示して、マウスの右ボタンを押すまで図形の選択状
態になります。
2. 例えば、線分と円を選択して変数 ent1 にセットします。( オブジェクトは 2 つ )(setq ent1 (ssget))
3. この変数 ent1 の中に、オブジェクトがいくつあるかを調べる関数が、sslength です。

図形を選択するオプションを以下の表に示します。

(setq ent2 (sslength ent1))

選択のオプション(ssget "P")(ssget "L")(ssget "W" P1 P2)(ssget "C" P1 P2)
Point!
(ssget "C" P1 P1)(ssget "WP" P1 P2・・)(ssget "WC" P1 P2・・)(ssget "F" P1 P2・・)(ssget "X" (list (cons 0 "LINE")))

キーボードから <!ent2> と入力すると、コマンドラインに <2> が返ります。

意 味
直前に選択した図形群を再度選択します。
最後に描いた図形を選択します。
窓で囲んだ図形群を選択します。
交差で囲んだ図形群を選択します。
点 p1 を通る図形群を選択します。
多角形窓で囲んだ図形群を選択します。
多角形交差で囲んだ図形群を選択します。
フェンスで囲んだ図形群を選択します
線分を選択します。

と入力します。

4. 複数のオブジェクトを持つ変数 ent1 から、1 つのオブジェクトを取り出す関数が、ssname です。
(setq ent3 (ssname ent1 0)と入力すると、線分か円のどちらかが変数 ent3 にセットされます。

( 番号は、<0> から数えていきます）
5. この次の段階からは先ほどの entsel 関数の場合と同様に、entget 関数を使ってこのオブジェクトの情報を取得していきます。

ssget に対する最初の引数は、どの選択オプションを使用するかを指定する文字列です。
選択オプションとしてポリゴン ( フェンス、ポリゴン交差、ポリゴン窓 ) を使用する場合は、Point!

引数として点のリスト (P1 P2・・) を指定する必要がありますが、最後の引数 ( 点のリスト ) は

複数の図形を選択して、選択した図形がいくつあるかをコマンドラインに表示する処理

省略可能です。

は次のように記述します。

コマンドラインに、(ssget) だけを入力すると、AutoCAD のメッセージが表示されます。
コマンド : (ssget)

オブジェクトの操作

オブジェクトを選択 :Point!

(ssget P1) と (ssget "C" P1 P1) との違いについて
左図のように、点 P1(100,100) で２本の線分が交差している場合に、(ssget P1) では、2 本の線分のどちらかしか取得できません。
両方の線分を取得するには、(ssget "C" P1 P1)と記述します。

1-235

オブジェクトの処理（複数図形）(defun C:T_ssget( / ent1 n_ent)(setq ent1 (ssget))→ < 図形を指示 > のプロンプトが表示される(setq n_ent (sslength ent1))→ 選択した図形の数を取得する(prompt “¥n 選択した図形の数は “)→ メッセージを表示する(princ n_ent)→ コマンドラインに図形の数を表示する

オブジェクトの操作

次の 2 つの引数 pt1 と pt2 は、選択オプションに応じて点の値を指定します ( 省略できます )。

);endprompt・・・コマンドラインに”” の中の文字を表示します。
princ・・・後に続く文字または変数の内容をそのままコマンドラインに表示します。

オブジェクトの処理（複数図形）

1-236

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

DimUp.lsp

寸法値に直径記号 < Φ > を付加する
SSGET 関数を使用して、寸法値に直径記号 < Φ > を付加します。
このプログラムは、自動寸法記入された寸法図形にのみ有効です。
<prompt><ssget><dim1>

目的：
主要関数：

①コマンドラインに " 直径記号を付加する寸法値を指示：" を表示します。
(prompt "¥n 直径記号を付加する寸法値を指示：")②寸法オブジェクトを 1 つ選択して、エンターを押します。
(ssget) は複数のオブジェクトを選択できますが、この場合は 1 本だけの処理を行います。

2 選択セット操作関数（オブジェクトの選択セットへの追加と削除）
SSADD(setq ss1 (ssadd))→ 空の選択セットを作成します。

<Selection set: 6>→ コマンドラインに空の選択セットが表示されます。

(setq sslen (sslength ss1))→ 選択セット <ss1> にある図形の数を求めます。

0→ <0> であることが判ります。

(setq ent1 (car (entsel)))→ 他の図形を選択し、そのエンティティ名を ent1 とします。

オブジェクトを選択 :→ メッセージに従って、1 つのオブジェクトを選択します。

(setq ss1 (ssadd ent1 ss1))→ エンティティ <ent1> を選択セット <ss1> に加えます。

(setq sslen (sslength ss1))→ 選択セットの数を求めます。

1→ 選択セットの数が確認できます。
（１増加しています）③ (command "DIM1" "NEW" "%%C<>" en1 "")SSDEL

寸法値に <> が表示されているときは、修正されていない寸法値になります。
もし、"100" などの実際の数字が表示されているときは、寸法値が修正されています。

図形群に図形を新たに加えます

図形群の中から、指定した図形を削除します(setq sslen (sslength ss1))→ 選択セットの数を確認します。

1→ 選択セットの数が表示されます。

(setq ss1 (ssdel ent1 ss1))→ 選択セット <ss1> の中から、エンティティ <ent1> を削除。

<Selection set: 6>→ コマンドラインに選択セットが表示されます。

(setq sslen (sslength ss1))→ 選択セット <ss1> にある図形の数を求めます。

0→ <0> であることが判ります。
（１減少しています）

直径記号（φ）は、<%%C> で表します。

(defun C:DimUp( / en1)

1

(prompt "¥n 直径記号を付加する寸法値を指示：")2(setq en1 (ssget))3(command "DIM1" "NEW" "%%C<>" en1 "") ; 寸法値に < Φ > 記号を付加

4(princ);1 本の寸法値を選択;<nil> を表示させない) ;end番号
関数名① prompt② ssget③"DIM1" "NEW" "%%C<>"

④

princ

1-237

説 明
コマンドラインにメッセージを表示します。
オブジェクトの選択を指示する関数です。
寸法値をφ <%%C> に置き換えます。<> は自動寸法の数値を表します。
最後の行に、<nil> を表示させません

オブジェクトの処理（複数図形）

Point!

オブジェクトの操作

オブジェクトの操作; コマンドラインにメッセージを表示

ssdel 関数は、図形自体を削除するのではありません。
・変数 (a) の値を空にする→ (setq a nil)・図形 (ent1) を図面内から削除する→ (command "ERASE" ent1)

・図形 (ent1) を選択セット (ss1) から削除する→ (ssdel ent1 ss1)​

・選択セット (ss1) を空にする→ (setq ss1 nil)

・選択セット (ss1) を削除する→ (command "ERASE" ss1)

オブジェクトの処理（複数図形）

1-238

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

sslength と ssname の関係を次のプログラムで考えてみましょう。

sslength と ssname の関係

3 選択セット操作関数（選択セットの情報を取得）
SSNAME

選択した図形群の中から、指定した番目の図形を返します

sslength と ssname の関係を次のプログラムで考えてみましょう。
半径 <25> の円を含む複数の円を ssget 関数で選択し、それぞれの半径を <50> に変更します。

選択した図形群は、<0> からの連番になります。
(setq en1 (ssget))オブジェクトを選択 :→ メッセージに従って、複数のオブジェクトを選択します。

(setq ss1 (ssname en1 1))→ 選択セットの 2 番目のエンティティを選択します。

コマンド : !ss1

→ コマンドラインに < !ss1 > と入力します。

< 図形名 : 7ef03550>→ 選択セットの 2 番目のエンティティが表示されます。
Step1 － ssget 関数で、複数の円を選択します。

SSLENGTH

選択した図形群の数を返します(setq en1 (ssget))オブジェクトを選択 :→ メッセージに従って、複数のオブジェクトを選択します。

<Selection set: 4>→ コマンドラインに選択セットが表示されます。

(setq ss1 (sslength en1))→ 選択した図形の数を求めます。

(setq en1 (ssget))Step2 － sslength 関数で、選択した図形の数を取得します。
(setq ent_len (sslength en1))
Step3 － repeat 関数で、以下を ent_len 回繰り返します。
（例は半径 <25>）①半径 <25> と <50> のドット・ペアを作ります。(cons 関数 )コマンド : !ss1

→ コマンドラインに < !ss1 > と入力します。

②半径 <25> を <50> と入れ替えます。(subst 関数 )2

→ 選択した図形の数が確認できます。

③図形情報を更新します。(entmod)

SSMEMB

図形群の中に指定した図形があるかどうか調べます

Step4 － en1 に図形が複数ある場合は、最後の図形まで Step3 を繰り返し

SSGET
SSLENGTHREPEATCONS
SUBSTENTMODます。
(setq mem1 (ssmemb ss2 ss1))→ エンティティ <ss2> が選択セット <ss1> のメンバーかどうか調べます。

Point!

コマンド : !mem1→ コマンドラインに < !mem1 > と入力します。

く場合に、一般的に repeat 関数を使用しますが、その repeat する回数は< 図形名 : 7ef03558>→ 図形がある場合は、エンティティ名が表示されます。

sslength 関数で得ることが出来ます。

nil→ 図形が無い場合は、<nil> が表示されます。

ssname 関数は、選択セットから図形を 1 つずつ取り出します。

オブジェクトの操作

オブジェクトの操作

ssget 関数で取得した図形の情報を 1 つ 1 つ取り出して、変更を加えて行書式は (ssname 選択セット名 <0 からの番号 >) です。
ですから、sslength 関数と ssname 関数はセットでよく使用されます。
繰り返しの関数には while 関数もありますが、こちらは繰り返しの回数が判らない場合に有効です。
上の例では、選択セットの中が <nil> になるまで繰り返す処理で同じ結果を得ることができます。

1-239

オブジェクトの処理（複数図形）

オブジェクトの処理（複数図形）

1-240

第 4 章－オブジェクトの操作
del_lay.lsp
目的：
主要関数：

第 4 章－オブジェクトの操作②これを個々の要素に展開するのは、entget 関数です。 2

選択した図形と同じレイヤーにある図形をすべて削除(setq en1 (entget en1))

選択した図形と同じレイヤーにある図形をすべて削除します。
<entsel><car><entget><assoc><cdr><cons><list><ERASE>→ ((-1 . < 図形名 : 7ef03a08>) (0 . "CIRCLE") (330 . < 図形名 : 7ef01cf8>) (5 . "2B1")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "1") (100 . "AcDbCircle")

手順 1 －画層 <1> の図形 ( 円 ) を選択します。

(10 774.777 1171.83 0.0) (40 . 169.982) (210 0.0 0.0 1.0))
この中にある (8 . "1") が画層の情報です。
③ ssget 関数で、(8 . "1") だけを取り出す関数は、assoc です。 2(setq ent_lay (assoc 8 en1))

画層 <0>、線種 < 実線 >→ (8 . "1") が取得できます。

④このドットペアの 2 番目以降を取り出す関数は、cdr です。 2
画層 <1>、線種 < 破線 >(setq ent_lay (cdr ent_lay))→ "1" が取得できます。

変数 ent_lay に "1" がセットされます。
画層 <2>、線種 < 一点鎖線 >画層 <3>、線種 < 二点鎖線 >Step3 －① ssget 関数のフィルター用に画層のドットペアを作成します。 3(list (cons 8 ent_lay))→ cons 関数で (8 . 画層名 ) のドットペアを作成します。

②選択セット (ssget “X” ) のフィルタで、この画層のオブジェクトを全て選択します。 3
手順 2 －同じ画層 <1> の他の図形（長方形）も削除されます。

Step4 －削除コマンドで、この選択セットを削除します。 4(defun C:del_lay( / ent_1 ent_lay ss_set); オブジェクトを選択します。

画層 <0>、線種 < 実線 >(setq en1 (entsel "¥n 削除するレイヤーの図形を指示 :"))

1

; 選択したオブジェクトの画層名を取得します。

画層 <1>、線種 < 破線 >2

(setq ent_lay (cdr (assoc 8 (entget (car en1)))))

画層 <3>、線種 < 二点鎖線 >; 選択したセットを削除します。

(command "ERASE" ss_set "")オブジェクトの操作

4
Step1 －削除したいオブジェクトを 1 つ選択します。

→ Step4］(princ)① entsel 関数でオブジェクトを選択します。 1) ;end→ (< 図形名 : 7ef039a8> (1550.76 814.941 0.0))
番号

Step2 －① en1 から図形名だけを取り出すには、car 関数を使います。 2

1-241→ Step3］→ < 図形名 : 7ef039a8>

オブジェクトの処理（複数図形）

関数名①entsel

②

assoc

③

ssget “X”④

"ERASE"説 明
ユーザーが選択した図形を変数 ent1 にセットします。
entsel 関数は 1 つの図形しか選択できません。
画層のグループコードは <8> ですから、entget 関数で取り出した図形情報か
ら画層名を取り出し、その画層名だけを変数 ent_lay にセットします。
図面に存在する図形から、(8 . ent_lay) に合致するオブジェクト取得し、変数
ss_set にセットします。
取得したオブジェクト群を削除します。

オブジェクトの処理（複数図形）

1-242

オブジェクトの操作(setq ss_set (ssget "X" (list (cons 8 ent_lay))))3(setq en1 (car en1))→ Step2］; 選択したオブジェクトの画層と同じオブジェクトを取得します。

画層 <2>、線種 < 一点鎖線 >(setq en1 (entsel))→ Step1］

第 4 章－オブジェクトの操作
M_chglay.lsp
目的：
主要関数：

第 4 章－オブジェクトの操作

複数の図形を選択して、そのすべての図形の画層を現在層に変更する
選択した全てのオブジェクトを現在層に移します。
<getvar><cons><ssget><sslength><repeat><ssname><entget><assoc><subst><entmod>→ 現在層の <0> が取得されます。

②この画層名のドットペアを作成します。ドットペアを作成する関数は、cons です。 2
New_lay (cons 8 C_lay)① ssname 関数でオブジェクトを順番に取り出す <i> の初期値を <0> にセットします。 5(setq i 0) ← ssname 関数は <0> からカウントします。
②選択セット数 <n_ent> に達するまで繰り返します。 6③選択セット <ent> から 1 つずつ取り出し、変数 <ent1> にセットます。 7

Step1 －①現在の画層名を変数 <C_lay> に取得しておきます。 1(getvar “CLAYER” )Step3 － repeat 関数でオブジェクトの数 (n_ent) だけ、画層の変更を繰り返します。

→ (8 . "0")

書式は、
（ssname 選択セット名 順番 )→ ent1 (ssname ent i)④ entget 関数で ent1 の中身の情報を取得します。
（ドット・ペアの集まり） 8⑤画層のドット・ペア (8 . 画層名 ) から、そのオブジェクトの画層のドット・ペアを
変数 <Old_lay> に代入します。 9→ Old_lay (assoc 8 ent2)⑥現在層のドット・ペア <New_lay> とオブジェクトの画層のドット・ペア <Old_lay> を

Step2 －①現在の画層を変更したいオブジェクトを複数選択します。 3(ssget) 関数は、< オブジェクトを選択 :> のメッセージを表示します。
変数 <ent> には選択セット名 <Selection set: 1d2> が自動的に付けられます。
この例では、現在の画層が <0> の時、画層 <1> と <2> と <3> の図形を選択します。

subst 関数で入れ替えます。 10⑦入れ替えた後は、必ず entmod 関数でオブジェクトを更新します。 11⑧選択セットの数 <n_ent> まで、repeat を繰り返します。 12

選択した図形の画層が < 0 > に変更されました。( 画層は変更されません。)
画層 <0>、線種 < 実線 >画層 <1>、線種 < 破線 >画層 <0>、線種 < 実線 >画層 <2>、線種 < 一点鎖線 >画層 <0>、線種 < 実線 >画層 <3>、線種 < 二点鎖線 >画層 <0>、線種 < 実線 >②選択したオブジェクトの数を変数 <n_ent> にセットします。 4

画層 <0>、線種 < 実線 >オブジェクトの操作

オブジェクトの操作(sslength ent) で、選択したオブジェクトの数を取得します。

p2
マウスで p1-p2 と囲って3 本の線分を選択します。

p1

1-243

オブジェクトの処理（複数図形）

オブジェクトの処理（複数図形）

1-244

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作
Chg_txt.lsp(defun C:M_chglay( / C_lay New_lay ent1 N_ent i ent2 Old_lay)

目的：
主要関数：

; 現画層名を取得し、ドットペアを作成します。

1(setq C_lay (getvar "CLAYER")); 現在の画層を取得

2(setq New_lay (cons 8 C_lay)); 画層のドット・ペアを作成(setq ent (ssget))4(setq n_ent (sslength ent))

Step1 －① “大きさを変更する文字を指示：” のメッセージを表示して、文字の大きさを変更したい
文字を複数選択します。 1; 画層を変更する図形を選択; 選択した図形の数を変数にセット→ Step2(setq i 0)

6(repeat n_ent② (ssget) 関数は、< オブジェクトを選択 :> のメッセージを表示します。 2‘((0 . “TEXT”)) は選択したオブジェクト群から図形タイプが文字 <TEXT> だけを取得します。

; オブジェクトの数だけ repeat します。

5

選択した全ての文字の大きさを指定した大きさに変更します。
<prompt><ssget><sslength><getdist><cons><repeat><entget><ssname><assoc><subst><entmod><1+>→ Step1; オブジェクトを選択し、その数をセットします。

3

選択した文字の大きさを指定した大きさに変更する③取得した文字のオブジェクトの数を変数 <ent_len> に代入します。 3; 図形のカウントを <0> にセット（ssname は <0> から始まるため）; 図形の数だけ繰り返す

7(setq ent1 (ssname ent i)); 選択群から 1 つ取り出す

8(setq ent2 (entget ent1)); その図形のドット・ペアのリストを取得

9(setq Old_lay (assoc 8 ent2))

10(setq ent2 (subst New_lay Old_lay ent2))

11(entmod ent2)

12(setq i (1+ i)); 画層のドット・ペアを取得

文字高さの違う 3 つの文字を選択し、文字高さを < 5 > に変更します。

文字高さ <10>→ Step3; 画層を入れ替える; 更新処理文字高さ <20>;ssname 関数のカウントを 1 つ加えて、⑥から繰り返す) ;repeat) ;end

②

cons

③

ssget

④

sslength⑤⑥(setq i 0)
repeat⑦

ssname⑧entget

⑨

assoc

⑩

subst

⑪

entmod

⑫

1+ i

説 明
getvar "CLAYER" で現在の画層名を取得します。
画層の要素リスト ( ドットペア ) を作ります。画層のグループ コードは <8> です。
現在の画層が <1> のときは、変数 C_lay は <1> になっています。
したがって、ここで ( 8 . "1" ) の組み合わせができます。
コマンドラインに < 図形選択：> の文字が表示されます。
ユーザーが選択した複数の図形群が変数 ent にセットされます。
選択した図形群の中に図形がいくつ存在しているかを調べます。
その数を変数 n_ent にセットします。
ssname 関数で取り出すための初期値をセットします。(0 から開始するため )下記⑦から⑪までを、図形の数 (n_ent) だけ繰り返します。
図形群から図形を 1 つずつ取り出す関数です。
(ssname 選択セット名 何番目の図形か )entget 関数は選択した図形の情報をドットペアのリストで取得します。
画層のドットペアを取り出します。
画層のグループ コードは <8> ですから、要素リストが <8> のドットペアを取り出し、変数 Old_lay にセットします。
要素リスト ( ドットペア ) を入れ替える関数です。
(subst 新画層名 旧画層名 図形名 )データベース情報を更新させる関数です。
最後にこれを宣言しないと、図形は変更されません。
カウント変数 <i> に 1 を加えて、繰り返します。（１と＋に空白はありません）

Step2 －① ““新しい文字の大きさを入力：” のメッセージを表示して、新しい文字の大きさを指定します。getdist 関数はキーボードからの入力でもマウスで画面上で長さを指示することもできます。 4②文字の大きさのドットペア (40 . 文字の大きさ ) 作成し、変数 <new_tsi> に代入します。
→ new_tsi (assoc 40 new_tsi) 5
これは次の repeat 関数で、1 つ 1 つの文字オブジェクトの文字の大きさのドットペアと入れ替えるために、入れ替え用の新しいドットペアを事前に作成しておくためです。
p2

マウスで p1-p2 と囲って3 つの文字を選択します。

p1

1-245

オブジェクトの処理（複数図形）

オブジェクトの処理（複数図形）

1-246

オブジェクトの操作

オブジェクトの操作

番号
関数名① getvar

文字高さ <30>

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

Step3 － repeat 関数でオブジェクトの数 (ent_len) だけ、文字の大きさの変更を繰り返します。
① ssname 関数のカウント変数 <i> の初期値を <0> にセットします。 66(setq i 0)7(repeat ent_len②選択セットの数 <ent_len> に達するまで繰り返します。 78(setq old_obj (entget (ssname ent_obj i)))

③選択セット <ent_obj> から 1 つずつ取り出します。 89(setq old_tsi (assoc 40 old_obj))

10(setq old_obj (subst new_tsi old_tsi old_obj))④ entget 関数で ent_obj の情報を取得します。（ドットペアのリスト）

11(entmod old_obj)⑤選択したオブジェクトの文字の大きさのドットペア (40 . 文字の大きさ ) を変数 <old_tsi>

12(setq i (1+ i))(setq i 0)

書式は、
（ssname 選択セット名 順番 )→ (ssname ent_obj i)に代入します。 9→ old_tsi (assoc 40 old_obj);ssname 関数で順番に取り出すカウントの初期値を <0> にセット; 選択した文字の数だけ繰り返す; 選択した文字の 1 つを取得

; 文字の大きさのドット・ペアを取得→ Step3; 文字の大きさを入れ替える; 図形を更新; カウントを <1> 加えて、⑦から繰り返す) ;repeat⑥新しい < 文字の大きさ > のドットペア <new_tsi> と古い < 文字の大きさ > のドットペア) ;end

書式は、(subst 新しい文字の大きさ

古い文字の大きさ

文字オブジェクト ) です。

⑦入れ替えた後は、必ず entmod 関数でオブジェクトを更新します。 11⑧選択セットの数 <ent_len> まで、repeat を繰り返します。 12

選択した文字の高さが <5> に変更されました。

文字高さ <5>

文字高さ <5>

番号
関数名① prompt
②

ssget

③

sslength④

getdist

⑤

cons

⑥

(setq i 0)⑦

repeatssname⑧entget

文字高さ <5>

オブジェクトの操作(defun C:Chg_txt( / ent_obj ent_len new_tsi i old_obj old_tsi); 高さを変更する文字を選択して、選択した数を取得します。

1(prompt “¥n 大きさを変更する文字を指示：” )2(setq ent_obj (ssget ‘((0 . “TEXT” ))))

3

(setq ent_len (sslength ent_obj)); 文字オブジェクトだけを取得→ Step1

⑨

assoc

⑩

subst

⑪

entmod

⑫

1+ i

説 明
“ から “の文字をコマンドラインに表示します。
ユーザーに図形を選択させます。
‘((0 . “TEXT” )) は選択した図形群から文字の図形だけを取得し、変数 ent_objにセットします。
選択した図形群の中に図形がいくつ存在しているかを調べます。
その数を変数 n_ent にセットします。
文字の高さを入力します。
（キーボードからでも図面上からでも構いません。
）
文字の大きさの要素リスト ( ドット・ペア ) を作成します。
文字高さのグループ コードは <40> ですから、40 の要素リスト ( ドット・ペア )を作成し、文字高さの変数 new_tsi をセットします。
ssname 関数で取り出すための初期値をセットします。
( ⑧の ssname 関数が <0> から開始するため )下記⑧から⑪までを、文字の数だけ繰り返します。
図形群から図形を 1 つずつ取り出す関数です。
(ssname 図形群の変数名 何番目の図形 )entget 関数は選択した図形の情報を取得します。
1 つの文字の要素リスト ( ドット・ペア ) を取り出します。
文字高さのグループ コードは <40> ですから、40 の要素リスト ( ドット・ペア )を取り出し、変数 old_tsi にセットします。
要素リスト ( ドット・ペア ) を入れ替える関数です。
(subst 新要素リスト 旧要素リスト 対象の図形名 )データベース情報を再計算させる関数です。
最後にこれを宣言しないと、図形は変更されません。
カウント変数 <i> に 1 を加えて、⑦から繰り返します。
<1+> は関数です。
（１と＋に空白はありません）; 文字オブジェクトの数を取得; 新しくする文字の大きさを入力して、ドット・ペアを作成する

1-247

4

(setq new_tsi (getdist “¥n 新しい文字の大きさを入力：” ))5(setq new_tsi (cons 40 new_tsi)); 新しい文字の大きさのドット・ペアを作成

オブジェクトの処理（複数図形）→ Step2

オブジェクトの処理（複数図形）

1-248

オブジェクトの操作<old_tsi> を subst 関数で入れ替えます。 10

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

NagaChk.lsp

線分と円の長さの合計を計算する;; 円周を加算していく

図面内にある線分と円の長さの合計を計算します。
P1-80 の（円弧の弧長を測定）と P1-254 の ( 線分の長さを測定）の応用例です。
<ssget><if><sslength><count><ssname><entget><assoc><cdr><distance><prompt><princ>

目的：
主要関数：

(setq b1 (ssget “x” ‘((0 . “CIRCLE” )))) ; 図面内の円のみ取得する

10(if (/= b1 nil) ; 円の図形が存在すれば、以下の処理を行う(progn(setq num (sslength b1))

11

; 円オブジェクトの個数を変数 <num> に代入(setq nagasa_2 0); 円周の初期値を <0> にセット

(setq i 1)

; 個数のカウントを <1> にセット

(while (<= i num)

; オブジェクトの数だけ円周を計算する(setq b2 (ssname b1 (- i 1)))

12

; 円を順番に取り出す（一番目は <0> から）(setq b3 (entget b2)) ; 円の図形名を変数 <b3> に代入(setq rad(cdr (assoc 40 b3)))(setq dist (* 2 pi rad ))13; 円の半径を取得する; 円周を計算する(setq nagasa_2 (+ nagasa_2 dist))(setq i (+ 1 i)); 円周を加算する; カウントを 1 つ加えて、次のオブジェクトに移る);while);progn(setq nagasa_2 0)14; 円の図形がない場合は、円の合計長さを <0> にセット);if;; 合計値をコマンドラインに表示(prompt “¥n 線分の長さの合計は “)

15

手順 1 － NagaChk.lsp をロードし、キーボードから <nagachk> と入力します。
手順 2 －線分の長さの合計と円の長さの合計が、コマンドラインに表示されます。

(princ nagasa_1); 線分の長さを表示する(prompt “¥n 円の長さの合計は “)

16(princ nagasa_2); 円周の長さを表示する(princ)(defun c:NagaChk ( / a1 num nagasa_1 i a2 a3 pt_st pt_en dist b1 nagasa_2 b2 b3 rad); 線分の長さを加算していく

1(setq a1 (ssget “x” ‘((0 . “LINE” )))) ; 図面内の線分のみ取得する(if (/= a1 nil) ; 線分の図形が存在すれば、以下の処理を行う(progn2(setq num (sslength a1)) ; 線分オブジェクトの個数を変数 <num> に代入

3

オブジェクトの操作

4(setq nagasa_1 0); 長さの初期値を <0> にセット

(setq i 1)

; 個数のカウントを <1> にセット

(while (<= i num)

; オブジェクトの数だけ長さを計算する

5(setq a2 (ssname a1 (- i 1)))
(setq a3 (entget a2))678

; 線分を順番に取り出す（一番目は <0> から）; 線分の図形名を変数 <a3> に代入(setq pt_st (cdr (assoc 10 a3))); 線分の始点の座標を変数 <pt_st> に代入(setq pt_en (cdr (assoc 11 a3))); 線分の終点の座標を変数 <pt_en> に代入(setq dist (distance pt_st pt_en)); 始点と終点の座標から線分の長さを求める(setq nagasa_1 (+ nagasa_1 dist)); 長さを加算する(setq i (+ 1 i)); カウントを 1 つ加えて、次の線分に移る);while);progn9(setq nagasa_1 0); 線分の図形がない場合は、線分の合計長さを <0> にセット

);if

1-249

オブジェクトの処理（複数図形）

番号

関数名

①

(ssget “x” ‘((0 . “LINE” )))②sslength③nagasa_1

④

i

⑤
⑥
⑦
⑧

(- i 1)
pt_st、pt_en
distancenagasa_1⑨(setq nagasa_1 0)⑩

ssget “x” ‘((0 . “CIRCLE” )))

⑪

i

⑫
⑬

(- i 1)(* 2 pi rad)⑭

(setq nagasa_2 0)⑮⑯(princ nagasa_1)(princ nagasa_2)

説 明
図面全体 <(ssget "x")> の中から、線分の図形だけ <'((0 . "LINE"))>を取得して、変数 a1 にセットします。
線分の個数を調べて、変数 num にセットします。
線分の長さの合計を変数 nagasa_1 にセットします。
初期値ですので、最初は <0> をセットします。
次の ssname 関数のために、カウントの初期値を <1> にセットします。num の数だけ while 以下の処理を行います。
ssname は <0> から始まるため、初期値を (- i 1) に設定します。
取り出した線分の始点座標と終点座標を変数に代入します。
始点と終点の座標から、線分の長さを計算します。
線分の長さを加算して行きます。
この図面に線分の図形がない場合は、線分の長さの合計値に <0>をセットします。
図面全体 <(ssget "x")> の中から、円の図形だけ <'((0 . "CIRCLE"))>を取得して、変数 b1 にセットします。
次の ssname 関数のために、カウントの初期値を <1> にセットします。num の数だけ while 以下の処理を行います。
ssname は <0> から始まるため、初期値を (- i 1) に設定します。
円周を計算します。
この図面に円の図形がない場合は、円周の長さの合計値に <0> をセットします。
線分の長さの合計値をコマンドラインに表示します。
円周の長さの合計値をコマンドラインに表示します。

オブジェクトの処理（複数図形）

1-250

オブジェクトの操作);end

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

第3節

選択セットのフィルタ

前節で説明したように、図面内にあるオブジェクトをまとめて編集する場合には、ssget 関数を使用すると便利です。
ssget で図面内のオブジェクトを取得する書式は、(setq ent1 (ssget "X")) になります。

1 範囲を指示して選択する
マウスで指示して選択する範囲を指定するか、選択オプション ("W" や "C"）を使ってオブジェクト
を選択します。

これで変数 ent1 には全てのオブジェクトをセットできます。

点 pt1、pt2、pt3、pt4 を次のようにセットします。

しかし、選択する図面範囲やオブジェクトの種類が判っていれば、その条件を指定して選択した方がこのときのオブジェクトを選択する ssget 関数の使用例は、以下のようになります。

早く選択出来ますし、使用するメモリーも少なくて済みます。
このようにオブジェクトを絞り込んで選択する方法としては、次の 4 つのパターンがあります。
①選択する範囲をマウスで指定して、その中に含まれる図形を取得する。（範囲選択）
下図のように、マウスで p1-p2 を囲み、その中に含まれる図形を全て選択します。
この書式は、(ssget "W" p1 p2) です。

p2(setq pt1 '(0.0 0.0) pt2 '(100.0 100.0) pt3 '(50.0 200.0) pt4 '(0.0 150.0))
SSGET の使用例

関数の呼び出し結 果
ユーザーに標準の方法でオブジェクトを選択するよう要求し、選択(setq ent1 (ssget))したオブジェクトを選択セットに含めます。
データベース内のすべてのオブジェクトから選択セットを作成しま(setq ent1 (ssget "X"))す。
(setq ent1 (ssget "P"))
直前に選択したオブジェクト セットから選択セットを作成します。
データベースに最後に追加された、画面に表示されているオブジェ(setq ent1 (ssget "L"))
クトから選択セットを作成します。
(setq ent1 (ssget "C" pt2 pt2)) 点 (100,100) を通るオブジェクトから選択セットを作成します。
点 (0,0) と点 (100,100) を対角頂点とする窓内のオブジェクトから選(setq ent1 (ssget "W" pt1 pt2))
択セットを作成します。
(setq ent1 (ssget "F"
点 (100,100)、点 (50,200)、点 (0,150) で定義されるフェンスと交差(list pt2 pt3 pt4)))
するオブジェクトから選択セットを作成します。
(setq ent1 (ssget "WP"
点 (0,0)、
点 (100,100)、
点 (50,200) で定義されるポリゴン内のオブジェ(list pt1 pt2 pt3)))
クトから選択セットを作成します 。
選択した図形群から、オブジェクトを 1 つずつ取り出して検査するには次のステップを踏みます。
Step1 －オブジェクト変数 <ent1> に複数の図形を取得します。

p1(setq ent1 (ssget "X"))→ 図面内の全てのオブジェクトを選択<Selection set: 820>

→ 選択セット名が表示されます。

Step2 －選択セットの中にあるオブジェクト数を取得します。

オブジェクトの操作

例えば、線分だけを選択する場合です。
この書式は、(ssget "X" ((0 . "LINE"))) です。
③関係演算子で選択する。

(setq n_ent1 (sslength ent1))→ sslength 関数でオブジェクト数を取得

680→ 前ページの平面図にある図形の数

Step3 －選択セットの中にあるオブジェクトを 1 つずつ取り出します。
(setq obj (ssname ent1 0))→ 選択セット <ent1> の 1 番目の図形を取得< 図形名 : 7ef2a1a8>→ 1 番目の図形名が表示されます。

Step4 －この図形名の中身を entget 関数で表示します。

例えば、半径 <10.0> の円だけを選択する場合です。

(setq obj_name (entget obj))

この書式は、(ssget "X" '((0 . "CIRCLE") (-4 . "=") (40 . 10.0))) です。

((-1 . < 図形名 : 7ef2a1a8>) (0 . "LINE") (330 . < 図形名 : 7ef13cf8>) (5 . "4B05") (100 .

→ entget 関数で図形の内容が判ります。

"AcDbEntity") (67 . 0) (410 . "Model") (8 . " 外構 ") (62 . 0) (100 . "AcDbLine") (10 5921.96④論理演算子で選択する。

21250.1 0.0) (11 7921.96 21250.1 0.0) (210 0.0 0.0 1.0))

例えば、半径 10.0 のすべての円と画層 "ABC" 上のすべての線分を選択する場合です。
この書式は、(ssget "X" '( (-4 . "<OR") (-4 . "<AND") (0 . "CIRCLE") (40 . 10.0) (-4 . "AND>") (-4 . <AND")

Step5 －この中にあるリストの各項目（ドット・ペア）を変更します。
繰り返し処理関数が使われます。
（repeat 関数で <n_ent1> の数だけ繰り返します。
）(0 . "LINE")(8. "ABC") (-4 . "AND>") (-4 . "OR>") )) です。

1-251

選択セットのフィルタ

選択セットのフィルタ

1-252

オブジェクトの操作②オブジェクト タイプで選択する。

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

2 オブジェクト タイプで選択する

3 関係演算子で選択する

ssget 関数は、図形名 ( グループ -1)、ハンドル ( グループ 5)、および拡張データ (Xdata) コード (1000

図面内のオブジェクトの選択に際して、最初から選択するオブジェクトを絞ることができます。

以上のグループ ) 以外のすべてのグループ コードを認識しますが、無効なグループ コードを指定し(ssget "X") の後に、関係演算子を指定する特殊なグループ コード -4 を含めることで選択を指定できた場合は、ssget により無視されます。

ます。

次の表に、各種のオブジェクト選択オプションでフィルタ リスト を使用する例を示します。

書式は、(ssget "X" '((0 . 図形名 ) (-4 . " 関係演算子 ") ( グループコード . 条件内容 ))) です。

フィルタ リストを使用した SSGET の例
結 果
ユーザーに標準の方法でオブジェクトを選択するよう要求し、(setq ent1 (ssget '((0 . "TEXT"))))
文字オブジェクトだけを選択セットに追加します。
(setq ent1 (ssget "X"'((0 .
データベース内のすべての円オブジェクトの選択セットを作成し"CIRCLE"))))
ます。
直前に作成された選択セットからすべての線分オブジェクトを含(setq ent1 (ssget "P" '((0 . LINE"))))
む選択セットを作成します。
(setq ent1 (ssget "W" pt1 pt2
画層 FLOOR 上にある、窓内のすべてのオブジェクトの選択セッ'((8 . "FLOOR"))) )トを作成します。
暗黙の選択セット (PICKFIRST が有効なときに選択されたオブジェクト セット ) に含まれるすべての青の線分オブジェクトの選択セットを作成します。
(ssget "I" '((0 . "LINE") (62 . 5)))
このフィルタによって色 5( 青 ) が割り当てられている線分が選択されますが、ByLayer または ByBlock プロパティによって適用されている色を持つ青の線分は選択されません。
関数の呼び出しグループコードと必要な値が分かっている場合は、上記の例のように、リストにクォーテーションを次の表に、指定可能な関係演算子を示します。

演算子
"*"
"="
"!="
"/="
"<>"
"<"
"<="
">"
">="
"&"
"&="

選択セット フィルタ リストの関係演算子
説 明
すべてのもの ( 常に真 )
等しい
等しくない
等しくない
等しくない
より小さい
より小さいか等しい
より大きい
より大きいか等しい
ビット方式の AND( 整数グループのみ )ビット方式のマスクが等しい ( 整数グループのみ )関係演算子の使用法は、リストするグループの種類によって異なります。
①ビット演算子 ("&" と "&=") を除くすべての関係演算子は、実数値グループと整数値グループの使用できます < '((0 . "LINE") (62 . 5))>。

両方に対して有効です。

どちらか一方を変数で指定する場合は、list と cons 関数を使用してリストを作成します。

半径 ( グループ コード 40) が <20.0> 以上 のすべての円を選択するには、→ (ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 20.0))) になります。

①次のコードは、画層 FLOOR 上にある、図面内の全てのオブジェクトの選択セットを作成します。
②ビット演算子 "&" と "&=" は、整数値グループに対してだけ有効です。

(setq lay_name "FLOOR")(setq ent1 (ssget "X" (list (cons 8 lay_name))))

直径寸法と半径寸法以外の寸法を選択するには、→ (ssget "X" '((0 . "DIMENSION")(-4 . "<NOT")(-4 . "<OR")(-4 . "&=")(70 . 3)(-4 . "&=")(70 . 4)(-4 .R>")(-4 . "NOT>"))) になります。

だけが選択セットに含まれます。
(ssget "X" (list (cons 0 "CIRCLE")(cons 8 lay_name)(cons 62 1)))
このコードは、画層 FLOOR 上にある赤色の円オブジェクトだけを選択します。

オブジェクトの操作

オブジェクトの操作②また、次の例のようにフィルタ リスト に複数の特性を指定すると、全ての指定条件を満たす図形③点グループの場合、X、Y、Z に対するリストを結合して単一の文字列にできます。
円の中心の Y 座標が <100> より上にある円を選択するには、→ (ssget "X" (list(cons 0 "CIRCLE")(cons -4 "*,>,*")(cons 10 '(0.0 100.0 0.0)))) になります。

③また、次の例のように <"X"> を記述せずにフィルタ リスト に複数の特性を指定すると、前ページと同様にマウスで指定した範囲内で条件を満たす図形だけが選択セットに含まれます。

④文字列グループには関係演算子を使用できません。ワイルドカードでリストします。

(ssget (list (cons 0 "CIRCLE")(cons 8 lay_name)(cons 62 1)))

マルチテキストとダイナミック文字の両方を選択するには、

このコードは、マウスで指定した範囲内で、画層 FLOOR 上にある赤色の円オブジェクトだけを選→ (ssget "X" '((0 . "*TEXT"))) になります。

択します。

1-253

選択セットのフィルタ

選択セットのフィルタ

1-254

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作
フィルターでリストを作成する

4 論理演算子で選択する

下図を使って、フィルターで選択します。

次の表に示す論理グループ演算子を使用してリストしたブール式を作成することにより、グループをリストすることもできます。

"<AND""<OR""<XOR""<NOT"

開始演算子

p2

選択セット フィルタ リストのグループ演算子
囲まれるもの終了演算子
1 つ以上のオペランド（演算の対象）"AND>"
1 つ以上のオペランド（演算の対象）"OR>"
2 つのオペランド（演算の対象）"XOR>"
1 つのオペランド（演算の対象）"NOT>"

グループ演算子は、関係演算子と同じように、グループ コード -4 で指定します。グループ演算子はペアで使用するため、フィルタ リスト内で正しく対応されていなくてはなりません。
対応が正しくないと ssget の呼び出しは失敗します。
① "<AND" （1 つ以上のオペランド） "AND>"p1→すべての条件にマッチする図形を選択

次の式は、画層 < 中心線 > にある線分を取得します。
(setq ent1 (ssget "X" '((-4 . "<and") (0 . "LINE") (8 . " 中心線 ") (-4 . "and>"))))(setq ent_len (sslength ent1))→ ent_len の値は、<40> が返ります。

①図面内の全てのオブジェクトを選択する。
(setq ent1 (ssget "X"))(setq ent_len (sslength ent1))② "<OR" （1 つ以上のオペランド） "OR>"→ ent_len の値は、<604> が返ります。

→いずれかの条件にマッチする図形を選択

次の式は、画層 < 中心線 > にあるオブジェクトとすべての画層にある線分を取得します。

② p1 ～ p2 の四角形の中にあるオブジェクトを選択する。

(setq ent1 (ssget "X" '((-4 . "<or") (0 . "LINE") (8 . " 中心線 ") (-4 . "or>"))))(setq ent1 (ssget))→マウスで p1 から p2 を囲みます。

(setq ent_len (sslength ent1))(setq ent_len (sslength ent1))→ ent_len の値は、<242> が返ります。

→ ent_len の値は、<456> が返ります。

③ "<XOR" （2 つのオペランド） "XOR>"→どちらかの条件にマッチする図形を選択③図面内のマルチテキストとダイナミック文字の両方を選択する。

次の式は、画層 <0> にある線分か画層 < 中心線 > にある線分を取得します。

(setq ent1 (ssget "X" '((0 . "TEXT,MTEXT"))))(setq ent1 (ssget "X" '((0 . "LINE") (-4 . "<XOR")(8 . "0")(8 . " 中心線 ") (-4 . "XOR>"))))(setq ent_len (sslength ent1))(setq ent_len (sslength ent1))→ ent_len の値は、<26> が返ります。

→ ent_len の値は、<45> が返ります。
④画層 <0> のオブジェクトを選択する。
→この条件以外の図形を選択

次の式は、線分以外の図形を取得します。

(setq ent1 (ssget "X" '((8 . "0"))))(setq ent_len (sslength ent1))

オブジェクトの操作

オブジェクトの操作④ "<NOT" （1 つのオペランド） "NOT>"→ ent_len の値は、<18> が返ります。

(setq ent1 (ssget "X" '((-4 . "<NOT") (0 . "LINE") (-4 . "NOT>"))))(setq ent_len (sslength ent1))→ ent_len の値は、<191> が返ります。

⑤画層 < 記号 > にある円を選択する。
(setq ent1 (ssget "X" (list (cons 0 "CIRCLE")(cons 8 " 記号 "))))(setq ent_len (sslength ent1))

Point!
②の "<OR" (A) (B) "OR>" と③の "<XOR" (A) (B) "XOR>" は同じように見えますが、②は、条件 (A) か条件 (B)、および両方の条件を満たしている図形を選択します。
一方③は、条件 (A) か条件 (B) のどちらかを満たす図形だけを選択します。

1-255

選択セットのフィルタ→ ent_len の値は、<31> が返ります。

⑥画層 < 記号 > にある半径 100 ミリ以下の円を選択する。
(setq ent1 (ssget "X" '((0 . "CIRCLE")(cons 8 " 記号 ")( -4 . "<=")(40 . 100.0))))(setq ent_len (sslength ent1))→ ent_len の値は、<11> が返ります。

選択セットのフィルタ

1-256

第 4 章－オブジェクトの操作
CircleErase.lsp
目的：
主要関数：

第 4 章－オブジェクトの操作
選択セットの条件を絞り込んで円を一括削除

図面内にある半径５ミリ以下の円を削除します。
<getreal><cons><list><ssget><sslength><prompt><princ><ERASE>

Step1 －何ミリ以下の円を削除するかを入力します。( 例は５ミリ） 1
Step2 －５ミリ以下の円を取得するため、list 関数で 1 つのリストにします。 2
ドットペアは cons 関数で作ります。

手順 1 － CircleErase.lsp をロードし、キーボードから <CircleErase> と入力します。
半径 <10>半径 <7>

半径 <5>

半径 <3>

図形は円の組み合わせ

半径 <1>→ (cons 0 "CIRCLE")→ (0 . "CIRCLE")

何ミリ以下の組み合わせ → (cons -4 "<=")→ (-4 . "<=")

半径が 5.0 の組み合わせ→ (40 . 5.0)

→ (cons 40 5.0)

Step3 －選択した円の数を変数 <ent_num> にセットします。 3（最後にコマンドラインに表示するためです。
）
手順 2 －「何ミリ以下の円を削除しますか？」と聞いてきますので、キーボードから <5> と入力します。

Step4 －選択した円のセットを削除します。 4

手順 3 － 5 ミリ以下の円が削除され、コマンドラインに削除された円の数が表示されます。

Step5 －コマンドラインに削除した数を表示します。 5(defun C:CircleErase ( / rad1 ss_set ent_num)
1(setq rad1 (getreal "¥n 何ミリ以下の円を削除しますか？ ")); 円の半径を入力する→ Step1］; 指定した半径に合致した円を取得します。

2(setq ss_set (ssget "X" (list(cons 0 "CIRCLE")(cons -4 "<=")(cons 40 5.0))))→ Step2］;ss_set の数を取得しておきます。
（削除した数を最後に表示するためです。
）

3(setq ent_num (sslength ss_set)); 選択セット (ss_set) の数を取得する→ Step3］; 選択したセットを削除します。

4(command "ERASE" ss_set "") ; 選択セット (ss_set) を削除する→ Step4］; コマンドラインに削除した円の数を表示します。

オブジェクトの操作②の [ ５ミリ以下の円 ] は、(list(cons 0 "CIRCLE")(cons -4 "<=")(cons 40 5.0)) です。

5(prompt "¥n 削除した円の数は："); メッセージをコマンドラインに表示する(princ ent_num); 削除した円の数を表示するもし、[ ３ミリ以下、7 ミリ以上の円 ] とするには、次のように記述します。

(princ)(ssget "X"(list (cons 0 "CIRCLE")(cons -4 "<or")(cons -4 "<=")(cons 40 3.0)(cons -4 ">="));end→ Step5

オブジェクトの操作

Point!

(cons 40 7.0)(cons -4 "or>")))
結果、下図のように半径 3 ミリ以下、7 ミリ以上の円が削除されます。
半径 <10>1-257

半径 <7>

半径 <5>

選択セットのフィルタ

半径 <3>

半径 <1>

番号関数名
説 明① getreal
削除する円の半径を入力します。
② ssget "X" (list(list・・以下の条件を絞り込んで、条件に合致した円を取得します。
③ sslength
選択セットに含まれるオブジェクトの数を取得します。
④ "ERASE"
削除コマンドです。最後の <""> は選択の終了を意味します。
⑤ (princ ent_num) コマンドラインに削除した数 (ent_num) を表示します。

選択セットのフィルタ

1-258

第 4 章－オブジェクトの操作
LineErase.lsp

第 4 章－オブジェクトの操作
選択セットの条件を絞り込んで線分を一括削除

図面内にある指定した長さの線分を削除します。
スキャナーで取り込んだラスターデータをベクトル変換したときに、短い線分が生じた時に一度に削除できます。
<getreal><ssget><sslength><ssname><entget><assoc><distance>

目的：
主要関数：

線分は長さ情報を持たないので、始点と終点の座標から長さを計算します。
(defun C:LineErase( / lin1 ss_set ent_num i ent1 ent2 ps pe dis1)
1(setq lin1 (getreal "¥n 何ミリ以下の線分を削除しますか？ ")) ; 削除する線分の長さを指定する; 図面内の全線分を取得します。

2(setq ss_set (ssget "X" '((0 . "LINE")))) ; 図面にある全線分を取得する

第4節

拡張データ

拡張データは、線分や円などの図形に付加される文字情報です。
似た機能に属性定義がありますが、属性定義がブロック図形に対してのみ付加できるのに対して、
XDATA は図形オブジェクトと非グラフィカル オブジェクトの両方に持たせることができます。
図形オブジェクトに文字情報を付加することによって、Excel や Access などの外部プログラムに接続して、データベースとして管理することが可能です。
既定では、AutoCAD のハッチング パターンには拡張データが含まれています。下図のハッチング
で確認します。

;ss_set の数を取得しておきます。

3(setq ent_num (sslength ss_set)) ; 取得した線分の数をセットする (repeat 関数で使用 )4(setq i 0) ;repeat の初期値を <0> にセットする (ssname 関数は、<0> から始まるため )5(repeat ent_num ; 取得した線分の数だけ、以下を繰り返す

6(setq ent1 (ssname ss_set i)) ; 取得した選択セットから、順番に線分を取り出す

7(setq ent2 (entget ent1)) ; 線分の全ての図形情報を取り出す

8(setq ps (cdr (assoc 10 ent2))) ; 始点の座標を取得する

9(setq pe (cdr (assoc 11 ent2))) ; 終点の座標を取得する

10(setq dis1 (distance ps pe)) ; 始点座標と終点座標から、線分の長さを計算する

1112①次のコードはハッチングの XDATA を取得します。
コマンド : (entget (car (entsel)) '("ACAD"))
オブジェクトを選択 : ((-1 . < 図形名 : 7ef039f8>) (0 . "HATCH") (330 . < 図形名 : 7ef01cf8>) (5 ."2AF")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 ."AcDbHatch") (10 0.0 0.0 0.0) (210 0.0 0.0 1.0)
(2 . "ANSI37") (70 . 0) (71 .1) (91 . 1) (92 . 7) (72 . 0) (73 . 1) (93 . 4) (10 1779.2 1923.62 0.0)
(10 1138.76 1923.62 0.0) (10 1138.76 1647.97 0.0) (10 1779.2 1647.97 0.0) (97 . 1)

(if (<= dis1 lin1)(command "ERASE" ent1 "")) ; 指定した長さ (lin1) より短ければ、削除する(330 . < 図形名 : 7ef039a0>) (75 . 1) (76 . 1) (52 . 0.0) (41 . 30.0) (77 . 0) (78 .2) (53 . 0.785398) (43 . 0.0)

(setq i (1+ i)) ; カウントを 1 増やして⑤に戻る(44 . 0.0) (45 . -67.3519) (46 . 67.3519) (79 . 0) (53 . 2.35619) (43 . 0.0) (44 . 0.0) (45 . -67.3519));repeat(46 . -67.3519) (79 . 0) (47 . 4.92221) (98 . 1) (10 1350.59 1761.18 0.0) (-3 ("ACAD" (1010 0.0 0.0 0.0))))(princ)②上記の情報の中で、最後の <-3> 以降がこのハッチングに付加されている XDATA です。

番号
関数名
説 明
① getreal
削除したい線分の長さを指定します。
② (ssget "X" '((0 . "LINE"))) 図面内の線分を取得します。(0 . "LINE") で線分を取得します。
③ (sslength ss_set)
取得した線分の数を取得します。
④ (setq i 0)
ssname 関数で取り出すための初期値をセットします。(0 から開始 )⑤ repeat
ent_num の数だけ繰り返します。
⑥ (ssname ss_set i)
線分の選択セット (ss_set) から順番に取り出します。
⑦ (entget ent1)
取り出した線分の図形情報を取得します。
線分の始点のドット・ペア (10 . 始点座標 ) から始点座標を取り出し⑧ (cdr (assoc 10 ent2))
ます。
線分の終点のドット・ペア (11 . 終点座標 ) から終点座標を取り出し⑨ (cdr (assoc 11 ent2))ます。
⑩ (distance ps pe)
始点座標と終点座標から、線分の長さを計算します。
⑪ (<= dis1 lin1)
その長さ (dis1) が指定した長さ (lin1) より短ければ、削除します。
⑫ (setq i (1+ i))
カウントを 1 プラスして、⑤に戻り繰り返します。

1-259

選択セットのフィルタ

使用頻度の高い AutoLISP の 拡張データ処理関数と関連する関数の概要を、次の表に示します。
①拡張データ処理関数
関 数(regapp application)

説 明
拡張オブジェクト データを使用できるようにするために、現在のAutoCAD の図面にアプリケーション名を登録します。

②リストに要素を加える関数
関 数
説 明(append lst ...)
任意の数のリストを受け取り、それらを 1 つのリストにまとめます。
③オブジェクト処理関数 ( オブジェクトの更新）
関 数
説 明(entmod 特定リスト )オブジェクトの定義データを更新します。

拡張データ

1-260

オブジェクトの操作

オブジェクトの操作);end

第 4 章－オブジェクトの操作

文字列

1000

1-261

1 アプリケーション名を登録する

意 味
拡張データ内の文字列は、最大 255 バイトの長さです (256 番目のバイトは null 文字用に確保されています )。
アプリケーション名は、最大 31 バイトです (32 バイト目は null 文字のために予約されています )。
注 : ユーザ独自の拡張データにグループ 1001 を追加しないでください。
追加すると、AutoCAD はそれを、新しいアプリケーション拡張データの開始とみなします。
拡張データの制御文字列は、"{" か "}" のどちらかが可能です。これらの括弧により、アプリケーションは、そのデータをリストに細分化して組織化できるようになります。 左側の中括弧はリストの始まりで、
制御文字列
1002
右側の中括弧はリストを終了します。リストはネストできます。
AutoCAD は、個々のアプリケーションに対する拡張データを読み込む
とき、括弧の数が合っているかどうかを調べます。
画層名1003
拡張データに関連付けられた画層の名前
バイナリ データは、可変長の「チャンク」に組織化されます。各チャ
バイナリ データ 1004
ンクは、最大 127 バイトです。ASCII DXF ファイルでは、バイナリ デー
タは、バイナリ バイト当り 2 文字の 16 進数文字列で表されます。
図面データ内の図形のハンドル
注 : ハンドルおよび拡張データ ハンドルを有する図面が、INSERT[ ブロック挿入 ] コマンド、INSERT *( 挿入時にブロック内のオブジェ
クトを分解 ) コマンド、XREF[ 外部参照 ]/[ バインド (B)] コマンド、
XBIND[ 個別バインド ] コマンド、または OPEN[ 開く ] コマンドの [ 部
データベース ハ
分的に開く ] オプションを使用して他の図面に読み込まれるとき、拡1005
ンドル
張データ ハンドルは、一致する図形ハンドルと同じ方法で変換されるので、これらの結合は維持されます。これは、ブロックに対するEXPLODE[ 分解 ] コマンドや他の AutoCAD の操作に対しても行われます。AUDIT[ 監査 ] コマンドにより、図面内の図形のハンドルと一致
しない拡張データ ハンドルが検出されると、エラーとみなされます。
AUDIT が図形を修復すると、ハンドルは 0 に設定されます。
3 つの実数、X、Y、Z の順。これらは点またはベクトル レコードとし
3 つの実数
1010, 1020, 1030て使用できます。AutoCAD が値を変更することは決してありません。
単純な 3D 点とは違い、ワールド空間座標は、拡張データが属する親図
ワールド空間の形とともに移動され、尺度変更され、鏡像化されます。ワールド空間
1011, 1021, 1031
位置
位置は、STRETCH[ ストレッチ ] コマンドが親図形に適用されこの点が選択窓内にある場合も、ストレッチされます。
ワールド空間のこれも、親図形とともに尺度変更、回転、鏡像化される 3D 点 ( 移動や1012, 1022, 1032
変位
ストレッチはされません )これも、親図形とともに回転および鏡像化される 3D 点 ( 移動、尺度変ワールド方向1013, 1023, 1033
更、ストレッチはされません )
実数
1040
実数値
距離
1041
親図形とともに尺度変更される実数値
親図形とともに尺度変更される実数値。距離と尺度係数の違いは、ア
尺度係数
1042
プリケーション定義です。
整数1070
16 ビット整数 ( 符号付きまたは符号なし )長整数
1071
32 ビット符号付き ( 長 ) 整数
アプリケーション名

オブジェクトの操作

拡張データのグループ コードと意味

グループ コード1001
これも文字列値

拡張データ

アプリケーション名は付加される拡張エンティティデータだけでなく、APPID テーブルも同時に登録します。
AutoLISP では regapp 関数によって登録できます。regapp 関数は使用するアプリケーションの文字列を指定する関数です。
アプリケーション名 [cost] の登録処理
1(setq appname “cost” ) ; アプリケーション名を決めます。

2(if (tblsearch “appid” appname) ; 同じ名前が有るかどうかを調べます。

3(prompt (strcat appname “は登録済みです。
” )) ; 同じ名前があれば、メッセージを表示して終了します。

4(regapp “cost” ) ; 無ければ、アプリケーション名として登録します。
)

番号 関数名説 明① setqアプリケーション名の変数 [appname] に cost を割り当てます。
② tblsearch この図面中の APPID テーブルに cost が割り当てられているかどうか調べます。
③ promt
cost が割り当てられていれば、そのメッセージを表示して終了します。
④ regapp 割り当てられていなければ、アプリケーション名として登録します。
Point!
上記のプログラムで登録したアプリケーション名を確認します。
① tblsearch 関数で、アプリケーション名 [cost] を検索します。
コマンド : (tblsearch "appid" appname)②以下のメッセージが表示されます。
((0 . "APPID") (2 . "cost") (70 . 0))

オブジェクトの操作

図形名

第 4 章－オブジェクトの操作

AutoCAD エンティティのグループ コード
グループ コード意 味
0
エンティティ タイプ（"APPID" はアプリケーション名であることを示す）
2
アプリケーションの名前
70
フラグ（０は無し )

拡張データ

1-262

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

2 図形に拡張データ (XDATA) を付加する
次のブロック図形に拡張データ (XDATA) を付加します。

Xdata_Add.lsp
目的：
主要関数：

付加するデータは、製品名（< 電灯 > 文字列）
、制作年（<2020> 整数）、価格（<100.0> 実数）です。

拡張データを付加する
プリケーション名の登録と拡張データを付加します。
<entsel><car><entget><initget><getkword><cond><getreal><getint><getstring><list><append><entmod>

P1-257 で作成したアプリケーション名 [cost] に拡張データを付加します。
(defun C:Xdata_Add( / apname old_ent kword data1 data2 add1 add2 adddata new_ent); 図面にはアプリケーション名として "cost" がすでに登録されています。

1(setq old_ent (car (entsel “¥n 拡張データを付加する図形を選択：” )))2(setq old_ent (entget old_ent))3(initget 0 “Real Integer String” ) ;initget 関数で、入力を [R] と [I] と [S] に制限する(setq ent1 (entget (car (entsel))))4(setq kword (getkword “¥n 拡張データのタイプ [R= 実数 /I= 整数 /<S= 文字列 >]:” ))→ ((-1 . < 図形名 : 7ef03cb8>) (0 . "INSERT") (330 . < 図形名 : 7ef01cf8>) (5 . "2FF") (100 . cDbEntity")

5

(cond

①拡張データを付加する図形 ( 上のブロック図形）を選択します。( ブロック名は "cost"）(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "cost") (10 1318.58 1420.44 0.0)
(41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0));3 つの条件によって、プログラムを分岐する;[R] が入力された時の処理(setq data1 (getreal “¥n 拡張データの値（実数）を入力 :” ); 実数の入力を促す

code 1040); 実数の拡張コードは 1040((= kword “Integer” );[I] が入力された時の処理(setq data1 (getint “¥n 拡張データの値（整数）を入力 :” ); 整数の入力を促す)(regapp "light")→ "light" がコマンドラインに表示されます。
7

code 1070)③文字列（電灯）、整数値（2020）、実数値（100.0）を付加します。

; 整数の拡張コードは 1070

(setq xdata1 '((-3 ("light" (1000 . " 電灯 ")(1070 . 2020)(1040 . 100.0))))))→ ((-3 ("light" (1000 . " 電灯 ") (1070 . 2020) (1040 . 100.0))) がコマンドラインに表示されます。

((= kword “String” );[S] が入力された時の処理(setq data1 (getstring “¥n 拡張データの値（文字列）を入力 :” ); 文字の入力を促す④選択したブロック図形のリストに追加します。

8(setq ent1 (append ent1 xdata1))

code 1000); 文字の拡張コードは 1000)

→ ((-1 . < 図形名 : 7ef03cb8>) (0 . "INSERT") (330 . < 図形名 : 7ef01cf8>) (5 . "2FF") (100."AcDbEntity")) ;cond(10 1318.58 1420.44 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 .0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0)(210 0.0 0.0 1.0) (-3 ("light" (1000 . " 電灯 ") (1070 . 2020) (1040 . 100.0))))⑤拡張データを追加したブロック図形のデータベースを更新します。（必須）9(setq xdata (list (list -3 (list "cost" (cons code data1)))))

10(setq new_ent (append old_ent xdata))

11(entmod new_ent) ; 図形情報を更新する（必須）(entmod ent1)(princ)→④と同じ情報がコマンドラインに表示されます。

) ;end; 追加する拡張データのリストを作成

オブジェクトの操作(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference")(2 . "cost")

オブジェクトの操作; 選択した図形の情報を得る((= kword “Real” )6②アプリケーション名を設定します。

; 図形を選択する; 元の図形に拡張データを追加する⑥新しい拡張データ が図形にアタッチされたことを確認するには、次のコードを入力し図形を選択します。
(entget (car (entsel)) '("light"))→④と同じ情報がコマンドラインに表示されます。

1-263

拡張データ

拡張データ

1-264

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

Step1 －①②
拡張データを付加する図形を選択し、図形情報を entget 関数で取得します。
（最後に append 関数でリストを追加し、entmod 関数で図形情報を更新するためです。）

3 拡張データを取得する
entget 関数を使うことにより、図形の拡張データを取得できます。entget 関数は、図形の標準の定義データと、entget を呼び出すときにアプリケーションを指定した場合は Xdata を取得します。
entget を使用して Xdata を取得する場合、拡張データの始まりはコード -3 で示されます。
コード -3 は、最初のグループ 1001 のリストの直前にあります。グループ 1001 には、取得した最初のアプリケーションの名前が含まれます。
もし、アプリケーション名が分からない場合は、ワイルドカード < * > が使えます。

Step2 －③④⑤⑥⑦⑧
付加する拡張データのタイプ（実数、整数、文字）を指定します。
タイプによって対応する拡張コードを付加して、（拡張コード . 値）のドット・ペアを(setq apname “*” )作成します。

(setq ent (car (entsel “¥n 拡張データを持つ図形を指示：” )))(setq ldata (entget ent (list apname)))(setq xdata (cadr (assoc -3 ldata)))

前ページで拡張データを付加した図形で確認してみます。
(defun C:get_xdata1( / en1 xdata); 図形を選択します(setq en1 (entsel "¥n 図形を選択："))
Step ３－⑨⑩⑪; 拡張データを含む全情報が取得できます

作成した拡張データを元の図形に追加して、1 つのリストにします。

(setq xdata (entget (car en1) '("*"))) ; ワイルドカード ("*") を使用

最後に図形情報を更新します。

);end

オブジェクトの操作

④
⑤
⑥
⑦
⑧
⑨
⑩
⑪

1-265

説 明
選択した図形の図形名を取得して、変数 old_ent にセットします。
entget 関数で選択した図形情報を取得します。
initget 関数は入力をチェックする関数です。
getkword 関数の引数はプロンプトだけです。getkword は initget とペアで使い
getkword
ます。initget 関数を使って指定してある値だけが getkword に入力できます。
cond
キーワードの文字によってプログラムを分岐します。
kword が” R” であれば、data1 に実数の値が入り、拡張データのグループ コード“Real”として code に <1040> をセットします。
kword が” I” であれば、data1 に整数の値が入り、拡張データのグループ コード“Integer”
として code に <1070> をセットします。
kword が” S” であれば、data1 に文字列の値が入り、拡張データのグループ コー“String”
ドとして code に <1000> をセットします。
list -3<-3> は拡張データの始まり を示すグループ コードです。
list "cost" アプリケーション名 [cost] に拡張データを加え、1 つのリストにします。
cons
code と data1 でドット・ペアを作成し、リストに加えます。
append 複数のリストを 1 つのリストに結合する関数です。
entmod 図形情報を更新します。
（必須です）

拡張データ

コマンドラインに選択した図形の全データが表示されます。
最後の <-3> 以下が拡張データになります。
（整数に <500> を入力した例）

オブジェクトの操作

番号 関数名① old_ent② entget③ initget

拡張データ

1-266

第 4 章－オブジェクトの操作

第 4 章－オブジェクトの操作

get_xdata2.lsp
目的：
主要関数：

拡張データを取得（拡張データのみ取得）
拡張データの値だけを表示します。
<entsel><car><entget><asooc><cdr><if><progn><print>

get_xdata3.lsp
目的：
主要関数：

(defun c:get_xdata2 ( / ent ent1 en en1 en2 xdata1 )(setq ent (car (entsel "¥n 図形を選択："))) ;< 図形名 : 7ef02c00> を取得する

2(if (/= ent nil);<nil> で無ければ、以下を実行する(progn(setq ent1 (entget ent '("cost"))) ; アプリケーション名 [cost] の図形を取得する

3;P1-259 で付加した拡張データの情報を取得する（アプリケーション名が判らない場合）

1(setq apname “*” )2(setq ent (car (entsel “¥n 拡張データを持つ図形を指示：” )))3(setq data1 (entget ent (list apname)));ent1 の末尾の <(-3 ("cost" (1070 . 500)))> を assoc 関数で取り出す(setq en (cdr (assoc -3 ent1))) ;cdr 関数で 2 番目以降の情報を取得する (en)4;en の値は <(("cost" (1070 . 500)))>(if (/= en nil)5
6

(setq en1 (car en))7

(setq en2 (cdr en1)) ;"cost" 以降の ((1070 . 500)) を取得する; 一番外側の（）を取り、("cost" (1070 . 500)) を取得する

4(setq xdata1 (cdr (assoc 1070 en2))) ;500 だけを取得する;xdata1 の値は <500>; 拡張データを持つドット・ペアのリストを取得する(setq xdata1 (cadr (assoc -3 data1)));(assoc -3 data1) の値は <(-3 ("cost" (1070 . 500)))>;xdata1 の値は <("cost" (1070 . 500))>

5(if (= xdata1 nil)6

(prompt “¥n 拡張データがありません” )); アプリケーション名の拡張データが <nil> かどうかをチェックする;<nil> であれば終了する(progn ;<nil> でなければ、以下を実行する
7(print xdata1) ;500 をコマンドラインに表示する

9; 図形名を取得する;(assoc -3 data1) の値から <-3> 以降を cadr 関数で取り出す（この場合は <cdr> でも同じ）;en2 の値の <((1070 . 500))> から assoc 関数で (1070 . 500) を取り出す

8; ワイルド カードで検索するために変数にワイルド カード <*> をセット

;data1 の末尾の <(-3 ("cost" (1070 . 500)))> を assoc 関数で取り出す; <nil> で無ければ、以下を実行する(prognアプリケーション名と拡張データの値を表示します。
<entsel><car><list><entget><asooc><cadr><if><prompt><progn><princ>(defun c:get_xdata3( / apname ent data1 xdata1);P1-259 で付加した拡張データの情報を取得する（アプリケーション名を指定する場合）

1

拡張データを取得（アプリケーション名と拡張データを取得）(prompt“¥n 拡張データは：” )(princ xdata1); コマンド ラインに文字を表示する; コマンド ラインにアプリケーション名と拡張データを表示する) ;progn);prog

) ;if

);if

) ;end);prog);if

番号
関数名① entsel② /= ent nil③ entget④ assoc⑤ /= en nil⑥ car en
⑦ cdr en1
⑧ (cdr (assoc 1070 en1))⑨ print

説 明
拡張データが付加されている図形を選択します。
選択されていれば、以下のプログラムを実行します。
アプリケーション名が [cost] の情報を取得します。
アプリケーション名 (-3) 以下の情報を取得します。
情報が nil でなければ、以下のプログラムを実行します。
(("cost" (1070 . 500)) の外側の () を car 関数で外します。
("cost" (1070 . 500)) の後半の (1070 . 500) を取得します。
ドット・ペア (1070 . 500) の後半の 500 を取得します。
拡張データ <500> をコマンドラインに表示します。

番号
関数名
① “*”
② entsel
③
④
⑤
⑥
⑦

説 明
* はワイルドカードです。アプリケーション名が分からない時に使用します。
拡張データが付加されている図形名を取得します。
アプリケーション名を示したグループ コードのリストを取得します。
list appname
拡張データはリストの末尾に表示されます。
xdata1
アプリケーション名の拡張データだけを取り出します。
if
アプリケーション名の拡張データがあるかどうかチェックします。
prompt
拡張データがなければ、そのまま終了します。
princ
アプリケーション名と拡張データをコマンドラインに表示します。

拡張データだけが、コマンド

アプリケーション名と拡張

ラインに表示されます。

データが、コマンド ラインに500表示されます。
(cost (1070 . 500))

1-267

拡張データ

拡張データ

1-268

オブジェクトの操作

オブジェクトの操作);end

第 4 章－オブジェクトの操作

第2部

4 拡張データをフィルタする
図面内にある拡張データ (XDATA) を持つブロック図形を次の条件で取得します。（P1-258）①拡張データ (XDATA) を持つ全ての図形を取得する場合。
②拡張データ (XDATA) を持つブロック図形を取得する場合。
③アプリケーション名が <"light"> のブロック図形を取得する場合。
付加されている拡張データは、（< 電灯 > 文字列）、（<2012> 整数）、（<100.0> 実数）です。

ダイアログ コントロール言語 (DCL)

第 1 章 ダイアログとタイルの構造
AutoCAD が提供するダイアログでは、ユーザーが入力する
テキスト ボックスやボタンを [ タイル ] と呼びます。

またアプリケーション名は、<"light"> です。

この章では、ダイアログ コントロール 言語 (DCL) の構造と構成要素であるタイルについて解説します。

①拡張データ (XDATA) を持つ全ての図形を取得する。
1.(setq ent (ssget "X" '((-3 ("*"))))) と入力します。（拡張データを持つ全図形を取得）→ <Selection set: 19a>2.(setq ent_len (sslength ent)) と入力します。
（選択セットの数を取得）→1
3.(setq ent1 (ssname ent 0)) と入力します。
（選択セットの最初の図形を取得）→ < 図形名 : 7ef03cb8>
4.(setq ent2 (entget ent1)) と入力します。
（拡張データ付きの情報が表示されます。）→ ((-1 . < 図形名 : 7ef03cb8>) (0 . "INSERT") (330 . < 図形名 : 7ef01cf8>) (5 . "2FF")(100."AcDbEntity")(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference")(2 . "cost")(10 1318.58 1420.44 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 .0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0)(210 0.0 0.0 1.0) (-3 ("light" (1000 . " 電灯 ") (1070 . 2012) (1040 . 100.0))))

オブジェクトの操作②拡張データ (XDATA) を持つブロック図形を取得する。
1.(setq ent (ssget "X" '((0 . "INSERT") (-3 ("*"))))) と入力します。
（拡張データを持つブロックを取得）→ <Selection set: 1ac>
2. ①の 2 から 4 を繰り返します。
（同じデータが取得できます。）③アプリケーション名が <"light"> のブロック図形を取得する。
1.(setq ent (ssget "X" '((0 . "INSERT") (-3 ("light"))))) と入力します。
（"light" の拡張データを持つブロックが取得できます。）→ <Selection set: 1b0>
2. ①の 2 から 4 を繰り返します。
（同じデータが取得できます。）

1-269

拡張データ

第 1 節

ダイアログ ボックスの構成

第 2 節

base.dcl ファイルと acad.dcl ファイル

第 3 節

タイルのレイアウト

第 4 節

space と width

第 5 節

タイルの属性第 6 節

個別タイルの構成

第 7 節

AutoCAD の Ok_Cancel ボタン

第 8 節

ユーザー定義の Ok_Cancel ボタン

第 1 章－ダイアログとタイルの構造

第1節

第 1 章－ダイアログとタイルの構造[ ツール ] → [ オプション ] → [ 作図補助 ] タブ

ダイアログボックスの構成

ダイアログ ボックスの外観は、ダイアログ コントロール言語 (DCL) ファイルで定義します。
そしてダイアログ ボックスの機能は、AutoLISP アプリケーションでコントロールします。

3

3

ダイアログ ボックスはダイアログ本体とタイル及びタイルをグループ化したクラスタで構成され

94

ダイアログとタイルの構造

ダイアログとタイルの構造

ユーザーはダイアログ ボックスを使用して、数値や文字の入力を行うことができます。

ています。
8

5

8

5

1 ダイアログ本体

9

3

2 タイル ( 例：edit_box)

3 クラスタ（グループ化されたタイル）

タイルには以下の種類があります。⑩の [Ok_Cancel] は他にもいくつかの組み合わせがあります。
番号
タイル名① text_tile② edit_box③ toggle_button④ radio_button⑤ slider⑥ popup_list⑦ list_box⑧ image⑨ button⑩ Ok_Cancel

説明
タイトルを作成したり、情報を提供するための文字列を表示します。
1 行の文字を入力または編集するフィールド。
トグルは、真偽値（"0" か "1"）をコントロールします。
ラジオ列またはラジオ行を構成する複数のボタンの 1 つ。
スライダーのインジケータを左右にドラッグして値を取得します。
テキスト又は矢印を選択すると、リストが開き選択肢が表示されます。
行単位で整列された文字列のリストです。複数の項目を選択できます。
ラベルではなく、グラフィックス イメージを表示する矩形です。
ダイアログ ボックスを閉じたり、別のダイアログを表示できます。
このタイルは、base.dcl ファイルで定義されています。

1 AutoCAD が提供するダイアログ ボックス

10

[ ツール ] → [ オプション ] → [ 作図補助 ] タブからボタンを選択7

7

6

8[ 編集 ] → [ 文字検索 ]

1
1

6

2

9
10

2

3
10

2-1

ダイアログ ボックスの構成

ダイアログ ボックスの構成

2-2

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第2節

2 ユーザー作成のダイアログ ボックス

AutoCAD には base.dcl ファイルと acad.dcl ファイルがあり、それぞれ AutoCAD のユーザー

第3章6節

ダイアログとタイルの構造

ダイアログとタイルの構造

第3章5節

base.dcl ファイルと acad.dcl ファイルのサポートフォルダに格納されています。
① base.dcl ファイルには、基本的な定義済みのタイルとタイル タイプの DCL 定義が含まれてい8ます。このファイルには、よく使用するプロトタイプの定義も収められています。
base.dcl
8[ok_cancel_help] ボタンの記述
ok_cancel_help : column {8: row {
fixed_width = true;

2

2

2

10

9

1

10

alignment = centered;5

ok_button;: spacer { width = 2; }cancel_button;

線の太さの設定を画像で確認
2 種類ある面取りのどちらかを選択して、面取りを行います。

第3章7節: spacer { width = 2; }しながら行うことができます。

help_button;}}

第 3 章 10 節

② acad.dcl ファイルには、AutoCAD によって使用されるすべてのダイアログ ボックスの標準の46定義が格納されています。

7

4acad.dcl
6

用紙の大きさと尺度を指定して、自動的に図枠を作図します。

acad_snap : dialog {label = " 作図補助モード管理 ";10: row {: column {: boxed_column {10label = " モード ";: toggle {label = " 直交 (&O)";

図面内の図形に拡張データ (Xdata) を付加します。

key = "ortho";

第4章4節

}
: toggle {label = " 塗潰表示 (&F)";[ 作図補助モード管理 ] のダイアログの記述: toggle {399key = "fill";}label = " 文字省略 (&Q)";
key = "qtext";

9}: toggle {10label = " マーカー表示 (&B)";
key = "blips";

AutoCAD の [help] ボタンの位置に、ユーザーが作成した関数を割り当てています。
}[help] ボタンは、このようにカスタマイズ可能です。

2-3

ダイアログ ボックスの構成

base.dcl ファイルと acad.dcl ファイル2-4

第 1 章－ダイアログとタイルの構造

タイルのレイアウト

タイルは行または列にグループ化できます ( 総称してクラスタといいます )。

ダイアログとタイルの構造④ Row(<Row><Row>)③ Column(<Column><Column>)
boxed_column

レイアウト上、クラスタは 1 つのタイルとして扱われます。行や列はボックスで囲むことができ、(edit)

ラベルを付けることもできます ( ボックスのないクラスタにラベルを付けることはできません )。

(edit)

boxed_column
boxed_radio_column
boxed_radio_row
boxed_row
columnboxed_row

dialogradio_column
radio_row
row(edit) (edit)
boxed_column2 :dialog

boxed_row2 :dialog{{

label = " 全体は column";① Column(<Column><Column>)

label = " 全体は row";:boxed_column② Row(<Row><Row>):boxed_row{{

label = "Boxed_Column";:edit_box{(edit){

label = "column1";(edit)

row

column2 :dialog

row2 :dialog{{
label = " 全体は column";

label = " 全体は row";:column:row{{:edit_box:edit_box{{
label = "column1";

label = "row1";

key = "yoko_1";

key = "yoko_1";

width = "";width = "";value = "";value = "";}}:edit_box:edit_box{{

label = "column2";

label = "row2";

key = "tate_1";

key = "row2";

width = "";width = "";value = "";value = "";

}

}

}

}

/* OK or CANCEL *//* OK or CANCEL */spacer;spacer;ok_cancel;

ok_cancel;

label = "row1";

key = "yoko_1";

key = "yoko_1";

width = "";(edit) (edit)

2-5label = "Boxed_Row";:edit_box

column}width = "";value = "";value = "";}}:edit_box:edit_box{{

label = "column2";

label = "row2";

key = "tate_1";

key = "tate_1";

width = "";width = "";value = "";value = "";

}

}

}

}

/* OK or CANCEL *//* OK or CANCEL */spacer;spacer;ok_cancel;

ok_cancel;}

Point!

}

columnboxed_column
ラベル

boxed_row

row}

タイルのレイアウト

ダイアログとタイルの構造

第3節

第 1 章－ダイアログとタイルの構造

ラベル

タイルのレイアウト

2-6

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造⑥ Column(<Column><Row>)columncolumnダイアログとタイルの構造

boxed_column

boxed_row(edit)(edit)(edit) (edit)(edit)

boxed_column

boxed_row

boxed_row(edit)(edit) (edit)(edit) (edit)(edit)

row
boxed_column

boxed_column(edit)(edit)(edit)(edit)

boxed_column4 :dialog

boxed_column2_row2 :dialog

boxed_row4 :dialog

boxed_row2_column2 :dialog

{

{

{

{

label = " 全体は column";

label = " 全体は column";

label = " 全体は column";

label = " 全体は row";:column:column:column

:row

{

{

{

{

:boxed_column:boxed_column:boxed_row:boxed_column

{

{

{

{

label = "Boxed_Column1";

label = "Boxed_Column1";

label = "Boxed_Row1";

label = "Boxed_Column1";:edit_box:edit_box:edit_box:edit_box

{

{

{

{

label = "column1";

label = "column1";

label = "row1";

key = "yoko_1";

key = "yoko_1";

key = "yoko_1";

key = "yoko_1";

}

}

}

:edit_box:edit_box:edit_box:edit_box

{

{

{

{

label = "column2";

label = "row2";

label = "column2";

key = "tate_1";

key = "tate_1";

key = "tate_1";}}

key = "tate_1";
}

}

}

}

}

}

:boxed_column:boxed_row:boxed_row:boxed_column

{

{

{

{

label = "Boxed_column2";

label = "Boxed_Row1";

label = "Boxed_Row2";

label = "Boxed_Column2";:edit_box:edit_box:edit_box:edit_box

{

{

{

{

label = "column3";

label = "row1";

label = "row3";

label = "column3";

key = "yoko_2";

key = "yoko_2";

key = "yoko_2";

key = "yoko_2";

}

}

}

}

:edit_box:edit_box:edit_box:edit_box

{

{

{

{

label = "column4";

label = "row2";

label = "row4";

key = "tate_2";

key = "tate_2";

key = "tate_2";

}

}

}

}

label = "column1";}

label = "column2";

2-7

columnboxed_column(edit)⑧ Row(<Column><Column>)⑦ Column(<Row><Row>)label = "column4";
key = "tate_2";
}

}

}

}

}

}

}

}

}

/* OK or CANCEL *//* OK or CANCEL *//* OK or CANCEL *//* OK or CANCEL */spacer;spacer;spacer;spacer;ok_cancel;

ok_cancel;

ok_cancel;

ok_cancel;}

タイルのレイアウト

ダイアログとタイルの構造⑤ Column(<Column><Column>)}}

タイルのレイアウト

2-8

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造⑩ Column(<Column><Column><Row><Row>)row

ダイアログとタイルの構造(image)boxed_column(edit)(edit)(edit)(edit)

S1_Edit2 :dialog{
label = " 全体は column";:column{:icon_image{
label = " パターン図 ";key = "image00";}:boxed_column{
label = "Boxed_Row_Column";:row{:edit_box{
label = "column1";
key = "yoko1";}:edit_box{
label = "column2";
key = "tate1";
}
}
:row
{
:edit_box{
label = "column3";
key = "yoko2";}:edit_box{
label = "column4";
key = "tate2";}}}}/* OK or CANCEL */spacer;ok_cancel;}

S1_Edit1 :dialog{
label = " 全体は row";:row{:icon_image{
label = " パターン図 ";key = "image00";}:boxed_column{
label = "Boxed_Column1";:edit_box{
label = "column1";
key = "yoko1";}:edit_box{
label = "column2";
key = "tate1";}:edit_box{
label = "column3";
key = "yoko2";}:edit_box{
label = "column4";
key = "tate2";}}}/* OK or CANCEL */spacer;ok_cancel;}

2-9

column(image)boxed_columnrow(edit) (edit)
row(edit) (edit)

タイルのレイアウト

第4節

space と width

space や width 、height など、いくつかの属性はすべてのタイルに共通です。属性を割り当てないこともできます。多くの属性には、属性を割り当てないときに使用される既定値 (base.dcl で記述 )があります。イメージの背景色など、特定の種類のタイルだけに使用される属性もあります。この
属性を別の種類のタイルに割り当てようとした場合、エラーが表示されることがありますが、通常このような属性は無視されます。
スペーサは、空白のタイルです。スペーサはレイアウトのためだけに使用され、隣接するタイルのサイズとレイアウトを変更します。PDB( プログラマブル ダイアログ ボックス ) 機能は自動的に間隔を処理し、他のダイアログ ボックスと一貫性を保ちます。

1 縦方向の space
space 無し

space(OK ボタンの上③に配置 )3space(OK ボタンの上③、A の上①に配置 )13space( ①②③に配置 )1space4 :dialog{
label = "space ①と②と③ ";1 spacer;:column{:edit_box{
label = "A";key = "yoko_1";
width = "";value = "";}2 spacer;:edit_box{
label = "B";key = "tate_1";
width = "";value = "";}}/* OK or CANCEL */3 spacer;
ok_cancel;}

2
3
space と width

2-10

ダイアログとタイルの構造⑨ Row(<Row><Column>)

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

2 横方向の space

3 異なるタイルとの space
ダイアログとタイルの構造

ダイアログとタイルの構造

space 無し
space 無し

space22 :dialog{

space(A の前に①を配置 )1

space(A の前に①、B の後に③を配置 )1

3

space( ①②③に配置 )space8 :dialog{
label = "space ①②③ ";:row{
1 spacer;:edit_box{
label = "A";key = "yoko_1";
width = "";value = "";}2 spacer;:edit_box{
label = "B";key = "tate_1";
width = "";value = "";}3 spacer;}/* OK or CANCEL */ok_cancel;}

label = "";:row{:icon_image{
label = " パターン図 ";key = "image00";

space(B の下に①を配置 )2:boxed_column{
label = " 図枠の寸法 ";:edit_box{
label = "A";1

key = "yoko1";}:edit_box{

Point!

label = "B";key = "tate1";

スペースは PDB ( プログラマブル ダイアログ}

ボックス ) 機能で制約されていますから

1 spacer;spacer を配置しても整列が不自然な場合は、}

下図のように row と column を入れ替えて}レイアウトを変更した方が良い場合もあります。

/* OK or CANCEL */:boxed_column を :boxed_row に変更する

1}

ok_cancel;}:boxed_row

3{label = " 図枠の寸法 ";:edit_box{
label = "A";

Point!

key = "yoko1";

base.dcl で規定されている [ok_cancel] のスペースは以下の通りです。

}: row {

:edit_box

fixed_width = true;←レイアウト時に幅が変化しませんalignment = centered;←クラスタ内での水平または垂直位置が中央

label = "B";ok_button;← OK ボタンの定義

key = "tate1";: spacer { width = 2; }← AutoCAD が割り当てる標準のスペース属性値

cancel_button;← Cancel ボタンの定義

{

}
}

}

2-11

space と width

space と width2-12

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第5節

4 space_0 と space_1（base.dcl で定義済み）
spacer_0 : spacer {し、レイアウト時にタイル グループを引き伸す必

height = 0;

要がある場合は、タイル グループのスペース挿入

width = 0;

場所を示します。グループ内の spacer_0 タイル

horizontal_margin = none;に正の幅を指定すると、それらすべてに等しい間

vertical_margin = none;

隔が割り当てられます。

}

spacer_1 タイルは、幅と高さが両方とも 1 のスペー

spacer_1 : spacer {①属性のタイプ
属性の値は、次のいずれかのデータ タイプで指定します。
・整数ータイルの幅や高さなど、長さを表す数値 ( 整数 ) で、文字幅または文字高さの単位で指定します。
・実数ー同上ですが、1 未満の実数には小数点の前に 0 を付けます。たとえば、.1 ではなく 0.1と指定します。

サです。このタイルは、ユーザーに何とか見える程

height = 1;

度の小さなスペーサに使用します。

width = 1;

②クォーテーションで囲まれた文字列
文字列は、文字をクォーテーション マーク ("") で囲んで指定します。属性値では大文字と小文

horizontal_margin = none;

字が区別されます。たとえば、A1 は a1 と同じではありません。

vertical_margin = none;

文字列にクォーテーションを含めなければならない場合は、クォーテーションの前に円記号を}付けます (¥")。
（例） "(set_tile ¥"text1¥" ¥" 面取りが選択されました。¥")"

5 ixed_width = true,false
fixed_width = false

width4 :dialog
{

¥"
¥¥
¥n
¥t

DCL 文字列で使用できる制御文字
意 味
クォーテーション ( 文字列の内部 )
円記号
改行
水平タブ

制御文字

label = "fixed_width = true";:column{:edit_box{

レイアウト時に幅が変化します。

DCL ファイルでは、2 つのスラッシュ (//) 以降はコメントとみなされ、// から行の終わりまでの文字は無視されます。

label = "A";

また、C 言語形式のコメントも認められており、その形式は /* コメント */ です。

key = "yoko_1";

左側の /* と右側の */ は同じ行になくてもかまいません。

1 fixed_width = true;
value = "";fixed_width = true

③ DCL ファイルのコメント（例）}:edit_box /* 編集ボックス処理タイルスタート */:edit_box{{

label = "C";label = "B";

1

1 fixed_width = true;}}/* OK or CANCEL */spacer;ok_cancel;}//end2-13

space と width

width = 6;value = "";1

レイアウト時に幅が変化しません。

key = "yoko2";

key = "tate_1";

value = "";}/* 編集ボックス処理タイル終了 *//* OK or CANCEL */spacer;ok_cancel;}//endタイルの属性

2-14

ダイアログとタイルの構造

ダイアログとタイルの構造

spacer_0 は、通常は幅のないスペーサです。しかタイルの属性第 1 章－ダイアログとタイルの構造

ダイアログとタイルの構造

1 定義済み属性の概要
AutoCAD の PDB ( プログラマブル ダイアログ ボックス ) 機能には組み込みタイル ( 定義済みタイル )があり、それ単独で使用することも、より複雑なタイルの基礎として使用することもできます。
これらの定義は、base.dcl 内でコメントで示されています。
ユーザーがアクティブなタイル ( たとえばボタンなど ) を選択すると、ダイアログ ボックスはそのダイアログ ボックスをコントロールしているアプリケーションに通知することによって応答します。
定義済みのアクティブなタイルにはすべて、関連するアクションを指定できます。アクションの結果をユーザーに表示することも、内部だけで処理することもできます。
以下に、選択可能なアクティブなタイルを示します。
buttonedit_box
image_button
list_box

選択可能なアクティブタイル
popup_list
radio_button
slidertoggle

定義済み属性対象
意味 ( 割り当てた場合、または true を指定した場合 )すべてのアクティブな AutoLISP のアクション式
タイル
alignment
すべてのタイル
クラスタ内での水平または垂直位置
allow_accept edit_box、image_このタイルが選択されたときに is_default ボタンをアク
button、list_box
ティブにしますaspect_ratio
image、image_button イメージの縦横比
big_increment slider
スライダの移動量に対応する値の変化量
children_row, column、radio_ クラスタの子の位置合わせalignment
row、radio_column、
boxed_row、boxed_column、boxed_radio_row、boxed_radio_column
children_ixed_ row, column、radio_ レイアウト時にクラスタの子の高さが変化しません
heightrow、radio_column、
boxed_row、boxed_column、boxed_radio_row、boxed_radio_column
children_ixed_ row, column、radio_ レイアウト時にクラスタの子の幅が変化しません
width
row、radio_column、
boxed_row、boxed_column、boxed_radio_row、boxed_radio_column

color
edit_limit
edit_width
fixed_height
fixed_width
fixed_width_
fontheightinitial_focus
is_bold
is_cancel
is_default
is_enabled
is_tab_stop
ワード
label

属性名
action2-15タイルの属性layoutlist
max_value
min_valuemnemonic

image、image_button イメージの背景 ( 塗り潰し ) 色
edit_box
ユーザが入力できる最大文字数
edit_box、popup_list タイルの編集 ( 入力 ) 部分の幅
すべてのタイルレイアウト時に高さが変化しません
すべてのタイルレイアウト時に幅が変化しません
list_box、popup_list 文字を固定幅フォントで表示します
すべてのタイル
Dialog[ 文字 ]
Buttonタイルの高さ最初にフォーカスを設定するタイルのキー太字で表示されます
キャンセル キー ( 通常は [Esc]) を押すと、ボタンがアクティ
ブになります。
Button
了解キー ( 通常は [Enter]) を押すと、ボタンがアクティブになります。
すべてのアクティブな 初期状態でタイルが使用可能になります
タイル
すべてのアクティブな タイルがタブ停止位置になります
タイル
すべてのアクティブな アプリケーションが使用するタイル名タイル
boxed_row、boxed_ タイルの表示ラベル
column、boxed_radio_row、boxed_radio_column、
button、dialog、
edit_box、list_box、
popup_list、radio_
button、text、toggle
slider
スライダが水平か垂直か
list_box、popup_list リストに表示する初期値
sliderスライダの最大値
sliderスライダの最小値
すべてのアクティブな タイルのショートカット キー ( ニモニック文字 )タイル
list_box
リスト ボックスで複数の項目を選択できるようにしますmultiple_selectpassword_char edit_box[ 編集ボック edit_box に入力された文字を指定した文字でマスクしまス]
す。
small_
sliderスライダの移動量に対応する値の変化量
incrementtabs
list_box、popup_list リスト表示のタブ停止位置
tab_truncate list_box、popup_list タブ停止位置を超える文字列を切り取ります。
value
text, アクティブなタイ タイルの初期値
ル ( ボタンとイメージ
ボタンを除く )width
すべてのタイル
タイルの幅

タイルの属性

2-16

ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

個別タイルの構成

1 テキスト タイル (Text_Tile)

3 トグル ボタン (Toggle)
ダイアログとタイルの構造

ダイアログとタイルの構造

第6節

トグルは、真偽値（"0" か "1"）をコントロールします。ユーザーがボタンを選択するとチェックマークが表示または非表示されます。
（1 つ 1 つは独立しています。
）

タイトルを作成したり、情報を提供するための文字列を表示します。
base.dcl で定義済みの既定値
toggle : tile{
fixed_height = true;
is_tab_stop = true;}base.dcl で定義済みの既定値
text : tile{
fixed_height = true;}

値 (Value) は、label と同様にテキストタイルに表示する文字列を指定: text

値 (Value) は、"0" か "1" の文字列
:toggle{{label = " 図形タイプ ";←タイル内に表示する文字を指定

label = "A3";← toggle_button の右側に表示される文字

key = "text1";←プログラムがこの text を参照するための名前

key = "A3";←プログラムがこの toggle_button を参照するための名前

width = 30;←タイルの幅（文字列単位で指定 )}}:toggle{2 編集ボックス (Edit_Box)label = "A2";← toggle_button の右側に表示される文字

key = "A2";←プログラムがこの toggle_button を参照するための名前

value = "1";← toggle の初期状態で、文字列が "1" の場合は選択されていることを表す}

1 行の文字を入力または編集するフィールド
base.dcl で定義済みの既定値
edit_box : tile{
fixed_height = true;
is_tab_stop = true;}:toggle{label = "A1";← toggle_button の右側に表示される文字

key = "A1";←プログラムがこの toggle_button を参照するための名前}
Point!

値 (Value) は、ASCII 文字列: edit_box

左のように記述した場合、内部データは右のように定義されます。

{{
label = "A";

←タイル内の左側に表示する文字を指定

key = "yoko_1";←プログラムがこの edit_box を参照するための名前

label = "A3";

key = "A3";width = "";←タイルの幅（文字列単位で指定）

key = "A3";

fixed_height = true;

value = "";←タイルの初期値（"" は空白の状態）

}

2-17

label = "A3";{

is_tab_stop}= true;}

個別タイルの構成

個別タイルの構成

2-18

第 1 章－ダイアログとタイルの構造

4 ラジオ ボタン (Radio_Button)

5 ラジオ ボックス (Radio_Row & Column)

クラスタ（グループ）の内、1 つのボタンしか選択できません。

radio_row(column) には複数の radio_button が含まれますが、その内の 1 つしか選択できません。

（1 つを選択すると、他のボタンは自動的にオフ <"0"> になります。
base.dcl で定義済みの既定値
radio_button : tile{
fixed_height = true;
is_tab_stop = true;}
値 (Value) は、"0" か "1" の文字列
:radio_row

値 (Value) は、現在選択されているラジオ ボタン（value が "1"）の key を表す文字列:radio_row{{
label = " 用紙の大きさ ";key = "sel_yousi";{label = " 用紙の大きさ ";←ボックスに表示される文字

key = "sel_yousi";{←プログラムがこのクラスタ（グループ）を参照するための名前:radio_button:radio_button{{label = "A3";label = "A3";← radio_button の右側に表示される文字

key = "A3";←プログラムがこの radio_button を参照するための名前}

key = "A3";}:radio_button:radio_button{{label = "A2";label = "A2";← radio_button の右側に表示される文字

key = "A2";←プログラムがこの radio_button を参照するための名前

value = "1";

←この button の初期値は <On>

key = "A2";
value = "1";}}:radio_button:radio_button{{label = "A1";label = "A1";← radio_button の右側に表示される文字

key = "A1";←プログラムがこの radio_button を参照するための名前}
Point!
左のように記述した場合、内部データは右のように定義されます。
{{

label = "A3";label = "A3";

key = "A3";

key = "A3";

fixed_height = true;}

is_tab_stop= true;key = "A1";}base.dcl で定義済みの既定値
radio_row : radio_cluster{
horizontal_margin = none;
vertical_margin = none;
children_alignment = centered;}base.dcl で定義済みの既定値
boxed_radio_row : radio_cluster{
label = " ";boxed = true;
children_alignment = centered;
}

}

2-19

個別タイルの構成

個別タイルの構成

2-20

ダイアログとタイルの構造

ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

6 スライダー (Slider)7 ポップアップ リスト (Popup_List)

スライダは、数値を獲得します。ユーザーはスライダーのインジケータを左右 ( または上下 ) に

初めてダイアログ ボックスを表示したとき、ポップアップは閉じた状態で表示され、右側にドラッグすることによって、値を指定します。

下向きの矢印があることを除けばボタンと同じ形です。ユーザーがテキストまたは矢印を選択す
ると、リストが開いて選択肢が表示されます。
base.dcl で定義済みの既定値
slider : tile{
is_tab_stop = true;}

値 (Value) は、現在の（整数）値を表す文字列:slider{key = "slider01";←プログラムがこの slider を参照するための名前

min_value = 0;

←スライダーが取得する値の最小値

max_value = 100;

←スライダーが取得する値の最大値

small_increment = 10;←スライダーのインジケーターが動く最小単位

big_increment = 20;←スライダーのインジケーターが動く最大単位

width = 30;←タイルの幅（文字列単位で指定）

fixed_width = true;←タイルの幅を利用可能なスペースいっぱいに広げるかどうかを指定

is_tab_stop = false;← [tab] を押してタイルを移動したときに、このタイルにフォーカスを設定}

base.dcl で定義済みの既定値
popup_list : tile{
is_tab_stop = true;
fixed_height = true;}

値 (Value) は、"0" か "1" の文字列
:popup_list{
key = "list1";←プログラムがこの list を参照するための名前

label = "Popup_List";←タイル内に表示する文字を指定

width = 15;←タイルの幅（文字列単位で指定）

value = "0";←タイルの初期値（"0" はリストの第１番目を選択）}
下の例では、"list1" の値は、"1" です。

するかどうかを指定（既定は true）

下の例では、"slider01" の値は、"20" です。

Point!

slidertext_tile

リストの 1 つを選択すると、それに対応する数値文字("0" or "1") が取得できます。
A 社を選択すると、<"0"> の値を取得します。
B 社を選択すると、<"1"> の値を取得します。

Point!

C 社を選択すると、<"2"> の値を取得します。
スライダーでは数値を表示するために

D 社を選択すると、<"3"> の値を取得します。

text_tile か edit_box を配置してE 社を選択すると、 <"4"> の値を取得します。

スライダーの数値を明示する必要があります。

2-21

個別タイルの構成

個別タイルの構成

2-22

ダイアログとタイルの構造

ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造②リストから複数選択する場合

8 リスト ボックス (List_Box)
ダイアログとタイルの構造

ダイアログとタイルの構造

Multiple_Select = TRUE;

行単位で整列された文字列のリストで、選択した行がハイライト表示されます。
popup_list と違って、複数の項目を選択することができます。

base.dcl で定義済みの既定値
list_box : tile{
is_tab_stop = true;height
= 10;
width
= 10;
}

①リストから 1 つだけ選択する場合
Multiple_Select = FALSE;

base.dcl で定義済みの既定値
list_box : tile{
is_tab_stop = true;height
= 10;
width
= 10;
}

値 (Value) は、ゼロ個 ("")、またはそれ以上の整数を含む文字列: list_box
値 (Value) は、ゼロ個 ("")、または 1 つの整数を含む文字列: list_box{{

label ="List_Box";←タイル内に表示する文字を指定

key = "list1";←プログラムがこの list を参照するための名前

label ="List_Box";←タイル内に表示する文字を指定

height = 10;←タイルの高さ（文字高さの単位で長さを表す整数または実数）

key = "list1";←プログラムがこの list を参照するための名前

width = 20;←タイルの幅（文字列単位で指定）

height = 10;←タイルの高さ（文字高さの単位で長さを表す整数または実数）

multiple_select = true;←複数の選択を許可する

width = 20;←タイルの幅（文字列単位で指定）

value = "";←タイルの初期値（"" は何も選択していない状態）

multiple_select = false;←複数の選択を許可しない

value = "";←タイルの初期値（"" は何も選択していない状態）}}

Point!
Point!

上の例では、"list1" の値は、"1" です。

上の例では、"list1" の値は、"1 3 4" です。
リストから複数を選択すると、全体を 1 つの数値文字 "0 1" が取得できます。

リストの 1 つを選択すると、それに対応する数値文字

A 社だけを選択すると、<"0"> の値を取得します。

"0" や "1" が取得できます。

A 社、B 社、C 社を選択すると、<"0 1 2"> の値を取得します。

A 社を選択すると、<"0"> の値を取得します。
B 社を選択すると、<"1"> の値を取得します。
C 社を選択すると、<"2"> の値を取得します。
D 社を選択すると、<"3"> の値を取得します。
E 社を選択すると、 <"4"> の値を取得します。
リストから、"0" や "1" に対応する文字 "A 社 "、"B 社 " をB 社、C 社、E 社を選択すると、<"1 2 4"> の値を取得します。
<"0 1 2"> のリストから read 関数で 1 つずつ取り出し、その数字に対応する文字をリストにしていきます。つまり、数値のリストから文字のリストに変換していきます。
結果は、("A 社 " "B 社 " "C 社 ") のリストになります。

取得します。

2-23

個別タイルの構成

個別タイルの構成

2-24

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造
スライドファイルの作り方

イメージタイルは表示するだけでなく、key を割り当てて action 式を記述することができます。

Step1 － AutoCAD のレイアウト空間（ペーパー空間）に移ります。

ダイアログとタイルの構造

ダイアログとタイルの構造

9 イメージ (Image_Button)

新規図面でも既存の図面でも構いません。
base.dcl で定義済みの既定値
icon_image : image_button
{
color
= 0;
width
= 12;
aspect_ratio= 0.66;
allow_accept = true;
fixed_height = true;
fixed_width= true;}Step2 － [ レイアウト ビューポイント ] パネル → [ 矩形 ] を選びます。
（左図）
マウスで窓を 1 つ作成します。
（右図）

IMAGE
:icon_image

縦横の比率は、ダイアログの縦横の比率と同じ程度にします。

{
key = "image01";←プログラムがこの image を参照するための名前

width = 30;←タイルの幅（文字列単位で指定）

height =15;

←タイルの高さ（文字高さの単位で長さを表す整数または実数）}
Point!
左の図は、イメージを表示しているだけです。説明文よりイメージの方が判りやすくなります。
右の図は、イメージを表示するだけでなく、どちらかのイメージを選択すればそのイメージに関連付けたプログラムを起動できます。

Step3 －レイアウトで、ペーパー空間からレイアウト ビューポート内のモデル空間に切り替えて、作図します。
（コマンド ラインから [ mspace] と入力します。
）

第4章3節

第4章3節
Step4 －作図が完成すると、キーボードから <mslide> と入力します。
ファイル名を入力する時に、拡張子の <sld> は必要ありません。

2-25

個別タイルの構成

個別タイルの構成

2-26

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第7節

10 ボタン (Button)
ちに表示されるアクションに適しています。

1 AutoCAD が提供する Ok_only ボタン

ダイアログとタイルの構造

ダイアログとタイルの構造

ボタンは、ダイアログ ボックスを終了したり、サブダイアログ ボックスに移るなど、ユーザーに直AutoCAD の Ok_Cancel ボタン

ok_only;
ダイアログ ボックスには [OK] ボタン ( またはこれに相当するボタン ) を配置し、ユーザーがボックスを使用したり見た後にそのボタンを押すようにします。多くのダイアログ ボックスには、ユーザー

ユーザーが記述する場合
ok_only; のみ
ok_button key = "accept"

が変更しないでそのままダイアログ ボックスを終了できる、[ キャンセル ] ボタンもあります。
base.dcl で定義済みの既定値
button : tile{
fixed_height = true;
is_tab_stop = true;}[ok_only;] は、base.dcl では以下のように記述されています。
ok_only : column{

BUTTON: button{key = "button1;←プログラムがこの button を参照するための名前

label = " 実行 ";←ボタンの上に表示する文字を指定

is_tab_stop = true;← [tab] を押してタイルを移動したときに、このタイルにフォーカスを設定

is_cancel = false;←キャンセルキー [Esc] を押した時に、このボタンは自動的に選択されない

is_default = true;← [Enter] を押したときに、このタイルが自動的に選択されます

width = 15;←タイルの幅（文字列単位で指定）

height = 10;←タイルの高さ（文字高さの単位で長さを表す整数または実数）

fixed_width = true;←レイアウト時に幅が変化しませんalignment = centered;←クラスタ内での水平または垂直位置が中央: ok_button← OK ボタンの定義{
is_cancel = true;←キャンセル キー ( 通常は [Esc]) を押すと、ボタンがアクティブ}}//end2 AutoCAD が提供する Ok_cancel ボタン
ok_cancel;
ユーザーが記述する場合
ok_cancel; のみ
ok_button key = "accept"
cancel_button key = "Cancel"}
Point!

is_default = true;

有効な値は、true または false です ( 既定は、false)。allow_accept 属性に true が指定されている edit_box、list_box、image_button の中では、ユーザーが了解キーを押したとき、または ( リスト ボックスとイメージ ボタンの場合は ) ダブルクリックしたときに、既定ボタンも選択されます。別のボタンにフォーカスが設定されている場合は、了解キーを押しても既定ボタンは選択されません。この場合、フォーカスが設定されているボタンが選択[ok_cancel;] は、base.dcl では以下のように記述されています。
ok_cancel : column
{
: row
{

されます。
is_default 属性に true を指定できるのは、1 つのダイアログ ボックスについて 1 つのボタンだけです。

fixed_width = true;←レイアウト時に幅が変化しませんalignment = centered;←クラスタ内での水平または垂直位置が中央

ok_button;← OK ボタンの定義: spacer { width = 2; }← AutoCAD が割り当てる標準のスペース属性値

cancel_button;← Cancel ボタンの定義}}//end2-27

個別タイルの構成

AutoCAD の Ok_Cancel ボタン

2-28

第 1 章－ダイアログとタイルの構造

第 1 章－ダイアログとタイルの構造

第8節

ユーザー定義の Ok_Cancel ボタン

1 ユーザーが作成する Ok_cancel ボタン

ok_cancel_help;

ダイアログとタイルの構造

ダイアログとタイルの構造

3 AutoCAD が提供する Ok_cancel_help ボタン

ユーザーが記述する場合
ok_cancel_help; のみ
ok_button key = "accept"
cancel_button key = "Cancel"
help_button key = "help"[ok_cancel_help;] は、base.dcl では以下のように記述されています。
: row {

ユーザーが [Ok]、[Cancel] ボタンを配置するには、button タイルに記述します。
MyYesNo : dialog

fixed_width = true;←レイアウト時に幅が変化しませんalignment = centered;←クラスタ内での水平または垂直位置が中央

ok_button;← OK ボタンの定義: spacer { width = 2; }← AutoCAD が割り当てる標準のスペース属性値

cancel_button;← Cancel ボタンの定義

fixed_width = true;←レイアウト時に幅が変化しません: spacer { width = 2; }← AutoCAD が割り当てる標準のスペース属性値

alignment = centered;←クラスタ内での水平または垂直位置が中央{
key = "Title";←プログラムがこのダイアログのタイトルを参照するための名前

label = "MyYesNo";←ボタンの上に表示する文字を指定

spacer;←スペースを配置: row {: button {help_button;

key = "accept";}}//endPoint!

←了解キー ( 通常は [Enter]) を押すと、ボタンがアクティブ

width = 8;

←タイルの幅（文字列単位で指定）

fixed_width = true;←レイアウト時に幅が変化しません: button {一例として以下のように記述します。
① (action_tile "accept" "(done_dialog 1)")→ done_dialog の status（フラッグ）に <1> をセットして終了する② (action_tile "cancel" "(done_dialog 0)")③ (action_tile "help" "( コールバック関数など )")←タイルのショートカット キー ( ニモニック文字 )is_default = true;}[OK] ボタン、[Cancel] ボタン、[Help] ボタンは AutoLISP では→ done_dialog の status（フラッグ）に <0> をセットして終了する←プログラムがこの button を参照するための名前

label = "&Yes";

key = "Cancel";←プログラムがこの button を参照するための名前

label = "&No";←タイルのショートカット キー ( ニモニック文字 )is_cancel = true;←キャンセル キー ( 通常は [Esc]) を押すと、ボタンがアクティブ

width = 8;

←タイルの幅（文字列単位で指定）

fixed_width = true;←レイアウト時に幅が変化しません}}}//end→ダイアログを終了せずに、コールバック関数（サブ関数）を起動する
Point!
[Ok]、[Cancel] ボタンのラベルを変更するためには、AutoCAD が提供する<Ok_cancel;> ではなく、[button] を配置して、そのラベルに記述します。
そのボタンを <Ok> ボタンにするには、<key = "accept";>、<Cancel> ボタンにするには <key = "Cancel";> と記述します。

2-29

AutoCAD の Ok_Cancel ボタン

ユーザー定義の Ok_Cancel ボタン

2-30

第 1 章－ダイアログとタイルの構造

ダイアログとタイルの構造

2 ユーザーが作成する Ok_cancel_help ボタン

第 2 章 タイルの機能とコールバック関数
各タイルにはそれぞれの役割があり、機能も異なります。
ユーザーが [Ok]、[Cancel] ボタンを配置するには、button タイルに記述します。
MyOkCancelHelp : dialog{
key = "Title";←プログラムがこのダイアログのタイトルを参照するための名前

label = "MyOkCancelHelp";←ボタンの上に表示する文字を指定

spacer;←スペースを配置: row{:spacer { width = 1; }←スペースを配置: button{

第 1 節

ダイアログ ボックスの開始関数と終了関数

第 2 節

タイル処理関数 (Set_Tile) (Get_Tile) (Mode_Tile) (Action_Tile)

第 3 節

Text_Tile

第 4 節

Edit_Box

第 5 節

Radio_Buttonlabel = " 処理実行 ";←ボタンの上に表示する文字を指定

is_default = true;←了解キー ( 通常は [Enter]) を押すと、ボタンがアクティブ

key = "accept";←プログラムがこの button を参照するための名前

width = 8;

←タイルの幅（文字列単位で指定）

fixed_width = true;←レイアウト時に幅が変化しません

第 6 節

Toggle_Button←スペースを配置

第 7 節

Slider

第 8 節

Popup_List

第 9 節

List_Box

第 10 節Icon_Image

第 11 節リストの作り方（Popup_List、List_Box 共通）

第 12 節コールバック関数

第 13 節

エラーを回避する}:spacer { width = 1; }: button{label = " 処理中止 ";←ボタンの上に表示する文字を指定

is_cancel = true;←キャンセル キー ( 通常は [Esc]) を押すと、ボタンがアクティブ

key = "Cancel";←プログラムがこの button を参照するための名前

width = 4;

←タイルの幅（文字列単位で指定）

fixed_width = true;←レイアウト時に幅が変化しません}:spacer { width = 1; }←スペースを配置: button{label = " 説明 ";←ボタンの上に表示する文字を指定

key = "help";←プログラムがこの button を参照するための名前

width = 4;

←タイルの幅（文字列単位で指定）

fixed_width = true;←レイアウト時に幅が変化しません}:spacer { width = 1; }←スペースを配置}}//end2-31

この章では、ユーザーの目的に応じたタイルの使い分けとそのコントロールの仕方について解説します。

ユーザー定義の Ok_Cancel ボタン

第 2 章－タイルの機能とコールバック関数

タイル処理関数と属性処理関数

ダイアログ ボックスの 開始関数と終了関数の概要を、次の表に示します。

DCL タイル処理関数と属性処理関数の概要を、次の表に示します。

ダイアログ ボックス開始関数と終了関数
関数名説 明
DCL ファイルをロードします。
① (load_dialog dcl ファイル名 )新しいダイアログ ボックスを開始し、初期化します。
② (new_dialog ダイアログ名 dcl_id)
既定のアクションを指定することもできます。
ダイアログ ボックスを表示し、ユーザー入力の受け入れ③ (start_dialog)
を開始します。
ダイアログ ボックスを終了します。
④ (done_dialog [ フラッグ <status>)⑤ (unload_dialog dcl_id)
DCL ファイルをロード解除します。

タイル処理関数と属性処理関数
関数名① (set_tile "key" " 値 <value>")② (get_tile "key")③ (mode_tile "key" 値 <value>)

S_Edit1.dcl

AutoLISP 関数でダイアログを宣言します。

タイルの機能とコールバック

第2節

ダイアログ ボックスの開始関数と終了関数(defun c:S_Edit1 ( / dialog-box dcl_id)④ (action_tile "key" " 処理内容 ")上記①から④は (new_dialog) と (start_dialog) の間に記述します。
(defun c:S_Edit1 ( / dialog-box dcl_id);<< ダイアログを読み込み、表示する。>>(setq dcl_id (load_dialog "S_Edit1"))① load_dialog を呼び出し、DCL ファイルをロードします。

(new_dialog "S_Edit1" dcl_id)

Point!

→ (setq dcl_id (load_dialog "S_Edit1.dcl"))② new_dialog を呼び出し、特定のダイアログ ボックスを表示します。

;<< スライドを読み込み、セットする >>・image の配置 (start_image、fill_image、slide_image、end_image)→ (new_dialog "S_Edit1" dcl_id)(setq x1 0 y1 0); スライドを表示する左上の原点を指定する(setq x2 (dimx_tile "image00")); スライドを表示する X の幅を指定する

・set_tile 関数

・リストの配置 (start_list、add_list、end_list)(setq y2 (dimy_tile "image00")); スライドを表示する Y の幅を指定する

・action_tile 関数

・image の配置 (start_image、fill_image、slide_image、end_image)(start_image "image00");"image00" にスライドを読み込む

・get_tile 関数

・AutoLISP による計算処理(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色にする

・mode_tile 関数

・サブ関数への分岐処理(slide_image x1 y1 x2 y2 "S_Edit1"); スライド (S_Edit1) を表示する(end_image); スライドの読み込みを終了③ start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

→ (setq dialog-box (start_dialog))→ (unload_dialog dcl_id)[Ok] ボタンが押された時は、システム変数 [DIASTAT] に <1> がセットされます。

(set_tile "yoko1" "");"yoko1" の初期値を空白にセットする(set_tile "yoko2" "");"yoko2" の初期値を空白にセットする(set_tile "tate1" "");"tate1" の初期値を空白にセットする(set_tile "tate2" "")[Cancel] ボタンが押された時は、<0> がセットされます。
⑤もし [Ok] ボタンが押された時は、以下のプログラムを実行します。

(action_tile "yoko1""(setq yoko1 (get_tile ¥"yoko1¥"))";"yoko1" の値を変数 [yoko1] にセットする"(mode_tile¥"tate1¥" 2)";"tate1" にカーソルのフォーカスを移す)→ (action_tile "accept" "(done_dialog 1)")・[cancel] ボタンで終了したときは、"done_dialog" のフラッグ (status) に <0> をセットします。

（中略）→ (action_tile "cancel" "(done_dialog 0)")・;<<start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替える。>>(setq dialog-box (start_dialog))→ (setq chkdia (start_dialog));<<unload_dialog を呼び出して DCL ファイルをロード解除する。>>(unload_dialog dcl_id)→ (unload_dialog dcl_id)(if(= (getvar "DIASTAT") 1) (alert "¥n 終了します。"))⑤もし、(done_dialog) のフラッグ (status) が <1> であれば、以下のプログラムを実行します。

ダイアログ ボックスの開始関数と終了関数;"yoko1" の action を起こしたとき)[Ok] ボタンで終了したときは、"done_dialog" のフラッグ (status) に <1> をセットします。

→ (if(= chkdia 1)(alert "¥n 終了します。"));"tate2" の初期値を空白にセットする(strcat③以降は次の方法もあります。

④ unload_dialog を呼び出して DCL ファイルをロード解除します。

Point!

;<< edit_box 処理 yoko1 に値を受け取る >>・action_tile 関数・get_tile 関数・mode_tile 関数→ (if(= (getvar "DIASTAT") 1) (alert "¥n 終了します。"))③ start_dialog を呼び出して、コントロールをダイアログ ボックスに切り替えます。

Point!

;<< 各タイル の初期設定 >>・set_tile 関数④ unload_dialog を呼び出して DCL ファイルをロード解除します。

2-33

説 明
ダイアログ ボックスのタイルの値を設定します。
ダイアログ ボックスのタイルの現在の値を取得します。
ダイアログ ボックスのタイルのモードを設定します。
ユーザーがダイアログ ボックスで特定のタイルを選択したときのアクションを割り当てます。

タイルの機能とコールバック

第1節

第 2 章－タイルの機能とコールバック関数)

タイル処理関数と属性処理関数

2-34

第 2 章－タイルの機能とコールバック関数

1

目的
書式

Set_Tile

第 2 章－タイルの機能とコールバック関数

ダイアログ ボックスの値を設定します。
(set_tile "key" " 値 <value>")Radio_Row

key = "sel_yousi"

セットする値 (value) = "A2"

(set_tile "sel_yousi" "A2")
Text

key = "text1"

セットする値 (value) = " 図形タイプは、線分です。"(set_tile "text1" " 図形タイプは、線分です。")

Radio_Row（または、Radio_Column）は、そのクラスタ（グループ）の Radio_Button の
key 名を指定します。

key = "yoko_1"

セットする値 (value) = "200"整数や実数、角度をセットする場合は、文字列に変換してセットします。
key = "A3"セットする値 (value) = "1"

key = "A2"セットする値 (value) = "0"

key = "A1"

セットする値 (value) = "0"

セットする値 (value) = "20"スライダーの値は、text_tile や edit_box に表示させます。
Popup_List

key = "list1"

セットする値 (value) = "1"

list1 のデータは（ "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")(set_tile "list1" "1")
リストの値は、リストの具体的な値（名前）でなく、(set_tile "A3" "1")"0" から始まるリスト番号（文字）で指定します。

(set_tile "A2" "0")(set_tile "A1" "0")List_Box（1 つだけ）

それぞれのチェック ボタンは独立しています。
"A3" をチェックしたとき、他の 2 つは自動的にオフ<"0"> になりません。

Radio_Button

key = "slide01"(set_tile "slide01" "20")(set_tile "yoko_1" "200")

Toggle_Button

Slider

タイルの機能とコールバック

タイルの機能とコールバック

Edit_Box

key = "A3"セットする値 (value) = "0"

key = "A2"セットする値 (value) = "1"

key = "A1"

セットする値 (value) = "0"

key = "list1"

セットする値 (value) = "1"

list1 のデータは（ "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")(set_tile "list1" "1")
リストの値は、リストの具体的な値（名前）でなく、"0" から始まるリスト番号（文字）で指定します。
List_Box（複数）key = "list1"

セットする値 (value) = "1 3 4"

list1 のデータは（ "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")(set_tile "A2" "1")"A2" を "1" にセットすると、他の 2 つ（"A3" と "A1"）は自動的にオフ <"0"> にセットされます。

2-35

タイル処理関数と属性処理関数(set_tile "list1" "1 3 4")
リストの値は、リストの具体的な値（名前）でなく、"0" から始まるリスト番号（文字）で指定します。

タイル処理関数と属性処理関数

2-36

第 2 章－タイルの機能とコールバック関数

2

Get_Tile

目的
書式

第 2 章－タイルの機能とコールバック関数

ダイアログ ボックスのタイルの現在の値を取得します。
(get_tile "key")

Radio_Row

key = "sel_yousi"

取得する値 (value) = "A2"

(setq a (get_tile "sel_yousi")→ a = "A2"
key = "text1"

取得する値 (value) = " 図形タイプは、線分です。"(setq a (get_tile "text1"))

Radio_Row（または、Radio_Column）は、そのクラスタ（グループ）の Radio_Button の→ a = " 図形タイプは、線分です。"

key 名を取得します。

タイルの機能とコールバック

Slider
Edit_Box

key = "yoko_1"

key = "slider01"

取得する値 (value) = "20"
タイルの機能とコールバック

Text

取得する値 (value) = "200"(setq a (get_tile "slider01")→ a = "20"

(setq a (get_tile "yoko_1")→ a = "200"Popup_List

key = "list1"

取得する値 (value) = "1"

list1 のデータは（ "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")Toggle_Button

key = "A3"

取得する値 (value) = "1"

key = "A2"

取得する値 (value) = "0"

key = "A1"

取得する値 (value) = "0"(setq a (get_tile "A3") → a = "1"(setq b (get_tile "A2") → b = "0"(setq a (get_tile "list1")→ a = "1""1" から "B 社 " を取得する方法は、P2-132 の⑥を参考

List_Box（1 つ）

key = "list1"

取得する値 (value) = "1"

list1 のデータは（ "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")(setq c (get_tile "A1") → c = "0"(setq a (get_tile "list1")→ a = "1"Radio_Button

key = "A3"

取得する値 (value) = "0"

key = "A2"

取得する値 (value) = "1"

key = "A1"

取得する値 (value) = "0""1" から "B 社 " を取得する方法は、P2-141 の③を参考

List_Box（複数）key = "list1"

取得する値 (value) = "1 3 4"

(setq a (get_tile "A3") → a = "0"(setq b (get_tile "A2") → b = "1"(setq a (get_tile "list1")(setq c (get_tile "A1") → c = "0"→ a = "1 3 4"

"1 3 4" から "B 社 " "D 社 " "E 社 " を取得する方法は、P2-147 の⑧を参考

2-37

タイル処理関数と属性処理関数

タイル処理関数と属性処理関数

2-38

第 2 章－タイルの機能とコールバック関数

Mode_Tile

値 <value>
0
1
2
3
4

Toggle_Buttonmode の値 <value> が <2> のケース;<< edit_box 処理 tate<A> に値を受け取る >>(action_tile "tate"[ 記入する画層 ] にチェックを付けると、[ 画層一覧 ] の Popup_List が開きます。

タイルの <On> と <Off> を反転させるには、以下の 2 通りがあります。
① (action_tile "chk1" "(mode_tile ¥"layer_sel¥" (- 1 (atoi (get_tile ¥"chk1¥"))))")
減算処理により、popup_tile "layer_sel" の mode を反転しています。

(strcat"(setq tate (get_tile ¥"tate¥"))""(mode_tile ¥"yoko¥" 2)");<< edit_box 処理 yoko<B> に値を受け取る >>A に入力 <100> して、
エンターキー（改行）を押すと、カーソルが次のB のボックスに移ります。

(action_tile "yoko""(setq yoko (get_tile ¥"yoko¥"))")② toggle_button "chk1" が <On> か <Off> された時の処理をサブ関数に記述する方法です。
;toggle "chk1" が変更された時、サブ関数 (chk_toggle) を起動する; サブ関数を以下に記述(defun chk_toggle();toggle_button "chk1" の値 <"0"> か <"1"> を整数に変換して変数 [chk] にセット
(setq chk (atoi (get_tile "chk1")))(if (= chk 1); もし、[chk] の値が <1> のときは、次の 1 行目を実行(mode_tile "layer_sel" 0);popup_tile "layer_sel" の mode を <0>（表示）にする

mode の値 <value> が <3> のケース;<< edit_box 処理 tate<A> に値を受け取る >>(action_tile "tate"(strcat"(setq tate (get_tile ¥"tate¥"))""(mode_tile ¥"yoko¥" 2)")(mode_tile "layer_sel" 1) ;[chk] の値が <1> でなければ、"layer_sel" の mode を <1>
（非表示）
);if

; にする

);end
Point!
toggle_button は action された時、その値が <"1"> か <"0"> か判りません。
（radio_button は action された時は、必ず <"1"> です。
）
そのため、その値が <"1"> か <"0"> かを判断する必要があります。

);<< edit_box 処理 yoko<B> に値を受け取る >>(action_tile "yoko"
B に入力 <50> して、エンターキー"(setq yoko (get_tile ¥"yoko¥"))"（改行）を押すと、B の値が選択さ"(mode_tile ¥"yoko¥" 3)"

れた状態になります。

P2-133 の⑤を参考(action_tile "chk1" "(chk_toggle)"))Edit_Boxmode の値 <value> が <0> と <1> のケース

mode_tile の mode のコード
説 明
タイルを使用可能にします。
タイルを使用禁止にします。
タイルにフォーカスを設定します。
編集ボックスの内容を選択します。
イメージのハイライト表示のオンとオフを切り替えます。

タイルの機能とコールバック

Edit_Box

ダイアログ ボックスのタイルのモードを設定します。
(mode_tile "key" 値 <value>)

タイルの機能とコールバック

3

目的
書式

第 2 章－タイルの機能とコールバック関数)

以下のように変数 [a] に値をセットし、その値が <"1"> か <"0"> かによって、プログラ
ムを分岐します。
(setq a (atoi (get_tile "chk1")));"chk1" は <"1"> か <"0"> の文字なので、整数に変換します。

(if ( = a 1) (a が <1> の時のプログラム )(a が <0> の時のプログラム )
);if

2-39

タイル処理関数と属性処理関数

タイル処理関数と属性処理関数

2-40

第 2 章－タイルの機能とコールバック関数
mode の値 <value> が <0> と <1> のケース（第 2 部 3 章 5 節より）

Step1 －左側の図を選択すると、[ 角度 ] のタイルが非表示になり、角度は入力できません。

左側のイメージのダイアログの記述

Icon_Image

mode の値 <value> が <4> のケース

Step1 －プログラムを起動した時は、両方のイメージの背景はオフ（黒色）です。
左図と右図の背景色は黒色 < オフ >2 つの toggle_button の記述:icon_image:toggle{{label = "";label = " 左図 ";key = "image01";

key = "hidari";

width = 30;}

height =15;

:toggle}{タイルの機能とコールバック

label = " 右図 ";key = "migi";

選択できません！

};<< image01 処理 変数 check=1 >>(action_tile "image01"(strcat"(setq check 1)""(mode_tile ¥"kaku¥" 1)""(mode_tile ¥"sen2¥" 0)"));icon_image "image01" を選択したときの動作を記述する; 変数 [check] の値を <1> にセット（後でプログラムの分岐に使う）

起動時は、両方のイメージの背景を黒 < オフ > にセットしておきます。

(mode_tile "image01" 4)(mode_tile "image02" 4);edit_box "kaku" を非アクティブ（入力不可能）にする;edit_box "sen2" をアクティブ（入力可能）にする

Step2 － toggle の [ 左図 ] を選択（チェックする）と左のイメージ (image01) のハイライトがオン（背景が白色）になります。
同様に、toggle の [ 右図 ] を選択（チェックする）と右のイメージ (image02) のハイライ

Step2 －右側の図を選択すると、[2 本目 ] のタイルが非表示になり、2 本目の入力はできません。

トがオン（背景が白色）になります。

右側のイメージのダイアログの記述

チェックボックス (hidari) をオンにするとチェックボックス (migi) をオンにすると:icon_image

image01 の背景が白色

image02 の背景が白色{
label = "";key = "image02";
width = 30;
height =15;}

選択できません！
;<< image02 処理 変数 check=2 >>(action_tile "image02"(strcat"(setq check 2)""(mode_tile ¥"sen2¥" 1)""(mode_tile ¥"kaku¥" 0)"
)
)

2-41

;icon_image "image02" を選択したときの動作を記述する; 変数 [check] の値を <2> にセット（後でプログラムの分岐に使う）;edit_box "sen2" を非アクティブ（入力不可能）にする;edit_box "kaku" をアクティブ（入力可能）にする

タイル処理関数と属性処理関数<< 左の toggle をチェックした時 (on) >>(action_tile "hidari" "(mode_tile ¥"image01¥" 4)")<< 右の toggle をチェックした時 (on) >>(action_tile "migi" "(mode_tile ¥"image02¥" 4)")

タイル処理関数と属性処理関数

2-42

タイルの機能とコールバック

Icon_Image

第 2 章－タイルの機能とコールバック関数

第 2 章－タイルの機能とコールバック関数

Action_Tile

4

目的
書式

第 2 章－タイルの機能とコールバック関数
サブ関数を起動する

ダイアログ ボックスで特定のタイルを選択したときのアクションを割り当てます。
(action_tile "key" " 処理内容 ")(action_tile "help" "(GetTileVal)") のケース

: button{label = "Cancel";

値を変数にセットする

is_cancel = true;(action_tile "A3" "(setq yousi 1)") のケース

key = "Cancel";
fixed_width = true;}:radio_button{: button(action_tile "A3" "(setq yousi 1)")label = "A3";{(action_tile "A2" "(setq yousi 2)")

key = "A3";label = "Help";
key = "help";(action_tile "A1" "(setq yousi 4)")}fixed_width = true;:radio_button

タイルの機能とコールバック

label = "A2";
key = "A2";;<< help に内部サブ関数を与える >>変数にセットした値は条件分岐に使用します。

}(action_tile "help" "(GetTileVal)")(cond:radio_button;help ボタンを押した時、サブ関数 (GetTileVal)") を起動する。

((= yousi 1) ( プログラム 1 を実行 )){(defun GetTileVal ()((= yousi 2) ( プログラム 2 を実行 ))label = "A1";(setq goukei (* (atof yoko) (atof tate)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))(alert goukei_moji))}

ダイアログは閉じない。

;<< 面積の数値を変数 [goukei] にセットする >>((= yousi 4) ( プログラム 3 を実行 ))key = "A1";

メッセージを表示した後も、)値を get_tile で取得する(action_tile "tate" "(setq tate (get_tile ¥"tate¥"))") のケース

サブ関数を起動して終了する;<< タイルの数値をゲットする（内部サブ関数）>>:edit_box(defun GetTileVal (){;<< 面積の数値を変数 [goukei] にセットする >>label = "A";(setq goukei (* (atof yoko) (atof tate)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))(alert goukei_moji)

key = "tate";}:edit_box){;<< [OK] ボタンと [Cancel] ボタンの動作を記述する >>label = "B";key = "yoko";}(action_tile "accept" "(GetTileVal)(done_dialog)") のケース

(action_tile "tate" "(setq tate1 (get_tile ¥"tate¥"))")(action_tile "yoko" "(setq yoko1 (get_tile ¥"yoko¥"))"); サブ関数を起動して終了する(action_tile "accept" "(GetTileVal)(done_dialog)"); 何もしないで終了する(action_tile "cancel" "(done_dialog)")
get_tile 関数でタイルから文字列の値を受け取る時の注意
タイル内の値は文字ですから、その値を文字以外で利用する場合は変換します。
（タイルの key は <tate>、受け取る値は <"3.14">）
値を文字で使用する場合・・・"(setq a (get_tile ¥"tate¥"))整数で使用する場合・・・"(setq a (atoi (get_tile ¥"tate¥")))";a = "3.14"（そのまま）;a = 3実数で使用する場合・・・"(setq a (distof (get_tile ¥"tate¥")))" ;a = 3.14

2-43

タイル処理関数と属性処理関数[Help] ボタンにサブ関数を割り当てたときは、[Help] を終了してもダイアログは閉じませんが、メッセージを表示した後、[OK] ボタンにサブ関数を割り当てたときは、ダダイアログは閉じる。

イアログは終了します。

タイル処理関数と属性処理関数

2-44

タイルの機能とコールバック}{

第 2 章－タイルの機能とコールバック関数

第3節

第 2 章－タイルの機能とコールバック関数

Text_Tile（線分と円の数を表示する）

S set_tile A action_tile G get_tile M mode_tile

S2_Text.dcl

使用するダイアログ

S2_Text.lsp

使用する LISP(defun c:S2_text ( / lin1 num_lin cir1 num_cir dcl_id dialog-box)
S2_text : dialog

作成時の状態{label = "Text_Tile";
key = "top_label";

text1(setq lin1 (ssget "x" '((0 . "LINE")))); 図面にある線分を全て取得する(setq num_lin (sslength lin1)); 取得した線分の数をカウントする→ Step1; 円の個数

text2: column; 線分の個数{(setq cir1 (ssget "x" '((0 . "CIRCLE")))); 図面にある円を全て取得する(setq num_cir (sslength cir1)); 取得した円の数をカウントする

タイルの機能とコールバック{

起動時の状態label = "";key = "text1";; ダイアログを呼び出す(setq dcl_id (load_dialog "S2_text.dcl"));S2_text.dcl をメモリーに読み込む(new_dialog "S2_text" dcl_id);S2_text ダイアログを初期化する→ Step2

width = 30;}

S (set_tile "top_label" " オブジェクトの数 "): text/* 円の数 */; ダイアログのタイトルを変更する→ Step3; タイルに 2 つの文字を連結してセットする（タイルの値は文字列なので整数を文字に変換する）{
label = "";key = "text2";

S (set_tile "text1" (strcat " 線分の数：" (itoa num_lin))) ; 線分の数を文字に変換

S (set_tile "text2" (strcat " 円の数：" (itoa num_cir))) ; 円の数を文字に変換→ Step4; ダイアログを終了する

プログラム実行時の状態

width = 30;(setq dialog-box (start_dialog)); ユーザー入力を受け付ける}(unload_dialog dcl_id); ダイアログをメモリーから解放する

spacer;(princ)ok_cancel;);end→ Step5}}//endStep1 －図面内の線分と円の数を取得して、変数にセットします。
ダイアログを表示する前に計算を済ませておきます。
Step2 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。

Point!
①ダイアログのタイトル名は AutoLISP から変更できます。
タイトルの key（上記の場合は ["top_label"]）をターゲットに変更します。

Step3 －ダイアログのタイトルを変更します。
（タイトルに "key" を指定していると可能です。
）→ (set_tile "top_label" " オブジェクトの数 ")Step4 － "text1" と "text2" のタイルに計算結果の文字列を代入します。
②ダイアログ内の各タイルの情報（数値や文字）も、その key をターゲットに取得や変更ができます。

[strcat] は、文字列を連結する関数です。
[itoa] は、整数を文字列に変換する関数です。

・"text1" に文字列をセットする場合 → (set_tile "text1" " 線分の数 ")・"text2" の文字列を取得する場合

2-45→ (setq a (get_tile "text2"))

Text_Tile（線分と円の数を表示する）

Step5 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

Text_Tile（線分と円の数を表示する）

2-46

タイルの機能とコールバック: text/* 線分の数 */第 2 章－タイルの機能とコールバック関数

第4節
使用するダイアログ

第 2 章－タイルの機能とコールバック関数

S2_Edit.lsp

使用する LISP

Edit_Box（数値入力を行う）

S set_tile A action_tile G get_tile M mode_tile

S2_Edit.dcl(defun c:S2_edit( / dialog-box dcl_id); ダイアログを呼び出す

作成時の状態

S2_edit :dialog{
label = "Edit_Box";;S2_edit.dcl をメモリーに読み込む(new_dialog "S2_edit" dcl_id);S2_edit ダイアログを初期化する→ Step1;tate の初期設定; ダイアログでセットした数値以外の数値をセットする場合{Slabel = "A";

(set_tile "tate" "100");<"100"> をセットする; yoko の初期設定

key = "tate";Swidth = "";起動時の状態value = "";→ Step2(set_tile "yoko" "50");<"50"> をセットする; edit_box 処理 tate に値を受け取る;mode_tile を <2> にすると、エンターキーを押した時に、カーソルが次のタイルに移動する}

A (action_tile "tate":edit_box{;"tate" を action した時の動作を記述する(strcatlabel = "B";key = "yoko";width = "";; 複数の文字列を連結する

G"(setq tate (get_tile¥"tate¥"))";"tate" の文字列を変数にセットする

M"(mode_tile ¥"yoko¥" 2)"; カーソルを次のタイル "yoko" に移す→ Step3)

value = "";})プログラム実行時の状態/* OK or CANCEL */spacer;; edit_box 処理 yoko に値を受け取る

A (action_tile "yoko"

ok_cancel;;"yoko" を action した時の動作を記述する(strcat}//end; 複数の文字列を連結する（1 行でも可）"(setq yoko (get_tile ¥"yoko¥"))"

G;"yoko" の文字列を変数に代入する→ Step4)); ダイアログを終了する

Point!

{
label = "A";key = "tate";

よく使う値を既定値にしておくには、ダイアログの中で記述しておきます。

(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step5);end
Step1 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。

width = "";value = "200";

Step2 － "tate" と "yoko" の初期値をそれぞれ <"100"> と <"50"> にセットします。

}{

Step3 － "tate" のタイルに入力を受け付けます。エンターを押すと "yoko" のタイルにカーソルが移動します。

label = "B";key = "yoko";width = "";value = "300";}

2-47[OK] ボタンを押した時に、この box の数値を取得する
コールバック関数が必要です。

Edit_Box（数値入力を行う）

Step4 － "yoko" のタイルに入力を受け付けます。
Step5 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

Edit_Box（数値入力を行う）

2-48

タイルの機能とコールバック:edit_box

タイルの機能とコールバック(setq dcl_id (load_dialog "S2_edit.dcl"))

第 2 章－タイルの機能とコールバック関数

第5節

第 2 章－タイルの機能とコールバック関数

Radio_Button（ポリゴンを選択する）

作成時の状態

S2_radio : dialog{
label = "Radio_Button";key = "top_label";(defun c:S2_radio( / dialog_box dcl_id poly); ダイアログを呼び出す(setq dcl_id (load_dialog "S2_radio.dcl"));S2_radio.dcl をメモリーに読み込む(new_dialog "S2_radio" dcl_id);S2_radio ダイアログを初期化する→ Step1;set_tile でダイアログのタイトルを変更:boxed_radio_row

S (set_tile "top_label" " 作図する多角形を選択：") ; ダイアログのタイトルを変更する{:radio_button{

A (action_tile "sankaku" "(setq poly 1)"); 変数 [poly] に <1> をセットする

A (action_tile "sikaku" "(setq poly 2)"); 変数 [poly] に <2> をセットする

A (action_tile "gokaku" "(setq poly 4)"); 変数 [poly] に <4> をセットする(if (= poly nil)label = " 正三角形 ";; どれも選択されなかったら(setq poly 2));if

key = "sankaku";→ Step3;<2> をセットする; ダイアログを終了する}:radio_button

プログラム実行時の状態{(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step4;[OK] ボタンが押された時の処理を記述する

label = " 正方形 ";(if (= (getvar "DIASTAT") 1)

key = "sikaku";;[OK] ボタンが押された場合の処理

(cond

}

((= poly 1)(alert " 正三角形を選択しました ")) ;[poly] が <1> の時のメッセージを表示:radio_button((= poly 2)(alert " 正方形を選択しました ")){;[poly] が <2> の時のメッセージを表示→ Step5((= poly 4)(alert " 正五角形を選択しました ")) ;[poly] が <4> の時のメッセージを表示

label = " 正五角形 ";[OK] ボタンを押すと、メッセージを表示します

key = "gokaku";);cond);if}(princ)});end

spacer;/* OK or CANCEL */ok_cancel;

Step1 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。

}//endStep2 －ダイアログのタイトルを変更します。
Step3 － radio_button が押された時の処理を記述します。
"sankaku" → <1>、"sikaku" → <2>、"gokaku" → <4>

Point!
・radio_box の [key = "sel_poly";] が取得する値は、<"sankaku"> か<"sikaku"> か <"gokaku"> です。
・各 radio_button（"sankaku"、"sikaku"、"gokaku"）が取得する値は、<"0"> か <"1"> です。

2-49

Radio_Button（ポリゴンを選択する）

Step4 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。
Step5 － [Ok] ボタンが押された時、変数 [poly] の値によって alert 関数で表示する
文字列を分岐処理します。

Radio_Button（ポリゴンを選択する）

2-50

タイルの機能とコールバック

起動時の状態

key = "sel_poly";→ Step2;radio_button が押された時の動作を記述する

label = " 正多角形の作図 ";タイルの機能とコールバック

S set_tile A action_tile G get_tile M mode_tile

S2_Radio.dcl

使用するダイアログ

S2_Radio.lsp

使用する LISP

第 2 章－タイルの機能とコールバック関数

第6節

第 2 章－タイルの機能とコールバック関数

S set_tile A action_tile G get_tile M mode_tile

S2_Toggle.dcl

使用するダイアログ

S2_Toggle.lsp

使用する LISP

Toggle_Button（文字入力を可能にする）(defun c:S2_toggle( / dialog_box dcl_id); ダイアログを呼び出す(setq dcl_id (load_dialog "S2_toggle.dcl"));S2_toggle.dcl をメモリーに読み込む(new_dialog "S2_toggle" dcl_id);S2_toggle ダイアログを初期化する→ Step1;text_tile[text1] を使用禁止にする（toggle_button でコントロールするため）M(mode_tile "text1" 1);"text1" タイルの mode を <1> にセット

→ Step2;toggle_button[chk1] がチェックされた時の値 (<"0"> か <"1">) で "text1" タイルの mode を変更

起動時の状態（書き込みは不可）A(action_tile "chk1" "(mode_tile¥"text1¥" (- 1 (atoi (get_tile ¥"chk1¥"))))")M
G ;[OK] ボタンが押された時、このサブ関数を起動して、"text1" タイルにある値を取得する→ Step3(defun SaveTileVal(); コールバック関数を起動する(setq text1 (get_tile "text1"));"text1" タイルの値を変数 [text1] にセット → Step4);[OK] ボタンと [Cancel] ボタンの動作を記述する

A(action_tile "accept" "(SaveTileVal)(done_dialog 1)"); サブ関数に移るA(action_tile "cancel" "(done_dialog 0)"); ダイアログの終了状態を <0> にセット

→ Step5; ダイアログを終了する

チェックをオン（書き込みが可能になる）(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する(if(= chkdia 1);[OK] ボタンが押された時の動作を記述(command "text" pause pause pause text1) ; 文字を書き入れる→ Step6→ Step7);if);end
Point!

Step1 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。

toggle_button のラベルは右側に表示されるので、一般的

Step2 － text_tile[text1] を使用禁止にします。（初期値）に縦型 (boxed_column) に配置します。
しかし、ラベルの文字が少ないためにバランスが悪くなる
場合は、横型 (boxed_row) にします。
:boxed_column:boxed_row

Step3 － (- 1 (atoi (get_tile ¥"chk1¥"))) → "chk1" が <"0"> であれば、"text1" の mode は <1>、<"1"> であれば、"text1" の mode は <0>。これによって、"text1" の mode は反転します。
Step4 － [OK] ボタンが押された時、このサブ関数で "text1" の値を取得します。
Step5 － [OK] ボタンが押されると、サブ関数を起動し、同時にダイアログの終了状態をセットします。
Step6 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。
Step7 － [OK] ボタンが押された時、"text1" の文字を図面に書き入れます。

2-51

Toggle_Button（文字入力を可能にする）

Toggle_Button（文字入力を可能にする）

2-52

タイルの機能とコールバック

タイルの機能とコールバック

S2_toggle : dialog{
label = " 文字入力 ";spacer;:row{:toggle{label = "";key = "chk1";}:edit_box{
key = "text1";
width = 30;
value = "";}}spacer;/* OK or CANCEL */: row{: button{label = " 書き込み ";is_default = true;
key = "accept";
width = 8;
fixed_width = true;}: button{label = " 中止 ";is_cancel = true;
key = "Cancel";width = 8;
fixed_width = true;}}}//end

作成時の状態

第 2 章－タイルの機能とコールバック関数

第7節
使用するダイアログ

第 2 章－タイルの機能とコールバック関数

S2_Slider.lsp

使用する LISP

Slider（スライダーの数値を取得する）

S set_tile A action_tile G get_tile M mode_tile

S2_Slider.dcl(defun c:S2_slider( / dialog_box dcl_id p p1 pt0)
; ダイアログを呼び出す

S2_slider : dialog

作成時の状態{label = "Slider";S:slider(new_dialog "S2_slider" dcl_id);S2_slider ダイアログを初期化する(set_tile "slider1" "0")S (set_tile "text1" " 初期値は <0> です ")text1→ Step1

min_value = 0;

→ Step2;slider が動いた時(strcat
起動時の状態small_increment = 10;;"text1" に初期値の文字列をセットG

big_increment = 20;
width = 30;"(setq p (get_tile¥"slider1¥"))";slider1 の値を変数 [p] にセット"(setq p1 (rtos (atof p)))";"text1" に代入するために文字に変換"(setq pt0 ¥" 現在の値は <¥")"; 表示用の前半の文字列をセット)

is_tab_stop = false;→ Step3"(set_tile ¥"text1¥" (strcat pt0 p1 ¥"> です ¥"))" ;3 つの文字列を連結して "text1" にS

fixed_width = true;; 文字列を結合する; 表示する)}; ダイアログを終了する

:text
{

プログラム実行時の状態

key = "text1";
width = 20;(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step4(princ)});end

spacer;/* OK or CANCEL */ok_cancel;}//endStep1 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。
Step2 － "slider1" の初期値を、<"0"> にセットします。

Point!
slider には水平 (horizontal) と垂直 (vertical) の 2 種類がありますが、既定値は水平 (horizontal) です。

"text1" に文字列 <" 初期値は <0> です "> をセットします。
Step3 － "slider1" が動作したときの処理を記述します。

従って、水平にする場合には記述する必要はありま(rtos (atof p)) → p の値は実数値なので文字列に変換します。

せんが、垂直にする場合は、[layout = "vertical";] をもし p の値が <50> であれば、文字列は次のように表示されます。
" 現在の値は <50> です "付加します。

Step4 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

2-53

Slider（スライダーの数値を取得する）

Slider（スライダーの数値を取得する）

2-54

タイルの機能とコールバック

A (action_tile "slider1"

max_value = 100;;slider が一番左端にセットされる;slider が動いた時に、その値を "text1" にセットして表示する

key = "slider1";
タイルの機能とコールバック;S2_slider.dcl をメモリーに読み込む;slider1 の初期値を "0" にセットする。

spacer;{(setq dcl_id (load_dialog "S2_slider.dcl"))

第 2 章－タイルの機能とコールバック関数

S set_tile A action_tile G get_tile M mode_tile

S2_Popup.dcl

使用するダイアログ(defun C:S2_popup( / blkname blkdata blklst dcl_id sel_block chk1)

S2_popup :dialog

作成時の状態{label = "Popup_List";; 図面内にあるブロックを順番に読み込み、1 つのリストにします。

(setq blkname (tblnext "BLOCK" T)); 最初のブロックを読み込む(while blkname; blkname が nil を返すまで繰り返す(setq blkdata (cdr (assoc 2 blkname))); blkname のブロック名を取得する(setq blklst (append blklst (list blkdata))); 取得したブロックをリストにしていく(setq blkname (tblnext "BLOCK")); 次のブロック ( 無ければ nil を返す）

:popup_list{
label = " ブロック選択 ";タイルの機能とコールバック; ダイアログを呼び出す

width = 35;

起動時の状態value = "";}/* OK or CANCEL */: row{プログラム実行時の状態: button{(start_list "list1" 3);list_box に文字列を新規で流し込む(mapcar 'add_list blklst);blklst のデータを順番に追加していく(end_list);list の終了を通知する→ Step2→ Step3;[OK] ボタンが押された時、このサブ関数を起動して、"list1" で選択された値（整数）を取得する(defun SaveTileVal(); コールバック関数を起動する→ Step4; 変数 [sel_block] にセットする

A (action_tile "accept" "(SaveTileVal)(done_dialog 1)") ; サブ関数に移る

width = 8;

A (action_tile "cancel" "(done_dialog 0)")fixed_width = true;; ダイアログの終了状態を <0> にセット

→ Step5; ダイアログを終了する}: button{(setq chk1 (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step6);endlabel = " 中止 ";Step1 －図面内にあるブロックを全て取得して、1 つのリストにします。

is_cancel = true;
key = "Cancel";
Point!
リストのデータを list_box 内に追加するには、次の順番に沿って行います。

Step2 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。
Step3 －リストにしたブロック名を list_box に新規で順番にセットしていきます。
Step4 －リストで選択した項目は整数値ですから、その順番に符合したブロック名を取得します。

① (start_list)・・リストの処理を開始します。
② (add_list) ・・リスト内に文字列を追加します。
③ (end_list) ・・リスト処理の終了を通知します。

2-55;S2_popup ダイアログを初期化する;[OK] ボタンと [Cancel] ボタンの動作を記述する

key = "accept";}//end(new_dialog "S2_popup" dcl_id))

is_default = true;};S2_popup.dcl をメモリーに読み込む

G (setq sel_block(nth (atoi(get_tile "list1")) blklst)) ; 選択された番号に符合したブロックを

label = " 挿入 ";}(setq dcl_id (load_dialog "S2_popup.dcl"));blklist のデータ を list_box"list1" に流し込んでいく

spacer;fixed_width = true;→ Step1);whilekey = "list1";

width = 8;

S2_Popup.lsp

使用する LISP

Popup_List（ブロックを挿入する）

Popup_List（ブロックを挿入する）

Step5 － [OK] ボタンが押されると、サブ関数を起動し同時にダイアログの終了状態をセットします。
Step6 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

Popup_List（ブロックを挿入する）

2-56

タイルの機能とコールバック

第8節

第 2 章－タイルの機能とコールバック関数

第 2 章－タイルの機能とコールバック関数

S set_tile A action_tile G get_tile M mode_tile

S2_List.dcl

使用するダイアログ(defun C:S2_list( / layname laydata laylst dcl_id sel_Layer chk1)

作成時の状態

S2_list :dialog; 図面内にある画層名を順番に読み込み、1 つのリストにします。

(setq layname (tblnext "LAYER" T)); 最初の画層名を読み込む

label = "List_Box";(while layname; layname が nil を返すまで繰り返す

spacer;(setq laydata (cdr (assoc 2 layname))); layname の画層名を取得する:list_box(setq laylst (append laylist (list laydata))); 取得した画層名をリストにしていく{(setq layname (tblnext "LAYER"))); 次の画層 ( 無ければ nil を返す ){タイルの機能とコールバック

S2_List.lsp

使用する LISP

List_Box（画層を切り替える）

label = " 画層選択 ";; ダイアログを呼び出す

key = "list1";(setq dcl_id (load_dialog "S2_list.dcl"));S2_list.dcl をメモリーに読み込む

multiple_select = false;(new_dialog "S2_list" dcl_id);S2_list ダイアログを初期化する

width = 20;;laylst のデータ を list_box"list1" に流し込んでいく

height = 10;(start_list "list1" 3);list_box に文字列を新規で流し込む(mapcar 'add_list laylst);laylst のデータを順番に追加していく(end_list);list の終了を通知する}

起動時の状態/* OK or CANCEL */spacer;;[OK] ボタンが押された時、このサブ関数を起動して、"list1" で選択された値（整数）を取得する

ok_cancel;(defun GetTileVal()}//end→ Step2→ Step3; コールバック関数を起動する(setq sel_Layer(nth (atoi(get_tile "list1")) laylst)) ; 選択された番号に符合した画層名をG→ Step1)→ Step4; 変数 [sel_layer] にセットする;[OK] ボタンと [Cancel] ボタンの動作を記述する

Point!

A (action_tile "accept" "(GetTileVal)(done_dialog 1)") ; サブ関数に移る

List_Box には単一選択 (multiple_select =A (action_tile "cancel" "(done_dialog 0)")false;) と複数選択 (multiple_select = true;)(multiple_select = false;) です。
従って、単一選択にする場合には記述する
は、[multiple_select = true;] に変更または→ Step5; ダイアログを終了するの 2 種類がありますが、既定値は単一選択

必要はありませんが、複数選択にする場合; ダイアログの終了状態を <0> にセット

プログラム実行時の状態(setq chk1 (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step6);end

付加します。
Step1 －図面内にある画層名を全て取得して、1 つのリストにします。
Step2 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。
Step3 －リストにした画層名を list_box に新規で順番にセットしていきます。
Step4 －リストで選択した項目は整数値ですから、その順番に符合した画層名を取得します。
Step5 － [OK] ボタンが押されると、サブ関数を起動し同時にダイアログの終了状態をセットします。
Step6 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

2-57

List_Box（画層を切り替える）

List_Box（画層を切り替える）

2-58

タイルの機能とコールバック

第9節

第 2 章－タイルの機能とコールバック関数

第 2 章－タイルの機能とコールバック関数

第 10 節

第 2 章－タイルの機能とコールバック関数

S set_tile A action_tile G get_tile M mode_tile

S2_Image.dcl

使用するダイアログ(defun c:S2_image( / dialog_box dcl_id)

S2_image : dialog; ダイアログを呼び出す{
作成時の状態label = "Icon_Image";
key = "top_label";(setq dcl_id (load_dialog "S2_image.dcl"));S2_image.dcl をメモリーに読み込む(new_dialog "S2_image" dcl_id);S2_image ダイアログを初期化する→ Step1; イメージ（slide ファイル）を表示する処理{
label = "";:icon_image(setq x1 0) (setq y1 0);slide の左上の座標をセット(setq x2 (dimx_tile "image01");slide の X 方向（右）の距離をセット

y2 (dimy_tile "image01");slide の Y 方向（下）の距離をセット→ Step2){;slide ファイルを "iamge01" に表示するlabel = "";key = "image01";
width = 30;
height =15;}

(start_image "image01");"image01" に slide の表示を開始する(fill_image x1 y1 x2 y2 -2); 背景色を図面の背景色と同じにする(slide_image x1 y1 x2 y2 "S_Edit3-F"); 表示する slide ファイルを指定する(end_image);slide のセットを終了する→ Step3; ダイアログのタイトルを変更する}:row

入力時の状態{

S(set_tile "top_label" " フィレット ");"han" に値が入力された時の処理"(setq han1 (get_tile¥"han¥"))")G{→ Step4; edit_box "han" の値を変数 [han1] にセットする

A (action_tile "han":edit_box; タイトルを [ フィレット ] に変更する;"han" の値を変数 [han1] にセットする→ Step5; ダイアログを終了する

label = " 半径 ";key = "han";width = 6;

(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→ Step6);end

fixed_width = true;
value = "";}}Step1 －ダイアログを読み込み、ダイアログ内のタイルを初期化します。

/* OK or CANCEL */ok_cancel;

Step2 － slide ファイルを表示する範囲を [ 左上→右下 ] の順番で指定します。

}//endイメージ タイル処理関数
関数名(dimx_tile key) (dimy_tile key)(start_image key)
(fill_image x1 y1 wid hgt color)(slide_image x1 y1 wid hgt sldname)(end_image)

2-59

説 明
タイルの寸法をダイアログ ボックス計測単位で取得します。
ダイアログ ボックス タイルでのイメージの作成を開始します。
現在アクティブなダイアログ ボックス イメージ タイルに、塗り潰された長方形を描きます。
現在のアクティブなダイアログ ボックス イメージ タイルに、
AutoCAD スライドを表示します。
アクティブなダイアログ ボックス イメージの作成を終了します。

Icon_Image（半径を入力する）

Step3 － slide ファイルを指定した XY の範囲に表示します。
Step4 －ダイアログのタイトルを [ フィレット ] に変更します。
Step5 － "han" に入力された値を変数 [han1] にセットします。
（フィレットの半径）
Step6 － [Ok] または [Cancel] ボタンが押されると、ダイアログを終了します。

Icon_Image（半径を入力する）

2-60

タイルの機能とコールバック:boxed_row

タイルの機能とコールバック

S2_Image.lsp

使用する LISP

Icon_Image（半径を入力する）

第 2 章－タイルの機能とコールバック関数

第 11 節リストの作り方（Popup_List、List_Box 共通）

1 AutoLISP の最初にリストを記述する

第 2 章－タイルの機能とコールバック関数

3 外部のテキストファイルを読み込んで、リストを作成する;<< テキスト ファイルを読み込みモードで開く >>; ドライブを指定する場合は、<"C:¥¥autolisp¥¥out_layer.txt">; リストを作成し、変数 [list1_data] にセットする(setq list1_data (list "A 社 " "B 社 " "C 社 " "D 社 " "E 社 ")); list_box"list1" を新規でスタート; リスト "list1" 内に <list1_data> の内容を流し込む; テキストファイルから 1 行目を読み込む(setq layer_name (read-line in_layer))(setq lst (LIST layer_name)); 画層名が無くなるまで読み込みを続ける(mapcar 'add_list list1_data)(while (/= layer_name nil)

; リストの配置を終了;1 行ずつ読み込む(end_list)
リスト ボックスとポップアップ リスト処理関数
関数名説 明(start_list key [operation]) リスト ボックスまたはポップアップ リストの処理を開始します。
現在アクティブなダイアログ ボックス リスト内の文字列の追加や修(add_list string)
正を行います。
(end_list)
現在アクティブなダイアログ ボックス リストの処理を終了します。
start_list の [operation] のコード説 明選択したリスト項目の内容を変更します。
新しいリスト項目を追加します。
古いリストを削除して新しいリストを作成します ( 既定 )。

タイルの機能とコールバック

タイルの機能とコールバック(setq in_layer (open "out_layer.txt" "r")); 読み込んだ画層名のリストを作成する(start_list "list1" 3)

値
1
2
3

テキストファイルを作成しておきます。

(setq layer_name (read-line in_layer)); 読み込んだ画層名を 1 つのリストに連結していく(setq lst (append lst (LIST layer_name))));while; ファイルを閉じる（必須です）

テキストファイルから画層名をリストに表示(close in_layer);<< リスト内に画層名を流し込む >>(start_list "layer_sel" 3); list_box"layer_sel" を新規でスタート;<<lst から 1 つずつ取り出してリストに追加 >>2 図面内の全画層名を取得して、リストを作成する(setq i 0)
; リストが空になるまで繰り返す; 最初の画層名を取得する(setq layname (tblnext "LAYER" T)); layname が nil を返すまで繰り返す(while (/= (nth i lst) nil)
; 取り出した画層名をリストに追加する(setq add_layer (nth i lst))(while layname; "layer_sel" 内に <lst> の内容を流し込む; layname の画層名を取得する(add_list add_layer)(setq laydata (cdr (assoc 2 layname))); カウントを <1> プラスして、繰り返す

Point!

左のプログラムは下記のように簡単に記述できます。

; list_box"layer_sel" を新規でスタート(start_list "layer_sel" 3); list_box"layer_sel" 内に <lst> の内容を流し込む; 取得した画層名をリストにしていく(setq i (+ i 1))(mapcar 'add_list lst)

(setq lst (append lst (list laydata))));while; list_box"layer_sel" へのリスト追加を終了; 次の画層を取得する ( 無ければ nil を返す )(setq layname (tblnext "LAYER")))

2-61; カウントの初期値を <0> にセット

(start_list "layer_sel" 3); list_box"layer_sel" を新規でスタート(mapcar 'add_list lst)

; list_box"layer_sel" 内に <lst> の内容を流し込む(end_list); list_box"layer_sel" へのリスト追加を終了

リストの作り方（Popup_List、List_Box 共通）; "layer_sel" へのリスト追加を終了(end_list)(end_list)

リストの作り方（Popup_List、List_Box 共通）

2-62

第 2 章－タイルの機能とコールバック関数

第 2 章－タイルの機能とコールバック関数

第 12 節

第 13 節コールバック関数

エラーを回避する

1 Action 式コールバック (Edit_Box に記述する例 )1 ファイルの呼び出し時のエラーチェック

edit_box に action 式を記述します。
（edit_box の数値をダイアログのラベルにセットします。）①ダイアログの呼び出し時にエラーをチェックし、もし指定したダイアログが無い場合はプログラムを終了します。
(setq dcl_id (load_dialog "S_Edit.dcl")); DCL ファイルをロードします。

(if (not (new_dialog "S_Edit" dcl_id)); ダイアログを初期化します。

(exit); ダイアログの初期化に失敗したときは終了します。

);if
タイルの機能とコールバック(strcat; 以下の文字列を結合する"(setq tate (get_tile ¥"tate¥"))";edit_box "tate" の値を変数 [tate] にセット"(setq goukei (* (atof tate) (atof yoko)))";[tate] と [yoko] を積算して変数 [goukei] にセット

②外部関数を呼び出すときは、先にロード関数で読み込んで使用します。
(action_tile "help"(strcat"(setq goukei_moji (strcat ¥" 面積 :¥" (rtos goukei) ¥" です ¥"))""(set_tile¥"goukei¥" goukei_moji)"; ダイアログのタイトルのキー "goukei" に [goukei_moji]

)

; を代入

)

タイルの機能とコールバック);setq(action_tile "tate"; 文字列を結合する"(load ¥"S_Toggle1¥")"; 外部関数 [S_Toggle1.lsp] を読み込む"(C:S_Toggle1)";[S_Toggle1.lsp] を実行する))

2 Action 式コールバック (Button に割り当てる例 )2 データの型を変換する[OK] ボタンに action 式を記述します。（[OK] ボタンを押した時に、コールバック関数を起動します。
）① set_tile 関数でタイルに文字列をセットする時の注意
タイル内にセットする値は文字ですから、数値の場合は文字に変換してセットします。
（タイルの key は <text1>、セットする値は <a>）
変数 <a> が文字の場合・・・(set_tile "text1" a); そのままセットする

整数の場合・・・(set_tile "text1" "(itoa a)"); 整数を文字列に変換してセットする

実数の場合・・・(set_tile "text1" "(rtos a)"); 実数を文字列に変換してセットする

角度の場合・・・(set_tile "text1" "(angtos a)"); 角度を文字列に変換してセットする;<< タイルの数値を取得する（内部サブ関数）>>(defun GetTileVal ()② get_tile 関数でタイルから文字列の値を受け取る時の注意;<< 面積の数値を変数 [goukei] にセットする >>(setq goukei (* (atof tate) (atof yoko)));[tate] と [yoko] を積算して変数 [goukei] にセット

(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))(alert goukei_moji);[tate] と [yoko] を積算した結果を、alert 関数で表示);<<[OK] ボタンを押したときに、コールバック関数（サブ関数 <GetTileVal>）を起動する >>(action_tile "accept" "(GetTileVal)(done_dialog)") ;[OK] ボタンを押したときに、サブ関数を起動して終了(action_tile "cancel" "(done_dialog)")2-63

タイル内の値は文字ですから、その値を文字以外で利用する場合は変換して受け取ります。
（タイルの key は <text1>、受け取る値は <"3.14">）
値を文字で使用する場合・・・(setq a (get_tile "text1"));a = "3.14"（そのまま受け取る）

整数で使用する場合・・・(setq a (atoi (get_tile "text1")));a = 3実数で使用する場合・・・(setq a (distof (get_tile "text1")));a = 3.14角度で使用する場合・・・(setq a (angtof (get_tile "text1"))) ;a = 0.0548033;[Cancel] ボタンを押したときは、何もせずに終了

コールバック関数

エラーを回避する2-64

第 2 章－タイルの機能とコールバック関数

3 tile が空白の場合の処理① edit_box（縦）の key は <tate>、（横）の key は <yoko>

第 3 章 タイルをコントロールする

タイルに入力せずに、[OK] ボタンを押す
エラーメッセージを表示;<< タイルの数値をチェックする（値があれば終了、無ければエラーメッセージを表示する）>>

タイルの機能とコールバック(defun CheckVal()(if (and (/= tate nil)(/= yoko nil))(done_dialog 1)(progn(alert "¥n 値が入力されていません。")(mode_tile "tate" 2));progn);if);end;alert 関数を起動して原因を表示する; カーソルのフォーカスを "tate" にセットする

（中略）
・
・
;<<[OK] ボタンを押したときは、チェック関数を起動する。（ダイアログはチェック関数の中で閉じる。）>>; チェック関数 (CheckVal) を実行する。終了しない。
; 何も処理しないで閉じる② toggle_row の key は <sel_yousi>
どのボタンも押さずに、[OK] ボタンを押す

エラーメッセージを表示;<< ボタンが押されているかどうかチェックする >>(defun CheckVal()(if (/= sel_yousi nil) (done_dialog 1)(alert "¥n ボタンが選択されていません。")
);if
);end

;[sel_yousi] に値が有れば、ダイアログを終了; 値が無ければ、エラーメッセージを表示する（中略）;<<[OK] ボタンを押したときは、チェック関数を起動する。（ダイアログはチェック関数の中で閉じる。）>>(action_tile "accept" "(CheckVal)")(action_tile "cancel" "(done_dialog 0)")2-65

この章では、DCL の組み立てから LISP のプログラミングを通してユーザー インターフェースの構築を解説します。

; 変数 [tate] と [yoko] に値が有れば、ダイアログを終了; どちらかの値が無ければ、以下を実行する

・(action_tile "accept" "(CheckVal)")(action_tile "cancel" "(done_dialog 0)")

ユーザーが AutoCAD と対話する手段としてダイアログは視覚的に判りやすく、なじみやすい機能です。

; チェック関数 (CheckVal) を実行する。終了しない。
; 何も処理しないで閉じる

エラーを回避する

第 1 節

OK_Cancel_Help ボタン <button>、<edit_box>

第 2 節

図形の数を表示する <text_tile>

第 3 節

システム変数を読み込み、変更する <edit_box>

第 4 節

図枠の数値を入力する <icon_image、edit_box>

第 5 節

画像でプログラムを選択する <icon_image、edit_box>

第 6 節

スライダーをコントロールする <icon_image、slider、text_tile>

第 7 節

図枠を自動的に作成する <radio_button>

第 8 節

多角形を視覚的に作図する <radio_button>

第 9 節

ユーザー独自の O スナップ機能を作成する <toggle>

第 10 節拡張データ (Xdata) を付加する <list_box、popup_list>

第 11 節指定した画層に文字を記入する <text_tile、edit_box、toggle、popup_list>

第 12 節レイアウトページを選択する <list_box>

第 13 節指定した画層にブロックを挿入する <text_tile、popup_list、list_box>

第 14 節外部の画層ファイルを読み込み、必要な画層だけ取り込む <list_box>

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

第1節

OK_Cancel_Help ボタン

使用する LISP
Ok_Cancel2.lsp
使用する主な関数 getvar、itoa、rtos、atoi、atof
内部サブ関数(GetTileVal)
外部サブ関数(Ok_Cancel2_1)
使用する DCL
Ok_cancel2.dcl使用するタイル
edit_box
外部テキストなし
スライドファイル なし
このプログラムは、下図のダイアログを使用して、[OK] ボタンと [Help] ボタンの動作を確認します。
ダイアログに入力した数値や文字情報の取得方法を説明します。

1

サブ関数（コールバック関数）を使わずに、AutoCAD のメッセージボックスに表示する。

計算結果を AutoCAD のメッセージボックスへ表示する指示を、本プログラムの中で行います。
AutoCAD のメッセージボックスを表示した後、ダイアログを終了します。

[OK] ボタンを押すと、計算結果を表示して終了する。

計算結果を表示する計算結果を表示する

2
1 計算処理をサブ関数を使わずに行う。（次ページ 1 ）計算処理を本プログラム内部のサブ関数（コールバック関数）で処理して表示します。
[OK] ボタンで処理する場合と、[Help] キーで処理する場合があります。

計算処理や結果を表示する処理をサブ関数を使用せずに行います。
;<< 面積の数値を変数 [goukei] にセットする >>[OK] ボタンを押した場合は、メッセージを閉じると(setq goukei (* (atof tate) (atof yoko))) ;"tate" と "yoko" の値を乗算する

ダイアログも終了しますが、[Help] ボタンを使うときは、(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です ")) ; 結果を表示する文字列を作成 するメッセージを閉じると元のダイアログに戻ります。
他の処理（内部計算や別のプログラムを起動）した後でも、;<< ダイアログを終了する >>ダイアログは残っています。

(setq dialog-box (start_dialog))

タイルをコントロール

タイルをコントロール

内部サブ関数を使用して、AutoCAD のメッセージボックスに表示する。

(unload_dialog dcl_id)

2

計算処理を内部サブ関数か外部サブ関数で行う。（次ページ 2

3）

計算処理や結果を表示する処理をダイアログの内部で行うか（内部サブ関数）、プログラムの外（外部サブ関数）を使うかの 2 通りがあります。
(setq dcl_id (load_dialog "Ok_Cancel2")) ; ダイアログをメモリーに読み込む(new_dialog "Ok_Cancel2" dcl_id); ダイアログを表示する

3

外部サブ関数を使用して、AutoCAD のメッセージボックスに表示する。

計算処理を本プログラム外部のサブ関数（コールバック関数）で処理して表示します。
分岐変数を使用して、使用するプログラムを選別指定することができます。

計算結果を AutoCAD のメッセージボックスへ表示する
指示を、本プログラムの外で行います。
プログラムが複雑な場合には、このようにした方がメンテナンスに便利です。

・・ 2 （内部サブ関数）

しかし、本プログラムを終了して動作しますから、(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する

再度、本プログラムに戻ることはできません。

); プログラムの終了
・・ 3 （外部サブ関数）

2-67

OK_Cancel_Help ボタン

OK_Cancel_Help ボタン

2-68

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

Ok_cancel2.dcl

使用するダイアログ

Ok_cancel2.lsp

使用する LISP

Ok_Cancel2 :dialog

前ページのダイアログの基本的な LISP 関数です。これを元に①から③のケースを説明します。

{
label = " 面積計算 ";key = "menseki";(defun c:Ok_Cancel2( / dialog-box dcl_id)

spacer;:row;<< ダイアログを使用する準備 >>/* タイルを横並びに配置スタート * /{:edit_box /* 編集ボックス処理タイルスタート */1{label = " 縦 ";(setq dcl_id (load_dialog "Ok_Cancel2"));Ok_Cancel2.dcl をメモリーに読み込む(new_dialog "Ok_Cancel2" dcl_id);Ok_Cancel2 ダイアログを初期化する

key = "tate";;<< tate の初期設定 >>width = 6;

(set_tile "tate" "")value = "";}2/* 編集ボックス処理タイル終了 */］示;edit_box"tate" に ""(nil) をセット

edit_box"tate"→と "yoko" を初;<< yoko の初期設定 >>(set_tile "yoko" ""):edit_box /* 編集ボックス処理タイルスタート */期化する;edit_box"yoko" に ""(nil) をセット;<< edit_box 処理 tate に値を受け取る >>{label = " 横 ";(action_tile "tate"

key = "yoko";value = "";3/* 編集ボックス処理タイル終了 *//* タイルを横並びに配置終了 */;edit_box"tate" のデータを取得"(mode_tile ¥"yoko¥" 2)";edit_box"yoko" にフォーカスを移動

edit_box"tate"→のデータを取得する)

spacer;)/* OK or CANCEL */:row"(setq tate (get_tile ¥"tate¥"))"/* タイルを横並びに配置スタート * /;<< edit_box 処理 yoko に値を受け取る >>{(action_tile "yoko": button

4{;edit_box"yoko" にデータを入力"(setq yoko (get_tile ¥"yoko¥"))"

edit_box"yoko"→ のデータを取得;edit_box"yoko" のデータを取得

する)

label = "Ok";is_default = true;;<< ダイアログを終了する準備 >>key = "accept";
fixed_width = true;5}: button(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する］

ダイアログの→入力と解放(princ){);endlabel = "Cancel";
is_cancel = true;
key = "Cancel";

番号

fixed_width = true;①}: button②{label = "Help";③dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
edit_box "tate" と "yoko" に初期値を入力します。[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。ここでは、""（空白）を指定していますが、既定値を指定することも出来ます。
edit_box "tate" の内容を変数 "tate" に代入します。（文字列）

fixed_width = true;④

modo_tile で次のタイル "yoko" にカーソルが移動します。(Tab キーと同じ働きです。）
edit_box "yoko" の内容を変数 "yoko" に代入します。（文字列）start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

/* タイルを横並びに配置終了 */⑤

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値 <status> を

key = "help";}}

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。

返します。ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。

spacer;}//end2-69

OK_Cancel_Help ボタン

OK_Cancel_Help ボタン

2-70

タイルをコントロール}};edit_box"tate" にデータを入力(strcatwidth = 6;

タイルをコントロール

ダイアログの→読み込みと表第 3 章－タイルをコントロール

1

第 3 章－タイルをコントロール

サブ関数（コールバック関数）を使わずに、AutoCAD のメッセージボックスに表示する。

第 2 手法 [done_dialog] の値 <status> に従って、メッセージボックスに表示します。

第 1 手法 システム変数 [DIASTAT] の値に従って、メッセージボックスに表示します。

;<< 面積の数値を変数 [goukei] にセットする >>(setq goukei (* (atof tate) (atof yoko)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "));<< 面積の数値を変数 [goukei] にセットする >>(setq goukei (* (atof tate) (atof yoko)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "));<< ダイアログを終了する >>(action_tile "accept" "(done_dialog 1)")

→ Step1(action_tile "cancel" "(done_dialog 0)");<< ダイアログを終了する >>(setq dialog-box (start_dialog))(unload_dialog dcl_id)(if(= (getvar "DIASTAT") 1)(alert goukei_moji)(setq chkdia (start_dialog))(unload_dialog dcl_id)→ Step2→ Step1→ Step2(if (= chkdia 1)→ Step3(alert goukei_moji)→ Step3);if)

Step1・・(action_tile "accept" "(done_dialog 1)")
→ [OK(accept)] で終了したときは、フラッグ (status)<1> をたてて、ダイアログを終了

Step1・・(setq goukei (* (atof tate) (atof yoko)))
変換し、乗算して goukei にセットします。

します。
・・(action_tile "cancel" "(done_dialog 0)")→ [Cancel(cancel)] で終了したときは、フラッグ (status)<0> をたてて、ダイアログを

タイルをコントロール

・・ (setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))終了します。

→ alert 関数で表示する情報は文字列ですから、実数の goukei を文字に変換 (rtos) して、" 面積 :" と (rtos goukei) と " です " を strcat 関数で 1 つの文字列に結合します。
Step2・・(setq dialog-box (start_dialog))→ダイアログにユーザーの入力を受け付けます。

Step2・・(setq chkdia (start_dialog))→ 終了したときの返り値 [status] の情報を、変数 [chkdia] にセットします。
・・(unload_dialog dcl_id)→ ダイアログをメモリーから解放します。

・・(unload_dialog dcl_id)→ダイアログをメモリーから解放します。

タイルをコントロール→ edit_box "tate" と edit_box "yoko" の情報は文字ですから、計算処理のために実数に

Step3・・(if (= chkdia 1)→返り値 [chkdia] が <1> か <0> かを判定します。

Step3・・(if(= (getvar "DIASTAT") 1)→ダイアログを [OK(accept)] で終了したときは、システム変数 [DIASTAT] に <1> がセットされています。

・・(alert goukei_moji)
Point!

・・(alert goukei_moji)→ もし、<1> であれば、alert 関数で指定した文字列を表示します。
第 1 手法と第 2 手法は同じように見えますが、→もし、[OK] ボタンが押されたときは、alert 関数で指定した文字列を表示します。

第 1 手法では、ダイアログが終了した後に、[Ok] で終了したかどうかを判定しています。このケースでは、再度ダイアログに戻って計算処理を行うことはできません。
第 2 手法では、(done_dialog 1) の前に次ページの 2 のように (GetTileVal) などの内部サブ関数を追加で記述することが出来ます。

2-71

OK_Cancel_Help ボタン

OK_Cancel_Help ボタン

2-72

第 3 章－タイルをコントロール

2

第 3 章－タイルをコントロール[Ok] ボタンから内部サブ関数を使用して、AutoCAD のメッセージボックスに表示する。

第 1 手法 [OK] ボタンを押したときに、メッセージを表示してダイアログを閉じる。

2[help] ボタンから内部サブ関数を使用して、AutoCAD のメッセージボックスに表示する。

第 2 手法 [Help] ボタンを押したときに、メッセージを表示するがダイアログは閉じない。

終了して計算結果を表示する計算結果を表示するメッセージを閉じると、元のダイアログに戻る;<< タイルの数値をゲットする（内部サブ関数）>>;<< タイルの数値をゲットする（内部サブ関数）>>;<< 面積の数値を変数 [goukei] にセットする >>(setq goukei (* (atof tate) (atof yoko)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))→ Step2(defun GetTileVal ();<< 面積の数値を変数 [goukei] にセットする >>(setq goukei (* (atof tate) (atof yoko)))(setq goukei_moji (strcat " 面積 :" (rtos goukei) " です "))前ページと同じ→ Step2(alert goukei_moji)(alert goukei_moji);<< [help] ボタンが選択された時の処理を記述する >>;<< [Ok] ボタンが選択された時の処理を記述する >>(action_tile "accept" "(GetTileVal)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")

タイルをコントロール))

タイルをコントロール

内部サブ関数内部サブ関数(defun GetTileVal ()→ Step1］;<< ダイアログを終了する >>(setq chkdia (start_dialog))(unload_dialog dcl_id)(action_tile "help" "(GetTileVal)")→ Step1］;<< [Ok] ボタンと [Cancel] ボタンが選択された時の処理を記述する >>(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)");<< ダイアログを終了する >>(setq chkdia (start_dialog))(unload_dialog dcl_id)

Step1・・(action_tile "accept" "(GetTileVal)(done_dialog 1)")
→ [Ok] ボタンを押してダイアログを閉じる前に、内部サブ関数 (GetTileVal) を実行します。

Step1・・(action_tile "help" "(GetTileVal)")→内部サブ関数 (GetTileVal) を起動するボタンを [Help] キーに割り当てています。
この場合は、[Ok] ボタン <"accept"> キーは押されていないので、ダイアログが閉じることはありません。

Step2・・(defun GetTileVal ()・・
→計算を処理する関数 (GetTileVal) を作成して、start_dialog の前に記述します。

Point!

処理する行数が少ない場合は、 1 のようにサブ関数を使わなくて済みますが、ユーザーのヘルプを help ボタンに割り当てる場合は、行数が多い場合は、独立させた方がメンテナンスが容易です。

一例として (action_tile "help" "(help01)") と記述します。

P2-98 の⑪を参考<help**> と番号を付けて、必要に応じて呼び出します。

2-73

OK_Cancel_Help ボタン

OK_Cancel_Help ボタン

2-74

第 3 章－タイルをコントロール

3

第 3 章－タイルをコントロール

外部サブ関数を使用して、AutoCAD のメッセージボックスに表示する。

;<< ダイアログを終了する >>(setq dialog-box (start_dialog))

ssget、sslength、strcat、itoa(S_Text2_1)
text_tileなし

図面範囲やオブジェクト範囲などを追加すれば、AutoCAD の [ 図面情報 <status>] コマンドと同様(unload_dialog dcl_id)(princ)図形の数を表示する使用する LISP
S_Text2.lsp
使用する主な関数
内部サブ関数なし
外部サブ関数使用する DCL
S_Text2.dcl使用するタイル
外部テキストなし
スライドファイル
このプログラムは、図面にある図形の数を表示します。

第 1 手法 システム変数 <DIASTAT> の値で、外部サブ関数を分岐する。

(if(= (getvar "DIASTAT") 1) (Ok_Cancel2_1))

第2節の機能に拡張できます。
→ Step1］

Step1 － <S_Text2.lsp> を起動すると、右下図のダイアログが表示されます。
ここでは図形の数だけですが、画層名やブロック名の一覧などを追加することも可能です。

外部サブ関数) ;dialog_end;<< 外部サブ関数を起動 >>(defun Ok_Cancel2_1 ()→ Step2(alert goukei_moji)

プログラム実行後の表示)

Step1・・(if(= (getvar "DIASTAT") 1) (Ok_Cancel2_1))→ダイアログを [OK(accept)] で終了したときは、外部サブ関数 (Ok_Cancel2_1) を起動。
Step2・・alert 関数で指定した文字列を表示します。

;<< [Ok] ボタンと [Cancel] ボタンが選択された時の処理を記述する >>(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)");<< ダイアログを終了する >>(setq chkdia (start_dialog))
Step2 －上記ダイアログで [OK] ボタンを押すと、< 終了します > のメッセージが表示されます。

(unload_dialog dcl_id)[OK] ボタンを押して、このメッセージ ボックスを閉じます。
(if (= chkdia 1)(Ok_Cancel2_1))(princ)→ Step1］

外部サブ関数) ;dialog_end;<< 外部サブ関数を起動 >>(defun Ok_Cancel2_1 ()→ Step2(alert goukei_moji))

Step1・・(if (= chkdia 1)(Ok_Cancel2_1)→フラッグ (status)[chkdia] が <1> であれば、外部サブ関数 (Ok_Cancel2_1) を起動。
Step2・・alert 関数で指定した文字列を表示します。

2-75

OK_Cancel_Help ボタン

図形の数を表示する

2-76

タイルをコントロール

タイルをコントロール

第 2 手法 "done_dialog" が返す値で、外部サブ関数を分岐する。

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール: textS_Test2.dcl

使用するダイアログ{

S_Text2 : dialog

label = "";

text1

{

key = "text6";

text2: column/* タイルを縦並びに配置スタート */{/* 線分の数 */

{

text1
text3

: texttext4{

width = 30;

text6
text7

/* マルチ文字の数 */text8

label = "";text6

key = "text1";

text5

spacer;text5

label = "";

text4

}

text2

: texttext3

width = 30;

label = " 図形情報 ";text7

key = "text7";

text8

width = 30;}}: text/* 円の数 *//*1 行文字の数 */

text1

{

{

text2

label = "";label = "";key = "text2";

key = "text8";

width = 30;

text2
text3

spacer;: texttext4/* 円弧の数 */

text5

text4
text5

width = 30;

text1

}

text3

text6
text7

}
}

text8

/* タイルを縦並びに配置終了 */ok_only;

タイルをコントロール: text

タイルをコントロール/* 寸法の数 */

text6

{

text7

label = "";text8

key = "text3";}//endwidth = 30;}

作成時の状態: text

起動後の状態/* ポリラインの数 */{label = "";text1

key = "text4";

text2

width = 30;

text3
text4

}

text5

spacer;: texttext6/* ブロックの数 */

text7

{

text8

label = "";key = "text5";
width = 30;}

2-77

図形の数を表示する図形の数を表示する2-78

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<< ダイアログを使用する準備 >>S_Test2.lsp

使用する LISP(defun c:S_Text2 ( / lin1 cir1 arc1 pol1 ins1 dim1 mte1 tex1)

1;S_Text2.dcl をメモリーに読み込む(new_dialog "S_Text2" dcl_id);S_Text2 ダイアログを初期化する→］

ダイアログの読み込みと表示;<< 各タイルに図形の数を表示する >>; << 線分の個数を数える >>(set_tile "text1" (strcat " 線分の数：" (itoa num_lin)))(set_tile "text2" (strcat " 円の数：" (itoa num_cir)));<< 円の個数を数える >>(set_tile "text3" (strcat " 円弧の数：" (itoa num_arc)))(setq cir1 (ssget "x" '((0 . "CIRCLE"))))(set_tile "text4" (strcat " ポリラインの数 ：" (itoa num_pol)))(setq lin1 (ssget "x" '((0 . "LINE"))))(setq num_lin (sslength lin1));ssget 関数で [LINE] だけを変数 <lin1> にセット

;sslength 関数で、変数 <lin1> の数を数える(setq num_cir (sslength cir1));ssget 関数で [CIRCLE] だけを変数 <cir1> にセット

;sslength 関数で、変数 <cir1> の数を数える

2;<< 円弧の個数を数える >>(setq arc1 (ssget "x" '((0 . "ARC"))))(setq num_arc (sslength arc1))(set_tile "text5" (strcat " ブロックの数：" (itoa num_ins)))(set_tile "text6" (strcat " 寸法の数：" (itoa num_dim)))

set_tile で入力する
データは文字列で→あるため、数値を文字列に変換します。

(set_tile "text7" (strcat " マルチ文字の数 ：" (itoa num_mte)));ssget 関数で [ARC] だけを変数 <arc1> にセット

(set_tile "text8" (strcat " １行文字の数;sslength 関数で、変数 <arc1> の数を数える：" (itoa num_tex)));<< ダイアログを終了する準備 >>; << ポリラインの個数を数える >>(setq pol1 (ssget "x" '((0 . "LWPOLYLINE"))))(setq num_pol (sslength pol1));ssget 関数で [LWPOLYLINE] だけを変数 <pol1> にセット

;sslength 関数で、変数 <pol1> の数を数える

3(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→］

ダイアログの入力と終了;<<[OK] ボタンが押されたら、外部サブ関数 (S_text2_1) を起動する >>; << ブロックの個数を数える >>(setq ins1 (ssget "x" '((0 . "INSERT"))))(setq num_ins (sslength ins1));ssget 関数で [INSERT] だけを変数 <ins1> にセット

(if(= (getvar "DIASTAT") 1) (S_Text2_1))

4;[OK] ボタンが押された時、外部サブ関数を起動する(princ);sslength 関数で、変数 <ins1> の数を数える);end; << 寸法の個数を数える >>(setq num_dim (sslength dim1));<< これ以下は、外部サブ関数 >>;ssget 関数で [DIMENSION] だけを変数 <dim1> にセット

(defun S_Text2_1();sslength 関数で、変数 <dim1> の数を数える

5; << マルチテキストの個数を数える >>(setq mte1 (ssget "x" '((0 . "MTEXT"))))(setq num_mte (sslength mte1));[OK] ボタンが押された時に、この関数に移る

タイルをコントロール(setq dim1 (ssget "x" '((0 . "DIMENSION"))))

タイルをコントロール(setq dcl_id (load_dialog "S_Text2"))(alert "¥n 終了します "));end;ssget 関数で [MTEXT] だけを変数 <mte1> にセット

;sslength 関数で、変数 <mte1> の数を数える; <<1 行文字の個数を数える >>(setq tex1 (ssget "x" '((0 . "TEXT"))))(setq num_tex (sslength tex1));ssget 関数で [TEXT] だけを変数 <tex1> にセット

;sslength 関数で、変数 <tex1> の数を数える

ssget 関数の使い方は、P1-247 ～ P1-251 を参照

Point!

番号①

ssget 関数で図形の取得方法②

・図面内のすべての図形を取得する→ (ssget "X")③・特定の図形 (Circle) だけを取得する→ (ssget "X" '((0 . "CIRCLE")))・特定の画層 <0> の特定の図形 (Circle) だけを取得する

④
⑤

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
"text1" ～ "text8" のタイル に初期値を入力します。[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。ここでは、タイルに記述するデータは文字列なので、整数を文字列に変換する処理が必要です。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値 (status) を返します。ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Text2_1) を起動し、ダイアログを終了します。
外部サブ関数 (S_Text2_1) を起動します。この時点で、前のダイアログに戻ることはできません。

→ (ssget "X" '((0 . "CIRCLE") (8 . "0")))・半径が <10.0> 以下の円だけを取得する→ (ssget "X" '((0 . "CIRCLE") (-4 . "<=") (40 . 10.0)))2-79

図形の数を表示する図形の数を表示する

2-80

第 3 章－タイルをコントロール

第3節

第 3 章－タイルをコントロール

使用する LISP
S_Text1.lsp
使用する主な関数 getvar、itoa、rtos、atoi、atof
内部サブ関数なし
外部サブ関数(S_Text1_1)
使用する DCL
S_Text1.dcl
使用するタイル
edit_box
外部テキストなし
スライドファイル なし
このプログラムは、
システム変数を一覧表示した後、変更した変数の書き込み（再設定）を行います。

S_Text1 : dialog

このようなプログラムを使用すると、システム変数の変更をまとめて処理できます。

: column

Step1 － <S_Text1.lsp> を起動すると、下図のダイアログが表示されます。
この時点では、現在のシステム変数の状態が 5 つ表示されます。

S_Test1.dcl

使用するダイアログ

システム変数を読み込み、変更する{

label = " 現在のシステム変数 " ;spacer;/* タイルを縦並びに配置スタート */{:edit_box /* 編集ボックス処理タイルスタート */{label = "AUNITS";

key = "aun";width = 3;
当初のシステム変数

value = "";}/* 編集ボックス処理タイル終了 */:edit_box /* 編集ボックス処理タイルスタート */{label = "AUPUREC ";key = "aup";
Step2 －変更するシステム変数のボックスに新しい数値を入力し [ 変更 ] ボタンを押します。

width = 3;
value = "";}タイルをコントロール

タイルをコントロール[ 確認 ] ボタンを押すと、何も処理をしないで終了します。

/* 編集ボックス処理タイル終了 */:edit_box /* 編集ボックス処理タイルスタート */変更されたシステム変数{
label = "CELTSCALE ";key = "cel";width = 3;
value = "";}Step3 － < 再設定しました > のメッセージが表示されます。[OK] ボタンを押して終了します。

/* 編集ボックス処理タイル終了 */:edit_box /* 編集ボックス処理タイルスタート */{label = "CHAMMODE";
key = "cha";width = 3;
value = "";}2-81

システム変数を読み込み、変更する/* 編集ボックス処理タイル終了 */システム変数を読み込み、変更する

2-82

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール:edit_box /* 編集ボックス処理タイルスタート */label = "MIRRTEXT ";(defun c:S_Text1 ( / aun_mode aup_mode cel_mode cha_mode mir_mode dcl_id

key = "mir";dialog-boxn_aun_mode n_aup_mode n_cel_mode n_cha_mode

width = 3;

n_mir_mode)

value = "";}; << システム変数を取得 >>/* 編集ボックス処理タイル終了 *//* タイルを縦並びに配置終了 */spacer;: row

1/* タイルを横並びに配置スタート */{(setq aup_mode (getvar "AUPREC")); システム変数 <AUPREC> を取得する(setq cel_mode (getvar "CELTSCALE")); システム変数 <CELTSCALE> を取得する(setq cha_mode (getvar "CHAMMODE")); システム変数 <CHAMMODE> を取得する(setq mir_mode (getvar "MIRRTEXT")); システム変数 <MIRRTEXT> を取得する

最初に現在
のシステム

→

変数を取得
しておく

;<< 値を変数にセットする >>alignment = centered;(setq aun_mode (itoa aun_mode)); 整数を文字列に変換

タイルに表: ok_button(setq aup_mode (itoa aup_mode)); 整数を文字列に変換

示するデー(setq cel_mode (rtos cel_mode)); 実数を文字列に変換

label = " 変更 ";(setq cha_mode (itoa cha_mode)); 整数を文字列に変換を文字に変

width = 11;(setq mir_mode (itoa mir_mode)); 整数を文字列に変換

換する

Point!

2

}

タは文字な

→

ので、数値

;<< ダイアログを使用する準備 >>: cancel_button

3{

タイルをコントロール; システム変数 <AUNITS> を取得する

fixed_width = true;{(setq dcl_id (load_dialog "S_Text1"));S_Text1.dcl をメモリーに読み込む(new_dialog "S_Text1" dcl_id);S_Text1 ダイアログを初期化する

label = " 確認 ";;<< ダイアログの edit_box に値をセットする >>width = 11;(set_tile "aun" aun_mode);edit_box"aun" に変数 <aun_mode> を代入(set_tile "aup" aup_mode);edit_box"aup" に変数 <aup_mode> を代入(set_tile "cel" cel_mode);edit_box"cel" に変数 <cel_mode> を代入(set_tile "cha" cha_mode);edit_box"cha" に変数 <cha_mode> を代入(set_tile "mir" mir_mode);edit_box"mir" に変数 <mir_mode> を代入}}(setq aun_mode (getvar "AUNITS"))/* タイルを横並びに配置終了 */4}//endPoint!

ダイアログ］→の読み込み
と表示

文字に変換
したシステ

→ム変数をタイルにセッ
トする;<<[ 変更 ] ボタンが押された時に、edit_box の値を取得する >>[Ok_Cancel;] では、ラベルを付けることはできません。

(defun SaveTileVal()

ボタンにラベルを付けるためには、①か②の方法になります。

(setq n_aun_mode (get_tile "aun"));edit_box"aun" の値を取得① :ok_button(setq n_aup_mode (get_tile "aup"));edit_box"aup" の値を取得(setq n_cel_mode (get_tile "cel"));edit_box"cel" の値を取得(setq n_cha_mode (get_tile "cha"));edit_box"cha" の値を取得(setq n_mir_mode (get_tile "mir"));edit_box"mir" の値を取得{② :button

5{label = " 変更 ";label = " 変更 ";width = 11

is_default = true;}

key = "accept";←必須です。

width = 8;
fixed_width = true;}; コールバック関数

edit_box の→最終データを取得する)
Point!

①のタイプは、AutoCAD によって、[Ok<accept>] ボタンであることが指定されていますが、①と②は③の前に処理しておきます。

②のようにユーザーが独自で button を作成したときは、[key = "accept"; ] の記述が必要です。

③と⑦の間に④⑤⑥を記述します。
④の (set_tile) の後に⑤の (get_tile) と⑥の (action_tile) を記述します。

2-83

システム変数を読み込み、変更する

システム変数を読み込み、変更する

2-84

タイルをコントロール}

S_Text1.lsp

使用する LISP{

第 3 章－タイルをコントロール

6

第 3 章－タイルをコントロール(action_tile "accept" "(SaveTileVal)(done_dialog 1)");[ 変更 ] ボタンが押された時の処理(action_tile "cancel" "(done_dialog 0)");[ 確認 ] ボタンが押されると終了

図枠の数値を入力する;<< プログラムの分岐 >>使用する LISP
S_Edit1.lsp
使用する主な関数 getvar、atof、polar、ssadd、entlast
内部サブ関数なし
外部サブ関数(S_Edit1_1)
使用する DCL
S_Edit1.dcl
使用するタイル
icon_image、edit_box
外部テキストなし
スライドファイル S_Edit1
このプログラムは、ダイアログの edit_box に直接数値を入力して、図枠を作図します。

(if(= chkdia 1)

図枠の大きさごとに作成しておくと、作業効率が上がります。

;<< ダイアログを終了する準備 >>7

第4節(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→］

ダイアログの入力と終了;[ 変更 ] ボタンが押された (= chkdia 1) 時は、外部サブ関数 (S_Text1_1) を起動する(S_Text1_1)

8

Step1 － <S_Edit1.lsp> を起動すると、下図のダイアログが表示されます。

)

寸法の位置を画像で確認できるので、間違いも無くなります。

(princ));end(defun S_Text1_1()

9; システム変数を setvar 関数で再設定する(setvar "AUNITS" (atoi n_aun_mode));n_aun_mode の値を整数に変換する(setvar "AUPREC" (atoi n_aup_mode));n_aup_mode の値を整数に変換する(setvar "CELTSCALE" (atof n_cel_mode));n_cel_mode の値を実数に変換する(setvar "CHAMMODE" (atoi n_cha_mode)) ;n_cha_mode の値を整数に変換する(setvar "MIRRTEXT" (atoi n_mir_mode));n_mir_mode の値を整数に変換する(alert "¥n 再設定しました。")

Step2 － <A> から <D> の各ボックスに数値を入力して、[OK] ボタンを押します。

タイルをコントロール

タイルをコントロール(princ)
);end

番号
説 明
① 最初にシステム変数の値を取得しておきます。その値を set_tile で各タイルにセットします。
② タイルに記述するデータは文字列なので、整数や実数を文字列に変換する処理が必要です。
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
③
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
④ 文字列に変換したシステム変数の値を各タイルに初期値としてセットします。
[ 変更 ] ボタンが押されると、この内部サブ関数が起動します。
⑤
各タイルの最後の値を取得します。
[ 変更 ] ボタンが押されると、内部サブ関数 (SaveTileVal) を起動して、フラッグ (status) として <1> を指定し⑥ます。この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
⑦

⑧
⑨

2-85

Step3 － < 左図 > 図枠の挿入位置は、マウスで自由に変更できます。
< 右図 > 挿入した結果です。

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。
ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
フラッグ (status) が <1> であれば、外部サブ関数 (S_Text1_1) を起動します。<0> であれば何もせずに終了します。
各タイルの情報は文字列なので、整数や実数に変換してシステム変数を再設定しています。

システム変数を読み込み、変更する

図枠の数値を入力する

2-86

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール:edit_box /* 編集ボックス処理タイルスタート */S_Edit1.dcl

使用するダイアログ{

S_Edit1 :dialog

label = "C";{key = "yoko2";
label = " 図枠作成 ";width = 6;:rowvalue = "";/* タイルを横並びに配置スタート */}{:icon_image/* 編集ボックス処理タイル終了 *//* イメージ処理タイルスタート */:edit_box /* 編集ボックス処理タイルスタート */{{label = "";key = "image00";

label = "D";width = 40;

key = "tate2";height = 15;

width = 6;}value = "";/* イメージ処理タイル終了 */}:boxed_column}/* タイルを縦並びに配置スタート */{label = " 図枠の寸法 ";/* 編集ボックス処理タイル終了 *//* タイルを縦並びに配置終了 */}Point!

/* タイルを横並びに配置終了 */:edit_box /* 編集ボックス処理タイルスタート */spacer;{ok_cancel;

タイルをコントロール

タイルをコントロール/* OK or CANCEL */}//endlabel = "A";key = "yoko1";
width = 6;

Point!

value = "";}column や row にラベルを付けない場合（左）とラベルを付けた場合（右）/* 編集ボックス処理タイル終了 */:edit_box /* 編集ボックス処理タイルスタート */{:column:boxed_column{{
label = " 図枠の寸法 ";label = "";label = "B";key = "tate1";

拡大図

width = 6;

拡大図value = "";}/* 編集ボックス処理タイル終了 */A から D 全体に外枠は作成できません。

2-87

図枠の数値を入力する

A から D 全体に外枠が作成されます。

図枠の数値を入力する

2-88

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<< edit_box 処理 tate2 に値を受け取る >>S_Edit1.lsp

使用する LISP(action_tile "tate2"(defun c:S_Edit1( / dialog-box dcl_id x1 y1 yoko1 tate1 yoko2 tate2);S_Edit1.dcl をメモリーに読み込む(new_dialog "S_Edit1" dcl_id);S_Edit1 ダイアログを初期化する(strcat→］

ダイアログの読み込みと表示; スライドを表示する位置（原点は左上）(setq x2 (dimx_tile "image00")); スライドを表示する X の幅（右方向）(setq y2 (dimy_tile "image00")); スライドを表示する Y の幅（下方向）(start_image "image00");"image00" にスライドを読み込む(slide_image x1 y1 x2 y2 "S_Edit1"); スライド (S_Edit1) を表示(end_image); スライドの読み込みを終了

スライドを表示する→"image00" の幅を指定しています。

(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→］

ダイアログの入力と終了;<<[OK] ボタンが押されたら、外部サブ関数 (S_Edit1_1) を起動する >>X と Y の幅として

9(if(= (getvar "DIASTAT") 1) (S_Edit1_1));[OK] ボタンが押された時のアクション(princ));end;<< 外部サブ関数の定義 >>;"tate1" の初期値を空白 <""> にセット

4 つの edit_box の(set_tile "tate2" "");"tate2" の初期値を空白 <""> にセット

初期値をセット。

(set_tile "yoko1" "");"yoko1" の初期値を空白 <""> にセット

(set_tile "yoko2" "");"yoko2" の初期値を空白 <""> にセット

→ダイアログ側でセット(defun S_Edit1_1 ( / omode p0 p1 p2 p3 p4 p5 ent1 p6 p7 p8 ss1)
(setq omode (getvar "OSMODE"))

している場合は必要あ(setvar "OSMODE" 0)

りません。

;<< 選択セットを用意 >>(setq ss1 (ssadd));<< edit_box 処理 yoko1 に値を受け取る >>(action_tile "yoko1"

タイルをコントロール

edit_box "tate2" が→操作されたときの処理を記述します。

)

8(set_tile "tate1" ""); 以下の文字列を結合する

edit_box "yoko1" が"(setq yoko1 (get_tile ¥"yoko1¥"))" ;edit_box "yoko1" の値を取得（文字） → 操作されたときの"(mode_tile ¥"tate1¥" 2)"; システム変数 [OSMODE] の既定値を取得（最後に元に戻すため）; システム変数 [OSMODE] を <0> にセット

; 作図した複数の図形を 1 度に選択するために、空の選択セットを事前に用意;<<"edit_box" の値（文字列）を実数に変換 >>;"yoko1" に値を入力する(strcat4;edit_box "tate2" の値を取得（文字）)(setq x1 0 y1 0);<< 各タイル の初期設定 >>3"(setq tate2 (get_tile ¥"tate2¥"))"

7;<< スライドを表示する準備 >>2; 文字列を結合する（1 行でも可）;edit_box "tate1" にフォーカスを移動

処理を記述します。

)(setq yoko1 (atof yoko1));edit_box "yoko1" の値（文字列）を実数に変換(setq tate1 (atof tate1));edit_box "tate1" の値（文字列）を実数に変換(setq yoko2 (atof yoko2));edit_box "yoko2" の値（文字列）を実数に変換(setq tate2 (atof tate2));edit_box "tate2" の値（文字列）を実数に変換

edit_box の値は文字列→なので、作図するために実数に変換します。

);<< edit_box 処理 tate1 に値を受け取る >>(action_tile "tate1"(strcat5

以下の順番で変数をセットしています。
;"tate1" に値を入力する; 以下の文字列を結合する"(setq tate1 (get_tile ¥"tate1¥"))";edit_box "tate1" の値を取得（文字）"(mode_tile ¥"yoko2¥" 2)";edit_box "yoko2" にフォーカスを移動

edit_box "tate1" が→ 操作されたときの処理を記述します。

p4

p5

p3

p7

p0

p8

p1(0,0)

p6

p2

)
)
;<< edit_box 処理 yoko2 に値を受け取る >>(action_tile "yoko2";"yoko2" に値を入力する(strcat
6; 以下の文字列を結合する"(setq yoko2 (get_tile ¥"yoko2¥"))";edit_box "yoko2" の値を取得（文字）"(mode_tile ¥"tate2¥" 2)";edit_box "tate2" にフォーカスを移動

edit_box "yoko2" が→ 操作されたときの処理を記述します。

)
)

2-89

図枠の数値を入力する

図枠の数値を入力する

2-90

タイルをコントロール

1(setq dcl_id (load_dialog "S_Edit1"));"tate2" に値を入力する

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<< 外枠を描く >>(setq p1 '(0 0)); 外枠の左下を p1(0,0) にセット（最後にマウスで、p0 を基点に全体を移動します。）(setq p2 (polar p1 0 yoko1));p2 は p1 から <0°（3 時方向）> で、距離は <yoko1> の位置(setq p3 (polar p2 (* 0.5 pi) tate1))(setq p4 (polar p3 pi yoko1));p3 は p2 から <90°（12 時方向）> で、距離は <tate1> の位置;p4 は p3 から <180°（9 時方向）> で、距離は <yoko1> の位置(command "PLINE" p1 p2 p3 p4 "C")(setq ss1 (ssadd (entlast) ss1));[PLINE] コマンドで作図（"C" は p4 から p1 に結んで Close する意味）; 作成した四角形 (entlast) を選択セット (ss1) に加える;<< 内枠を描く >>(setq p5 (polar p4 0 yoko2));p5 は p4 から <0°（3 時方向）> で、距離は <yoko2> の位置(setq p6 (polar p1 0 yoko2));p6 は p1 から <0°（3 時方向）> で、距離は <yoko2> の位置(command "LINE" p5 p6 "");[LINE] コマンドで作図(setq ss1 (ssadd (entlast) ss1)); 作成した線分 (entlast) を選択セット (ss1) に加える

(setq p7 (polar p4 (* 1.5 pi) tate2));p7 は p4 から <270°（6 時方向）> で、距離は <tate2> の位置(setq p8 (polar p3 (* 1.5 pi) tate2));p8 は p3 から <270°（6 時方向）> で、距離は <tate2> の位置(command "LINE" p7 p8 "")第5節

画像でプログラムを選択する

使用する LISP
S_Edit2.lsp
使用する主な関数 setvar、atof、angtof
内部サブ関数(help00)
外部サブ関数(S_Edit2_1)、(cham1)、(cham2)
使用する DCL
S_Edit2.dcl使用するタイル
icon_image、edit_box
外部テキストなし
スライドファイル S_Edit2-1、S_Edit2-2
このプログラムは、2 種類ある面取りのどちらかを選択して、面取りを行います。
面取りのタイプによって、システム変数 [CHAMMODE] の切り替えも自動で処理します。
Step1 － <S_Edit2.lsp> を起動すると、下図のダイアログが表示されます。
面取りのタイプを画像で選択できるので、視覚的に判りやすくなります。
また、入力不可のタイルを指定できますから、誤入力も無くなります。
左側の図を選択すると、[ 角度 ] のタイルが非表示になり、角度は入力できません。

;[LINE] コマンドで作図(setq ss1 (ssadd (entlast) ss1)); 作成した線分 (entlast) を選択セット (ss1) に加える;<< 全体を移動する >>(setq p0 (polar p7 0 yoko2));p7 から <0°（3 時方向）> で、距離は <yoko2> の位置を p0 にセット

(command "MOVE" ss1 "" p0);p0 を基点として、選択セット (ss1) を移動（目的点はユーザーの指示待ち）;<<O スナップモードを元に戻す >>; システム変数 [OSMODE] を元の値に戻す;<< グローバル変数の初期化 >>(setq tate1 nil tate2 nil yoko1 nil yoko2 nil)

; グローバル変数をリセットする

);end
番号
①

Step2 －右側の図を選択すると、[2 本目 ] のタイルが非表示になり、2 本目の入力はできません。

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
スライドファイルを表示する範囲（X と Y の座標値）を指定します。縦横の幅を dcl で設定した "image00" の②

数値を指定しています。

③

イメージの表示は、[start_image][slide_image][end_image] の 3 つを記述します。
各 edit_box に初期値を入力します。[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。
edit_box "yoko1" の内容を変数 "yoko1" に代入します。（文字列）④⑤⑥

modo_tile で次のタイル "tate1" にカーソルが移動します。(Tab キーと同じ働きです。）
edit_box "tate1" の内容を変数 "tate1" に代入します。（文字列）modo_tile で次のタイル "yoko2" にカーソルが移動します。(Tab キーと同じ働きです。）
edit_box "yoko2" の内容を変数 "yoko2" に代入します。（文字列）⑦

modo_tile で次のタイル "tate2" にカーソルが移動します。(Tab キーと同じ働きです。）
edit_box "tate2" の内容を変数 "tate2" に代入します。（文字列）start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑧

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑨

2-91

選択できません！

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Edit1_1) を起動し、ダイアログを終了します。

図枠の数値を入力する選択できません！
システム変数 [CHAMMODE] も自動的に切り替えています。
面取りモード
指定方法
システム変数CHAMMODE<0>
2 つの面取り距離を指定します。 CHAMFERA、CHAMFERBCHAMMODE<1> 面取り距離と角度を指定します。 CHAMFERC、CHAMFERD

画像でプログラムを選択する

2-92

タイルをコントロール

タイルをコントロール(setvar "OSMODE" omode)第 3 章－タイルをコントロール

第 3 章－タイルをコントロール:edit_box /* 編集ボックス処理タイルスタート */S_Edit2.dcl

使用するダイアログ{

S_Edit2 : dialog

label = "2 本目 ";{key = "sen2";
width = 6;label = " 面取り選択 ";fixed_width = true;
value = 0;:boxed_row /* タイルを横並びに配置スタート */}{/* 編集ボックス処理タイル終了 */label = " 面取り ";:edit_box /* 編集ボックス処理タイルスタート */{:icon_image /* イメージ処理タイルスタート */label = " 角度 ";{label = "";key = "kaku";

key = "image01";

width = 6;

width = 40;

fixed_width = true;height =20;}

Point!

value = 0;}/* イメージ処理タイル終了 *//* 編集ボックス処理タイル終了 */spacer;:icon_image /* イメージ処理タイルスタート */}/* タイルを横並びに配置終了 */{Point!

key = "image02";

イメージタイルの大きさ (width と height) とスライドファイルの大きさの比率

width = 40;
height =20;}

タイルをコントロール

タイルをコントロール

label = "";使用するスライドファイル

width = 40;

width = 40;

height =20;

height =20;

width = 20;

width = 40;

height =20;

height =20;/* イメージ処理タイル終了 */}/* タイルを横並びに配置終了 */:boxed_row/* タイルを横並びに配置スタート */{:edit_box /* 編集ボックス処理タイルスタート */{右上のイメージタイルの大きさは、使用するスライド

label = "1 本目 ";ファイルの縦横の比率と同じにしていますが、右下のkey = "sen1";

イメージタイルの大きさはスライドファイルの比率と違っています。

width = 6;
fixed_width = true;

イメージタイルの縦横の数値を決めるときは、表示す

value = 0;}

2-93

るスライドファイルの縦横の比率を考慮する必要があ/* 編集ボックス処理タイル終了 */画像でプログラムを選択する

ります。

画像でプログラムを選択する

2-94

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール/* OK or CANCEL */: row

S_Edit2.lsp

使用する LISP/* タイルを横並びに配置スタート */(defun c:S_Edit2( / dialog_box dcl_id){;<< ダイアログを使用する準備 >>spacer;: button1{(setq dcl_id (load_dialog "S_Edit2"));S_Edit2.dcl をメモリーに読み込む(new_dialog "S_Edit2" dcl_id);S_Edit2 ダイアログを初期化する

label = " 実行 ";key = "accept";(setq x1 0) (setq y1 0); スライドを表示する位置（原点は左上）

width = 8;

(setq x2 (dimx_tile "image01"); スライドを表示する X の幅（右方向）

y2 (dimy_tile "image01"); スライドを表示する Y の幅（下方向）

2fixed_width = true;

込みと表示

スライドを表示する
X と Y の幅として→ "image01" の幅を指定しています。

)}
spacer;;<< スライドを表示する準備 >>: button(start_image "image01");"image01" にスライドを読み込む{(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同じにする(slide_image x1 y1 x2 y2 "S_Edit2-1"); スライド (S_Edit2-1) を表示(end_image); スライドの読み込みを終了

3label = " 中止 ";is_cancel = true;

スライドを読み込み、→背景色を指定して、"S_Edit2-1" のスライドを指定します。

;<< スライドを表示する準備 >>width = 4;

(start_image "image02");"image02" にスライドを読み込む

fixed_width = true;(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同じにする(slide_image x1 y1 x2 y2 "S_Edit2-2"); スライド (S_Edit2-2) を表示(end_image); スライドの読み込みを終了

4}
spacer;

スライドを読み込み、→背景色を指定して、"S_Edit2-2" のスライドを指定します。

: button;<< 各タイル の初期設定 >>{label = "Help";5

key = "help";
width = 4;

(set_tile "sen1" "");edit_box "sen1" の初期値を空白 <""> にセット

(set_tile "sen2" "");edit_box "sen2" の初期値を空白 <""> にセット

(set_tile "kaku" "");edit_box "kaku" の初期値を空白 <""> にセット

fixed_width = true;}};<< edit_box 処理 sen1 に値を受け取る >>spacer;(action_tile "sen1""(setq sen1 (get_tile¥"sen1¥"))"

6/* タイルを横並びに配置終了 */;edit_box "sen1" の値を取得

Point!

イメージを表示する範囲(0,0)→ dimx_tile

している場合は必要ありません。

edit_box "sen1" が→操作されたときのイメージを表示する範囲の指定は、左上を原点 (0,0) として右下に数値が大きくなります。
横の幅を [dimx_tile] で指定し、縦の幅を [dimy_tile] で指定します。

↓ dimy_tile

画像でプログラムを選択する

初期値をセット。

→ダイアログ側でセット処理を記述します。

)}//end2-95;edit_box "sen1" を操作する

3 つの edit_box の(dimx_tile "image01")、(dimy_tile "image01") はダイアログで指定した "image01" の大きさを使用することを意味します。

画像でプログラムを選択する

2-96

タイルをコントロール

key = "Cancel";

タイルをコントロール

ダイアログの読み

Point!

;<< イメージを表示する範囲を指定 >>is_default = true;→］

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール(setq help-S_Edit2;<< edit_box 処理 sen2 に値を受け取る >>(action_tile "sen2";edit_box "sen2" を操作"(setq sen2 (get_tile ¥"sen2¥"))"

7;edit_box "sen2" の値を取得(strcat

edit_box "sen2" が→操作されたときの"¥n 面取りのタイプを選択します。"

処理を記述します。

); サブ関数 (help00) が呼び出された時 (alert 関数 ) に、その中に表示する文字列を記述する;¥n は改行"¥n ""¥n 左側は、2 つの面取り距離を指定するタイプです。""¥n 右側は、面取り距離と角度を指定するタイプです。";<< edit_box 処理 kaku に値を受け取る >>(action_tile "kaku";edit_box "kaku" を操作"(setq kaku (get_tile¥"kaku¥"))"

8;edit_box "kaku" の値を取得"¥n "

edit_box "kaku" が→操作されたときの"¥nOK ボタンを押してを処理を継続してください。"

処理を記述します。

)));<< image01 処理 変数 check=1 >>(action_tile "image01"(strcat"(mode_tile ¥"kaku¥" 1)";edit_box "kaku" を非アクティブ（入力不可能）にする →"(mode_tile ¥"sen2¥" 0)";edit_box "sen2" をアクティブ（入力可能）にする<1> で 2 本の線分の面取り指定;<< 補助関数の定義 >>(defun S_Edit2_1()(cond);<< image02 処理 変数 check=2 >>タイルをコントロール;help-S_Edit2 の文字列を表示する);end; 変数 [check] の値を <1> にセット)

Point!

; サブ関数 (help00) が呼び出された時に、alert 関数を使用する(alert help-S_Edit2); 以下の文字列を結合する"(setq check 1)"
9(defun help00();icon_image "image01" を操作(action_tile "image02"

10( (= check 2) (cham2) ); 変数 [check] の値が <2> のときは、補助関数 (cham2) を起動する( T; どちらでも無い場合は、補助関数 (cham1) を起動する(cham1) ));end; 以下の文字列を結合する"(setq check 2)"; 変数 [check] の値が <1> のときは、補助関数 (cham1) を起動する);icon_image "image02" を操作(strcat( (= check 1) (cham1) ); 変数 [check] の値を <2> にセット

<2> で線分と角度;<< 外部サブ関数の定義 >>"(mode_tile ¥"sen2¥" 1)" ;edit_box "sen2" を非アクティブ（入力不可能）にする →(defun cham1()"(mode_tile ¥"kaku¥" 0)" ;edit_box "kaku" をアクティブ（入力可能）にする(setvar "CHAMMODE" 0)の面取り指定));2 つの面取り距離を指定する(setvar "CHAMFERA" (atof sen1));1 本目の面取り距離を設定（文字列を実数に変換）(setvar "CHAMFERB" (atof sen2));2 本目の面取り距離を設定（文字列を実数に変換）(prompt "¥n1 本目の線分と 2 本目の線分を選択：")11(action_tile "help" "(help00)")(command "CHAMFER"); "help" ボタンが押された時、サブ関数 (help00) を起動

13(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する］

ダイアログの入力

);end

と終了

;<< 外部サブ関数の定義 >>→;<<[ 実行 ] ボタンを押すと、システム変数 [DIASTAT] に <1> がセットされる >>(defun cham2()(if(= (getvar "DIASTAT") 1) (S_Edit2_1))(setvar "CHAMMODE" 1);[OK] ボタンが押された時のアクション; グローバル変数を空 <nil> にセット

; 面取り距離と角度を指定する(princ)(setvar "CHAMFERC" (atof sen1)));end(setvar "CHAMFERD" (angtof kaku 0)); 面取りの長さを設定（文字列を実数に変換）; 面取りの角度を設定（角度文字列を度数に変換）(prompt "¥n1 本目の線分と 2 本目の線分を選択：")(command "CHAMFER"); コマンドラインにメッセージを表示; 面取り [CHAMFER] を使って面取りを行う。2 本の線分はユーザーが指定する。

(setq sen1 nil sen2 nil kaku nil);<< ダイアログを終了する準備 >>12

タイルをコントロール

Point!

;<< サブ関数の定義 >>; コマンドラインにメッセージを表示; 面取り [CHAMFER] を使って面取りを行う。2 本の線分はユーザーが指定する。

(setq sen1 nil sen2 nil kaku nil)

; グローバル変数を空 <nil> にセット

);end

2-97

画像でプログラムを選択する

画像でプログラムを選択する

2-98

第 3 章－タイルをコントロール

①
②

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
スライドファイルを表示する範囲（X と Y の座標値）を指定します。縦横の幅を dcl で設定した "image01" の数値を指定しています。
イメージの表示は、[start_image][slide_image][end_image] の 3 つを記述します。

③[fill_image] を指定した場合は、イメージの背景色を指定できます。（<-2> はその時点の AutoCAD の背景色と④同じになります。）
右側のイメージ (image02) も③と同様にします。
edit_box "sen1"、"sen2"、"kaku" に初期値を入力します。[set_tile] は [load_dialog] の後、[action_tile] の前

⑤
⑥
⑦
⑧
⑨
⑩

に記述します。ここでは、""（空白）を指定していますが、既定値を指定することも出来ます。
edit_box "sen1" の内容を変数 "sen1" に代入します。（文字列）
edit_box "sen2" の内容を変数 "sen2" に代入します。（文字列）
edit_box "kaku" の内容を変数 "kaku" に代入します。（文字列）
icon_image "image01" が選択されると、プログラム分岐変数 check に <1> をセットします。
また edit_box "kaku" の mode_tile を <1> をセットすることで、"kaku" には入力が出来なくなります。
icon_image "image02" が選択されると、プログラム分岐変数 check に <2> をセットします。

⑪

また edit_box "sen2" の mode_tile を <1> をセットすることで、"sen2" には入力が出来なくなります。
"help" ボタンを押したときに、内部サブ関数 (help00) を起動します。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑫

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑬

スライダーをコントロールする

使用する LISP
S_Slider1.lsp
使用する主な関数 setvar
内部サブ関数(GetTileVal)
外部サブ関数(S_Slider1_1)
使用する DCL
S_Slider1.dcl
使用するタイル
icon_image、slider、text
外部テキストなし
スライドファイル S_Slider1-1 ～ S_Slider1-5
このプログラムは、線の太さの設定を画像で確認しながら行うことができます。
スライダーを動かすたびに、画像の線の太さが変わりますから、視覚的に判りやすくなります。
Step1 － <S_Slider1.lsp> を起動すると、下図のダイアログが表示されます。
スライダーを動かすと、画像の線の太さが変更されます。
また、スライダーの下のテキストボックスに線の太さの値も表示されます。
Step2 －スライダーで線の太さを確認しながら、新しい線の太さを指定できます。

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Edit2_1) を起動し、ダイアログを終了します。

Point!

タイルをコントロール

第6節

mode_tile の値には、以下の 5 つのパターンがあります。
値
0
1
2
3
4

mode_tile の mode のコード
説 明
タイルを使用可能にします。
タイルを使用禁止にします。
タイルにフォーカスを設定します。
編集ボックスの内容を選択します。
イメージのハイライト表示のオンとオフを切り替えます。

(action_tile "image01"; "image01" が選択された場合(strcat"(setq check 1)"; 分岐変数 [check] に <1> をセット"(mode_tile ¥"kaku¥" 1)"; タイル "kaku" を使用禁止にします。

"(mode_tile ¥"sen2¥" 0)"; タイル "sen2" を使用可能にします。

線の太さも表示されます。

線の太さも表示されます。

線の太さも表示されます。

5 つのスライドファイル (sld) は事前に用意しておきます。

))[mode_tile] を使用すると、上記のように他のタイルの mode（使用禁止や使用可能）をコントロールできます。

S_Slider1-1.sld

2-99

画像でプログラムを選択する

S_Slider1-2.sld

S_Slider1-3.sld

S_Slider1-4.sld

スライダーをコントロールする

S_Slider1-5.sld

2-100

タイルをコントロール

番号第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_Slider1.dcl

使用するダイアログ

S_Slider1.lsp

使用する LISP

S_Slider1 : dialog(defun c:S_Slider1( / dialog_box dcl_id){;<< ダイアログを使用する準備 >>label = " 線の太さを設定 ";1:boxed_column /* タイルを縦並びに配置スタート */{:icon_image /* イメージ処理タイルスタート */{2label = " パターン図 ";(new_dialog "S_Slider1" dcl_id);S_Slider1 ダイアログを初期化する→］

ダイアログの読み込みと表示(setq x1 0) (setq y1 0); スライドを表示する位置（原点は左上）(setq x2 (dimx_tile "image00"); スライドを表示する X の幅（右方向）

y2 (dimy_tile "image00"); スライドを表示する Y の幅（下方向）スライドを表示する→

X と Y の幅として"image00" の幅を指定しています。

)

key = "image00";;<< スライドを表示する準備 >>width = 40;
fixed_width = true;height =20;

3/* イメージ処理タイル終了 */};S_Slider1.dcl をメモリーに読み込む;<< イメージを表示する範囲を指定 >>label = " 線の太さ ";}(setq dcl_id (load_dialog "S_Slider1"))/* タイルを縦並びに配置終了 */(start_image "image00");"image00" にスライドを読み込む(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色(slide_image x1 y1 x2 y2 "S_Slider1-1"); スライド (S_Slider1-1) を表示(end_image); スライドの読み込みを終了

スライドを読み込み、背景色を指定して、→"S_Slider1-1" のスライドを指定します。

:boxed_row /* タイルを横並びに配置スタート */{4label = " 線の太さ入力 ";/* スライダー処理タイルスタート */{5(defun GetTileVal()(setq p (get_tile "slider01"));"slider01" の値を変数 <p> にセット

key = "slider01";(setq p1 (rtos (/ (atof p) 100)))

min_value = 5;

(setq pt0 " 線の太さは ")max_value = 45;(set_tile "text00" (strcat pt0 p1 " ミリです "));text00 に 文字列を連結してセット

small_increment = 10;(cond ((= p "5")(setq image000 "S_Slider1-1"));p が <"5"> の時、image000 に "S_Slider1-1" を代入

big_increment = 10;((= p "25")(setq image000 "S_Slider1-3")) ;p が <"25"> の時、image000 に "S_Slider1-3" を代入

fixed_width = true;((= p "35")(setq image000 "S_Slider1-4")) ;p が <"35"> の時、image000 に "S_Slider1-4" を代入

is_tab_stop = false;((= p "45")(setq image000 "S_Slider1-5")) ;p が <"45"> の時、image000 に "S_Slider1-5" を代入/* スライダー処理タイル終了 */})/* タイルを横並びに配置終了 */:text /* テキストボックス処理タイルスタート */{key = "text00";(start_image "image00");"image00" にスライドを読み込む(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色にする(slide_image x1 y1 x2 y2 image000); スライド (image000) を表示(end_image)width = 20;};" 線の太さは " の文字を <pt0> にセット((= p "15")(setq image000 "S_Slider1-2")) ;p が <"15"> の時、image000 に "S_Slider1-2" を代入

width = 30;};<p1> の値は 1/100 ミリメートル単位で入力する必要があります/* テキストボックス処理タイル終了 *//* OK or CANCEL */; スライドの読み込みを終了

スライドを読み込み、背景色を指定して、→"image000" のスライドを指定します。

)(image000) には、"S_Slider1-1" から "S_Slider1-5" のスライドが順次切り替わります。

ok_cancel;}//end2-101

スライダーをコントロールする

スライダーをコントロールする

2-102

タイルをコントロール

タイルをコントロール; "slider01" のバーがスライドした時、(GetTileVal) を起動;<<"slider01" の切り替えを行うサブ関数 >>spacer;:slider(action_tile "slider01" "(GetTileVal)")第 3 章－タイルをコントロール

6

第 3 章－タイルをコントロール(action_tile "accept" "(S_Slider1_1)(done_dialog 1)"); ダイアログを閉じて (S_Slider1_1) を起動(action_tile "cancel" "(done_dialog 0)")

; 何も処理しないで閉じる;<< ダイアログを終了する準備 >>7(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→］

ダイアログの入力と終了

第7節使用する LISP
S_Radio1.lsp
使用する主な関数 AutoCAD("RECTANG"、"ZOOM")、if
内部サブ関数なし
外部サブ関数(S_Radio1_1)、(check_9) ～ (check36)
使用する DCL
S_Radio1.dcl
使用するタイルRadio_button
外部テキストなし
スライドファイル なし
このプログラムは、用紙の大きさと尺度を指定して、自動的に図枠を作図します。
定型の図枠をまとめて指定しておけば、効率が上がります。

(princ));end

Step1 － <S_Radio1.lsp> を起動すると、下図のダイアログが表示されます。

;<< 外部サブ関数に移る >>用紙の大きさと縮尺を選択して、[OK] ボタンを押します。

(defun S_Slider1_1()

8

図枠を自動的に作成する指定しない場合は、用紙は [A2]、縮尺は [1/100] になります。

(cond ; スライダーの値が <1 ～ 5> であれば、[ 線の太さを表示 <LWDISPLAY>] を有効にして、;<< 既定の線の太さの値を <0.05> に設定します。>>( (= p "1") (setvar "LWDISPLAY" 1)(setvar "LWDEFAULT" 5));1/100 ミリメートル単位で入力;<< 既定の線の太さの値を <0.15> に設定します。>>( (= p "2") (setvar "LWDISPLAY" 1)(setvar "LWDEFAULT" 15))

;1/100 ミリメートル単位で入力;<< 既定の線の太さの値を <0.25> に設定します。>>( (= p "3") (setvar "LWDISPLAY" 1)(setvar "LWDEFAULT" 25))

;1/100 ミリメートル単位で入力;<< 既定の線の太さの値を <0.35> に設定します。>>;1/100 ミリメートル単位で入力

Step2 －図枠の左下は、原点 (0,0) を既定値として指定しています。

;<< 既定の線の太さの値を <0.5> に設定します。>>

タイルをコントロール( (= p "5") (setvar "LWDISPLAY" 1)(setvar "LWDEFAULT" 50))

第 4 節の方法を取り入れると、挿入時の位置をマウスで指定することが可能です。

;1/100 ミリメートル単位で入力);cond

縮尺 1/1

);end
(A1)

番号
①
②

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
スライドファイルを表示する範囲（X と Y の座標値）を指定します。縦横の幅を dcl で設定した "image00" の数値を指定しています。
イメージの表示は、[start_image][slide_image][end_image] の 3 つを記述します。

③[fill_image] を指定した場合は、イメージの背景色を指定できます。（<-2> はその時点の AutoCAD の背景色と④同じになります。）"slider01" が操作される度に、内部サブ関数 (SaveTileVal) を起動します。
"slider01" の値を変数 [p] にセットします。p の値に応じて、スライドファイルの表示を切り替えます。
p の値は文字なので、ミリ単位で表示するために数値に変換します。

⑤ （既定の線の太さは、太さの値を (1/100 ミリメートル単位 ) で設定します。）(A3)

縮尺 1/50(841,594)(594,420)(A2)

タイルをコントロール( (= p "4") (setvar "LWDISPLAY" 1)(setvar "LWDEFAULT" 35))

(A1)

(A2)

(420,297)

(A3)

(0,0)

(42050,29700)(29700,21000)(21000,14850)(0,0)

縮尺 1/100(A1)(84100,59400)

text_tile "text00" に現在の線の太さを表示します。
⑥
⑦
⑧

2-103

p の値に応じて、対応するスライドファイルを切り替えて表示します。
[OK] ボタンが押されると、外部サブ関数 (S_Slider1_1) を起動して、フラッグ (status) として <1> を指定します。

(A2)

この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

(A3)(59400,42000)(42000,29700)

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。
ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
"slider01" の値が変更される度に、システム変数 [LWDISPLAY] の値を変更します。
[LWDISPLAY] は線の太さをコントロールするシステム変数です。

スライダーをコントロールする(0,0)

図枠を自動的に作成する

2-104

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_Radio1.dcl

使用するダイアログ:boxed_row/* タイルを横並びに配置スタート */{label = " 縮尺 ";S_Radio1 : dialog{
label = " 図面設定 ";:radio_button:boxed_radio_row /* タイルを横並びに配置スタート */{label = "1/1";{

key = "1/1";

label = " 用紙の大きさ ";}:radio_button{label = "A3";:radio_button

key = "A3";{}label = "1/50";:radio_button

key = "1/50";}{
label = "A2";

タイルをコントロール

value = "1";:radio_button
Point!

{}

label = "1/100";:radio_button

key = "1/100";{

value = "1";

Point!

タイルをコントロール

key = "A2";}label = "A1";}

key = "A1";/* タイルを横並びに配置終了 */}}/* OK or CANCEL *//* タイルを横並びに配置終了 */Point!

ok_cancel;}//endradio_button の値

radio_button が取得する値は、<"0"> か <"1"> のどちらかです。
選択された場合は <"1"> がセットされ、選択されない場合は <"0"> がセットされます。
toggle_button と違って、radio_button はグループの内、1 つだけがオンに出来ます。

Point!

radio_button [key = "1/100"] に初期値をセットする方法

例えば、上記の中で key="A2" が選択された時（オン）、他の 2 つ（"A3" と "A1"）は自動的にオフになります。
label が "A2" の radio_button が選択された時、それぞれ 3 つのボタンの値は次のようになります。
・key = "A3" の値は、(setq a3 (get_tile "A3")) で取得できます。

ダイアログ側では、[value] に <"1"> を記述します。

AutoLISP 側では、[set_tile] で <"1"> を代入します。

:radio_button(new_dialog "S_Radio1" dcl_id){

このとき、a3 には <"0"> がセットされています。（文字列）label = "1/100";・key = "A2" の値は、(setq a2 (get_tile "A2")) で取得できます。

key = "1/100";

このとき、a2 には <"1"> がセットされています。（文字列）value = "1";・key = "A1" の値は、(setq a1(get_tile "A1")) で取得できます。

}

・;new_dialog と start_dialog の間に記述する(set_tile "1/100" "1")・

(setq dialog-box (start_dialog))

このとき、a1 には <"0"> がセットされています。（文字列）2-105

図枠を自動的に作成する図枠を自動的に作成する

2-106

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール(defun S_Radio1_1()

S_Radio1.lsp

使用する LISP(setq check (+ yousi scale))(cond(defun c:S_Radio1( / dialog_box dcl_id);<< ダイアログを使用する準備 >>(setq dcl_id (load_dialog "S_Radio1"));S_Radio1.dcl をメモリーに読み込む(new_dialog "S_Radio1" dcl_id);S_Radio1 ダイアログを初期化する］→

ダイアログの読み込みと表示;<< 用紙の大きさのチェック >>(action_tile "A3" "(setq yousi 1)")

; "A3" が選択されると、<1> をセット

(action_tile "A2" "(setq yousi 2)"); "A2" が選択されると、<2> をセット

(action_tile "A1" "(setq yousi 4)")2

どれも選択されな; "A1" が選択されると、<4> をセット

(if (= yousi nil)

; どれも選択されなかった時の処理(setq yousi 2); <2> をセットかった時は、変数→[yousi] に <2> をセットします。

; "1/1" が選択されると、<8> をセット

(action_tile "1/50" "(setq scale 16)"); "1/50" が選択されると、<16> をセット

(action_tile "1/100" "(setq scale 32)"); "1/100" が選択されると、<32> をセット
; どれも選択されなかった時の処理(setq scale 32)( (= check 33) (check_33) ); 以上 A3; 合計 (check) が <33> の時は、外部サブ関数 (check_33) を起動( (= check 10) (check_10) ); 合計 (check) が <10> の時は、外部サブ関数 (check_10) を起動( (= check 18) (check_18) ); 合計 (check) が <18> の時は、外部サブ関数 (check_18) を起動( (= check 34) (check_34) ); 以上 A2; 合計 (check) が <34> の時は、外部サブ関数 (check_34) を起動( (= check 12) (check_12) ); 合計 (check) が <12> の時は、外部サブ関数 (check_12) を起動( (= check 20) (check_20) ); 合計 (check) が <20> の時は、外部サブ関数 (check_20) を起動( (= check 36) (check_36) ); 以上 A1; 合計 (check) が <36> の時は、外部サブ関数 (check_36) を起動);cond; <32> をセット;<<A3 用紙
どれも選択されな
かった時は、変数→(defun check_9 ( )(command "rectang" "0,0" "420,297"); 長方形 [rectang] で作図する

セットします。

(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<< ダイアログを終了する準備 >>(setq dialog-box (start_dialog))(unload_dialog dcl_id)

縮尺 1/1>>[scale] に <32> を)

タイルをコントロール; 合計 (check) が <17> の時は、外部サブ関数 (check_17) を起動);end(action_tile "1/1" "(setq scale 8)")(if (= scale nil)

; ユーザー入力を受け付ける; ダイアログをメモリーから解放する→］

ダイアログの入力;<<A3 用紙と終了

(defun check_17 ( );<<[OK] ボタンが押されたら、外部サブ関数 (S_Radio1_1) を起動する >>(if(= (getvar "DIASTAT") 1) (S_Radio1_1))

5( (= check 17) (check_17) )(princ);<< 縮尺のチェック >>4; 合計 (check) が <9> の時は、外部サブ関数 (check_9) を起動(setq yousi nil scale nil) ; 変数 [yousi] と変数 [scale] の値を <nil> にセット)

3

( (= check 9) (check_9) )タイルをコントロール

1; 変数 [yousi] と変数 [scale] を合計する;[OK] ボタンが押された時、外部サブ関数 (S_Radio_1) を起動

縮尺 1/50>>(command "rectang" "0,0" "21000,14850"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ)

番号
①
②
③
④
⑤

2-107

(princ)

);end

);end

;<<A3 用紙説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
選択した radio_button の値を取得します。"A3" は <1>、"A2" は <2>、"A1" は <4> にします。
どれも選択されなかった場合には、エラーを避けるために <2> をセットします。
②と同様に、"1/1" を <8>、"1/50" を <16>、"1/100" を <32> にセットします。
どれも選択されなかった場合には、エラーを避けるために <32> をセットします。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

縮尺 1/100>>(defun check_33 ( )(command "rectang" "0,0" "42000,29700"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<< 以上 A3>>

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。
ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Radio1_1) を起動し、ダイアログを終了します。

図枠を自動的に作成する図枠を自動的に作成する

2-108

第 3 章－タイルをコントロール;<<A2 用紙第 3 章－タイルをコントロール

第8節

縮尺 1/1>>(defun check_10 ( )(command "rectang" "0,0" "594,420"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<<A2 用紙

多角形を視覚的に作図する

使用する LISP
S_Radio2.lsp
使用する主な関数 cmdecho、AutoCAD("polygon")
内部サブ関数(GetTileVal)
外部サブ関数(S_Radio2_1)、(san1) ～ (sikaku3)
使用する DCL
S_Radio2.dcl使用するタイルRadio_button
外部テキストなし
スライドファイル なし
このプログラムは、多角形 (POLYGON) の作図方法を視覚的に判りやすく表示したものです。
コマンドラインに目を落とすことも無いので、作業が中断することはありません。

縮尺 1/50>>(defun check_18 ( )(command "rectang" "0,0" "29700,21000"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ)Step1 － <S_Radio2.lsp> を起動すると、下図のダイアログが表示されます。
最初に、正三角形か正方形かを選択します。次に、3 つの作図方法から 1 つを選択します。
[Help] ボタンを押すと、3 つの作図方法が表示されます。

);end;<<A2 用紙

縮尺 1/100>>(defun check_34 ( )(command "rectang" "0,0" "59400,42000"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<< 以上 A2>>;<<A1 用紙

縮尺 1/1>>(command "rectang" "0,0" "841,594"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ)Step2 －上の図は、正三角形の [ 外接 ] を選択した図です。
下の図は、正方形の [ 内接 ] を選択した図です。

);end;<<A1 用紙

タイルをコントロール

タイルをコントロール(defun check_12 ( )縮尺 1/50>>(defun check_20 ( )(command "rectang" "0,0" "42050,29700"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<<A1 用紙

縮尺 1/100>>(defun check_36 ( )(command "rectang" "0,0" "84100,59400"); 長方形 [rectang] で作図する(command "ZOOM" "A"); 拡大 [zoom] で図面全体を表示する(princ));end;<< 以上 A1>>

2-109

図枠を自動的に作成する

多角形を視覚的に作図する

2-110

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール:radio_button

S_Radio ２.dcl

使用するダイアログ{

S_Radio2 : dialog

label = " 内接 ";{key = "hen3";}label = " 三角形・四角形 ";:boxed_radio_row/* タイルを横並びに配置スタート */}/* タイルを縦並びに配置終了 */{/* OK or CANCEL */label = " 多角形の選択 ";key = "main_key1;

Point!

: row{:radio_button

spacer;{label = " 正三角形 ";: buttonkey = "sankaku";{}label = "Ok";:radio_button

is_default = true;{

key = "accept";label = " 正方形 ";width = 8;

key = "sikaku";

fixed_width = true;}}

spacer;spacer;: button/* タイルを横並びに配置終了 */:boxed_radio_column

タイルをコントロール}

タイルをコントロール/* タイルを横並びに配置スタート */{/* タイルを縦並びに配置スタート */label = "Cancel";{

is_cancel = true;label = "1 辺 or 外接 or 内接 ";key = "main_key2

Point!

key = "Cancel";:radio_button

width = 4;{

fixed_width = true;label = "1 辺 ";}key = "hen1";

spacer;}: button:radio_button{label = "Help";{
label = " 外接 ";key = "help";

key = "hen2";

width = 4;
fixed_width = true;}}

spacer;}/* タイルを横並びに配置終了 */}//end2-111

多角形を視覚的に作図する

多角形を視覚的に作図する

2-112

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<< 外部サブ関数 >>S_Radio ２.lsp

使用する LISP(defun c:S_Radio2( / dialog_box dcl_id help-radio_2);<< ダイアログを使用する準備 >>1(setq dcl_id (load_dialog "S_Radio2"));S_Radio2.dcl をメモリーに読み込む(new_dialog "S_Radio2" dcl_id);S_Radio2 ダイアログを初期化する

ダイアログ

］

→の読み込みと表示;<<radio_button[ 多角形の選択 ] のどちらが選択されたか、[1 辺 or 外接 or 内接 ] のどれが選択されたかを調べる >>28(defun S_Radio2_1( / c)Point!

(setq c (strcat a b))(cond;A の文字列と B の文字列を結合した内容次第で外部サブ関数を分岐する; 内容次第で外部サブ関数を分岐する( (= c "sankakuhen1") (san1) ) ;c の文字列が <sankakuhen1> の時は、外部サブ関数 (san1) を起動( (= c "sankakuhen2") (san2) ) ;c の文字列が <sankakuhen2> の時は、外部サブ関数 (san2) を起動(action_tile "main_key1" "(GetTileVal)"); "main_key1" に値が入ると、サブ関数 (GetTileVal) を起動( (= c "sankakuhen3") (san3) ) ;c の文字列が <sankakuhen3> の時は、外部サブ関数 (san3) を起動(action_tile "main_key2" "(GetTileVal)"); "main_key2" に値が入ると、サブ関数 (GetTileVal) を起動( (= c "sikakuhen1") (sikaku1) ) ;c の文字列が <sikakuhen1> の時は、外部サブ関数 (sikaku1) を起動( (= c "sikakuhen2") (sikaku2) ) ;c の文字列が <sikakuhen2> の時は、外部サブ関数 (sikaku2) を起動( (= c "sikakuhen3") (sikaku3) ) ;c の文字列が <sikakuhen3> の時は、外部サブ関数 (sikaku3) を起動(defun GetTileVal ()3(setq a (get_tile "main_key1")); "main_key1" 内の選択された項目 (<sankaku>or<sikaku>) を取得((setq b (get_tile "main_key2")); "main_key2" 内の選択された項目 (<hen1>or<hen2>or<hen3>) を取得);cond(action_tile "help" "(help00)");<<1 辺を指示して正三角形を作図 >>(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する;<<[OK] ボタンが押されたら、外部サブ関数 (S_Radio2_1) を起動する >>(if(= (getvar "DIASTAT") 1) (S_Radio2_1))

タイルをコントロール

6;[OK] ボタンが押された時のアクション

ダイアログ

→
］

の入力と終
了

(defun san1 ( / pt1 pt2)
(setvar "cmdecho" 0); プロンプトとユーザー入力のエコーバックを非表示(setq pt1 (getpoint "¥n 辺の 1 点目 :"))
(command "polygon" "3" "E" pt1 pt2));end

(setq a nil b nil);<< 内部サブ関数 >>(setvar "cmdecho" 1)(alert help-radio_2)

7; 辺の 1 点目を pt1 にセット

(setq pt2 (getpoint pt1 "¥n 辺の 2 点目 :"))

(princ)(defun help00(); 辺の 2 点目を pt2 にセット;[ ポリゴン ] コマンドで正三角形を作図; グローバル変数を <nil> にセット
; プロンプトとユーザー入力のエコーバックを表示; 内部サブ関数 (help00) が呼び出された時に、alert 関数を使用する);end;[help-radio_2] のテキストを表示する;<< 中心と辺の中点までの距離を指示して正三角形を作図 >>)(defun san2 ( / pt1 pt2);<< サブ関数 (help00) が呼び出された時 (alert 関数 ) に、その中に表示する文字列を記述する >>(setvar "cmdecho" 0)(setq help-radio_2(setq pt1 (getpoint "¥n 中心 :"))

(strcat(setq pt2 (getpoint pt1 "¥n 辺の中点 :"))"¥n 最初に正三角形か正方形を選択します。"(command "polygon" "3" pt1 "C" pt2)"¥n "(setq a nil b nil)"¥n １辺・・・一辺の長さを指定します。"(setvar "cmdecho" 1)

"¥n "

);end

"¥n 外接・・・中心と辺の中点の長さを指定します。""¥n ""¥n 内接・・・中心と頂点の長さを指定します。""¥n "Point!
8; プロンプトとユーザー入力のエコーバックを非表示; 中心を pt1 にセット
; 辺の中点までの距離を pt2 にセット;[ ポリゴン ] コマンドで正三角形を作図; グローバル変数を <nil> にセット
; プロンプトとユーザー入力のエコーバックを表示[ 多角形の選択 ] で < 三角形 > を選んだ場合は、変数 <a> には <sankaku> が代入されています。
[1 辺 or 外接 or 内接 ] で <1 辺 > を選んだ場合は、変数 <b> には <hen1> が代入され"¥nOK ボタンを押してを処理を継続してください。"ています。
この 2 つを文字列連結の関数 [strcat] で 1 つの文字列 <sankakuhen1> にしています。

))

2-113

; どれも選択されなかった時は、外部サブ関数 (san1) を起動);end; "help" ボタンが押された時、サブ関数 (help00) を起動;<< ダイアログを終了する準備 >>5(san1) )(princ))4

T

タイルをコントロール

Point!

多角形を視覚的に作図する

多角形を視覚的に作図する

2-114

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<< 中心と頂点までの距離を指示して正三角形を作図

番号(defun san3 ( / pt1 pt2)①
; プロンプトとユーザー入力のエコーバックを非表示(setq pt1 (getpoint "¥n 中心 :"))

; 中心を pt1 にセット

(setq pt2 (getpoint pt1 "¥n 辺の頂点 :"))
(command "polygon" "3" pt1 "I" pt2)
(setq a nil b nil)

; 頂点までの距離を pt2 にセット

(command "polygon" "4" "E" pt1 pt2);[ ポリゴン ] コマンドで正方形を作図; プロンプトとユーザー入力のエコーバックを表示);end;<< 中心と辺の中点までの距離を指示して正方形を作図 >>タイルをコントロール(defun sikaku2 ( / pt1 pt2)
; プロンプトとユーザー入力のエコーバックを非表示(setq pt1 (getpoint "¥n 中心 :"))

; 中心を pt1 にセット

(setq pt2 (getpoint pt1 "¥n 辺の中点 :"))
(command "polygon" "4" pt1 "C" pt2)

; 辺の中点までの距離を pt2 にセット

; プロンプトとユーザー入力のエコーバックを表示);end

Radio_button の [key] と Radio_row(column) の [key] の相違
3 第 7 節では、radio_button の [key] の値を取得しました。radio_button の値は、<"0"> か <"1"> です。
第 8 節では、radio_row と radio_column の値を取得しました。
radio_row や radio_column が取得する値は、その radio グループを構成する各 radio_button の [key 名 ]になります。
従って、[ 多角形の選択 ] のグループ（正三角形か正方形）の内、正三角形が選択された（"sankaku" が<"1"> にセット）されたときは、"main_key1" には "sankaku" の文字列がセットされます。
同様に、[1 辺 or 外接 or 内接 ] のグループの内、1 辺が選択された（"hen1" が <"1"> にセット）されたときは、"main_key2" には "hen1" の文字列がセットされます。
このように、radio_row や radio_column が取得する値は <"0"> や <"1"> ではなく、構成する radio_button の [key 名 ] です。
第 7 節では、radio_button の値（<"0"> か <"1"> か）でプログラムを分岐しましたが、;<< 中心と頂点までの距離を指示して正方形を作図 >>第 8 節では、radio_row や radio_column の値（具体的な <key 名 >）でプログラムを分岐しています。

(defun sikaku3 ( / pt1 pt2)
; プロンプトとユーザー入力のエコーバックを非表示(setq pt1 (getpoint "¥n 中心 :"))

; 中心を pt1 にセット

(setq pt2 (getpoint pt1 "¥n 辺の頂点 :"))
(command "polygon" "4" pt1 "I" pt2)
(setq a nil b nil)

Point!

;[ ポリゴン ] コマンドで正方形を作図; グローバル変数を <nil> にセット

(setvar "cmdecho" 0)radio_2) に事前に記述しておきます。
[OK] ボタンが押された時に呼び出される外部関数です。

; 辺の 2 点目を pt2 にセット

; グローバル変数を <nil> にセット

(setvar "cmdecho" 1)

もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Radio2_1) を起動し、ダイアログを終了します。
[help] ボタンが押された時に、この関数を起動します。alert 関数で表示する文字列は、文字列変数名 (help-; 辺の 1 点目を pt1 にセット

(setq pt2 (getpoint pt1 "¥n 辺の 2 点目 :"))

(setq a nil b nil)

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。

; プロンプトとユーザー入力のエコーバックを非表示(setq pt1 (getpoint "¥n 辺の 1 点目 :"))

(setvar "cmdecho" 0)

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑧(defun sikaku1 ( / pt1 pt2)

(setvar "cmdecho" 1)⑤⑦;<< 四角形 >>(setq a nil b nil)

この 2 つの値は、それぞれの radio_button グループのキー名（文字列）が入ります。
"help" ボタンを押したときに、内部サブ関数 (help00) を起動します。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑥;<<1 辺を指示して正方形を作図 >>dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
radio_button が選択される度に、内部サブ関数 (GetTileVal) を起動します。
2 つの radio_button のグループ値を取得します。（"main_key1" と "main_key2")④; プロンプトとユーザー入力のエコーバックを表示);end(setvar "cmdecho" 0)③;[ ポリゴン ] コマンドで正三角形を作図; グローバル変数を <nil> にセット

(setvar "cmdecho" 1)②; 頂点までの距離を pt2 にセット;[ ポリゴン ] コマンドで正方形を作図; グローバル変数を <nil> にセット

(setvar "cmdecho" 1); プロンプトとユーザー入力のエコーバックを表示

);end

2-115

多角形を視覚的に作図する

多角形を視覚的に作図する

2-116

タイルをコントロール(setvar "cmdecho" 0)

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。

第 3 章－タイルをコントロール

第9節

第 3 章－タイルをコントロール
使用するダイアログ

ユーザー独自の O スナップ機能を作成する

使用する LISP

S_Toggle1.lsp
使用する主な関数 atoi、setvar(S_Toggle1_Val)
内部サブ関数外部サブ関数(snap_val)(osnap_all_set)、(osnap_all_clear)
使用する DCL
S_Toggle1.dcl
使用するタイル
toggle外部テキストなし
スライドファイル なし
このプログラムは、AutoCAD の [ オブジェクト スナップ ] と同じ機能です。

S_Toggle1.dcl

S_Toggle1 : dialog{
label = " オブジェクト スナップ設定 ";:boxed_column /* タイルを縦並びに配置スタート */このプログラムを作成すると、他のプログラムを起動中でも割り込みで使用出来ます。

{
label = " オブジェクト スナップ モード ";Step1 － <S_Toggle1.lsp> を起動すると、下図のダイアログが表示されます。
この時点では、現在の [ オブジェクト スナップ ] の状態が表示されます。（左図）:toggle

使用するスナップを選択すると（右図）、AutoCAD の設定も自動的に変更されます。

{
label = " 端点 ";key = "snap_1";}:toggle{label = " 中点 ";key = "snap_2";

タイルをコントロール

タイルをコントロール}:toggle{label = " 中心 ";key = "snap_4";

Step2 － [ すべて選択 ] を選ぶと、5 つの項目すべてがチェックされます。
（左図）}[ すべてクリア ] を選ぶと、5 つの項目すべてのチェックが解除されます。（右図）:toggle{label = " 四半円点 ";key = "snap_16";}:toggle{label = " 交点 ";key = "snap_32";
}
}

2-117

ユーザー独自の O スナップ機能を作成する/* タイルを縦並びに配置終了 */ユーザー独自の O スナップ機能を作成する

2-118

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール:boxed_radio_row /* タイルを横並びに配置スタート */label = "";(defun c:S_Toggle1 ( / dialog_box dcl_id):button;<< ダイアログを使用する準備 >>{1label = " すべて選択 ";key = "snap_all";(setq dcl_id (load_dialog "S_Toggle1"));S_Toggle1.dcl をメモリーに読み込む(new_dialog "S_Toggle1" dcl_id);S_Toggle1 ダイアログを初期化する

ダイアログ

→
］

の読み込み
と表示

; <<"snap_1" から "snap_32" までの toggle が選択された時の動作を記述 >>}(action_tile "snap_1" "(S_Toggle1_Val)"); "snap_1" が選択されると、サブ関数 (S_Toggle1_Val) を起動:button(action_tile "snap_2" "(S_Toggle1_Val)"); "snap_2" が選択されると、サブ関数 (S_Toggle1_Val) を起動(action_tile "snap_4" "(S_Toggle1_Val)"); "snap_4" が選択されると、サブ関数 (S_Toggle1_Val) を起動{

2
label = " すべてクリア ";(action_tile "snap_16" "(S_Toggle1_Val)") ; "snap_16" が選択されると、サブ関数 (S_Toggle1_Val) を起動

key = "snap_clear";(action_tile "snap_32" "(S_Toggle1_Val)") ; "snap_32" が選択されると、サブ関数 (S_Toggle1_Val) を起動}}

S_Toggle1.lsp

使用する LISP{; <<"snap_all" または、"snap_clear" が選択された時の動作を記述 >>/* タイルを横並びに配置終了 */3/* OK or CANCEL */ok_cancel;(action_tile "snap_all""(osnap_all_sel)")(action_tile "snap_clear" "(osnap_all_clear)"); サブ関数 (osnap_all_sel) を起動; サブ関数 (osnap_all_clear) を起動;<< ダイアログを終了する準備 >>}//end4(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する

ダイアログ

］

→の入力と終了;<<[OK] ボタンが押されたら、外部サブ関数 (snap_val) を起動する >>5(if(= (getvar "DIASTAT") 1) (snap_val)); システム変数 [DIASTAT] が <1> の時は、外部サブ関数を起動する);end
Point!
ビットコード
0（※）
1
2
4
8
16
32
64
128
256
512
1024（※）
2048
4096
8192

osmode にセットする数値コード
モード
解除 [NON]（モード設定なし）
端点 [ENDpoint]
中点 [MIDpoint]
中心 [CENter]
点 [NODe]
四半円点 [QUAdrant]
交点 [INTersection]
挿入基点 [INSert]
垂線 [PERpendicular]
接線 [TANgent]
近接点 [NEArest]
すべてのオブジェクト スナップがクリアされます。
仮想交点 [APP]
延長 [EXT]
平行 [PAR]オブジェクト スナップを複数指定する場合は、これらの値の和を入力します。
たとえば、20 と入力すると、[ 中心 ]( ビットコード <4>) と [ 四半円点 ]( ビットコード <16>)6(defun S_Toggle1_Val(); 各トグルの数値を変数にセットする (<"0"> か <"1">)(setq sna_1 (atoi (get_tile "snap_1")));[snap_1] の情報 <"0" か "1"> を整数に変換して、変数にセット(setq sna_2 (atoi (get_tile "snap_2")));[snap_2] の情報 <"0" か "1"> を整数に変換して、変数にセット(setq sna_4 (atoi (get_tile "snap_4")));[snap_4] の情報 <"0" か "1"> を整数に変換して、変数にセット(setq sna_16 (atoi (get_tile "snap_16"))) ;[snap_16] の情報 <"0" か "1"> を整数に変換して、変数にセット(setq sna_32 (atoi (get_tile "snap_32"))) ;[snap_32] の情報 <"0" か "1"> を整数に変換して、変数にセット(if (= sna_1 1)(setq sna_1 1));[sna_1] の値が <1> であれば、変数 [sna_1] に <1> をセット [ 端点 ](if (= sna_2 1)(setq sna_2 2));[sna_2] の値が <1> であれば、変数 [sna_2] に <2> をセット [ 中点 ](if (= sna_4 1)(setq sna_4 4));[sna_4] の値が <1> であれば、変数 [sna_4] に <4> をセット [ 中心 ](if (= sna_16 1)(setq sna_16 16));[sna_16] の値が <1> であれば、
変数 [sna_16] に <16> をセット [ 四半円点 ](if (= sna_32 1)(setq sna_32 32));[sna_32] の値が <1> であれば、変数 [sna_32] に <32> をセット [ 交点 ]);endのオブジェクト スナップを指定したことになります。
（※）(setvar "OSMODE" 0) と (setvar "OSMODE" 1024) は同じ結果になります。

2-119

ユーザー独自の O スナップ機能を作成する

ユーザー独自の O スナップ機能を作成する

2-120

タイルをコントロール

タイルをコントロール(princ)

第 3 章－タイルをコントロール
7

第 3 章－タイルをコントロール(defun osnap_all_sel();[ すべて選択 ] ボタンが押された時の動作を記述(set_tile "snap_1" "1");"snap_1" の値を <"1"(On)> にセット [ 端点 ](set_tile "snap_2" "1");"snap_2" の値を <"1"(On)> にセット [ 中点 ]

(set_tile "snap_4" "1");"snap_4" の値を <"1"(On)> にセット [ 中心 ]第 10 節(set_tile "snap_32" "1") ;"snap_32" の値を <"1"(On)> にセット [ 交点 ]使用する LISPS_Popup2.lsp
使用する主な関数 list、nth、mapcar、regapp、entmod
内部サブ関数(SaveTileVal)
外部サブ関数(S_Popup2_1)
使用する DCL
S_Popup2.dcl使用するタイル
list_box、popup_list
外部テキストなし
スライドファイル なし
このプログラムは、図面内の図形に拡張データ (Xdata) を付加します。

(S_Toggle1_Val)

ブロックの属性定義と違って、通常の図形にユーザー独自のデータを付加することができます。

(set_tile "snap_16" "1") ;"snap_16" の値を <"1"(On)> にセット [ 四半円点 ]8; サブ関数 (S_Toggle1_Val) を起動

);end
9

10

拡張データ (XDATA) を付加する

Step1 － <S_Popup2.lsp> を起動すると、右下図のダイアログが表示されます。

(defun osnap_all_clear();[ すべてクリア ] ボタンが押された時の動作を記述(set_tile "snap_1" "0");"snap_1" の値を <"0"(Off)> にセット

(set_tile "snap_2" "0");"snap_2" の値を <"0"(Off)> にセット

(set_tile "snap_4" "0");"snap_4" の値を <"0"(Off)> にセット

(set_tile "snap_16" "0");"snap_16" の値を <"0"(Off)> にセット

(set_tile "snap_32" "0");"snap_32 の値を <"0"(Off)> にセット

(S_Toggle1_Val); サブ関数 (S_Toggle1_Val) を起動[ 製造会社 ]、[ 設置年 ]、[ 更新年 ] を選択して、左図の中の電球を指示します。
ブロック図形以外の図形にも情報を付加することができます。
左図の○印の電球に拡張データ (Xdata) を付加する);end; 最終的な各トグルの数値を合計する(defun snap_val ()(setvar "cmdecho" 0); プロンプトとユーザー入力のエコーバックを非表示

タイルをコントロール(setq sna_all (+ sna_1 sna_2 sna_4 sna_16 sna_32))(setvar "OSMODE" sna_all); 選択された [snap] を合計; システム変数 [OSMODE] を設定(setq sna_1 nil sna_2 nil sna_4 nil sna_16 nil sna_32 nil sna_all nil)(setvar "cmdecho" 1); 変数を <nil> にセット

; プロンプトとユーザー入力のエコーバックを表示

);end
番号
①
②
③
④
⑤

Step2 －ダイアログのリストから付加する文字を選択して、[Ok] ボタンを押します。
下図では、左上の電球を選択しています。

説 明dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。

これだけで、ブロック以外の図形にもユーザー独自の情報を付加できます。

dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
toggle_button が選択される度に、内部サブ関数 (S_Toggle_Val) を起動します。
"snap_all" が選択された時は、内部サブ関数 (snap_all_sel) を起動します。
"snap_clear" が選択された時は、内部サブ関数 (snap_all_clear) を起動します。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。
ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (snap_val) を起動し、ダイアログを終了します。
選択された toggle_button の値を整数に変換して変数にセットします。値は OSNAP のコードと同じです。

⑥

例えば、[中心 ] の OSNAP コードは <4> ですから、"snap_4" がチェックされたときは、変数 [sna-4] に <4> をセッ

⑦
⑧
⑨
⑩
⑪

トしています。
[ すべて選択 ] ボタンが押された時は、すべての toggle_button の値に <"1"> をセットします。
内部サブ関数 (S_Toggle_Val) で再計算して、総合計の値を計算します。
[ すべてクリア ] ボタンが押された時は、すべての toggle_button の値に <"0"> をセットします。
内部サブ関数 (S_Toggle_Val) で再計算して、総合計の値を計算します。
最終的な OSNAP の合計値を計算して、システム変数 [OSMODE] で O スナップ モードを再設定します。

2-121

タイルをコントロール

11

ユーザー独自の O スナップ機能を作成する

Xdata を付加する

2-122

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

Step3 －次の AutoLISP を使って、実際に拡張データ (Xdata) が付加されていることを確認します。
(defun c:get_xdata ( / ent ent1 en en1 en2 en3 xdata1 xdata2 xdata3)(setq ent (car (entsel "¥n 図形を選択："))) ; 拡張データが付加された図形を選択し、その図形情報を取得します。
(if (/= ent nil) ; 実際に選択された時（図形情報が存在するとき）、以下を実行します。
(progn; アプリケーション名 "MyApp" を含むデータを取得します。

(setq ent1 (entget ent '("MyApp")))

S_Popup2 :dialog{
label = "XDATA 付加 ";:row/* タイルを横並びに配置スタート */{:list_box;((-1 . < 図形名 : 7ef09b28>) (0 . "INSERT") (330 . < 図形名 : 7ef04cf8>) (5 . "6A5") (100 . "AcDbEntity") (67 . 0) (410 . "Model")/* リストタイル配置スタート */{;(8 ." 電球 ") (62 . 7) (380 . 2) (100 . "AcDbBlockReference") (66 . 1) (2 . " 電球 ") (10 1179.85 1018.6 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0);(50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) (-3 ("MyApp" (1000 . "B 社 ") (1000 . "2020 年 ") (1000 . " 令和 6 年 ")))

label = " 製造会社 ";(setq en (cdr (assoc -3 ent1))); アプリケーション名が "MyApp" の Xdata だけを抽出します。

key = "list1";;(("MyApp" (1000 . "B 社 ") (1000 . "2020 年 ") (1000 . " 令和 6 年 ")) が取得できます。

width = 20;(if (/= en nil)height = 15;(progn;("MyApp" (1000 . "B 社 ") (1000 . "2020 年 ") (1000 . " 令和 6 年 ")) が取得できます。

(setq en1 (cdr enl)) ;"MyAPP" の次から最後までを取得します。

}/* リストタイル配置終了 */:column /* タイルを縦並びに配置スタート */{:popup_list /* Popup リストタイル配置スタート */;((1000 . "B 社 ") (1000 . "2020 年 ") (1000 . " 令和 6 年 ")) が取得できます。

{(setq xdata1 (cdr (assoc 1000 en1))) ; グループコードが <1000> のドット・ペア（1000 . "B 社 "）から

label = " 設置年 ";;2 番目の項目を取り出します。"B 社 " が取得できます。

key = "list2";(setq en2 (cdr en1)) ;(1000 . "B 社 ") を省いた 2 番目以降を取り出します。

width = 15;;((1000 . "2020 年 ") (1000 . " 令和 6 年 ")) が取得できます。

value = 0;

(setq xdata2 (cdr (assoc 1000 en2))) ; グループコードが <1000> のドット・ペア（1000 . "2020 年 "）}; から 2 番目の項目を取り出します。"2020 年 " が取得できます。

/* Popup リストタイル配置終了 */:popup_list /* Popup リストタイル配置スタート */(setq en3 (cdr en2)) ;(1000 . "2020 年 ") を省いた 2 番目以降（残り）を取り出します。

{;((1000 . " 令和 6 年 ")) が取得できます。

label = " 更新年 ";(setq xdata3 (cdr (assoc 1000 en3))) ; グループコードが <1000> のドット・ペア（1000 . " 令和 6 年 "）key = "list3";; から 2 番目の項目を取り出します。" 令和 6 年 " が取得できます。

width = 15;(print xdata1) ;xdata1<"B 社 "> をコマンドラインに改行して表示します。

value = 0;

(print xdata2) ;xdata2<"2020 年 "> をコマンドラインに改行して表示します。

}(print xdata3) ;xdata3<" 令和 6 年 "> をコマンドラインに改行して表示します。

}});prog);if/* Popup リストタイル配置終了 */spacer;);prog);if

タイルをコントロール(setq enl (car en)) ;2 重の括弧 (( )) になっているので、外側の括弧 ( ) を外します。(car 関数で可能 )タイルをコントロール

S_Popup2.dcl

使用するダイアログ/* タイルを縦並びに配置終了 *//* タイルを横並びに配置終了 *//* OK or CANCEL */(princ)spacer;);end

ok_cancel;}//end2-123

Xdata を付加する

Xdata を付加する

2-124

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_Popup2.lsp

使用する LISP

7(defun C:S_Popup2( / list1_data list2_data list3_data sel_list1 sel_list2 sel_list3);<<List1 のリストを作成 >>; 内部サブ関数 (SaveTileVal) を実行して終了(action_tile "cancel" "(done_dialog 0)")

; 何も処理しないで閉じる;<< ダイアログを終了する準備 >>8(setq list1_data (list "A 社 " "B 社 " "C 社 " "D 社 " "E 社 "))(action_tile "accept" "(SaveTileVal)(done_dialog 1)")

(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する;List2 のリストを作成

1

各リストに流し込(setq list2_data (list "2018 年 " "2019 年 " "2020 年 "))→むデータを予めリ;List3 のリストを作成

スト化しておく→］ダイアログの入力と終了;chkdia には、done_dialog の status( 値 ) が入っています。[Ok] は <1>、[Cancel] は <0> です。

(if(= chkdia 1)(S_Popup2_1))

9;[Ok] ボタンが押された時の処理(setq list3_data (list " 令和 3 年 " " 令和 4 年 " " 令和 5 年 "		(princ)" 令和 6 年 " " 令和 7 年 ")));end;<< 各 List の選択した番号をセット ( 一番上が <"0"> になります）>>2

3(setq sel_list1(nth (atoi(get_tile "list1")) list1_data)); 選択した項目の番号リストの中の選択し(setq sel_list2(nth (atoi(get_tile "list2")) list2_data)); 選択した項目の番号→た番号を取得し、整(setq sel_list3(nth (atoi(get_tile "list3")) list3_data)); 選択した項目の番号

タイルをコントロール;<< 拡張エンティティとして情報を付加する >>数に変換する(setq ent1 (car (entsel "¥n 図形を選択："))) ; 図形を選択して、図形名を取得する)(if (/= ent1 nil) ; もし図形が選択されていれば、以下を実行する;<< ダイアログを使用する準備 >>(progn(setq dcl_id (load_dialog "S_Popup2.dcl"));DCL をメモリーに読み込む(new_dialog "S_Popup2" dcl_id);S_Popup2 ダイアログを初期化する］(regapp "MyApp") ; 使用するアプリケーション名を付加する

ダイアログの読み→;sel_list1、sel_list2、sel_list3 の文字をそれぞれ 1000 でドット・ペアを作成する

込みと表示;<<list1 に list1_data を流し込む >>4(defun S_Popup2_1()

10(start_list "list1" 3); リスト "list1" を新規でスタート(mapcar 'add_list list1_data); リスト "list1" 内に <lst1_data> の内容を流し込む → 成した <list1_data>(end_list); "list1" へのリスト追加を終了

Point!

(setq old_xdata (list (list -3 (list "MyApp" (cons 1000 sel_list1)(cons 1000 sel_list2) (cons 1000 sel_list3)))))"list1" 内に、予め作(setq ent2 (entget ent1)) ; 図形名 ent1 のリスト形式の定義データを取得するを流し込む(setq new_xdata (append ent2 old_xdata)) ;3 つの Xdata を追加する(entmod new_xdata) ; 図形情報を再定義する;<<list2 に list2_data を流し込む >>5(start_list "list2" 3); リスト "list2" を新規でスタート(mapcar 'add_list list2_data); リスト "list2" 内に <lst2_data> の内容を流し込む → 成した <list2_data>(end_list); "list2" へのリスト追加を終了

を流し込む; リスト "list3" を新規でスタート(mapcar 'add_list list3_data); リスト "list3" 内に <lst3_data> の内容を流し込む → 成した <list3_data>

Point!
2);if(princ));end(start_list "list3" 3)(end_list));progn"list2" 内に、予め作;<<list3 に list3_data を流し込む >>6

タイルをコントロール

Point!

;<< 外部サブ関数 >>(defun SaveTileVal(); "list3" へのリスト追加を終了"list3" 内に、予め作

Point!

を流し込む(nth (atoi(get_tile "list1")) list1_data)

10(list (list -3 (list "MyApp" (cons 1000 sel_list1))))
拡張データ (Xdata) は 1 つ以上のグループから構成されていて、アプリケーション名で始まります。（本プログラムでは、"MyApp"）"list1" 内のリストの項目が選択された時は、その項目の番号が文字で取得されます。

この拡張データの始まりは、コード <-3> で示されます。<-3> に続いて、アプリケーション

例えば、上から 2 番目が選択された時は、<"3"> がセットされます。

名と付加するデータを list 関数で選択した図形の定義リストに連結します。

（番号は <"0"> 番から始まります。）

2-125

nth 関数は、リストの何番目（整数）の項目を取得するか・・ですから、この文字 <"3"> を付加するデータが文字の場合のドット・ペアは <1000> です。

整数に変換する必要があります。(atoi "3")

ドット・ペアを作成する cons 関数を使って、(cons 1000 " 会社 A") のように記述します。

その番号に符合するリスト内の文字を取得して、変数 [sel_list1] にセットしています。

" 会社 A" が変数になっている場合は、(cons 1000 sel_list1) になります。

Xdata を付加する

Xdata を付加する

2-126

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

番号説 明① "list1" から "list3" に使用するリストを事前に作成します。
② リスト内で選択した番号を整数に変換して取得します。番号はリストの上から <0> から順にカウントします。
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
③
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
"list1" 内に [list1_data] を流し込みます。mapcar は [list1_data] をリスト内に順番にリストとして追加していく④
関数です。[start_list] は [load_dialog] の後、[action_tile] の前に記述します。
④と同様に、[list2_data] を "list2" 内にリストとして流し込みます。[start_list] は [load_dialog] の後、[action_⑤
tile] の前に記述します。
④と同様に、[list3_data] を "list3" 内にリストとして流し込みます。[start_list] は [load_dialog] の後、[action_⑥
tile] の前に記述します。
[OK] ボタンが押されると、内部サブ関数 (SaveTileVal) を起動して、フラッグ (status) として <1> を指定します。
⑦
この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
⑧

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑨⑩

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
status が <1> であれば、外部サブ関数 (S_Popup2_1) を起動します。<0> であれば何もせずに終了します。
外部サブ関数 (S_Popup2_1) を起動します。この時点で、前のダイアログに戻ることはできません。

第 11 節指定した画層に文字を記入する使用する LISP
S_Toggle2.lsp
使用する主な関数 tblnext、append、nth、mapcar
内部サブ関数(SaveTileVal)
外部サブ関数なし
使用する DCL
S_Toggle2.dcl使用するタイル
text、edit_box、toggle、popup_list
外部テキストなし
スライドファイル なし
このプログラムは、図面の中に挿入する文字の画層を自由に選択できるようにしたものです。
挿入する画層を切り替えることなく、文字を挿入できます。
Step1 － <S_Toggle2.lsp> を起動すると、下図のダイアログが表示されます。
ダイアログのトップに現在の画層名が表示されます。
このままの画層で良ければ、文字を書き入れた後、[ 記入 ] ボタンを押して文字を挿入します。
文字の位置はユーザーが指定します。
[ 記入する画層 ] をオフにして文字を挿入

現在画層 <0> に文字が挿入されました

Point!
Xdata を付加した直後であれば、キーボードから [!new_xdata] と入力すると下図のようにコマンドラインに情報が表示されます。
最後の (-3) 以下に拡張データ (Xdata) の内容が付加されていることが判ります。

タイルをコントロール

タイルをコントロール

Step2 － [ 記入する画層 ] をオンにすると、リストに画層一覧が表示されます。（左図）
この例では、挿入画層を < 外構 >、挿入文字を < 植木 > としています。
（右図）
画層 [ 外構 ] に文字が挿入されましたが、現在画層は [0] のままです。
（右下図）

2-127

Xdata を付加する

指定した画層に文字を記入する

2-128

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_Toggle2.dcl

使用するダイアログ/* OK or CANCEL */:row/* タイルを横並びに配置スタート */{S_Toggle2 :dialog

spacer;{key = "Title";label = "";:column: button

Point! （ラベルは LISP で記述）{
label = " 記入 ";/* タイルを縦並びに配置スタート */{is_default = true;

spacer;key = "accept";:rowwidth = 8;/* タイルを横並びに配置スタート */fixed_width = true;

{
}

:text
{
label = " 記入する文字 ";: button}{:edit_box /* 編集ボックス処理タイルスタート */label = "Cancel";{

is_cancel = true;

key = "text1";

key = "Cancel";width = 18;

width = 4;

value = "";fixed_width = true;}/* 編集ボックス処理タイル終了 */}}/* タイルを横並びに配置終了 */タイルをコントロール

タイルをコントロール}/* タイルを横並びに配置終了 */}//endspacer;:row/* タイルを横並びに配置スタート */{:togglePoint!

タイルのラベルはダイアログ側か AutoLISP 側で指定できます。
ダイアログで指定する

AutoLISP で指定する

key = chk1;

key = "Title";(setq c_layer (getvar "Clayer"))label = " 記入する画層 ";label = " 現在の画層は <0> です。";(setq c_layer1 (strcat " 現在の画層は <" c_layer "> です。")){(set_tile "Title" c_layer1)

value = "0";}:popup_list{
key = layer_sel;
width = 20;}}}/* タイルを横並びに配置終了 */タイトルが固定されてしまうので、実際の画層名

状況に応じて、適切なラベルを表現できます。

/* タイルを縦並びに配置終了 */と異なる場合もあります。

ラベルを固定化出来ない場合に有効です。

2-129

指定した画層に文字を記入する

指定した画層に文字を記入する

2-130

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール(action_tile "text1" "(setq text1 (get_tile ¥"text1¥"))")

8

S_Toggle2.lsp

使用する LISP;"text1" 内の文字を取得する;[OK] ボタンと [Cancel] ボタンの動作を記述する (done_dialog) の status をセット

(defun C:S_Toggle2( / layname laydata lst sel_layer dcl_id c_layer			9c_layer1 text1 chkdia pt1 takasa)(action_tile "accept" "(SaveTileVal)(done_dialog 1)")

; 内部サブ関数 (SaveTileVal) を実行して終了(action_tile "cancel" "(done_dialog 0)");status を <0> にセットして終了;<< ダイアログを終了する準備 >>;<< 画層のリストを作成 >>(setq layname (tblnext "LAYER" T)); 最初の画層を取得する(while layname; layname が nil を返すまで繰り返す(setq laydata (cdr (assoc 2 layname))); layname の画層名を取得する(setq lst (append lst (list laydata))); 取得した画層名をリストにする(setq layname (tblnext "LAYER"))); 次の画層を取得 ( 無ければ nil を返す )(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する

Point!
3

る画層のリ→;<<[OK] ボタンが押された時の分岐処理 >>

ストを作成
する

;S_Toggle2.dcl をメモリーに読み込む(new_dialog "S_Toggle2" dcl_id);S_Toggle2 ダイアログを初期化する(if(= chkdia 1)

11(if sel_layer

タイルをコントロール

5

の読み込み
と表示

(mapcar 'add_list lst)

; リスト "layer_sel" 内に <lst> の内容を流し込む

→作成した
し込む

(action_tile "chk1" "(mode_tile ¥"layer_sel¥" (- 1 (atoi (get_tile ¥"chk1¥"))))"); 文字の大きさを指定させる;[ ダイナミック文字記入 ] で選択した文字を挿入する; 画層を現在層に戻す; 画層名が指定されないときの処理(setq pt1 (getpoint "¥n 挿入位置を指示：")); 文字の挿入位置を指定させる(setq takasa (getreal "¥n 文字の大きさ：")); 文字の大きさを指定させる(command "text" pt1 takasa "" text1);[ ダイナミック文字記入 ] で選択した文字を挿入);progn(defun SaveTileVal());if(setq sel_layer(nth (atoi(get_tile "layer_sel")) lst)) ; 選択されたリスト番号から画層名を取得

);if

)

(princ));end;<< タイトルに現在の画層名を表示する >>(setq c_layer (getvar "Clayer")); システム変数から現在画層名を取得(setq c_layer1 (strcat " 現在の画層は <" c_layer "> です。")); 文字列を連結する(set_tile "Title" c_layer1);"Title" に連結した文字列を表示する

Point!
3

Point!
5[ 記入する画層 ] の初期値は、チェックされていない <"0"> の状態なので、popup の "layer_sel" も非表示 <1> にしておきます。
値
0
1
2
3
4

2-131

(setq takasa (getreal "¥n 文字の大きさ："))(progn<list> を流;<<toggle の ON/OFF をチェックする >>; 文字の挿入位置を指定させる);progn内に、予め; "layer_sel" へのリスト追加を終了; 選択した画層に変更する(setq pt1 (getpoint "¥n 挿入位置を指示："))(command "-layer" "s" c_layer "");<< リスト内の選択された画層名を調べる >>7; 画層名が指定されたときの処理(command "text" pt1 takasa "" text1)"layer_sel"; リスト "layer_sel" を新規でスタート

6;[ 記入 ] ボタンが押された時の処理を以下に記述する(command "-layer" "s" sel_layer "")→］;"layer_sel"（画層の popup）を選択できない状態にしておく(start_list "layer_sel" 3)(end_list)
Point!

ダイアログ;<< 初期値として、画層名を非表示にしておく（チェックボックスで ON/OFF を切り替えるため）>>;<< リスト内に画層の一覧を流し込む >>4

了(progn(setq dcl_id (load_dialog "S_Toggle2.dcl"))(mode_tile "layer_sel" 1)

］

図面内にあ

;<< ダイアログを使用する準備 >>

2

ダイアログ

→の入力と終タイルをコントロール

110

mode_tile の mode のコード
説 明
タイルを使用可能にします。
タイルを使用禁止にします。
タイルにフォーカスを設定します。
編集ボックスの内容を選択します。
イメージのハイライト表示のオンとオフを切り替えます。

指定した画層に文字を記入する(action_tile "chk1" "(mode_tile ¥"layer_sel¥" (- 1 (atoi (get_tile ¥"chk1¥"))))")① (get_tile ¥"chk1¥")・・"chk1" の値は、"0" か "1" です。
② (atoi (get_tile ¥"chk1¥"))・・減算処理を行うために、整数に変換します。
③ (- 1 (atoi (get_tile ¥"chk1¥")))・・もし、"chk1" が "0" の時は、この中の値は <1> になります。
もし、"chk1" が "1" の時は、この中の値は <0> になります。
④ [ 記入する画層 ] がチェックされるたびに、"layer_sel" の mode は反転し、<On> と <Off> が切り替わります。
( 注）最初に [ 記入する画層 ] の "chk1" と "layer_sel" は両方とも <Off> の状態にしておかないと、逆の結果になってしまいます。

指定した画層に文字を記入する

2-132

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

番号

説

明

図面内にある画層名を収集します。
tblnext 関数で 1 番目の画層名を取得します。それが存在した時に <while> 以下を実行します。
① （tblnext 関数の使い方は、P2-143<Point!> を参考）
(cdr (assoc 2 layname)) で得た画層名を変数 <laydata> にセットします。
②
③
④
⑤
⑥
⑦
⑧
⑨

append 関数で、こうして得た画層名を追加してリストを作成します。
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
画層を表示する "layer_sel" の表示を開始時は非表示にしておきます。toggle_button と同期性を保つためです。
リスト内容の表示は、[start_list][add_list][end_list] の 3 つを記述します。
mapcar 関数で画層名を順番にリスト内に流し込んでいきます。
toggle_button の "chk1" が押される度に、"layer_sel" の表示 / 非表示を切り替えます。
選択されたリスト番号から、その番号に対応する画層名を取得します。
現在の画層名を取得し (getvar "Clayer")、その名をタイトルのラベル <Title> に代入します。
"text1" に記入された文字列を取得します。[ 記入 ] ボタンが押された時に、挿入される文字になります。
[OK] ボタンが押されると、内部サブ関数 (SaveTileVal) を起動して、フラッグ (status) として <1> を指定します。

第 12 節レイアウトページを選択する

使用する LISP
S_List1.lsp
使用する主な関数 nth、acad_strsort、mapcar
内部サブ関数(SaveTileVal)
外部サブ関数なし
使用する DCL
S_List1.dcl
使用するタイル
list_box
外部テキストなし
スライドファイル なし
このプログラムは、図面のレイアウトをダイアログから変更できるようにしたものです。
レイアウトの数が多い図面には便利です。
Step1 － <S_List1.lsp> を起動すると、右下図のダイアログが表示されます。
ダイアログには、図面にあるレイアウト名の一覧が表示されます。
選択するレイアウト名を選んで、[OK] ボタンを押します。

この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑩

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑪

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
フラッグ (status) が <1> であれば、if 以下を実行します。<0> であれば何もせずに終了します。

レイアウト [B 断面図 ] を選択します。

Point!
5

タイルの <On> と <Off> を反転させるには、下記の①と②の方法があります。
① (action_tile "chk1" "(mode_tile ¥"layer_sel¥" (- 1 (atoi (get_tile ¥"chk1¥"))))")

タイルをコントロール

タイルをコントロール

本プログラムで記述した方法です。減算処理により、popup_tile "layer_sel" の mode を反転しています。
② toggle_button "chk1" が <On> か <Off> された時の処理をサブ関数に記述する方法です。

現在は [ モデル空間 ] です。

;toggle "chk1" が変更された時、サブ関数 (chk_toggle) を起動する(action_tile "chk1" "(chk_toggle)"); サブ関数を以下に記述

Step2 －選択したレイアウトに移り、確認のためのレイアウト名が表示されます。

(defun chk_toggle();toggle_button "chk1" の値 <"0"> か <"1"> を整数に変換して変数 [chk] にセット
(setq chk (atoi (get_tile "chk1")))(if (= chk 1); もし、[chk] の値が <1> の時は、以下の処理を行う。

(mode_tile "layer_sel" 0);popup_tile "layer_sel" の mode を <0>（表示）にする(mode_tile "layer_sel" 1) ;<1> でなければ、"layer_sel" の mode を <1>（非表示）にする
);if
);end

[B 断面図 ] のレイアウトに移りました。

2-133

指定した画層に文字を記入する

レイアウトページを選択する

2-134

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_List1.dcl

使用するダイアログ(defun C:S_List1( / sel_layout)

S_List1 : dialog{;<< レイアウトがあるかどうかをチェックする。>>

label = " レイアウト選択 ";(if (setq layname(layoutlist))

Point!

/* タイルを縦並びに配置スタート */(progn{: boxed_column /* タイルを縦並びに配置スタート */(setq layname(acad_strlsort layname))1(new_dialog "S_List1" dcl_id): list_box

が有れば、
ダイアログ
に表示する

;S_List1 ダイアログを初期化する;<< リスト内にレイアウト名を流し込む >>label = " レイアウト :";key = "lay";multiple_select = false;2

Point!

width = 40;}(start_list "lay" 3); リスト "lay" を新規でスタート(mapcar 'add_list layname); リスト "lay" 内に <layname> の内容を流し込む(end_list); リスト "lay" へのリスト追加を終了"lay" 内に、

→

作成したリ
ストを流し
込む

(defun SaveTileVal()/* タイルを縦並びに配置終了 */(setq sel_layout(nth (atoi(get_tile "lay")) layname)) ; 選択されたリスト番号から

3/* タイルを縦並びに配置終了 */)/* OK or CANCEL */; レイアウト名を取得;[OK] ボタンと [Cancel] ボタンの動作を記述する (done_dialog) の status をセット

ok_cancel;}//end

タイルをコントロール

→

)

{

}

レイアウト

; レイアウト名を昇順で並び替える(setq dcl_id (load_dialog "S_List1.dcl")) ;S_List1.dcl をメモリーに読み込む{}; レイアウトが有れば、以下を実行する

4(action_tile "accept" "(SaveTileVal)(done_dialog 1)")

; 内部サブ関数 (SaveTileVal) を実行する(action_tile "cancel" "(done_dialog 0)");status を <0> にセットして終了;<< ダイアログを終了する準備 >>5

Point!

List_box の [multiple_select = false;] と popup_list
list_box の [multiple_select = false;] と popup_list はどちらも選択が 1 つしか出来ないことが共通です。
選択肢を 1 つに限るのは、[ 画層の切り替え ]、[ ビューの切り替え ] 等があります。
もし、複数の項目の選択を可能にしたい（ブロック挿入や(setq chkdia (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する

ダイアログ

］

→の入力と終了

Point!
1(setq layname(layoutlist))→ (layoutlist) は AutoCAD の組み込み関数です。レイアウト名を収集します。
コマンドラインから入力する場合は、(layoutlist) と ( ) 付きで入力します。
( 例）変数 layname には、("1 階詳細図 " "2 階詳細図 ") のような形でセットされます。

acad_strlsort→ (acad_strlsort< 文字列のリスト >) は AutoCAD の組み込み関数です。

外部からの画層名の取り込み）時は、[multiple_select = true;]< 文字列のリスト > を昇順で並び替えます。

と記述します。

（例）変数 layname が、("2 階詳細図 " "1 階詳細図 ") であれば、("1 階詳細図 " "2 階詳細図 ") に並び替えられます。
（例）(acad_strlsort (list "3" "2" "1")))2-135

レイアウトページを選択する→ ("1" "2" "3")レイアウトページを選択する

2-136

タイルをコントロール: column

S_List1.lsp

使用する LISP

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール;<<[OK] ボタンが押された時の分岐 >>6(if(= chkdia 1)(if sel_layout

第 13 節;[OK] ボタンが押された時の処理; もしレイアウト名が選択されていれば、以下を実行する(prognPoint!

(command "layout" "s" sel_layout); そのレイアウトに移動する(alert (strcat sel_layout " に移りました。")); メッセージを表示する);progn

指定した画層にブロックを挿入する

使用する LISPS_Popup1.lsp
使用する主な関数 tblnext、append、nth、mapcar
内部サブ関数(SaveTileVal)
外部サブ関数なし
使用する DCL
S_Popup1.dcl
使用するタイル
text、popup_list、list_box
外部テキストなし
スライドファイル なし
このプログラムは、図面の中に挿入するブロックの画層を自由に選択できるようにしたものです。
挿入する画層に切り替えることなく、ブロックを挿入できます。

);if

Step1 － <S_Popup1.lsp> を起動すると、右下図のダイアログが表示されます。

);if

起動した時点で、ダイアログのタイトルには現在画層が表示されます。

);progn

また、リスト内に図面の画層一覧とポップアップにブロックの一覧が表示されます。

);if(princ)

現在の画層名を);end表示します。

Point!

command "layout" "s" sel_layout)6

キーボードから <layout> と入力すると、以下のメッセージが表示されます。

レイアウトのオプションを入力 [ 複写 (C)/ 削除 (D)/ 新規作成 (N)/ テンプレート (T)/ 名前変更 (R)/
名前を付けて保存 (SA)/ 設定 (S)/ 一覧 (?)] < 設定 >:Step2 －現在の画層は <0> です。挿入するブロックを < 打ち合わせセット > を選択します。

タイルをコントロール

タイルをコントロール

コマンド : layout

挿入する画層に < 家具 > を選びます。

この中のオプション [ 設定 (S)] を使って、レイアウトの切り替えが出来ます。

番号

①
②
③
④

説 明
現在の図面内にレイアウトが有れば、dcl ファイルを読み込みます。(layoutlist) はレイアウト名を取得する関数です。
dcl ファイルには複数のダイアログを含めることができます。dcl ファイルの中のダイアログを初期化します。
指定したダイアログが無い場合、(exit) の処理も記述できます。
①で取得したレイアウト名のリストを "lay" 内に流し込みます。
リスト内で選択した番号を整数に変換して取得します。番号はリストの上から順に <0> からカウントします。

この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑤

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑥

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
status が <1> であれば、if 以下を実行します。<0> であれば何もせずに終了します。

2-137

Step3 －ブロックは画層 < 家具 > に挿入されましたが、現在画層は <0> のままです。

その番号に相応したレイアウト名を変数 <sel_layout> にセットします。
[OK] ボタンが押されると、内部サブ関数 (SaveTileVal) を起動して、フラッグ (status) として <1> を指定します。

レイアウトページを選択する

指定した画層にブロックを挿入する

2-138

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

S_Popup1.dcl

使用するダイアログ
S_Popup1 : dialog(defun C:S_Popup1( / blkname blkdata blklst layname laydata laylst sel_block{sellayer dcl_id c_layer c_layer1 chkdia pt1)

key = "title";;<< ブロック図形のリストを作成 >>label = "";Point!

spacer;/* タイルを縦並びに配置スタート */{; 最初のブロック名を取得する(while blkname; blkname が nil を返すまで繰り返す

1

fixed_width = true;: row(setq blkname (tblnext "BLOCK" T))/* タイルを横並びに配置スタート */{label = " 挿入するブロック：";
key = "text1";(setq blkname (tblnext "BLOCK")); 次のブロックを取得 ( 無ければ nil を返す ); 最初の画層名を取得する(while layname; layname が nil を返すまで繰り返す

fixed_width = true;

のリストを
作成する

図面内にあ

(setq laydata (cdr (assoc 2 layname))); layname の画層名を取得する(setq laylst (append laylst (list laydata))); 取得した画層名をリストにする(setq layname (tblnext "LAYER")); 次の画層を取得する ( 無ければ nil を返す )

る画層のリ

→

ストを作成
する

)

spacer;;<< リスト内の選択されたブロック名と画層名を調べる >>}(defun SaveTileVal(): popup_list

タイルをコントロール; 取得したブロック名をリストにする(setq layname (tblnext "LAYER" T))2

width = 10;

3{(setq sel_block(nth (atoi(get_tile "block_sel")) blklst)) ; リスト番号からブロック名を取得(setq sel_layer(nth (atoi(get_tile "layer_sel")) laylst))

key = "block_sel";; リスト番号から画層名を取得)

width = 15;;<< ダイアログを使用する準備 >>fixed_width = true;}4/* タイルを横並びに配置終了 */(setq dcl_id (load_dialog "S_Popup1.dcl"));S_Popup1.dcl をメモリーに読み込む(new_dialog "S_Popup1" dcl_id);S_Popup1 ダイアログを表示する

ダイアログ

→
］

の読み込み
と表示

;<< タイトルを表示する（現在の画層）>>

spacer;

現在の画層(setq c_layer (getvar "Clayer")): list_box(setq c_layer1 (strcat " 現在の画層は <" c_layer "> です。"))

5{(set_tile "title" c_layer1)

挿入する画層を選択：";

key = "layer_sel";

Point!

multiple_select = false;1

width = 42;

→

名をダイア
ログのラベ
ルに記述

(setq blkname (tblnext "BLOCK" T))
最初に取得したブロックが以下であるとすると、（変数名は blkname）

fixed_width = true;((0 . "BLOCK") (2 . "_Origin") (70 . 0) (4 . "") (10 0.0 0.0 0.0) (-2 . < 図形名 : 7ef04e38>))}}(setq blklst (append blklst (list blkdata)))

るブロック

→

;<< 画層のリストを作成 >>: textlabel = "; blkname のブロック名を取得する

)

{

}

図面内にあ

(setq blkdata (cdr (assoc 2 blkname)))

これからブロック名を取得します。

(setq blkdata (cdr (assoc 2 blkname)))/* タイルを縦並びに配置終了 */spacer;

まず、最初のブロック名をリストにします。
(setq blklst (append blklst (list blkdata))

ok_cancel;→ ("_Origin")

次のブロック名が存在すれば、リストへの追加を繰り返します。

}//end2-139→ "_Origin"

指定した画層にブロックを挿入する

指定した画層にブロックを挿入する

2-140

タイルをコントロール: column

S_Popup1.lsp

使用する LISP

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール

6(start_list "block_sel" 3); リスト "block_sel" を新規でスタート(mapcar 'add_list blklst); リスト "block_sel" 内に <blklst> の内容を流し込む(end_list); "block_sel" へのリスト追加を終了"block_sel"7; リスト "layer_sel" を新規でスタート(mapcar 'add_list laylst); リスト "layer_sel" 内に <laylst> の内容を流し込む(end_list); "layer_sel" へのリスト追加を終了"layer_sel"
内に、予め

→作成した
<laylst> を流し込む;[OK] ボタンと [Cancel] ボタンの動作を記述する (done_dialog) の status をセット

8

(action_tile "accept" "(SaveTileVal)(done_dialog 1)")

; 内部サブ関数 (SaveTileVal) を実行する(action_tile "cancel" "(done_dialog 0)");status を <0> にセットして終了;<< ダイアログを終了する準備 >>9; ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する(if(= chkdia 1)(if sel_block］了;[OK] ボタンが押された時の処理を以下に記述する; ブロックが選択された時の処理(progn(command "-layer" "s" sel_layer ""); 選択した画層に変更する

タイルをコントロール(setq pt1 (getpoint "¥n 挿入位置を指示："))Point!

(command "-insert" sel_block pt1 "" "" "")(command "-layer" "s" c_layer ""); ブロックの挿入位置を指定させる; ブロックを挿入する; 画層を現在層に戻す);progn④⑤⑥⑧

tblnext 関数で 1 番目のブロックを取得します。それが存在した時に <while> 以下を実行します。
(cdr (assoc 2 blkname)) で得たブロック名を変数 <blkdata> にセットします。
append 関数で、こうして得たブロック名を追加してリストを作成します。
①と同様にして、画層名のリストを作成します。
blklst の中の選択された番号に相応するブロック名を変数 <sel_block> にセットします。

Point!

同様に、laylst の中の選択された番号に相応する画層名を変数 <sel_layer> にセットします。
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
現在の画層名を取得し (getvar "Clayer")、その名をタイトルのラベルに代入します。
リスト内容の表示は、[start_list][add_list][end_list] の 3 つを記述します。
mapcar 関数でリスト名を順番にリスト内に流し込んでいきます。
⑥と同様に、リスト内容の表示は、[start_list][add_list][end_list] の 3 つを記述します。
mapcar 関数でリスト名を順番にリスト内に流し込んでいきます。
[OK] ボタンが押されると、内部サブ関数 (SaveTileVal) を起動して、フラッグ (status) として <1> を指定します。
この数値はユーザーが指定できます。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑨

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑩

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
status が <1> であれば、if 以下を実行します。<0> であれば何もせずに終了します。

Point!
tblnext 関数は、繰り返えされるたびに指定したリスト（テーブル）内の次の項目を取得します。引数の値が真（T）であれば、リスト（テーブル）の最初に戻り、次の最初の項目が取得されます。
・リスト（テーブル）に使用できる文字列は、"LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK"、"UCS"、"APPID"、"DIMSTYLE"、"VPORT" があります。
・これによって取得できる値（返り値）は、DXF 形式のコードとドット・ペアのリストです。

①コマンド : (setq layname (tblnext "LAYER" T))
返り値 → ((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous")));if(princ)

この返り値の意味は次の通りです。

);end

10

明

2 キーボードから入力する場合は、以下のように入力します。

);ifPoint!

③→の入力と終;<<[OK] ボタンが押された時の分岐 >>
10

②

⑦
ダイアログ

(setq chkdia (start_dialog))①<blklst> を流し込む

説
図面内にあるブロックを収集します。

内に、予め

→作成した

;<< リスト内に画層の一覧を流し込む >>(start_list "layer_sel" 3)

番号

タイルをコントロール;<< リスト内にブロックの一覧を流し込む >>(0 . "LAYER")→

シンボルタイプ(2 . "0")→画層名(70 . 0)→

標準フラグ（<1> フリーズ解除、<2> フリーズ状態、<3> ロック状態）(62 . 7)→

色番号（<7> は白または黒）(6 . "Continuous") →線種名（<"Continuous"> は実線）

(command "-insert" sel_block pt1 "" "" "")続けて、キーボードから以下のように入力します。

[- insert] と入力すると、コマンドラインには以下のように表示されます。

②コマンド : (setq laydata (cdr (assoc 2 layname)))・ブロック名を入力 または [ 一覧 (?)]:→ 変数 [sel_block] の値をセットします。

返り値 → "0" が取得できます。

・挿入位置を指定 または [ 基点 (B)/ 尺度 (S)/X/Y/Z/ 回転 (R)]: → pt1 の座標をセットします。
・X 方向の尺度を入力するか対角コーナーを指定 または [ コーナー (C)/XYZ(XYZ)] <1>:
→ <"">（空打ち）で既定値を受け入れます。

2-141

・Y 方向の尺度を入力 <X 方向の尺度を使用 >:→ <"">（空打ち）で既定値を受け入れます。

・回転角度を指定 <0>:

→ <"">（空打ち）で既定値を受け入れます。

指定した画層にブロックを挿入する

続けて、キーボードから以下のように入力してリストを作成します。
③コマンド : (setq laylst (append laylst (list laydata)))
返り値 → ("0") が返ります。
これを繰り返して、画層名のリストを作っていきます。("0" "CB" " 外構 " " 家具 "・・)

指定した画層にブロックを挿入する

2-142

第 3 章－タイルをコントロール

第 14 節

第 3 章－タイルをコントロール

S_List3.dcl

使用するダイアログ

外部の画層ファイルを読み込み、必要な画層だけ取り込む

使用する LISP
S_List3.lsp
使用する主な関数 open、read_line、list、append
内部サブ関数なし
外部サブ関数(S_List3_1)
使用する DCL
S_List3.dcl使用するタイル
list_box
外部テキスト
out_layer.txt
スライドファイル なし
このプログラムでは、図面の中に画層名を記述したテキストファイルから必要な画層だけを取り入

S_List3 : dialog

れることができます。何種類も作成しておけば、画層名の変更や追加が楽になります。

{{
label = " 複数の画層選択 ";: column/* タイルを縦並びに配置スタート */: boxed_column /* タイルを縦並びに配置スタート */Step1 － <S_List3.lsp> を起動すると、左下図のダイアログが表示されます。

{

起動した時点で、ダイアログのリスト内には画層名の一覧が表示されます。（左図）: list_box

この画層名一覧のテキストファイルは、事前に作成しておきます。（右図）{

外部のテキストファイルから画層名を取り込む方法は、P1-190 参照

key = "layer_sel";label = " 画層一覧 :";Point!

multiple_select = true;
width = 40;}}}/* タイルを縦並びに配置終了 *//* タイルを縦並びに配置終了 *//* OK or CANCEL */ok_cancel;}//end右の [ 画層プロパティ管理 ] には、画層は <0> しかありません。

Point!

multiple_select = true;[multiple_select=true;] を設定すると、複数の項目を取得できます。一度に複数の項目を取得するケースとしては、外部ファイルから画層を複数取り込んだり、複数のブロック
図形を挿入する場合です。

Step3 － [OK] ボタンを押すと、< 画層を取り込みました。> のメッセージが表示されます。（左図）
右の [ 画層プロパティ管理 ] には、選択した画層名が追加されています。

取り込んだデータは、左図の画層の例では (" 外構 " " 躯体 "" 車 " " 植栽 ") ですが、リストのデータとしては (" 1 4 5 8")となっています。
これから、1 つずつ取り出してリスト番号に対応する画層名のリストに再構築します。
結果として、(" 外構 " " 躯体 " " 車 " " 植栽 ") のリストになりますから、それから 1 つずつ取り出して画層を追加してい
きます。

2-143

外部の画層ファイルを読み込み、必要な画層だけ取り込む

外部の画層ファイルを読み込み、必要な画層だけ取り込む

2-144

タイルをコントロール

タイルをコントロール

Step2 －画層名のリストから、必要とする画層名を選択します。（左図）

第 3 章－タイルをコントロール

第 3 章－タイルをコントロール(defun S_List3_1( / count item retlist2 i layname)8

S_List3.lsp

使用する LISP(setq count 1)
Point!

(defun C:S_List3( / in_layer layer_name lst dcl_id i add_layer)(while (setq item (read readlist)) ; 選択したリスト (readlist) の最初の項目を読み込む(setq retlist2(append retList2 (list (nth item lst)))) ; 読み込んだ項目のリスト番号に相応する画層名を;<< ファイルを読み込みモードで開く >>; テキストファイルを読み込む(while(setq layer_name (read-line in_layer));1 行目を読み込む(and(setq lst (LIST layer_name));1 行目をリストにする(while (/= layer_name nil)

; 画層名が無くなるまで続ける(setq layer_name (read-line in_layer))(setq lst (append lst (LIST layer_name)));1 行ずつ読み込む(/= " " (substr readlist count 1))

テキストファイル
込み、リストを作)成します。

(setq count (1+ count)) ; カウントを 1 つ増やして、次の文字を検査する（空白にぶつかるまで）))(close in_layer)(setq readlist (substr readlist count)) ; 空白が有れば、それ以降の文字列だけを readlist に入れ直して; テキスト ファイルを閉じる);<< ダイアログを使用する準備 >>2;S_List3.dcl をメモリーに読み込む(new_dialog "S_List3" dcl_id);S_List3 ダイアログを初期化する(setq i 0)］

ダイアログの読み

→

込みと表示

9

(setq layname (nth i retlist2)) ;retlist2 の 1 番目を取り出す

Point!

(while (/= layname nil) ; 最後まで (nil になるまで）、以下を繰り返す(command "-LAYER" "n" layname "") ; 画層を新規作成する;<< リスト内に画層名を流し込む >>(start_list "layer_sel" 3)(setq i (1+ i)) ; カウント ( i ) を 1 加える; リスト "layer_sel" を新規でスタート(setq layname (nth i retlist2)) ; 次の画層名を取り出す;;<<lst から 1 つずつ取り出してリストに追加 >>タイルをコントロール(setq i 0))

; カウントの初期値を <0> にセット

(while (/= (nth i lst) nil)

作成したリストを順; リストが空になるまで繰り返す(setq add_layer (nth i lst)); 取り出した画層名をリストに追加(add_list add_layer); "layer_sel" 内に <lst> の内容を流し込む(setq i (+ i 1)); カウントを <1> プラスして、繰り返す(end_list); "layer_sel" へのリスト追加を終了→

し込みます。

Point!
8"(setq readlist (get_tile ¥"layer_sel¥"))")"layer_sel" が操作; リストから選択した画層名の→されたときの処理を記述します。

; リスト番号を取得;<< ダイアログを終了する準備 >>67(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する(if(= (getvar "DIASTAT") 1) (S_List3_1))→］

ダイアログの入力と終了;[Ok] ボタンが押された時の処理（外部サブ関数を起動する）("CB" " 外構 " " 家具 " " 記号 " " 躯体 " " 車 " " 作図枠 " " 仕上線 " " 植栽 " " 設備 " " その他・外形 " " タイトル "(setq item (read readlist))→ item には readlist<"1 4 5 8"> の最初の <1> が入ります。（" 外構 " " 躯体 " " 車 " " 植栽 " を選択した場合 )（read 関数は、数字の文字を自動的に整数に変換しますから、item には整数値が入ります。）(append retList2 (list (nth item lst))→ retList2 には lst の上から 2 番目の " 外構 " が入ります。これをリスト (" 外構 ") にします。

(and (/= " " (substr readlist count 1))(/= "" (substr readlist count 1)))
→ 1 文字ずつ取得し、その文字が半角の空白 <" ">、且つ空白 <""> で無ければ、カウントを 1 つ増やして次を検索。
list_tile の値は先頭にスペース（半角の空白 <" ">）を含んでいることがあるので、それをチェックしています。

(setq readlist (substr readlist count))→空白にぶつかれば、それ以降を再度 readlist にセットして、最初に戻ります。
2 回目が終わると、retList2 には (" 外構 " " 躯体 ") となっています。

(princ)
);end

2-145

前ページで取得した lst の内容は、以下の通りです。
" 建具 " " 中心線 " " ハッチング " " 補助線 " " 目地 " " 文字・寸法 " nil)

; 空のリスト (retlist2) を予め作成する（選択した複数の画層名をリスト化するため）(action_tile "layer_sel"
5

);end

ストボックス内に流; <<"layer_sel" の値を受け取る >>(setq retlist2(list))(alert " 画層を取り込みました。")

番に取り出して、リ)

4; 上から 3 行目に戻り、nil になるまで繰り返す;<<retlist2 は (" 外構 " " 躯体 " " 車 " " 植栽 ") のようになっているので、順番に取り出して、画層を新規作成する >>(setq dcl_id (load_dialog "S_List3"))3; 半角の空白 (" ")< スペース > では無く(/= "" (substr readlist count 1)) ; 空白 ("") でもなければ。

から画層名を読み→; 順番にリストに追加していく; 取得し、リスト (retList2) に追加して行く

タイルをコントロール

1(setq in_layer (open "out_layer.txt" "r"))最後の nil になるまで繰り返された時の retList2 は、(" 外構 " " 躯体 " " 車 " " 植栽 ") となります。

外部の画層ファイルを読み込み、必要な画層だけ取り込む

外部の画層ファイルを読み込み、必要な画層だけ取り込む2-146

第 3 章－タイルをコントロール
Point!
9

前ページで取得した retlist2 の内容は、以下の通りです。
(" 外構 " " 躯体 " " 車 " " 植栽 ")(setq layname (nth i retlist2))→ layname には最初は <" 外構 "> が入ります。

(while (/= layname nil)
→ layname があるまで（nil が返されるまで）続けます。

(command "-LAYER" "n" layname "")→画層を新規作成 (new) します。最後は空打ち <""> が必要です。

(setq i (1+ i))

第 4 章 ダイアログをコントロールする
ダイアログから他のダイアログを起動したり、数値や文字列のやりとりが可能です。

→カウントを 1 プラスして、次の項目を取得します。

(setq layname (nth i retlist2))→ 2 番目の項目は、" 躯体 " です。最初に戻って、nil になるまで繰り返します。

第1節

ダイアログを一時的に隠す（オブジェクト情報を取得）<text_tile>

番号説 明
画層名のテキストファイルを 1 行ずつ順番に読み込んでいきます。(layer_name)

第2節

ダイアログを一時的に隠す（位置情報を取得）<text_tile>①

1 行目を読み込んでリストにします。(lst)第3節

別のプログラム（ダイアログ）を起動する <icon_image、text_tile>

第4節[Help] にコマンドを割り当てる <icon_image、text_tile>②

タイルをコントロール

この章では、複数のダイアログをコントロールする手法を解説します。

最後の行まで順番に読み込み、その都度リストに追加します。
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
①で取り込んだ画層名を 1 つずつリスト内に追加していきます。

③

リスト内容の表示は、[start_list][add_list][end_list] の 3 つを記述します。

④⑤

mapcar 関数でリスト名を順番にリスト内に流し込みます。
外部関数で使用するリスト <retlist2> を作成しておきます。最初は空です。
"layer_sel" の中の選択された項目の番号のリストを変数 <readlist> にセットします。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑥

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

⑦

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_List3_1) を起動し、ダイアログを終了します。
multiple_select で選択した項目は、1 つの文字列になっています。

⑧( 例） "(1 4 5 8)" → 画層名に変換して⑨

これを行うには、read 関数と append 関数を使い、上記のリストを作成します。
選択した画層名を 1 つずつ取り出して、新規画層を作成していきます。

2-147(" 外構 " " 躯体 " " 車 " " 植栽 ") に再リストします。

外部の画層ファイルを読み込み、必要な画層だけ取り込む第 4 章－ダイアログ をコントロール

第1節

第 4 章－ダイアログをコントロール

ダイアログを一時的に隠す（図形編）

線分を選択[ 挿入点 ] の名称が [ 線分始点 ] に変更されます。

円を選択[ 挿入点 ] の名称が [ 円の中心 ] に変更されます。

寸法を選択[ 挿入点 ] の名称は [ 挿入点 ] のままです。

文字を選択[ 挿入点 ] の名称は [ 挿入点 ] のままです。

使用する LISP
S_Pick1.lsp
使用する主な関数 while、if、progn、cond、entsel
内部サブ関数なし
外部サブ関数なし
使用する DCL
S_Pick1.dcl
使用するタイル
text_tile
外部テキストなし
スライドファイル なし
このプログラムでは、オブジェクト情報を続けて取得することができます。
一時的にダイアログは消えますが、オブジェクトを選択すると再度表示されます。
Step1 － <S_Pick1.lsp> を起動すると、下図のダイアログが表示されます。
ダイアログの作成時には、文字は表示されていませんが、（右図）
プログラムを起動すると、初期値として 3 行の文字列がセットされます。（左図）
起動時の画面

ダイアログの作成画面

Step2 － [ 選択 or 指示：] ボタンを押すと、ダイアログは画面から一時的に消えます。
オブジェクトを選択すると再表示され、選択したオブジェクトの情報を表示します。
3 番目の [ 挿入点：] の文字は、選択したオブジェクトによって変更されます。
ブロックの場合は [ 挿入座標 ]、線分の場合は [ 線分始点 ]、円の場合は [ 円の中心 ]、その他の場合は、[ 挿入点 ] の文字に変わります。

2-149[ 挿入点 ] の名称が [ 挿入座標 ] に変更されます。

ダイアログを一時的に隠す（図形編）

ダイアログをコントロール

ダイアログをコントロール

ブロックを選択

ダイアログを一時的に隠す（図形編）

2-150

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール

S_Pick1.dcl

使用するダイアログ
S_Pick1 : dialog {(defun c:S_Pick1 ( / dcl_id pic_next)

key = "xyz";;<< ダイアログを使用する準備 >>1label = " 図形情報 ";: column /* タイルを縦並びに配置スタート */{: text(setq dcl_id (load_dialog "S_Pick1.dcl"))text1(setq pic_next 2)

text2(setq entType "")

text3

2

;S_Pick1.dcl をメモリーに読み込む
3 つの tile に表示する
変数の初期値を空に→セット。

(setq entLayer "")status(pic_next) を(setq entIns ""){<2> にセット。

;<< 図形をピックする度にダイアログを表示する >>label = "";Point!

key = "text1";
width = 30;

3}(while ( = pic_next 2); 図形が選択された時の処理(if (null (new_dialog "S_Pick1" dcl_id)); ダイアログを初期化する(exit); ダイアログが見つからなければ終了);if: text;<<entType によって、「挿入点」の文字を変更する >>{(if (/= entType nil)
key = "text2";

status(pic_next) が→<2> であれば、"S_Pick1" ダイアログを表示する。

spacer;label = "";(progn図形が選択された時、(cond

線分であれば、" 線分始点：" の文字、円で

text1((= entType "LINE")(setq insertPt " 線分始点："))

}

text2

((= entType "CIRCLE")(setq insertPt " 円の中心："))→ブロックであれば、"

spacer;text3((= entType "INSERT")(setq insertPt " 挿入座標："))挿入座標："、その他( T

は " 挿入点：" の文字width = 30;

4: text{);condlabel = "";);prognkey = "text3";

);if

5

spacer;/* タイルを横並びに配置スタート */{Point!

(set_tile "text1" (strcat " 図形タイプ：" entType))"text1" ～ "text3" に選(set_tile "text2" (strcat " 画" entLayer))→ 択した図形のタイプご

層：とに文字をセット。

;[OK] ボタンと [Cancel] ボタンの動作を記述する (done_dialog) の status をセット

text1
text2

ok_only;:retirement_button

を変数 <insertPt> にセットする。

(set_tile "text3" (strcat insertPt entIns))/* タイルを縦並びに配置終了 */

:row

"))

6

text3

;status を <1> にセット

(action_tile "hide" "(done_dialog 2)");status を <2> にセット→］

ダイアログの入力と終了;<< ダイアログを終了する準備 >>7{(action_tile "accept" "(done_dialog 1)")

(setq pic_next (start_dialog)); ユーザー入力を受け付ける（入力がある度に、ダイアログを表示）

label = " 選択 or 指示：";key = "hide";}/* タイルを横並びに配置終了 */}}//end2-151

ダイアログを一時的に隠す（図形編）

ダイアログを一時的に隠す（図形編）

2-152

ダイアログをコントロール}}(setq insertPt " 挿 入 点：

あれば、" 円の中心："、;<< 選択した図形の情報を表示する >>width = 30;

ダイアログをコントロール

S_Pick1.lsp

使用する LISP

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール(cond((= pic_next 2);[hide] キーが押される度に、以下の処理を行う(setq ent1 (entsel "¥n 図形を選択 : "));[ 図形を選択：] の文字を表示して、図形を選択(setq entName (car ent1); 図形名を変数 [entName] にセット

8

第2節

ダイアログを一時的に隠す（座標編）

entList (entget entName); 図形名から図形情報を変数 [entList] にセット

entType (cdr (assoc 0 entList)); 図形情報から図形タイプを変数 [entType] にセット使用する LISP
S_Pick2.lsp
使用する主な関数 while、if、progn、cond、entsel
内部サブ関数なし
外部サブ関数なし
使用する DCL
S_Pick1.dcl
使用するタイル
text_tile
外部テキストなし
スライドファイル なし
このプログラムでは、図面内の位置情報を続けて取得することができます。一時的にダイアログは

entLayer (cdr (assoc 8 entList)); 図形情報から画層名を変数 [entLayer] にセット

消えますが、点座標を指示すると再度表示されます。

entXpt (rtos (nth 1 (assoc 10 entList)) 2 3)

;X 座標値を小数点以下第 3 位まで取得

entYpt (rtos (nth 2 (assoc 10 entList)) 2 3)

;Y 座標値を小数点以下第 3 位まで取得

entIns (strcat entXpt "," entYpt);X 座標値と Y 座標値を 1 つの文字列に連結);setq);pic_next

Step1 － <S_Pick2.lsp> を起動すると、下図のダイアログが表示されます。
S_Pick1.lsp で使用したダイアログを使用します。
（左図）
プログラムを起動すると、自動的にタイトルと 3 行の文字列が変更されます。
（右図）;[Ok] ボタンを押すまで、繰り返す。

);cond);while(unload_dialog dcl_id)9; ダイアログをメモリーから解放する(princ)
);end

番号
説 明
① dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
[pic_next] は⑥の [hide] ボタンを押したかどうかのフラッグ (status) です。<1> の時はダイアログは終了しま

③
④
⑤
⑥

ダイアログをコントロール⑦⑧⑨

すが、<2> の時は、ダイアログは一時的に隠れて図形を指示することが可能になります。
また、図形の結果を表示する文字列の初期値を空 <""> にセットしておきます。
図形が選択されるごとに、dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合は、図面内の位置を指示すると再表示され、指示した位置の座標 (XYZ) を表示します。
平面図では、Z 座標はたいてい <0> です。

このように (exit) で終了できます。
⑧で取得した図形名に従って、"text1" から "text3" に表示する文字列の準備をします。
"text1" から "text3" に取得した図形情報をセットします。
[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。
[OK] ボタンが押された時は、done_dialog に <1> をセットし、[ 選択 or 指示：] ボタンが押された時は、
done_dialog に <2> をセットします。
（<2> の時は、ダイアログは一時的に隠れます。）
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
⑥の数値 <2> が pic_next に代入されます。
選択した図形の情報を entsel 関数で取得します。この中の [entType] によって "text3" の文字列を変更します。
その他 [ 画層 ] や [ 始点の座標 ][ 円の中心座標 ][ 挿入位置の座標 ] が取得できます。
最後に、unload_dialog を呼び出して DCL ファイルをロード解除します。

Point!
3

立体図では、Z 座標には高度が入ります。

指定したダイアログが見つからなかったときの処理(while ( = pic_next 2)(if (null (new_dialog "S_Pick1" dcl_id)) ; 指定したダイアログが無い場合は、(exit); プログラムを終了します。

);if
上記のように、エラーが起きたときの回避処理 (exit) を記述しておくこともできます。

2-153

ダイアログを一時的に隠す（図形編）

ダイアログを一時的に隠す（座標編）

2-154

ダイアログをコントロール②

Step2 － [ 選択 or 指示：] ボタンを押すと、ダイアログは画面から一時的に消えます。

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール(defun c:S_Pick2 ( / dcl_id pic_next)

番号説 明① dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。
[pic_next] は⑥の [hide] キーを押したかどうかのフラッグ (status) です。<1> の時はダイアログは終了しますが、;<< ダイアログを使用する準備 >>1

2(setq dcl_id (load_dialog "S_Pick1.dcl"));S_Pick1.dcl をメモリーに読み込む(setq pick_next 2)

3 つの tile に表示する(setq ptx "")変数の初期値を空に→セット。

(setq pty "")status(pic_next) を(setq ptz "")<2> にセット。

②③④⑤;<< 座標をピックする度にダイアログを表示する >>⑥(while (= pick_next 2)
3

status(pic_next) が(if (null (new_dialog "S_Pick1" dcl_id))<2> であれば、→(exit)

を表示する。

); ダイアログのラベルを変更する

4

ダイアログのタイトル(set_tile "xyz" "XYZ 座標値 ")→に [XYZ 座標値 ] を指" ptx))(set_tile "text2" (strcat "Y 座標：" pty))→標値 ]、[Z 座標値 ] を(set_tile "text3" (strcat "Z 座標：" ptz))"text1" から "text3" にの [X 座標値 ]、[Y 座セットする。

(action_tile "accept" "(done_dialog 1)");status を <1> にセット

(action_tile "hide" "(done_dialog 2)");status を <2> にセット］

ダイアログの入力と終了(setq pic_next (start_dialog))

done_dialog に <2> をセットします。（<2> の時は、ダイアログは一時的に隠れます。）
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。
⑥の数値 <2> が pic_next に代入されます。
getpoint 関数で座標値を取得します。座標値には (X、Y、Z) の 3 つのリストから成り立っています。

⑧

X 座標を取り出し、十進法の小数点以下 4 位までを文字列に変換します。"text1" には文字列しかセットされ⑨ないからです。リストの 2 番目の Y 座標と、3 番目の Z 座標も同様に文字列に変換します。
最後に、unload_dialog を呼び出して DCL ファイルをロード解除します。

Point!
8

指示した座標値が (252.944 338.025 158.831) の場合(setq ptx (rtos (car pt1) 2 4))→ "252.9437" が取得できます。

・(car pt1) → 252.944
・(rtos 252.944 2 4) → "252.9437"(setq pty (rtos (cadr pt1) 2 4))→ "338.0254" が取得できます。

・(cadr pt1) → 338.025; ユーザー入力を受け付ける

・(rtos 338.025 2 4) → "338.0254"(setq ptz (rtos (caddr pt1) 2 4))(cond
Point!

[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。
[OK] ボタンが押された時は、done_dialog に <1> をセットし、[ 選択 or 指示：] ボタンが押された時は、→; 入力がある度に、ダイアログを表示する

7

このように (exit) で終了できます。
ダイアログのタイトルの文字を [XYZ 座標値 ] にセットします。
"text1" から "text3" に取得した座標値をセットします。

位置が指示されたとき(set_tile "text1" (strcat "X 座標：;[OK] ボタンと [Cancel] ボタンの動作を記述する (done_dialog) の status をセット

6

また、XYZ の座標値を表示する文字列の初期値を空 <""> にセットしておきます。
図形が選択されるごとに、dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合は、定する。

;text の名称を変更する

5⑦"S_Pick1" ダイアログ<2> の時は、ダイアログは一時的に隠れて座標を指示することが可能になります。

→ "158.831" が取得できます。

・(caddr pt1) → 158.831((= pic_next 2);[hide] キーが押される度に、以下の処理を行う

・(rtos 158.831 2 4) → "158.831"

ダイアログをコントロール

8(setq ptx (rtos (car pt1) 2 4)); 座標値の最初のリスト（X 座標）を小数点 4 桁まで取得(setq pty (rtos (cadr pt1) 2 4)); 座標値の 2 番目のリスト（Y 座標）を小数点 4 桁まで取得(setq ptz (rtos (caddr pt1) 2 4)); 座標値の 3 番目のリスト（Z 座標）を小数点 4 桁まで取得);what_next;[Ok] ボタンを押すまで、繰り返す。

ダイアログをコントロール(setq pt1 (getpoint "¥n 位置を指示 : ")) ; ユーザーに座標を指示するようメッセージを出す);cond);while9(unload_dialog dcl_id) ; ダイアログをメモリーから解放する(princ)
);end

2-155

ダイアログを一時的に隠す（座標編）

ダイアログを一時的に隠す（座標編）

2-156

第 4 章－ダイアログ をコントロール

第3節

第 4 章－ダイアログをコントロール

別のプログラム（ダイアログ）を起動する

使用する LISP
S_Edit3.lsp
使用する主な関数 if、progn、cond
内部サブ関数なし
外部サブ関数(cha)、(fil)使用する DCL
S_Edit3.dcl使用するタイル
icon_image、text_tile
外部テキストなし
スライドファイル S_Edit3-C、S_Edit3-F
このプログラムは、ダイアログの画像を指示して、それに関連したプログラムを起動するものです。
実行するプログラムを画像で選択することで、視覚的に判りやすくヒューマン エラーのリスクを減少させることができます。

Step3 － [ 面取り ] を選択すると、第 3 章第 5 節の [S_Edit2.lsp] が起動します。
ダイアログの仕組みや AutoLISP の内容は、その節をご参考ください。
このように、1 つのダイアログを他のプログラムを起動するプラットフォームのように利用することが出来ます。

[ 面取り ] を選択

Step1 － <S_Edit3.lsp> を起動すると、下図のダイアログが表示されます。
ダイアログには 2 つの画像しかありません。
画像を選択することによって、その画像に関連したプログラムが起動します。
起動時の画面[S_Edit2.lsp] を呼び出す

Step4 － [ フィレット ] を選択すると、[S_Edit3_F.lsp] が起動します。
このプログラムは、この節の後半で解説しています。
このように画像で操作を続ければ、コマンドラインに目を落とすことも無くなりますから、時間的にも精神的にも負担が軽減されます。
Step2 －左の画像を選択すると [ 面取り ] のコマンドに移ります。
右の画像を選択すると [ フィレット ] のコマンドに移ります。

[ フィレット ] を選択

ダイアログをコントロール

ダイアログをコントロール

確認のために、画像の下に文字でも表示しています。

[S_Edit3_F.lsp] を呼び出す[ 面取りが選択されました。] と表示します。

2-157[ フィレットが選択されました。] と表示します。

別のプログラムを起動する

別のプログラムを起動する

2-158

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール

S_Edit3.dcl

使用するダイアログ

S_Edit3.lsp

使用する LISP

S_Edit3 : dialog(defun c:S_Edit3( / dialog_box dcl_id){;<< ダイアログを使用する準備 >>label = " 面取り・フィレット選択 ";1:boxed_row /* タイルを横並びに配置スタート */;S_Edit3.dcl をメモリーに読み込む(new_dialog "S_Edit3" dcl_id);S_Edit3 ダイアログを初期化する→］

ダイアログの読み込みと表示;<< イメージを表示する範囲を指定 >>{label = "";(setq dcl_id (load_dialog "S_Edit3"))2:icon_image /* イメージ処理タイルスタート */(setq x1 0) (setq y1 0); スライドを表示する位置（原点は左上）(setq x2 (dimx_tile "image01"); スライドを表示する X の幅を指定する

y2 (dimy_tile "image01"); スライドを表示する Y の幅を指定する

スライドを表示する→"image01" の幅を指定しています。

){

X と Y の幅として;<< スライドを表示する準備 >>label = "";(start_image "image01");"image01" にスライドを読み込む

key = "image01";(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色(slide_image x1 y1 x2 y2 "S_Edit3-C"); スライド (S_Edit3-C) を表示(end_image); スライドの読み込みを終了

3

width = 30;
height =15;}

スライドを読み込み、背景色を指定して、→"S_Edit3-C" のスライドを指定します。

;<< スライドを表示する準備 >>/* イメージ処理タイル終了 */:icon_image /* イメージ処理タイルスタート */{4label = "";(start_image "image02");"image02" にスライドを読み込む(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色(slide_image x1 y1 x2 y2 "S_Edit3-F"); スライド (S_Edit3-F) を表示(end_image); スライドの読み込みを終了

スライドを読み込み、背景色を指定して、→"S_Edit3-F" のスライドを指定します。

key = "image02";
width = 30;;<< image01 処理 変数 check=1(check=1 は [ 面取り ]) >>height =15;

(action_tile "image01"}(strcat "(setq check 1)"/* イメージ処理タイル終了 */"(set_tile ¥"text1¥" ¥" 面取りが選択されました。¥")"

5}→"text1" に表示する文
字を指定します。

)/* タイルを横並びに配置終了 */check が <1> の時に:text;<< image02 処理 変数 check=2 (check=2 は [ フィレット ]) >>{(action_tile "image02"
label = "";(strcat "(setq check 2)"

key = "text1";"(set_tile ¥"text1¥" ¥" フィレットが選択されました。¥")"

6

width = 30;)

check が <2> の時に→"text1" に表示する文
字を指定します。

)}
spacer;

文字列にクォーテーションを含めなければならない場合は、/* OK or CANCEL */クォーテーションの前に円記号を付けます (¥")

ok_cancel;→ "(set_tile ¥"text1¥" ¥" フィレットが選択されました。¥")"}//end2-159

別のプログラムを起動する

別のプログラムを起動する

2-160

ダイアログをコントロール

ダイアログをコントロール)

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール;<< ダイアログを終了する準備 >>78(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する(if(= (getvar "DIASTAT") 1)→］

ダイアログの入力
と終了

番号
①
②

;[Ok] ボタンが押された時の処理を記述する(progn
(cond
9

どちらを選
; 外部サブ関数 (cha) を起動する( (= check 2) (fil) ); 外部サブ関数 (fil) を起動する(T; どちらでも無いときは、外部サブ関数 (cha) を起動する

よって、起

→

動する外部

④

"image01" の数値を指定しています。
イメージの表示は、[start_image][slide_image][end_image] の 3 つを記述します。
[fill_image] を指定した場合は、イメージの背景色を指定できます。（<-2> はその時点の AutoCAD の背景色と[fill_image] を指定した場合は、イメージの背景色を指定できます。（<-2> はその時点の AutoCAD の背景色と同じになります。）
image_tile "image01" が選択されると、プログラム分岐変数 check に <1> をセットします。

サブ関数を
指定する。

);conddcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
スライドファイルを表示する範囲（X と Y の座標値）を指定します。この場合は、縦横の幅を dcl で設定した同じになります。）③と同様に、イメージの表示は [start_image][slide_image][end_image] の 3 つを記述します。

択したかに( (= check 1) (cha) )(cha) )③

説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。

⑤);progncheck<1> は面取りのプログラムを指定します。
また "text1" に [ 面取りが選択されました ] の文字列をセットします。
image_tile "image02" が選択されると、プログラム分岐変数 check に <2> をセットします。

);if

⑥

check<2> はフィレットのプログラムを指定します。
また "text2" に [ フィレットが選択されました ] の文字列をセットします。
start_dialog を呼び出して、ユーザーが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

(princ)⑦);end

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。
ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。

;<< 外部サブ関数 >>(defun cha()⑧(load "S_Edit2");[S_Edit2.lsp] を読み込む(C:S_Edit2);[S_Edit2.lsp] を起動する⑨

もし [DIASTAT] が <1> であれば、cond 以下の関数 ([ 面取り ] と [ フィレット ] のどちらを起動するか）を実行して、ダイアログを終了します。
分岐変数 check が <1> の時は、外部サブ関数 (cha) を起動し、check が <2> の時は、外部サブ関数 (fil) を起
動します。

);end
(defun fil()(load "S_Edit3_F");[S_Edit3_F.lsp] を読み込む(C:S_Edit3_F);[S_Edit3_F.lsp] を起動する

使用する LISP
S_Edit3_F.lsp
使用する主な関数 atof、setvar、if、progn
内部サブ関数なし
外部サブ関数(S_Edit3_F_1)
使用する DCL
S_Edit3_F.dcl
使用するタイル
icon_image、edit_box
外部テキストなし
スライドファイル S_Edit3-F
このプログラムでは、フィレットの数値入力を画像で分かりやすくしたものです。

);end

単独でも使用出来ます。

Step1 － <S_Edit3_F.lsp> を起動すると、左下図のダイアログが表示されます。
S_Edit3_F.lsp

入力する箇所は 1 つですが、画像を見ながら仕上がり状態を予想できます。

ダイアログをコントロール

ダイアログをコントロール

S_Edit2.lsp

2-161

別のプログラムを起動する

別のプログラムを起動する

2-162

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール

S_Edit3_F.dcl

使用するダイアログ(defun c:S_Edit3_F( / dialog_box dcl_id)

S_Edit3_F : dialog;<< ダイアログを使用する準備 >>{1label = " フィレット ";:boxed_row /* タイルを横並びに配置スタート */label = "";2:icon_image /* イメージ処理タイルスタート */key = "image01";3width = 30;
height =15;/* イメージ処理タイル終了 */}/* タイルを横並びに配置終了 */:row/* タイルを横並びに配置スタート */{:edit_box /* 編集ボックス処理タイルスタート */;S_Edit3_F ダイアログを初期化する

ダイアログの読み込みと表示(setq x1 0) (setq y1 0); スライドを表示する位置（原点は左上）

スライドを表示する(setq x2 (dimx_tile "image01"); スライドを表示する X の幅を指定する

X と Y の幅として

y2 (dimy_tile "image01"); スライドを表示する Y の幅を指定する;"image01" にスライドを読み込む(fill_image x1 y1 x2 y2 -2); 背景色を現在の AutoCAD と同色(slide_image x1 y1 x2 y2 "S_Edit3-F"); スライド (S_Edit3-F) を表示(end_image); スライドの読み込みを終了;<< タイル の初期設定 >>4(set_tile "han" "")Point!
5→ "image01" の幅を指定しています。

スライドを読み込み、背景色を指定して、→"S_Edit3-F" のスライドを指定します。

;edit_box "han" に初期値 <""> をセットする;<< edit_box 処理 han の値を受け取る >>(action_tile "han" "(setq han1 (get_tile¥"han¥"))");edit_box "han" の値を変数 [han1] にセットする;<< ダイアログを終了する準備 >>6label = " 半径 ";(start_image "image01")

Point!

{
key = "han";(setq dialog-box (start_dialog)); ユーザー入力を受け付ける(unload_dialog dcl_id); ダイアログをメモリーから解放する→］

ダイアログの入力と終了;<< [OK] ボタンが押された時の処理 >>width = 6;

7

fixed_width = true;(if(= (getvar "DIASTAT") 1) (S_Edit3_F_1));[OK] ボタンが押されると、システム変数 [DIASTAT] に;<1> がセットされます。

/* 編集ボックス処理タイル終了 */spacer;(princ));end

Point!
4/* タイルを横並びに配置終了 */ダイアログをコントロール

value = "";ダイアログをコントロール(new_dialog "S_Edit3_F" dcl_id)→］;<< スライドを表示する準備 >>label = "";};S_Edit3_F.dcl をメモリーに読み込む

)

{

}

(setq dcl_id (load_dialog "S_Edit3_F"));<< イメージを表示する範囲を指定 >>{}S_Edit3_F.lsp

使用する LISP

タイルに初期値をセットする場合
edit_box の初期値を <""> にセットするには、(set_tile "han" "") としますがもし、具体的な数値を初期値にするときは以下のように記述します。
(if (or/* OK or CANCEL */( = han1 nil)
( = han1 "")ok_cancel;( = han1 " "))(setq han1 "200")}//end)(set_tile "han" han1)

2-163

別のプログラムを起動する

別のプログラムを起動する

2-164

第 4 章－ダイアログ をコントロール

第 4 章－ダイアログをコントロール①半径を入力せずに [OK] ボタンを押します。

(defun S_Edit3_F_1()(setq han1 (atof han1))(setvar "FILLETRAD" han1)(if (/= han1 nil)(action_tile "accept" "(CheckVal)");edit_box の [han1] は文字列なので、計算処理を行うために実数に変換する; フィレットの半径を指定するシステム変数 [FILLETRAD] に han1 の値をセット;[han1] に値があるときの処理を記述(progn(prompt "¥n1 本目の線分と 2 本目の線分を選択：")(command "FILLET"); メッセージを表示する;AutoCAD の "fillet" コマンドを実行する);progn② [ 半径が入力されていません。] のメッセージが表示されます。

);if(setq han1 nil)

; グローバル変数 [han1] の値を nil にセット

(alert "¥n 半径が入力されていません。"));end

Point!

タイルの値を取得せずに [OK] ボタンを押したとき

5(action_tile "han" "(setq han1 (get_tile¥"han¥"))")→ 変数 [han1] に値が入るのは、edit_box "han" を action したときだけです。
もし、action をせずに [OK] ボタンを押すと、プログラムは何もせずに終了するか、何かエラーメッ
セージを表示して終了します。しかし、その時点ではダイアログは閉じていますから、ユーザー③ [OK] ボタンを押すと元のダイアログに戻りますが、edit_box "han" にカーソルがフォーカスされ、入力状態になっています。

には何が原因か判りません。

(mode_tile "han" 2)
このようなトラブルを回避するために、[OK] ボタンを押した後、それぞれのタイルの数値が確実に取得できているかのチェックを行って終了することが望ましいと言えます。
S_Edit3_F.lsp の一部を以下のように変更します。
; 終了する前に、このチェック関数 (CheckVal) で検査して、問題がなければ、この関数の中で;(done_dialog 1) を記述します。
(defun CheckVal()(progn; 変数 [han1] に値が有れば、ダイアログを終了; 値が無ければ、以下を実行する(alert "¥n 半径が入力されていません。") ;alert 関数を起動して原因を表示する

番号(mode_tile "han" 2)①; カーソルのフォーカスを "han" にセットする);progn
);if

②

);end
;[OK] ボタンを押したときは、チェック関数を起動する。（ダイアログはチェック関数の中で閉じる。）(action_tile "accept" "(CheckVal)") ; チェック関数 (CheckVal) を実行する。終了しない。
(action_tile "cancel" "(done_dialog 0)") ; 何も処理しないで閉じる;<< ダイアログを終了する準備 >>(setq chkdia (start_dialog))

③
④

2-165

別のプログラムを起動する

数値を指定しています。
イメージの表示は、[start_image][slide_image][end_image] の 3 つを記述します。
[fill_image] を指定した場合は、イメージの背景色を指定できます。（<-2> はその時点の AutoCAD の背景色と同じになります。）
フィレットの半径を指定する "han1" の初期値に <"">(nil) をセットします。
[set_tile] は [load_dialog] の後、[action_tile] の前に記述します。
edit_box "han" の内容を変数 "han1" に代入します。（文字列なので、使用する時は実数に変換します。）
start_dialog を呼び出して、ユーザが入力できるよう、コントロールをダイアログ ボックスに切り替えます。

⑥

終了ボタンを選択したときに done_dialog を呼び出すアクションが起動され、start_dialog は値を返します。

;<<[OK] ボタンが押された時の分岐 >>(if(= chkdia 1)(S_Edit3_F_1)) ; 分岐変数 [check] が <1> の時の処理を以下に記述する

dcl ファイルの中のダイアログを初期化します。指定したダイアログが無い場合、(exit) の処理も記述できます。
スライドファイルを表示する範囲（X と Y の座標値）を指定します。縦横の幅を dcl で設定した "image01" の⑤; ユーザー入力を受け付ける(unload_dialog dcl_id) ; ダイアログをメモリーから解放する説 明
dcl ファイルを読み込みます。dcl ファイルには複数のダイアログを含めることができます。

⑦

ここで、unload_dialog を呼び出して DCL ファイルはロード解除されます。
[OK] ボタン <accept> が押された時は、システム変数 [DIASTAT] に <1> がセットされます。
もし [DIASTAT] が <1> であれば、外部サブ関数 (S_Edit3_F_1) を起動し、ダイアログを終了します。

別のプログラムを起動する

2-166

ダイアログをコントロール

ダイアログをコントロール

次ページで図解(if (/= han1 nil)(done_dialog 1)

第 4 章－ダイアログ をコントロール

第4節

第 4 章－ダイアログをコントロール[Help] にコマンドを割り当てる

使用する LISP
S_Edit4.lsp
使用する主な関数 getvar、atof、polar、ssadd、entget
内部サブ関数なし
外部関数
S_Toggle1.lsp
使用する DCL
S_Edit4.dcl使用するタイル
icon_image、edit_box
外部テキストなし
スライドファイル S_Edit1
このプログラムでは、AutoCAD の [help] ボタンの位置に、ユーザーが作成した関数を割り当てています。[help] ボタンは、このようにカスタマイズ可能です。

S_Edit4.dcl

使用するダイアログ

第 3 章 4 節の [S_Edit1.dcl] を利用し、OK ボタン以下を改変しました。
[OK_Cancel] に [help] を追加しています。
/* OK or CANCEL */: row{

Step1 － <S_Edit4.lsp> を起動すると、下図のダイアログが表示されます。

spacer;

このプログラムは、第 3 章 4 節の [S_Edit1.lsp] を改変したものです: button

ダイアログの右下に [O スナップ設定 ] のボタンを配置し、このボタンから第 3 章 9 節の{label = " 実行 ";[S_Toggle1.lsp] を起動させることができます。

is_default = true;
key = "accept";
width = 8;
fixed_width = true;}
spacer;: button{label = " 中止 ";is_cancel = true;
key = "Cancel";width = 4;
fixed_width = true;

Step2 － [O スナップ設定 ] ボタンを押すと、現在のダイアログの上に、[S_Toggle1.lsp] で使用した}[O スナップ設定 ] のダイアログが表示されます。（AutoCAD の < 割り込み > と同じです。）

spacer;

そのあと、このダイアログを閉じて元のダイアログで作業を継続します。

: button{

ダイアログをコントロール

ダイアログをコントロール

label = "O スナップ設定 ";key = "help";
width = 4;

[O スナップ設定 ] ボタンを追加

fixed_width = true;}
spacer;}}//end2-167[HELP] にコマンドを割り当てる[HELP] にコマンドを割り当てる

2-168

第 4 章－ダイアログ をコントロール

S_Edit4.lsp

使用する LISP

第 3 章 4 節の [S_Edit1.lsp] を利用し、[help] ボタンの機能を追加しました。（追加箇所のみ記述）[help] にユーザー関数 (S_Toggle1.lsp) を割り当てています。

索引

＆

付録

;<< edit_box 処理 tate2 に値を受け取る >>(action_tile "tate2""(setq tate2 (get_tile ¥"tate2¥"))"

索引 (Index))

・本書で作成した AutoLISP & Dialog;<< O スナップ設定 (S_Toggle1.lsp) を追加する >>Point!

・本書で使用した AutoLISP 関数 & システム変数(action_tile "help"(strcat"(load ¥"S_Toggle1¥")" ;[S_Toggle1.lsp] を読み込む

1"(C:S_Toggle1)";[S_Toggle1.lsp] を実行する"help" が押された→

時は、独立関数 (S_Toggle1.lsp) を読み込み実行する。

));<< ダイアログを終了する準備 >>(setq dialog-box (start_dialog)); ユーザー入力を受け付ける→］

ダイアログの入力と終了(unload_dialog dcl_id);<< [OK] ボタンが押された時の処理 >>(if(= (getvar "DIASTAT") 1) (S_Edit1_1))

番号

説

明

[help] ボタンを押した時の動作を記述します。
①

独立関数 (S_Toggle1.lsp) を使用するときは、まずメモリーに読み込みます。
次に <C:S_Toggle1> と入力します。

ダイアログをコントロール

Point!

ユーザー関数 (C:***.lsp) を読み込む場合
AutoCAD の組み込み関数 (Line や Circle) の場合は、コマンドラインに [LINE] または[CIRCLE] と入力するとコマンドは使えます。
しかし、ユーザー独自の関数では、メモリーに読み込む（ロードする）ことが必要です。
①コマンドラインに次の様に入力します。
→ (load "S_Toggle1")②読み込んだ後、コマンドを実行します。
→ S_Toggle1

2-169[HELP] にコマンドを割り当てる・本書で使用した一般用語

IndexIndex

本書で使用した AutoLISP 関数 & システム変数

本書に掲載した AutoLISP と DCL は下記の Web から取得できます。また、プログラムの修正文等も掲載しています。

Index（索引）https://www.ellipse.ne.jp/autolisp.html
第 1 部で作成した AutoLISP プログラム一覧表
章
LISP
1 章 box1.lsp
fillet0.lsp
2 章 box2.lsp
tbl_lay.lsp
moji_len.lsp
dist1.lsp
dist2.lsp
ang.lspnitoubun.lsp
arc_len.lsp
polar_1.lsp
polar_2.lsp
para1.lsp
ang_3hen.lsp
ucs_o.lsp
sui_lin.lsp
re_copy.lsp
whcircle.lsp
while_off.lsp
chusin.lsp
chgcircle.lsp

ページ
1-39
1-41
1-49
1-60
1-68
1-73
1-75
1-79
1-80
1-86
1-90
1-92
1-94
1-96
1-113
1-117
1-127
1-129
1-130
1-134
1-137

章
LISP
3 章 trim_1.lsp
rota1.lsp
mo_ro.lsp
box2.lsp
waku_1.lsp
waku_2.lsp
orth_on.lsp
off_3.lsp
en_hasi.lsp
out_var.lsp
out_layer.lsp
in_var.lsp
in_layer.lsp

ページ
1-143
1-154
1-158
1-164
1-168
1-169
1-171
1-176
1-182
1-191
1-192
1-194
1-196

章
LISP
ページ
4 章 get_lwpoly2.lsp 1-212
get_lwpoly.lsp 1-213
get_polyline.lsp 1-221
chglay.lsp
1-224
laychg.lsp
1-226
laychg2.lsp
1-228
txt_ro.lsp
1-230
DimUp.lsp
1-238
del_lay.lsp
1-242
m_chglay.lsp
1-244
chg_txt.lsp
1-247
nagachk.lsp
1-250
circleerase.lsp 1-258
lineerase.lsp
1-260
xdata_add.lsp 1-265
get_xdata2.lsp 1-268
get_xdata3.lsp 1-269

第 2 部で作成した AutoLISP & DCL プログラム一覧表章節
第3章 第2節
第3節
第4節
第5節
第6節
第7節
第8節
第9節
第 10 節
第 11 節
第 12 節
第 13 節
第 14 節第4章 第1節
第2節
第3節
第4節

1

LSP
S_Text2.lsp
S_Text1.lsp
S_Edit1.lsp
S_Edit2.lsp
S_Slider1.lsp
S_Radio1.lsp
S_Radio2.lsp
S_Toggle1.lsp
S_Popup2.lsp
S_Toggle2.lsp
S_List1.lsp
S_Popup1.lsp
S_List3.lsp
S_Pick1.lsp
S_Pick2.lsp
S_Edit3.lsp
S_Edit3_F.lsp
S_Edit4.lsp

DCL
S_Text2.dcl
S_Text1.dcl
S_Edit1.dcl
S_Edit2.dcl
S_Slider1.dcl
S_Radio1.dcl
S_Radio2.dcl
S_Toggle1.dcl
S_Popup2.dcl
S_Toggle2.dcl
S_List1.dcl
S_Popup1.dcl
S_List3.dcl
S_Pick1.dcl
S_Pick1.dcl
S_Edit3.dcl
S_Edit3_F.dcl
S_Edit4.dcl

スライドファイル (sld)

外部テキスト

S_Edit1
S_Edit2-1、S_Edit2-2
S_Slider1-1 ～ S_Slider1-5

!
～
/
/=
+
=
<
<=
>
>=
*
*error*
1+
1-

記号
1-19
1-62
1-62、1-63
1-120、1-121
1-62、1-63
1-62、1-63
1-120、1-121
1-120、1-121
1-120、1-121
1-120、1-121
1-120、1-121
1-62、1-63
1-198、1-201
1-62、1-63
1-62、1-63

abs
acad_strlsort
acadlspasdoc
action_tile
add_listalert
andangbaseangdirangle
angtofangtosapertureappend
apply
assoc
atan
atof
atoi
atoms-family
aunitsauprecA
1-62、1-65
1-46、1-54
1-6
2-35、2-44
2-62
1-198、1-205
1-120、1-121
1-33
1-33
1-72、1-76、1-77
1-100、1-103
1-100、1-106、1-107、1-109
1-29、1-173
1-46、1-50、1-261
1-46、1-51
1-46、1-47、1-56
1-62、1-64
1-100、1-103
1-100、1-103
1-44
1-33、1-104
1-34、1-105

blipmode

1-29

car
cadr
cddr
cdr

C
1-46、1-47
1-46、1-47
1-46、1-47
1-46、1-47

out_layer.txt

S_Edit3-C、S_Edit3-F
S_Edit3-F
S_Edit1

本書で作成した AutoLISP & Dialog

B

アルファベット順

cdate
cecolorceltscaleceltypechamferachamferb
chamferc
chamferd
chammode
clayerclose
cmddiacmdecho
cond
cons
cos
cvunit

C
1-100
1-36
1-36
1-36
1-35
1-35
1-35
1-35
1-35
1-36
1-188、1-189
1-29
1-29、1-140、1-146
1-136
1-46、1-50、1-57
1-62、1-64
1-100、1-118

defun
dimx_tile
dimy_tile
distance
distofdone_dialog
dragmode
dtr

D
1-12
2-60、2-97
2-60、2-97
1-72、1-73、1-162
1-100、1-103
2-34
1-29
1-78、1-79

elevation
end_imageend_listentdelentgetentlastentmakeentmakex
entmodentnext
entselentupd
eq
eqal
exit
exp
expt
extmaxextmin

E
1-52
2-60
2-62
1-208、1-222
1-208、1-217
1-208、1-209
1-57、1-208、1-222
1-208
1-58、1-208、1-223、1-261
1-208、1-219
1-208、1-210
1-208
1-120、1-123
1-120、1-123
1-198
1-62
1-62、1-63
1-32
1-32

本書で使用した AutoLISP 関数 & システム変数

Index（索引）解説プログラム一覧と取得方法

2

Index（索引）filedia
fill_image
filletrad
fillmode
findfile
fix
float
foreachgcd
get_tile
getanglegetcorner
getdistgetintgetkword
getorirnt
getpoint
getrealgetstringgetvargraphscr

3

Index
F

1-29
2-60
1-35
1-30
1-188、1-189
1-100、1-101、1-102
1-100、1-101
1-46、1-51
G

1-62
2-35、2-38
1-152、1-155、1-157
1-152、1-155
1-152、1-156、1-162
1-152、1-153
1-152、1-167
1-152、1-155
1-52、1-152、1-156、1-161
1-152、1-153
1-152、1-153
1-28、1-38
1-140、1-144
Hhighlight

1-30

if
initgetinters
itoa

I
1-132
1-152、1-166
1-72、1-98
1-100、1-106

last
lastpoint
lengthlimmaxlimminlist
listp
load_dailog
log
logandlogiorlsh
ltscalelunitslupreclwpolyline

L1-46、1-47
1-36、1-161
1-46、1-59
1-32
1-32
1-19、1-50、1-52
1-46、1-59
2-34
1-62
1-62
1-62
1-62
1-36
1-34、1-104
1-34、1-104
1-211、1-212、1-213

mapcarmax
memberminminuspmirrtext
mode_tileM
1-46、1-50
1-62、1-65
1-46、1-54
1-62、1-65
1-62、1-65
1-30
2-35、2-40

nentsel
new_dialog
nil
not
nth
null

N
1-208、1-211
2-34
1-42、1-43
1-120、1-121
1-46、1-47
1-120、1-121

openororthomode
osmodeosnap

O
1-188、1-189
1-120、1-121
1-170、1-171
1-37、1-174
1-72、1-170

pause
pdmodepdsizepi
pickboxplinewid
polar
prin1
princ
print
progn
promptpsltscale

P
1-42
1-30
1-30
1-42、1-43
1-30
1-31
1-72、1-76、1-77
1-140、1-141
1-140、1-141
1-140、1-141
1-133
1-140
1-37

qtext
qtextmode
quit
quote

Q
1-144
1-31
1-198
1-53

read
read_char
read_line
redraw
regappR
1-66、1-71
1-188、1-189
1-188、1-189
1-140、1-144、1-145
1-261、1-263

本書で使用した AutoLISP 関数 & システム変数

remrepeatreversertd
rtosR
1-62、1-65
1-126
1-46、1-54
1-78、1-79
1-100、1-106、1-107、1-108

set_tilesetq
setvarsinslide_image
snapang
snapbase
snapunit
sqrt
ssadd
ssdel
ssget
sslengthssmembssnamestart_dialog
start_image
start_list
strcasestrcatstrlensubrs
subst
substrS
2-35、2-36
1-19
1-28、1-40
1-62、1-64
2-60
1-84
1-31
1-31
1-62、1-63
1-235、1-239
1-235、1-239
1-235、1-236
1-235、1-240
1-235、1-240
1-235、1-240
2-34
2-60
2-62
1-66、1-67
1-66、1-67
1-66、1-67
1-25
1-46、1-54、1-58
1-66、1-67

Ttblnext
tblsearch
terpritextboxtextpagetextscr
trans
type

T
1-42、1-43
1-46、1-60
1-46、1-59
1-140、1-141
1-72
1-140
1-140、1-144
1-100、1-110、1-112、1-114
1-25

U
UCS
unload_dialog

U
1-206
1-110、1-111
2-34

wcmatchwhile
write-charwrite-lineW
1-66、1-71
1-129
1-188、1-189
1-188、1-189

本書で使用した AutoLISP 関数 & システム変数

Index（索引）

Index

4

IndexAppendix

アイウエオ順Index（索引）acad.dcl
acad.lsp
acad.unt
acaddoc.lsp
base.dcl
space
xdata
width

英字
2-5
1-6
1-118
1-6
2-5
2-11
1-261、1-264、1-267
2-11

ア行
アークタンジェント
1-64
アプリケーション名
1-263
アポストロフィー1-19
イメージタイル
2-26、2-60
インラインコメント
1-20
エコーバック1-29、1-146
エラーコード
1-199
エラーメッセージ
1-199
エラー関数
1-201、1-202
エラー処理
1-198、2-65
エンティティ名
1-24
円周率
1-101
オブジェクトスナップ 1-37、1-173
オブジェクトタイプ
1-254
オブジェクト処理関数 1-208
大文字・小文字
1-67

開始関数
拡張データ
角度の演算関数
角度の単位
角度の方向
関係演算子
感嘆符
基本図形の色基本図形の線種
極座標入力
切り上げ
切り捨て
クラスタ
グループコード
グローバル変数
組み込み関数
繰り返し関数
検索パス
コールバック関数
コメント

5

カ行
2-34
1-261、1-264、1-267
1-64
1-33
1-33
1-255
1-19
1-36
1-36
1-109
1-101
1-101
2-2
1-55、1-56
1-26
1-25
1-124
1-15
2-64
1-20

サポートファイル
座標系コード
算術演算関数ジオメトリック関数
システム変数
実数
修飾子
終了関数
条件関数
シンボル
シンボル テーブル
四捨五入
スナップ間隔スナップ原点
スライダー
スライドファイル
図形名
図面ステータスバー
図面範囲
セミコロン
整数
線種尺度
選択セット
相対座標入力
属性処理関数ターゲットボックス
ダイアログボックスタイル
タイル処理関数タイルの属性
単位の変換
データタイプ
データ変換関数
テキストタイル
テキスト ファイル
定義済み属性
定義済み変数定数
トグル
ドット・ペア

本書で使用した一般用語

サ行
1-15
1-1110
1-62
1-72
1-28
1-22
1-123
2-34
1-124、1-125
1-24
1-59、1-60
1-101
1-31
1-31
2-22、2-54
2-27
1-24
1-170
1-32
1-20
1-22
1-36
1-23、1-235
1-108
2-35
タ行
1-31
2-2
2-2、2-6
2-35
2-15
1-119
1-22
1-100
2-24、2-46
1-188
2-16
1-42、1-44
1-42
2-19、2-52
1-55

ハイライト表示ビットコード
比較関数
引数
ファイル記述子
フィルタリスト
分岐関数
ペーパー空間編集ボックス
変数
ボタン
ポップアップリスト
ポリラインの幅
補助関数

ハ行
1-144、1-145、2-43
1-37
1-120
1-27
1-24
1-252
1-125
1-371
2-18、2-48
1-19
2-28
2-23、2-56
1-31
1-16

文字処理関数
文字の省略
文字列

マ行
1-66
1-31
1-23、1-66

ユーザー関数
ユーザー入力関数

ヤ行
1-16
1-152

ラジアン
ラジオボタン
ラジオボックス
ラバーバンドリスト
リストボックス
リスト操作関数
連想リスト
ローカル変数
論理演算関数
論理演算子

ラ行
1-78
2-20、2-50
2-21、2-50
1-155、1-156
1-23、1-46
2-24、2-58
1-46
1-56、1-57、1-58
1-26
1-65
1-123、1-256

ワイルドカード

ワ行
1-71、1-267

Appendix（付録）

本書で使用した一般用語

本書で使用した一般用語

6Appendix

著者プロフィール
中森

隆道（なかもりたかみち）

株式会社エリプス
・CAD&CAE プログラム開発と職業訓練校運営
・AutoCAD アドオンソフト開発

著書
・CAD 操作マニュアル分野[Autodesk Mechanical Desktop の使い方 ] ソフトバンククリエイティブ株式会社

Appendix（付録）[IntelliCAD 2002 公式ガイドブック ] 株式会社 鳥影社[CAD 総合講座 AutoCAD2000i コマンド編＆練習編 ] ソフトバンククリエイティブ株式会社[ 基礎から学ぶ AutoCAD2002 コマンド編＆実践編 ] ソフトバンククリエイティブ株式会社
他 社会人スクール用テキスト等 多数
・CAD 資格試験対策分野[CAD 利用技術者試験 1 級ハンドブック 2000 年 ] ソフトバンククリエイティブ株式会社[CAD 利用技術者試験 1 級ハンドブック 2001 年 ] ソフトバンククリエイティブ株式会社[AutodeskMaster2DDedign 公式ガイドブック（共著）ソフトバンククリエイティブ株式会社[AutodeskMaster3DDedign 公式ガイドブック（共著）ソフトバンククリエイティブ株式会社
以下は 2002 年から 2005 年まで毎年[CAD 利用技術者試験 2 級徹底理解 ] ソフトバンククリエイティブ株式会社[CAD 利用技術者試験 1 級徹底理解 ] ソフトバンククリエイティブ株式会社
他

多数

・CAD プログラム開発分野[AutoCAD LT2000i 徹底活用 ] ソフトバンククリエイティブ株式会社[AutoCAD LT2002 徹底活用 ] ソフトバンククリエイティブ株式会社[AutoCAD LT データ 徹底活用術 ] ソフトバンククリエイティブ株式会社[AutoCAD & LT カスタマイズブック ] ソフトバンククリエイティブ株式会社

7

本書掲載プログラムの掲載 Web ページ

https://www.ellipse.ne.jp/autolisp.html

本書の質問メールアドレス

autolisp@ellipse.ne.jp