时间:2022-03-21 06:14:31
【摘要】利用AutoLISP进行二次开发,实现在AutoCAD平台下快速有效的配置排水管线的标注空间并自动化标注,大大提高了排水管线测量的内业工作效率,满足现代化生产的需求。
【关键词】AutoLISP;排水管线;扯旗标注;整饰
1、引言
目前AutoCAD是国内使用最为广泛的工程绘图软件,而基于AutoCAD平台下的排水管线图标注,传统的作业方法主要靠手工逐个添加标注,再逐个移动标注进行整饰,其内业工作量极大、操作复杂、效率低,几乎不能满足生产效率的需求。本文利用AutoLISP进行二次开发设计,利用AutoLISP强大的功能,综合判断各个组件图形之间的位置关系,配置最为合理的排水标注空间,实现在AutoCAD平台下市政排水管线图快速有效的自动化标注。
2、市政排水管线图注记的要求
2.1点状对象的注记
注记对象:窨井、雨水口、管线点、溢流堰、排放口、拍门等。
注记内容:窨井、雨水口等的地面高程、底部高程;排放口、拍门的大小(相连管线的管径或沟渠的宽度×净高),底部高程。
注记形式:分式注记,分子为地面高程或排放口、拍门的大小,分母为底部高程。
注记字体大小:分子、分母字高均为1.00。如下图:
2.2 线状对象的注记
注记对象:排水管道、排水沟渠等。
注记内容:排水管道的管径,排水沟渠的排水雨污性质和沟渠的宽度×净高;流水方向;管、渠底部高程(管、渠底的高程与相连节点底部高程不同的时候,需进行此项标注)。
注记形式:管道管径沿管道标注,排水沟渠的排水雨污性质和宽度×净高沿沟渠标注;水流方向沿管道或沟渠的中点处平行标注;管、渠底高程以分式注记,分子为管、渠底部高程。
注记字体大小:字高为1.00。如下图:
3、程序设计
3.1程序要求
关于AutoCAD排水管线图的自动化标注,现市面上也有一些商业化排水管线软件含有辅助标注或半自动化标注的功能,但其一般只是以一定偏移量及简单规则进行标注,排水标注之间以及排水标注与组件图形之间很容易出现重叠遮挡的问题,从而降低了图面的可读性,失去了对图形进行自动化标注的好处。本次开发的主要目的是在自动化标注基础上,增加程序自动化配置合理的排水标注空间的功能,要求实现目标如下:
(1)自动化获取排水管网对象的相关属性信息。根据所选取的排水管网图形对象,自动读取对象的CAD扩展属性,获取管网对象标注所需要的必要信息。
(2)智能化匹配及判断。根据所选对象自动匹配其标注类型、内容及注记空间的大小等;智能判断标注的属性值内容是否符合要求,遇到错误值时做出提示;自动搜索并匹配与管线相连接的节点,判断管线底部高程与节点底部高程是否同深(两者差值大于一定阀值时候需进行标注)。
(3)自动化搜索最佳标注空间并进行标注。根据设定的要求和规则自动搜索图面空间,综合判断各个组件图形之间的位置关系,寻找最佳的标注空间,尽可能的避免注记与图形或注记与注记间的压盖、重叠,并自动化的生成标注。
3.2程序运行流程
3.2.1程序运行流程图
程序运行的流程图如下:
3.2.2程序运行步骤
(1)运行程序,选取需要标注的排水管网对象;
(2)程序根据选择的对象,自动读取对象的关键属性信息(如平面坐标、高程等);
(3)程序根据选择的对象,智能化判断需对象的标注类型、内容及注记空间大小等;
(4)自动化搜索合适的标注空间,并进行标注:
1)点状对象的标注:以对象中心为圆心,一定半径的圆为轨迹做逆时针搜索,查找轨迹上是否有合适的标注空间,若未搜索到合适的标注空间,则逐步扩大搜索圆的半径,直至搜索到合适的标注空间为止,并进行标注;
2)线状对象的标注:①获取管线的管径及起点、终点坐标信息,计算管线的中点坐标,判断管线的方向,以一定的偏移值平行于管线标注流向及管径(或渠箱的排水雨污性质和宽度×净高);②关联管线的上下游连接节点,获取相连接节点的属性信息,判断管、渠底高程与相连节点底部高程是否相同,若相差大于设定的阀值,则进行管底高程标注:以一定半径的半圆为轨迹做搜索,逆时针搜索管线方向±90°范围内是否有合适标注空间,若未搜索到合适的标注空间则逐步扩大搜索圆的半径,直至搜索到合适的标注空间为止,并进行标注;
(5)程序做历遍操作,直接所有对象标注完成。
3.3程序示例(以窨井的标注为例)
读取窨井信息:
(setq endata (entget en))
(setq result_pt (cdr (assoc 10 (entget en))));获取窨井平面坐标
(setq ob_SUR_H (cdr (car (cdr (cadr (assoc -3 (entget en '("SUR_H"))))))));读取井面高程
(setq ob_BOTTOM_H (cdr (car (cdr (cadr (assoc -3 (entget en '("BOTTOM_H"))))))));读取井底高程
循环查找最佳标注空间:
(setq nnl 3 nnk 1);设置查找的轨迹圆的初始半径
(while (and (< nnl 10) (= nnk 1)); 以一定半径的圆形为轨迹做搜索,查找合适的标注空间
(setq nna (* pi 0.25));设置标注的起始查找方向为45°
(while (and (< nna (* 2.25 pi)) (= nnk 1));若未查找到合适的标注空间,则逐步增加搜索圆的半径
(setq betax (* (cos nna) nnl));设置循环检索轨迹的X坐标变量值
(setq betay (* (sin nna) nnl));设置循环检索轨迹的Y坐标变量值
(setq result_ptz (list (+ (car result_pt) betax) (+ (cadr result_pt) betay)));设置检索轨迹的中心点坐标
(setq result_pt1 (list (- (car result_ptz) 1.4) (- (cadr result_ptz) 1.05)));标注范围的左下角
(setq result_pt2 (list (+ (car result_ptz) 1.4) (+ (cadr result_ptz) 1.2)));标注范围的右上角
(setq ob_nil (ssget "C" result_pt1 result_pt2));查找拟标注空间范围内是否含有其他对象
(if (= ob_nil nil) (setq nnk 0));当标注空间范围内不含有其他对象,设定该空间为可标注空间,设置标定值,退出循环
(if (or (and (> nna (* (/ pi 12) 4)) (< nna (* (/ pi 12) 8))) (and (> nna (* (/ pi 12) 16)) (< nna (* (/ pi 12) 20))));当标注区域为不合适区域(标注空间在标注对象的正上、下方时,扯旗线与注记文字易重叠),则继续查找合适的标注空间
(setq nnk 1))
(setq nna (+ nna 0.1));循环中的角度递增变量
);结束角度循环
(setq nnl (+ nnl 0.2));循环中的轨迹圆半径递增变量
);;当找到合适的标注空间时候结束循环
窨井的扯旗标注:
(if (= nnk 0)
(progn
(command "text" "j" "bc" result_ptz "1" "0" (rtos ob_SUR_H 2 2));标注井面高程
(command "text" "j" "tc" result_ptz "1" "0" (rtos ob_BOTTOM_H 2 2));标注井底高程
;;标注扯旗线
(if (> (car result_ptz) (car result_pt));当标注范围在窨井右边时
(progn
(command "pline" result_pt (list (- (car result_ptz) 1.6) (+ (cadr result_ptz) 0.07)) (list (+ (car result_ptz) 1.3) (+ (cadr result_ptz) 0.07)) "")))
(if (< (car result_ptz) (car result_pt));当标注范围在窨井左边时
(progn
(command "pline" result_pt (list (+ (car result_ptz) 1.6) (+ (cadr result_ptz) 0.07)) (list (- (car result_ptz) 1.3) (+ (cadr result_ptz) 0.07)) "")))
));;完成窨井的扯旗标注
3.4成果展示
图8为某商业化排水软件(没有自动整饰功能)自动标注出来的成果,排水标注之间以及排水标注与组件图形之间存在重叠、遮挡的问题,图面可读性差,仍需手工再做整饰。图9为应用本程序标注出来的结果,图面整洁、美观,基本不需人工干预。
4、结束语
本文利用AutoLISP进行开发和设计,很好地利用了AutoCAD灵活的编辑和强大的制图功能,再结合程序设计的思路及算法,从而实现排水管线扯旗标注及整饰自动化的功能,减少了因人工操作而出现的错误,大大的提高了作业单位排水管线测量的内业工作效率。