TOP PAGE > 記事閲覧
E(O)スナップを幾つかのパターンで記憶させ、設定する(lisp)
投稿日 : 2016/02/29(Mon) 17:34
投稿者 アルサポ
参照先
エンティティ(オブジェクト)スナップの組み合わせを記憶させて、
利用したい時に、記憶させたパターンのエンティティスナップを設定する
LISPを紹介しようと思います。

このLISPは、テキストファイルにエンティティスナップの組み合わせを
書き込んで、利用する時には、そのテキストファイルを参照して
エンティティスナップを設定する簡単な仕組みになっています。

今回作成するものとしては、以下の3ファイルです。
・エンティティスナップの組み合わせを書き込むテキストデータ「snap_list.txt」
・どの組み合わせを記憶させるのかをチェックボックスを使って表示させる
 ダイアログファイル「MySnap.DCL」
・プログラム処理させるLISPファイル「MySnap.LSP」

追記としては、記憶させるエンティティスナップの組み合わせは、いくつも作成することが出来ますが、
とりあえず、今回は3種類のパターンの組み合わせを記憶させ、利用できるようにしたものを紹介します。
記事編集 編集
Re:エンティティスナップの組み合わせを書き込むテキストデータについて
投稿日 : 2016/02/29(Mon) 17:36
投稿者 アルサポ
参照先
まず、テキストファイルを作成します。
ファイル名は、とりあえず「snap_list.txt」として下さい。
保存する場所についてはOSや設定によっては、Cドライブ直下のファイルは保存、編集が出来ない場合が
あるので、Cドライブ直下に「設定保存フォルダ」という名前のフォルダを作成して、そこにテキストファイルを
保存しておきます。

内容については、下記の内容でテキストファイルを作成して下さい。
内容は自分で考えたスナップの組み合わせの説明書きとスナップのビットコードを交互に書いているものになっています。

-----下記の6行が内容です。3種類分の記載になります-----
端点+交点+近接点
545
中心+四半円点
20
端点+中点+近接点+交点+挿入基点
611
記事編集 編集
Re:どの組み合わせを記憶させるかを表示させるダイアログファイルについて
投稿日 : 2016/02/29(Mon) 17:40
投稿者 アルサポ
参照先
ダイアログコントロール言語(DCL)を使ってダイアログボックスを作成していきます。
ダイアログボックスを利用することで視覚的にスナップの組み合わせを確認、保存しやすいようになります。
ファイル名は「MySnap.DCL」として下さい。
各スナップのチェックボックス(トグル)名はすべて「snap_」+「スナップのビットコード」の組み合わせで
名前を付けています。

-----下記がMySnap.DCLの内容ですです。-----
MySnap : dialog
{
label="スナップ設定";
:popup_list{label="スナップパターン"; key="list1"; widht=""; value="";}
:edit_box{label="説明"; key="text1"; width=""; value="";}
:boxed_row{
label = "スナップモード";
:column{
:toggle{label="端点"; key="snap_1";}
:toggle{label="中点"; key="snap_2";}
:toggle{label="中心"; key="snap_4";}
:toggle{label="点"; key="snap_8";}
:toggle{label="四半円点"; key="snap_16";}
:toggle{label="交点"; key="snap_32";}
:toggle{label="延長"; key="snap_4096";}
}
:column{
:toggle{label="挿入基点"; key="snap_64";}
:toggle{label="垂線"; key="snap_128";}
:toggle{label="接線"; key="snap_256";}
:toggle{label="近接点"; key="snap_512";}
:toggle{label="仮想交点"; key="snap_2048";}
:toggle{label="平行"; key="snap_8192";}
}
}
:boxed_radio_row{
label = "";
:button{label = "すべて選択"; key = "snap_allOn";}
:button{label = "すべてクリア"; key = "snap_allOff";}
:button{label = "現在のスナップ"; key = "snap_now";}
}
ok_cancel;
}
記事編集 編集
Re:プログラム処理させるLISPファイルについて
投稿日 : 2016/02/29(Mon) 17:52
投稿者 アルサポ
参照先
LISPについては、ファイル名を「MySnap.LSP」として下さい。
記憶させた組み合わせのスナップを利用する「利用部」と、組み合わせを記憶させる「準備部」の2つのパートで分けて
プログラムを書いていますので、そういう見方で見られると内容を把握しやすいかもしれません。
あとよく出てくる「(strcat "snap_" (rtos code))」については、チェックボックス(トグル)の名前を表しています。
チェックボックスはすべて「snap_」+「スナップのビットコード」の組み合わせで名前を付けてあります。


