c++实现多段线生成_CAD二次开发-lisp篇(2)生成、删除、修改图元

本文介绍了在C++中如何通过CAD二次开发实现多段线的生成,包括使用entmake方法直接生成图元组码,以及删除和修改图元的技巧。强调了entmake方法在批量生成图元时的优势,并提示删除图元的关键在于图元名称,而修改图元的策略则隐藏在生成图元的过程中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5a0d94f69181a4678d4d3eebca8f349f.png

图元指的是cad中的基本图形,在dwg中有自己专有的一段数据描述,包括位置、形状、线性、颜色、图层等等。比如一个圆,关键是圆心座标,半径,知道这两个数据我们就能在cad中生成它。

生成图元有两种方法,其一,利用平时操作cad的按键所代表的命令描述。以圆为例,在命令行输入如下代码可以生成如下圆心位于原点,半径5的一个圆。

(vl-cmdf "circle" '(0  0) 5 );2014以下可以用command也一样,高版本用command-s也一样

75f26345425c86b8e74ed7ac242274e9.png

其二,利用entmake方法直接生成图元组码。形如

(entmake (list '(0 . "CIRCLE") (cons 10 '(0 0)) (cons 40 5)))

也能达到方法一完成的效果。我更推荐用entmake方法,因为一这种方法不会应为鼠标或者捕捉等原因影响,二在批量生成图元时要比vl-cmdf方法快很多。我把自己总结以及网上收集的一些例子列出来。

;1、直线
(entmake (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt2)))

;2、两顶点多段线(多顶点类似)
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 2) (cons 10 pt1) (cons 10 pt2)))
  
;3、点表生成多段线
(entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
      (mapcar '(lambda (pt)(cons 10 pt)) lst ))
)

;4、圆
(entmake (list '(0 . "CIRCLE") (cons 10 pt) (cons 40 r)))

;5、圆弧
(entmake (list '(0 . "ARC") (cons 10 pt) (cons 40 r) (cons 50 ang1) (cons 51 ang2)))

;6、单行文本
(entmake (list '(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 5)))

;7、多行文本
(entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") '(7 . "Standard") (cons 1 str) (cons 10 pt)))

;8、半径标注
(entmake (list '(0 . "DIMENSION") '(100 . "AcDbEntity") '(100 . "AcDbDimension")(cons 10 pt) '(70 . 36) '(100 . "AcDbRadialDimension")        (cons 15 pt1) ) )
  
;9、直径标注
(entmake (list '(0 . "DIMENSION") '(100 . "AcDbEntity") '(100 . "AcDbDimension") (cons 10 pt1) (cons 11 pt2) '(70 . 163) '
   (100 . "AcDbDiametricDimension") (cons 15 pt3)
    )
  )
  
;10、水平标注
(entmake (list '(0 . "DIMENSION") '(100 . "AcDbEntity") '(100 . "AcDbDimension") (cons 10 pt) '(70 . 32) '(1 . "") '(100 . "AcDbAlignedDimension")
   (cons 13 pt1) (cons 14 pt2) '(100 . "AcDbRotatedDimension")
    )
)
  
;11、垂直标注
(entmake (list '(0 . "DIMENSION") '(100 . "AcDbEntity") '(100 . "AcDbDimension") (cons 10 pt) '(70 . 32) '(1 . "") '(100 . "AcDbAlignedDimension")
   (cons 13 pt1) (cons 14 pt2) '(50 . 1.5708) '(100 . "AcDbRotatedDimension")
    )
  )


;12、倾斜标注  
(entmake (list '(0 . "DIMENSION") '(100 . "AcDbEntity") '(100 . "AcDbDimension") (cons 10 pt1) '(70 . 33) '(1 . "") '(100 . "AcDbAlignedDimension")
   (cons 13 pt2) (cons 14 pt3)
    )
  )
  
;13、entmake生成普通块
(defun emkblk (ss pt name / i)
  (entmake (list '(0 . "block") (cons 2 name) '(70 . 0) (cons 10 pt)))
  (repeat (setq i (sslength ss))    (entmake (cdr (entget (ssname ss (setq i (1- i))))))  )
  (entmake '((0 . "ENDBLK")))
  (command "_.erase" ss "")
  (entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
)
  
;14、entmake插入普通块
(entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))

;15 、entmake生成无名块
(defun emkunameblk (ss pt / i name)
  (entmake (list '(0 . "block") '(2 . "*U") '(70 . 1) (cons 10 pt)))
  (repeat (setq i (sslength ss))    (entmake (cdr (entget (ssname ss (setq i (1- i))))))  )
  (setq name (entmake '((0 . "ENDBLK"))))
  (command "_.erase" ss "")
  (entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
  name
)
  
;16、将选择集做成属性块(选择集中单行文本作为属性)
(defun emkattblk (ss pt name / ent i)
  (entmake (list '(0 . "block") (cons 2 name) '(70 . 2) (cons 10 pt)))
  (repeat (setq i (sslength ss))
    (setq ent (entget (ssname ss (setq i (1- i)))))
    (if (= (cdr (assoc 0 ent)) "TEXT")
      (entmake (list '(0 . "ATTDEF") (assoc 10 ent) (assoc 40 ent) (assoc 1 ent) (cons 3 (cdr (assoc 1 ent))) 
      (cons 2 (cdr (assoc 1 ent))) '(70 . 0)))
      (entmake (cdr ent))
    )
  )
  (entmake '((0 . "ENDBLK")))
)
  
;17、生成图层
(entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "Continuous")
   (cons 2 name)
    )
  )

  
;18、创建新线型
(entmake (list '(0 . "LTYPE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLinetypeTableRecord") (cons 2 "BERDIG 5-545") '  (3 . "Border ____   ____   ____   ____   ____") '(70 . 0) '(73 . 2) '(40 . 15.0) '(49 . 10.0) '(74 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值