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

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

矢印記号変更について
AutoCAD 2026を使用しています。
寸法線の矢印(30度開矢印)を片方だけ黒丸にAutoLISPで変更したいのですが
どのようにするのでしょうか。

(setq obj (ssget))
(setq ent (entget (ssname obj 0)))

上の2行で何やらデータがでてくるのですが
ここからわかりません。
ご存じの方いらっしゃいましたら教えて下さい。
お願いします。
  • しんちゃん
  • 2025/12/06 (Sat) 14:12:46
Re: 矢印記号変更について
寸法矢印の設定は、entgetで取得できるオブジェクトデータだけではちょっと難しいです。

以前談話室で教えてもらったのですが、(以下要約)

オブジェクトデータの拡張データを確認
そこに(1070 . 343)が無ければ、そのオブジェクトは両端の矢印は寸法スタイルに従っている
寸法スタイル設定から変更している場合は、(1070 . 343)(1070 . 344)が存在し、それぞれの後に続く、(1005 . 図形名)が矢印ブロック
どちらか片方だけ変更している場合でも、(1070 . 343)(1070 . 344)の両方が発生する
格納されているのは図形名なので改めてブロック名を取得する必要あり

拡張データに上記がない場合は、オブジェクトデータから寸法スタイルを確認して、その寸法スタイルテーブルを検索して寸法スタイルの中身を確認
dxfコードの342が存在したら両端共同じ矢印
342が存在せず343,344が存在するなら、矢印1が343、矢印2が344
342,343,345に格納されているのは図形名なので、(cdr (assoc 2 (entget 図形名)))で矢印のブロック名が取得できる


というわけで、
https://totthi.bbs.fc2bbs.net/?act=reply&tid=16929687#24917491
こちらの投稿で作成した、矢印の表示・非表示をちょっと変更してみました。
クリックした側の寸法線の矢印が30度開矢印の場合だけ、黒丸に変更します。

(defun C:BLKOTD () (BLKTGLSEL))

(defun BLKTGLSEL (/ obj objName objData pickPoint)
(graphscr)
(while (setq obj (entsel))
(setq objName (car obj)
objData (entget objName '("ACAD"))
pickPoint (cadr obj)
)
(if (equal "DIMENSION" (cdr (assoc 0 objData)))
(BLKOPNTODOT objName objData pickPoint)
)
)
)

(defun BLKOPNTODOT (objName objData pickPoint /
distance1 distance2 side t_blk)
(setq distance1 (distance pickPoint (cdr (assoc 10 objData)))
distance2 (/ (cdr (assoc 42 objData)) 2)
)

(setq side '("Arrowhead2Type" "Arrowhead1Type"))
(if (> distance1 distance2)
(setq side (reverse side))
)

(setq t_blk (getpropertyvalue objName (car side)))

(if (eq t_blk "_Open30")
(setpropertyvalue objName (car side) "_Dot")
)
)

「片方だけ黒丸にしたい」というのが、常に矢印1側であるとかなら、その旨返信してください。
  • LUNE
  • 2025/12/08 (Mon) 09:37:01
Re: 矢印記号変更について
LUNEさんお返事ありがとうございます。
拡張データ。。。
何やら難しそうです。
行いたいのは片方の矢印だけ●にしたいです。
矢印1を●にしてみて、確認して
反対側だったら矢印に戻して
反対側を●にする動作を考えています。
  • しんちゃん
  • 2025/12/08 (Mon) 12:47:45
Re: 矢印記号変更について
entgetからの拡張データ取得では、上記に書いたようにかなり面倒なので、getpropertyvalue と setpropertyvalue を使って、クリックした側の矢印を変更するLispを上記の返信に記入しています。
それではダメでしょうか?
  • LUNE
  • 2025/12/08 (Mon) 15:29:36
Re: 矢印記号変更について
これでどうでしょう?
1.寸法選択(複数可)
2. 選択確定と同時に、矢印1=黒丸 矢印2=30度開 になる。(これで良ければ、左クリック or Escで終了)
3. 右クリック or Enter をするたびに、
 矢印1=30度開 矢印2=黒丸
 矢印1=黒丸 矢印2=黒丸
 矢印1=30度開 矢印2=30度開
 矢印1=黒丸 矢印2=30度開
 とローテーションしていくので、適当な時に左クリック or Escで終了

(defun C:kuro_open30 ( / ss int)
(princ "\n変更する寸法を選択:")

(setq ss (ssget '((0 . "dimension"))))
(setq int 0)
(while ss
(cond
((= int 0) (command "undo" "be" "dimoverride" "dimblk1" "_dot" "dimblk2" "_Open30" "" ss "" "dimoverride" "dimsah" "on" "" ss "" "undo" "e"))
((= int 1) (command "undo" "be" "dimoverride" "dimblk1" "_Open30" "dimblk2" "_dot" "" ss "" "dimoverride" "dimsah" "on" "" ss "" "undo" "e"))
((= int 2) (command "undo" "be" "dimoverride" "dimblk1" "_dot" "dimblk2" "_dot" "" ss "" "dimoverride" "dimsah" "on" "" ss "" "undo" "e"))
((= int 3) (command "undo" "be" "dimoverride" "dimblk1" "_Open30" "dimblk2" "_Open30" "" ss "" "dimoverride" "dimsah" "on" "" ss "" "undo" "e"))
)
(if (getpoint) (setq ss nil) (command "u"))
(setq int (nth int '(1 2 3 0)))
)

(princ)
)
  • Hamu
  • 2025/12/08 (Mon) 17:14:14
Re: 矢印記号変更について
(if (getpoint) (setq ss nil) (command "u"))
の部分を
(if (getpoint) (command "u") (setq ss nil))
とすれば、

「左クリックでローテーション、右クリック or Enter or Escで終了」 になります。
  • Hamu
  • 2025/12/08 (Mon) 17:21:23
Re: 矢印記号変更について
LUNEさん、早々のお返事ありがとうございます。
ご提供いただきましたコードをそのまま実行しました。
こんなことが出来るんですね。
びっくりです。
ローテーションが最高です。

拡張データと聞いて、試練だなと思っていましたが。。。

本当にありがとうございました。
これで、煩わしいプロパティの変更がなくなりました。
  • しんちゃん
  • 2025/12/08 (Mon) 19:17:25
Re: 矢印記号変更について
しんちゃんさん、ローテーションのは、私ではないので、そのお礼はHamuさんに。
  • LUNE
  • 2025/12/09 (Tue) 09:11:06
Re: 矢印記号変更について
Hamuさん、
先日、寸法線の矢印を●に変換する質問をしていまして
LUNEさんから回答をいただき本当助かりました。
そのご提供いただきましたコードの一部ローテーション部がHamuさんからのだということを
聞かされました。
HamuさんLUNEさん合作のコードとても素晴らしく感動しています。
ありがとうございました。
今後ともよろしくお願いいたします。
  • しんちゃん
  • 2025/12/09 (Tue) 17:19:28

返信フォーム






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