ObjectARX与MFC结合开发勘探点平面布置软件Word格式文档下载.docx
《ObjectARX与MFC结合开发勘探点平面布置软件Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ObjectARX与MFC结合开发勘探点平面布置软件Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
各类勘探孔编号前缀可以在软件中设置。
也可以将部分或全部勘探孔编号一次性清除以便重新编号。
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;
//连续的,未断开(即剖面线是否完整)
CTypedPtrArray<
CObArray,CPMLine*>
m_aPMLine;
//组成该剖面的线段数组
CPMTextm_oPMTextL;
//左剖面编号对象
CPMTextm_oPMTextR;
//右剖面编号对象
ads_namem_entPMNumberL;
ads_namem_entPMNumberR;
};
//剖面编号类
classCPMText:
publicCobject{
CPMText();
virtual~CPMText();
ads_namem_ent;
//剖面线段类
classCPMLine:
CPMLine();
virtual~CPMLine();
CStringm_strLK;
//左孔
CStringm_strRK;
//右孔
doublem_dS;
//距离
//实体名称
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;
i<
pPM->
m_aPMLine.GetSize();
i++){
pPMLine=pPM->
m_aPMLine[i];
pPMLine->
m_pPMLineNext=NULL;
m_pPMLinePrev=NULL;
if(pPMLine->
m_bFirst){pPMLine->
m_bFirst=false;
m_bLast){pPMLine->
m_bLast=false;
m_bHead){pPMLine->
m_bHead=false;
m_bTail){pPMLine->
m_bTail=false;
CPMLine*pHead=pPM->
m_aPMLine[0];
CPMLine*pTail=pPM->
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;
m_pPMLinePrev=pTail;
pTail=p;
strRK=pTail->
m_strRK;
aPMLine.RemoveAt(i);
continue;
elseif(!
m_strRK.CompareNoCase(strLK))//p是pHead的前一段
m_pPMLineNext=pHead;
pHead->
m_pPMLinePrev=p;
pHead=p;
strLK=pHead->
m_strLK;
if(i==aPMLine.GetSize()){break;
elsei++;
}//endwhile
if(pHead->
m_strLK==_T("
head"
))
m_bHead=true;
m_pPMLineNext)
m_pPMLineNext->
m_bFirst=true;
elsepHead->
if(pTail->
m_strRK==_T("
tail"
m_bTail=true;
m_pPMLinePrev)
m_pPMLinePrev->
m_bLast=true;
elsepTail->
if(i==0)//该剖面是连续的、完整的{
m_bContinue=true;
return0;
else{
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;
//设置扩展数据
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){
不能添加扩展数据。
\n"
acutPrintf("
\n不能添加扩展数据。
"
acutRelRb(ed);
}//结束添加扩展数据
returntrue;
4结束语
本软件仅利用了ObjectARX及MFC的初浅功能,它们庞大复杂的体系还待深入研究。
如果能充分挖掘出它们的功能,那么编制出来的软件肯定会对岩土工程勘察工作带来无穷无尽的帮助。