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

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

交点に点作成
直線やポリラインの交点に、点を作成するマクロができないでしょうか?
線の間隔は一定ではなく、平行でもありません。

autocadLT2018を使用しています。

よろしくお願い致します。
  • もも
  • MAIL
  • 2018/05/22 (Tue) 11:49:58
Re: 交点に点作成
点をブロックで作っておくならば

134.交点指定ブロック挿入
https://ameblo.jp/totthi-macro/entry-11492864266.html

2点間ですが、上記マクロである程度対応可能です。
  • とってぃ
  • 2018/05/22 (Tue) 13:46:57
Re: 交点に点作成
うまくいっているか自信がないのですが交点に点を描くマクロです。
交点を構成している図形は線分だけにして下さい。


*^C^C$M=setenv;to;0;$(if,$(=,$(getenv,to),0),undo;be;setenv;as;$(getvar,autosnap);;ap;$(getvar,aperture);autosnap;0;aperture;1;-layout;d;tmplo;;n;tmplo;;s;tmplo;point;0<0;erase;all;;model;ucs;w;setenv;to;1)$(if,$(=,$(getenv,to),1),select;縦線を選択^X\copybase;non;0<0;p;;-layout;s;tmplo;pasteclip;non;0<0;zoom;e;setenv;vcnt;1;;to;2)$(if,$(=,$(getenv,to),2),;to;4;select;l;;ucs;ob;l;lengthen;dy;;;l;;;$M=id;non;"""$(*,$(getvar,perimeter),0.113)"""<0;ucs;w;setenv;to;3)$(if,$(=,$(getenv,to),3),erase;l;;setenv;vp$(getenv,vcnt);$(getvar,lastpoint);;vcnt;$(+,$(getenv,vcnt),1);;to;2)$(if,$(=,$(getenv,to),4),model;select;横線を選択^X\copybase;non;0<0;p;;-layout;s;tmplo;pasteclip;non;0<0;zoom;e;setenv;hcnt;1;;to;5)$(if,$(=,$(getenv,to),5),;to;7;select;l;;ucs;ob;l;lengthen;dy;;;l;;;$M=id;non;"""$(*,$(getvar,perimeter),0.101)"""<0;ucs;w;setenv;to;6)$(if,$(=,$(getenv,to),6),erase;l;;setenv;hp$(getenv,hcnt);$(getvar,lastpoint);;hcnt;$(+,$(getenv,hcnt),1);;to;5)$(if,$(=,$(getenv,to),7),model;select;交点を構成するオブジェトを選択^X\zoom;o;p;;setenv;i;1;;j;1;;to;8)$(if,$(=,$(getenv,to),8),$(if,$(<,$(getenv,j),$(getenv,hcnt)),;to;9,-layout;d;tmplo;autosnap;$(getenv,as);aperture;$(getenv,ap);^Cundo;e))$(if,$(=,$(getenv,to),9),$(if,$(<,$(getenv,i),$(getenv,vcnt)),;to;10,;i;1;;j;$(+,$(getenv,j),1);;to;8))$(if,$(=,$(getenv,to),10),point;int;$(getenv,vp$(getenv,i));$(getenv,hp$(getenv,j));setenv;i;$(+,$(getenv,i),1);;to;8)^M


手順
1.コマンド発行
2.交点の縦線を選択
3.交点の横線を選択
4.交点を構成している線分、全部を選択。
です。
  • zukki-
  • 2018/05/23 (Wed) 09:32:09
Re: 交点に点作成
マクロじゃなくて申し訳ないですが、こんなの作ってみました。
点と円とブロックの挿入ができます。
(ダウンロード期限があるのでお早めに)

http://firestorage.jp/******************************
作り変えたのでURL抹消しました。
  • Lon
  • 2018/05/23 (Wed) 12:55:32
Re: 交点に点作成
ももさんのご希望は端点も挿入したいみたいなので、端点も挿入するようにしました。
※端点への挿入を除外したい場合はオプションをチェックしてください。

ついでに、計算精度が低かったので、ちょっと改善。
それと、UNDOで処理前に一気に戻る様にしました。

http://***************************************************
ここのファイルはダウンロード期限が過ぎたので削除されました。
  • Lon
  • 2018/05/23 (Wed) 16:22:07
Re: 交点に点作成
ちょっと変更しました。

https://firestorage.jp/download/97576e5405ec1c7005615ea6aded4e4d83af977c

変更点。
フォームが常に最前面に居座る様に変更
500本まで選択可能に変更
入力値を次回起動時に復元する様に変更
その他微調整。


使用期限の解除方法↓
https://totthi.bbs.fc2.com/?act=reply&tid=16707708#24346516
  • Lon
  • 2018/05/24 (Thu) 18:41:41
Re: 交点に点作成
とってぃさま
とても使いやすいマクロでした。ありがとうございます。

zukkiさま
直線のみの場合は非常に便利ですね。ありがとうございます。

Lonさま
しばしPCからネットがみられない環境にいたため、
残念ながらダウンロード期限が切れてしまいました。
せっかくご対応いただいたのに、大変申し訳ございません(>_<;)
  • もも
  • 2018/05/28 (Mon) 19:15:51
Re: 交点に点作成
LT版では使えませんが、LISPでも作ってみました。

