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

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

RENAME LISPの修正
お世話になります。
拾ってきたRENAMEのAutoCADのLISPなのですが、変更前のレイヤ名と変更後のレイヤ名を固定の文字列で自動で入力したいのですが
変更できるのでしょうか。
やりたいことは、レイヤ名に一部AAが含まれるのをBBに変更したい(例)です。
AutoCADでは名前修正後に同じ名前があると変更できない(同じ名前がありますで終わってしまいます)のでそれを回避したく見つけてきました。
単に2回入力すればいいだけですが、図面枚数が多くなると結構時間がかかるのでお願いでしないでしょうか。
よろしくお願いいたします。

以下LISPの記述です。


(vl-load-com)

(defun c:NRENAME (/ *error* old new acDoc oLayers i oldName newName)

(defun *error* (msg)
(if acDoc (vla-endundomark acDoc))
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** "))) ; Fatal error, display it
)
(princ)
)

(if (and (setq old (getstring T "変更前のレイヤ名"))
(setq new (getstring T "変更後のレイヤ名"))
)
(progn
(vla-startundomark
(setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
)
(setq oLayers (vla-get-layers acDoc))
(setq i 0)
(vlax-for x oLayers
(if (vl-string-search old (setq oldName (vla-get-name x)))
(if
(tblsearch "layer"
(setq newName (vl-string-subst new old oldName)) ; single replacement only
)
(prompt
(strcat
"\nLayer \"" newName "\" already exists. "
"Move all objects, then delete layer \"" oldName "\" "
)
)
(progn
(vla-put-name x newName)
(setq i (1+ i))
)
)
)
)
(prompt
(strcat "\n" (itoa i) " layer" (if (= 1 i) "s " " ") "renamed. ")
)
)
)

(*error* nil)
)

  • ひめ
  • 2024/04/10 (Wed) 12:07:02
Re: RENAME LISPの修正
お示しのLispは、レイヤ名の置換を行うものですね。

>レイヤ名に一部AAが含まれるのをBBに変更したい
のであれば、

(if (and (setq old (getstring T "変更前のレイヤ名"))
(setq new (getstring T "変更後のレイヤ名"))

(if (and (setq old "AA")
(setq new "BB")

と変更します。

>AutoCADでは名前修正後に同じ名前があると変更できない(同じ名前がありますで終わってしまいます)のでそれを回避したく見つけてきました。
とのことですが、このLispでも、変更後のレイヤ名と同じレイヤ名があった場合は、

Layer "BB-02" already exists. Move all objects, then delete layer "AA-02"
上記のようなメッセージが表示され、変更されませんが、いいのでしょうか?




  • LUNE
  • 2024/04/10 (Wed) 13:20:16
Re: RENAME LISPの修正
LUNE様
ありがとうございます。
やってみました。
バッチリです。

>とのことですが、このLispでも、変更後のレイヤ名と同じレイヤ名があった場合は、

Layer "BB-02" already exists. Move all objects, then delete layer "AA-02"
上記のようなメッセージが表示され、変更されませんが、いいのでしょうか?

AutoCADのRENAMEはリネームして同じレイヤ名になる場合は、同じレイヤ名になるもの以外も変更してくれません。
同じレイヤ名になるものは無視してほしいのですが・・・
自分の操作が変なのですかね。
  • ひめ
  • 2024/04/10 (Wed) 13:37:59
Re: RENAME LISPの修正
>AutoCADのRENAMEはリネームして同じレイヤ名になる場合は、同じレイヤ名になるもの以外も変更してくれません。

なるほど、RENAMEコマンドで複数の変更を行う際、重複する変更をしてしまうと、それまでの変更が無効になってしまう仕様ですね。
最後の変更をなかったことにしてはくれないみたいで・・・
たしかに、それ以外は変更してほしいですよね。
  • LUNE
  • 2024/04/10 (Wed) 13:50:16
Re: RENAME LISPの修正
重複すると”同じレイヤ名があります。****は変更されませんでした。”でいいのになんでこの仕様にしたのか疑問です。
ちなみに、ワイルドカードマッチに対応してないので、変更したいレイヤの1つのレイヤに対して同じものが複数ある場合(例AA12-34AA)は両方変更されるので
もし使う人がいたら注意が必要です。
  • ひめ
  • 2024/04/10 (Wed) 14:07:20

返信フォーム






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