ARXは、複数のセグメント(他の人への部分参照)を組み合わせ

ARX合并多线段(部分内容参考其他人)

展开

空隙CCommonModel :: AppendPoly(AcDbObjectIdArray&objArray、AcDbPolyline * pPolyNew CONST)
{
AcDbObjectIdArray objIdArray = objArray。
std :: multimapの<AcGePoint3d、int型> mapPoints。// AcGePoint3d不能排序、要重载符号「<」;
std :: multimapの<AcGePoint3d、整数> ::イテレータite1。

std :: multimapの<AcGePoint3d、整数> ::イテレータite2。
以下のために(INT I 0 =; I <objIdArray.length(); I ++)
{
AcDbObjectId OBJID。
OBJID = objIdArray.at(I)。
AcGePoint3d ptStart;
AcGePoint3d ptEnd;
AcDbObjectPointer <AcDbPolyline>なppoly(OBJID、ACDB :: kForRead)。
pPoly-> getStartPoint(ptStart)。
pPoly-> getEndPoint(ptEnd)。
IF(iは0 ==)
{
mapPoints.insert(STD :: make_pair(ptStart、1))。
mapPoints.insert(STD :: make_pair(ptEnd、1))。
}

{
ite1 = mapPoints.find(ptStart)。
ite2 = mapPoints.find(ptEnd)。
IF(!ite1 = mapPoints.end())
{
(ite1->秒)++;
}

{
mapPoints.insert(STD :: make_pair(ptStart、1))。
}
ite2 = mapPoints.find(ptEnd)。
IF(!ite2 = mapPoints.end())
{
(ite2->秒)++;
}

{
mapPoints.insert(STD :: make_pair(ptEnd、1))。
}
}
}

AcGePoint3d ptStartOk。
(ite1 ++ ite1 = mapPoints.begin();; ite1 = mapPoints.end()!)のために
{
IF(ite1-> == 1秒。)
{
ptStartOk = ite1->まず、
BREAK;
}
}

int型plIndex = 0;
一方(objIdArray.length()> 0)
{
I <objIdArray;(INT I = 0。長さ(); I ++)//問題、最後にいくつかの複数行の終わりではない場合、無限ループそう。
{
AcDbObjectId OBJID;
OBJID = objIdArray.at(I);
AcGePoint3d ptStart;
AcGePoint3d ptEnd;
AcDbObjectPointer <AcDbPolyline>なppoly(OBJID、ACDB :: kForRead);
pPoly-> getStartPoint(ptStart);
pPoly-> getEndPoint(ptEnd);

AcGePoint2d PT;
ダブルバルジ= 0.0;
IF(ptStartOk == ptStart)//等しい決定点、自分の距離関数またはドット付き
{
(; J INT J = 0 <pPoly-> numVerts(); J ++)// 問題:最後の点は、上書きする加算の次のポイント、すなわち、重複点がある
{
pPoly-> getPointAt(J、Ptが)。
なppoly - > getBulgeAt(J、バルジ);
pPolyNew-> addVertexAt(plIndex、白金、バルジ);
plIndex ++;
}
ptStartOk = ptEnd;
objIdArray.removeAt(I);
}
そうIF(ptStartOk == ptEnd)//決定ポイントは、等しいです独自の距離関数とドット
{
ため(INT K = pPoly-> numVerts() - 1; K> 0; K--)
{
pPoly-> getPointAt(K、白金)、
IF(K> 0)
{
pPoly-> getBulgeAt(K - 1、バルジ。);
}

{
pPoly-> getBulgeAt(0、バルジ);
}
pPolyNew-> addVertexAt(plIndex、白金、-bulge);
plIndex ++;
}
= ptStart ptStartOk;
objIdArray.removeAt(I);
}

{

}
}

}
}

BOOL演算子<(AcGePoint3d pt3dS、AcGePoint3d pt3dE)
{
IF(pt3dS.x <pt3dE.x)
{
trueに戻り;
}
そうIF(pt3dS.x pt3dE.x ==)
{
IF(pt3dS.y <pt3dE.y)
{
trueに戻り;
}
そうIF(pt3dS.y == pt3dE.y)
{
falseに戻り;
}
そう
{
falseに戻り;
}
}
そう
{
falseに戻り;
}
}
つ以上の、エラー場合、マップ中間点回数の発生数を決定:改良された方法。
                    いくつかのポリラインを閉じたポリラインから取り出されている場合、それが4であれば2、次いで2又は4で点の出現の中点回マップし、それが元のマルチ二点か否かが判断されますセグメントの開始点。次に、それを接続するために閉じられています。

おすすめ

転載: www.cnblogs.com/mjgw/p/12348057.html