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

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

指定点によるオブジェクト「0度」にする移動の考え方
談話室の方でちょっとお話した件です。
マクロそのものの質問では無くてすみません。

やりたいこと。
角度を持ったオブジェクトを、指定した点を中心にて、オブジェクトの角度が「0度」になるようにしたい。
伝わりにくいので簡単ですが画像を添付しました。
(実際は水平線や傾き線は存在しません)

①オブジェクト(四角形:ブロック)を選択 (仮に20度の傾き)
②基点を指定(赤丸)
③オブジェクトの持つ角度が0度になるように、基点-20度回転する。

疑問。
単純発想で、
①傾き角度をオブジェクトから読み取る
②基点を軸にして、オブジェクトを①で読みだした角度分マイナス方向に回転させる。
とした場合、精度的に厳格な「0度」になるのか?

元は傾きなし四角形ブロック。
それが傾いていたとき、処理した結果で四角形を分解した後、水平線が完全な0度になって欲しいのです。

想像できる方法でほぼ0度にはなるでしょうから、最後に改めて直接角度「0」を指定して割り切ろうか、と逃げ思考に入りつつありました。
回転だとUCSをなんちゃらすれば・・・(思考続かず)

参照を伴う方法で対応できそうとのお話も頂いてましたが、オブジェクトと基点を指定する操作の中にどう盛り込んだらいいのか、そこの発想にまで至っておりません。
理想の動作をする手法がわかったら、Lispで作ってみようかなと思っていました。
(Lispは触り始めた初心者です。)

長くなりましたが、
処理の手法についての考え方についてアドバイス、指摘いただければと思い投稿させていただきました。
よろしくお願いいたします。



  • くるっと
  • 2021/07/07 (Wed) 23:17:35
Re: 指定点によるオブジェクト「0度」にする移動の考え方
談話室でも少し書きましたが
参考画像程度であれば、回転コマンドの参照(R)オプションを使えば良いと思います

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),ucs;m;基点を指定^X\line;non;0<0;per;参照角度の2点目を指定^X\;id;non;@;setenv;to;1,,)$(nth,$(getenv,to),,;p1;$(getvar,LASTPOINT);erase;l;;select;\setenv;to;2,)$(nth,$(getenv,to),,,rotate;p;;non;0<0;r;0<0;non;$(getenv,p1);p;non;0<0;non;10<0;ucs;p;setenv;to;0)^M

1.マクロ起動
2.基点指定
3.参照角度の2点目を指定(参考画像の短辺に対して垂線を描く様に設定しています)
4.オブジェクト選択

以上で参照角度を0度に回転移動します

2を以降繰り返し

終了はEscキーです
  • chibi-tom
  • 2021/07/08 (Thu) 09:40:04
Re: 指定点によるオブジェクト「0度」にする移動の考え方
私なら・・・図のような状態なら以下のようにします。
 1.UCS→OBオプション→四角形の水平にしたい辺を選択(添付図の場合、長辺)
 2.基点コピーで赤い点を基点に四角形を選択
 3.UCSを戻す
 4.貼り付けで基点を赤い点にして貼り付け

ただ、四角形が「ブロック」で元が水平で定義されているのなら、LISPで回転角度だけ0にするという方法もあるかも。
その場合、基点をどう設定するかという問題はありますが。
  • LUNE
  • 2021/07/08 (Thu) 09:43:03
Re: 指定点によるオブジェクト「0度」にする移動の考え方
ucsの変更を使うとブロック編集中に使えないのが気になったので
自己満足で変更しました

なお、Lispについて記述があったのでR版使用なのかなと思ったので
setenv、getenvも不使用にしてuseri、usersを使用しています
自分はLT版しか使っていないので確認はできていません<m(__)m>
(ucsも移動していないのでIJCAD等でも使えるのかな?)

