断面・展開図ツール

断面・展開図ツール

[SD_6302] 展開図作成

このコマンドは展開図用の下図を、迅速に作成するときに使うAutoLISPコマンドです。
2次元CADにおいて、展開図の作図はかなりの手間がかかるうえ、ケアレスミスも多く発生しがちです。
自動で展開図を作成するコマンドは色々試してみたのですが、結局、仕上げ線だけを通り芯上に投影するだけのシンプルなものが使いやすいという結論に至りました。
これがサンプルの平面図です。
通り芯番号は、[SD_6301]にて、各通り芯に埋め込み済みです。

仕上線を選択もしくは[Enter]で設定: と聞かれますので、下図のように展開図に表現する仕上げ線を全て選択します。

展開図に表示する通り芯・壁芯を選択もしくは[Enter]で設定: と聞かれますので、通り芯をクロスで選択します。今回はA展開を作成するので、縦方向の通り心を選択します。

展開方向を聞かれますので、Aを選択します。

OKを押すと、マウスポインタに生成された展開図がくっついてきますので、挿入位置をクリックしてください。もし図形がマウスポインタにくっついてこない場合は、Ctrl-Vを押すと図形がでてきます。

通り芯番号はXDATAに埋め込まれていますので、展開図に自動で作図されます。
このプログラムは選択した線分あるいはポリラインの端点座標を展開図上に投影しているのみですので、これを下図にして展開図を完成させてください。

建築の展開図は、部屋の形状がイレギュラーになると、どのように展開を切るかの判断に経験が必要になってきます。私の会社では、経験が豊富な者が最初に全ての展開方向をこのコマンドを使って準備し、それを部下に渡して展開図を完成させるという流れで作業をします。

AutoLISPソース

