この掲示板は AutoCADマクロ屋本舗 の掲示板です。

【 注意 】最初に必ず ↓↓ 下記内容 ↓↓ を参照ください。
① マクロが分からない方は、まず 【 マクロ講座 】 を参照ください。
② 質問の前に 【 マクロ使用前の注意事項 】 をお読みください。
③ 質問する時は、新規投稿フォーム下の【 新規投稿時のお願い 】を必ずお読みください。

右クリックで再選択、リストに無い時はエラーメッセージ表示
大変に恐縮ですが、お知恵を頂きたく質問させていだだきます。

使用CAD:AutoCAD2025

角パイプのブロック挿入をLISPで書いております。
角パイプのサイズによって肉厚が違うので外形サイズを選択後に対応した肉厚を選択してそれぞれ選択したサイズ、肉厚を結合し、ファイル名にして挿入しております。
肉厚を選択する際、*last-Tsize*をgetkwordでリストに入れることにより右クリックで再選択できるようにしました。
この時、リストに無いサイズが前回選択値で表示されることがあります。間違って無いサイズを右クリックしてしまった時にエラーメッセージが出るように(コマンドに表示するよりalertで表示させたほうがわかりやすいためalertにしました)したいのですが、現在のLISPでは右クリック再選択ができない状態です。(alertメッセージを肉厚選択時に出るように変更したらできなくなりました)
長々書いてしまいましたが、最終的には右クリックで肉厚を選択できるようにし、且つリストに無い肉厚を選択した時にエラーメッセージが出て再選択できるようにしたいです。
どのように変更すれば可能になりますでしょうか?
お忙しい中申し訳ありませんがよろしくお願いします。

以下LISPです。