*^C^C$M=useri1;0;$(nth,$(getvar,USERI1),id;基点を指定^X\useri1;1,,,)$(nth,$(getvar,USERI1),,users1;$(getvar,LASTPOINT);line;non;@;per;参照角度の2点目を指定^X\;id;non;@;erase;l;;useri1;2,,)$(nth,$(getvar,USERI1),,,users2;$(getvar,LASTPOINT);id;non;$(getvar,USERS1);select;\useri1;3,)$(nth,$(getvar,USERI1),,,,rotate;p;;non;$(getvar,USERS1);r;$(getvar,USERS1);non;$(getvar,USERS2);p;non;$(getvar,USERS1);non;@10<0;useri1;0)^M

LT版で試したsetenv,getenv使用Verはこちら

*^C^C$M=setenv;to;0;$(nth,$(getenv,to),id;基点を指定^X\setenv;to;1,,,)$(nth,$(getenv,to),,;p1;$(getvar,LASTPOINT);line;non;@;per;参照角度の2点目を指定^X\;id;non;@;erase;l;;setenv;to;2,,)$(nth,$(getenv,to),,,;p2;$(getvar,LASTPOINT);id;non;$(getenv,p1);select;\setenv;to;3,)$(nth,$(getenv,to),,,,rotate;p;;non;$(getenv,p1);r;$(getenv,p1);non;$(getenv,p2);p;non;$(getenv,p1);non;@10<0;setenv;to;0)^M

操作方法は変えていません
  • chibi-tom
  • 2021/07/08 (Thu) 11:13:59
Re: 指定点によるオブジェクト「0度」にする移動の考え方
マクロ作成していただきありがとうございます。
私の添付したイメージの動作を確認しました。
直角マークが出るので、動作の方もなんとなくわかりました。
でもやっぱり小数第7位とか8位とか細かいところで角度が0度にはならないようでした。

私の説明が下手でうまく伝えられませんでした。
やりたいことについて、画像添付します。
回転角度60度で置かれているオブジェクトがあるとして、
基点(赤丸を指示)を中心にそのオブジェクトの回転角度分逆方向に回転(-60度)して、回転角度がキッチリ0度になる位置にしたい、
というものでした。

でも、やはりキッチリ0度というのは難しいでしょうか。
  • くるっと
  • 2021/07/11 (Sun) 17:50:59
Re: 指定点によるオブジェクト「0度」にする移動の考え方
自分のマクロは参照にした角度を0度にするマクロです
添付画像のようなオブジェクトではどこを参照にして回転すれば良いかわからないです
(基準点に対してオブジェクトの回転角度を知る方法は思い当たらないので)

対象がブロックで挿入点であるなら
参考の手順として
1.オブジェクトの回転角度をオブジェクトプロパティ等で『0度』にする
2.回転コマンドの参照オプションで参照角度を『0度』回転移動する(参照角度=基準点とブロックの挿入点の角度)
3.オブジェクトの回転角度をオブジェクトプロパティ等で『0度』にする
こんな感じでしょうか?

まぁ、ブロックで挿入点で良いならLUNEさんの方法でできると思いますが

また最後に提示したマクロですが最後に余計な『ucs;p;』が残ってしまっていたので修正しました
  • chibi-tom
  • 2021/07/12 (Mon) 08:42:36
Re: 指定点によるオブジェクト「0度」にする移動の考え方
単純にこれだとダメなんですかね?

*^C^Cselect;$M=$(if,$(getvar,cmdactive),\)rotate;p;;\r;\\0;
①マクロ実行
②オブジェクトを選択
③A⇒B⇒Cの順番でクリック
※UCSがワールド(もしくは、傾いていない)である事が前提です。
  • Lon
  • 2021/07/12 (Mon) 12:21:29
Re: 指定点によるオブジェクト「0度」にする移動の考え方
回転角度を持つオブジェクト(=ブロックや文字)の場合も、手順は同じでできそうな気がします。

 1.UCS→OBオプション→回転角度を持つオブジェクトを選択
 2.基点コピーで赤い点を基点にオブジェクトを選択
 3.UCSを戻す
 4.貼り付けで基点を赤い点にして貼り付け



  • LUNE
  • 2021/07/12 (Mon) 13:31:41

返信フォーム






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