热度 2||
一. 功能
在图形中生成一个新的对象(图元)。
二. 格式
(entmake [elist])
三. 说明
elist变元必须是图元定义数据的一个表﹐该表的隔适应与由entget函数返回的关联表的格式相似。Elist变元必须包含所要生成的图元的全部必要的信息。Entmake函数既可以用于生成图形图元﹐也可以用于生成非图形图元。如果任何必需的定义数据被省去了﹐entmake函数将返回nil﹐并拒绝生成这个图元。如果您省略去任选的定义数据(如:图层)﹐entmake函数将为它们取隐含值。
如果entmake成功地生成了一个新图元﹐它就返回该图元的定义数据表。如果entmake函数不能生成新图元﹐它就返回nil。
生成一个新图元的一种方法是首先通过调用entget函数获得一个图元的定义数据﹐修改图元的定义数据﹐然后将修订后的数据交付entmake函数。生成一个新图元之前﹐entmake函数检查所提供的是否是有效的图层名、线形名以及颜色代码。如果引入的是一个新的图层名﹐entmake函数就会自动生成这个新图层。Entmake函数还会检查BLOCK名﹐DIMENSION STYLE名﹐TEXT STYLE名以及 SHAPE名﹐如果所生成的图元类型要求提供这些对象的话。
图元类型(如:CIRCLE或LINE)必须是elist变元中的第一个或第二个域。如果图元类型是elist变元中的第二个域﹐则在它的前面仅可以是图元名。这正是entget函数所返回的关联表的那种格式。在这种情况下﹐当新图元被生成时﹐它会忽略图元名。如果elist变元中包含有一个图元句柄﹐它也会被忽略。
下面的代码段生成一个红色的圆﹐圆的圆心在(4.0)﹐半径是1。可选地图层和线型域被省略了﹐这样﹐就假定这些域的值取隐含值。
(entmake '((0. "CIRCLE") ; ; ;图元类型
(62.1) ; ; ;颜色
(10 4.0 4.0 4.0 ) ; ; ;圆心点
(4 1.0 1.0) ; ; ;半径
) ; ; ;
) ; ; ;
生成在一个冻结图层上的对象﹐在该图层被解冻之前﹐本图层上的对象不能被重新生成。
复杂图元的生成
一个复杂图元(一个块定义、一条多义线或包含有属性的一个块引用)﹐可以通过若干次的定义它的子图元(属性或顶点)的entmake调用来生成。当entmake函数看到正被生成的是一个复杂图元时﹐它会生成一个临时文件以便收集图元的定义数据。对于每一次的entmake调用﹐都会执行一次检查﹐看是否该临时文件已经存在。如果存在这样一个临时文件﹐新的数据将增补到该文件中。当复杂图元的定义完成时(通过增补一个合适的SEQEND或ENDBLK图元)﹐对所提供的数据会再检查一遍﹐并将该复杂图元加入到图形数据库中。一个块定义的完成(用entmake函数生成一个ENDBLK子图元)将返回该块定义的块名﹐而不会像普通的图元生成那样﹐返回图元的定义数据。
不能用entmake函数生成视窗(viewport)对象。
如果对某种图元类型来说所接受的数据是非法的。该图元以及整个复杂图元都会被拒绝。一个块定义既不能被嵌套﹐也不能引用它自身。然而﹐块定义中可以包含对另一个块定义的引用。一个复杂图元的所有图元既可以存在于模型空间中﹐也可以存在于图纸空间中﹐但不随多义线图元的唯一图元是一个顶点图元。
在一个复杂图元的定义完成之前﹐该复杂图元的任何部分进行都不会显示在屏幕上。通过调用不带变元的entmake函数﹐您可以终止一个复杂图元的生成。这样就会将临时文件清除掉﹐且会返回值nil。
BLOCK和ENDBLK图元可以用于生成一个新的块定义。最新生成的那些图块﹐会自动登记到符号表中。登记到符号表中的图块是可以被引用的。
用用程序可以用具有任意多个边的多面的网络(polyface mesh)来表示多边形(polygons)。然而﹐AutoCAD的图元结构对一个给定的面图元所能指定的顶点数目作了一定的限制。通过将多边形(polygons)划分成三角形契块﹐您可以表示更为复杂的多边形。AutoCAD用四顶点面(four-vertex face)来表示三角形契块(四顶点面中﹐有两个相邻第顶点具有相同的值)。它门的边(edges)应该是不可见态﹐以防止这种划分的可见物的形成。PFACE命令自动执行这种划分﹐但是﹐当应用程序直接生成多面网络 (polyface mesh)时﹐该应用程序本身必须作这种操作。
在这种划分的处理过程中﹐每个面的顶点数目是一个关键参数。系统变量fPFACEVMAX为应用程序提供了每个图元的顶点数目。这个变量是一个只读变量﹐且它的值被置为4。
当entmake函数生成一个图块时﹐它可能覆盖一个已有图块。Entmake函数对块定义表中的块名并不做是否冲突的检查。因此﹐在使用entmake函数生成图块前﹐应该使用tblsearch函数对块定义表中的块名作是否冲突的检查﹐这样就可以保证新生成的图块的名的唯一性。然而﹐使用entmake函数对无名块作重新定义(后面马上就要谈到)﹐可能是一个很有用的特性。
无名块的生成
一个图形中的块定义表可以包含多个无名块。生成无名快块是为了支持阴影图案(hatch patterns)和关联尺寸标注(associative dimenioning)。为应用程序自身的目的﹐无名块也可以用entmake函数来生成﹐它们当中通常包含用户不能直接访问的图元。
一个无名块名(组码2)通常具有*uinnn地形式﹐其中的nnn是由AutoCAD生成第一个数。另外﹐一个无名块的块类型标志(组码70)的低位被设置成1。当用entmake函数生成一个字符*打头的块﹐且其无名位(组码70的低位)被设置时﹐AutoCAD就将这个块作为一个无名块看待﹐并给它分配一个块名。跟在字符* 之后的块名字符串﹐传到entmake函数时会被忽略。如果您通过多次调用entmake函数生成了一个图块﹐只有您成功地作了如下的调用之后﹐entmake函数才会返回块名:
(entmake "endblk")
任何时候当您打开一个图形时﹐未被引用的所有无名块都将从块定义中清除。被引用(插入)过的无名块不能从块定义表中清除。您可以使用entmake函数生成对一个无名块的一个块引用(插入)﹐但不能将一个无名块传到INSERT命令中。您还能使用entmake函数对一个块作重新定义。在一个块中的图元(但不能是图元本身)可以用entmod函数进行修改。
虽然对无名块的引用是一种长期的行为﹐但在不同的图形对话过程中无名块的块名的数字部分可能会发生变化。应用程序不要依赖于无名块的块名会保持恒定不变。
四. 实例
例1.在用entmake函数生成一个图元之前,最好对所要生成的图元在命令行上先进行测试﹐这样就可以检查提供给entmake函数的变元elist的有效性。
Commond:(setq e '(0."LINE")(8."0")(10 2.0 2.0 0.0)(11 4.0 4.0 0.0))))<回车>
Commond:(entmake e) <回车>
上面键入的表达式﹐会在屏幕上显示一条直线。
例2. 设计一个程序改变图形中的一个现有图块的有X、Y和(或)Z方向的比例﹐而并不影响图块的特性或属性。
; ; ; -----------------------------------------------
(defun dxf (code elist)
(cdr (assoc code list)
)
; ; ; ------------------------------------------------
(defun ureal (bit kwdmsgdef / inp)
(if def
(setq msg(strcat "\n" msg "<" (rtos def 2) ">:")
bit(- bit (boole 1 bit 1))
)
(if (= "" (substr msg (strlen msg 1))
(setq msg (strcat "\n"(strbstr msg 1 (1- (strlen msg ))) ":")
(setq msg (strcat "\n" msg ":")
) ; ; ; if end
) ; ; ; if end
(intget bit kwd)
(setq inp (getrealmsg))
(if inp inp def)
); ; ; end defun
; ; ; -------------------------------------------
(defun C:BSALE( /en ed old41 old 42 old43 new41 new42 new43)
(if (and (setq en (entsel "\nSelect block to rescale:")
(= (def 0 (setq ed (entget (car en)))) "INSERT")
) ; ; ;
(entmod
(setq old41 (dxf 41 ed) ; ; ; 获得旧X
old42 (dxf 42 ed) ; ; ; 获得旧Y
old43 (dxf 43 ed) ; ; ; 获得旧Z
new41(ureal 1 " " "X Scale factor" old41) ; ; ; 新X
new42(ureal 1 " " "X Scale factor" old42) ; ; ; 新Y
new43(ureal 1 " " "X Scale factor" old43) ; ; ; 新Z
ed (subst (cons 41 new 41)((cons 41 old41) ed); ; ;改变X
ed (subst (cons 42 new 42)((cons 42 old42) ed); ; ;改变Y
ed (subst (cons 43 new 43)((cons 43 old43) ed); ; ;改变Z
) ; ; ; end setq
) ; ; ; end entmod
) ; ; ; end if
(princ)
) ; ; ; end defun
例3. 设计一个程序﹐该程序基于用户彔入的新的比例因子﹐改变用户所选择的文本和图块的比例。
; ; ; ----------------------------------------------------------------------------------
(defun dxf (code elist) ; ; ; 从关联表中取指定组码的值
(cdr (assoc code elist)) ; ; ;
) ; defun
; ; ; ----------------------------------------------------------------------------------
(defun udist (bit kwd msg def bpt / inp)
(if def
(setq msg (strcat "\n" msg "<" (rtos def) ">:")
bit (-bit (boole 1 bit 1))
) ; setq
(if (= "" (substr msg (strlen msg ) 1))
(setq msg
(strcat "\n"(substr msg 1 (1- (strlen msg ))) ":"))
(setq msg (strcat "\n" msg ":")
)
)
(initget bit kwd)
(setq inp (if bpt
(getdist msg bpt)
(getdist msg)
)
)
(if inp inpdef)
) ; defun
; ; ;-----------------------------------------------------
(defun C:CSCALE (/ ss1 oldsc fact count emax en ed et dxf72)
(prompt "\nSelect text and blocks to rescale …")
(if (setq ss1 (ssget '((0. "TEXT, INSERT"))))
(progn
(setq fact (/ (udist 1 "" "Newscalefactor" #dwgsc nil)
(udist 1 "" "Old scale factor" #dwgsc nil)
)
count 0
emax (sslength ss1)
) ; setq
(prompt "\nSearching …")
(while (<count emax)
(setq en (ssname ss1 count)
ed (entget en)
et (dxf 0 ed)) ; setq
(prompt ".")
(cond ((= et "TEXT")(setq dxf72 (dxf 72 ed))
(cond ((and (= dxf72 0)(= (dxf 73 ed) 0));;;and
(command "_.scale" en "" (dxf 10 ed) fact))
(( = dxf72 3)
(prompt "\nIgnoring ALIGNED text string"))
((= dxf72 5)
(prompt "\nIgnoring FIT text string"))
( T
(command "_.sale" en "" (dxf 11 ed) fact))
) ; cond alignment
) ; text
((= et "\nINSERT")
(command "_.scale" en "" (dxf 10 ed) fact)) ; insert
) ; cond
(setq count (1+ count))
) ; while
) ; progn
) ; if
(prompt "done")
(princ)
) ; defun
http://www.360doc.com/content/12/0331/10/5408940_199548834.shtml