107 lines
1.6 KiB
C++
107 lines
1.6 KiB
C++
#include "StdAfx.h"
|
|
#include "globalFunc.h"
|
|
#include "SHAcDbBlockTable.h"
|
|
|
|
SHAcDbBlockTable::SHAcDbBlockTable(const TCHAR *blkName)
|
|
: SHAcDbSymbolTable(_T("BLOCK"), blkName)
|
|
{
|
|
if (SHAcDbSymbolTable::operator !())
|
|
{
|
|
return;
|
|
}
|
|
|
|
GetData(10, base);
|
|
GetData(-2, ent);
|
|
}
|
|
|
|
SHAcDbBlockTable::~SHAcDbBlockTable()
|
|
{
|
|
|
|
}
|
|
|
|
int SHAcDbBlockTable::EntNext()
|
|
{
|
|
ads_name e;
|
|
ent>e;
|
|
ent.FreeGroups();
|
|
|
|
if (ads_entnext(e, ent) != RTNORM)
|
|
{
|
|
ent.name[0] = ent.name[1] = 0L;
|
|
return RTERROR;
|
|
}
|
|
|
|
return RTNORM;
|
|
}
|
|
|
|
int SHAcDbBlockTable::GetExtend(ads_point low, ads_point up, ads_matrix tranMat)
|
|
{
|
|
if (!(*this))
|
|
{
|
|
return RTERROR;
|
|
}
|
|
|
|
ADSGePoint3d lowPt, upPt;
|
|
int rc = ent.GetExtend(lowPt, upPt, tranMat);
|
|
if (rc == RTERROR)
|
|
{
|
|
return RTERROR;
|
|
}
|
|
|
|
int findExtend = rc == RTNORM ? 1 : 0;
|
|
|
|
EntitySet subEnt = ent;
|
|
while(1)
|
|
{
|
|
ads_name entNext;
|
|
if (ads_entnext(subEnt, entNext) != RTNORM)
|
|
{
|
|
break;
|
|
}
|
|
|
|
subEnt = entNext;
|
|
subEnt.FreeGroups();
|
|
|
|
CString eType;
|
|
subEnt.GetData(0, eType.GetBuffer(256));
|
|
eType.ReleaseBuffer();
|
|
if (subEnt.Is(_T("ENDBLK")))
|
|
{
|
|
break;
|
|
}
|
|
|
|
ADSGePoint3d pt1, pt2;
|
|
rc = subEnt.GetExtend(pt1, pt2, tranMat);
|
|
if (rc == RTERROR)
|
|
{
|
|
return RTERROR;
|
|
}
|
|
else if (rc == RTNONE)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (!findExtend)
|
|
{
|
|
lowPt = pt1;
|
|
upPt = pt2;
|
|
findExtend = 1;
|
|
}
|
|
else
|
|
{
|
|
lowPt = GlobalFunc::Min(lowPt, pt1);
|
|
upPt = GlobalFunc::Max(upPt, pt2);
|
|
}
|
|
}
|
|
|
|
if (findExtend)
|
|
{
|
|
lowPt > low;
|
|
upPt > up;
|
|
|
|
return RTNORM;
|
|
}
|
|
|
|
return RTNONE;
|
|
}
|