_rocky 发表于 2025-11-4 11:41:26

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

本帖最后由 _rocky 于 2025-11-5 17:34 编辑


(entmake
(list
    (cons 0 "LAYER")
    (cons 100 "AcDbSymbolTableRecord")
    (cons 100 "AcDbLayerTableRecord")
    '(2 . "WINDOW")
    '(70 . 0)
    '(62 . 4)
    '(6 . "Continuous")
)
)
(entmake (list (cons 0 "BLOCK") '(2 . "$DorLib2D$00000009") '(70 . 0) '(4 . "") '(10 0.0 0.0 0.0)))
(entmake
(list
    (cons 0 "ARC")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 370 13)
    (cons 100 "AcDbCircle")
    (cons 10 '(0.37165 0.0817319 0.0))
    (cons 40 0.824561)
    (cons 210 '(0.0 0.0 1.0))
    (cons 100 "AcDbArc")
    (cons 50 1.52077)
    (cons 51 3.14284)
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.454107 0.0807006 0.0))
    (cons 11 '(0.454107 0.905262 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 0.905262 0.0))
    (cons 11 '(0.412878 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 0.0807006 0.0))
    (cons 11 '(0.454107 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.495335 -0.00175559 0.0))
    (cons 11 '(0.495335 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.495335 0.0807006 0.0))
    (cons 11 '(0.454107 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.454107 0.0807006 0.0))
    (cons 11 '(0.454107 0.0394725 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.454107 0.0394725 0.0))
    (cons 11 '(0.412878 0.0394725 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 -0.00175559 0.0))
    (cons 11 '(0.495335 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.495335 -0.00175559 0.0))
    (cons 11 '(0.495335 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 0.0394725 0.0))
    (cons 11 '(0.412878 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 370 13)
    (cons 100 "AcDbLine")
    (cons 10 '(0.378004 0.782157 0.0))
    (cons 11 '(0.378004 0.623508 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 370 13)
    (cons 100 "AcDbLine")
    (cons 10 '(0.488981 0.782157 0.0))
    (cons 11 '(0.488981 0.623508 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.454107 0.905262 0.0))
    (cons 11 '(0.412878 0.905262 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.494139 -0.00175559 0.0))
    (cons 11 '(-0.494139 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.411683 -0.00175559 0.0))
    (cons 11 '(-0.494139 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.411683 0.0394725 0.0))
    (cons 11 '(-0.411683 -0.00175559 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.452911 0.0394725 0.0))
    (cons 11 '(-0.411683 0.0394725 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.452911 0.0807006 0.0))
    (cons 11 '(-0.452911 0.0394725 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.494139 0.0807006 0.0))
    (cons 11 '(-0.452911 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(-0.494139 -0.00175559 0.0))
    (cons 11 '(-0.494139 0.0807006 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.488981 0.782157 0.0))
    (cons 11 '(0.454107 0.782157 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.488981 0.623508 0.0))
    (cons 11 '(0.454107 0.623508 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 0.782157 0.0))
    (cons 11 '(0.378004 0.782157 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake
(list
    (cons 0 "LINE")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 8 "0")
    (cons 100 "AcDbLine")
    (cons 10 '(0.412878 0.623508 0.0))
    (cons 11 '(0.378004 0.623508 0.0))
    (cons 210 '(0.0 0.0 1.0))
)
)
(entmake '((0 . "ENDBLK")))
(entmake
(list
    (cons 0 "INSERT")
    (cons 100 "AcDbEntity")
    (cons 67 0)
    (cons 410 "Model")
    (cons 8 "WINDOW")
    (cons 100 "AcDbBlockReference")
    (cons 66 1)
    (cons 2 "$DorLib2D$00000009")
    (cons 10 '(37101.6 265828.0 0.0))
    (cons 41 900.0)
    (cons 42 -900.0)
    (cons 43 900.0)
    (cons 50 1.5708)
    (cons 70 0)
    (cons 71 0)
    (cons 44 0.0)
    (cons 45 0.0)
    (cons 210 '(0.0 0.0 1.0))
)
)

)

菜卷鱼 发表于 2025-11-4 17:35:32

用这个
;;;插入块
(defun imblk (name pt sc ang / mspace 3dp blk ename)
(setq        mspace (vla-get-modelspace
               (vla-get-activedocument (vlax-get-acad-object))
             )
)
(setq 3dp (vlax-3D-point pt))
(and
    (or        (tblsearch "block" name)
        (if (findfile (strcat name ".dwg"))
          (progn
          (setvar 'cmdecho 0)
          (command "-insert" name ^e)
          (setvar 'cmdecho 1)
          )
        )
    )
    (and
      (tblsearch "block" name)
      (setq vlblk (vla-InsertBlock mspace 3dp name sc sc sc ang))
      (setq ename (vlax-vla-object->ename vlblk))
    )
)
ename
)

llsheng_73 发表于 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来查询它的后续图元是否为该参照的子图元(属性)来获取,

llsheng_73 发表于 2025-11-5 16:07:00

_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 11:48:12

其中定义图块正常,插入图块不显示,同样方法定义,其他图块能正常定义和插入,问题出在哪?

自贡黄明儒 发表于 2025-11-4 11:51:30

(cons 66 1)是属性块吧?
可以参考一下http://bbs.xdcad.net/forum.php?mod=viewthread&tid=678178&highlight=%E6%8F%92%E5%85%A5%E5%B1%9E%E6%80%A7%E5%9D%97

_rocky 发表于 2025-11-4 13:14:25

本帖最后由 _rocky 于 2025-11-4 13:49 编辑

自贡黄明儒 发表于 2025-11-4 11:51
(cons 66 1)是属性块吧?
可以参考一下http://bbs.xdcad.net/forum.php?mod=viewthread&tid=678178&highli ...
明白了丢属性数据了感谢

_rocky 发表于 2025-11-4 13:35:07

自贡黄明儒 发表于 2025-11-4 11:51
(cons 66 1)是属性块吧?
可以参考一下http://bbs.xdcad.net/forum.php?mod=viewthread&tid=678178&highli ...

这个块通过快编辑器打开后找不到属性定义,
请问 ,怎么找到通过代码找到它的属性定义?

自贡黄明儒 发表于 2025-11-4 13:47:49

参见    entnext e

_rocky 发表于 2025-11-4 13:49:47

本帖最后由 _rocky 于 2025-11-4 14:01 编辑

自贡黄明儒 发表于 2025-11-4 13:47
参见    entnext e
http://bbs.xdcad.net/forum.php?m ... E%E6%80%A7%E5%9D%97

拿这个函数试过了,也同样丢失属性

上面帖子5楼有把块的cad文件附上,请参照

菜卷鱼 发表于 2025-11-4 15:32:15

你先用(tblsearch "block" name) 看这个块是否存在,假如不存在insert假装插入导入属性,再用entmake插入,插入完之后 attsync一下,或者insert直接插入

_rocky 发表于 2025-11-4 15:55:27

菜卷鱼 发表于 2025-11-4 15:32
你先用(tblsearch "block" name) 看这个块是否存在,假如不存在insert假装插入导入属性,再用entmake插入, ...

(tblsearch "block" name) 是存在的
entmake插入实现不了时因为块丢失了属性,原因在于遍历BLOCK实体的时候,找不到属性
attsync解决的是属性成功创建,更新属性,没有属性attsync就没有效果
页: [1] 2 3
查看完整版本: 这段entmake指令为什么不能把图块$DorLib2D$00000009插入到新的cad文件?