PDF下载
基于AUTOCAD的符号填充方法及软件编程

高斌1 周明安2

1.陕西测绘地理信息局测绘开发服务中心,西安市碑林区测绘路38号,710054;2.西安华测航摄遥感有限公司,西安市碑林区测绘路6号,710054

摘要: 主要讨论在AutoCAD平台上绘制1:1万比例尺地形图填充符号的方法及程序实现。
关键词: AUTOCAD;符号填充
DOI:10.12721/ccn.2022.157044
基金资助:
文章地址:

一、前言

在目前的图形编辑软件平台中,AUTOCAD 以其功能强大、普及率高、操作简洁,易于开发而在大量的使用,AUTOCAD中以线型、符号、型等易于制作,等特点而广泛用于制图,特别适用于制作形图的编辑、打印输出等工作,本文主要研究探讨在1:1万图形数据编辑过程中如何绘制填充符号的方法及程序编写,实现基于AUOTOCAD的自动符号填充制图功能。

二、填充方法

在AUTOCAD中绘制填充符号,一般的采用制作填充符号,使用HATCH命令绘制填充符号,这种方法操作简单,但是这种方法会造成符号不完整,图形绘制不美观的现象,本文主要讨论如何用程序实现符号的自动绘制的方法,在大比例尺绘图中没有颜色面,只绘制符号,但是在中小比例尺地形图中除绘制符号外,还绘制底色,如林地、水生植物等。软件绘制可灵活的处理许多其他的符号,满足多变的特点。

1、符号绘制的思路

在绘制或选定的范围内,按照相应的间隔,计算范围内有几行符号,每行有几个符号,及每个符号的位置,并在此插入符号,直到绘制完毕。根据需要绘制除底色。

2、软件编程基本流程

 4.png

 图1

三、软件实现

根据上述思路流程,特编写程序按照上述过程进行数据处理填充符号的绘制,程序编写使用的VB6.0和AUTOCAD平台。具体的程序代码和程序注释如下:

AcadDoc.SendCommand "_pline "   绘制范围线

Set hatchobj = AcadDoc.ModelSpace.AddHatch(acHatchPatternTypePreDefined, patName1, bAss)

hatchobj.AppendOuterLoop (outerLoop)

hatchobj.TrueColor = layColor    绘制颜色填充面

xmax = fbxzb(0): xmin = fbxzb(0): ymax = fbxzb(1): ymin = fbxzb(1)

M = 1

For i = 1 To count

ppt(0) = fbxzb(i * 2 - 2): ppt(1) = fbxzb(i * 2 - 1) ': ppt(2) = 0

If ppt(0) > xmax Then

xmax = ppt(0)

End If

If ppt(0) < xmin Then

xmin = ppt(0)

End If

If ppt(1) > ymax Then

ymax = ppt(1)

End If

If ppt(1) < ymin Then

ymin = ppt(1)

End If

Next   获取范围线的最大最下坐标

sk = Int(ymin / 50) + 1    计算最小行号

nk = Int(ymax / 50)     计算最大行号

For bc = sk To nk       按照行号循环

Set hzx = AcadDoc.ModelSpace.AddLightWeightPolyline(ptse)

jdse = hzx.IntersectWith(fbx(0), acExtendNone)  计算每行符号与范围线交点

jdxmax = jdse(0): jdxmin = jdse(1)    记录最大和最小横坐标

count1 = CountOfPts(jdse)

For o = 1 To count1 - 1

For l = 1 To count1 - 1

If jdse(l * 3 - 3) > jdse((l + 1) * 3 - 3) Then

 jdx = jdse(l * 3 - 3)

jdse(l * 3 - 3) = jdse((l + 1) * 3 - 3)

jdse((l + 1) * 3 - 3) = jdx

End If

kk1 = Int(jdse(0) / 50)

If M - Int(M / 2) * 2 > 0 And kk1 - Int(kk1 / 2) * 2 > 0 Then

pyl1 = 0

End If

If M - Int(M / 2) * 2 > 0 And kk1 - Int(kk1 / 2) * 2 = 0 Then

pyl1 = 1

End If

If M - Int(M / 2) * 2 = 0 And kk1 - Int(kk1 / 2) * 2 = 0 Then

pyl1 = 0

End If

If M - Int(M / 2) * 2 = 0 And kk1 - Int(kk1 / 2) * 2 > 0 Then

pyl1 = 1

End If

If count1 <= 2 Then

For k = 1 To count1 - 1

pptq(0) = jdse(k * 3 - 3): pptq(1) = jdse(k * 3 - 2): pptq(2) = jdse(k * 3 - 1)

pptz(0) = jdse((k + 1) * 3 - 3): pptz(1) = jdse((k + 1) * 3 - 2): pptz(2) = jdse((k + 1) * 3 - 1)       计算每行最小的间距整倍数的横坐标,每行的Y坐标是不变的

ks = Int(pptq(0) / 50) + 1 + pyl1

kn = Int(pptz(0) / 50)

