
图元指的是cad中的基本图形,在dwg中有自己专有的一段数据描述,包括位置、形状、线性、颜色、图层等等。比如一个圆,关键是圆心座标,半径,知道这两个数据我们就能在cad中生成它。
生成图元有两种方法,其一,利用平时操作cad的按键所代表的命令描述。以圆为例,在命令行输入如下代码可以生成如下圆心位于原点,半径5的一个圆。
(vl-cmdf "circle" '(0 0) 5 );2014以下可以用command也一样,高版本用command-s也一样

其二,利用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