调整线条宽度的实用工具 在使用AutoCAD绘图软件绘制各类图形的工作中。最后一个阶段是将图形文件最终在打印机、绘图机上输出为图纸。其中图形线条的粗细划分是一项必须认真对待的工作。由于一般图纸上的图形不能像在彩色显示器上可用颜色及深浅区分图素、结构,而只能以改变线条的粗细的方法来达到这个目的。因此,划分好图形中线条的粗细既有利于区分图形要素,又有利于准确表达设计意图及方便识图。尤其是工程图纸,应按照国家制图标准,将图中的各图素划分出明显的粗细来。这样图纸方能满足标准化的要求。   实际上线条的粗细从粗到细有多种变化,在计算机图形文件中则体现在线条的线宽值上。常见的譬如,图形中各实体外轮廊线、图形符号及表格外框线等均为粗线,剖面线、尺寸(界)线、符号引线、中心线、点划线等应为细线,而虚线又介于粗细线之间。且根据需要粗、中、细线还可以在一定的范围内变化线宽。通常设计人员或绘图人员在计算机上使用AutoCAD绘图软件时,会经常使用到像COPY、OFFSET、MIRROR等组图命令,为提高绘制的效率,组图时并不太考虑线条的粗细及线型问题,而是将这个问题放在最后出图纸考贝时才一同进行调整解决。由于这时图中图素多,如靠交互操作命令来调整很繁杂、费时,其它的方法又难以圆满地解决问题。这样就有必要在AUTOCAD交互操作功能外提供一种方便的工具,使其能够方便、快捷地完成这项工作,以达到快速、准确、高效、全面的目的。保证屏幕上的图形视图清晰、层次分明。   通常来说,图形中线宽的调整有两种办法:一种方法是在绘制时,分层放置线宽不同的线条,或者按粗细不同设置成不同的颜色,再配合使用笔式或高档喷墨绘图仪的线宽设置参数调整来得到所需要的硬拷贝图纸。该种方法的缺点是输出设备条件要求高,对出图设备的参数设定要熟练。然而人们在屏幕上并不能看到输出后图纸的真实效果。况且设计人员在绘制图形时,所考虑的分层、分色管理并不能只以线条的宽度为依据。当出现同一图层及颜色的图素中因为线型、结构等原因还要区分线宽时,就得逐一分别进行调定。这样就会使得调定输出图纸线宽任务变得十分繁杂。   第二种方法是,在任何图形输出设备(绘图机、打印机、照相、摄影制片设备)条件下,先在屏幕上将要输出的图形显式地调整好每一图素线条的粗细,然后再输出。这样屏上所看到的,就是你所得到的一个真实反映。且不必要对输出设备的参数进行与线宽变化的相关调定,对输出设备无任何特殊要求。这在目前因高档绘图仪价高而大量使用普通打印机出图的状况下具有实用意义。   本文介绍一个为此编写的小段AutoLISP程序,使操作人员能以十分方便、快捷的手段来完成图形中图素线条粗细的调定工作。   该程序所能处理的线条种类包括直线、多义线、圆(弧)、椭圆(弧)、样条曲线,线型可以处理实线、虚线、中心线、点划线、边界线等。操作人员可以在交互状态下,随时调入该程序运行,来完成当前图形中线条粗细的调整。   为了方便操作,提高图素选择效率,程序设计了几种调定线宽过程的实施方式。但任何方式下都必须首先确定所需调定的范围(包括:分图层、分颜色、分线型)。如果某图层上图素的线宽不需要调整或已调整好,则可以先行关闭(OFF),以缩小选择的范围。   下面是三种方式的具体操作过程: 一、选择图素调整:   1)方式选择[Select\ayer\Color\LType]回答S(Select)   2)选定调定线宽的图素范围   3)给出新的线宽值   4)自动完成按新线宽值调定所有包括在选择范围内的图素线宽 二、分图层调整:   1)方式选择回答L(Layer)   2)选择调定图素的范围(可以是全部或部分)   3)在[Entity\Name]中可选择两种确定层名的方法。回答E则可以从图中选择一图素,以此图素所在的层的层名为依据;回答N则需键入调定层的层名   4)给出新的线宽值   5)按新的线宽值在所确定的层上自动调定位于选择范围内的图素线宽 三、按颜色调整:   1)方式选择回答C(Color)   2)选择调整作用的范围   3)在[Entity\Number]中可用两种方法确定颜色。回答E则可以图中选一个颜色与所需调整颜色一样的图素:回答N就要给出所需调整颜色的号码   4)给定新的线宽值   5)程序按新的线宽值,依据所选定的颜色自动地在所确定的作用范围内调整颜色相符图素的线宽 四、按线型调整:   1)方式选择回答LT(LType)   2)选择调整的作用范围   3)在[Entity\Name]中回答E可以从图中选择一线型吻合的图素;回答N则给出[Continuous\Denter\Center\Phantom\DIvide\Hidden\DOt\DAshdot\Border]中的任一类型英文名的前面大写字母则可   4)给定新的线宽值   5)程序按新的线宽值、依据选定的线型自动在所确定的作用范围内调整图素的线宽   使用的几点说明:   1 程序对选择范围内的诸如剖面线、尺寸线、尺寸界线、文字、符号不起作用。这样确定选择调定范围时,不必顾及这些图素的变化。   2 程序不能调整块内的图素,如需调整,先EXPLORING块中元素。如希望保持原有图形文件结构的话,调定线宽后的图形文件可以不存盘覆盖原有图形文件。   3 选择时可用窗口选择方法及逐个选择等多种方法,还可以用SHIFT+选择掉已选中的图素。   4 所有改变线宽的图素,除粗细变化外,其它属性(如:层、颜色、线型)均不发生变化。   5 如果原有图层中图素的颜色或线型值是按揃YLAYER斈J较氯范*(绘制)的,   那么这些图素此时在按颜色(Color)或线型(LType)方式调整线宽时,不属于程序作用范围内图素。也不能在上述两种方式下取这些因素作为依据,选择实体来确定颜色、线型。这在程序运行过程中遇到此类情况均有提示。这种情况下,就可以考虑优先用选择(Select)的方式或分层(Layer)的方式来调整。因为按颜色或线型方式下能调定的图素是由COLOR命令或SET LINETYPE命令确定的那些图素,不论这些图素位于那一层都可以自动搜索进行调整。   6 本程序适合AUTOCAD R12版本。针对该版本中图形文件中图素圆的变线宽处理有三种方法:一是在某一点处切断使其变成闭合弧进行处理;二是先画一个相同大小的闭合圆弧、再消去原先的圆;三是用DNOUT形成的圆环代办替。这里是用第二种方法实现。如果到AUTOCAD R13版本绘制的图形,对椭圆的处理也必须采取类似的措施。 源程序 chwd.lsp (defun c:width() (setq bb 1) (setq w 0) (initget 1"Select Layer Color LType") (prompt"\n调整方式选择") (setq t (getkword "[Select\\Layer \\Color\\LType"))] (prompt"\n选择调整范围") (setq obj(ssget)) (if(=t "Layer") (progn (initget 1"Entity Name") (prompt"\n选择实体确定图层或给出图层名?") (setq 1b (getkword"[Entity\\Name]:")) (if (=1b "Entity") (progn (prompt"选择所需变化图层图素:") (setq 1e (ssget) (setq 1p (ssname le 0)) (setq 11(cdr(car(cdr(cdr(entget 1p)))))) ) ) (if(=1b"Name") (progn (setq 111(getstring"给出所需变化的图层名:")) (setq 11(strcase 111)) ) ) (setq obj1(ssadd)) (setq j 0) (while(<j(sslength obj)) (setq pl(ssname obj j)) (setq j (+ j 1)) (setq py (cdr(car(cdr(cdr(entget pl)))))) (if(=ll py) (ssadd pl obj1) ) ) ) ) (if (=t "Color") (progn (initget 1 "Entity Number") (prompt"\n选择实体确定颜色或给出颜色号") (setq lb (getkword"[Entity\\Number]:")) (if (=lb "Entity") (progn (prompt"\n选择实体确定所需变化线宽图素的颜色:") (setq le (ssget)) (setq lp (ssname le 0)) (setq lc (car (car (cdr(cdr (cdr(entget lp))))))) (if (=lc 62) (setg 11(cdr(cdr(cdr(cdr(cdr(cdr(entget lp))))))) ) (if(=1c 66) (progn (prompt"\n该实体的颜色是随图层确定的(Bylayer)!") (setq bb 0) (setq kk(getstring"\n终止处理过程?")) ) ) (if(=lc 6) (setq ll (cdr(car (cdr(cdr(cdr(cdr(entget lp)))))))) ) ) (if(=lb"Number") (setq ll(getstring"\n给出颜色号:")) ) ) (setq objl(ssadd)) (setq j 0) (while(<j(sslength obj)) (setq pl(ssname obj j)) (setq j (+j 1)) (setq pc (cdr(car(cdr (cdr(cdr(entget pl))))))) (setq lcc(car(car(cdr(cdr(cdr(entget pl))))))) (if(=lcc 6) (setq pc (cdr(car(cdr(cdr(cdr(cdr(entget pl)))))))) ) (if(=ll pc) (ssadd pl obj1) ) ) ) ) (if(=t"LType") (progn (initget 1"Entity Name") (prompt"\n选择实体确定线型或给出线型名") (setq lb(getkword"[Entity\\Name]:")) (if(=lb "Entity") (progn (prompt"\n选择线型实体确定所需变化线宽图素的线型:") (setq le (ssget)) (setq lp(ssname le 0)) (setq lc(car(car(cdr(cdr(cdr(entget lp))))))) (if(=lc 6) (setq ll (cdr(car(cdr(cdr(cdr(entget lp))))))) ) (if(/=lc 6) (progn (prompt "\n该实体的颜色是随图层确定的(Bylayer)!") (setq bb 0) (setq kk (getstring"\n终止处理过程?")) ) ) ) ) (if(=lb "Name") (progn (initget 1"Continuous Dashed Center Phantom DIvide Hidden DOt DAshdot Borde r") (prompt"给出需要变化的线型名?") (setq lll(getkword"\n[Continuous \\Dashed\\Center\\Phantom\\DIvid e \\Hidden\\DOt\\DAshdot\\Border]")) (setq ll(strcse lll)) ) ) (setq objl(ssadd)) (setq j 0) (while(<j(sslength obj)) (setq pl (ssname obj j)) (setq j(+j 1)) (setq pc(cdr(car(cdr(cdr(cdr(entget pl))))))) (if(=ll pc) (ssadd pl objl) ) ) ) ) (if(=bb 1) (progn (setq cpp (ssadd)) (setq w (getreal"\n给定新的线宽值[0.00]:")) (setq i 0) (setq ii (sslength obj)) (if(/=t"Select") (setq ii(sslength objl)) ) (while(<i ii) (setq p (ssname obj i)) (if(/=t"Select") (setq p(ssname objl i)) ) (setq py (cdr(car(cdr(cdr(entget p)))))) (setq i(+i l)) (setq objent(cdr(car(cdr(entget p))))) (setq pp(cdddr(entget p))) (if(=t"color") (setq pp(cdr(cdddr(entget p)))) ) (if(=t"LType") (setq pp(cdr(cdddr(entget p)))) ) (if(=objent"LINE") (command"pedit"p"y""w"w"") (if(=objent"POLYLINE") (command"pedit"p"w"w"") (if(=objent"CIRCLE") (progn (setq p0(cdar pp)) (setq r(cdadr pp)) (setq pl(polar p0 0.0 r)) (setq and 359.99) (command"layer""s"py"") (if(=t"Color") (command"color"ll) ) (command"pline"pl "w"w w "a""ce"p0"a"and "") (ssadd p cpp) ) (if(=objent "ARC") (command"pedit"p"""w"w"") ) ) ) ) ) (command"erase"cpp"") (command"redraw") ) ) )