SEQEND是什么图元
本帖最后由 hubeiwdlue 于 2024-7-16 14:14 编辑论坛上搜索的生成匿名块的代码,里面有个疑惑,为什么需要专门对SEQEND图元进行判断,提取图元名,生成entnext,下一个图元。
(progn
;;开始生成块
(entmake (list
(cons '0 "BLOCK")
(cons '2 "*U");块名
(cons '70 1);块类型标志,1 匿名块
(cons '10 ip);基点
)
)
;;生成块内图元
(setq cnt (sslength ss))
(while (>= (setq cnt (1- cnt)) 0)
(setq tmp (ssname ss cnt))
(entmake (setq el (entget tmp)))
(if (> (cdr (assoc 66 el)) 0)
(while
(/= "SEQEND"
(cdr
(assoc
0
(entmake
(setq el (entget (entnext (cdr (assoc -1 el)))))
)
)
)
)
)
)
(entdel tmp)
)
(setq blna (entmake (list (cons '0 "ENDBLK"))));创建块结束
(entmake (list
(cons '0 "INSERT")
(cons '2 blna);块名
(cons '10 ip);插入点
)
)
)
SEQEND=SequenceEnd。没有SEQEND怎么知道结束了? kozmosovia 发表于 2024-7-16 13:25
SEQEND=SequenceEnd。没有SEQEND怎么知道结束了?
谢谢您的指导,SequenceEnd序列结束。以下是dxf手册中的解释,
该图元标记多段线顶点的结束(顶点类型名),或具有属性(由插入图元中出现的非零 66 组表示)的插入图元的属性图元的结束(属性类型名)。 该代码不保存在 DXF 文件中。
什么时候会有序列结束,为什么要把序列结束后的图元,生成在块中,这一句代码不要,好像也不影响程序运行,应该是处理某种特殊情况。 一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属性或顶点)。当 entmake 看见复合图元被建立时, 它将建立一个临时文件来存放这些已定义的数据。对entmake 而言, 将会有一检查此临时文件是否存在的操作。如果存在, 新数据将被加入到文件中。当复合图元的定义被完成时(经过增加适当的Seqend或 Endblk 图元), 数据将被再重新检查一次, 而复合图元将被增加到绘图中。完成后的图块定义(一个Endblk的entmake)将返回不同于正常返回图元数据表的图块名称 czb203 发表于 2024-7-16 15:10
一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属 ...
你的解释很好 czb203 发表于 2024-7-16 15:10
一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属 ...
谢谢长老,我在研究一下。 本帖最后由 hubeiwdlue 于 2024-7-16 17:31 编辑
SEQEND是属性块中,插入属性结束的标志,应该是插入块"INSERT"的一个附加图元,并不属于块(block)本身。66号组码是插入块"INSERT"的一个组码,控制是否跟随属性,以下是G版关于插入属性的一段代码,作为插入属性的例子。
(defun gxl-cs:gcd (inspt height scale / pt blkdef obj);展高程点函数(inspt:插入点,heitht:高程值,scale:缩放比例,xsws:高程注记位数)
(setvar "CMDECHO" 0)
(command "layer" "m" "ZDH" "c" "3" "" "L" "CONTINUOUS" """")
(if height
(setq height high);
(setq height "")
)
(regapp "SOUTH")
;;;检查字体 "HZ" 是否存在
(if (not (tblobjname "style" "HZ"))
(command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
)
;;;检查是否存在高程点图块定义
(if (not (tblobjname "block" "DH200"))
(progn
(entmake (list '(0 . "POINT")
'(100 . "AcDbEntity")
'(100 . "AcDbPoint")
'(62 . 3)
(cons 10 inspt)
)
)
(setq ENDBLK (entmake (entget (entlast))))
)
)
;;;插入块
(entmake (list
'(0 . "INSERT")
'(100 . "AcDbEntity")
'(100 . "AcDbBlockReference")
'(66 . 1);;;属性跟随标志,1跟随,0不跟随
(cons 2 "DH200")
(cons 10 inspt)
(cons 41 scale)
(cons 42 scale)
(cons 43 scale)
(list -3 '("SOUTH" (1000 . "202101")))
)
)
;;;插入属性
(entmake (list
'(0 . "ATTRIB")
'(100 . "AcDbEntity")
'(100 . "AcDbText")
(cons 10 (setq pt (polar inspt 0 (* 1.0 scale))))
(cons 40 (* 2.0 scale))
(cons 50 0)
(cons 41 0.8)
(cons 51 0)
(cons 1 height)
(cons 7 "HZ")
(cons 62 1)
(cons 72 0)
(cons 11 pt)
'(100 . "AcDbAttribute")
(cons 2 "height")
(cons 700)
(cons 74 2)
)
)
;;;结束标志
(entmake '((0 . "SEQEND")))
(princ)
)
页:
[1]