不開啟圖檔 選取要 Purge、打開、解凍、解鎖所有圖層及要炸開圖的目錄夾
本帖最后由 lee50310 于 2024-8-18 15:28 编辑不開啟圖檔選取要Purge、開啟、解凍、解鎖所有圖層及要炸開圖的目錄夾
執行指令:bexp
說明:在不開圖情況下 ,執行bexp指令 並選取測試圖檔資料夾 bk-test 按確認
執行前 如圖1,執行後如圖2
本帖最后由 lee50310 于 2024-8-19 17:49 编辑
水洗可口可乐 发表于 2024-8-19 09:32
不開啟圖檔 查找DWG文件目錄夾 的文字/图块,LISP可以做到吗?
可以做到 要處理 塊,弧,圓,多行文字, 文字......線段等
假如 要處理的目的資料夾 bk-test 內有一 圖檔 圖檔內如圖a
將程式的內容 部分 改為
...
...
(setq acdoc(LM:GetDocumentObject (vlax-get-acad-object) filePath)) ;獲取活動文檔對象
(setq msop (vla-get-ModelSpaceacdoc)) ; 模型空間的對象
(foreach xn '(ss-block ss-arc ss-circle ss-mtext ss-text ss-pline ss-line) (set xn 'nil)) ;清除各項表內容
(vlax-for obj msop
(setqsel_objtype (vla-get-objectname obj))
(cond
((= sel_objtype "AcDbBlockReference") ;判斷物體是否為 block
(setq ss-block(cons obj ss-block )) );列表塊
((= sel_objtype "AcDbArc") (setq ss-arc (cons obj ss-arc )) );列表弧
((= sel_objtype "AcDbCircle") (setq ss-circle(cons obj ss-circle)) );列表圓
((= sel_objtype "AcDbMText") (setq ss-mtext(cons obj ss-mtext )) );列表多行文字
((= sel_objtype "AcDbText") (setq ss-text (cons obj ss-text)) );列表文字
((= sel_objtype "AcDbLWPolyline")(setq ss-pline(cons obj ss-pline )) );列表多段線
((= sel_objtype "AcDbLine") (setq ss-line (cons obj ss-line)) );列表線段
);end_cond
);end_vlax-for
...
...
上式是在不開圖的情況下 將要處理的每個項目收集成表
如 列表弧 ss-arc 圖a上有三個 實際取到的對象也是三個 再根據自己的需求 去做處理
(#<VLA-OBJECT IAcadArc 000001e2138afde8>
#<VLA-OBJECT IAcadArc 000001e2138acf88>
#<VLA-OBJECT IAcadArc 000001e2138ae028>)
ps:須注意 ,不開圖要對物體作處理 如:塊炸開,或對文字做替換...等 都須用 對象去做
,不要把 對象轉為 圖元名稱 處理 這樣會抓不到物體出現錯誤!
本帖最后由 lee50310 于 2024-9-15 04:17 编辑
yyz123121 发表于 2024-9-15 00:04
大神你好,请问下不需要炸块,也不需要对图层操作,只是“清理”一遍并保存,应该保留哪几行代码?
將程式中
.
.
(setq acdoc(LM:GetDocumentObject (vlax-get-acad-object) filePath)) ;獲取活動文檔對象
(setq msop (vla-get-ModelSpaceacdoc)) ; 取模型空間的對象
;|------------------------------ 當成註解-----START
(setq nt (vla-get-count msop) i 0 j 0) ;取得變體合集之總數量, 炸開物體數量i,j清為 0)
(vlax-for obj msop
(setqsel_objtype (vla-get-objectname obj))
(cond
((= sel_objtype "AcDbBlockReference") ;判斷物體是否為 block ,若是則炸開
;炸開物體三種寫法皆可
(vla-explode obj)
(vla-deleteobj)
(setq i(+ i 1))
)
);end_cond
(setq j(+ j i))
);end_vlax-for
(layall_trueacdoc) ;打開,解凍,解鎖所有圖層
|;------------------------------ 當成註解-----END
(if (= 1 (getvar 'dwgtitled))
(progn
(repeat 3 (vla-purgeall acdoc)) ; PURGE 指令清理圖形
);end_progn
);end_if
(vla-saveas acdoc filePath) ;存檔
(vlax-release-object acdoc) ;釋放後,繪圖物件不再可以透過 obj存取
)
)
(alert "未選擇任何文件夾.")
);end_if
本帖最后由 lee50310 于 2024-8-26 14:42 编辑
jh3030912 发表于 2024-8-18 06:15
炸开块(属性块不炸)怎么设置?
用編輯器 bexp_chs.lsp 找到
..
..
(vlax-for obj msop
(setqsel_objtype (vla-get-objectname obj))
..
..
(setq j(+ j i))
);end_vlax-for
(vlax-for obj msop
(setqsel_objtype (vla-get-objectname obj))
(cond
((= sel_objtype "AcDbBlockReference");判斷物體是否為 block ,若是則炸開
(if (not(= (vlax-method-applicable-p obj 'GetAttributes) 'T)) ;判斷若是屬性塊則跳過
(progn
(vla-explode obj)
(vla-deleteobj)
(setq i(+ i 1))
);end_progn
);end_if
)
);end_cond
(setq j(+ j i))
);end_vlax-for
將上方找到相同對應的值 覆蓋存檔即可
本帖最后由 lee50310 于 2024-8-18 10:57 编辑
測試圖檔....
可以不来图 使用自定义lisp 命令吗 炸开块(属性块不炸)怎么设置? 学习一下! 谢谢分享,实用程序 多谢楼主分享,下载试试 好资料,谢谢分享 感谢分享...... 很好→很棒!很好~很棒!!很好……很棒!!!