Message 1 of 5
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
static void MSDDMyGroupMyCommand0 () {
ads_name ss;
resbuf *rbList = acutBuildList(RTDXF0, _T("LWPOLYLINE"),RTNONE);
if (RTNORM != acedSSGet(NULL, NULL, NULL, rbList, ss))
{
acutRelRb(rbList);
return;
}
acutRelRb(rbList);
Adesk::Int32 nSSLength = 0;
acedSSLength(ss, &nSSLength);
vector<AcGePoint2dArray> Ptss;
AcGePoint2dArray ptstemp;
for (Adesk::Int32 i = 0; i < nSSLength; i++)
{
ads_name ent;
acedSSName(ss, i, ent);
AcDbObjectId objId;
acdbGetObjectId(objId, ent);
GetAcDb2dPolyPoints(objId,ptstemp);
Ptss.push_back(ptstemp);
}
vector<vector<AcGePoint2dArray>> ptsu,ptsn;
GetConnected(Ptss, ptsu,ptsn);
acedSSFree(ss);
acutPrintf(_T("\n Enclosed area: %d "),ptsu.size());
acutPrintf(_T("\nOpen area: %d "),ptsn.size());
}
static void GetConnected(vector<AcGePoint2dArray> Ptss, vector<vector<AcGePoint2dArray>> &VPtss, vector<vector<AcGePoint2dArray>> &VtempC)
{
while (Ptss.size() > 0)
{
vector<AcGePoint2dArray> tempY,tempN,tempC;
AcGePoint2d sta = Ptss.back().first();
AcGePoint2d end = Ptss.back().last();
tempY.push_back(Ptss.back());
Ptss.pop_back();
tempN.clear();
bool TN=true;
while ((sta.distanceTo(end) > 1e-7) && TN)
{
int stalen = (int)Ptss.size();
for (Adesk::Int32 i = 0; i < Ptss.size(); i++)
{
AcGePoint2d sta1 = Ptss.at(i).first();
AcGePoint2d end1 = Ptss.at(i).last();
double kk1 = sta.distanceTo(sta1);
double kk2 = sta.distanceTo(end1);
if ( kk1 <= 1e-7 || kk2 <= 1e-7 )
{
if ( bool kk = (kk1 <= 1e-7))
{
Ptss.at(i).reverse();
sta = Ptss.at(i).at(0);
tempY.push_back(Ptss.at(i));
Ptss.removeat(i);
}
if ( bool kk = (kk2 <= 1e-7))
{
sta = Ptss.at(i).at(0);
tempY.push_back(Ptss.at(i));
Ptss.removeat(i);
}
}
else
{
tempN.push_back(Ptss.at(i));
}
} //for end
int entlen = (int)Ptss.size();
}//(sta.distanceTo(end)!= 1e-7) end
VPtss.push_back(tempY);
Ptss=tempN;
}//while(Ptss.size() > 0) end
}
static void GetAcDb2dPolyPoints(AcDbObjectId id, AcGePoint2dArray &ptas)
{
AcDbEntity *pEnt = NULL;
acdbOpenObject(pEnt, id, AcDb::kForWrite);
if (pEnt->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline *pPline=AcDbPolyline::cast(pEnt);
int num =pPline->numVerts();
AcGePoint2d pt;
for (int i=0;i<num;i++)
{
pPline->getPointAt(i,pt);
ptas.append(pt);
}
pPline->close();
}
}
Solved! Go to Solution.