DBX怎么查询到块中实体,然后删除操作,主要是获取块中实体
DBX怎么查询到块中实体,然后删除操作,主要是获取块中实体本帖最后由 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))
)) 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 14:32 编辑
你要的是块参照blockreference对象 ,而不是块block对象
*DBX* 对应的就是Docment. 只是没有界面,可操作的对角为 浅绿色和浅蓝色部分。
感谢大佬。折腾几天,对于大佬给的图我也不懂,我总结下理解,ms相当于ssget,getblocks相当于块编辑,这样就可以对应着理解,操作了
页:
[1]