n = Int((kn - ks) * 50 / 100)  计算每行有几个符号

kxmin = ks * 50 记录最小的符号横坐标

For j = 0 To n

pptk(0) = kxmin + j * 100:    pptk(1) = ptse(1):    pptk(2) = 0

Set fhk = AcadDoc.ModelSpace.InsertBlock(pptk, layername, 1, 1, 1, 0)

Set grpEnts(kk) = fhk 'grpsset.Item(0)

kk = kk + 1

循环计算符号坐标,并绘制符号

Next

Next

End If

If count1 > 2 Then

For k = 1 To count1 - 1 Step 2

If k = 1 Then

pptq(0) = jdse(k * 3 - 3): pptq(1) = jdse(k * 3 - 2): pptq(2) = jdse(k * 3 - 1)

pptz(0) = jdse((k + 1) * 3 - 3): pptz(1) = jdse((k + 1) * 3 - 2): pptz(2) = jdse((k + 1) * 3 - 1)

ks = Int(pptq(0) / 50) + 1 + pyl1

kn = Int(pptz(0) / 50)

n = Int((kn - ks) * 50 / 100)

kxmin = ks * 50

pptk(0) = kxmin + j * 100:    pptk(1) = ptse(1):    pptk(2) = 0

For j = 0 To n

pptk(0) = kxmin + j * 100:    pptk(1) = ptse(1):    pptk(2) = 0

Set fhk = AcadDoc.ModelSpace.InsertBlock(pptk, layername, 1, 1, 1, 0)

Set grpEnts(kk) = fhk 'grpsset.Item(0)

kk = kk + 1

Next

End If

If k > 1 Then

pptq(0) = jdse(k * 3 - 3): pptq(1) = jdse(k * 3 - 2): pptq(2) = jdse(k * 3 - 1)

pptz(0) = jdse((k + 1) * 3 - 3): pptz(1) = jdse((k + 1) * 3 - 2): pptz(2) = jdse((k + 1) * 3 - 1)

kk2 = Int(pptq(0) / 50)

If M - Int(M / 2) * 2 > 0 And kk2 - Int(kk2 / 2) * 2 > 0 Then

pyl1 = 0

End If

If M - Int(M / 2) * 2 > 0 And kk2 - Int(kk2 / 2) * 2 = 0 Then

pyl1 = 1

End If

If M - Int(M / 2) * 2 = 0 And kk2 - Int(kk2 / 2) * 2 = 0 Then

pyl1 = 0

End If

If M - Int(M / 2) * 2 = 0 And kk2 - Int(kk2 / 2) * 2 > 0 Then

pyl1 = 1

End If

ks = Int(pptq(0) / 50) + 1 + pyl1

kn = Int(pptz(0) / 50)

n = Int((kn - ks) * 50 / 100)

kxmin = ks * 50

pptk(0) = kxmin + j * 100:    pptk(1) = ptse(1):    pptk(2) = 0

For j = 0 To n

pptk(0) = kxmin + j * 100:    pptk(1) = ptse(1):    pptk(2) = 0

Set fhk = AcadDoc.ModelSpace.InsertBlock(pptk, layername, 1, 1, 1, 0)

Set grpEnts(kk) = fhk 'grpsset.Item(0)

kk = kk + 1

Next

Next

四、程序操作方法

 图片1.png

 图2

程序代码编制完成后,运行程序可弹出上图界面,按照需要选取按钮即可,点击按钮后在AUTOCAD 命令行出现指定起点,开始绘制范围线,范围线绘制用CLOSE命令封闭,使范围线形成一个闭合的封闭区域,程序自动按照要求用颜色填充区域,并绘制符号。也可选择范围线,命令行提示请选择范围线,这种方法对于航测法成图,因航测成图可在内业先将范围线会出来,直接绘制范围线是因范围线多是曲线,绘制时不易接边。下面是用程序绘制的几个符号填充图。

图片2.png

 图3

 五、结论

本方法以AUTOCAD平台为基础,使用VB6.0语言开发,具有使用方便,通用性强,对于程序进行修改,可灵活用于其它项目;按照上述方法绘制的符号填充,符号完整美观,绘制方法灵活,特别适用于中小比例尺地形图自动符号化应用,该方法曾用于我院1:1万地形图的编辑中,速度快、灵活,取得良好的效果。

参考文献:

1、《1:5000、1:10000地形图图式》GB/ T 20257.2—2006  [S].北京. 中国标准出版社.2006

2、《Visual Basic 与Autocad二次开发》ISBN -302-05128-3/TP·3005 [M].北京.新华书店,2002

3、教传艳,王果    Visual Basic 6.0程序设计完全自学手册   ISBN  9787115212375  人民邮电出版社  2009 

1、高斌,陕西测绘地理信息局测绘开发服务中心,硕士,高级工程师,长期从事测绘生产研究

2、周明安,西安华测航摄遥感有限公司,工程师,测绘工程室主任,长期从事测绘生产研究。