快速标准化、规范化矿图计算机绘制的研究

 

 

罗祥攀   孙华晨

 

(山东精诚电子科技有限公司)

 

  要:通过参照国家有关“煤矿制图标准化”的要求及标准,归纳总结矿图绘制的要求和特点得出能够通过参数化的形式对矿图进行快速准确规范绘制的方法。并论述了Coal Mines CAD系统的设计和实现思路。

关键词:参数化 矿图 GDI+

  矿图绘制是煤矿技术人员的基础工作,规范化、标准化的矿图可以有效地指导现场生产,在一定程度上反映了煤矿安全技术生产水平。近年来,对矿图质量的要求不断提高,要求煤矿技术人员不仅要提高绘图速度,也要求提高绘图质量。我们通过参照国家有关“煤矿制图标准化”的要求及标准,调研了全国主要矿业集团矿图绘制情况,归纳总结矿图绘制的要求和特点得出能够通过参数化的形式对矿图进行快速准确规范绘制的方法,并形成了参数绘图系统的设计方法。提供了一个标准、规范、省时的矿图绘制解决方案。

1 研究路线及方法

  在山东科技大学,中国矿业大学等科研技术单位的理论支持下,结合调研全国多个代表性矿业集团资料的分析整理,本着有标准的严格按照标准,没有标准的统计出最规范的样本作为标准。反复和煤矿专家及煤矿绘图技术员进行探讨和沟通,得出大量的矿图绘制技巧及注意事项。逐渐总结出相对完整的绘图标准及方案,建立数学模型,利用面向对象技术、GDI+图形绘制技术,c#语言进行Coal Mines CAD系统的设计及实现。

2 矿图分类及相应的处理方法

  煤矿常用的图形可以分成三类来进行处理:

  第一类为几何规律较强的图形,这一类图形可以采用“参数绘图技术”进行处理,用户只需要输入有限的几个参数系统自动生成图形。

  第二类为几何规律较差但对于一个矿来说没有什么变化的图形,该类图形不适合采用参数作图的技术,可以通过建立图形库的方式,让用户通过调用的方式实现。

  第三类为几何规律太差,且对于一个煤矿来说变化较大的图形这类图形即不能使用参数作图,也不适合建立图形库,对于这类的图形应该通过建立大量的图形元件库和一个友好的交互屏幕,用户通过搭积木的方式绘制图形。

4 绘图系统基本绘图部分的设计.

4.1基本绘图部分功能介绍

  从系统功能来看,分为以下三部分:数据计算、交互图形绘制、图形和数据的输入输出

  (一) 数据计算

  计算等高线,及参数作图用到的相应计算

  (二)、 交互图形设计

  此功能是系统的核心,主要包括:

 l         绘制基本图元(如直线、边形、填充、曲线、圆弧、椭弧、标注、文字)。

 l         修改基本图元(对图元进行平移、缩放、旋转、镜像删除等)。

 l         绘制高级图元(如电缆沟、风机、采煤机等)。

 l         修改高级图元(对高级图元进行平移定位、缩放、旋转、镜像、增删等功能)。

 (三)、图形和数据输入输出

 l         要能把DXF文件读入,并可在此基础上进行交互图形设计。

 l         把绘制的图形保存为文件,也可以保存为DXF格式的以便更好的和原先的AUTO CAD进行交互 。

 l         可以把绘制的图形生成BMPJPEGGIF等图形文件。

 l         可以根据需要自由出图,根据设置的纸张自动打印出图。

4.2系统类的设计

 (一)图元类的设计

  为了描述各种基本及高级的图形元素,需设计基本图元类和高级图元类,作为图元来讲他们有很多共同点,比如都有颜色、样式、和大小、图层名、图元类型、句柄、对象可见性、组码值,交互绘制是都要进行拾取、平移、旋转、镜像、缩放、转换成DXF组码和绘制等。所以要先创建一图元基类CGElement。把基类定义为抽象类,必须继承;并将方法设置为抽象方法,必须在派生类中重写。此系统中的基本图元类有直线、矩形、()圆、(椭)圆弧、标注、曲线、图象、插入块、多段线和文本等分别对应Cline类、CRectangle类、CCircle类、CArc类、CDimension类、CCurve类、CImage类、CInsert类、CLwpolyline类和CMtext类。这些类都从CGElement类继承。系统中的高级图元类有采煤机、电缆沟、电机、巷道、支柱等。类结构图见图一

