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

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

SGP配管と塩ビ配管で引数を変えたい
いつもお世話になっております。

配管の側面(両側中心振分オフセット)をLispで作成しております。
SGPと塩ビでは口径の呼びが違うため、それぞれ違う引数を使いたいのですが(SGPはPsize 塩ビはVPsize)Psizeはできても塩ビ用にVPsizeに設定することができません。
どのようにすればいいのかわからず困っております。
ご教授いただけないでしょうか?

使用CAD:AutoCAD2025

SGP用Lisp
(defun c:get_my_SGPsize ()
(setq LUP (getvar "LUPREC"));長さ小数点取得
(setvar "LUPREC" 1);長さ小数点以下0桁に設定 ダイナミック入力時の表示
(initget "6 8 10 15 20 25 32 40 50 65 80 100 125 150 200 250 300 350 400 450 500")
(setq Psize (getkword (strcat "\nSGP配管口径を選択または入力 繰り返しは【ENTERまたは右クリック】 <" *last-Psize* ">:[6/8/10/15/20/25/32/40/50/65/80/100/125/150/200/250/300/350/450/500] ")))
(if (not Psize)
(setq Psize *last-Psize*)
)
(setq *last-Psize* Psize)
(command "offsetdist" Psize)
(setq dist (getvar "offsetdist"))
(setq dist (rtos dist));実数を文字列に変換
(cond ((= dist "6")(setq dist "10.5"))
((= dist "8")(setq dist "13.8"))
((= dist "10")(setq dist "17.3"))
((= dist "15")(setq dist "21.7"))
((= dist "20")(setq dist "27.2"))
((= dist "25")(setq dist "34"))
((= dist "32")(setq dist "42.7"))
((= dist "40")(setq dist "48.6"))
((= dist "50")(setq dist "60.5"))
((= dist "65")(setq dist "76.3"))
((= dist "80")(setq dist "89.1"))
((= dist "100")(setq dist "114.3"))
((= dist "125")(setq dist "139.8"))
((= dist "150")(setq dist "165.2"))
((= dist "200")(setq dist "216.3"))
((= dist "250")(setq dist "267.4"))
((= dist "300")(setq dist "318.5"))
((= dist "350")(setq dist "355.6"))
((= dist "400")(setq dist "406.4"))
((= dist "450")(setq dist "457.2"))
((= dist "500")(setq dist "508"))
((= dist "")(setq dist ""))
(t)
)
(setq dist (atof dist));文字列を実数に変換
(setq dist (/ dist 2 ))
(command "offsetdist" dist)
(if (and
(setq PT1 (getpoint "1点目を指示\n")) ;現在のUCSで表された3D点が返る;
(setq PT2 (getpoint PT1 "2点目を指示または数値入力\n")) ;現在のUCSで表された3D点が返る;
(setq ang (* (/ (angle PT1 PT2) pi) 180)) ;角度をラジアンから度数に変換
)
(progn;複数の()を使うための関数
(command "LINE" PT1 PT2 "" "select" "L" "" "offset" dist "@" "@" "" "erase" "P" "" )
(command "._offset" (* 2 dist) (entlast) "@" "" )
(command "offsetdist" (* 2 dist))
);prognの閉じカッコ
);if関数の終わりのカッコ
(setvar "LUPREC" LUP)
);defun



