ObjectARX与MFC结合开发勘探点平面布置软件.docx

上传人:b****3 文档编号:5268504 上传时间:2022-12-14 格式:DOCX 页数:12 大小:84.10KB
下载 相关 举报
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第1页
第1页 / 共12页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第2页
第2页 / 共12页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第3页
第3页 / 共12页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第4页
第4页 / 共12页
ObjectARX与MFC结合开发勘探点平面布置软件.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

ObjectARX与MFC结合开发勘探点平面布置软件.docx

《ObjectARX与MFC结合开发勘探点平面布置软件.docx》由会员分享,可在线阅读,更多相关《ObjectARX与MFC结合开发勘探点平面布置软件.docx(12页珍藏版)》请在冰豆网上搜索。

ObjectARX与MFC结合开发勘探点平面布置软件.docx

ObjectARX与MFC结合开发勘探点平面布置软件

ObjectARX与MFC结合开发勘探点平面布置软件

1前言

对于设计院旗下的勘察部门,一般工作流程如下:

接到地质勘察任务书,从设计人员那里把拟建构(建)筑物平面图拷贝来,然后根据设计技术要求编制勘察纲要…。

在编制勘察纲要中关键的一步就是进行勘探孔的具体布置。

根据习惯做法,首先把平面图打印出来,然后用铅笔在图上把一个个勘探孔的符号画上去,然后经审核无误后再在电脑里把勘探点符号画到平面图上。

当然也可以直接在电脑里把勘探孔符号画到平面图上,再打印、修改…。

如果设计任务是一座泵站的话花半个小时估计也能完成,但如果设计任务是几十公里甚至上百公里的高速公路、高架桥呢,恐怕一个人在二、三个小时内是完不成的。

不要小看编号,对于有上千个勘探孔的工程,正确地按顺序编号也是件麻烦的事,想象一下在线路中间补几个孔的话,那起码后面的勘探孔编号就只有重新来过。

就算勘探孔全部布置好了,而控制性孔与一般性孔的比例、钻探孔与静探孔的比例是否合理呢?

手工统计就要费些时间了。

绘制剖面图时,若干条剖面上的孔距一般都是一个孔一个孔从平面图上手工丈量出来的,精确一点的办法就是根据勘探孔圆心坐标计算距离,总之也是件劳神费时的活。

勘探点平面布置图到此尚未大功告成,待野外勘探完成后,根据国家规范还要把“孔口标高”、“孔深”、“静止水位”等相关数据标记到平面图上。

一般的做法是“孔口标高”、“孔深”、“静止水位”等数据先被输入勘察软件,如果该软件不够先进的话就只有再把“孔口标高”、“孔深”、“静止水位”等数据画到平面图上,重复性输入避免不了,而且不能保证数据的一致性。

为了解决上述在绘制勘探点平面布置图中遇到的种种困难,特意编制了一款能大大加速工作效率的勘探点平面图布置软件,简称“平面助手”,旨在让勘探点平面布置的工作智能化、高效化、简单化。

该软件独立运行于AutoCAD环境下,不依赖其它勘察软件,可以单独使用。

但也可以与其它勘察软件相辅相成(通过增加软件接口)。

软件采用ObjectARX与MFC相结合的方法行编制。

其中ObjectARX为ObjectARX2002版本,ObjectARX包含一组动态链接库(DLL),这些库与AutoCAD在同一地址空间内运行并能直接利用AutoCAD核心数据库结构和代码。

MFC为VisualC++6.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的通用结果缓冲区,如下所示:

unionads_u_val{

ads_realrreal;

ads_realrpoint[3];

shortrint;

char*rstring;

longrlname[2];

longrlong;

structads_binaryrbinary;

}

structresbuf{

structresbuf*rbnext;//用于链接下个结果缓冲区。

shortrestype;//用于指定哪种类型的值被存储在该缓冲区的resval字段。

unionads_u_valresval;//存储数据

}

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。

为了更好地说明问题,下面列举出剖面类的定义及程序代码片断供参考。

//剖面类

classCPMObject:

publicCObject{

public:

CPMObject();virtual~CPMObject();

CStringm_strPM;//剖面编号

boolm_bContinue;//连续的,未断开(即剖面线是否完整)

CTypedPtrArraym_aPMLine;//组成该剖面的线段数组

CPMTextm_oPMTextL;//左剖面编号对象

CPMTextm_oPMTextR;//右剖面编号对象

ads_namem_entPMNumberL;

ads_namem_entPMNumberR;

};

//剖面编号类