图一

  (二)交互图元类的设计

  图元类对图元的基本特性和行为进行了描述,但仅仅依靠他们还是不够的,因为交互式的CAD 系统中,确定图元的数据(如直线段的端点坐标)不是预先给定的,而是在绘制的过程中通过命令窗口或鼠标 即时输入的。 所以, 还需要对交互绘制图元时的整个过程进行描述。这个过程是一格动态的过程。例如绘制直线段时:首先在绘图区单击鼠标左键确定直线段的起点,然后移动鼠标,移动时动态地显示直线段的当前状态;在单击鼠标左键时,把直线段的终点记录下来就完成绘制。

  鼠标绘图时总是涉及到按键与移动等操作。创建一接口IComman接口有三个方法:LButtonDown,RButtomDowm,MouseMove分别定义鼠标左键按下,右键按下和移动。然而用命令窗口进行绘图会涉及到对命令和参数的读取,这样就在IComman接口增加一方法Comd定义接收命令。 然后有九个交互类实现ICommand接口,CCreateLine类、CCreateRect类、CCreateCircle类、CCreateText类、CCreatCmj类、CMove类、CMirror类、CSelect类。分别实现直线、矩形、圆、圆弧、文本、采煤机等图元的创建,对所选的图元的平移转换、旋转变换和镜像变换等。

/// <summary>

        /// 左键按下时的处理方法

        /// </summary>

        /// <param name="g">画布</param>

        /// <param name="aPos">鼠标当前坐标</param>

        /// <param name="ges">存放基本图元的数组</param>

        /// <param name="geSels">存放选中的图元的数组</param>

        /// <param name="undoBuffer"></param>

        /// <param name="redoBuffer"></param>

        /// <param name="lbName">命令行提示文本</param>

 void LButtonDown(Graphics g, PointF aPos, ArrayList ges, ArrayList geSels, ArrayList undoBuffer, ArrayList redoBuffer, string lbName);      

/// <summary>

        ///右键按下时的处理方法

        /// </summary>

        /// <param name="g">画布</param>

        /// <param name="aPos">鼠标点</param>

        /// <param name="geSels">存放选中图元的数组</param>

        /// <param name="ges">存放基本图元的数组</param> 

        void RButtonDown(Graphics g, PointF aPos, ArrayList ges, ArrayList geSels);       

        /// <summary>

        /// 鼠标移动时的处理方法

        /// </summary>

        /// <param name="g">画布</param>

        /// <param name="aPos">鼠标点</param>

        /// <param name="geSels">存放选中图元的数组</param>

        /// <param name="ges">存放基本图元的数组</param>

        /// <param name="lbName">命令行提示文本</param>

        void MouseMove(Graphics g, PointF aPos, ArrayList geSels, ArrayList ges, string lbName);

  (三)其它类的设计

  如若对dxf文件的处理需要一处理DXF文件的类。Cdxf类有一静态属性Zm 用来存放DXF文件的内容。方法有:OpenDxf()读取指定dxf文件内容放入Zm里,SaveDxf()Zm里的内容写入文件。Parse()dxf文件解释成图元类并存入Ges里;ParseBack()Ges数据转换为dxf格式写入Zm;DrawDxf()将载入的dxf文件的内容呈现在绘图区。

  其中有很多公共的方法如坐标变换,颜色转换,宽度转换,角度计算,计算点与点之间的距离,通过层里的线型名在LTYPE里找到对应的线型的文字描述,通过图层取得颜色线型等属性值,通过样式名获取相关信息等为此设计一Module类,相关类结构图见二。

 

图二

5 参数化绘图的实现

  总体思路:将可参数化的图形拆分为相对独立的图形零件(如电缆沟、风筒、皮带车等),其中一个为主要的称为图形框架,其余零件都是在其上面组装,先确定图形框架的位置、大小及其它相关必要参数,再以此图形框架为基础确定其它零件的位置及大小。有的零件(如电缆钩)形状大小是固定的无需通过参数进行确定,只需确定其位置。最后把所有零件组装完毕图形也就自动绘制完毕。下面以半圆拱断面图为例进一步论述参数绘图的实现步骤。

  第一、图形拆分

  把可以参数化的图形进行分析,拆分为相对独立的高级图元。比如半圆拱断面图,可以拆分为:半圆拱框架(包括底板,水沟,墙等的一框架)、矿车(分单轨、双轨)、电缆钩、风筒、锚杆、锚索,其中半圆拱框架为半圆拱断面图特有的,也是绘制半圆拱断面图的关键部分,因为电缆沟、矿车等其它部分的绘制都是要参照半圆拱框架。

  第二、将拆分的高级图元进行抽象化,设计高级图元类。

   将高级图元抽象为高级图元类的步骤为:

  (1)、确定要抽象为高级图元的标准图例。

  (2)、属性的确定:分析图例,找出必须的成图决定因素,即位置大小,作为高级图元的属性。高级图元是基本图元组合而成(锚杆由直线段和相应得标注组成)根据算法得到的基本图元作为高级图元的属性。其中半圆拱框架类的属性有:框架左下角点的坐标、拱高、墙厚、墙高、左墙矩形(通过矩形来描述墙)、右墙矩形、底板线(用水平直线段描述底板)、墙高标注(通过基本图元中的标注类进行描述)、拱高标注等。

  (3)、确定基本图元的算法,高级图元类中写方法:通过大小位置及参照框架对象抽象出一定的算法来确定基本图元。

  其中关键属性的确定的算法:

 l         左墙矩形属性的确定算法为:左上角的点=(基准点的X值,框架基准点的Y+墙高);矩形长为墙厚;矩形宽为墙高。

 l         半圆拱的确定:圆心点的坐标=(基准点X+荒宽/2,基准点Y+墙高);内弧半径=净宽/2;外弧半径=荒宽/2

 l         右墙矩形属性确定:右上角点=(基准点X+荒宽-墙厚,基准点Y+墙高);矩形长为墙厚;矩形宽为墙高。

 l         墙高标注属性是通过实例化基本图元类中的标注类来实现,通过传入要标注的两点的坐标,和标注方向。

