ObjectARX与MFC结合开发勘探点平面布置软件.docx_第1页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第2页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第3页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第4页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ObjectARX与MFC结合开发勘探点平面布置软件 1 前言对于设计院旗下的勘察部门,一般工作流程如下:接到地质勘察任务书,从设计人员那里把拟建构(建)筑物平面图拷贝来,然后根据设计技术要求编制勘察纲要。在编制勘察纲要中关键的一步就是进行勘探孔的具体布置。根据习惯做法,首先把平面图打印出来,然后用铅笔在图上把一个个勘探孔的符号画上去,然后经审核无误后再在电脑里把勘探点符号画到平面图上。当然也可以直接在电脑里把勘探孔符号画到平面图上,再打印、修改。如果设计任务是一座泵站的话花半个小时估计也能完成,但如果设计任务是几十公里甚至上百公里的高速公路、高架桥呢,恐怕一个人在二、三个小时内是完不成的。不要小看编号,对于有上千个勘探孔的工程,正确地按顺序编号也是件麻烦的事,想象一下在线路中间补几个孔的话,那起码后面的勘探孔编号就只有重新来过。就算勘探孔全部布置好了,而控制性孔与一般性孔的比例、钻探孔与静探孔的比例是否合理呢?手工统计就要费些时间了。 绘制剖面图时,若干条剖面上的孔距一般都是一个孔一个孔从平面图上手工丈量出来的,精确一点的办法就是根据勘探孔圆心坐标计算距离,总之也是件劳神费时的活。 勘探点平面布置图到此尚未大功告成,待野外勘探完成后,根据国家规范还要把“孔口标高”、“孔深”、“静止水位”等相关数据标记到平面图上。一般的做法是“孔口标高”、“孔深”、“静止水位”等数据先被输入勘察软件,如果该软件不够先进的话就只有再把“孔口标高”、“孔深”、“静止水位”等数据画到平面图上,重复性输入避免不了,而且不能保证数据的一致性。 为了解决上述在绘制勘探点平面布置图中遇到的种种困难,特意编制了一款能大大加速工作效率的勘探点平面图布置软件,简称“平面助手”,旨在让勘探点平面布置的工作智能化、高效化、简单化。该软件独立运行于AutoCAD环境下,不依赖其它勘察软件,可以单独使用。但也可以与其它勘察软件相辅相成(通过增加软件接口)。 软件采用ObjectARX与MFC相结合的方法行编制。其中ObjectARX为Object ARX2002版本,ObjectARX包含一组动态链接库(DLL),这些库与AutoCAD在同一地址空间内运行并能直接利用AutoCAD核心数据库结构和代码。MFC为Visual C6.0版本,MFC为开发者提供了一批预先定义的类和成员函数,可非常快速地开发Windows对话框界面,如图1。2 功能概述 2.1 勘探孔布置 从勘探点列表中选择勘探孔类型,“孔号、孔深、标高、水位”等数据可以空缺,以后再补充。如果有“坐标数据”将直接根据坐标插入该类型的勘探孔,否则通过交互方式在平面图上插入。“孔深、标高、水位”等数据可以从其它软件(例如“华宁岩土工程勘察软件”、“上海岩土工程勘察数据处理系统”等等)直接读进来。2.2 勘探孔调整 可以选择部分或全部勘探孔,然后以各孔中心为基点统一按比例缩放或旋转一定角度。 另外一种功能是挑选某个孔,以该孔的比例、旋转角度为参考,然后让其它孔的比例、角度与该孔一致。 2.3 勘探孔自动编号 选择图中需要自动编号的勘探点,将从“起始编号”开始按“X坐标”方向或按“Y坐标”方向的顺序统一编号。“起始编号”自由设定。编号根据勘探孔类型的不同将分别加以不同的前缀,如取土孔以“ZK”开头,静探孔以“JK”开头。各类勘探孔编号前缀可以在软件中设置。也可以将部分或全部勘探孔编号一次性清除以便重新编号。 2.4 设置勘探孔深度 可以根据勘探孔类型的不同分别设置孔深。例如把平面图中的控制性孔全部设置为50米,一般性孔全部设置为40米;或把取土孔全部设置为50米,静探孔全部设置为40米等。 2.5 替换勘探孔类型 先指定某种勘探孔类型,再选择要被替换的勘探孔即可实现一次性替换,同时保留原勘探孔的孔号、标高、孔深、水位等数据。 2.6 勘探孔分类统计 能统计各类勘探孔的数量、米数、比例等,便于及时调整布孔方案。 2.7 快速布置剖面 根据选择的勘探孔自动连接剖面线并标注剖面编号,同时在表格中显示该条剖面的参数,即孔号、孔距、总长度等。剖面线段删除或增加后自动保证该剖面的连续性。剖面信息能随图形一并保存便于下次打开时检索。剖面数据可以导出到其它软件(例如“华宁岩土工程勘察软件”、“上海岩土工程勘察数据处理系统”等等)。 3 关键技术剖析 3.1 勘探孔带属性的图块 软件中勘探孔符号事先做成带属性的图块,并单独保存为“dwg”文件。布置勘探孔即插入(利用INSERT命令)某种类型的图块,如图2所示。块的优点是能够增加绘图的准确性,提高绘图速度和减小文件尺寸。块属性就是块所附带的附加文本信息,正好可以用来保存“孔号”、“标高”、“孔深”、“水位”等信息。在AutoCAD中执行“ATTDEF”命令可以生成一个带属性的块。下面以“取土孔”为例说明如下(见表1)。 图块名称:取土孔.dwg 表1 勘探孔图块属性一览表 属性标记 提示 默认 倒置 反向 可见 固定 验证 预置 KX (无) 否 否 否 是 否 是 ERR-KH 孔号 (无) 否 否 是 否 否 否 ERR-KS 孔深 (无) 否 否 是 否 否 否 ERR-BG 标高 (无) 否 否 是 否 否 否 ERR-SW 水位 (无) 否 否 是 否 否 否 注:表中“KX”预留给将来作其它用途,保留该属性为了与“上海岩土工程勘察设计研究院有限公司”的平面图系统相兼容。 3.2 勘探孔的识别 在一幅插入勘探孔图块的平面图上,软件是通过分析实体的结果缓冲区实现勘探孔的鉴别。实体的结果缓冲区由ObjectARX函数acdbEntGet()返回。ObjectARX定义了一个名为resbuf的通用结果缓冲区,如下所示: union ads_u_val ads_real rreal; ads_real rpoint3; short rint; char *rstring; long rlname2; long rlong; struct ads_binary rbinary; struct resbuf struct resbuf *rbnext;/用于链接下个结果缓冲区。 short restype;/用于指定哪种类型的值被存储在该缓冲区的resval字段。 union ads_u_val resval;/存储数据 ObjectARX处理实体的函数(acdbEntGet)所返回的结果中restype字段包含有DXF组码,通过DXF组码能够很容易地确定某实体是否为插入的图块。 acdbEntGet()所检索到的一个插入图块的结果缓冲区链表格如图3。DXF组码“0”表示实体类型码,插入图块的实体类型为“INSERT”;“2”表示图块名称;其余类型码的含义见图3中所示。软件即根据实体类型和图块名称在CAD图形中区别出勘探孔及其类型。注:图3中每个结果缓冲区由三行组成,第一行表示地址,第二行表示结果类型码(即DXF组码),第三行表示包含的数据。该图块的结果缓冲区未全部表示出来。 3.3 属性的提取 属性也是一种实体。属性实体在图形数据库中的排列顺序是紧跟在其所附着的图块后面,所以把需要提取属性的图块实体名称作为参数传给acdbEntNext()函数,通过acdbEntNext()函数就可以获得属性实体。属性实体的结果缓冲区链表格式见图4。 可见属性的实体类型为“ATTRIB”。只要知道了某实体的属性及其结果缓冲区链表,则其属性标记、属性值就很容易获得了。勘探孔的“孔号”、“标高”、“孔深”、“水位”等数据就是从图块所附的属性中提取的。 采用图块的形式还有一个好处就是当希望改变某种勘探孔的符号样式时比较灵活。可以直接修改图块的样式再在平面图中插入此图块,AutoCAD将提示“此图块已经存在,是否替换”,选择“是”后图中原来插入的的图块将全部改变成新的样式。 3.4 剖面的建立 剖面的建立主要利用了实体的扩展数据。实体的扩展数据是由应用程序所建立的,跟随在该实体的正常定义数据之后。AutoCAD系统并不使用这些数据,但是它能够负责管理这些扩展数据。 实体的扩展数据如图5所示。扩展数据的开头是由“-3”标识码来标识的,其后跟随一个或多个以“1001”标识码为第一个组的结果缓冲区链表。每一组扩展数据均以一个彼此互不相同的应用程序名开头,扩展数据由应用程序自己定义。扩展数据的组码在1000至1071之间,例如字符串的组码为1000,实数的组码为1040,整数的组码为1070,长整数的组码为1071。 例如某条剖面编号为“”,该剖面上某段剖面由孔“ZK3”及“JK5”组成,孔距为“50.0”米。则构造如下字符串:“剖面;左ZK3;右JK5”,放入组码为1000的缓冲区单元中;把孔距“50.0”放入组码为1040的缓冲区单元中(见图6)。按图6构造数据缓冲区链表,通过把链表指针传给acdbEntMod()函数实现修改实体,从而给直线添加扩展数据。 3.5 剖面的检索 检索图中已经建立的剖面过程见图7。为了更好地说明问题,下面列举出剖面类的定义及程序代码片断供参考。 /剖面类 class CPMObject : public CObject public: CPMObject(); virtual CPMObject(); CString m_strPM;/剖面编号 bool m_bContinue;/连续的,未断开(即剖面线是否完整) CTypedPtrArray m_aPMLine;/组成该剖面的线段数组 CPMText m_oPMTextL;/左剖面编号对象 CPMText m_oPMTextR;/右剖面编号对象 ads_name m_entPMNumberL; ads_name m_entPMNumberR; ; /剖面编号类 class CPMText:public Cobject public: CPMText(); virtual CPMText(); CString m_strPM;/剖面编号 ads_name m_ent; ; /剖面线段类 class CPMLine : public CObject public: CPMLine(); virtual CPMLine(); CString m_strPM;/剖面编号 CString m_strLK;/左孔 CString m_strRK;/右孔 double m_dS;/距离 ads_name m_ent;/实体名称 ads_name m_entNext;/下段实体名称 ads_name m_entPrev;/前段实体名称 CString m_strHandle;/句柄 CString m_strhandleNext;/下段剖面句柄 CString m_strhandlePrev;/前段剖面句柄 CPMLine* m_pPMLineNext;/下段剖面线段 CPMLine* m_pPMLinePrev;/前段剖面线段 bool m_bFirst;/是否为本剖面中的第一条剖面线段 bool m_bLast;/是否为本剖面中的最后一条剖面线段 bool m_bHead;/本剖面中的第一条剖面线段左边的延伸线段 bool m_bTail;/本剖面中的最后一条剖面线段右边的延伸线段 ; /将同一剖面中的剖面线段按顺序排列 int MymfcDlg:SetPMLine(CPMObject* pPM) if(pPM-m_aPMLine.GetSize()=0) return -1; CPMLine*pPMLine=NULL; for(int i=0;im_aPMLine.GetSize();i+) pPMLine=pPM-m_aPMLinei; pPMLine-m_pPMLineNext=NULL; pPMLine-m_pPMLinePrev=NULL; if(pPMLine-m_bFirst) pPMLine-m_bFirst=false; if(pPMLine-m_bLast)pPMLine-m_bLast=false; if(pPMLine-m_bHead)pPMLine-m_bHead=false; if(pPMLine-m_bTail) pPMLine-m_bTail=false; CPMLine* pHead=pPM-m_aPMLine0; CPMLine* pTail=pPM-m_aPMLine0; CString strLK(pHead-m_strLK); CString strRK(pTail-m_strRK); obPMLine aPMLine; aPMLine.Append(pPM-m_aPMLine); aPMLine.RemoveAt(0); i=0; while(aPMLine.GetSize() CPMLine* p=aPMLinei; if(!p-m_strLK.CompareNoCase(strRK)/p是pTail的下一段 pTail-m_pPMLineNext=p; p-m_pPMLinePrev=pTail; pTail=p; strRK=pTail-m_strRK; aPMLine.RemoveAt(i); i=0; continue; else if(!p-m_strRK.CompareNoCase(strLK)/p是pHead的前一段 p-m_pPMLineNext=pHead; pHead-m_pPMLinePrev=p; pHead=p; strLK=pHead-m_strLK; aPMLine.RemoveAt(i); i=0; continue; if(i=aPMLine.GetSize()break; else i+; /end while if(pHead-m_strLK=_T(head) pHead-m_bHead=true; if(pHead-m_pPMLineNext) pHead-m_pPMLineNext-m_bFirst=true; else pHead-m_bFirst=true; if(pTail-m_strRK=_T(tail) pTail-m_bTail=true; if(pTail-m_pPMLinePrev) pTail-m_pPMLinePrev-m_bLast=true; else pTail-m_bLast=true; if(i=0)/该剖面是连续的、完整的 pPM-m_bContinue=true; return 0; else pPM-m_bContinue=false; /检查剩下的剖面线段 return i; /设置剖面线段的扩展数据 bool MymfcDlg:SetPMLineXdata(ads_name ent,CString strXdata,double dS) struct resbuf *ed,*cb,*pb; ed=acdbEntGet(ent); cb=ed; if(ed=NULL) acdbFail(Failed to get entityn); AfxMessageBox(Failed to get entity); return false; else /设置扩展数据 while(cb) pb=cb; cb=pb-rbnext; struct resbuf eb1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论