classCPMText:

publicCobject{

public:

CPMText();virtual~CPMText();

CStringm_strPM;//剖面编号

ads_namem_ent;

};

//剖面线段类

classCPMLine:

publicCObject{

public:

CPMLine();virtual~CPMLine();

CStringm_strPM;//剖面编号

CStringm_strLK;//左孔

CStringm_strRK;//右孔

doublem_dS;//距离

ads_namem_ent;//实体名称

ads_namem_entNext;//下段实体名称

ads_namem_entPrev;//前段实体名称

CStringm_strHandle;//句柄

CStringm_strhandleNext;//下段剖面句柄

CStringm_strhandlePrev;//前段剖面句柄

CPMLine*m_pPMLineNext;//下段剖面线段

CPMLine*m_pPMLinePrev;//前段剖面线段

boolm_bFirst;//是否为本剖面中的第一条剖面线段

boolm_bLast;//是否为本剖面中的最后一条剖面线段

boolm_bHead;//本剖面中的第一条剖面线段左边的延伸线段

boolm_bTail;//本剖面中的最后一条剖面线段右边的延伸线段

};

//将同一剖面中的剖面线段按顺序排列

intMymfcDlg:

:

SetPMLine(CPMObject*pPM){

if(pPM->m_aPMLine.GetSize()==0)

return-1;

CPMLine*pPMLine=NULL;

for(inti=0;im_aPMLine.GetSize();i++){

pPMLine=pPM->m_aPMLine[i];

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_aPMLine[0];

CPMLine*pTail=pPM->m_aPMLine[0];

CStringstrLK(pHead->m_strLK);

CStringstrRK(pTail->m_strRK);

obPMLineaPMLine;

aPMLine.Append(pPM->m_aPMLine);

aPMLine.RemoveAt(0);

i=0;

while(aPMLine.GetSize()){

CPMLine*p=aPMLine[i];

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;

}

elseif(!

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;}

elsei++;

}//endwhile

if(pHead->m_strLK==_T("head"))

{

pHead->m_bHead=true;

if(pHead->m_pPMLineNext)

pHead->m_pPMLineNext->m_bFirst=true;

}

elsepHead->m_bFirst=true;

if(pTail->m_strRK==_T("tail"))

{

pTail->m_bTail=true;

if(pTail->m_pPMLinePrev)

pTail->m_pPMLinePrev->m_bLast=true;

}

elsepTail->m_bLast=true;

if(i==0)//该剖面是连续的、完整的{

pPM->m_bContinue=true;

return0;

}

else{

pPM->m_bContinue=false;

//检查剩下的剖面线段

returni;

}

}

//设置剖面线段的扩展数据

boolMymfcDlg:

:

SetPMLineXdata(ads_nameent,CStringstrXdata,doubledS){

structresbuf*ed,*cb,*pb;

ed=acdbEntGet(ent);

cb=ed;

if(ed==NULL){

acdbFail("Failedtogetentity\n");

AfxMessageBox("Failedtogetentity");

returnfalse;

}

else{

//设置扩展数据

while(cb){

pb=cb;

cb=pb->rbnext;

}

structresbufeb1,eb2,eb3,eb4;

charsbuf2[50],sbuf3[100];

pb->rbnext=&eb1;

eb1.restype=-3;

eb1.rbnext=&eb2;

eb2.restype=1001;

strcpy(sbuf2,local_appname);

eb2.resval.rstring=(char*)malloc(50);

strcpy(eb2.resval.rstring,sbuf2);

eb2.rbnext=&eb3;

eb3.restype=1000;

strcpy(sbuf3,m_strXdata.GetBuffer(strXdata.GetLength()));//扩展数据

eb3.resval.rstring=(char*)malloc(100);

strcpy(eb3.resval.rstring,sbuf3);

eb3.rbnext=&eb4;

eb4.restype=1040;

eb4.resval.rreal=dS;

eb4.rbnext=NULL;

if(acdbEntMod(ed)!

=RTNORM){

acdbFail("不能添加扩展数据。

\n");

acutPrintf("\n不能添加扩展数据。

");

AfxMessageBox("不能添加扩展数据。

");

acutRelRb(ed);

returnfalse;

}

acutRelRb(ed);

}//结束添加扩展数据

returntrue;

}

4结束语

本软件仅利用了ObjectARX及MFC的初浅功能,它们庞大复杂的体系还待深入研究。

如果能充分挖掘出它们的功能,那么编制出来的软件肯定会对岩土工程勘察工作带来无穷无尽的帮助。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1