塩ビ用Lisp
(defun c:get_my_VPsize ()
(setq LUP (getvar "LUPREC"));長さ小数点取得
(setvar "LUPREC" 1);長さ小数点以下0桁に設定 ダイナミック入力時の表示
(initget "13 16 20 25 30 40 50 65 75 100 125 150")
(setq VPsize (getkword (strcat "\n塩ビ配管口径を選択または入力 繰り返しは【ENTERまたは右クリック】<" *last-VPsize* ">:[13/16/20/25/30/40/50/65/75/100/125/150] ")))
(if (not VPsize)
(setq VPsize *last-VPsize*)
)
(setq *last-VPsize* VPsize)
(command "offsetdist" VPsize)
(setq dist (getvar "offsetdist"))
(setq dist (rtos dist));実数を文字列に変換

(cond ((= dist "13")(setq dist "18"))
((= dist "16")(setq dist "22"))
((= dist "20")(setq dist "26"))
((= dist "25")(setq dist "32"))
((= dist "30")(setq dist "38"))
((= dist "40")(setq dist "48"))
((= dist "50")(setq dist "60"))
((= dist "65")(setq dist "76"))
((= dist "75")(setq dist "89"))
((= dist "100")(setq dist "114"))
((= dist "125")(setq dist "140"))
((= dist "150")(setq dist "165"))
((= dist "")(setq dist ""))
(t)
)
(setq dist (atof dist));文字列を実数に変換
(setq dist (/ dist 2 ))
(command "offsetdist" dist)
(if (and
(setq PT1 (getpoint "1点目を指示\n")) ;現在のUCSで表された3D点が返る;
(setq PT2 (getpoint PT1 "2点目を指示または数値入力\n")) ;現在のUCSで表された3D点が返る;
(setq ang (* (/ (angle PT1 PT2) pi) 180)) ;角度をラジアンから度数に変換
)
(progn;複数の()を使うための関数
(command "LINE" PT1 PT2 "" "select" "L" "" "offset" dist "@" "@" "" "erase" "P" "" )
(command "._offset" (* 2 dist) (entlast) "@" "" )
(command "offsetdist" (* 2 dist))
);prognの閉じカッコ
);if関数の終わりのカッコ
(setvar "LUPREC" LUP)
);defun



塩ビを実行した時のコマンドの流れです。
._UNDO 現在の設定: 自動 = オン, コントロール = すべて, 合成 = はい, 画層 = はい
取り消す操作の数を入力 または [自動(A)/コントロール(C)/開始(BE)/終了(E)/マーク(M)/後退(B)] <1>: _E ._UNDO 現在の設定: 自動 = オン, コントロール = すべて, 合成 = はい, 画層 = はい
取り消す操作の数を入力 または [自動(A)/コントロール(C)/開始(BE)/終了(E)/マーク(M)/後退(B)] <1>: 1 APPLOAD ***MyERR***: 引数のタイプが間違っています: stringp nil





  • mappy
  • 2025/07/16 (Wed) 12:56:04
Re: SGP配管と塩ビ配管で引数を変えたい
>塩ビを実行した時のコマンドの流れです。
いきなり、UNDOコマンドが出てきてますから、lispの登録が間違ってたりするのでは?

全角スペースが入ってた所が有ったので、それを削除して、
私好みに、こんな感じに書き直してみた。

