分析这段代码if (iterr->first.Find(L"桥架") > -1)
{
dmtl.extractCurveInfos(iterr->second, vCurves, nCountOfCurves, false);
vector<DwgElecCableTray> m_CableTray;
vector<DwgElecCableTrayElbow> mCableTrayElbow;
vector<DwgElecCableTray3T> mCableTrayElbow3T;
vector<DwgElecCableTray4T> mCableTrayElbow4T;
//用于寻找连接关系的所有线段的集合
vector<geoSegLine> vAllSegLines;
//找到当前集合中所有与设备相连接的线段
vector<qCadDbObjectPtr> vObjs;
for (auto id : iterr->second)
{
qCadDbObjectPtr obj = id.openObject();
vObjs.push_back(obj);
}
//排除不属于判断标准的管线
map<int, std::vector<std::pair<qCadDbObjectId, geoCurve*>>> mTraysValid, mTraysInValid;
int nCountValid = 0, nCountInValid = 0;
for (auto x : vCurves)
{
std::vector<std::pair<qCadDbObjectId, geoCurve*>> vTemp;
vTemp = searchAllConnectedLineWW(x.second, x.first, vCurves);
if (vTemp.size() > 2)
{
mTraysValid[nCountValid++] = vTemp;
}
else
{
mTraysInValid[nCountInValid] = vTemp;
}
}
vector<pair<qCadDbObjectId, geoSegLine>> vCableTrays;
map<qCadDbObjectId, geoSegLine> mCableTrays;
for (auto iterLine = mTraysValid.begin(); iterLine != mTraysValid.end(); iterLine++)
{
vector<pair<qCadDbObjectId, geoCurve *>> vCT;
vCT = iterLine->second;
for (auto temp : vCT)
{
qCadDbObjectPtr pObj = temp.first.openObject();
qCadDbObjectId pId = temp.first;
if (!pObj) continue;
qCadDbEntityPtr pEnt = qCadDbEntity::cast(pObj);
if (!pEnt) continue;
if (pEnt->visibility() == qCadDb::qInvisible) continue;
//折线数据提取
if (pObj->isKindOf(qCadDbPolyline::desc()))
{
geoSegLine tempLine;
DwgElecConduit conduit;
qCadDbPolylinePtr pBlkPloy = qCadDbPolyline::cast(pObj);
geoPoint3d firstP, lastP;
int size = pBlkPloy->numVerts();
pBlkPloy->getPointAt(0, firstP);
pBlkPloy->getPointAt(size - 1, lastP);
tempLine.Set(firstP, lastP);
tempLine.setState(0);
vCableTrays.push_back(make_pair(pId, tempLine));
mCableTrays[pId] = tempLine;
}
//直线数据提取
else if (pObj->isKindOf(qCadDbLine::desc()))
{
geoSegLine tempLine;
DwgElecConduit conduitForLine;
qCadDbLinePtr pBlkLine = qCadDbLine::cast(pObj);
geoPoint3d firstP, lastP;
pBlkLine->getStartPoint(firstP);
pBlkLine->getEndPoint(lastP);
tempLine.Set(firstP, lastP);
tempLine.setState(0);
vCableTrays.push_back(make_pair(pId, tempLine));
mCableTrays[pId] = tempLine;
}
//弧线数据提取
else if (pObj->isKindOf(qCadDbArc::desc()))
{
geoSegLine tempLine;
DwgElecConduit conduitArc;
qCadDbArcPtr pBlkArc = qCadDbArc::cast(pObj);
geoPoint3d firstP, lastP;
pBlkArc->getStartPoint(firstP);
pBlkArc->getEndPoint(lastP);
tempLine.Set(firstP, lastP);
tempLine.setState(0);
vCableTrays.push_back(make_pair(pId, tempLine));
mCableTrays[pId] = tempLine;
}
}
}
//分析所有的双线桥架对应关系
for (auto lineI : vCableTrays)
{
//判断两条线是否平行与是否为最近距离线段
vector<pair<double, qCadDbObjectId>> vElecData;
for (auto lineII : vCableTrays)
{
if (lineI.second.IsParallelTo(lineII.second)
&& lineI.second.lenth() >= lineII.second.lenth() - 300
&& lineI.second.lenth() <= lineII.second.lenth() + 300)
{
geoPoint3d startP, endP, startPerp, endPerp;
double startDistt = 0, endDistt = 0;
startP = lineI.second.startPoint();
endP = lineI.second.endPoint();
lineII.second.GetPerpPt(startP, startPerp);
lineII.second.GetPerpPt(endP, endPerp);
startDistt = startP.DistanceTo(startPerp);
endDistt = endP.DistanceTo(endPerp);
//确认垂足数量 0 为没有交集
if (startDistt > endDistt && endDistt != 0)
{
for (auto num : m_CableTraySize)
{
if ((abs(num - endDistt) < 1) && (abs(lineI.second.lenth() - lineII.second.lenth()) < 10))
{
vElecData.push_back(make_pair(endDistt, lineII.first));
}
}
}
else if (startDistt <= endDistt && startDistt != 0)
{
for (auto num : m_CableTraySize)
{
if ((abs(num - startDistt) < 1) && (abs(lineI.second.lenth() - lineII.second.lenth()) < 10))
{
vElecData.push_back(make_pair(startDistt, lineII.first));
}
}
}
}
}
if (vElecData.size() == 0) continue;
sort(vElecData.begin(), vElecData.end(), FindSmallestNum);
DwgElecCableTray tray;
tray.m_CableTray1ID = lineI.first;
tray.m_CableTrayLine1 = lineI.second;
tray.m_CableTray2ID = vElecData[0].second;
tray.m_CableTrayLine2 = mCableTrays[vElecData[0].second];
tray.m_CableTrayRadius = vElecData[0].first / 2;
tray.m_systemName = iterr->first;
m_CableTray.push_back(tray);
}
//删除重复的数据
vector<DwgElecCableTray> vStoredData;
for (int i = 0; i < m_CableTray.size(); i++)
{
bool passOrNot = true;
if (!vStoredData.empty())
{
for (int j = 0; j < vStoredData.size(); j++)
{
CString id1LineOne, id1LineTwo, id2LineOne, id2LineTwo;
id1LineOne = GetDuctLineId(m_CableTray[i].m_CableTray1ID);
id1LineTwo = GetDuctLineId(m_CableTray[i].m_CableTray2ID);
id2LineOne = GetDuctLineId(vStoredData[j].m_CableTray1ID);
id2LineTwo = GetDuctLineId(vStoredData[j].m_CableTray2ID);
if ((id1LineOne == id2LineOne &&
id1LineTwo == id2LineTwo) ||
(id1LineOne == id2LineTwo &&
id1LineTwo == id2LineOne) &&
m_CableTray[i].m_CableTrayCenterLine.lenth() == vStoredData[j].m_CableTrayCenterLine.lenth())
{
passOrNot = false;
break;
}
}
}
if (passOrNot == true)
{
vStoredData.push_back(m_CableTray[i]);
}
}
if (!vStoredData.empty())
{
m_CableTray.clear();
m_CableTray = vStoredData;
}
vStoredData.clear();
//找到符合模数和长度的桥架
for (auto iterC = m_CableTray.begin(); iterC != m_CableTray.end(); iterC++)
{
geoPoint3d perPt1, perPt2, perPt3, perPt4;
vector<pair<geoPoint3d, geoPoint3d>> perPoints;
vector<geoPoint3d> pointsOnLine;
//找到两条线的每一条垂足
if (iterC->m_CableTrayLine2.GetPerpPt(iterC->m_CableTrayLine1.startPoint(), perPt1) == 0)
{
perPoints.push_back(make_pair(perPt1, iterC->m_CableTrayLine1.startPoint()));
}
if (iterC->m_CableTrayLine2.GetPerpPt(iterC->m_CableTrayLine1.endPoint(), perPt2) == 0)
{
perPoints.push_back(make_pair(perPt2, iterC->m_CableTrayLine1.endPoint()));
}
if (iterC->m_CableTrayLine1.GetPerpPt(iterC->m_CableTrayLine2.startPoint(), perPt3) == 0)
{
perPoints.push_back(make_pair(perPt3, iterC->m_CableTrayLine2.startPoint()));
}
if (iterC->m_CableTrayLine1.GetPerpPt(iterC->m_CableTrayLine2.endPoint(), perPt4) == 0)
{
perPoints.push_back(make_pair(perPt4, iterC->m_CableTrayLine2.endPoint()));
}
if (perPoints.size() == 4)
{
geoPoint3d startPt, endPt;
geoSegLine centerLine;
double distanceOfTwoLines;
if (iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint()) > iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint()))
{
startPt.x = (iterC->m_CableTrayLine1.startPoint().x + iterC->m_CableTrayLine2.endPoint().x) / 2;
startPt.y = (iterC->m_CableTrayLine1.startPoint().y + iterC->m_CableTrayLine2.endPoint().y) / 2;
endPt.x = (iterC->m_CableTrayLine1.endPoint().x + iterC->m_CableTrayLine2.startPoint().x) / 2;
endPt.y = (iterC->m_CableTrayLine1.endPoint().y + iterC->m_CableTrayLine2.startPoint().y) / 2;
distanceOfTwoLines = iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint());
}
else if (iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint()) < iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.endPoint()))
{
startPt.x = (iterC->m_CableTrayLine1.startPoint().x + iterC->m_CableTrayLine2.startPoint().x) / 2;
startPt.y = (iterC->m_CableTrayLine1.startPoint().y + iterC->m_CableTrayLine2.startPoint().y) / 2;
endPt.x = (iterC->m_CableTrayLine1.endPoint().x + iterC->m_CableTrayLine2.endPoint().x) / 2;
endPt.y = (iterC->m_CableTrayLine1.endPoint().y + iterC->m_CableTrayLine2.endPoint().y) / 2;
distanceOfTwoLines = iterC->m_CableTrayLine1.startPoint().DistanceTo(iterC->m_CableTrayLine2.startPoint());
}
centerLine.Set(startPt, endPt);
//if (distanceOfTwoLines > iterC->m_CableTrayLine1.lenth())
//{
// continue;
//}
iterC->m_CableTrayCenterLine = centerLine;
iterC->m_CableTrayId = GetDuctLineId(iterC->m_CableTray1ID) + L"#" + GetDuctLineId(iterC->m_CableTray2ID);
vStoredData.push_back(*iterC);
}
}
// m_CableTray.clear();
// m_CableTray = vStoredData;
// vStoredData.clear();
// //查找所有复合模数但不是桥架的线配对
// for (auto nonCableTray : m_CableTray)
// {
// if (nonCableTray.m_CableTrayLine1.startPoint().DistanceTo(nonCableTray.m_CableTrayLine2.startPoint()) <= nonCableTray.m_CableTrueRange.lenth())
// {
// vStoredData.push_back(nonCableTray);
// }
// }
m_CableTray.clear();
m_CableTray = vStoredData;
vStoredData.clear();
//在所有选中线中寻找符合弯头的形状 并将所有弯头编号
map<int, DwgElecCableTrayElbow> vElbows;
int nCount = 0;
for (auto line : vCableTrays)
{
DwgElecCableTrayElbow elbow;
vector<pair<geoPoint3d, pair<qCadDbObjectId, geoSegLine>>> vStartTray;
vector<pair<geoPoint3d, pair<qCadDbObjectId, geoSegLine>>> vEndTray;
for (auto lineConect : vCableTrays)
{
if (lineConect.first != line.first)
{
if (line.second.startPoint().DistanceTo(lineConect.second.startPoint()) < 10)
{
geoVector2d v1(lineConect.second.endPoint().x - lineConect.second.startPoint().x, lineConect.second.endPoint().y - lineConect.second.startPoint().y);
geoVector2d v2(line.second.endPoint().x - line.second.startPoint().x, line.second.endPoint().y - line.second.startPoint().y);
if (LineIsPerpAt(v1, v2))
{
vStartTray.push_back(make_pair(lineConect.second.endPoint(), lineConect));
}
}
if (line.second.startPoint().DistanceTo(lineConect.second.endPoint()) < 10)
{
geoVector2d v1(lineConect.second.startPoint().x - lineConect.second.endPoint().x, lineConect.second.startPoint().y - lineConect.second.endPoint().y);
geoVector2d v2(line.second.endPoint().x - line.second.startPoint().x, line.second.endPoint().y - line.second.startPoint().y);
if (LineIsPerpAt(v1, v2))
{
vStartTray.push_back(make_pair(lineConect.second.startPoint(), lineConect));
}
}
if (line.second.endPoint().DistanceTo(lineConect.second.startPoint()) < 10)
{
geoVector2d v1(lineConect.second.endPoint().x - lineConect.second.startPoint().x, lineConect.second.endPoint().y - lineConect.second.startPoint().y);
geoVector2d v2(line.second.startPoint().x - line.second.endPoint().x, line.second.startPoint().y - line.second.endPoint().y);
if (LineIsPerpAt(v1, v2))
{
vEndTray.push_back(make_pair(lineConect.second.endPoint(), lineConect));
}
}
if (line.second.endPoint().DistanceTo(lineConect.second.endPoint()) < 10)
{
geoVector2d v1(lineConect.second.startPoint().x - lineConect.second.endPoint().x, lineConect.second.startPoint().y - lineConect.second.endPoint().y);
geoVector2d v2(line.second.startPoint().x - line.second.endPoint().x, line.second.startPoint().y - line.second.endPoint().y);
if (LineIsPerpAt(v1, v2))
{
vEndTray.push_back(make_pair(lineConect.second.startPoint(), lineConect));
}
}
}
}
if (vStartTray.size() >= 1 && vEndTray.size() >= 1)
{
elbow.connectLine1 = vStartTray[0].second.first;
elbow.connectLine2 = vEndTray[0].second.first;
elbow.startLine = vStartTray[0].second.second;
elbow.startPoint = vStartTray[0].first;
elbow.endLine = vEndTray[0].second.second;
elbow.endPoint = vEndTray[0].first;
vElbows[nCount++] = elbow;
//测试弯头识别是否成功
//qCadDbLinePtr pLine = qCadDbLine::createObject();
//pLine->setStartPoint(elbow.startPoint);
//pLine->setEndPoint(elbow.endPoint);
//qCadCmColor color;
//color.setRGB(225, 107, 162); //水粉色
//pLine->setColorIndex(6); //洋红色
//qCadDbObjectId objId;
//objId = qCadInterfaceMgr::CreateNewEntity(pLine);
}
}
//排除桥架与弯头的重叠处(一小段弯头被识别为桥架)
vector<DwgElecCableTray> vNewCableTray;
for (auto duplicateTray : m_CableTray)
{
bool bDuplicateTray = false;
for (auto dElbow : vElbows)
{
if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10 &&
duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10 &&
duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10 &&
duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine1.startPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10 &&
duplicateTray.m_CableTrayLine1.endPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10 &&
duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.startLine.endPoint()) < 10 &&
duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.startLine.startPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10 &&
duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10)
{
bDuplicateTray = true;
}
else if (duplicateTray.m_CableTrayLine2.startPoint().DistanceTo(dElbow.second.endLine.endPoint()) < 10 &&
duplicateTray.m_CableTrayLine2.endPoint().DistanceTo(dElbow.second.endLine.startPoint()) < 10)
{
bDuplicateTray = true;
}
}
if (!bDuplicateTray)
{
vNewCableTray.push_back(duplicateTray);
}
}
m_CableTray.clear();
m_CableTray = vNewCableTray;
//生成写出id
for (auto ids : m_CableTray)
{
ids.m_CableTrayId = GetDuctLineId(ids.m_CableTray1ID) + L"#" + GetDuctLineId(ids.m_CableTray2ID);
DwgElecCableTray tempId;
tempId.m_CableTrayCenterLine = ids.m_CableTrayCenterLine;
tempId.m_CableTrayId = ids.m_CableTrayId;
tempId.m_CableTrayRadius = ids.m_CableTrayRadius;
tempId.m_systemName = ids.m_systemName;
mElecDataSet[iter->first].m_ElecCableTrays.push_back(tempId);
}
//寻找变径
//寻找两根符合要求的线
vector<std::pair<geoSegLine, geoSegLine>> vFitLines;
for (auto temp : vCableTrays)
{
for (auto line : vCableTrays)
{
//不是同一条线且不平行
if (temp.first != line.first &&
!temp.second.IsParallelTo(line.second) &&
temp.second.AngleTo(line.second) > 0 &&
temp.second.AngleTo(line.second) < qCad_PI / 2.0 &&
!temp.second.IsInersectWith2d(line.second, 10))
{
vFitLines.push_back(make_pair(temp.second, line.second));
}
}
}
//寻找与这两条线相连接的桥架
vector<DwgElecCableTrayReducing> vCTReducings;
//for (auto CT1 : m_CableTray)
//{
// for (auto CT2 : m_CableTray)
// {
// if (CT1.second.startPoint().DistanceTo(matchCT.m_CableTrayLine1.startPoint()) < 25)
// {
// }
// else if (CT1.second.startPoint().DistanceTo(matchCT.m_CableTrayLine1.endPoint()) < 25)
// {
// }
// if (CT1.second.endPoint().DistanceTo(matchCT.m_CableTrayLine1.startPoint()) < 25)
// {
// }
// else if (CT1.second.endPoint().DistanceTo(matchCT.m_CableTrayLine1.endPoint()) < 25)
// {
// }
// }
//}
//通过弯头找到相连接的桥架
//判断弯头所在构件的完整类型 1 弯头 2 三通 3 四通
for (auto iterE = vElbows.begin(); iterE != vElbows.end(); iterE++)
{
if (iterE->second.ischecked)
continue;
vector<DwgElecCableTrayElbow> cableTrayCount;
cableTrayCount.push_back(iterE->second);
iterE->second.ischecked = true;
DwgElecCableTray cableTrayConnect1, cableTrayConnect2;
vector<pair<double, DwgElecCableTray>> vClosetCableTrayS, vClosetCableTrayE;
vector<DwgElecCableTray> vClosetCableTS, vClosetCableTE;
for (auto centerLine : m_CableTray)
{
//与弯头的起点线平行
if (centerLine.m_CableTrayCenterLine.IsParallelTo(iterE->second.startLine))
{
geoPoint3d intersectP;
if (centerLine.m_CableTrayLine1.IntersectWith(iterE->second.startLine, intersectP, 20))
{
vClosetCableTS.push_back(centerLine);
}
else if (centerLine.m_CableTrayLine2.IntersectWith(iterE->second.startLine, intersectP, 20))
{
vClosetCableTS.push_back(centerLine);
}
double distS = centerLine.m_CableTrayCenterLine.startPoint().DistanceTo(iterE->second.startPoint);
double distE = centerLine.m_CableTrayCenterLine.endPoint().DistanceTo(iterE->second.startPoint);
if (distS > distE && distE <= 400)
{
vClosetCableTrayS.push_back(make_pair(distE, centerLine));
}
else if (distS < distE && distS <= 400)
{
vClosetCableTrayS.push_back(make_pair(distS, centerLine));
}
}
//与弯头终点线平行
if (centerLine.m_CableTrayCenterLine.IsParallelWith(iterE->second.endLine))
{
geoPoint3d intersectP;
if (centerLine.m_CableTrayLine1.IntersectWith(iterE->second.endLine, intersectP, 20))
{
vClosetCableTE.push_back(centerLine);
}
else if (centerLine.m_CableTrayLine2.IntersectWith(iterE->second.endLine, intersectP, 20))
{
vClosetCableTE.push_back(centerLine);
}
double distS = centerLine.m_CableTrayCenterLine.startPoint().DistanceTo(iterE->second.endPoint);
double distE = centerLine.m_CableTrayCenterLine.endPoint().DistanceTo(iterE->second.endPoint);
if (distS > distE && distE <= 400)
{
vClosetCableTrayE.push_back(make_pair(distE, centerLine));
}
else if (distS < distE && distS <= 400)
{
vClosetCableTrayE.push_back(make_pair(distS, centerLine));
}
}
}
if (vClosetCableTrayS.size() > 0)
{
sort(vClosetCableTrayS.begin(), vClosetCableTrayS.end(), FindClosetNum);
cableTrayConnect1 = vClosetCableTrayS[0].second;
}
if (vClosetCableTrayE.size() > 0)
{
sort(vClosetCableTrayE.begin(), vClosetCableTrayE.end(), FindClosetNum);
cableTrayConnect2 = vClosetCableTrayE[0].second;
}
//找到桥架另一端是否还有其他弯头
vector<pair<double, DwgElecCableTrayElbow>> vClosetCableTrayElow1, vClosetCableTrayElow2;
for (auto iterF = vElbows.begin(); iterF != vElbows.end(); iterF++)
{
if (iterF->first != iterE->first && iterF->second.ischecked == false)
{
if (iterF->second.startLine.IsParallelWith(cableTrayConnect1.m_CableTrayCenterLine))
{
double dist = iterF->second.startPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.startPoint());
double distOther = iterF->second.startPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.endPoint());
double distElbows1 = iterF->second.startPoint.DistanceTo(iterE->second.startPoint);
double distElbows2 = iterF->second.startPoint.DistanceTo(iterE->second.endPoint);
if (dist < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(dist, iterF->second));
}
else if (distOther < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second));
}
}
if (iterF->second.endLine.IsParallelWith(cableTrayConnect1.m_CableTrayCenterLine))
{
double dist = iterF->second.endPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.startPoint());
double distOther = iterF->second.endPoint.DistanceTo(cableTrayConnect1.m_CableTrayCenterLine.endPoint());
double distElbows1 = iterF->second.endPoint.DistanceTo(iterE->second.startPoint);
double distElbows2 = iterF->second.endPoint.DistanceTo(iterE->second.endPoint);
if (dist < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(dist, iterF->second));
}
else if (distOther < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second));
}
}
if (iterF->second.startLine.IsParallelWith(cableTrayConnect2.m_CableTrayCenterLine))
{
double dist = iterF->second.startPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.startPoint());
double distOther = iterF->second.startPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.endPoint());
double distElbows1 = iterF->second.startPoint.DistanceTo(iterE->second.startPoint);
double distElbows2 = iterF->second.startPoint.DistanceTo(iterE->second.endPoint);
if (dist < 400 &&
(distElbows1 <= cableTrayConnect2.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect2.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow2.push_back(make_pair(dist, iterF->second));
}
else if (distOther < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second));
}
}
if (iterF->second.endLine.IsParallelWith(cableTrayConnect2.m_CableTrayCenterLine))
{
double dist = iterF->second.endPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.startPoint());
double distOther = iterF->second.endPoint.DistanceTo(cableTrayConnect2.m_CableTrayCenterLine.endPoint());
double distElbows1 = iterF->second.endPoint.DistanceTo(iterE->second.startPoint);
double distElbows2 = iterF->second.endPoint.DistanceTo(iterE->second.endPoint);
if (dist < 400 &&
(distElbows1 <= cableTrayConnect2.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect2.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow2.push_back(make_pair(dist, iterF->second));
}
else if (distOther < 400 &&
(distElbows1 <= cableTrayConnect1.m_CableTrayRadius * 2 ||
distElbows2 <= cableTrayConnect1.m_CableTrayRadius * 2))
{
iterF->second.ischecked = true;
vClosetCableTrayElow1.push_back(make_pair(distOther, iterF->second));
}
}
}
}
if (vClosetCableTrayElow1.size() > 0)
{
sort(vClosetCableTrayElow1.begin(), vClosetCableTrayElow1.end(), FindClostNum);
cableTrayCount.push_back(vClosetCableTrayElow1[0].second);
}
if (vClosetCableTrayElow2.size() > 0)
{
sort(vClosetCableTrayElow2.begin(), vClosetCableTrayElow2.end(), FindClostNum);
cableTrayCount.push_back(vClosetCableTrayElow2[0].second);
}
//MepBaseAPI mepBaseAPI;
//一边都没有 弯头
if (cableTrayCount.size() == 1)
{
CString str = dmtl.NewGuid();
DwgElecCableTrayElbow elbow;
elbow.m_ElbowObjID = str;
elbow.m_ConnectLineObjID1 = cableTrayConnect1.m_CableTrayId;
elbow.m_ConnectLineObjID2 = cableTrayConnect2.m_CableTrayId;
mElecDataSet[iter->first].m_ElecCableTrayElows.push_back(elbow);
}
//有一边有弯头 三通
else if (cableTrayCount.size() == 2)
{
CString str = dmtl.NewGuid();
DwgElecCableTray3T CableTray3T;
CableTray3T.m_CableTray3TID = str;
CableTray3T.m_CableTray1 = cableTrayConnect1.m_CableTrayId;
CableTray3T.m_CableTray2 = cableTrayConnect2.m_CableTrayId;
for (auto elbow : cableTrayCount)
{
CableTray3T.m_elbowsConnected.push_back(elbow);
}
mElecDataSet[iter->first].m_ElecCableTray3Ts.push_back(CableTray3T);
}
//两边都有弯头 四通
else if (cableTrayCount.size() == 3)
{
CString str = dmtl.NewGuid();
DwgElecCableTray4T CableTray4T;
CableTray4T.m_CableTray4TID = str;
CableTray4T.m_CableTray1 = cableTrayConnect1.m_CableTrayId;
CableTray4T.m_CableTray2 = cableTrayConnect2.m_CableTrayId;
for (auto elbow : cableTrayCount)
{
CableTray4T.m_elbowsConnected.push_back(elbow);
}
mElecDataSet[iter->first].m_ElecCableTray4Ts.push_back(CableTray4T);
}
}
//寻找三通四通的其他几个相连接的桥架
vector<pair<double, DwgElecCableTray>> vClosetCableTrayS4T1, vClosetCableTrayE3T, vClosetCableTrayE4T1, vClosetCableTrayS4T2, vClosetCableTrayE4T2;
for (auto iter3T = mElecDataSet[iter->first].m_ElecCableTray3Ts.begin(); iter3T != mElecDataSet[iter->first].m_ElecCableTray3Ts.end(); iter3T++)
{
vector<pair<double, DwgElecCableTray>> vClosetCableTrayS3T;
for (auto line : m_CableTray)
{
if (line.m_CableTrayId != iter3T->m_CableTray1 && line.m_CableTrayId != iter3T->m_CableTray2&&iter3T->m_elbowsConnected.size() >= 2)
{
if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[1].startLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[1].startPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[1].startPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[1].endLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[1].endPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[1].endPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[0].startLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[0].startPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[0].startPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter3T->m_elbowsConnected[0].endLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter3T->m_elbowsConnected[0].endPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter3T->m_elbowsConnected[0].endPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS3T.push_back(make_pair(distS, line));
}
}
}
}
if (vClosetCableTrayS3T.size() > 0)
{
sort(vClosetCableTrayS3T.begin(), vClosetCableTrayS3T.end(), FindClosetNum);
iter3T->m_CableTray3 = vClosetCableTrayS3T[0].second.m_CableTrayId;
}
}
//if (vClosetCableTrayE3T.size() > 0)
//{
// sort(vClosetCableTrayE3T.begin(), vClosetCableTrayE3T.end(), FindClosetNum);
// mElecDataSet[iter->first].m_ElecCableTray3Ts[mElecDataSet[iter->first].m_ElecCableTray3Ts.size() - 1].m_CableTray3 = vClosetCableTrayE3T[0].second.m_CableTrayId;
//}
for (auto iter4T = mElecDataSet[iter->first].m_ElecCableTray4Ts.begin(); iter4T != mElecDataSet[iter->first].m_ElecCableTray4Ts.end(); iter4T++)
{
for (auto line : m_CableTray)
{
if (line.m_CableTrayId != iter4T->m_CableTray1 && line.m_CableTrayId != iter4T->m_CableTray2)
{
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[0].startLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[0].startPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[0].startPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[0].endLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[0].endPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[0].endPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[1].startLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[1].startPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[1].startPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[1].endLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[1].endPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[1].endPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T1.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[2].startLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[2].startPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[2].startPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T2.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T2.push_back(make_pair(distS, line));
}
}
if (line.m_CableTrayCenterLine.IsParallelWith(iter4T->m_elbowsConnected[2].endLine))
{
double distS = line.m_CableTrayCenterLine.startPoint().DistanceTo(iter4T->m_elbowsConnected[2].endPoint);
double distE = line.m_CableTrayCenterLine.endPoint().DistanceTo(iter4T->m_elbowsConnected[2].endPoint);
if (distS > distE && distE < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T2.push_back(make_pair(distE, line));
}
else if (distS < distE && distS < line.m_CableTrayRadius * 2)
{
vClosetCableTrayS4T2.push_back(make_pair(distS, line));
}
}
}
}
if (vClosetCableTrayS4T1.size() > 0)
{
sort(vClosetCableTrayS4T1.begin(), vClosetCableTrayS4T1.end(), FindClosetNum);
iter4T->m_CableTray3 = vClosetCableTrayS4T1[0].second.m_CableTrayId;
}
if (vClosetCableTrayS4T2.size() > 0)
{
sort(vClosetCableTrayS4T2.begin(), vClosetCableTrayS4T2.end(), FindClosetNum);
iter4T->m_CableTray4 = vClosetCableTrayS4T2[0].second.m_CableTrayId;
}
}
//寻找不是弯头但互相交叉的三通桥架
//vector<DwgElecCableTray> vNewCableTray;
for (auto crossLine : m_CableTray)
{
for (auto crossedLine : m_CableTray)
{
geoPoint3d perpPt;
double distS, distE;
DwgElecCableTray3T unNormal3T;
//找不相交但是构成三通的位置
if (crossedLine.m_CableTrayCenterLine.GetPerpPt(crossLine.m_CableTrayCenterLine.startPoint(), perpPt) == 0)
{
distS = perpPt.DistanceTo(crossLine.m_CableTrayCenterLine.startPoint());
}
else if (crossedLine.m_CableTrayCenterLine.GetPerpPt(crossLine.m_CableTrayCenterLine.endPoint(), perpPt) == 0)
{
distE = perpPt.DistanceTo(crossLine.m_CableTrayCenterLine.endPoint());
}
if (distS > distE && distE <= crossLine.m_CableTrayRadius)
{
unNormal3T.m_CableTray1 = crossLine.m_CableTrayId;
unNormal3T.m_CableTray2 = crossedLine.m_CableTrayId;
}
else if (distS < distE && distS <= crossLine.m_CableTrayRadius)
{
unNormal3T.m_CableTray1 = crossLine.m_CableTrayId;
unNormal3T.m_CableTray2 = crossedLine.m_CableTrayId;
}
}
}
//for (auto lines : m_CableTray)
//{
//
//}
// for (auto connectTray : m_CableTray)
// {
// if (connectTray.m_CableTrayLine1.startPoint().DistanceTo(iter->second.startPoint) < 10 &&
// connectTray.m_CableTrayLine1.IsParallelWith(iter->second.startLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCount1.push_back(iter->second);
// 记录下这个桥架是否还与另外的弯头相连
// for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++)
// {
// if (iter->first != iterr->first)
// {
// if (iterr->second.startPoint.DistanceTo(connectTray.m_CableTrayLine2.startPoint) < 10 &&
// iterr->second.startLine.IsParallelWith(connectTray.m_CableTrayLine2))
// {
// }
// else if (iterr->second.endPoint.DistanceTo(connectTray.m_CableTrayLine2.startPoint) < 10 &&
// iterr->second.endLine.IsParallelWith(connectTray.m_CableTrayLine2))
// {
// }
// }
// }
// }
// else if (connectTray.m_CableTrayLine1.endPoint().DistanceTo(iter->second.startPoint) < 10 &&
// connectTray.m_CableTrayLine1.IsParallelWith(iter->second.startLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCounts.push_back(iter->second);
// for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++)
// {
// if (iter->first != iterr->first)
// {
// }
// }
// }
// else if (connectTray.m_CableTrayLine2.startPoint().DistanceTo(iter->second.startPoint) < 10 &&
// connectTray.m_CableTrayLine2.IsParallelWith(iter->second.startLine))
// {
// connectTray.m_CableTrayLine2HasElbow = true;
// vElbowCounts.push_back(iter->second);
// }
// else if (connectTray.m_CableTrayLine2.endPoint().DistanceTo(iter->second.startPoint) < 10 &&
// connectTray.m_CableTrayLine2.IsParallelWith(iter->second.startLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCounts.push_back(iter->second);
// for (auto iterr = vElbows.begin(); iterr != vElbows.end(); iterr++)
// {
// if (iter->first != iterr->first)
// {
// }
// }
// }
// else if (connectTray.m_CableTrayLine1.startPoint().DistanceTo(iter->second.endPoint) < 10 &&
// connectTray.m_CableTrayLine1.IsParallelWith(iter->second.endLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCounts.push_back(iter->second);
// }
// else if (connectTray.m_CableTrayLine1.endPoint().DistanceTo(iter->second.endPoint) < 10 &&
// connectTray.m_CableTrayLine1.IsParallelWith(iter->second.endLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCounts.push_back(iter->second);
// }
// else if (connectTray.m_CableTrayLine2.startPoint().DistanceTo(iter->second.endPoint) < 10 &&
// connectTray.m_CableTrayLine2.IsParallelWith(iter->second.endLine))
// {
// connectTray.m_CableTrayLine1HasElbow = true;
// vElbowCounts.push_back(iter->second);
// }
// else if (connectTray.m_CableTrayLine2.endPoint().DistanceTo(iter->second.endPoint) < 10 &&
// connectTray.m_CableTrayLine2.IsParallelWith(iter->second.endLine))
// {
// connectTray.m_CableTrayLine2HasElbow = true;
// vElbowCounts.push_back(iter->second);
// }
// }
// if (vElbowCounts.size() == 2)
// {
// iter->second.connectLine1 = vElbowCounts[0].startLine;
// }
//}
//mElecDataSet[iter->first].m_ElecCableTrays = m_CableTray;
//找到每一个桥架的中心线并截断不规则的桥架线段
/* for (auto tray : m_CableTray)
{
geoSegLine centerLine;
geoPoint3d perPt1, perPt2, perPt3, perPt4;
vector<pair<geoPoint3d,geoPoint3d>> perPoints;
vector<geoPoint3d> pointsOnLine;
//找到两条线的每一条垂足
if (tray.m_CableTrayLine2.GetPerpPt(tray.m_CableTrayLine1.startPoint(), perPt1) == 0)
{
perPoints.push_back(make_pair(perPt1, tray.m_CableTrayLine1.startPoint()));
}
else
{
pointsOnLine.push_back(perPt1);
}
if (tray.m_CableTrayLine2.GetPerpPt(tray.m_CableTrayLine1.endPoint(), perPt2) == 0)
{
perPoints.push_back(make_pair(perPt2, tray.m_CableTrayLine1.endPoint()));
}
else
{
pointsOnLine.push_back(perPt2);
}
if (tray.m_CableTrayLine1.GetPerpPt(tray.m_CableTrayLine2.startPoint(), perPt3) == 0)
{
perPoints.push_back(make_pair(perPt3, tray.m_CableTrayLine2.startPoint()));
}
else
{
pointsOnLine.push_back(perPt3);
}
if (tray.m_CableTrayLine1.GetPerpPt(tray.m_CableTrayLine2.endPoint(), perPt4) == 0)
{
perPoints.push_back(make_pair(perPt4, tray.m_CableTrayLine2.endPoint()));
}
else
{
pointsOnLine.push_back(perPt4);
}
//两个点说明都是最小值
if (perPoints.size() == 2)
{
geoPoint3d startPt, endPt;
startPt.x = (perPoints[0].first.x + perPoints[0].second.x) / 2;
startPt.y = (perPoints[0].first.y + perPoints[0].second.y) / 2;
endPt.x = (perPoints[1].first.x + perPoints[1].second.x) / 2;
endPt.y = (perPoints[1].first.y + perPoints[1].second.y) / 2;
centerLine.Set(startPt, endPt);
}
//四个点说明是矩形
if (pointsOnLine.size() == 4)
{
geoPoint3d startPt, endPt;
if (tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.startPoint()) > tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.endPoint()))
{
startPt.x = (tray.m_CableTrayLine1.startPoint().x + tray.m_CableTrayLine2.endPoint().x) / 2;
startPt.y = (tray.m_CableTrayLine1.startPoint().y + tray.m_CableTrayLine2.endPoint().y) / 2;
endPt.x = (tray.m_CableTrayLine1.endPoint().x + tray.m_CableTrayLine2.startPoint().x) / 2;
endPt.y = (tray.m_CableTrayLine1.endPoint().y + tray.m_CableTrayLine2.startPoint().y) / 2;
}
else if (tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.startPoint()) < tray.m_CableTrayLine1.startPoint().DistanceTo(tray.m_CableTrayLine2.endPoint()))
{
startPt.x = (tray.m_CableTrayLine1.startPoint().x + tray.m_CableTrayLine2.startPoint().x) / 2;
startPt.y = (tray.m_CableTrayLine1.startPoint().y + tray.m_CableTrayLine2.startPoint().y) / 2;
endPt.x = (tray.m_CableTrayLine1.endPoint().x + tray.m_CableTrayLine2.endPoint().x) / 2;
endPt.y = (tray.m_CableTrayLine1.endPoint().y + tray.m_CableTrayLine2.endPoint().y) / 2;
}
centerLine.Set(startPt, endPt);
}
//直角梯形
if (perPoints.size() == 1 && pointsOnLine.size() == 3)
{
geoPoint3d startPt, endPt;
startPt.x = (perPoints[0].first.x + perPoints[0].second.x) / 2;
startPt.y = (perPoints[0].first.y + perPoints[0].second.y) / 2;
vector<geoPoint3d> realPoints;
for (auto point : pointsOnLine)
{
if (point.DistanceTo(tray.m_CableTrayLine1.startPoint()) < 10 ||
point.DistanceTo(tray.m_CableTrayLine1.endPoint()) < 10 ||
point.DistanceTo(tray.m_CableTrayLine2.startPoint()) < 10 ||
point.DistanceTo(tray.m_CableTrayLine2.endPoint()) < 10)
{
realPoints.push_back(point);
}
}
if (realPoints.size() >= 2)
{
endPt.x = (realPoints[0].x + realPoints[1].x) / 2;
endPt.y = (realPoints[0].y + realPoints[1].y) / 2;
}
centerLine.Set(startPt, endPt);
}
tray.m_CableTrayCenterLine = centerLine;
}
*/
//分析三通,四通和弯头
//for (auto mutliTray : m_CableTray)
//{
// for (auto temp : m_CableTray)
// {
// if ()
// {
// }
// }
//}
}