明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 362|回复: 6

[提问] SEQEND是什么图元

[复制链接]
发表于 2024-7-16 13:17:19 | 显示全部楼层 |阅读模式
本帖最后由 hubeiwdlue 于 2024-7-16 14:14 编辑

论坛上搜索的生成匿名块的代码,里面有个疑惑,为什么需要专门对SEQEND图元进行判断,提取图元名,生成entnext,下一个图元。

  1. (progn
  2.         ;;开始生成块
  3.         (entmake (list
  4.                    (cons '0 "BLOCK")
  5.                    (cons '2 "*U");块名
  6.                    (cons '70 1);块类型标志,1 匿名块
  7.                    (cons '10 ip);基点
  8.                  )
  9.         )
  10.         ;;生成块内图元
  11.         (setq cnt (sslength ss))
  12.         (while (>= (setq cnt (1- cnt)) 0)
  13.           (setq tmp (ssname ss cnt))
  14.           (entmake (setq el (entget tmp)))
  15.           (if (> (cdr (assoc 66 el)) 0)
  16.             (while
  17.               (/= "SEQEND"
  18.                 (cdr
  19.                   (assoc
  20.                     0
  21.                     (entmake
  22.                       (setq el (entget (entnext (cdr (assoc -1 el)))))
  23.                     )
  24.                   )
  25.                 )
  26.               )
  27.             )
  28.           )
  29.           (entdel tmp)
  30.         )
  31.         (setq blna (entmake (list (cons '0 "ENDBLK"))));创建块结束
  32.         (entmake (list
  33.                    (cons '0 "INSERT")
  34.                    (cons '2 blna);块名
  35.                    (cons '10 ip);插入点
  36.                  )
  37.         )
  38.       )


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-7-16 13:25:50 | 显示全部楼层
SEQEND=SequenceEnd。没有SEQEND怎么知道结束了?
 楼主| 发表于 2024-7-16 14:13:04 | 显示全部楼层
kozmosovia 发表于 2024-7-16 13:25
SEQEND=SequenceEnd。没有SEQEND怎么知道结束了?

谢谢您的指导,SequenceEnd序列结束。以下是dxf手册中的解释,
该图元标记多段线顶点的结束(顶点类型名),或具有属性(由插入图元中出现的非零 66 组表示)的插入图元的属性图元的结束(属性类型名)。 该代码不保存在 DXF 文件中。
什么时候会有序列结束,为什么要把序列结束后的图元,生成在块中,这一句代码不要,好像也不影响程序运行,应该是处理某种特殊情况。
发表于 2024-7-16 15:10:27 | 显示全部楼层
一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属性或顶点)。当 entmake 看见复合图元被建立时, 它将建立一个临时文件来存放这些已定义的数据。对entmake 而言, 将会有一检查此临时文件是否存在的操作。如果存在, 新数据将被加入到文件中。当复合图元的定义被完成时(经过增加适当的Seqend或 Endblk 图元), 数据将被再重新检查一次, 而复合图元将被增加到绘图中。完成后的图块定义(一个Endblk的entmake)将返回不同于正常返回图元数据表的图块名称
发表于 2024-7-16 15:14:05 | 显示全部楼层
czb203 发表于 2024-7-16 15:10
一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属 ...

你的解释很好
 楼主| 发表于 2024-7-16 16:02:01 | 显示全部楼层
czb203 发表于 2024-7-16 15:10
一个复合图元(即一图块定义、多段线或包含属性的图块图形引用)都可经过多次调用entmake来定义它的副图元(属 ...

谢谢长老,我在研究一下。
 楼主| 发表于 2024-7-16 17:29:13 | 显示全部楼层
本帖最后由 hubeiwdlue 于 2024-7-16 17:31 编辑

SEQEND是属性块中,插入属性结束的标志,应该是插入块"INSERT"的一个附加图元,并不属于块(block)本身。66号组码是插入块"INSERT"的一个组码,控制是否跟随属性,以下是G版关于插入属性的一段代码,作为插入属性的例子。
  1. (defun gxl-cs:gcd (inspt height scale / pt blkdef obj);展高程点函数(inspt:插入点,heitht:高程值,scale:缩放比例,xsws:高程注记位数)
  2.   (setvar "CMDECHO" 0)
  3.   (command "layer" "m" "ZDH" "c" "3" "" "L" "CONTINUOUS" ""  "")
  4.   (if height
  5.     (setq height high);
  6.     (setq height "")
  7.   )
  8.   (regapp "SOUTH")
  9.   
  10.   ;;;检查字体 "HZ" 是否存在
  11.   (if (not (tblobjname "style" "HZ"))
  12.     (command "style" "HZ" "rs.shx,hztxt.shx" 0 1 0 "" "" "")
  13.   )
  14.   ;;;检查是否存在高程点图块定义
  15.   (if (not (tblobjname "block" "DH200"))
  16.     (progn
  17.                         (entmake (list '(0 . "POINT")
  18.                                                                  '(100 . "AcDbEntity")
  19.                                                                  '(100 . "AcDbPoint")
  20.                                                                  '(62 . 3)
  21.                                                                  (cons 10 inspt)
  22.                                                          )
  23.                         )
  24.                         (setq ENDBLK (entmake (entget (entlast))))
  25.     )
  26.   )
  27.   ;;;插入块
  28.   (entmake (list
  29.              '(0 . "INSERT")
  30.              '(100 . "AcDbEntity")
  31.              '(100 . "AcDbBlockReference")
  32.              '(66 . 1);;;属性跟随标志,1跟随,0不跟随
  33.                                                  (cons 2 "DH200")
  34.                                                  (cons 10 inspt)
  35.                                                  (cons 41 scale)
  36.                                                  (cons 42 scale)
  37.                                                  (cons 43 scale)
  38.                                                  (list -3 '("SOUTH" (1000 . "202101")))
  39.            )
  40.   )
  41.   ;;;插入属性
  42.   (entmake (list
  43.              '(0 . "ATTRIB")
  44.              '(100 . "AcDbEntity")
  45.              '(100 . "AcDbText")
  46.                                                  (cons 10 (setq pt (polar inspt 0 (* 1.0 scale))))
  47.                                                  (cons 40 (* 2.0 scale))
  48.                                                  (cons 50 0)
  49.                                                  (cons 41 0.8)
  50.                                                  (cons 51 0)
  51.                                                  (cons 1 height)
  52.                                                  (cons 7 "HZ")
  53.                                                  (cons 62 1)
  54.                                                  (cons 72 0)
  55.                                                  (cons 11 pt)
  56.                                                  '(100 . "AcDbAttribute")
  57.                                                  (cons 2 "height")                                                
  58.                                                  (cons 70  0)
  59.                                                  (cons 74 2)
  60.            )
  61.         )
  62.         
  63.         
  64.         ;;;结束标志
  65.         (entmake '((0 . "SEQEND")))
  66.         (princ)
  67. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-24 11:32 , Processed in 0.171970 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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