AutoCAD LT を使うときの参考メモです。 他に Jw_cad についても多少メモしています。
穴というか円を作図して十字中心線を入れるとき、普通に作図すると、円の半径によって中心線の長さを揃えたりするのが面倒です。 そこで、中心線付き円のアクションブロックを作ってその作業を簡単にします。
これで、円の大きさに合わせて十字中心線の長さも変わります。
3D といえば、X と Y の他に Z という値が出てきます。 Z 位置から上に行ったり下がったり、図形位置のを調整が必要になります。
そこで Z 方向関係で使いそうな LISP を考えてみた。 LISP を使ったことはあっても作ったことはほとんどなかったので、Web ページがとても参考になりました。
(defun c:ObjMoveZ () (setq ss (ssget) rz (rtos (getreal "Z 方向の移動距離をタイプ: ")) rd (strcat "0,0," rz) ) (command "_.move" ss "" "0,0,0" rd) )
(defun c:ObjCopyZ () (setq ss (ssget) rz (rtos (getreal "Z 方向の複写距離をタイプ: ")) rd (strcat "0,0," rz) ) (command "_.copy" ss "" "0,0,0" rd) )
(defun c:ObjMoveZero() (setq ensel (car (entsel "移動の基準となる移動図形(線・円・引出し線・ポリライン・ブロック)を一つ選択: "))) (setq ss (ssget)) (if (= "LINE" (cdr (assoc 0 (entget ensel)))) (progn (setq MoveDist (rtos(caddr(cdr (assoc 10 (entget ensel)))))) ) ) (if (= "CIRCLE" (cdr (assoc 0 (entget ensel)))) (progn (setq MoveDist (rtos(caddr(cdr (assoc 10 (entget ensel)))))) ) ) (if (= "LEADER" (cdr (assoc 0 (entget ensel)))) (progn (setq MoveDist (rtos(caddr(cdr (assoc 10 (entget ensel)))))) ) ) (if (= "LWPOLYLINE" (cdr (assoc 0 (entget ensel)))) (progn (setq MoveDist (rtos(cdr (assoc 38 (entget ensel))))) ) ) (if (= "INSERT" (cdr (assoc 0 (entget ensel)))) (progn (setq MoveDist (rtos(caddr(cdr (assoc 10 (entget ensel)))))) ) ) (if (= "-" (substr MoveDist 1 1)) (progn (setq MoveDist (substr MoveDist 2 (strlen MoveDist))) ) (progn (setq MoveDist (strcat "-" MoveDist)) ) ) (print (strcat "0,0," MoveDist)) (command "_.move" ss "" "0,0,0" (strcat "0,0," MoveDist)) (princ) )
- 選択した図形の DXF テーブルから Z 位置を調べて、その値が-(マイナス)ならその分だけ上へ、+(プラス)なら下方向移動して Z 位置 = 0 にします。
- 最初は、entsel で図形を一つ選択し、entmod とかで DXF テーブルを書き換えようと考えましたが、直接ファイルをいじって何かあると困る。
- そのため move コマンドを使うことにした。 すると、オブジェクトを ssget で選ばなければなりませんが、そのおかげで複数選べるようになった。
- 最初の entsel で選べるのは、線・円・引出し線・ポリライン(ポリゴン)・ブロック(インサート) だけです。 図形の種類によって、DXF テーブル上 Y 位置を示すリスト番号が違ったりする(ほとんど 10 ですが ポリラインは 38 など)。
- このとき、ブロックが 3D回転などされていると、図形のプロパティで見る X Y Z 位置と DXF テーブル内の X Y Z に食い違いで出て、あらぬ方向に移動されてしまいます(DXF テーブルの Z に Y の値が入っていたりする)。
例えば、プロパティは下のようになっていても、3D回転されている場合、DXFの(リスト番号 X Y Z)表示では (10 489816 21747.5 245950) となっていたりする。
- そんなときはブロックを分解してもいいんですが、いちいち分解するのは大変。 その結果、他に移動する図形(回転されていないもの)を選び、その Y の値だけ動かすことにして、上記の LISP のようになりました。
(defun c:GRPCQ (/ selectionset number Groupname objdict grpdict) (setq objdict (namedobjdict)) (setq grpdict (dictsearch objdict "ACAD_GROUP")) (if (setq selectionset (ssget "_:L")) (progn (setq number 1 Groupname (strcat "DENKI" (itoa number)) ) (while (member (cons 3 Groupname) grpdict) (setq Groupname (strcat "DENKI" (itoa (setq number (1+ number)))) ) ) (command "_.-group" "c" Groupname "" selectionset "") ) (princ) ) (princ) )
- 最初にこれを作った時、ループの 2 回目にグループを作る際、必ず「定義が重複する」と返してくる。
- なんでか?とさんざん考えましたが、結果は簡単でした。 先頭文字の "DENKI" を "Denki" にしていたためでした。
- dict 内を探すとき、「DENKI1」と「Denki1」は区別されるようですが、実際に -group でグループ化する場合、「DENKI1」と「Denki1」は同じになります。
- 最初にグループ化する場合、「Denki1」という名前を付けても、実際には「DENKI1」で登録されます。
- 2回目にグループ名の重複を検索する場合、dict の中に「DENKI1」は有っても、「Denki1」は無いと判断するため、「Denki1」という名前が作られ、結局グループ化で定義が重複と言われてしまう。
- なぜこれに気が付かなかったかというと、別に作ったブロックを作成する LISP で「tblsearch」を使ったときは、「DENKI1」を「Denki1」と見なしてくれたからです。 例えば、以下のように、「DENKI5」の次に「Denki6」というブロックを登録してくれました。
(2 . "DENKI1") (2 . "DENKI2") (2 . "DENKI3") (2 . "DENKI4") (2 . "DENKI5") (2 . "Denki6")同じような「tbl」と「dict」でも違うんですね。- 名前を作る場合は、注意するようにします。
(append [list ...]) Examples Command: (append '(a b) '(c d)) (A B C D) Command: (append '((a)(b)) '((c)(d))) ((A) (B) (C) (D))
(setq A (append A B))しかしエラーです。引数の型がちがうらしい。 確かにちがう。 append ではなく、list にすると、どんどん追加されますが、結果はカッコだらけです。 おまけに最初は A という LIST がないので nil になります。 それはそうだ。
(setq A (list A B)) 結果例 ((((nil <図形名: 22beb230>) <図形名: 22bec070>) <図形名: 22beb1f0>) <図形名: 22bebcf0>)
(setq A (append A (list B))) 結果例 (<図形名: 22bdc9b0> <図形名: 22bdd0b0> <図形名: 22bdc830> <図形名: 22bdc270>)list を使って、追加する B を A と同じ型にしたら良いと理解しています。
(setq xxxx (reverse (dictsearch (cdar [GroupName辞書]) [調べる GroupName])))
((340 . <EName: 0000000013cd5cd0>) (340 . <EName: 0000000013cd9cc0>) (340 . <EName: 0000000013cd55e0>) (340 . <EName: 0000000013cd55b0>) (340 . <EName: 0000000013cd9cc0>) (340 . <EName: 0000000013cd55e0>) (340 . <EName: 0000000013cd55b0>) (71 . 1) (70 . 0) (300 . "") (100 . "AcDbGroup") (330 . <EName: 0000000013c25880>) (102 . "}") (330 . <EName: 0000000013c25880>) (102 . "{ACAD_REACTORS") (5 . "5B1D") (0 . "GROUP") (-1 . <EName: 0000000013cda680>))
(while (setq [(340)のデータ] (assoc 340 [Group のEntity 情報])) (setq [追加する(340)のデータ] (cdr en)) (setq [List 名] (append [List 名] (list [追加する(340)のデータ]))) ....... ) List 結果 : (<EName: 0000000013cd5cd0> <EName: 0000000013cd9cc0> <EName: 0000000013cd55e0> <EName: 0000000013cd55b0> <EName: 0000000013cd9cc0> <EName: 0000000013cd55e0> <EName: 0000000013cd55b0>)
(while (setq [(340)のデータ] (assoc 340 [Group のEntity 情報])) (setq [追加する(340)のデータ] (cdr en)) (if (= nil (member [List 名] [追加する(340)のデータ])) (setq [List 名] (append [List 名] (list [追加する(340)のデータ]))) ) ....... ) List 結果 : (<EName: 0000000013cd5cd0> <EName: 0000000013cd9cc0> <EName: 0000000013cd55e0> <EName: 0000000013cd55b0>)
円弧の長さ l = 2πr × (θ/2π)
円弧の長さ l = πrθ/2
上の画像は、PDF ファイルを Adobe Acrobat Reader で開いたものです。 1024×768 のモニターに表示した画面をキャプチャしました。 印刷スタイルには標準の「monochrome」を使用。 直線以外がうすく見えます。 特に右上の直線やカーブが混ざったものは、線の太さの設定が変?と疑われてもしかたがない。 もちろんそんなことはなくて、ズームインしたり、紙に印刷するとちゃんとしています。
線が直線も曲線も斜め線も、くっきり見えます。
オリジナル設定
400 dpi にしてみる
見た目はあまり変わらない。
300 dpi にしてみる
くっきりしてきましたか?。
200 dpi にしてみる
かなり濃くなった。
※本ページのイラスト・イメージは、プリントアウトファクトリー様 (https://www.printout.jp/) のクリップアートを使用しています。
Copyright(c) 有限会社 岡田電工 Okada Denko Ltd. All Rights Reserved.
HP開設 2003年
2015年10月
2015年11月
2015年12月
2016年1月
2016年4月
2016年5月
2016年6月
2016年7月
2016年12月
2018年12月