stgpmin 发表于 2024-7-18 23:05:04

炸開圖塊修改,然後再依原圖塊存檔的小程序

本帖最后由 stgpmin 于 2024-7-18 23:11 编辑

大家好,分享一個編輯圖塊的小程序。我的作圖習慣會將平面圖存成圖塊,方便在模型空間內會有多張圖框,例如一樓平面圖就會在建築平面、配置平面、景觀平面等重複出現。
透過我寫的這個小程序可以記憶被炸開的圖塊屬性,包含圖塊名稱、基準點、旋轉、比例、鏡射等等。在完成編輯圖塊後,就可以選擇物件再重新回存為原本的圖塊,而其他的圖塊副本也會一起更新。

這個小程序編寫起因是鑑於原地編輯圖塊有很多不方便的地方(例如無法再次製作圖塊,有些涉及製作圖塊的外掛指令也會無法使用),尤其是在編輯過程中是無法存檔跟自動儲存的。不過目前還有無法克服的地方,就是要回存為原本圖塊時,無法自動選取中間這段時間所建立的物件,必須手動選取。
使用方法很簡單,
1.輸入xb1,選擇圖塊,該圖塊就會執行炸開指令,
2.編輯圖塊完成後,輸入cb1,原本圖塊的內容物件會群組化方便選取,再選擇其他想放入圖塊的物件後,按enter,完成。
3.有時編輯圖塊後,會忘記曾經執行過這個小程序而再次執行去炸開另一個圖塊,所以這個小程序有設置防呆,如果沒執行cb1,是無法再次執行xb1指令。
4.若強制要再次執行xb1,可以輸入xx1解開禁制。
搭配我另一個發布的小程序ibb,對於使用圖塊作圖有很大便利性。