3つの条件分岐と誤差入力、円の径の入力があり、書かれた円はprevious選択できる様にしてあるので、
固定条件で使うなら、マクロで起動するのが良いです。

例えば画像の様な条件の場合の登録マクロ案
^C^Cselect;$M=$(if,$(getvar,cmdactive),\)Kouten_En;1;0;1;0;20;P;;chprop;p;;c;6;;


LISPファイルを作る際にメモ帳などを使う場合、書式コード(エンコード)は、
「shiftjis」や「ANSI」にしてください。ユニコード(UTF等)を使うとエラーになります。

以下がLISPです。

(defun C:Kouten_En ( / J1 J2 J3 GOSA PE Cir ss SS1 SS2 SS3 P1 P2 P3 P4 PK i j m n Boo)
(setq J1 (getint "端点と端点を含める = 0 除外する = 1 (L型) <0>:"))
(if (= J1 nil) (setq J1 0))
(setq J2 (getint "端点と線上の任意点を含める = 0 除外する = 1 (T型) <0>:"))
(if (= J2 nil) (setq J2 0))
(setq J3 (getint "線上の任意点と任意点を含める = 0 除外する = 1 (X型) <0>:"))
(if (= J3 nil) (setq J3 0))
(setq GOSA (getreal "誤差入力(誤差未満の隙間は無視する) <0.01>:"))
(if (= GOSA nil) (setq GOSA 0.01))
(setq GOSA (max 0.001 GOSA))
(setq Cir (getreal "交点にマークする円の半径を入力 <10>:"))
(if (= Cir nil) (setq Cir 10))
(setq PE nil)

(setq SS1 (ssget '((0 . "*LINE"))))
(if (= 0 (sslength SS1)) (quit))

(setvar "cmdecho" 0)

(setq old_error *error* *error* nil)
(command "undo" "be" "erase" "all" "r" SS1 "")

(while (setq SS3 (ssget "_X" '((0 . "*POLYLINE")))) (command "explode" SS3))

(if (not (setq ss (ssget "_X" '((0 . "LINE"))))) (quit))
(if (> 2 (sslength ss)) (quit))
(setq i 0 m (- (sslength ss) 1))
(repeat m
(setq P1 (cdr (assoc 10 (entget (ssname ss i)))))
(setq P2 (cdr (assoc 11 (entget (ssname ss i)))))

(setq j (+ i 1) n (- m i))
(repeat n
(setq P3 (cdr (assoc 10 (entget (ssname ss j)))))
(setq P4 (cdr (assoc 11 (entget (ssname ss j)))))

(setq Boo T)
(if (inters P1 P2 P3 P4 nil)
(progn
(if (and (> GOSA (distance P1 P3)) Boo) (progn (setq Boo nil) (if (= J1 0) (setq PE (append PE (list P1))))))
(if (and (> GOSA (distance P2 P3)) Boo) (progn (setq Boo nil) (if (= J1 0) (setq PE (append PE (list P2))))))
(if (and (> GOSA (distance P1 P4)) Boo) (progn (setq Boo nil) (if (= J1 0) (setq PE (append PE (list P1))))))
(if (and (> GOSA (distance P2 P4)) Boo) (progn (setq Boo nil) (if (= J1 0) (setq PE (append PE (list P2))))))

(setq PK (inters P1 P2 P3 P4 nil))
(if (and (> GOSA (distance P1 PK)) Boo) (progn (setq Boo nil) (if (= J2 0) (setq PE (append PE (list PK))))))
(if (and (> GOSA (distance P2 PK)) Boo) (progn (setq Boo nil) (if (= J2 0) (setq PE (append PE (list PK))))))
(if (and (> GOSA (distance P3 PK)) Boo) (progn (setq Boo nil) (if (= J2 0) (setq PE (append PE (list PK))))))
(if (and (> GOSA (distance P4 PK)) Boo) (progn (setq Boo nil) (if (= J2 0) (setq PE (append PE (list PK))))))

(if (and Boo (setq PK (inters P1 P2 P3 P4 T)) (= J3 0)) (setq PE (append PE (list PK))))
)
)
(setq j (+ j 1))
)
(setq i (+ i 1))
)

(command "undo" "e" "u" "undo" "be")

(setq i 0)
(setq SS2 (ssadd))
(repeat (length PE)
(command "circle" "non" (nth i PE) Cir)
(ssadd (entlast) SS2)
(setq i (+ i 1))
)
(command "select" SS2 "" "undo" "e")

(setvar "cmdecho" 1)
(setq *error* old_error)
(princ)
)

余談
ポリラインの頂点座標を取り出す方法を使えば、処理が早くなると思いますが、プログラムは複雑になりますし、
円弧を含むポリラインやら、閉じてる・閉じてないの処理分けやらを考えるのが面倒だったので、
コマンドで分解して線分にする方法としました。
  • Lon
  • 2022/12/01 (Thu) 10:28:49
Re: 交点に点作成
上のLISP、交点が存在しない時のエラー処理をしてませんでした。
といっても、特に変な事は起きないとは思いますが、念のため注意して使って下さい。
  • Lon
  • 2022/12/01 (Thu) 13:58:28

返信フォーム






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