附:南方CASS快捷键
A ——画弧(ARC)
AA ——给实体加地物名
B ——自由连接
C ——画圆(CIRCLE)
COPYCLIP——从不同窗口复制局部
CP ——拷贝(COPY)
D ——绘制电力线
DD ——通用绘图命令
DDPTYPE——改变点形状
E ——删除(ERASE)
F ——图形复制
FF ——绘制多点房屋
G ——绘制高程点
H ——线型换向
I ——绘制道路
J ——复合线连接
K ——绘制陡坎
KK ——查询坎高
L ——画直线(LINE)
LA ——设置图层(LAYER)
LT ——设置线型(LINETYPE)
M ——移动(MOVE)
N ——批量拟合复合线
O ——批量修改复合线高
P ——屏幕移动(PAN)
PASTEORIG——在不同窗口粘贴
PE ——复合线编辑(PEDIT)
PL ——画复合线(PLINE)
PLOT——打印设置
PURGE——清理层
Q ——直角纠正
R ——屏幕重画(REDRAW)
REGEN——重新生成
RR ——符号重新生成
S ——加入实体属性
SS ——绘制四点房屋
T ——注记文字
TR——打断
V ——查看实体属性
W ——绘制围墙
WW ——批量改变复合线宽
X ——多功能复合线
XP ——绘制自然斜坡
Y ——复合线上加点
Z ——屏幕缩放(ZOOM)
附:常见的快捷命令
(一)字母类
1、对象特性
ADC, *ADCENTER(设计中心“Ctrl+2”)
CH, MO *PROPERTIES(修改特性“Ctrl+1”)
MA, *MATCHPROP(属性匹配)
ST, *STYLE(文字样式)
COL, *COLOR(设置颜色)
LA, *LAYER(图层操作)
LT, *LINETYPE(线形)
LTS, *LTSCALE(线形比例)
LW, *LWEIGHT (线宽)
UN, *UNITS(图形单位)
ATT, *ATTDEF(属性定义)
ATE, *ATTEDIT(编辑属性)
BO, *BOUNDARY(边界创建,包括创建闭合多段线和面域)
AL, *ALIGN(对齐)
EXIT, *QUIT(退出)
EXP, *EXPORT(输出其它格式文件)
IMP, *IMPORT(输入文件)
OP,PR *OPTIONS(自定义CAD设置)
PRINT, *PLOT(打印)
PU, *PURGE(清除垃圾)
R, *REDRAW(重新生成)
REN, *RENAME(重命名)
SN, *SNAP(捕捉栅格)
DS, *DSETTINGS(设置极轴追踪)
OS, *OSNAP(设置捕捉模式)
PRE, *PREVIEW(打印预览)
TO, *TOOLBAR(工具栏)
V, *VIEW(命名视图)
AA, *AREA(面积)
DI, *DIST(距离)
LI, *LIST(显示图形数据信息)
2、绘图命令:
PO, *POINT(点)
L, *LINE(直线)
XL, *XLINE(射线)
PL, *PLINE(多段线)
ML, *MLINE(多线)
SPL, *SPLINE(样条曲线)
POL, *POLYGON(正多边形)
REC, *RECTANGLE(矩形)
C, *CIRCLE(圆)
A, *ARC(圆弧)
DO, *DONUT(圆环)
EL, *ELLIPSE(椭圆)
REG, *REGION(面域)
MT, *MTEXT(多行文本)
T, *MTEXT(多行文本)
B, *BLOCK(块定义)
I, *INSERT(插入块)
W, *WBLOCK(定义块文件)
DIV, *DIVIDE(等分)
H, *BHATCH(填充)
3、修改命令:
CO, *COPY(复制)
MI, *MIRROR(镜像)
AR, *ARRAY(阵列)
O, *OFFSET(偏移)
RO, *ROTATE(旋转)
M, *MOVE(移动)
E, DEL键 *ERASE(删除)
X, *EXPLODE(分解)
TR, *TRIM(修剪)
EX, *EXTEND(延伸)
S, *STRETCH(拉伸)
LEN, *LENGTHEN(直线拉长)
SC, *SCALE(比例缩放)
BR, *BREAK(打断)
CHA, *CHAMFER(倒角)
F, *FILLET(倒圆角)
AutoCAD 2000快捷命令的使用
PE, *PEDIT(多段线编辑)
ED, *DDEDIT(修改文本)
4、视窗缩放:
P, *PAN(平移)
Z+空格+空格, *实时缩放
Z, *局部放大
Z+P, *返回上一视图
Z+E, *显示全图
5、尺寸标注:
DLI, *DIMLINEAR(直线标注)
DAL, *DIMALIGNED(对齐标注)
DRA, *DIMRADIUS(半径标注)
DDI, *DIMDIAMETER(直径标注)
DAN, *DIMANGULAR(角度标注)
DCE, *DIMCENTER(中心标注)
DOR, *DIMORDINATE(点标注)
TOL, *TOLERANCE(标注形位公差)
LE, *QLEADER(快速引出标注)
DBA, *DIMBASELINE(基线标注)
DCO, *DIMCONTINUE(连续标注)
D, *DIMSTYLE(标注样式)
DED, *DIMEDIT(编辑标注)
DOV, *DIMOVERRIDE(替换标注系统变量)
(二)常用CTRL快捷键
【CTRL】+1 *PROPERTIES(修改特性)
【CTRL】+2 *ADCENTER(设计中心)
【CTRL】+O *OPEN(打开文件)
【CTRL】+N、M *NEW(新建文件)
【CTRL】+P *PRINT(打印文件)
【CTRL】+S *SAVE(保存文件)
【CTRL】+Z *UNDO(放弃)
【CTRL】+X *CUTCLIP(剪切)
【CTRL】+C *COPYCLIP(复制)
【CTRL】+V *PASTECLIP(粘贴)
【CTRL】+B *SNAP(栅格捕捉)
【CTRL】+F *OSNAP(对象捕捉)
【CTRL】+G *GRID(栅格)
【CTRL】+L *ORTHO(正交)
【CTRL】+W *(对象追踪)
【CTRL】+U *(极轴)
三)常用功能键
【F1】 *HELP(帮助)
【F2】 *(文本窗口)
【F3】 *OSNAP(对象捕捉)
【F7】 *GRIP(栅格)
【F8】 *ORTHO(正交)
注:修改完ACAD.PGP文件后,不必重新启动AUTOCAD立刻加载刚刚修改过的ACAD.PGP文件的方法。
方法:键入REINIT命令,钩选PGP,再确定
1、简码引导文件中平行体:
P,线上点号,通过点号
因CASS6中可能存在BUG,因此可能要重复执行两次简码引导才能画出平行实体
2、添加自定义野外操作码方法
先在操作手册中查出相应地貌地物的CASS内码,再在jcode.def中新添加一行,并输入相应的野外操作码与对应的内码,如:
添加了水涯线的野外操作码为:
Q10,181101
其中Q10是自定义的野外操作码,181101是水涯线的CASS内码
砖房的野外操作码:
F7,141121
野外操作码由一个字母加两位数字组成,无效的0可以省略,如F07与F7等价
如果要带参数而野外操作码又不足三位,则操作码与参数间需加“-”,如
F2-2,141121
表示房屋参数的2层,因F2不足三位因此野外操作码的“F2”与参数层数的“2”间要加“-”,但如果野外操作码是三位则参数可直接紧跟野外操作码如:
F022,141121
两种方法效果相同
自定义野外操作码时请遵循CASS的约定,即表示线型的用“X”,拟合线型用“Q”,坎类用“K”,拟合坎类则用“U”,如:
表D-1 线面状地物符号代码表
=======================================================================================
坎类(曲): K(U) + 数(0-陡坎,1-加固陡坎,2-斜坡,3-加固斜坡,4-垄,5-陡崖,6-干沟)
线类(曲): X(Q) + 数(0-实线,1-内部道路,2-小路,3-大车路,4-建筑公路,5-地类界,6-乡.镇界,7-县.县级市界,8-地区.地级市界,9-省界线)
垣栅类: W + 数(0,1-宽为0.5米的围墙,2-栅栏,3-铁丝网,4-篱笆,5-活树篱笆,6-不依比例围墙,不拟合,7-不依比例围墙,拟合)
铁路类: T +数(0-标准铁路(大比例尺),1-标(小),2-窄轨铁路(大),3-窄(小),4-轻轨铁路(大),5-轻(小),6-缆车道(大),7-缆车道(小),8-架空索道,9-过河电缆)
电力线类: D + 数 (0-电线塔,1-高压线,2-低压线,3-通讯线)
房屋类: F +数 (0-坚固房,1-普通房,2-一般房屋,3-建筑中房,4-破坏房,5-棚房,6-简单房)
管线类: G + 数(0-架空(大),1-架空(小),2-地面上的,3-地下的,4-有管堤的)
植被土质: 拟合边界:B - 数(0-旱地,1-水稻,2-菜地,3-天然草地,4-有林地,5-行树,6-狭长灌木林,7-盐碱地,8-沙地,9-花圃)
不拟合边界: H - 数(0-旱地,1-水稻,2-菜地,3-天然草地,4-有林地,5-行树,6-狭长灌木林,7-盐碱地,8-沙地,9-花圃)
平行体: P +(X(0-9),Q(0-9),K(0-6),U(0-6)…)
控制点: C + 数(0-图根点,1-埋石图根点,2-导线点,3-小三角点,4-三角点,5-土堆上的三角点,6-土堆上的小三角点,7-天文点,8-水准点,9-界址点)
=======================================================================================
点状地物符号代码均以“A”开头,详情请参阅“用户手册”“附录A CASS野外操作码”部分
3、坎类带有坡毛的图示坡毛均画在前进方向的左铡,因此在编号时请按此确定方向,但对于已编好编号的可用线型换向命令“H”随时换向
4、成图时最好用无简码坐标数据文件、简码坐标数据文件、引导码一起使用,最方便的是使用无简码坐标数据文件+简码引导文件方法
a.无简码坐标数据文件就是只含有点号、X、Y、H的简单坐标高程数据文件,文件结构如下:
点号,,Y(E),X(N),H
在点号与Y值间必须予留简码位置,但可不输入简码
b.简码引导文件就是通过点号来定义地物地貌的代码文件:
⑴ 每一行表示一个地物;?
⑵ 每一行的第一项为地物的“地物代码”(即野外操作码,在jcode.def中定义后即与CASS内码对应了,也可理解为CASS内码的助记码),以后各数据为构成该地物的各测点的点号(依连接顺序的排列);
⑶ 同行的数据之间用逗号分隔;
⑷ 表示地物代码的字母要大写;
⑸用户可根据自己的需要定制野外操作简码
如(以下以“;”开头的为下一行的解释内容,非引导文件内容,去掉以“;”开头的注释内容后为一完整的简码引导文件):
;D1定义高压电线,后续点依次相连,各点上画有电杆与表示电力线的双箭头
D1,H293,H009,HY033,HY001,HY014
;D3定义通讯线,后续点依次相连
D3,HY013,HY011,HY004,HY021,HY023,HY031,H003,H008
;C0定义不埋石图根点,不同控制点用C0、C1等表示,具体请查用户手册,C0之后紧接写入图中的点名,逗号之后是该控制点在坐标文件中的点号
C0-H6,H6
;U0定义加固陡坎,后续点依次相连,陡坎线拟合,如用“K0”则不拟合陡坎线
U0,H3152,H3149,H3155,H3156,H291,H010,H007,H006,H005,H004,H002,HY034,HY032,HY030,HY029,HY028,HY027,HY026,HY025,HY024,HY042,HY022,HY095,HY098,HY002,HY003,HY004,HY005,HY006,HY007,HY008,HY009,HY076,HY010,HY012,HY015
;Q10是本人在jcode.def中自定义的水涯线的野外操作码,系统默认中无此代码,对应内码为:181101,在jcode.def中新加一行:Q10,181101,保存后重启CASS即可生效
Q10,HY075,HY073,HY072,HY071,HY070,HY068,HY067,HY066,HY065,HY064,HY063,HY062,HY061,HY060,HY059,H139,H140,H141,H142,H143,H144,H145,H146,H147,H148,H170,H149,HY056,HY057,H151,H152,H089,H090,H091,H093,H094,H095,H096,H097,H212,H213,H214,H232,H233,H289
;K5定义陡崖
K5,H3162,H3160
K5,H3003,H3002
;同前
Q10,1161,1162,1163,1164,1165,1166,1167
;A87,以“A”开头的是点状地物,此表示纪念碑,系统中有此代码
A87,1153
A87,1043
;A42表示独立电线杆
A42,1148
;拟合曲线,此表示公路
Q0,1085,1086,1087,1088,1089,1090,1157,1158,1159,1160,C3
Q0,1147,1149,1150,1151
;F7表示砖房,后接依序三点或多点,系统中无此代码,本人自定义,jcode.def中加一行:F7,141121
F7,9001,1055,1057
;同“C0-H6,H6”
C0-C3,C3
C0-C4,C4
C0-C4_1,C4-1
;拟合封闭边线旱地
B0,1154,1155,1156,1157,1090,1089,1088
;非拟合封闭边线旱地
H0,1046,1048,1045,1051,1053,1049,1036,1034,1032,1030,1029,1023,1022,1021,1020,1025,1026,1035,1042,1044
;非加固坎
K0,1025,1024,1023
K0,1026,1028,1029
K0,1035,1033,1031,1030
K0,1042,1037,1039,1041,1032
K0,1044,1040,1038,1034
K0,1045,1047,1049
;B10表示沙滩区域,后续点依次相连并封闭,系统中无此代码,本人自定义,B表示区域性地物,边线封闭并拟合,jcode.def中加一行:B10,186510
B10,3327,3323,3322,3321,3320,3319,3226,3318,3317,3316,3227,3315,3334,3333,3331,3330,3329,3328
5、不同比例出图对高程注记的密度有不同要求,如果是针对1:500制作的图需要在1:2000比例尺下出图时,需要抽稀高程注记,
此时可利用展高程点的过滤功能即在展高程点时提示“注记高程点的距离(米):”时输入规范要求的高程注记的间距,如在
1:2000比例尺下要求3~5cm注记一个高程点,对应的距离是60~100米,此时只要输入这之间的任一个数值即可过滤掉小于此
距离的高程注记,这只是针对出图进行的展点,要生成DTM和等高线则可不过滤,在出图之前,关闭其它层只打开“GCD”层并
删除该层上的所有对象,重新按出图要求展一次高程点并进行过滤即可。
6、生成引导文件后通过CASS菜单“简码引导”先选择引导文件再选择坐标数据文件即可生成所有地物地貌符号。在CASS6中,因平行地特符号可能要连续执行两次简码引导,因此可以将平行地物单独生成引导文件。这可能是CASS6的BUG,也可能是D版CASS才有的现象。
AutoCAD大比例尺数字化制图系统中植被填充程序的开发
韦廖军 兰度
(南宁市勘测院 广西南宁 530021)
【摘 要】 在利用AutoCAD开发大比例尺数字化制图系统时,会涉及到如何开发植被填充程序的问题,本文介绍了两种开发植被填充程序的方法。
【关键词】 AutoCADVb AutoLisp 植被填充CreatepolygonRgn PtInRegionh
0 引言
在利用AutoCAD开发大比例尺数字化制图系统时,植被填充程序的开发是一个必不可少的步骤。植被填充程序开发的难点在于植被填充范围的不规则,如何根据植被填充的不规则范围确定各个植被符号的插入位置坐标。笔者在开发实践中总结出两种行之有效的解决方法:
(一)利用Vb和AutoLisp相结合的方法来实现植被填充程序的开发。AutoLisp对AutoCAD图元的操作和数据的提取简单而直接,而Vb的Api函数非常丰富,其中有两个函数CreatePolygonRgn(生成一个区域)和PtInRegionh(判断点是否在区域内)非常有用,利用它们来编制植被填充程序,可以起到事半功倍的效果;因此可以考虑利用AutoLisp提取植被填充范围坐标和实现植被符号的插入,而利用Vb的Api函数根据植被填充范围坐标计算各个植被填充的插入位置坐标。
(二)利用AutoLisp编写实现判断点是否在区域内的功能(类似VB的PtInRegionh函数功能),所有数据在AutoLisp程序里面用表来处理,免去生成临时文件。
本文主要讲述第一种方法,第二种方法只给出判断点是否在区域内的子函数,其余程序实现方法与第一种方法类似。
1 第一种方法
(一)实现的方法及步骤
1.利用AutoLisp编程实现:在AutoCAD中绘制或者选取植被填充范围线,然后提取范围线坐标,并存入一个临时文本文件。
2.利用Vb编程实现:
(1)打开上一步骤所生成的文本文件,读取植被填充边界坐标,并存入一个数组。
(2)从边界坐标提取植被填充范围的坐标最大最小值,即确定包含植被填充不规则范围的矩形范围,根据规范要求的间距在矩形范围内内插规则方格网点(植被符号插入点)并存入另外一个数组B。
(3)利用CreatePolygonRgn函数,根据边界坐标生成一个区域PHRGN。
(4)利用PtInRegionh函数,剔除不在区域PHRGN内的方格网点,剩余的点即为所求的植被符号插入点。
3.利用AutoLisp编程实现:根据在上一步骤中求得的植被插入点在AutoCAD中批量插入植被符号。
(二)具体的编程代码及注释
以下就是根据上面的编程思路写出的的源程序代码和具体注释。
1.获取植被填充边界坐标子程序(用AutoLisp编写)
(DEFUN ZBZB()
(COMMAND"CMDECHO" 0)
(SETVAR"PLINETYPE" 1) ;;; PLINE 创建优化的多线
;;;;输入边界坐标.
(SETQ P NIL);;;;存贮边界范围坐标的表.
(PROMPT"\n植被填充:\n\t输入点:")
(SETQ P1 (GETPOINT))
(COMMAND"PLINE")
(COMMAND P1)
(SETQ P (APPEND (LIST P1) P))
(WHILE
(SETQ P2 (GETPOINT P1 "\n输入点:<回车结束>"))
(SETQ P (APPEND (LIST P2) P))
(COMMANDP2)
(SETQ P1P2)
)
(COMMAND"C")
;;;;边界坐标写入文件.
(SETQ FIL (OPEN "C:/ZBHZ.TMP" "W")) ;;;;边界坐标写入文件C:/ZBHZ.TMP
(SETQ N (LENGTH P))
(SETQ I 0)
(REPEAT N
(SETQ Y (RTOS (CAR (NTH I P)) 2 3))
(SETQ X (RTOS (CADR (NTH I P)) 2 3))
(PRINC XFIL)
(PRINC"\n" FIL)
(PRINC YFIL)
(PRINC"\n" FIL)
(SETQ I (1+ I))
)
(CLOSE FIL)
(PRINC)
)
2.计算植被符号插入点坐标子程序(用Vb编写)
Private PP() As POINTAPI
PrivateXmin0,Xmax0,Ymin0,Ymax0 As Double
Private L AsDouble''''方格边长
Private p() As POINTAPI '''方格网点坐标
Private ZBJJAs Variant
PrivateDeclare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long,ByVal x As Long,ByVal y As Long) As Long
PrivateDeclare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI,ByVal nCount As Long,ByVal
PolyFillMode As Long) As Long
PrivateDeclare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
PrivatePHRGN As Long
PrivatePtInRgn As Long
Private TypePOINTAPI
x As Long
y As Long
End Type
Privateltscale As Variant
Sub Main()
Dim nwith AsInteger,nheight AsInteger
Dim n AsInteger,I As Integer
'''打开C:\ZBHZ.TMP读取边界坐标.
Open "C:\ZBHZ.TMP" For Input As #1
n = 0
Do While NotEOF(1)
Input #1,x
Input #1,y
n = n + 1
Loop
Close #1
ReDim PP(0 To n - 1) As POINTAPI
Open "C:\ZBHZ.TMP" For Input As #1
n = 0
Do While NotEOF(1)
Input #1,PP(n).x
Input #1,PP(n).y
n = n + 1
Loop
Close #1
On ErrorResume Next
''''求包含植被边界范围的最小矩形x,y坐标
Xmin0 = PP(0).x: Ymin0 = PP(0).y
Xmax0 =Xmin0: Ymax0 =Ymin0
For I = 0 Ton - 1
If PP(I).x <= Xmin0 Then
Xmin0 =PP(I).x
End If
If PP(I).x >= Xmax0 Then
Xmax0 =PP(I).x
End If
If PP(I).y <= Ymin0 Then
Ymin0 =PP(I).y
End If
If PP(I).y >= Ymax0 Then
Ymax0 =PP(I).y
End If
Next I
'''生成区域PHRGN
PHRGN =CreatePolygonRgn(PP(0),n,1)
Call FGW '''调用内插方格网点子程序
End Sub
'''内插方格网点子程序
Sub FGW()
Dim PPP(2) As Double
Dim I,J As Integer
Dim Xmin,Xmax,Ymin,Ymax AsDouble
Dim FIL AsString
'''清除C:\ZBHZ.TMP文件数据
Open "C:\ZBHZ.TMP" For Append As #1
CLOSE #1
Open "C:\ZBHZ.TMP" For Append As #1
L = 10 '''设置植被填充间距
'''剔除植被填充区域外的方格网点.
nheight =Int((Ymax0 -Ymin0) / L) + 3
nwith = Int((Xmax0 - Xmin0) / L) + 3
ReDim p(0 To nwith - 1,0 To nheight - 1) As POINTAPI
For I = 0 Tonwith - 2 Step 2
For J = 0To nheight - 2 Step 2
p(I,J).x = (Int(Xmin0 / L) * L) + I * L
p(I,J).y = (Int(Ymin0 / L) * L) + J * L
PtInRgn =PtInRegion(PHRGN,p(I,J).x,p(I,J).y)
If PtInRgn> 0 Then
Print #1,p(I,J).x
Print #1,p(I,J).y
End If
p(I + 1,J).x = (Int(Xmin0 / L) * L) + (I + 1) * L
p(I + 1,J).y = (Int(Ymin0 / L) * L) + (J + 1) * L
PtInRgn =PtInRegion(PHRGN,p(I + 1,J).x,p(I + 1,J).y)
If PtInRgn> 0 Then
'''''把植被填充范围内的方格网点X,Y坐标数据写入C:\ZBHZ.TMP
Print #1,p(I + 1,J).x
Print #1,p(I + 1,J).y
End If
Next J
Next I
DeleteObjectPHRGN'''删除区域
Close #1
End Sub
注:该子程序修改调试完毕之后需编译成可执行文件ZBHZ.EXE放在C盘根目录下
3.插入植被符号子程序(用AutoLisp编写)
(DEFUN ZBCR()
(SETQOLDOSMODE (GETVAR"OSMODE"))
(COMMAND"OSMODE" 0)
(COMMAND"LINETYPE" "S" "CONTINUOUS" "")
;;;读入植被符号插入位置坐标数据
(SETQ FIL (OPEN "C:/ZBHZ.TMP" "R"))
(WHILE (SETQ X (READ-LINE FIL))
(IF (/= X NIL)
(SETQ X (ATOF X))
)
(SETQ Y (READ-LINE FIL))
(IF (/= Y NIL)
(SETQ Y (ATOF Y))
)
(SETQ P (LIST Y X))
(IF (/= P NIL)
;;;;插入植被符号,其中GS9410是已经定义的植被形符号名称,实际工作根据所需填充
;;;;符号不同更改其名称即可,缩放比例也是根据实际绘图比例设定。
(COMMAND"SHAPE" “GS9410”P0.50)
)
)
(CLOSE FIL)
(vl-file-delete"C:/ZBHZ.TMP") ;;;;删除临时文件 C:\ZBHZ.TMP
(COMMAND"OSMODE" OLDOSMODE)
(PRINC)
)
4.主程序(用AutoLisp编写)
(DEFUN C:ZBHZ()
(ZBZB);;;调用获取植被边界坐标子程序
(STARTAPP"C:/ZBHZ.EXE""ZBHZ");;;;调用计算植被符号插入点坐标子程序
(ZBCR);;;;调用插入植被符号子程序
)
2 第二种方法
判断点是否在多边形区域内子函数如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;PTREGION() 子函数 <判断点是否在多边形区域内>
;;;需要参数 点:PT (X Y H)或者(X Y)多边形顶点坐标:PL ((X0 Y0) (X1 Y1) .....)
;;;返回值数据格式-- 区域内:IN 区域外:OUT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defunPTINREGION(PT PL / )
(setq PT (list (nth 0 PT)(nth 1 PT)))
(SETQ PL-NUM (LENGTH PL))
(SETQ PL-PT NIL)
(SETQ III 0)
(REPEAT PL-NUM
(SETQPL-PT-JD (angle PT (NTH III PL)))
(if (= PL-PT nil)
(setqPL-PT (LIST PL-PT-JD))
(SETQPL-PT (APPEND (LIST PL-PT-JD) PL-PT))
)
(SETQ III (1+ III))
)
(SETQ JDHE 0)
(SETQ INSIDE"OUT")
(SETQ III 0)
(REPEATPL-NUM
(IF (/= III (- PL-NUM 1))
(PROGN
(SETQ JD (- (NTH (1+ III) PL-PT) (NTH III PL-PT)))
(IF (> JD PI)
(SETQ JD (- JD (* 2 PI)))
)
(IF (< JD (- 0 PI))
(SETQ JD (+ JD (* 2 PI)))
)
(IF (< (ABS (- (ABS JD) PI)) 0.0000000001)
(PROGN
(SETQINSIDE "IN")
(:EXIT)
)
)
(SETQ JDHE(+ JDHE JD))
)
(PROGN
(SETQ JD (- (NTH 0 PL-PT) (NTH III PL-PT)))
(IF (> JD PI)
(SETQ JD (- JD (* 2 PI)))
)
(IF (< JD (- 0 PI))
(SETQ JD (+ JD (* 2 PI)))
)
(IF (< (ABS (- (ABS JD) PI)) 0.0000000001)
(PROGN
(SETQINSIDE "IN")
(:EXIT)
)
)
(SETQ JDHE(ABS (+ JDHE JD)))
)
)
(SETQ III (1+ III))
)
(IF (< JDHE 0.0000000001)
(SETQINSIDE "OUT")
(SETQINSIDE "IN")
)
:EXIT
(SETQ INSIDEINSIDE)
)
;;;PTREGION() 子函数结束
附:CreatePolygonRgn,PtInRegion函数 VB声明
PtInRegionVB声明
Declare Function PtInRegion Lib"gdi32" Alias "PtInRegion" (ByVal hRgn As Long,ByVal x As Long,ByVal y As Long) As Long
说明
确定点是否在指定区域内
返回值
Long,若点在区域内为非零值,否则为0
参数表
参数 类型及说明
hRgn Long,区域句柄
x Long,以逻辑坐标表示的点的X坐标
y Long,以逻辑坐标表示的点的Y坐标
在vb里使用
在测试复杂图象时非常有用
CreatePolygonRgn VB声明
Declare Function CreatePolygonRgn Lib"gdi32" Alias "CreatePolygonRgn" (lpPoint As POINTAPI,ByVal nCount As Long,ByVal nPolyFillMode As Long) As Long
说明
创建一个由一系列点围成的区域。windows在需要时自动将最后点与第一点相连以封闭多边形
返回值
Long,执行成功为创建的区域句柄,失败则为0
参数表
参数 类型及说明
lpPoint POINTAPI,nCount个POINTAPI结构中的第一个POINTAPI结构
nCount Long,多边形的点数
nPolyFillMode Long,描述多边形填充模式。可为ALTERNATE 或 WINDING常数。参考SetPolyFillMode函数对多边形填充模式的解释
注解
不用时一定要用DeleteObject函数删除该区域
3 结束语
数字化制图过程中,可用来实现填充植被等重复且规则出现的符号的方法是多种多样的。在这,笔者仅仅总结出实际工作过程中使用过的两种较为方便实现的方法来与同行探讨,希望能抛砖引玉,找出最简易方便的方法来提高制图软件的工作效率,进而推进数字化制图工作的长足进步。