菜卷鱼 发表于 2025-11-4 17:35
用这个
首先表示感谢 但我要解决的不是插入块的问题,是想解决属性找不到无法转换为entmake代码的问题
_rocky 发表于 2025-11-5 08:30
首先表示感谢 但我要解决的不是插入块的问题,是想解决属性找不到无法转换为entmake代码的问题
entmake相当于重新做一遍块,没必要啊
菜卷鱼 发表于 2025-11-5 14:01
entmake相当于重新做一遍块,没必要啊
是重做一遍是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求
_rocky 发表于 2025-11-5 14:04
是重做一遍是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求
建议到原文件中,把所有东东弄成一个块,然后用论坛里边的块转lsp来处理
llsheng_73 发表于 2025-11-5 14:31
建议到原文件中,把所有东东弄成一个块,然后用论坛里边的块转lsp来处理
源文件就是一个块,在5楼见附件
对楼主的代码进行了测试发现,块定义没有问题,能成功定义块
问题出在最后插入块的时候,(66 . 1)需要在entnmake通过(0 . "insert)插入(cons 2 "$DorLib2D$00000009")指定的块主体后,继续通过entmake插入它的属性,直到(0 . "SEQEND")结束,才能正常显示块主体及它的属性
也就是说,楼主的代码,要插入块后增加属性,程序还没有完,一般说来至于还要两个entmake,一个增加属性,另一个(0 . "SEQEND")结束。
或者去掉66组,将"$DorLib2D$00000009"作为一个普通块插入,也是可以正常显示
_rocky 发表于 2025-11-4 13:35
这个块通过快编辑器打开后找不到属性定义,
请问 ,怎么找到通过代码找到它的属性定义?
(defun getatts(blk)
(if(equal(VL-CATCH-ALL-APPLY'vlax-get-property(list(setq blk(if(=(type blk)'ename)(vlax-ename->vla-object blk)blk))'HasAttributes)):vlax-true)
(mapcar(function(lambda(x)(list(vla-get-TagString x)(vla-get-TextString x)x)))(vlax-safearray->list(vlax-variant-value(vlax-invoke-method blk'GetAttributes))))))
GETATTS
_$ (GETATTS(car(entsel)))
(("A" "GM-0921" #<VLA-OBJECT IAcadAttributeReference2 04f74b24>))
函数返回属性的TAG,值,对象,可以自行通过对象获取它的坐标以及属性文字的字体样式,大小,对齐方式等格式相关数据
_rocky 发表于 2025-11-4 15:55
(tblsearch "block" name) 是存在的
entmake插入实现不了时因为块丢失了属性,原因在于遍历BLOCK实体的 ...
块的属性有两种情况,一种情况块本身是没有属性的,通过(66 . 1)方式插入块参照后继续追加属性直到(entmake '((0 . "SEQEND")))结束,这种情况通过tbl相关的函数是获取不到关于属性的任何信息;另一种是定认块主体的时候,和在块内添加一般图元对象一样,通过AddAttribute方法增加属性对象,或者使用相应的entmake也是一样的效果,这样的属性是能通过tbl相关函数获取属性的定义数据的,注意是定义数据,因为插入块参照后,它的属性一般情况下是可以修改的,有可能每个参照的同一属性,值各不相同,比如cass的高程点的高程注记属性(它是通过插入普通的GC200后继续追加的属性)
对于插入参照后追加的属性,需要对块参照图元通过entnext来查询它的后续图元是否为该参照的子图元(属性)来获取,
_rocky 发表于 2025-11-5 14:04
是重做一遍是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求
重做属性块容易,重做带动态属性的块难啊,你碰到动态块咋办
菜卷鱼 发表于 2025-11-5 16:50
重做属性块容易,重做带动态属性的块难啊,你碰到动态块咋办
暂时没遇到,发一个过来我试试:handshake