ObjectArx填充边界的获取.docx
《ObjectArx填充边界的获取.docx》由会员分享,可在线阅读,更多相关《ObjectArx填充边界的获取.docx(9页珍藏版)》请在冰点文库上搜索。
ObjectArx填充边界的获取
//遍历填充对象的边界信息。
boolCAcUiSelDialog:
:
OpenDwgFile(constACHAR*fileName)
{
Acad:
:
ErrorStatuses;
//AcDbObjectIdArrayobjectIds;//边界id数组
AcGeVector3dnormal;//填充平面
boolbAssociative;//关联型
AcDbHatch:
:
HatchPatternTypepatternType;//填充图案类型
constACHAR*patternName;//填充图案名
AcDbHatch:
:
HatchStylehatchStyle;
//2.读取.dwg文件
AcDbDatabase*pDb=newAcDbDatabase(Adesk:
:
kFalse);
es=pDb->readDwgFile(_T("D:
\\***.dwg"));//.dwg文件路径
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("临时数据库打开失败"));
deletepDb;
returnfalse;
}
//3.获取块表
AcDbBlockTable*pBlkTbl;
es=pDb->getSymbolTable(pBlkTbl,AcDb:
:
kForRead);
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("获取块表错误!
"));
deletepDb;
pBlkTbl->close();
returnfalse;
}
//4.获取块表记录
AcDbBlockTableRecord*pBlkTblRcd;
es=pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,AcDb:
:
kForRead);
if(Acad:
:
eOk!
=es)
{
deletepDb;
pBlkTbl->close();
pBlkTblRcd->close();
acedAlert(_T("获取块表记录错误!
"));
returnfalse;
}
pBlkTbl->close();
//5.创建块表记录迭代器,遍历模型空间块表记录
CStringhClass;
AcDbBlockTableRecordIterator*pBlkTblRcdItr;
pBlkTblRcd->newIterator(pBlkTblRcdItr);
AcGePoint3d*pPt3D=newAcGePoint3d();
if(NULL==pPt3D)
{
pBlkTblRcd->close();
deletepDb;
//deletepHatch;
deletepBlkTblRcdItr;
returnfalse;
}
//遍历块表记录中的实体
for(pBlkTblRcdItr->start();!
pBlkTblRcdItr->done();pBlkTblRcdItr->step())
{
//6.得到实体对象
AcDbHatch*pHatch=newAcDbHatch();
AcDbEntity*pEnt;
Adesk:
:
Int32loopType;
Adesk:
:
UInt16color=0;
AcGePoint2dArrayvertices;
AcGeDoubleArraybulges;
pBlkTblRcdItr->getEntity(pEnt,AcDb:
:
kForRead);
if(!
pEnt->isKindOf(AcDbHatch:
:
desc()))
{
pEnt->close();
pHatch->close();
//deletepatternName;
deletepBlkTblRcdItr;
returnfalse;
}
pHatch=AcDbHatch:
:
cast(pEnt);
if(pHatch!
=NULL)
{
intloopNums=pHatch->numLoops();
//acutPrintf(_T("%d"),loopNums);//此处可用
normal=pHatch->normal();//平面向量
bAssociative=pHatch->associative();//关联性
patternName=pHatch->patternName();//填充图案名
patternType=pHatch->patternType();//填充类型
hatchStyle=pHatch->hatchStyle();//hatchstyleofthehatchentity,填充风格color=pHatch->colorIndex();//得到为indicatestheentityusesthecolorspecifiedintheLayerTableRecorditreferences.
//acutPrintf(_T("填充对象的颜色:
%d"),color);
/////////////////////////////////////////////
AcDbHatch*pHatch2=newAcDbHatch();//新建填充对象
es=pHatch2->setNormal(normal);//设置填充平面
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("构造向量失败"));
returnfalse;
}
es=pHatch2->setElevation(0);
es=pHatch2->setAssociative(bAssociative);//设置关联性
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("构造关联性失败"));
returnfalse;
}
es=pHatch2->setPattern(patternType,patternName);//设置填充图案
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("构造图案失败"));
returnfalse;
}
es=pHatch2->setHatchStyle(hatchStyle);//设置填充类型
es=pHatch2->setColorIndex(color);//设置颜色
for(intloopIndex=0;loopIndex//为每一条边界长久存放数组
AcGeVoidPointerArrayedgePtrs;
AcGeIntArrayedgeTypes;
AcGeVoidPointerArrayVoidPtrAry;
AcGeIntArrayIntAry;
if(Acad:
:
eNotApplicable!
=pHatch->getLoopAt(loopIndex,loopType,vertices,bulges))//获取kPolyLine的边界
{
//多义线----kPolyLine-----获取其顶点;
intiIndex=0;
for(iIndex=0;iIndex{
pPt3D->x=vertices.at(iIndex).x;//Thisfunctionreturnstheelementofthearrayatpositioni
pPt3D->y=vertices.at(iIndex).y;
acutPrintf(_T("多义线的坐标是:
%d,%d"),pPt3D->x,pPt3D->y);//pPenStroke->m_Stroke.push_back(pPt3D);//保存多义线顶点}
}
//非多义线
else
{
//分别获取第-61条边界,每一条边界都是AcGe对像数组
es=pHatch->getLoopAt(loopIndex,//InputindexofselectedlooploopType,//Outputlooptype
edgePtrs,//OutputasetofAcGeCurvepointersedgeTypes);//Outputasetofenumeratededgetypesfor(intj=0;j/*
elseif(edgeTypes[j]==AcDbHatch:
:
kCirArc)//圆弧
{
//AcGeCircArc2d*CirArc=(AcGeCircArc2d*)edgePtrs;
acutPrintf(_T("\n圆弧"));
//可以根据数学圆弧构造相应的AcDb圆弧,取决于你(以下同)}
elseif(edgeTypes[j]==AcDbHatch:
:
kEllArc)//椭圆弧
{
//AcGeEllipArc2d*EllArc=(AcGeEllipArc2d*)edgePtrs;acutPrintf(_T("\n椭圆弧"));
}
elseif(edgeTypes[j]==AcDbHatch:
:
kSpline)//NURBS曲线
{
//AcGeNurbCurve2d*Spline=(AcGeNurbCurve2d*)edgePtrs;对象acutPrintf(_T("\nNURBS曲线"));
}
//获取直线的起点和终点,只考虑直线,章中只有直线
if(edgeTypes[j]==AcDbHatch:
:
kLine)//线型
{
AcGeLineSeg2d*pLnSeg=(AcGeLineSeg2d*)edgePtrs.at(j);//遍历第j个AcGe}
*/
AcGeLineSeg2d*pLineSeg=NULL;
//边类型(仅当边界不是多段线时):
//1=直线;=圆弧;=椭圆弧;=样条曲线
switch(edgeTypes.at(j))//判断边类型
{
case1:
//-----直线
{
pLineSeg=(AcGeLineSeg2d*)edgePtrs.at(j);}
}
if(NULL!
=pLineSeg)
{
AcGePoint3d*pPt3D1=newAcGePoint3d();//起点,并转换为DpPt3D1->x=pLineSeg->startPoint().x;
pPt3D1->y=pLineSeg->startPoint().y;
AcGePoint2dBeginPt(pPt3D1->x,pPt3D1->y);
deletepPt3D1;
AcGePoint3d*pPt3D2=newAcGePoint3d();//尾点,并转为DpPt3D2->x=pLineSeg->endPoint().x;
pPt3D2->y=pLineSeg->endPoint().y;
AcGePoint2dEndPt(pPt3D2->x,pPt3D2->y);
deletepPt3D2;
AcGeLineSeg2d*pObj=newAcGeLineSeg2d(BeginPt,EndPt);////acutPrintf(_T("添加第%d对象数组")),loopIndex;VoidPtrAry.append(pObj);
IntAry.append(AcDbHatch:
:
kLine);
}
}//遍历边界(AcGe对象数组)中AcGe对象结束,得到AcGe对象数组//es=pHatch2->appendLoop(loopType,VoidPtrAry,IntAry);
es=pHatch2->appendLoop(loopType,VoidPtrAry,IntAry);
if(Acad:
:
eOk!
=es)
{
acedAlert(_T("Acad:
:
eInvalidInput"));
pHatch2->close();
pHatch->close();
pBlkTblRcd->close();
deletepBlkTblRcdItr;
deletepatternName;
deletepDb;
//
}returnfalse;
}
}//将每一条边界添加进自定义实体,//将得到的每条边界加入到填充对象中}//边界循环结束,得到填充对象的整边界
es=pHatch2->evaluateHatch();//显示填充对象
AcDbObjectIdhatchId;//添加到模型空间
hatchId=PostToModelSpace(pHatch2);
if(hatchId!
=NULL)
{
acedAlert(_T("获取填充对象成功\n"));
}
pEnt->close();
pHatch->close();//关闭实体,
//pHatch2->close();
pBlkTblRcd->close();
deletepatternName;
deletepBlkTblRcdItr;
deletepDb;
returntrue;
}//pHatch对象为空
pEnt->close();
pHatch->close();
deletepatternName;
deletepBlkTblRcdItr;
deletepDb;
returnfalse;
}//遍历dwg文件临时库结束