lee50310 发表于 2024-8-18 05:26:43

不開啟圖檔 選取要 Purge、打開、解凍、解鎖所有圖層及要炸開圖的目錄夾

本帖最后由 lee50310 于 2024-8-18 15:28 编辑

不開啟圖檔選取要Purge、開啟、解凍、解鎖所有圖層及要炸開圖的目錄夾


執行指令:bexp
         
            說明:在不開圖情況下 ,執行bexp指令 並選取測試圖檔資料夾 bk-test 按確認
                  執行前 如圖1,執行後如圖2


lee50310 发表于 2024-8-19 15:53:59

本帖最后由 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:07:39

本帖最后由 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-18 12:09:34

本帖最后由 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 05:32:34

本帖最后由 lee50310 于 2024-8-18 10:57 编辑

測試圖檔....

jh3030912 发表于 2024-8-18 06:12:08

可以不来图 使用自定义lisp 命令吗

jh3030912 发表于 2024-8-18 06:15:23

炸开块(属性块不炸)怎么设置?

jenlin 发表于 2024-8-18 08:05:22

学习一下!

tigcat 发表于 2024-8-18 08:06:54

谢谢分享,实用程序

sunny_8848 发表于 2024-8-18 08:46:11

多谢楼主分享,下载试试

advksf 发表于 2024-8-18 09:21:16

好资料,谢谢分享

muai2010 发表于 2024-8-18 10:55:25

感谢分享......

寒潮大冬瓜 发表于 2024-8-18 12:08:20

很好→很棒!很好~很棒!!很好……很棒!!!
页: [1] 2 3 4
查看完整版本: 不開啟圖檔 選取要 Purge、打開、解凍、解鎖所有圖層及要炸開圖的目錄夾