AutoCAD的图案填充方式是偏移线生成方式,在进行图案制作时会有一些基本的限制。地质制图中所用到的岩性填充图案通常较为复杂,按上述方式生成的填充图案基本上不能用手算方式,因此有必要采用程序制作方式来实现。
图1 填充限制示图 图2 单条直线计算图
在AutoCAD中,只有点(point)、直线(line)、多段线(polyline)和轻量多段线(lwpolyline)才能用于制作填充图案,圆和圆弧不能用于制作填充图案,但可以用线性图元进行多段线拟合。
如图1所示,填充图案通常是方形排列的。在一个正方形内的图形要在其它正方形内不会产生变形,必然要求直线的斜率或其倒数为整数。
2 程序制作图案
2.1 直线填充算法
图1所示较为复杂的图形可以由多条直线组成,因此直线是进行图案填充的基本元素。按此思路,可以设定直线是限定在1*1单位的矩形框内。以下就按照此基本假设来得到单条线段的填充算法公式。
我们用图2所示单条直线的计算图予以说明。图2中的每个正方形的边长都是1个单位。直线AC通过偏移算法可以填充到每一个正方形之中,这里假定坐标原点位于O点。以下按照单条直线填充的文本文件描述顺序给出具体的公式。
填充角度:ang=atan(dy/dx)= ∠CAE;
填充线起点坐标:即为A点的坐标。
填充的偏移距离,首先给出斜率大于1时的计算公式。
X方向的偏移距离D1。
D1=|AB|*cos∠BAF=|AB|*sin∠CAE;又因为|AB|=1,所以公式可简化为D1=dy/dist。
Y方向的偏移距离D2。
D2=|AB|*sin∠BAF=|AB|*cos∠CAE;又因为|AB|=1,所以公式可简化为D2=dx/dist。
直线的长度:dist=|AC|。
空格的长度:span=-(|AG|-|AC|)。
对于斜率为其它形式时,可以依照上述方法得出计算公式,参见2.2节的LISP源程序。
2.2 填充图案制作的核心程序
以下程序中所用的变量名与上节含义相同。参数point1和point2是直线的两个端点。Slope为直线的斜率或其倒数。
(defun compute(point1 point2 / ang dist dx dy temp D1D2 slope span)
(setq ang (* 180(/(angle point1 point2)pi))
dist (distance point1 point2)
dx (- (car point2) (car point1))
dy (- (cadr point2) (cadr point1))
)
(cond((and (/= dx 0)(/= dy 0))
(if (> (abs dx)(abs dy))
(setq temp dx dx dy dy (* temp -1.0)))
(setq D1 (/ dy dist)
D2 (/ dx dist)
slope (/ dy dx)
span (- dist (sqrt (+ 1 (* slope slope))))));斜率为整数
((or(= dx 0)(= dy 0));水平线或垂直线
(setq D1 0 D2 1 span (- dist 1)))
)
)
点可以看成是长度为0的水平线或垂直线。
多重描述的填充图案是由多条线段的描述组成的,因此,读者如果要对程序进行扩展,可以按以下顺序编写程序:获取1*1方框内的所有图元名→对每个图元进行检查,看其是否满足图案制作的要求→建立图案填充文件→获取每个图元的坐标→检查斜率是否满足要求→调用上面的程序进行计算→将计算结果输出到图案填充文件。在每一次检查不满足要求时应有相应的错误处理函数。
2.3 圆形填充图案的制作
在AutoCAD中不能用圆形图元进行图案制作,在不改变AutoCAD的算法的情况下可以用直线段来进行拟合。对于方形排列的圆形图案可以用16边外接多边形进行拟合,如图3。
从图3可知道,第一相和第二相可以分别用4条边拟合,第三相可以用8条边进行拟合,因此圆形图案可以用16边外接多边形进行拟合。
对于圆弧图案可以将圆形图案中的某些边去掉后进行拟合。用直线、点、圆弧和圆可以组成任何复杂的图案。这样,可以满足工程作图中岩性填充图案的需要。 以下的方法转引自《VISUAL LISP程序设计—技巧与范例》(陈伯雄,冯伟 北京:人民邮电出版社 2002.8)。当上述方法达不到理想的方法可以考虑以下的方法。
许多特殊的剖面图案是AutoCAD所提供的功能无法制作的。例如,如图5所示的木纹图案,是由同心的曲线组合而成的。将木纹图填充于其它的图形之中,交互操作的解决方案如下。