(defun c:SD_6302 (/ Lay_Cen Lay_Dim str1 fil1 Path1 rc rc1 rc2 rc3 act dcl eb1 eb2 eb3 eb4 eb5 eb6 eb7 eb8 eb9 eb10 eb11 eb12 eb13 eb14 eb15 lst1 lst2 lst3 lst4 lst5 p1 p2 lay1 str1 num1 n ss1 ss2 ss3 str1)
  (if (= SD:Lang "E")
    (princ "\n [SD_6302 ver.20220531]Interior Elevation Generator")
    (princ "\n [SD_6302 ver.20220531]展開図作成")
  )
  (princ "\n **********************************")
  (load "SD_U")
  (setq *error* *myerror*)
  (OpeningRoutine)
  (if (= SD:Lang "E")
    (alert "To get the most out of the program's capacities, we recommend using one previous command to embed the grid number in each lines.")
    (alert "\n 一つ前のコマンドを使って通り芯番号を通り芯オブジェクトに埋め込むことより、より効率的な作図が可能です"))
  (setq  Lay_Cen (Get_Layer "A11" T)
    Lay_Cen2 (Get_Layer "A12" T)
    Lay_Dim (Get_Layer "A62" T)
    Lay_Txt1 (Get_Layer "A71" T)
    Lay_Txt2 (Get_Layer "A72" T))
  (setq  Path1 "HKEY_CURRENT_USER\\Software\\SpeedDraft\\SD_6302"
    str1 (strcat (getvar "tempprefix") "SD_6302.dcl"))
  (mapcar '(lambda (x y)(if (null (set (read x) (vl-registry-read Path1 x)))(set (read x) y)))
    (setq lst1 '("eb1" "eb2" "eb3" "eb4" "eb5" "eb6" "eb7" "eb8" "eb9" "eb10" "eb11" "eb12" "eb13" "eb14" "eb15"))
    (setq lst2 '("3000" "10" "7" "6" "8" "7" "14" "5" "24" "1" "10" "2.5" "3.0" "3.0" "3.0")))
  (if (= SD:Lang "E")(princ "\nSelect wall finish line or [Enter] for Settings: ")(princ "\n仕上線を選択もしくは[Enter]で設定: "))
  (setq ss1 (ssget '((0 . "LINE"))))
  (if (null ss1) (progn (settings_6302)(setq ss1 (ssget '((0 . "LINE"))))))
  (if (= SD:Lang "E")(princ "\nSelect grid lineto show in Interior Elevation drawing or [Enter] for Settings:: ")(princ "\n展開図に表示する通り芯・壁芯を選択もしくは[Enter]で設定: "))
  (setq ss2 (ssget (list '(0 . "LINE")(cons 8 (strcat Lay_Cen "," Lay_Cen2)))))
  (if (null ss2) (progn (settings_6302)(setq ss2 (ssget (list '(0 . "LINE")(cons 8 (strcat Lay_Cen "," Lay_Cen2)))))))
  (if (or ss1 ss2) (progn
    (setq fil1 (open str1 "w"))
    (write-line (strcat "SD_6302:dialog{label=\"" (if (= SD:Lang "E") "Select view" "展開方向を選択") "\";") fil1)
    (write-line ":boxed_column{" fil1)
    (write-line ":radio_row{key=rc1;" fil1)
    (write-line "spacer_1;" fil1)
    (write-line (strcat ":radio_button{label=\"" (if (= SD:Lang "E") "A↑" "A↑") "\";key=rb1;}}") fil1)
    (write-line ":radio_row{key=rc2;" fil1)
    (write-line "spacer_1;" fil1)
    (write-line (strcat ":radio_button{label=\"" (if (= SD:Lang "E") "←D" "←D") "\";key=rb4;}") fil1)
    (write-line "spacer_1;" fil1)
    (write-line (strcat ":radio_button{label=\"" (if (= SD:Lang "E") "B→" "B→") "\";key=rb2;}}") fil1)
    (write-line ":radio_row{key=rc3;" fil1)
    (write-line "spacer_1;" fil1)
    (write-line (strcat ":radio_button{label=\"" (if (= SD:Lang "E") "C↓" "C↓") "\";key=rb3;}}}") fil1)
    (write-line "ok_cancel;}" fil1)
    (close fil1)

    (if (null (setq rc (vl-registry-read Path1 "rc")))(setq rc "rb1"))

    (setq dcl (load_dialog str1))
    (new_dialog "SD_6302" dcl)
    (set_tile "rc1" rc)(set_tile "rc2" rc)(set_tile "rc3" rc)
    (action_tile "rc1" "(if (get_tile \"rc2\")(set_tile (get_tile \"rc2\") \"0\"))(if (get_tile \"rc3\")(set_tile (get_tile \"rc3\") \"0\"))")
    (action_tile "rc2" "(if (get_tile \"rc1\")(set_tile (get_tile \"rc1\") \"0\"))(if (get_tile \"rc3\")(set_tile (get_tile \"rc3\") \"0\"))")
    (action_tile "rc3" "(if (get_tile \"rc1\")(set_tile (get_tile \"rc1\") \"0\"))(if (get_tile \"rc2\")(set_tile (get_tile \"rc2\") \"0\"))")
    (action_tile "accept" "(cond ((get_tile \"rc1\")(setq rc (get_tile \"rc1\"))) ((get_tile \"rc2\")(setq rc (get_tile \"rc2\"))) ((get_tile \"rc3\")(setq rc (get_tile \"rc3\"))))(done_dialog 1)")
    (action_tile "cancel" "(done_dialog 0)")
    (setq act (start_dialog))
    (unload_dialog dcl)
    (if (= act 1)(progn (vl-registry-write Path1 "rc" rc)(make_6302)))))
  (ClosingRoutine)
  (setq *error* nil)
  (princ)  
)
(defun settings_6302 ()
  (setq fil1 (open str1 "w"))
  (write-line (strcat "SD_6302:dialog{label=\"" (if (= SD:Lang "E") "Elevation Setting" "展開図の設定") "\";") fil1)
  (write-line ":row{" fil1)
  
  (write-line ":image{key=im1;width=120;height=30;}" fil1)

  (write-line ":column{fixed_height=true;alignment=top;" fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "A FH" "A 階高") "\";key=eb1;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "B" "B 間隔") "\";key=eb2;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "C" "C 間隔") "\";key=eb3;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "D" "D 間隔") "\";key=eb4;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "E Num Cir" "E 直径") "\";key=eb5;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "F" "芯の延長") "\";key=eb6;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "G" "G 間隔") "\";key=eb7;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "H" "H 間隔") "\";key=eb8;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "J" "J 間隔") "\";key=eb9;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "K" "K 離れ") "\";key=eb10;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "L" "L 延長") "\";key=eb11;edit_width=5;}}") fil1)

  (write-line ":column{fixed_height=true;alignment=top;" fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "Text A" "A レベル文字") "\";key=eb12;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "Text B" "B 部屋名") "\";key=eb13;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "Text C" "C 通り芯記号") "\";key=eb14;edit_width=5;}") fil1)
  (write-line (strcat ":edit_box{label=\"" (if (= SD:Lang "E") "Text D" "D 展開方向記号") "\";key=eb15;edit_width=5;}") fil1)
  (write-line "spacer_1;" fil1)
  (write-line (strcat ":button{label=\"" (if (= SD:Lang "E") "Default" "初期設定に戻す") "\";key=b1;}}}") fil1)

  (write-line "ok_cancel;}" fil1)
  (close fil1)

  (setq dcl (load_dialog str1))
  (new_dialog "SD_6302" dcl)
  (mapcar '(lambda (x)(set_tile x (eval (read x)))) lst1)
  (start_image "im1")(fill_image 0 0 (dimx_tile "im1")(dimy_tile "im1") 0)(slide_image 0 0 (dimx_tile "im1") (dimy_tile "im1") "SD_6302.sld")(end_image)
  (action_tile "b1" "(mapcar 'set_tile lst1 lst2)")
  (action_tile "accept" "(mapcar '(lambda (x)(vl-registry-write Path1 x (set (read x)(get_tile x)))) lst1)(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq act (start_dialog))
  (unload_dialog dcl)
)
(defun make_6302 (/ lst2 lst3 ss3 lst4 lst5)
  (mapcar '(lambda (x)(set (read x)(* (atof (eval (read x)))(getvar "userr1")))) (cdr lst1))
  (setq n 0)
  (while (setq obj1 (ssname ss1 n))
    (setq  p1 (cdr (assoc 10 (entget obj1)))
      p2 (cdr (assoc 11 (entget obj1)))
      lay1 (cdr (assoc 8 (entget obj1)))
      lst2 (append (list (list p1 lay1) (list p2 lay1)) lst2)
      n (1+ n)))
  (setq n 0)
  (while (setq obj1 (ssname ss2 n))
    (setq  p1 (cdr (assoc 10 (entget obj1)))
      lay1 (cdr (assoc 8 (entget obj1)))
      lst2 (append (list (list p1 lay1 (cdr (cadr (cadr (assoc -3 (entget obj1 '("*")))))))) lst2)
      n (1+ n)))
  (cond ((= rc "rb1")(setq lst2 (mapcar '(lambda (x)(list (car (car x))(cadr x) (nth 2 x))) lst2)
        lst2 (vl-sort lst2 '(lambda (e1 e2)(< (car e1)(car e2))))))
    ((= rc "rb2")(setq lst2 (mapcar '(lambda (x)(list (cadr (car x))(cadr x) (nth 2 x))) lst2)
        lst2 (vl-sort lst2 '(lambda (e1 e2)(> (car e1)(car e2))))))
    ((= rc "rb3")(setq lst2 (mapcar '(lambda (x)(list (car (car x))(cadr x) (nth 2 x))) lst2)
        lst2 (vl-sort lst2 '(lambda (e1 e2)(> (car e1)(car e2))))))
    ((= rc "rb4")(setq lst2 (mapcar '(lambda (x)(list (cadr (car x))(cadr x) (nth 2 x))) lst2)
        lst2 (vl-sort lst2 '(lambda (e1 e2)(< (car e1)(car e2)))))))

  (setq  lst2 (mapcar '(lambda (x)(list (+ (abs (- (car x) (car (car lst2)))) eb9)(cadr x)(nth 2 x))) lst2)
    ss3 (ssadd))
  (entmake (list '(0 . "LINE")(cons 8 Lay_Cen)'(10 0 0 0)(list 11 (+ (car (last lst2)) eb11) 0)))(setq lst3 (cons (entlast) lst3))
  (entmake (list '(0 . "LINE")(cons 8 Lay_Cen)(list 10 0 (atof eb1) 0)(list 11 (+ (car (last lst2)) eb11) (atof eb1))))(setq lst3 (cons (entlast) lst3))
  (mapcar '(lambda (x)
    (if (or (= (cadr x) Lay_Cen)(= (cadr x) Lay_Cen2))(setq num1 (- 0 eb2) num2 (+ (atof eb1) eb6) lst4 (cons (list (car x) num1 0) lst4) lst5 (cons (last x) lst5))(setq num1 0 num2 (atof eb1)))
    (entmake (list '(0 . "LINE")(cons 8 (cadr x))(list 10 (car x) num1 0)(list 11 (car x) num2)))
    (setq lst3 (cons (entlast) lst3))) lst2)
  
  (setq doc1 (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))

  (vla-adddimrotated doc1 (vlax-3D-point '(0 0))(vlax-3D-point (list 0 (atof eb1)))(vlax-3D-point (list (- 0 eb7) 0)) (* 0.5 pi))
  (entmod (subst (cons 8 Lay_Dim)(assoc 8 (entget (entlast))) (entget (entlast))))(setq lst3 (cons (entlast) lst3))

  (mapcar '(lambda (x y)
  (vla-adddimrotated doc1 (vlax-3D-point x)(vlax-3D-point y)(vlax-3D-point (polar x (* 1.5 pi) eb3)) 0)
  (entmod (subst (cons 8 Lay_Dim)(assoc 8 (entget (entlast))) (entget (entlast))))(setq lst3 (cons (entlast) lst3))) lst4 (cdr lst4))

  (mapcar '(lambda (x y)(if y (progn
  (entmake (list '(0 . "CIRCLE")(cons 10 (polar x (* 1.5 pi)(+ eb3 eb4 (/ eb5 2.0))))(cons 40 (/ eb5 2.0))))
  (entmod (subst (cons 8 Lay_Dim)(assoc 8 (entget (entlast))) (entget (entlast))))(setq lst3 (cons (entlast) lst3))))) lst4 lst5)

  (mapcar '(lambda (x y)(if y (progn
  (entmake (list '(0 . "TEXT")(cons 1 y)(cons 10 (polar x (* 1.5 pi)(+ eb3 eb4 (/ eb5 2.0))))(cons 11 (polar x (* 1.5 pi)(+ eb3 eb4 (/ eb5 2.0))))(cons 40 eb14)'(72 . 1)'(73 . 2)))
  (entmod (subst (cons 8 Lay_Dim)(assoc 8 (entget (entlast))) (entget (entlast))))(setq lst3 (cons (entlast) lst3))))) lst4 lst5)

  (cond ((= rc "rb1")(setq str1 "A"))((= rc "rb2")(setq str1 "B"))((= rc "rb3")(setq str1 "C"))((= rc "rb4")(setq str1 "D")))
  (entmake (list '(0 . "TEXT")(cons 1 str1)(list 10 (/ (+ (car (last lst2)) eb11) 2.0)(- 0 eb2 eb3 eb4 (/ eb5 2.0)))(cons 40 eb14)))
  (setq lst3 (cons (entlast) lst3))

  (entmake (list '(0 . "TEXT")(cons 1 "▽*FL")(cons 8 Lay_Txt2)(list 10 eb8 1)(cons 40 eb14)))
  (setq lst3 (cons (entlast) lst3))

  (entmake (list '(0 . "TEXT")(cons 1 "部屋名")(cons 8 Lay_Txt1)(list 10 eb8 (- 0 eb2))(cons 40 eb14)))
  (setq lst3 (cons (entlast) lst3))

  (mapcar '(lambda (x)(ssadd x ss3)) lst3)
  (command ".copybase" "_non" '(0 0) ss3 "")
  (mapcar 'entdel lst3)
  (command "pasteclip" pause)
)
(princ)

コメント

この記事へのコメントはありません。

アップロードファイルの最大サイズ: 5 MB。 画像 をアップロードできます。 ここにファイルをドロップ

TOP