高级图元绘制的算法:高级图元的绘制是基于基本图元的绘制的,因为高级图元是由基本图元组合的,只要调用基本图元的Draw方法就可以实现高级图元的绘制,

//外弧的绘制

            m_outArc.Draw(g, aDrawMode);

            //内弧的绘制

            m_inArc.Draw(g, aDrawMode);

            //左墙的绘制

            LeftRectangle.Draw(g, aDrawMode);

            //右墙的绘制

       RightRectangle.Draw(g, aDrawMode);

  第三、分别为高级图元建立属性窗体

   属性窗体主要是和用户进行沟通的接口,即用户可以通过属性窗体来对相应的高级图元进行属性设置,还可以显示当前高级图元的相应参数。

   属性窗体中主要是列出高级图元的基本属性,这些属性是唯一确定高级图元形状大小位置的属性,半圆拱基本框架类的属性窗体的属性有:净宽、墙高、道碴厚、墙厚。电缆钩的属性窗体的属性有:电缆沟的位置(左侧、右侧),电缆沟高度。电缆钩的在左边和在右边的形状固定,设置好高度就可以绘制出标准的电缆沟。

  属性窗体的构造方法要带一参数,此参数为将要修改的高级图元类的对象,构造方法总要对传入的高级图元对象进行分析,初始化界面上的控件。

/// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="cas">锚杆对象</param>

        public FAnchorstock(CAnchorstock cas)

        {

            cask = cas;

            InitializeComponent();

            NUDaLength.Value =(decimal)cas.Alength;

            NUDaNum.Value = cas.ANum;

            NUDaOutLength.Value = (decimal)cas.AOutlength;

            NUDaRemove.Value = (decimal)cas.ARemove;

            NUDbLength.Value = (decimal)cas.Blength;

            NUDbOutLength.Value = (decimal)cas.BOutlength;

            NUDbRemove.Value = (decimal)cas.BRemove;

            NUDbTopRemove.Value = (decimal)cas.TopRemove;

        }

  在点击属性框窗体的确定按钮时,要把设置的属性赋给构造方法中传来的高级图元对象,并触发事件刷新屏幕,从而能够实时绘制除最新修改的图形。

  第四、系统中的调用方法

  基本框架类和基本框架的属性窗体只在点击新建按钮,并选中新建“半圆拱断面图”时进行实例化,当在绘图区双击基本框架时也可以调出基本框架的属性窗体,对基本框架进行修改。

  点击工具栏上的对应创建高级图元(除基本框架类的高级图元)的图标时先对此高级图元和属性窗体进行实例化(高级图元只能实例化一次),在双击某个高级图元时可以调出相应的属性窗体。

6 结语

  本文通过参照国家有关“煤矿制图标准化”的要求及标准,归纳总结矿图绘制的要求和特点,论述了能够通过参数化的形式对矿图进行快速准确规范绘制的方法及Coal Mines CAD系统的设计及实现思路,Coal Mines CAD系统应用后不但使绘图人员解脱了手工绘图的繁琐,还能够高效的绘制矿用图纸,特别是绘制一些较复杂的矿图,即使对CAD系统不熟悉的技术人员照样可以绘制出标准、规范的图纸,解决了矿图普遍绘制不标准、不规范、费时费力的难题。今后要对此系统继续完善,力求为煤矿行业更好的服务。

 

作者简介:罗祥攀  汉族 198712月出生,2007年山东科技大学本科毕业,计算机科学与技术专业,现任山东精诚电子科技有限公司研发部项目经理。