塩ビ用Lisp
(defun c:get_my_VPsize ( / LUP VPsize size_list dist_list index dist PT1 PT2);他のlispと干渉しない様に*last-VPsize*以外は本lisp内の変数とする。
(vl-load-com);vl関数つかいます。

(setq LUP (getvar "LUPREC"));長さ小数点取得
(setvar "LUPREC" 1);長さ小数点以下0桁に設定 ダイナミック入力時の表示

(if (not *last-VPsize*) (setq *last-VPsize* "50"));初回使用時にnilにならない様に初期値を50に設定

(initget "13 16 20 25 30 40 50 65 75 100 125 150")
(setq VPsize (getkword (strcat "\n塩ビ配管口径を選択または入力 繰り返しは【ENTERまたは右クリック】<" *last-VPsize* ">[13/16/20/25/30/40/50/65/75/100/125/150]: ")))

(if VPsize
(setq *last-VPsize* VPsize);getkwordでサイズが入力されたら
(setq VPsize *last-VPsize*);getkwordでENTERが押されたら
)

(setq size_list '(13 16 20 25 30 40 50 65 75 100 125 150));サイズの種類を登録。
(setq dist_list '(18.0 22.0 26.0 32.0 38.0 48.0 60.0 76.0 89.0 114.0 140.0 165.0));外径寸法を登録。 .0を付けて、実数として登録する方が良いと思います。(整数と実数を混ぜて計算すると、機械のくせに時々間違う事が有る。)

(setq index (vl-position (atoi VPsize) size_list));getkwordで入力された値は、size_listの何番目?
(setq dist (nth index dist_list));dist_listから、同じ番目の値を取得

(if (and
(setq PT1 (getpoint "1点目を指示\n")) ;現在のUCSで表された3D点が返る;
(setq PT2 (getpoint PT1 "2点目を指示または数値入力\n")) ;現在のUCSで表された3D点が返る;
)

(progn
(command "LINE" "non" PT1 "non" PT2 "");オブジェクトスナップに引っ張られない様に"non"追加
(command ".pselect" "L" "" "offset" (* 0.5 dist) "@" "" "erase" "P" "" );オフセットで近くにある別の線を拾わない様に、確実に今書いた線を選択するために".pselect" "L"
(command ".pselect" "L" "" "offset" dist PT2 "" );オフセットで近くにある別の線を拾わない様に、確実に今オフセットした線を選択する為に.pselect" "L"
);prognの閉じカッコ
);if関数の終わりのカッコ
(setvar "LUPREC" LUP)
(princ)
);defun
  • Hamu
  • 2025/07/16 (Wed) 15:42:05
Re: SGP配管と塩ビ配管で引数を変えたい
Gemini 2.5 Pro さんの回答例。

問:
autolispでsgp管と塩ビ管の正面図を作成するコードを書きたい。口径はユーザー入力としたい。
(追加条件)外形線は必ず実線。中心線は必ず一点鎖線になるようにしてください。

解:
;; SGP管と塩ビ管(VP)の正面図を作成するAutoLISPプログラム
;; コマンド名: PIPEFRONT
;; [修正版] 線種を確実に設定

(defun C:PIPEFRONT ( / pipe_type dia_nominal dims od id cp cross_size p_up p_down p_left p_right clayer cltype)

; (寸法リストの定義は前回と同じ)
(setq sgp_dims
'(
(15 21.7 16.1) (20 27.2 21.6) (25 34.0 27.6) (32 42.7 35.7) (40 48.6 41.6)
(50 60.5 52.9) (65 76.3 67.9) (80 89.1 80.7) (100 114.3 105.3) (125 139.8 129.6) (150 165.2 155.0)
)
)
(setq vp_dims
'(
(13 18 13.0) (16 22 16.0) (20 26 20.0) (25 32 25.0) (30 38 31.0) (40 48 40.0) (50 60 50.0)
(65 76 64.0) (75 89 76.0) (100 114 97.0) (125 140 120.0) (150 165 140.0)
)
)

; (ユーザー入力部分は前回と同じ)
(initget 1 "SGP VP")
(setq pipe_type (getkword "\n管種を選択してください [SGP/VP]: "))
(setq dims nil)
(while (not dims)
(cond
((= pipe_type "SGP")
(princ "\nSGP管の呼び径(A)を入力 [15,20,25,32,40,50,65,80,100,125,150]: ")
(setq dia_nominal (getint))
(setq dims (assoc dia_nominal sgp_dims))
)
((= pipe_type "VP")
(princ "\n塩ビ管(VP)の呼び径を入力 [13,16,20,25,30,40,50,65,75,100,125,150]: ")
(setq dia_nominal (getint))
(setq dims (assoc dia_nominal vp_dims))
)
)
(if (not dims) (princ "\n<!> 有効な呼び径ではありません。リストから選択して再入力してください。"))
)
(setq od (cadr dims))
(setq id (caddr dims))
(setq cp (getpoint "\n管の中心点を指定: "))

;----- 作図処理 -----
(if (and cp od id)
(progn
; ★現在の設定を保存
(setq clayer (getvar "CLAYER"))
(setq cltype (getvar "CELTYPE"))

; 1. 外形円と内形円を描画 (実線を指定)
(setvar "CELTYPE" "Continuous")
(command "_.CIRCLE" cp "_D" od)
(command "_.CIRCLE" cp "_D" id)

; 2. 中心十字線の描画 (一点鎖線を指定)
(if (not (tblsearch "LAYER" "CENTER"))
(command "_.LAYER" "_M" "CENTER" "_C" "1" "" "")
)
(if (not (tblsearch "LTYPE" "CENTER"))
(command "_.LINETYPE" "_LOAD" "CENTER" "ACAD.LIN" "")
)
(setvar "CLAYER" "CENTER")
(setvar "CELTYPE" "CENTER")
(setq cross_size (* od 1.25))
(setq p_up (polar cp (/ pi 2) (/ cross_size 2.0)))
(setq p_down (polar cp (* pi 1.5) (/ cross_size 2.0)))
(setq p_left (polar cp pi (/ cross_size 2.0)))
(setq p_right (polar cp 0.0 (/ cross_size 2.0)))
(command "_.LINE" p_up p_down "")
(command "_.LINE" p_left p_right "")

; ★設定を元に戻す
(setvar "CLAYER" clayer)
(setvar "CELTYPE" cltype)

(princ (strcat "\n✅ " pipe_type " " (if (= pipe_type "SGP") "A" "") (itoa dia_nominal) " の正面図を作成しました。"))
)
(princ "\n❌ 処理がキャンセルされました。")
)
(princ)
)
  • 極楽鳥
  • 2025/07/16 (Wed) 15:43:16