(defun c:insert_SQUARE ()
(setq LUP (getvar "LUPREC"))
(setvar "LUPREC" 1)

(initget "25 31 40 45 50 60 75 80 100 125 150 175 200 250 LAST")
(setq SQUARESSsize (getkword (strcat "\n角パイプ SS 正方形\n●=現在選択中角パイプサイズ 右クリックまたは【Enter】で再選択<" *last-SQUARESSsize*
">[25/31/40/45/50/60/75/80/100/125/150/175/200/250]: ")))
(cond ((= SQUARESSsize nil) (setq SQUARESSsize *last-SQUARESSsize*))
((= (strcase SQUARESSsize) "LAST") (setq SQUARESSsize *last-SQUARESSsize*))
(T (setq SQUARESSsize (strcat "□" SQUARESSsize))))
(setq *last-SQUARESSsize* SQUARESSsize)

(if (not *last-Tsize*) (setq *last-Tsize* "t2.3"))

(cond
((or (= SQUARESSsize "□25") (= SQUARESSsize "□31"))
(setq Tsize nil)
(while (= Tsize nil)
(initget "1.6 2.3 3.2 LAST")
(setq Tsize_input (getkword (strcat "\n【" SQUARESSsize "】\n●=現在選択中の肉厚(" *last-Tsize* ") 右クリックまたは【Enter】で再選択<" *last-Tsize* ">[1.6/2.3/3.2]: ")))
(cond
;; 右クリックの場合を最初に判定
((= Tsize_input nil)
(setq Tsize Tsize_input)) ; Tsizeにnilを格納してループを抜ける
;; 有効なキーワードの場合
((member Tsize_input '("1.6" "2.3" "3.2" "LAST"))
(setq Tsize Tsize_input)) ; Tsizeに値を格納してループを抜ける
;; 上記以外(無効な入力)の場合
(T
(alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。")
)
)
)
)

((or (= SQUARESSsize "□40") (= SQUARESSsize "□45"))
(setq Tsize nil)
(while (= Tsize nil)
(initget "2.3 3.2 LAST")
(setq Tsize_input (getkword (strcat "\n【" SQUARESSsize "】\n●=現在選択中の肉厚(" *last-Tsize* ") 右クリックまたは【Enter】で再選択<" *last-Tsize* ">[2.3/3.2]: ")))
(cond
((= Tsize_input nil) (setq Tsize Tsize_input))
((member Tsize_input '("2.3" "3.2" "LAST")) (setq Tsize Tsize_input))
(T (alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。"))
)
)
)

((or (= SQUARESSsize "□50") (= SQUARESSsize "□60"))
(setq Tsize nil)
(while (= Tsize nil)
(initget "1.6 2.3 3.2 4.5 6.0 LAST")
(setq Tsize_input (getkword (strcat "\n【" SQUARESSsize "】\n●=現在選択中の肉厚(" *last-Tsize* ") 右クリックまたは【Enter】で再選択<"
*last-Tsize* ">[1.6/2.3/3.2/4.5/6.0]: ")))
(cond
((= Tsize_input nil) (setq Tsize Tsize_input))
((member Tsize_input '("1.6" "2.3" "3.2" "4.5" "6.0" "LAST")) (setq Tsize Tsize_input))
(T (alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。"))
)
)
)
)

(cond ((= Tsize nil) (setq Tsize *last-Tsize*))
((= (strcase Tsize) "LAST") (setq Tsize *last-Tsize*))
(T (setq Tsize (strcat "t" Tsize))))
(setq *last-Tsize* Tsize)

(setq fit (strcat SQUARESSsize "x" Tsize))
(setq filename (strcat fit " SS"))
(my_insert_block_rotateOK)
(princ Tsize)
(princ)
)
  • mappy
  • 2025/09/04 (Thu) 09:39:51
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
また一言忘れました。
これをツールパレットに登録して使うことを前提としているため、このようなlisp内容となっております。
  • mappy
  • 2025/09/04 (Thu) 19:40:32
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
ざっと見ただけなんで、的外れならすみません。
*last-Tsize* は、このLispだけじゃなくて、他のLispでも使用しているのでしょうか?
そうでなければ、*last-Tsize* にリストにない数値が入っているという現象が起きないような気がして・・・

もし他のLispとも共用しているグローバル変数ということであれば、先に、*last-Tsize* をcondでこのLispで使用するリストに合致した数値かどうかをテストして、合致しなければ一番使用頻度の多そうな数値に入れ替えるというのはどうでしょう?
最終的に *last-Tsize* は、このLispで使用した値になるので、リストに当てはまらない数値を維持する必要はないと思われます。
  • LUNE
  • 2025/09/08 (Mon) 09:32:25
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
LUNE様 

返信ありがとうございます。

>*last-Tsize* は、このLispだけじゃなくて、他のLispでも使用しているのでしょうか?
説明足らずですみません。
*last-Tsize*はこのLISPだけで使っておりますが、このLISPは鋼材全てに対してのLISPになっております。(長くなるので一部だけを抜き取ったLISPになっております。)
全ての鋼材に対して*last-Tsize*は共通となっており、且つ、鋼材1つ(角パイプ正方形・角パイプ長方形・アングルなど)のサイズに対しての肉厚もバラバラなので*last-Tsize*をLISP内で共通に使っているとリストに無いサイズも表示されてしまう という意味です。

前回選択*last-Tsize*をリストに表示する形式にするとその肉厚が対応肉厚なのかが分かりづらく、つい右クリックで選択してしまいます。
それをエラーメッセージで警告し、正しい肉厚を選択できるようにしたいと思ったので質問させていだだきました。
  • mappy
  • 2025/09/08 (Mon) 13:06:16
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
コード読んでみましたが、ちょっと混乱してきました・・・

「右クリックあるいはEnterで再選択」とは、前の入力値をそのまま使用する、ということでしょうか。
それであれば、少し問題があります。

最初の、(setq SQUARESSsize 以下に関しては、右クリック・Enter・コマンドラインに表示された *last-SQUARESSsize* をクリック、のどれをやっても、 SQUARESSsize には nil が入ります。
そうして、
((= SQUARESSsize nil) (setq SQUARESSsize *last-SQUARESSsize*))
このコードで、SQUARESSsize に *last-SQUARESSsize* が入ります。

同じように
(cond
((or (= SQUARESSsize "□25") (= SQUARESSsize "□31"))
以下の getkword での選択部分も、右クリック・Enter・コマンドラインに表示された *last-Tsize* をクリック、のどれをやっても、 Tsize_input には nil が入ります。
そうすると、以下のコードで、Tsize には nil が入ることになり、選択画面に戻ることになります。
(cond
;; 右クリックの場合を最初に判定
((= Tsize_input nil)
(setq Tsize Tsize_input)) ; Tsizeにnilを格納してループを抜ける
;; 有効なキーワードの場合
((member Tsize_input '("1.6" "2.3" "3.2" "LAST"))
(setq Tsize Tsize_input)) ; Tsizeに値を格納してループを抜ける
;; 上記以外(無効な入力)の場合
(T
(alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。")
)
)

右クリック・Enter・コマンドラインに表示された [前回の入力値] をクリック、どれをやっても、nil の返り値になる、ということを理解してください。
上記の cond 内の
(T
(alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。")
このコードは絶対実行されない状況です。

ちょっと長くなったので、分けます。
  • LUNE
  • 2025/09/08 (Mon) 16:07:21
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
(cond
((or (= SQUARESSsize "□25") (= SQUARESSsize "□31")) 以下の部分を修正の一例です。

(while (= Tsize nil)
(initget "1.6 2.3 3.2 LAST")
(setq Tsize_input (getkword (strcat "\n【" SQUARESSsize "】\n●=現在選択中の肉厚(" *last-Tsize* ") 右クリックまたは【Enter】で再選択<" *last-Tsize* ">[1.6/2.3/3.2]: ")))
(cond
;; 有効なキーワードの場合
((member Tsize_input '("1.6" "2.3" "3.2" "LAST"))
(setq Tsize Tsize_input)) ; Tsizeに値を格納してループを抜ける
;; それ以外の場合
(T
;前回入力値が今回のリストの値を一致するかどうかを判定 last-Tsizeにはtが付加されているので比較リストも同じようにする
(if (member *last-Tsize* '("t1.6" "t2.3" "t3.2"))
;一致する場合、最初の t を除いて Tsizeに値を格納
(setq Tsize (substr *last-Tsize* 2))
;一致しない場合Tsizeにnilを格納し、アラートを出してループを抜ける
(progn
(setq Tsize Tsize_input)
(alert "\n<!> 有効な肉厚ではありません。リストから再選択してください。")
))
)
)
)
  • LUNE
  • 2025/09/08 (Mon) 16:10:50
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
Lispのエディタに何を使用されているのかわかりませんが、Visual Studio Code を使用されているのなら、コードを作成・編集する際は、ローカル変数を定義することを強くお勧めします。

(defun [コマンド名] (/ [この部分でローカル変数定義]

デバッグでステップインする際に、それぞれのローカル変数の内容が表示されるので、自分が意図した値が変数に入っているかどうかを確認できます。
  • LUNE
  • 2025/09/08 (Mon) 16:15:14
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
それと、各 initget で LAST が含まれていますが、getkword の中では使われていません。
これは、今後使う予定、ということですか?
  • LUNE
  • 2025/09/08 (Mon) 16:17:14
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
LUNE様

ご説明ありがとうございます。nilになっているということがわかっておりませんでした。(わかったからと言ってなにか対応できるわけではないのですが・・・)
絶対に実行されないのはなんとなくわかりました。(なんとなくですみません。)

修正していただいたコードに入れ替えて試してみたところ、再選択は表示されず以下のエラーメッセージが出てしまいました。
選択中の肉厚(t9.0)を右クリックで再選択しました。前回選択値にtが2つ入ってしまうのが分かりません。


コマンドの流れです。(提出したLISPの方にエラーがあったため本LISPの方に入れて試しました)

コマンド: _MY_STEEL_TYPE
●=現在選択中(<SS>) 右クリックまたは【Enter】で再選択[SS/SUS]:
[Square / Angle / Channel / H / KEI / LIP / FB / IB]S
角パイプ SS 正方形?長方形?
●=現在選択中の角パイプ(<正方形>) 右クリックまたは【Enter】で再選択[S 正方形/L 長方形]: S
【SS 正方形】
●=現在選択中のサイズ(<□200>)
右クリックまたは【Enter】で再選択[25/31/40/45/50/60/75/80/100/125/150/175/200/250]: 25
._insert ブロック名を入力 または [一覧(?)] <□200xt9.0 SS>: □25xtt9.0 SS
"□25xtt9.0 SS.dwg": 検索パス内にファイルが見つかりません:
\\192.168.1.1\acad-data\図面\WBLOCKデータ\ (現在のフォルダ)
C:\Users\kmclt\AppData\Roaming\Autodesk\AutoCAD 2025\R25.0\jpn\support\
C:\Program Files\Autodesk\AutoCAD 2025\support\
C:\Program Files\Autodesk\AutoCAD 2025\support\ja-JP\
C:\Program Files\Autodesk\AutoCAD 2025\fonts\
C:\Program Files\Autodesk\AutoCAD 2025\help\
C:\Program Files\Autodesk\AutoCAD 2025\express\
C:\Program Files\Autodesk\AutoCAD 2025\support\color\
C:\kiyomi\Program\
C:\Program Files (x86)\Autodesk\ApplicationPlugins\Autodesk AppManager.bundle\Contents\Windows\
C:\Program Files (x86)\Autodesk\ApplicationPlugins\Autodesk AppManager.bundle\Contents\Windows\2025\
C:\Program Files (x86)\Autodesk\ApplicationPlugins\Autodesk FeaturedApps.bundle\Contents\Resources\
\\192.168.1.1\acad-data\図面\WBLOCKデータ\blocks\
C:\Program Files\Autodesk\AutoCAD 2025\drv\
C:\Program Files\Autodesk\AutoCAD 2025\
*無効*
; エラー: 関数は取り消されました
  • mappy
  • 2025/09/09 (Tue) 08:41:26
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
LUNE様

>Lispのエディタに何を使用されているのかわかりませんが、Visual Studio Code を使用されているのなら、コードを作成・編集する際は、ローカル変数を定義することを強くお勧めします。
ディタには秀丸を使っております。Visual Studio Codeを試してみます。


>各 initget で LAST が含まれていますが、getkword の中では使われていません。これは、今後使う予定、ということですか?
これはLASTがgetkwordにあると他の方が使う時に分かりづらいかなと思ったので入れておりませんでした。
また、これが無いと右クリックでの再選択ができなくなるのかなと思ってinitgetにはそのままにしておりました。
  • mappy
  • 2025/09/09 (Tue) 08:47:01
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
そんな処理をしたい場合、dclを使った方が操作性が良くなると思います。

下記のコードでは、選択した項目を次回起動時に復元します。
前回と同じ選択項目で再実行なら、Enterだけで実行できます。

//下記がダイアログファイル「Insert_SQUARE.dcl」という名前でサポートフォルダに保存

Insert_SQUARE : dialog {
label = "角パイプ選択";
: popup_list {
key = "size_list";
label = "サイズ";
width = 20;
}
: popup_list {
key = "thickness_list";
label = "肉厚";
width = 20;
}
: spacer { height = 1; }
: button {
key = "draw_btn";
label = "作図";
is_default = true;
}
: button {
key = "cancel";
label = "キャンセル";
is_cancel = true;
}
}


;ここからがLISPファイル「insert_SQUARE.lsp」という名前でサポートフォルダに保存

(defun C:Insert_SQUARE ( / dcl_id size-thickness-map size-list result ls ts Ssize Tsize fit filename)
;; DCLファイルの読み込み
(setq dcl_id (load_dialog "Insert_SQUARE.dcl"))
(if (not (new_dialog "Insert_SQUARE" dcl_id))
(exit)
)

;; サイズと肉厚の対応表
(setq size-thickness-map
'(("25" "1.6" "2.3" "3.2")
("31" "1.6" "2.3" "3.2")
("40" "2.3" "3.2")
("45" "2.3" "3.2")
("50" "1.6" "2.3" "3.2" "4.5" "6.0")
("60" "1.6" "2.3" "3.2" "4.5" "6.0")
;以下のサイズは適当に追加しました
("75" "2.3" "3.2" "4.5" "6.0")
("80" "2.3" "3.2" "4.5" "6.0")
("100" "2.3" "3.2" "4.5" "6.0")
("125" "3.2" "4.5" "6.0")
("150" "3.2" "4.5" "6.0")
("175" "4.5" "6.0")
("200" "4.5" "6.0")
("250" "4.5" "6.0")
)
)

;; サイズリストの作成
(setq size-list (mapcar 'car size-thickness-map))
(start_list "size_list")
(mapcar 'add_list size-list)
(end_list)

;; インデックス取得関数
(defun get-index (item lst / idx found)
(setq idx 0 found nil)
(while (and lst (not found))
(if (= item (car lst))
(setq found t)
(setq idx (1+ idx) lst (cdr lst))
)
)
(if found idx nil)
)

;; 前回選択されたサイズがあれば、それを初期選択に
(if (not *last-size*) (setq *last-size* "2"))
(set_tile "size_list" *last-size*)

;; 肉厚リスト更新関数
(defun update-thickness-list (/ thickness-list)
(setq thickness-list (cdr (nth (atoi *last-size*) size-thickness-map)))
(start_list "thickness_list")
(mapcar 'add_list thickness-list)
(end_list)

;; 前回選択された肉厚があれば、それを初期選択に
(if (not *last-Tsize*) (setq *last-Tsize* "0"))
(set_tile "thickness_list" *last-Tsize*)
)

;; 初期肉厚リスト設定
(update-thickness-list)

;; サイズ変更時のコールバック
(defun CB_sl ()
(setq *last-size* (get_tile "size_list"))
(update-thickness-list)
)

(action_tile "size_list" "(CB_sl)")

;; 肉厚選択時のコールバック
(defun CB_tl ()
(setq *last-Tsize* (get_tile "thickness_list"))
)

(action_tile "thickness_list" "(CB_tl)")

;; 作図ボタン
(action_tile "draw_btn"
"(done_dialog 1)"
)

;; キャンセル
(action_tile "cancel"
"(done_dialog 0)"
)

;; ダイアログ表示
(setq result (start_dialog))
(unload_dialog dcl_id)

;; 実行処理
(if (= result 1)
(progn
(setq ls (car (nth (atoi *last-size*) size-thickness-map)))
(setq Ssize (strcat "□" ls))
(setq ts (nth (atoi *last-Tsize*) (cdr (nth (atoi *last-size*) size-thickness-map))))
(setq Tsize (strcat "t" ts))
(setq fit (strcat Ssize "x" Tsize))
(setq filename (strcat fit " SS"))

(my_insert_block_rotateOK filename)
)
)
(princ)
)



(defun my_insert_block_rotateOK (filename)
;ここの処理は適当に作ってます。実際の処理に書き換えて下さい。
(alert filename)
)

  • hamu
  • 2025/09/09 (Tue) 08:55:29
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
あっ、
>;ここからがLISPファイル「insert_SQUARE.lsp」という名前でサポートフォルダに保存
lispの方はファイル名は何でも良いです。
DCLの方は、ファイル名を変えるなら、lisp内でdclファイルを呼び出す部分も書き換えて下さい。
サポートフォルダ以外に保存したいなら、フルパスで呼び出して下さい。
  • hamu
  • 2025/09/09 (Tue) 09:00:27
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
hamu様

ありがとうございます。
これで間違った肉厚を選択しなくて済むようになりました。
ダイアログでも前回値を表示することができるんですね(できないと勝手に思ってました)
というか、DCLとダイアログ作成は難易度が高くて手が出せません。
  • mappy
  • 2025/09/09 (Tue) 10:07:14
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
hamu様

先程のコードに材質を選択できるようにコードを追加するにはどうすればいいのでしょうか?
少し弄ってみたのですがわからず断念してしまいました。
材質(SS SUS)も前回値を維持したいです。
dclには

: popup_list {
key = "material_list";
label = "材質";
width = 20;
}

を追加しました。

大変に恐縮ですがよろしくお願いします。
  • mappy
  • 2025/09/09 (Tue) 12:26:11
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
hamu様

何度もすみません。2点ほど質問させてください。

①肉厚サイズが一つしかないものがリストの先頭にあった時、ダイアログ表示された時に肉厚に何も入っておらずまた、リストにも何も表示されません。
他のサイズを選択した後なら表示されます。これを解消するにはどうすばいいのでしょうか?

②下記のようにSUSの場合、アングル種類が3つあります。最後のフォーミングアングルを選択するとダイアログが閉じてしまいます。
ダイアログの数に制限があるのでしょうか?

;; サイズと肉厚の対応表
(if (= stzai "SS")
(cond ((= ANGLEtype "等辺アングル")
(setq size-thickness-map
'(("20" "3.0") ("25" "3.0") ("30" "3.0" "5.0") ("40" "3.0" "5.0") ("50" "4.0" "6.0") ("60" "4.0" "5.0") ("65" "6.0" "8.0") ("75" "6.0" "9.0" "12.0") ("80" "6.0") ("90" "6.0" "7.0" "10.0" "13.0")
("100" "9.0" "12.0" "15.0") ("130" "12.0" "15.0" "19.0") ("150" "15.0" "20.0") ("200" "25.0"))))
((= ANGLEtype "不等辺アングル")
(setq size-thickness-map
'(("75x50" "6.0") ("90x75" "6.0" "9.0") ("100x75" "7.0" "10.0" "13.0") ("125x75" "7.0" "10.0" "13.0") ("125x90" "10.0") ("150x90" "9.0" "12.0") ("150x100" "9.0" "12.0" "15.0")))))
;;SUSの時
(cond ((= ANGLEtype "等辺アングル")
(setq size-thickness-map
'(("20" "3.0") ("25" "3.0") ("30" "3.0" "4.0" "5.0" "6.0") ("40" "3.0" "4.0" "5.0" "6.0") ("50" "3.0" "4.0" "5.0" "6.0" "8.0") ("60" "5.0" "6.0" "8.0" "9.0" "10.0") ("65" "5.0" "6.0" "8.0" "9.0" "10.0")
("90" "6.0" "8.0" "9.0" "10.0" "12.0") ("100" "6.0" "8.0" "9.0" "10.0" "12.0"))))
((= ANGLEtype "不等辺アングル")
(setq size-thickness-map
'(("45x30" "4.0★") ("50x30" "6.0★") ("65x50" "6.0★") ("75x50" "6.0" "7.0" "9.0★") ("75x65" "6.0★") ("90x75" "9.0★") ("100x75" "6.0" "7.0★" "9.0") ("125x75" "6.0" "9.0") ("150x90" "9.0" "12.0"))))
((= ANGLEtype "フォーミングアングル")
'(("15" "2.0") ("20" "2.0" "3.0") ("25" "2.0" "3.0") ("30" "2.0" "3.0") ("40" "2.0" "3.0") ("50" "3.0")))))
  • mappy
  • 2025/09/09 (Tue) 13:43:15
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
hamu様

度々すみません。
②の問題は解決しました。自分の記入ミスでした。
エラー: 引数のタイプが間違っています: consp nil このエラーメッセージの意味がやっとわかり解決に至りました。
大変失礼いたしました。
  • mappy
  • 2025/09/09 (Tue) 14:50:24
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
①肉厚サイズが一つしかないものがリストの先頭にあった時、ダイアログ表示された時に肉厚に何も入っておらずまた、リストにも何も表示されません。
他のサイズを選択した後なら表示されます。これを解消するにはどうすばいいのでしょうか?

前回のサイズを呼び出す時の処理に、リストの数をオーバーした場合の例外措置が無かったからみたいです。

それを踏まえて、アングルバージョンを作ってみました。

コードが長くなってきたので、デバッグが面倒です。エラーが有ったらゴメンナサイ。


Insert_ANGLE : dialog {
: popup_list {
key = "material_list";
label = "材 質";
width = 25;
}
: popup_list {
key = "type_list";
label = "形 状";
width = 25;
}
label = "角パイプ選択";
: popup_list {
key = "size_list";
label = "サイズ ";
width = 25;
}
: popup_list {
key = "thickness_list";
label = "肉 厚";
width = 25;
}
: spacer { height = 1; }
: button {
key = "draw_btn";
label = "作図";
is_default = true;
}
: button {
key = "cancel";
label = "キャンセル";
is_cancel = true;
}
}

(defun c:Insert_ANGLE ( / dcl_id size-list result ls ts Ssize Tsize fit filename ma Ta)
;; DCLファイルの読み込み
(setq dcl_id (load_dialog "Insert_ANGLE.dcl"))
(if (not (new_dialog "Insert_ANGLE" dcl_id))
(exit)
)

;;材質リストの作成
(start_list "material_list")
(mapcar 'add_list '("SS" "SUS"))
(end_list)

;; 前回選択された材質があれば、それを初期選択に
(if (not *last-material-a*) (setq *last-material-a* "0"))
(set_tile "material_list" *last-material-a*)


;タイプリストの作成

(defun update-Type-list ( / item)
(setq item
(if (eq *last-material-a* "0")
'("等辺アングル" "不等辺アングル")
'("等辺アングル" "不等辺アングル" "フォーミングアングル")
)
)
(start_list "type_list")
(mapcar 'add_list item)
(end_list)

;; 前回選択されたタイプがあれば、それを初期選択に
(if (not *last-Type-a*) (setq *last-Type-a* "0"))

(if (> (atoi *last-Type-a* ) (1- (length item)))
(progn (setq *last-Type-a* "0") (set_tile "type_list" "0"))
(set_tile "type_list" *last-Type-a*)
)
)

(update-Type-list)

;; サイズリストの作成
(defun update-size-list ()

;; サイズと肉厚の対応表
(setq *size-map-a*
(cond
((eq (strcat *last-material-a* *last-Type-a*) "00")
'(("20" "3.0") ("25" "3.0") ("30" "3.0" "5.0") ("40" "3.0" "5.0") ("50" "4.0" "6.0") ("60" "4.0" "5.0") ("65" "6.0" "8.0") ("75" "6.0" "9.0" "12.0") ("80" "6.0") ("90" "6.0" "7.0" "10.0" "13.0")
("100" "9.0" "12.0" "15.0") ("130" "12.0" "15.0" "19.0") ("150" "15.0" "20.0") ("200" "25.0"))
)
((eq (strcat *last-material-a* *last-Type-a*) "01")
'(("75x50" "6.0") ("90x75" "6.0" "9.0") ("100x75" "7.0" "10.0" "13.0") ("125x75" "7.0" "10.0" "13.0") ("125x90" "10.0") ("150x90" "9.0" "12.0") ("150x100" "9.0" "12.0" "15.0"))
)
((eq (strcat *last-material-a* *last-Type-a*) "10")
'(("20" "3.0") ("25" "3.0") ("30" "3.0" "4.0" "5.0" "6.0") ("40" "3.0" "4.0" "5.0" "6.0") ("50" "3.0" "4.0" "5.0" "6.0" "8.0") ("60" "5.0" "6.0" "8.0" "9.0" "10.0") ("65" "5.0" "6.0" "8.0" "9.0" "10.0")
("90" "6.0" "8.0" "9.0" "10.0" "12.0") ("100" "6.0" "8.0" "9.0" "10.0" "12.0"))
)
((eq (strcat *last-material-a* *last-Type-a*) "11")
'(("45x30" "4.0★") ("50x30" "6.0★") ("65x50" "6.0★") ("75x50" "6.0" "7.0" "9.0★") ("75x65" "6.0★") ("90x75" "9.0★") ("100x75" "6.0" "7.0★" "9.0") ("125x75" "6.0" "9.0") ("150x90" "9.0" "12.0"))
)
((eq (strcat *last-material-a* *last-Type-a*) "12")
'(("15" "2.0") ("20" "2.0" "3.0") ("25" "2.0" "3.0") ("30" "2.0" "3.0") ("40" "2.0" "3.0") ("50" "3.0"))
)
)
)

(setq size-list (mapcar 'car *size-map-a*))
(start_list "size_list")
(mapcar 'add_list size-list)
(end_list)

;; 前回選択されたサイズがあれば、それを初期選択に
(if (not *last-size-a*) (setq *last-size-a* "0"))

(if (> (atoi *last-size-a* ) (1- (length size-list)))
(progn (setq *last-size-a* "0") (set_tile "size_list" "0"))
(set_tile "size_list" *last-size-a*)
)

)

(update-size-list)


;; インデックス取得関数
(defun get-index (item lst / idx found)
(setq idx 0 found nil)
(while (and lst (not found))
(if (= item (car lst))
(setq found t)
(setq idx (1+ idx) lst (cdr lst))
)
)
(if found idx nil)
)


;; 肉厚リスト更新関数
(defun update-thickness-list (/ thickness-list)
(setq thickness-list (cdr (nth (atoi *last-size-a*) *size-map-a*)))

(start_list "thickness_list")
(mapcar 'add_list thickness-list)
(end_list)

;; 前回選択された肉厚があれば、それを初期選択に
(if (not *last-Tsize-a*) (setq *last-Tsize-a* "0"))

(if (> (atoi *last-Tsize-a* ) (1- (length thickness-list)))
(progn (setq *last-Tsize-a* "0") (set_tile "thickness_list" "0"))
(set_tile "thickness_list" *last-Tsize-a*)
)
)

;; 初期肉厚リスト設定
(update-thickness-list)


;; 材質変更時のコールバック
(defun CB_ml ()
(setq *last-material-a* (get_tile "material_list"))
(update-Type-list)
(update-size-list)
(update-thickness-list)
)

(action_tile "material_list" "(CB_ml)")

;; タイプ変更時のコールバック
(defun CB_tyl ()
(setq *last-Type-a* (get_tile "type_list"))
(update-size-list)
(update-thickness-list)
)

(action_tile "type_list" "(CB_tyl)")

;; サイズ変更時のコールバック
(defun CB_sl ()
(setq *last-size-a* (get_tile "size_list"))
(update-thickness-list)
)

(action_tile "size_list" "(CB_sl)")

;; 肉厚選択時のコールバック
(defun CB_tl ()
(setq *last-Tsize-a* (get_tile "thickness_list"))
)


(action_tile "thickness_list" "(CB_tl)")

;; 作図ボタン
(action_tile "draw_btn"
"(done_dialog 1)"
)

;; キャンセル
(action_tile "cancel"
"(done_dialog 0)"
)

;; ダイアログ表示
(setq result (start_dialog))
(unload_dialog dcl_id)

;; 実行処理
(if (= result 1)
(progn
(setq ma (if (eq *last-material-a* "0") " SS" " SUS"))
(setq Ta (nth (atoi *last-type-a*) '("等辺アングル" "不等辺アングル" "フォーミングアングル")))
(setq ls (car (nth (atoi *last-size-a*) *size-map-a*)))
(setq Ssize (strcat "L" ls))
(setq ts (nth (atoi *last-Tsize-a*) (cdr (nth (atoi *last-size-a*) *size-map-a*))))
(setq Tsize (strcat "t" ts))
(setq fit (strcat Ssize "x" Tsize))
(setq filename (strcat Ta "\n" fit ma))

(my_insert_block_rotateOK filename)
)
)
(princ)
)



(defun my_insert_block_rotateOK (filename)
;ここの処理は適当に作ってます。実際の処理に書き換えて下さい。
(alert filename)
)


  • Hamu
  • 2025/09/09 (Tue) 18:24:51
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
Hamu様

ありがとうございます。
早速アングル以外のものにも試してみました。

色々試していたら返信遅くなってしまいました。すみません。


因みに、(コードが長くなるので)共通のコードは(defun ... ())として該当の箇所に(...)と入れることはできないのでしょうか?
(やってみたらできませんでした)
  • mappy
  • 2025/09/10 (Wed) 14:05:22
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
出来ないという事は、どこかが間違っているからです。

どこを共通にしているのか判りませんが、
共用したいルーチン(defun ... ())はグローバルの位置に配置して下さい。
私が作っているサブルーチンを真似ているのならダメです。
(サブルーチンがローカルになっているから、未使用の場合、他のルーチンからはアクセスできない)
それから、ルーチン内で使用している変数は、サブルーチン化すると変数の受け渡しが必要になります。

※又はグローバル変数に変更する事でも回避できますが、処理が面倒です。
例えば、角パイプとアングルで共通のルーチンを使用するとします。
そのルーチンで使用する変数をグローバル変数にしたら、思わぬエラーが出ます。
サイズや肉厚を前回使用時の物を復元する工程で、先に角パイプを挿入した後、
次に、アングルを挿入した時、前回のサイズや肉厚は、角パイプを挿入したときの物が適用されます。
グローバル変数で共用しているからです。

前回の選択を復元する。という機能を無くしてしまえば問題は無くなりますが、
それが欲しいなら工夫が必要です。

という事で、できるだけグローバル変数は使用しない方が良いです。


(コードが長くなるので)これが理由なら、共用ルーチンを作る事で、コードがスッキリしますが、
それにより処理が速くなることは無いです。
共用することでエラーが出るなら、共用しない方が良いと思います。
  • Hamu
  • 2025/09/10 (Wed) 15:29:35
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
先のlispの最後の部分

(setq filename (strcat Ta "\n" fit ma))

(my_insert_block_rotateOK filename)
)
)
(princ)
)


(defun my_insert_block_rotateOK (filename)
;ここの処理は適当に作ってます。実際の処理に書き換えて下さい。
(alert filename)
)

ここでは、「filename」という変数を受け渡しています。
この受け渡しを省略して

(setq filename (strcat Ta "\n" fit ma))

(my_insert_block_rotateOK)
)
)
(princ)
)


(defun my_insert_block_rotateOK ()
;ここの処理は適当に作ってます。実際の処理に書き換えて下さい。
(alert filename)
)

とすると、(alert filename)でファイル名は表示されません。
filenameの内容が送られて来ないから。


  • Hamu
  • 2025/09/10 (Wed) 15:48:55
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
Hamu様

>(コードが長くなるので)これが理由なら、共用ルーチンを作る事で、コードがスッキリしますが、それにより処理が速くなることは無いです。
共用することでエラーが出るなら、共用しない方が良いと思います。

それならやらない方がいいですね。既に難しすぎていっぱいいっぱいだから余計にです。
説明文を読んでも???です。


>「filename」という変数を受け渡しています。この受け渡しを省略して...

やってみたのですが、エラーが出ました。
わかっていない人があまり余計なことしないほうがいいと思ったので元に戻しました。

色々とありがとうございました。
  • mappy
  • 2025/09/10 (Wed) 16:34:45
Re: 右クリックで再選択、リストに無い時はエラーメッセージ表示
LUNE様

報告させていだだきます。
ご紹介いただいたVisual Studio Codeをとても便利に使わせていただいております。
こんな便利なものがあったのですね。
デバックについては勉強中です。(デバックした後の処理を勉強中です。)

ありがとうございました。
  • mappy
  • 2025/09/11 (Thu) 08:54:16

返信フォーム






プレビュー (投稿前に内容を確認)