明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: _rocky

[提问] 这段entmake指令为什么不能把图块$DorLib2D$00000009插入到新的cad文件?

[复制链接]
 楼主| 发表于 2025-11-5 08:30:22 | 显示全部楼层

首先表示感谢 但我要解决的不是插入块的问题,是想解决属性找不到无法转换为entmake代码的问题
回复 支持 反对

使用道具 举报

发表于 2025-11-5 14:01:43 | 显示全部楼层
_rocky 发表于 2025-11-5 08:30
首先表示感谢 但我要解决的不是插入块的问题,是想解决属性找不到无法转换为entmake代码的问题

entmake相当于重新做一遍块,没必要啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-5 14:04:56 | 显示全部楼层
菜卷鱼 发表于 2025-11-5 14:01
entmake相当于重新做一遍块,没必要啊

是重做一遍  是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求
回复 支持 反对

使用道具 举报

发表于 2025-11-5 14:31:32 | 显示全部楼层
_rocky 发表于 2025-11-5 14:04
是重做一遍  是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求

建议到原文件中,把所有东东弄成一个块,然后用论坛里边的块转lsp来处理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-5 14:39:10 | 显示全部楼层
llsheng_73 发表于 2025-11-5 14:31
建议到原文件中,把所有东东弄成一个块,然后用论坛里边的块转lsp来处理

源文件就是一个块,在5楼见附件
回复 支持 反对

使用道具 举报

发表于 2025-11-5 16:00:56 | 显示全部楼层
对楼主的代码进行了测试发现,块定义没有问题,能成功定义块
问题出在最后插入块的时候,(66 . 1)需要在entnmake通过(0 . "insert)插入(cons 2 "$DorLib2D$00000009")指定的块主体后,继续通过entmake插入它的属性,直到(0 . "SEQEND")结束,才能正常显示块主体及它的属性
也就是说,楼主的代码,要插入块后增加属性,程序还没有完,一般说来至于还要两个entmake,一个增加属性,另一个(0 . "SEQEND")结束。
或者去掉66组,将"$DorLib2D$00000009"作为一个普通块插入,也是可以正常显示
回复 支持 反对

使用道具 举报

发表于 2025-11-5 16:07:00 | 显示全部楼层
_rocky 发表于 2025-11-4 13:35
这个块通过快编辑器打开后找不到属性定义,
请问 ,怎么找到通过代码找到它的属性定义?

  1. (defun getatts(blk)
  2.   (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)
  3.     (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,值,对象,可以自行通过对象获取它的坐标以及属性文字的字体样式,大小,对齐方式等格式相关数据
回复 支持 反对

使用道具 举报

发表于 2025-11-5 16:17:53 | 显示全部楼层
_rocky 发表于 2025-11-4 15:55
(tblsearch "block" name) 是存在的
entmake插入实现不了时因为块丢失了属性,原因在于遍历BLOCK实体的 ...

块的属性有两种情况,一种情况块本身是没有属性的,通过(66 . 1)方式插入块参照后继续追加属性直到(entmake '((0 . "SEQEND")))结束,这种情况通过tbl相关的函数是获取不到关于属性的任何信息;另一种是定认块主体的时候,和在块内添加一般图元对象一样,通过AddAttribute方法增加属性对象,或者使用相应的entmake也是一样的效果,这样的属性是能通过tbl相关函数获取属性的定义数据的,注意是定义数据,因为插入块参照后,它的属性一般情况下是可以修改的,有可能每个参照的同一属性,值各不相同,比如cass的高程点的高程注记属性(它是通过插入普通的GC200后继续追加的属性)
对于插入参照后追加的属性,需要对块参照图元通过entnext来查询它的后续图元是否为该参照的子图元(属性)来获取,
回复 支持 反对

使用道具 举报

发表于 2025-11-5 16:50:56 | 显示全部楼层
_rocky 发表于 2025-11-5 14:04
是重做一遍  是把原cad文件的数据全部转换为entmake代码,在新的文件里面生成,这是需求

重做属性块容易,重做带动态属性的块难啊,你碰到动态块咋办
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-11-5 17:32:54 | 显示全部楼层
菜卷鱼 发表于 2025-11-5 16:50
重做属性块容易,重做带动态属性的块难啊,你碰到动态块咋办

暂时没遇到,发一个过来我试试
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-28 12:12 , Processed in 0.144306 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表