Re: SGP配管と塩ビ配管で引数を変えたい
引数のタイプが間違っています: stringp nil
このエラーは、変数 *last-VPsize* の最初の値が nil であるために発生するエラーだと思います。
nilは文字列型ではないので、strcatの引数にすることができません。

Psizeのほうでエラーが出なかったのは、作っていく段階で、先に (setq *last-Psize* Psize) のコードを実行し、そのあとにstrcatの部分を作ったので、その段階でnilではなかったからではないでしょうか。
対して、VPsizeは、Psizeのコードができた後で書き換えたのでしょうから、*last-VPsize*がnilのままなのだと思います。

なので、一度コマンドラインに
(setq *last-VPsize* "")
とでもすれば、エラーは出ないと思います。
  • LUNE
  • 2025/07/16 (Wed) 16:51:12
Re: SGP配管と塩ビ配管で引数を変えたい
Hamu様

いつもありがとうございます。
SGP用にコピペして2つとも試してみたところできました。
内容は難しくてなかなか理解できませんが・・・。
ありがとうございました。
  • mappy
  • 2025/07/16 (Wed) 16:55:38
Re: SGP配管と塩ビ配管で引数を変えたい
極楽鳥様

ありがとうございます。
まだ時間が無くて試せておりません。
明日返信させていただきたく思いますのでよろしくお願いします。
  • mappy
  • 2025/07/16 (Wed) 17:04:57
Re: SGP配管と塩ビ配管で引数を変えたい
LUNE様

いつもありがとうございます。
できました。
こんな単純なことだったんですね。
ありがとうございました。
  • mappy
  • 2025/07/16 (Wed) 17:06:05
Re: SGP配管と塩ビ配管で引数を変えたい
>内容は難しくてなかなか理解できませんが・・・

説明文を追加しました。
  • Hamu
  • 2025/07/16 (Wed) 17:28:33
Re: SGP配管と塩ビ配管で引数を変えたい
Hamu様

先程のコメントに返信忘れがありました。
> いきなり、UNDOコマンドが出てきてますから、lispの登録が間違ってたりするのでは?
こちらは自作のエラー処理が何かの拍子でおかしくなるようで、いろんなlispを書いて色々試しているうちにUNDOコマンドが出てきてしまうんです。

説明文ありがとうございました。
とてもわかりやすく、理解できました。
へぇ〜の連続でした。
  • mappy
  • 2025/07/16 (Wed) 19:22:21
Re: SGP配管と塩ビ配管で引数を変えたい
極楽鳥様

遅くなってしまいすみません。

Lispをアップロードしてもエラーメッセージは無いのになぜか『PIPEFRONT』はありませんとなってしまいました。
また、これは配管の正面を書くもののようで、側面に流用するのはなかなか難しいかなと思ってしまいました。

勉強不足ですみません。
  • mappy
  • 2025/07/17 (Thu) 16:56:38
Re: SGP配管と塩ビ配管で引数を変えたい
こちらの環境ではちゃんと動いているかのように見えるので
ちょっと原因のようなものは思い浮かびません。
関連があるかどうか分かりませんがAutoLispの文字コードを
UTF-8で保存してないとか?

側面を描くAutoLispは以下になります。
あまり検証はしてませんが何度が試した限りではそこそこ動きます。

;; SGP管と塩ビ管(VP)の側面図を作成するAutoLISPプログラム
;; コマンド名: PIPESIDE

(defun C:PIPESIDE ( / pipe_type dia_nominal od p1 p2 ang len p1a p2a p1b p2b clayer ltype)

; SGP管の呼び径と外径のリスト (呼び径A, 外径mm)
(setq sgp_dims
'(
(15 21.7) (20 27.2) (25 34.0) (32 42.7) (40 48.6)
(50 60.5) (65 76.3) (80 89.1) (100 114.3) (125 139.8) (150 165.2)
)
)

