547 lines
11 KiB
C++
547 lines
11 KiB
C++
#include "StdAfx.h"
|
|
#include "UserHelp.h"
|
|
#include <algorithm>
|
|
|
|
UserHelp::UserHelp(void)
|
|
{
|
|
}
|
|
|
|
UserHelp::~UserHelp(void)
|
|
{
|
|
}
|
|
|
|
AcDbObjectId UserHelp::Append(AcDbEntity* pEnt)
|
|
{
|
|
AcDbBlockTable *pBlockTable;
|
|
acdbHostApplicationServices()->workingDatabase()
|
|
->getSymbolTable(pBlockTable, AcDb::kForRead);
|
|
|
|
AcDbBlockTableRecord *pBlockTableRecord;
|
|
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
|
|
AcDb::kForWrite);
|
|
pBlockTable->close();
|
|
|
|
AcDbObjectId EntId;
|
|
pBlockTableRecord->appendAcDbEntity(EntId, pEnt);
|
|
|
|
pBlockTableRecord->close();
|
|
return EntId;
|
|
}
|
|
|
|
double UserHelp::GetBulge(AcDbArc*& pArc)
|
|
{
|
|
double dStartAngle = pArc->startAngle();
|
|
double dEndAngle = pArc->endAngle();
|
|
|
|
double dAlfa = dEndAngle - dStartAngle;
|
|
if (dAlfa < 0.0)//如果终点角度小于起点角度,取补角
|
|
{
|
|
dAlfa = 2 * PI + dAlfa;
|
|
}
|
|
|
|
double dBulge = 0.0;
|
|
|
|
dBulge = tan((dAlfa) / 4.0);
|
|
return dBulge;
|
|
}
|
|
|
|
|
|
bool UserHelp::FindNextPointNum(vector<NumMap>& nm, int nThisNum, double& dThisBulge, int& nNextNum)
|
|
{
|
|
bool bFind = false;
|
|
|
|
//以第一个编号给为起点查找
|
|
vector<NumMap>::iterator itr;
|
|
for (itr = nm.begin(); itr != nm.end(); itr++)
|
|
{
|
|
if ((*itr).nNum1 == nThisNum)
|
|
{
|
|
nNextNum = (*itr).nNum2;
|
|
dThisBulge = (*itr).dBulge;
|
|
bFind = true;
|
|
nm.erase(itr);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!bFind)//如果以第一个编号给为起点未找到,就以第二个编号给为起点查找
|
|
{
|
|
for (itr = nm.begin(); itr != nm.end(); itr++)
|
|
{
|
|
if ((*itr).nNum2 == nThisNum)
|
|
{
|
|
nNextNum = (*itr).nNum1;
|
|
dThisBulge = -(*itr).dBulge;//凸度取反
|
|
bFind = true;
|
|
nm.erase(itr);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bFind)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
nNextNum = -1;
|
|
dThisBulge = 0.0;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool UserHelp::NumToPoint(vector<PointNum>& vecPt2Num, int nThisNum, AcGePoint3d& ptThis)
|
|
{
|
|
bool bFind = false;
|
|
vector<PointNum>::iterator itr;
|
|
for (itr = vecPt2Num.begin(); itr != vecPt2Num.end(); itr++)
|
|
{
|
|
if ((*itr).nNum == nThisNum)
|
|
{
|
|
ptThis = (*itr).pt;
|
|
bFind = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return bFind;
|
|
}
|
|
|
|
void UserHelp::GetDrawInfo(vector<PointNum>& vecPt2Num, vector<NumMap>& vecNumMap, int& nCodeNum,
|
|
const AcGePoint3d& ptStart, const AcGePoint3d ptEnd, double dBulge)
|
|
{
|
|
bool bStartNew = true; //起点是否编号
|
|
bool bEndNew = true; //终点是否编号
|
|
|
|
NumMap nummap;//两点之间的联系信息
|
|
nummap.dBulge = dBulge;
|
|
|
|
//处理起点
|
|
vector<PointNum>::iterator itr;
|
|
for (itr = vecPt2Num.begin(); itr != vecPt2Num.end(); itr++)
|
|
{
|
|
if ((*itr).pt.distanceTo(ptStart) < 1.e-3)
|
|
{
|
|
bStartNew = false;
|
|
nummap.nNum1 = (*itr).nNum;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bStartNew)
|
|
{
|
|
PointNum pn;
|
|
pn.nNum = nCodeNum++;
|
|
pn.pt = ptStart;
|
|
vecPt2Num.push_back(pn);
|
|
|
|
nummap.nNum1 = pn.nNum;
|
|
}
|
|
|
|
//处理终点
|
|
for (itr = vecPt2Num.begin(); itr != vecPt2Num.end(); itr++)
|
|
{
|
|
if ((*itr).pt.distanceTo(ptEnd) < 1.e-3)
|
|
{
|
|
bEndNew = false;
|
|
nummap.nNum2 = (*itr).nNum;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (bEndNew)
|
|
{
|
|
PointNum pn;
|
|
pn.nNum = nCodeNum++;
|
|
pn.pt = ptEnd;
|
|
vecPt2Num.push_back(pn);
|
|
nummap.nNum2 = pn.nNum;
|
|
}
|
|
|
|
//添加联系信息
|
|
vecNumMap.push_back(nummap);
|
|
}
|
|
|
|
bool UserHelp::ChangeToPolyLine(AcDbObjectIdArray& idObjArr, AcDbObjectId& idPolyline)
|
|
{
|
|
vector<PointNum> vecPt2Num;//所有点编号
|
|
vector<NumMap> vecNumMap;//所有连接信息
|
|
int nCodeNum = 0;
|
|
|
|
int length = idObjArr.length();
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
// 获得指向当前元素的指针
|
|
AcDbEntity *pEnt;
|
|
Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, idObjArr.at(i),
|
|
AcDb::kForRead);
|
|
|
|
// 选择到作为边界的多段线了,直接跳过该次循环
|
|
if (es != Acad::eOk)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if(pEnt->isKindOf(AcDbArc::desc()))//圆弧
|
|
{
|
|
AcDbArc* pArc = AcDbArc::cast(pEnt);
|
|
if (pArc == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
AcGePoint3d ptStart, ptEnd;
|
|
pArc->getStartPoint(ptStart);
|
|
pArc->getEndPoint(ptEnd);
|
|
|
|
double dBulge = 0.0;
|
|
dBulge = UserHelp::GetBulge(pArc);
|
|
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptStart, ptEnd, dBulge);
|
|
pArc->close();
|
|
}
|
|
else if (pEnt->isKindOf(AcDbLine::desc()))//直线
|
|
{
|
|
AcDbLine* pLine = AcDbLine::cast(pEnt);
|
|
if (pLine == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
AcGePoint3d ptStart, ptEnd;
|
|
pLine->getStartPoint(ptStart);
|
|
pLine->getEndPoint(ptEnd);
|
|
|
|
double dBulge = 0.0;
|
|
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptStart, ptEnd, dBulge);
|
|
|
|
pLine->close();
|
|
}
|
|
|
|
else if (pEnt->isKindOf(AcDbPolyline::desc()))
|
|
{
|
|
AcDbPolyline* pPolyLine = AcDbPolyline::cast(pEnt);
|
|
if (pPolyLine == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int nVerCount = 0;
|
|
nVerCount = pPolyLine->numVerts();
|
|
if (nVerCount <= 1)
|
|
{
|
|
continue;
|
|
}
|
|
AcGePoint3d ptFirst;
|
|
double dBugle = -1000.0;
|
|
pPolyLine->getPointAt(0, ptFirst);
|
|
pPolyLine->getBulgeAt(0,dBugle);
|
|
|
|
for (int i = 1; i < nVerCount; i++)
|
|
{
|
|
AcGePoint3d ptVer;
|
|
pPolyLine->getPointAt(i, ptVer);
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptFirst, ptVer, dBugle);
|
|
|
|
ptFirst = ptVer;
|
|
pPolyLine->getBulgeAt(i, dBugle);
|
|
}
|
|
pPolyLine->close();
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
|
|
AcGePoint3d pt1, pt2;
|
|
double dBulge = 0.0;
|
|
|
|
vector<NumMap>::iterator itr1;// vecNumMap;
|
|
vector<NumMap>::iterator itr2;// vecNumMap;
|
|
vector< vector<DrawPoint> > vecLines;
|
|
|
|
if (vecNumMap.size() > 0)
|
|
{
|
|
itr1 = vecNumMap.begin();
|
|
}
|
|
|
|
while(itr1 != vecNumMap.end())
|
|
{
|
|
//从某点出发向一个方向搜索
|
|
vector<DrawPoint> vecOneLine;
|
|
|
|
int nBegin = (*itr1).nNum1;
|
|
int nThisNum = nBegin;
|
|
int nLastNum = nThisNum;
|
|
|
|
DrawPoint drawpoint;
|
|
|
|
while(vecNumMap.size() > 0)
|
|
{
|
|
bool bSuc = false;
|
|
double dThisBulge = 0.0;
|
|
int nNextNum = 0;
|
|
|
|
bSuc = UserHelp::FindNextPointNum(vecNumMap, nThisNum, dThisBulge, nNextNum);
|
|
if (bSuc)
|
|
{
|
|
drawpoint.nNum = nThisNum;
|
|
drawpoint.dBulge =dThisBulge;
|
|
vecOneLine.push_back(drawpoint);
|
|
nThisNum = nNextNum;
|
|
nLastNum = nThisNum;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//处理最近一个点
|
|
drawpoint.nNum = nLastNum;
|
|
drawpoint.dBulge = 0.0;
|
|
vecOneLine.push_back(drawpoint);
|
|
|
|
|
|
//从某点出发向另一个方向搜索
|
|
vector<DrawPoint> vecOtherLine;
|
|
nThisNum = nBegin;
|
|
nLastNum = nThisNum;
|
|
while(vecNumMap.size() > 0)
|
|
{
|
|
bool bSuc = false;
|
|
double dThisBulge = 0.0;
|
|
int nNextNum = 0;
|
|
|
|
bSuc = UserHelp::FindNextPointNum(vecNumMap, nThisNum, dThisBulge, nNextNum);
|
|
if (bSuc)
|
|
{
|
|
drawpoint.nNum = nNextNum;
|
|
drawpoint.dBulge =dThisBulge;
|
|
vecOtherLine.push_back(drawpoint);
|
|
nThisNum = nNextNum;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//两个方向拼接
|
|
reverse(vecOtherLine.begin(), vecOtherLine.end());
|
|
vector<DrawPoint>::iterator itrTmp;
|
|
for (itrTmp = vecOtherLine.begin(); itrTmp != vecOtherLine.end(); itrTmp++)
|
|
{
|
|
(*itrTmp).dBulge *= -1.0;
|
|
}
|
|
|
|
vecOtherLine.insert(vecOtherLine.end(), vecOneLine.begin(), vecOneLine.end());
|
|
|
|
vecLines.push_back(vecOtherLine);
|
|
itr1 = vecNumMap.begin();
|
|
}
|
|
|
|
//绘制多段线
|
|
vector< vector<DrawPoint> >::iterator itr_1;
|
|
vector<DrawPoint>::iterator itr_2;
|
|
for (itr_1 = vecLines.begin(); itr_1 != vecLines.end(); itr_1++)
|
|
{
|
|
AcDbPolyline* pPolyLine = new AcDbPolyline;
|
|
int i = 0;
|
|
vector<DrawPoint>& vecPoints = (*itr_1);
|
|
for (itr_2 = vecPoints.begin(); itr_2 != vecPoints.end(); itr_2++)
|
|
{
|
|
int nNum = (*itr_2).nNum;
|
|
AcGePoint3d ptVer;
|
|
if (UserHelp::NumToPoint(vecPt2Num, nNum, ptVer))
|
|
{
|
|
pPolyLine->addVertexAt(i++, ptVer.convert2d(AcGePlane::kXYPlane),(*itr_2).dBulge);
|
|
}
|
|
}
|
|
|
|
idPolyline = UserHelp::Append(pPolyLine);
|
|
pPolyLine->close();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
AcDbPolyline* UserHelp::ChangeToPolyLine(AcDbVoidPtrArray& arCurPtrs)
|
|
{
|
|
vector<PointNum> vecPt2Num;//所有点编号
|
|
vector<NumMap> vecNumMap;//所有连接信息
|
|
int nCodeNum = 0;
|
|
|
|
double dBulge = 0.0;
|
|
AcGePoint3d ptStart, ptEnd,ptFirst,ptVer;
|
|
AcDbCurve* pCurve = NULL;
|
|
|
|
for (int i = 0;i < arCurPtrs.length();i++)
|
|
{
|
|
pCurve = (AcDbCurve*)arCurPtrs.at(i);
|
|
|
|
AcDbArc* pArc = AcDbArc::cast(pCurve);
|
|
if (pArc != NULL)
|
|
{
|
|
pArc->getStartPoint(ptStart);
|
|
pArc->getEndPoint(ptEnd);
|
|
|
|
dBulge = 0.0;
|
|
dBulge = UserHelp::GetBulge(pArc);
|
|
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptStart, ptEnd, dBulge);
|
|
}
|
|
|
|
AcDbLine* pLine = AcDbLine::cast(pCurve);
|
|
if (pLine != NULL)
|
|
{
|
|
pLine->getStartPoint(ptStart);
|
|
pLine->getEndPoint(ptEnd);
|
|
|
|
dBulge = 0.0;
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptStart, ptEnd, dBulge);
|
|
}
|
|
|
|
AcDbPolyline* pPolyLine = AcDbPolyline::cast(pCurve);
|
|
if (pPolyLine != NULL)
|
|
{
|
|
int nVerCount = 0;
|
|
nVerCount = pPolyLine->numVerts();
|
|
if (nVerCount <= 1)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
dBulge = -1000.0;
|
|
pPolyLine->getPointAt(0, ptFirst);
|
|
pPolyLine->getBulgeAt(0,dBulge);
|
|
|
|
for (int j = 1; j < nVerCount; j++)
|
|
{
|
|
pPolyLine->getPointAt(j, ptVer);
|
|
UserHelp::GetDrawInfo(vecPt2Num, vecNumMap, nCodeNum, ptFirst, ptVer, dBulge);
|
|
|
|
ptFirst = ptVer;
|
|
pPolyLine->getBulgeAt(j, dBulge);
|
|
}
|
|
}
|
|
}
|
|
|
|
AcGePoint3d pt1, pt2;
|
|
dBulge = 0.0;
|
|
|
|
vector<NumMap>::iterator itr1;// vecNumMap;
|
|
vector<NumMap>::iterator itr2;// vecNumMap;
|
|
vector< vector<DrawPoint> > vecLines;
|
|
|
|
if (vecNumMap.size() > 0)
|
|
{
|
|
itr1 = vecNumMap.begin();
|
|
}
|
|
|
|
while(itr1 != vecNumMap.end())
|
|
{
|
|
//从某点出发向一个方向搜索
|
|
vector<DrawPoint> vecOneLine;
|
|
|
|
int nBegin = (*itr1).nNum1;
|
|
int nThisNum = nBegin;
|
|
int nLastNum = nThisNum;
|
|
|
|
DrawPoint drawpoint;
|
|
|
|
while(vecNumMap.size() > 0)
|
|
{
|
|
bool bSuc = false;
|
|
double dThisBulge = 0.0;
|
|
int nNextNum = 0;
|
|
|
|
bSuc = UserHelp::FindNextPointNum(vecNumMap, nThisNum, dThisBulge, nNextNum);
|
|
if (bSuc)
|
|
{
|
|
drawpoint.nNum = nThisNum;
|
|
drawpoint.dBulge =dThisBulge;
|
|
vecOneLine.push_back(drawpoint);
|
|
nThisNum = nNextNum;
|
|
nLastNum = nThisNum;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//处理最近一个点
|
|
drawpoint.nNum = nLastNum;
|
|
drawpoint.dBulge = 0.0;
|
|
vecOneLine.push_back(drawpoint);
|
|
|
|
//从某点出发向另一个方向搜索
|
|
vector<DrawPoint> vecOtherLine;
|
|
nThisNum = nBegin;
|
|
nLastNum = nThisNum;
|
|
while(vecNumMap.size() > 0)
|
|
{
|
|
bool bSuc = false;
|
|
double dThisBulge = 0.0;
|
|
int nNextNum = 0;
|
|
|
|
bSuc = UserHelp::FindNextPointNum(vecNumMap, nThisNum, dThisBulge, nNextNum);
|
|
if (bSuc)
|
|
{
|
|
drawpoint.nNum = nNextNum;
|
|
drawpoint.dBulge =dThisBulge;
|
|
vecOtherLine.push_back(drawpoint);
|
|
nThisNum = nNextNum;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
//两个方向拼接
|
|
reverse(vecOtherLine.begin(), vecOtherLine.end());
|
|
vector<DrawPoint>::iterator itrTmp;
|
|
for (itrTmp = vecOtherLine.begin(); itrTmp != vecOtherLine.end(); itrTmp++)
|
|
{
|
|
(*itrTmp).dBulge *= -1.0;
|
|
}
|
|
|
|
vecOtherLine.insert(vecOtherLine.end(), vecOneLine.begin(), vecOneLine.end());
|
|
|
|
vecLines.push_back(vecOtherLine);
|
|
itr1 = vecNumMap.begin();
|
|
}
|
|
|
|
if (vecPt2Num.empty())
|
|
return NULL;
|
|
|
|
//考虑标高问题
|
|
AcGePlane plan;
|
|
plan.set(AcGePoint3d(0.0,0.0,vecPt2Num.at(0).pt.z),AcGeVector3d::kXAxis,AcGeVector3d::kYAxis);
|
|
|
|
//绘制多段线
|
|
vector< vector<DrawPoint> >::iterator itr_1;
|
|
vector<DrawPoint>::iterator itr_2;
|
|
for (itr_1 = vecLines.begin(); itr_1 != vecLines.end(); itr_1++)
|
|
{
|
|
AcDbPolyline* pPolyLine = new AcDbPolyline;
|
|
int i = 0;
|
|
vector<DrawPoint>& vecPoints = (*itr_1);
|
|
for (itr_2 = vecPoints.begin(); itr_2 != vecPoints.end(); itr_2++)
|
|
{
|
|
int nNum = (*itr_2).nNum;
|
|
AcGePoint3d ptVer;
|
|
if (UserHelp::NumToPoint(vecPt2Num, nNum, ptVer))
|
|
{
|
|
pPolyLine->addVertexAt(i++, ptVer.convert2d(AcGePlane::kXYPlane),(*itr_2).dBulge);
|
|
}
|
|
}
|
|
|
|
//只返回一条PolyLine
|
|
return pPolyLine;
|
|
}
|
|
return NULL;
|
|
} |