;利用部------------------------------------------------------------------------------------------------
(defun C:Snap1 () (code_set 1)(princ));スナップパターン1
(defun C:Snap2 () (code_set 2)(princ));スナップパターン2
(defun C:Snap3 () (code_set 3)(princ));スナップパターン3(増やす場合は数字箇所を増加する)
;設定ファイルを読み込み、スナップを設定する
(defun code_set (cnt / f lst reader m)
;設定ファイルを読み込む
(setq f (open "C:\\設定保存フォルダ\\snap_list.txt" "r"));読み込み用
(setq lst (list (read-line f)))
(while (/= (setq reader (read-line f)) nil)
(setq lst (append lst (list reader)))
);while
(close f)
(setq m (- (* 2 cnt) 1));2ずつ増える行数を算出
(setvar "osmode" (atoi (nth m lst)));スナップコードを出力
(princ (nth (- m 1) lst));説明も表示
);defun
;準備部-----------------------------------------------------------------------------------------------
(setq snapBitCode (list 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1));0を除く14種のスナップコード
(setq pattern (list "1" "2" "3"));今回は3種類のパターン。数を増やすとパターン数が増える
(setq total 0);ビットコードの合計
(setq cnt 0);ポップアップリストの現在の番号
(setq index "");説明文
;スナップの設定を行う
(defun C:MySnap (/ dcl_id i code dialog_box)
(if(not MySnap)(load "MySnap"))
(setq dcl_id (load_dialog "MySnap.DCL"))
(new_dialog "MySnap" dcl_id)

(start_list "list1" 3);ポップアップリストに追加
(mapcar 'add_list pattern)
(end_list)
(read_set);初期値からチェックを入れる

(action_tile "text1" "(setq index (get_tile \"text1\"))")
(action_tile "list1" "(read_set)")
(action_tile "snap_allOn" "(snap_all_on)")
(action_tile "snap_allOff" "(snap_all_off)")
(action_tile "snap_now" "(bitCode_check (getvar \"OSMODE\"))")
(action_tile "close_set" "(unload_dialog dcl_id)")
;チェックを選択した時の処理
(setq i 0)
(while (/= (setq code (nth i snapBitCode)) nil)
(action_tile (strcat "snap_" (rtos code)) (strcat "(total_val " (rtos code) ")"))
(setq i (+ i 1))
);while

(setq dialog-box (start_dialog))
(unload_dialog dcl_id)
;OKボタンを押した時の処理
(if(= (getvar "DIASTAT") 1)(write_set))
(princ)
);defun
;チェックをつけたり、消したりした時の処理
(defun total_val (code /)
(if (= (get_tile (strcat "snap_" (rtos code))) "1")
(setq total (+ total code));チェックをつけると足す
(setq total (- total code));チェックをけすと引く
);if
);defun
;すべて選択ボタンを押した時の処理
(defun snap_all_on (/ i)
(setq i 0)
(while (/= (setq code (nth i snapBitCode)) nil)
(set_tile (strcat "snap_" (rtos code)) "1");チェックあり "1"
(setq i (+ i 1))
);while
(setq total 15359);1024はすべてクリアなので計算には入れない
);defun
;すべてクリアボタンを押した時の処理
(defun snap_all_off (/ i)
(setq i 0)
(while (/= (setq code (nth i snapBitCode)) nil)
(set_tile (strcat "snap_" (rtos code)) "0");チェックなし "0"
(setq i (+ i 1))
);while
(setq total 0)
);defun
;スナップのビットコードからチェックを入れる
(defun bitCode_check (n / i code)
(setq total 0);合計を初期化
(setq i 0)
(while (/= (setq code (nth i snapBitCode)) nil)
(if (>= n code)
(progn
(setq n (- n code))
(set_tile (strcat "snap_" (rtos code)) "1")
(setq total (+ total code))
);progn
(set_tile (strcat "snap_" (rtos code)) "0");snap_1024は存在しないが、エラーにならないのでそのままにしておく。
);if
(setq i (+ i 1))
);while
(setq index (get_tile "text1"));テキストボックスから説明を取得
);defun
;既存の設定ファイルを読み込む
(defun read_set (/ f i n m fr)
(setq f (open "C:\\設定保存フォルダ\\snap_list.txt" "r"));設定ファイルは事前に作成しておく必要がある
(setq i 1)
(setq cnt (atoi (get_tile "list1")));ポップアップリストから数値を取得
(setq n (+ cnt 1));ポップアップリストは「1」からではなく「0」から始まるので「1」を足す
(setq m (- (* 2 n) 1));2ずつ増える行数を算出
(while (/= (setq fr (read-line f)) nil)
(if (= m i)(set_tile "text1" fr)) ;説明取得
(if (= (+ m 1) i)(bitCode_check (atoi fr))) ;チェック用
(setq i (+ i 1))
);while
(close f)
(princ)
);defun
;チェックから設定を保存
(defun write_set (/ f_old lst_old read_old f_new write_new i m)
(setq f_old (open "C:\\設定保存フォルダ\\snap_list.txt" "r"));読み込み用
(setq lst_old (list (read-line f_old)))
(while (/= (setq read_old (read-line f_old)) nil)
(setq lst_old (append lst_old (list read_old)))
);while
(close f_old)

(setq f_new (open "C:\\設定保存フォルダ\\snap_list.txt" "w"));書き込み用
(setq m (* 2 cnt));2ずつ増える行数を算出
(setq i 0)
(while (/= (setq write_new (nth i lst_old)) nil)
(cond
((= i m) (write-line index f_new));説明を書きこむ
((= i (+ m 1)) (write-line (rtos total) f_new));ビットコードの合計
(T (write-line write_new f_new));変更がない場合
);cond
(setq i (+ i 1))
);while
(close f_new)
(princ)
);defun
(princ "\nスナップの組み合わせを記憶させ、設定するリスプ")
(princ)
記事編集 編集
Re:使い方について
投稿日 : 2016/02/29(Mon) 17:59
投稿者 アルサポ
参照先
上記の3ファイルで、プログラムは完成したのですが、使うにはまだ準備が必要となります。
「サポートファイルの検索パス」にLISP、DCLファイルが保存されているフォルダを登録。
「アドイン」にLISPファイルを登録(ロード)を済ませないといけません。

次にコマンド(ボタンやメニュー)の登録もしなければいけません。
LISPの利用部パートに関連した箇所は、今回3種類のパターンを作成しましたので、
ひとつずつに名前をとりあえず「スナップ1」「スナップ2」「スナップ3」にして、
コマンドの内容は「'snap1;」「'snap2;」「'snap3;」で作成して下さい。
コマンドは「^C^C」ではなく「'」にしたのは、割り込みコマンドにする為で、
作図、編集などのコマンドの途中からでも、スナップを変更することが出来ます。

LISPの準備部パートに関連した箇所は、1つだけ作成しないといけません。
名前をとりあえず「スナップ設定」、コマンドの内容は「^C^Cmysnap;」で作成して下さい。

あとは、作成したコマンドをメニューやツールバーなどに登録すれば、
これで問題なく利用することが出来ると思います。
記事編集 編集
Re:パターンの増やし方について
投稿日 : 2016/02/29(Mon) 18:06
投稿者 アルサポ
参照先
3種類で十分であれば、関係のない事なのですが、
もし、パターンの数を増やしたい場合には、「snap_list.txt」と「MySnap.LSP」の内容を
修正(追記)すれば、3種類以上のパターンでも利用することが出来ます。

「snap_list.txt」には、3種類分の説明文とコードが記載されていますが、
増やす場合には、増やしたいだけの説明文とコードをテキストエディタで追記する必要があります。
コード数がわからない場合や入力ミスがあるかもしれないので、すでに書いてある説明文とコードをコピーして
増やしたい分だけ、貼り付ければ間違いなく出来るのではないでしょうか。

「MySnap.LSP」の修正箇所については、
利用部パートについては、増やしたい数だけ
(defun C:Snap△ () (code_set △)(princ))
を追記して下さい。「△」には追加したい数を入力して下さい。
例えば、5種類に増やしたい場合には、
(defun C:Snap4 () (code_set 4)(princ))
(defun C:Snap5 () (code_set 5)(princ))
の2行を追記して下さい。CAD上では、コマンドを作成することも忘れないで下さい。

準備部パートについては、「準備部------------」から下2行目に
(setq pattern (list "1" "2" "3"));今回は3種類のパターン。数を増やすとパターン数が増える
と書いてあると思いますが、この一行に増やしたい分だけ数字を増やして修正していきます。
例えば、5種類に増やしたい場合には、
(setq pattern (list "1" "2" "3" "4" "5"))
という風に修正して下さい。こちらの方は、CAD上で追加でコマンドを作成する事はありません。

以上がパターンの増やし方について書かせて頂きました。
今回のような長々としたプログラムの記載については、プログラムが長ければ長いほど
アルゴリズムの未熟さが露呈されるようで恥ずかしく思っていますが、私自身の勉強の為にも
続けていけるだけ続けたいと思います。
閲覧される方には、少しでも参考になれば幸いだと思います
記事編集 編集
ページの上に移動
件名 スレッドをトップへソート
名前
メールアドレス
URL
暗証キー
画像認証 (右画像の数字を入力) 投稿キー
コメント


- WEB PATIO -