AutoCAD中填充阴影线图案(PAT文件)是一项十分有用的功能,在各种图形中都可能用到。我们在开发工程地质CAD软件时,经常要在图面上的指定区域内填充岩性花纹图案,而且填充区域不规则。在AutoCAD低版本中,填充花纹命令仅有一条 HATCH,使用HATCH时,需选择围成闭合区域的有关实体,若实体选择不全则会使填充出现混乱,特别是当填充区域由若干线、弧、园等实体交叉组合而成时,就要沿闭合区域的各点绘制一条PLINE线,然后以这条线作为填充边界线,在填充完成以后还要将这条线删除,比较麻烦。
AutoCAD R12版新增加了BHATCH命令来补充和加强HATCH命令功能。BHATCH命令以窗口交互方式执行,它将自动以多义线来定义边界,然后忽略全部或部份不是边界的区域,完成填充后自行删除多义线,还可以使边界内的图形和文字避开填充图案。简言之,填充时只需要用鼠标器点取闭合区域内一点就可完成填充。为了更方便地使用HATCH和BHATCH这两个命令,在R12版中还新增加了一条命令BPOLY。使用BPOLY可迅速生成一封闭曲线的边界,即通过点取封闭区域内任意一点形成本区域的边界线,根据返回的边界线可使用HATCH填充花纹图案,也可使用AREA来计算封闭区域的面积和周长。有关这两条命令的操作,可参阅AutoCAD R12的使用说明书,通过简单的练习就可以掌握。本文想就如何在AUTO LSP中调用这两个命令进行编程的问题做一简单介绍。
BHATCH和 BPOLY命令不同于一般的AutoCAD命令,它们是用ADS应用程序开发的,如果想在图形编辑状态下或在AUTO LISP中使用这两个命令, 就要在AutoCAD初始化时加载名为ACADAPP的ADS程序,方法是在当前搜索路径上是否有ACAD.ADS文件,这是一个纯文本的ASCII码文件,在这个文件中如有一行为ACADAPP,那么在进入ACAD图形时自动加载ACADAPP,在AutoCAD的Command:提示符下调用AUTO LISP函数(ADS),将得到当前已加载的全部ADS应用程序的信息。如已加载ACADAPP,在“Command:”就可以使用BPOLY和 BHATCH。
在AUTO LISP语言中,不能像调用一般命令那样用(COMMAND “命令”)来调用BPOLY和BHATCH,而是用(C:BPOLY 点)、(C:BHATCH 点)来调用,执行(C:BHATCH 点)之前要通过SETVAR对几个系统变量进行设置,HPANG是图案填充角度,HPNAME是图案填充名称,HPSCALE是图案填充比例系数。以下是一个简单的填充花纹图案的LISP程序:
程序1清单:
(setq yf$ (getstring (strcat \\\"花纹代号: \\\"))) ;输入花纹代号
(setq bl (getreal \\\"\n比例<1>:\\\")) ;输入比例
(if (= bl nil) (setq bl 1.0)) ;比例约定值为1
(setq ang (getreal \\\"\n角度<0>:\\\")) ;输入角度
(if (= ang nil) (setq ang 0.0)) ;角度约定值为0
(setq pt (getpoint \\\"\n选择区域内任意一点:\\\")) ;输入区域内任意一点坐标
(setvar \\\"hpang\\\" ang) ;设置填充角度为ang
(setvar \\\"hpscale\\\" bl) ;设置填充比例为bl
(setvar \\\"hpname\\\" yf$) ;设置填充花纹为yf$
(while pt ;PT为真时执行循环体内程序,否则退出
(c:bhatch pt)
(setq pt (getpoint \\\"\n选择区域内任意一点:\\\")) ;输入区域内任意一点坐标继续填充
);while pt
用程序1填充花纹时,选定点周围不能形成一个闭和区域时,除未填充外也不显示任何信息,因此需要增加一个判断,用程序2来实现。
程序2清单:
(setq yf$ (getstring (strcat \\\"花纹代号: \\\"))) ;输入花纹代号
(setq bl (getreal \\\"\n比例<1>:\\\")) ;输入比例
(if (= bl nil) (setq bl 1.0)) ;比例约定值为1
(setq ang (getreal \\\"\n角度<0>:\\\")) ;输入角度
(if (= ang nil) (setq ang 0.0)) ;角度约定值为0
(setq pt (getpoint \\\"\n选择区域内任意一点:\\\")) ;输入区域内任意一点坐标
(while pt ;PT为真时执行循环体内程序,否则退出
(setq e (c:bpoly pt)) ;得到PT点所在的边界线,
(if e ;如边界线存在就填充,否则不填充
(progn

