zxh92 发表于 2023-11-28 21:07:24

DBX怎么查询到块中实体,然后删除操作,主要是获取块中实体

DBX怎么查询到块中实体,然后删除操作,主要是获取块中实体

vitalgg 发表于 2023-11-29 11:30:07

本帖最后由 vitalgg 于 2023-11-29 17:16 编辑

;; 加载@lisp函数库
(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))

;; 修改以下配置信息===================================
(setq framename "图框块名") ;; 你的图框块名
(setq signs '("签名1" "签名2")) ; 手写签名块的名称
;;==================================================

;; 功能:清空DBX对象中属性块的属性值
(defun dbx-clean-att (dwg-file / blk-obj blk3)
;; 打开外部dwg的DBX对象. 假定文件为 D:/abc.dwg
(setq dwg-file (findfile dwg-file))
(dbx:open dwg-file)
;;取dbx中的模型空间中的实体
(setq dbx-ms(vla-get-modelspace *DBX*))
;; 取dbx块集中的第4个块定义对象(前几个是model-space paper-space之类的)
(setq n 0)
(repeat (vla-get-count dbx-ms)
          (setq obj% (vla-item dbx-ms n))
          (print (vla-get-objectname obj%))
          (cond
          ;; 将图框块中的设计、校对的属性值清空
          ((and (= (vla-get-objectname obj%) "AcDbBlockReference")
                  (= (vla-get-HasAttributes obj%) :vlax-true)
                  (= (vla-get-effectivename obj%) framename)
                  )
             ;;清空属性值
             (block:set-attributes obj% '(("设计" . "")("校对" . ""))))
          ;; 删除签名块
          ((and (= (vla-get-objectname obj%) "AcDbBlockReference")
                  (member (vla-get-effectivename obj%)
                          signs
                          ))
             (vla-delete obj%)
             ))
          (setq n (1+ n)))
(setq tmp-file (strcat dwg-file ".b.dwg"))
(vla-saveas *DBX* tmp-file)
;;(vla-save *DBX*) ;; 新版本DBX不支持直接写入
(dbx:release)
(if (and (findfile tmp-file)
           (>(vl-file-size tmp-file) 0))
      (progn
        (vl-file-delete dwg-file)
        (vl-file-rename tmp-file dwg-file))
      ))

zxh92 发表于 2023-11-29 12:54:24

vitalgg 发表于 2023-11-29 11:30


测试dwg有2个相同的属性块,还问下(setq dbx-blks(vla-get-blocks*DBX*))的话,我用vla-get-Name,只得到一个块名,
如果用ModelSpace可以得到2个,,因为是属性块,我想。所以我觉得应该ModelSpace,得到2个,然后再用(setq blk3 (vla-item dbx-blks 3))来对块处理,求大佬指点

vitalgg 发表于 2023-11-29 13:26:40

本帖最后由 vitalgg 于 2023-11-29 14:32 编辑

你要的是块参照blockreference对象 ,而不是块block对象

*DBX* 对应的就是Docment. 只是没有界面,可操作的对角为 浅绿色和浅蓝色部分。





zxh92 发表于 2023-11-30 07:38:43

感谢大佬。折腾几天,对于大佬给的图我也不懂,我总结下理解,ms相当于ssget,getblocks相当于块编辑,这样就可以对应着理解,操作了
页: [1]
查看完整版本: DBX怎么查询到块中实体,然后删除操作,主要是获取块中实体