; 塩ビ管(VP)の呼び径と外径のリスト (呼び径, 外径mm)
(setq vp_dims
'(
(13 18) (16 22) (20 26) (25 32) (30 38) (40 48) (50 60)
(65 76) (75 89) (100 114) (125 140) (150 165)
)
)

;----- ユーザー入力 -----

; 1. 管種の選択
(initget 1 "SGP VP")
(setq pipe_type (getkword "\n管種を選択してください [SGP/VP]: "))

; 2. 口径の入力
(setq od nil)
(while (not od)
(cond
((= pipe_type "SGP")
(princ "\nSGP管の呼び径(A)を入力 [15,20,25,32,40,50,65,80,100,125,150]: ")
(setq dia_nominal (getint))
(setq od (cadr (assoc dia_nominal sgp_dims)))
)
((= pipe_type "VP")
(princ "\n塩ビ管(VP)の呼び径を入力 [13,16,20,25,30,40,50,65,75,100,125,150]: ")
(setq dia_nominal (getint))
(setq od (cadr (assoc dia_nominal vp_dims)))
)
)
(if (not od) (princ "\n<!> 有効な呼び径ではありません。リストから選択して再入力してください。"))
)

; 3. 始点と終点の指定
(setq p1 (getpoint "\n管の始点を指定: "))
(if p1
(setq p2 (getpoint p1 "\n管の終点を指定: "))
)

;----- 作図処理 -----
(if (and p1 p2 od)
(progn
; 角度と長さを計算
(setq ang (angle p1 p2))

; オフセット点を計算 (外径の半分だけ中心線からオフセット)
(setq p1a (polar p1 (+ ang (/ pi 2)) (/ od 2.0)))
(setq p2a (polar p2 (+ ang (/ pi 2)) (/ od 2.0)))
(setq p1b (polar p1 (- ang (/ pi 2)) (/ od 2.0)))
(setq p2b (polar p2 (- ang (/ pi 2)) (/ od 2.0)))

;---- 描画コマンドの実行 ----
(setq clayer (getvar "CLAYER")) ; 現在の画層を保存

; 1. 外形線と端面線の描画
(command "_.LINE" p1a p2a "")
(command "_.LINE" p1b p2b "")
(command "_.LINE" p1a p1b "")
(command "_.LINE" p2a p2b "")

; 2. 中心線の描画 (画層: CENTER, 線種: CENTER, 色: Red)
; 画層 "CENTER" がなければ作成
(if (not (tblsearch "LAYER" "CENTER"))
(command "_.LAYER" "_M" "CENTER" "_C" "1" "" "")
)
; 線種 "CENTER" がロードされていなければロード
(if (not (tblsearch "LTYPE" "CENTER"))
(command "_.LINETYPE" "_LOAD" "CENTER" "ACAD.LIN" "")
)
(command "_.CHPROP" (entlast) "" "_LA" "CENTER" "")

(setvar "CLAYER" "CENTER") ; 画層を "CENTER" に変更
(command "_.LINETYPE" "_S" "CENTER" "") ; 線種をCENTERに設定
(command "_.LINE" p1 p2 "") ; 中心線を描画
(setvar "CLAYER" clayer) ; 画層を元に戻す

(princ (strcat "\n✅ " pipe_type " " (if (= pipe_type "SGP") "A" "") (itoa dia_nominal) " (外径 " (rtos od 2 2) "mm) の側面図を作成しました。"))
)
(princ "\n❌ 処理がキャンセルされました。")
)
(princ) ; コマンド終了時のnil表示を抑制
)
  • 極楽鳥
  • 2025/07/17 (Thu) 22:41:33
Re: SGP配管と塩ビ配管で引数を変えたい
極楽鳥様

改造ありがとうございました。
動きました。
これを弊社用に改造したいと思います。

多分UTF-8で保存していなかったことが原因のようです。
いつも文字コードは気にせず『日本語(Shift-JIS)』で保存してました。
  • mappy
  • 2025/07/18 (Fri) 12:42:04 New
Re: SGP配管と塩ビ配管で引数を変えたい
動いて何よりです。

生成AIで生成されたこのコード、どういう訳か2箇所に絵文字を使用しているので、
ファイルに保存するときの文字コードは UTF-8 と判断しました。
  • 極楽鳥
  • 2025/07/18 (Fri) 16:26:20 New

返信フォーム






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