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

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

クリンプナット穴引出線記入LISP
いつもお世話になっております。


前回から質問させていただいておりましたものをクリンプナット用に変更したところ、エラーになってしまうようになりました。
kiridiaの値がうまくいっていないことはわかるのですが、これをどのように修正したらいいのかがわからず困っております。
ご教授いただけないでしょうか?
よろしくお願いします。

使用CAD:AutoCAD2025


Lispの内容です。

(defun c:CLNUT ( / ent obj dia Diameter sets hole lengs units kiridia)
(while
(setq sets (getstring "セット数:")) ;穴セット数
(if (not (= sets ""))
(setq sets (strcat sets "x" ))
);if
(setq hole (getstring "穴の数:")) ;穴の数
(if (not (= hole ""))
(setq hole (strcat hole "-" ))
);if
(setq lengs (getstring "ボルト長さ:")) ;ボルト長さ
(if (not (= lengs ""))
(setq lengs (strcat "-" lengs "L" ))
);if
;ボルトセット種類
(setq units (getstring "B,N,PW,SWのセットは?:")) ;B,N,PW,SW種類
(if (not (= units ""))
(setq units (strcat " " units ))
);if

;ここから作図
(setq ent (nentsel "\n円を選択してください: "))
(setq obj (vlax-ename->vla-object (car ent)))
(if (eq (vla-get-ObjectName obj) "AcDbCircle")
(progn
(setq dia (vla-get-Diameter obj))
(cond
((= (atof dia) 5.1)(setq kiridia "M3"))
((= (atof dia) 6.1)(setq kiridia "M4"))
((= (atof dia) 7.1)(setq kiridia "M5"))
((= (atof dia) 9.1)(setq kiridia "M6"))
((= (atof dia) 11.1)(setq kiridia "M8"))
((= (atof dia) 13.1)(setq kiridia "M10"))
(T )
);cond
(setq Diameter (strcat sets hole "φ" (rtos dia) "\n" kiridia lengs units " クリンプナット"))
(command "_mleader" "nea" (cadr ent) pause pause Diameter)
);progn
(alert "選択したオブジェクトは円ではありません。")
);if
);while
(princ)
);defun





コマンドの流れです。

コマンド: _CLNUT セット数:
穴の数:
ボルト長さ:
B,N,PW,SWのセットは?:
円を選択してください: ; エラー: 引数のタイプが間違っています: stringp 11.1
コマンド:
  • mappy
  • 2025/05/21 (Wed) 09:41:57
Re: クリンプナット穴引出線記入LISP
試してないですけど、おそらく vla-get-Diameter で取得できる値が、文字列ではないのでは?
円の直径のプロパティなので、ActiveXのDiameter プロパティを見ると、「倍精度浮動小数点数型」とあるので、数値なのだと思われます。
なので、 (atof dia) の部分でエラーが出ているのではないでしょうか。
atofは不要なのでは?
  • LUNE
  • 2025/05/21 (Wed) 10:50:38
Re: クリンプナット穴引出線記入LISP
LUNE様

ご回答ありがとうございます。

ご指摘の場所に何も入れないでdiaだけにすると
引数のタイプが間違っています null
となってしまいます。

diaの前に文字タイプの変換を入れるとエラーメッセージで数値を取得してくれるからこの辺が問題かと思ったのですがやはり違うんですね。

5.1 11.1 13.1 などの数値の方に問題あるのでしょうか?

よろしくお願いします。

  • mappy
  • 2025/05/21 (Wed) 20:10:20
Re: クリンプナット穴引出線記入LISP
私の環境で、
(cond
((= dia 5.1)(setq kiridia "M3"))
((= dia 6.1)(setq kiridia "M4"))
((= dia 7.1)(setq kiridia "M5"))
((= dia 9.1)(setq kiridia "M6"))
((= dia 11.1)(setq kiridia "M8"))
((= dia 13.1)(setq kiridia "M10"))
(T )
);cond
とすると、ちゃんと動きますが・・・
  • LUNE
  • 2025/05/22 (Thu) 11:42:16
Re: クリンプナット穴引出線記入LISP
LUNE様

ご確認ありがとうございます。

残念ながら私の方は

コマンド: _CLNUT セット数:
穴の数:
ボルト長さ:
B,N,PW,SWのセットは?:
円を選択してください: ; エラー: 引数のタイプが間違っています: stringp nil
コマンド:

このようになってしまいます。

他の方法でできないか考えます。
ありがとうございました。
  • mappy
  • 2025/05/22 (Thu) 12:47:01
Re: クリンプナット穴引出線記入LISP
デバッグで、エラー箇所が cond内での比較部分だと特定できていますか?
Visual Studio Codeでステップ実行してみて、それぞれの変数に意図した値が入っていますか?

  • LUNE
  • 2025/05/22 (Thu) 12:54:28
Re: クリンプナット穴引出線記入LISP
円の径に微妙な端数が付いている可能性も考えて、

(cond
((= (rtos dia 2 1) "5.1")(setq kiridia "M3"))
((= (rtos dia 2 1) "6.1")(setq kiridia "M4"))
((= (rtos dia 2 1) "7.1")(setq kiridia "M5"))
((= (rtos dia 2 1) "9.1")(setq kiridia "M6"))
((= (rtos dia 2 1) "11.1")(setq kiridia "M8"))
((= (rtos dia 2 1) "13.1")(setq kiridia "M10"))
(T (setq kiridia "不明"))
);cond
  • Hamu
  • 2025/05/22 (Thu) 13:08:03
Re: クリンプナット穴引出線記入LISP
LUNE様

Visual Studio Codeで意図した値が入っているかの確認はしておりませんが、これと全く同じコードで diaの値が整数のものだとうまく動いているので小数点が問題だと思っておりました。
まだ確認はできておりませんので後ほど確認してみたいと思います。

ありがとうございました。
  • mappy
  • 2025/05/22 (Thu) 13:49:49
Re: クリンプナット穴引出線記入LISP
Hamu様

ありがとうございます。

うまく動きました。
  • mappy
  • 2025/05/22 (Thu) 13:51:24

返信フォーム






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