论文部分内容阅读
一、引言
在CAD和数字化制图中,大面积的植被符号(面状符号)填充是系统必不可少的功能。实现此功能,传统的计算机算法大体分为两类:(1)通过在填充轮廓内做晕线填充,求得每条晕线与外轮廓线的包含关系来计算各个填充符号的数学位置。此法简称为"晕线法" [1] 。(2)基于填充轮廓的坐标,通过典型数学计算的方法解析各个填充符号的坐标位置是否落在轮廓线内。此法简称为"解析法" [2]。这两种方法在理论上没什么缺陷,但在实际应用中,存在下列不足:(1)计算的工作量大,数学模型复杂。(2)对于圆弧和拟合的轮廓边界,就会出现边界点的坐标解析困难或填充出现偏差。(3)一般技术人员实现此功能有些难度。
二、新算法及实现步骤
随着开发语言的智能化和开发工具的进步,CAGD(计算机辅助函数设计)的合理、巧妙运用,传统的复杂算法得到了优化、简化。
AutoCAD是目前在测绘、制图和GIS前端应用较广泛的一种图形处理系统。其强大的绘编工具和内置的二次开发语言(如AutoLisp和VBA)的结合使用,又将CAD的功能得到更大的发挥,CAGD是CAD的智能扩充。下面就解剖如何利用CAGD实现"面状符号填充"。
假设有一封闭区域S
1、编辑面状填充图案文件(.pat)
在Notepad下打开acadiso.pat文本文件,在尾部添置如下语句:
*dot45,dot lines at 45 degree
45,0,0,0,14.14,0,-14.14
2、利用Hatch功能进行面状填充
用dot45图案填充封闭区域S。图案是点状的,点的水平间距为20mm,点的垂直间距为10mm,点之间的排列符合地形图植被类符号制图要求。
编程实现方式:
Lisp编程 (vl-cmdf"Hatch""dash45"比例0区域S"" )
VBA编程 Set hatch_Obj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
3、打散填充物
通过编程的方式,利用Explode功能(炸开),分解区域填充,使之成为分散的单体-一条封闭的多段线和很多几何排列规则的点。
Lisp编程(vl-cmdf"explode"hatch_obj )
VBA编程 hatch_obj.explode
4、收集打散物,提取坐标
将打散的点收集,形成实体集合,分别提取其坐标,形成坐标集。
Lisp编程 (setq objs(ssget "x" (list (cons 0"point")(cons 8layername))
i0cors'(00))
(repeat(sslength objs)
(setq obj (ssname objs i)
(setq cor1(vla-get-coordinates (vlax-ename->vla-objectobj)))
(setq cors(cons cors cor))
(setq i (1+ i))
)
VBA编程
Dim obj As AcadObject
Dim objs As AcadSelectionSet
Dim xdata(0 To 1) As Integer
Dim xvalue(0 To 1) As Variant
Dim cor1 As Variant , cors As Variant '坐标集
Dim i As Single
Set objs = ThisDrawing.SelectionSets.Add("song")
xdata(0) = 0: xvalue = "point"
xdata(1) = 8: xvalue = layername 'layername是点的层名
i = 0
objs.Select acSelectionSetAll, , , xdata, xvalue '点实体集合
For Each obj In objs
cor1 = obj.Coordinates
cors(i) = cor1(0): cors(i + 1) = cor1(1)
i = i + 2
Next
5、用对应的符号(图块block或者形shape)替换点
提取填充区域内点(point)的坐标,形成坐标集(coordinates),删除填充区域的点实体,按照坐(下转第46 页) (上接第41页)标集的数据,重新插入单体面状符号(例如块文件128.dwg)。
Lisp编程:
(setq I 0)
(repeat n
(setqpt1 (nth I cors)
(entmake(list '(0 . "INSERT")(cons 10 pt1)(cons 41 1)
(cons 42 1) (cons 43 1)))
(setq I(1+I ) )
)
VBA编程:
For i!=0 to ubound(cors)step 3
Pt1(0)=cors(i)
Pt1(1)=cors(i+1)
Pt1(2)=0
ThisDrawing.ModelSpace.InsertBlock pt1, "128.dwg", 1, 1, 1, 0
Next i!
结论:
比较复杂的图形填充功能,通过编写普通的程序,很完美的完成了符号的快速填充,达到了计算机制图算法简化的目的;同时,本文也为测绘和CAD制图的智能化、简易化提供了一点借鉴。
参考文献:
[1]谈晓军、边馥苓、何忠焕:地图符号可视化系统的面向对象设计与实现.测绘通报,2003,(1)。
[2]赵江洪、殷赣华:通用地图符号库的算法设计及其实现.测绘通报,2002,(4)。
在CAD和数字化制图中,大面积的植被符号(面状符号)填充是系统必不可少的功能。实现此功能,传统的计算机算法大体分为两类:(1)通过在填充轮廓内做晕线填充,求得每条晕线与外轮廓线的包含关系来计算各个填充符号的数学位置。此法简称为"晕线法" [1] 。(2)基于填充轮廓的坐标,通过典型数学计算的方法解析各个填充符号的坐标位置是否落在轮廓线内。此法简称为"解析法" [2]。这两种方法在理论上没什么缺陷,但在实际应用中,存在下列不足:(1)计算的工作量大,数学模型复杂。(2)对于圆弧和拟合的轮廓边界,就会出现边界点的坐标解析困难或填充出现偏差。(3)一般技术人员实现此功能有些难度。
二、新算法及实现步骤
随着开发语言的智能化和开发工具的进步,CAGD(计算机辅助函数设计)的合理、巧妙运用,传统的复杂算法得到了优化、简化。
AutoCAD是目前在测绘、制图和GIS前端应用较广泛的一种图形处理系统。其强大的绘编工具和内置的二次开发语言(如AutoLisp和VBA)的结合使用,又将CAD的功能得到更大的发挥,CAGD是CAD的智能扩充。下面就解剖如何利用CAGD实现"面状符号填充"。
假设有一封闭区域S
1、编辑面状填充图案文件(.pat)
在Notepad下打开acadiso.pat文本文件,在尾部添置如下语句:
*dot45,dot lines at 45 degree
45,0,0,0,14.14,0,-14.14
2、利用Hatch功能进行面状填充
用dot45图案填充封闭区域S。图案是点状的,点的水平间距为20mm,点的垂直间距为10mm,点之间的排列符合地形图植被类符号制图要求。
编程实现方式:
Lisp编程 (vl-cmdf"Hatch""dash45"比例0区域S"" )
VBA编程 Set hatch_Obj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
3、打散填充物
通过编程的方式,利用Explode功能(炸开),分解区域填充,使之成为分散的单体-一条封闭的多段线和很多几何排列规则的点。
Lisp编程(vl-cmdf"explode"hatch_obj )
VBA编程 hatch_obj.explode
4、收集打散物,提取坐标
将打散的点收集,形成实体集合,分别提取其坐标,形成坐标集。
Lisp编程 (setq objs(ssget "x" (list (cons 0"point")(cons 8layername))
i0cors'(00))
(repeat(sslength objs)
(setq obj (ssname objs i)
(setq cor1(vla-get-coordinates (vlax-ename->vla-objectobj)))
(setq cors(cons cors cor))
(setq i (1+ i))
)
VBA编程
Dim obj As AcadObject
Dim objs As AcadSelectionSet
Dim xdata(0 To 1) As Integer
Dim xvalue(0 To 1) As Variant
Dim cor1 As Variant , cors As Variant '坐标集
Dim i As Single
Set objs = ThisDrawing.SelectionSets.Add("song")
xdata(0) = 0: xvalue = "point"
xdata(1) = 8: xvalue = layername 'layername是点的层名
i = 0
objs.Select acSelectionSetAll, , , xdata, xvalue '点实体集合
For Each obj In objs
cor1 = obj.Coordinates
cors(i) = cor1(0): cors(i + 1) = cor1(1)
i = i + 2
Next
5、用对应的符号(图块block或者形shape)替换点
提取填充区域内点(point)的坐标,形成坐标集(coordinates),删除填充区域的点实体,按照坐(下转第46 页) (上接第41页)标集的数据,重新插入单体面状符号(例如块文件128.dwg)。
Lisp编程:
(setq I 0)
(repeat n
(setqpt1 (nth I cors)
(entmake(list '(0 . "INSERT")(cons 10 pt1)(cons 41 1)
(cons 42 1) (cons 43 1)))
(setq I(1+I ) )
)
VBA编程:
For i!=0 to ubound(cors)step 3
Pt1(0)=cors(i)
Pt1(1)=cors(i+1)
Pt1(2)=0
ThisDrawing.ModelSpace.InsertBlock pt1, "128.dwg", 1, 1, 1, 0
Next i!
结论:
比较复杂的图形填充功能,通过编写普通的程序,很完美的完成了符号的快速填充,达到了计算机制图算法简化的目的;同时,本文也为测绘和CAD制图的智能化、简易化提供了一点借鉴。
参考文献:
[1]谈晓军、边馥苓、何忠焕:地图符号可视化系统的面向对象设计与实现.测绘通报,2003,(1)。
[2]赵江洪、殷赣华:通用地图符号库的算法设计及其实现.测绘通报,2002,(4)。