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