(defun C:xb1 (/ ss bss en1 EN1_data)
(if (= xb_name nil)
    (progn
      (command "ucs" "w")
      (setq bss (entsel))
      (command "_.undo" "_group")
      (setq eN1 (car bss))
      (setq EN1_data (entget EN1))
      (setq xb_name (cdr (assoc 2 EN1_data))) ;名稱
      (setq xb_pt (cdr (assoc 10 EN1_data)))
      ;;插入點
      (setq ttx (polar xb_pt 0 100))
      (setq tty (polar xb_pt (/ pi 2) 100))
      (SETQ mir_41 (assoc 41 EN1_data))
      (SETQ mir_42 (assoc 42 EN1_data))
      
      (setq xb_layer (cdr (assoc 8 EN1_data)))
      ;;圖層
      (setq xb_rot (cdr (assoc 50 EN1_data)))
      ;;旋轉
      (setq xb_dg1 (* (/ xb_rot pi) 180))
      (setq xb_sc (cdr (assoc 41 EN1_data)))
      ;;以下為X向鏡射
      (if (< (cdr (assoc 41 EN1_data)) 0)
(progn
    (setq mi_x "1")
)
      )
      ;;以下為y向鏡射
      (if (< (cdr (assoc 42 EN1_data)) 0)
(progn
    (setq mi_y "1")
)
      )
      ;;;將xb_sc轉為正數
      (if (= mi_x "1")
(setq xb_sc (abs xb_sc))
      )
      ;;比例
      (setq sc_re (/ 1 xb_sc))
      ;;有旋轉及縮放的處理差異
      (if (and (= xb_rot 0) (= xb_sc 1))
(progn
    (COMMAND "EXPLODE" bss "")
    (setq ss (ssget "_p"))
    (SETVAR "QAFLAGS" 1)
    (COMMAND "GROUP" SS "")
    (SETQ ENLAST1 (ENTLAST))
    (SETVAR "QAFLAGS" 0)
    (command "pickstyle" "0")
    (command "ucs" "p")
)
(progn
    (COMMAND "EXPLODE" bss "")
    (setq ss (ssget "_p"))
    (SETVAR "QAFLAGS" 1)
    (COMMAND "GROUP" SS "")
    (SETQ ENLAST1 (ENTLAST))
    (SETVAR "QAFLAGS" 0)
    (command "pickstyle" "0")
    (command "ucs" "p")
)
      )
    )
    (princ "前次編輯未結束")
)
(command "_.undo" "_end")
)
(defun C:cb1 (/ HOLDECHO HOLDBLIP A AA BLKREF pt)
(setvar "CMDECHO" 0)
(command "ucs" "w")
(setq olayer (getvar "clayer"))
(setvar "clayer" xb_layer)
(command "pickstyle" "1")
(redraw ENLAST1 3)
(setq AA (ssget))
(command "_.undo" "_group")
(setq HOLDECHO (getvar "cmdecho"))
(setq HOLDBLIP (getvar "blipmode"))
(setq HOLDOSMODE (getvar "OSMODE"))
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(setvar "OSMODE" 0)
(setq A (rtos (* (getvar "CDATE") 1E8)))
(command "scale" aa "" xb_pt sc_re)
;;縮回1
(command "rotate" aa "" xb_pt (- 0 xb_dg1))
;;轉回0
(if (= mi_x "1")
    (command "mirror" aa "" xb_pt tty "y"))
(if (= mi_y "1")
    (command "mirror" aa "" xb_pt ttx "y"))
;;鏡射回去
(if (/= AA NIL)
    (progn
      (command "-BLOCK" xb_name "y" xb_pt AA "")
      (command "-INSERT" xb_name xb_pt "" "" "" "" "")
      (SETQ ENLAST1 (ENTLAST))
      (setq enL1_data (entget ENLAST1))
      (command "scale" ENLAST1 "" xb_pt xb_sc)
    (setq oldr (assoc 41 enL1_data))
    (setq enL1_data (subst mir_41 oldr enL1_data))
    (entmod enL1_data)
    (setq oldr (assoc 42 enL1_data))
    (setq enL1_data (subst mir_42 oldr enL1_data))
    (entmod enL1_data)
      (command "rotate" ENLAST1 "" xb_pt xb_dg1)
      (command "attsync" "" ENLAST1 "")
      ;;放置最下方
      (command "draworder" ENLAST1 "" "b")
      (command "hatchtoback")
    )
)
(if (/= AA NIL)
    (setq xb_name nil)
)
(setvar "blipmode" HOLDBLIP)
(setvar "cmdecho" HOLDECHO)
(setvar "OSMODE" HOLDOSMODE)
(setvar "clayer" olayer)
(command "_.undo" "_end")
(command "ucs" "p")
(setq mi_x "0" mi_y "0")
(princ)
)
(defun C:xx1 ()
(setq xb_name nil)
(princ "Xb1指令重置")
)

paulpipi 发表于 2024-7-18 23:22:16

这么高级,试用一下,谢谢分享

jh3030912 发表于 2024-7-19 00:33:20

能做一个图块编号 保留原图块内容插件不

技术工作室 发表于 2024-7-19 07:45:29

好东西,支持一下

stgpmin 发表于 2024-7-19 08:25:08

jh3030912 发表于 2024-7-19 00:33
能做一个图块编号 保留原图块内容插件不

不太懂,可以多說明一下嗎?

panliang9 发表于 2024-7-19 08:37:41

本帖最后由 panliang9 于 2024-7-19 08:57 编辑

谢谢楼主分享!
我理解你的工作是这样的:

1、XB1 命令,块炸开成组,并且给出组名。

2、CB1 命令 ,把“pickstyle” 打开,可以选中刚才哪个组。

MZ_li 发表于 2024-7-19 10:32:35

学习了:lol

gble119 发表于 2024-7-19 12:43:49

没太看明白意思:o-

stgpmin 发表于 2024-7-19 16:11:11

panliang9 发表于 2024-7-19 08:37
谢谢楼主分享!
我理解你的工作是这样的:



沒錯
說明一下,pickstyle是控制選擇群組
當執行XB1後,會將所炸開的物件做群組,所以必須把pickstyle設為0,才能對炸開後的物件單獨編輯
所以執行CB1時,必須再把pickstyle設為1。
如果你平常習慣是把pickstyle設為0,那就在CB1指令最後面再加入一行(command "pickstyle" "0")

阿猪蛋 发表于 2024-7-22 10:43:14

好东西,支持一下
页: [1]
查看完整版本: 炸開圖塊修改,然後再依原圖塊存檔的小程序