//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : XBlockTable Àà // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: XBlockTable ¶¨Òå // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "XBlockTable.h" XBlockTable::XBlockTable(const TCHAR *blkName) : XSymbolTable(_T("BLOCK"), blkName) { if (XSymbolTable::operator !()) { return; } GetData(10, base); GetData(-2, ent); } XBlockTable::~XBlockTable() { } int XBlockTable::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 XBlockTable::GetExtend(ads_point low, ads_point up, ads_matrix tranMat) { if (!(*this)) { return RTERROR; } XPoint lowPt, upPt; int rc = ent.GetExtend(lowPt, upPt, tranMat); if (rc == RTERROR) { return RTERROR; } int findExtend = rc == RTNORM ? 1 : 0; Entity subEnt = ent; while(1) { ads_name entNext; if (ads_entnext(subEnt, entNext) != RTNORM) { break; } subEnt = entNext; subEnt.FreeGroups(); XString eType; subEnt.GetData(0, eType); if (subEnt.Is(_T("ENDBLK"))) { break; } XPoint 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 = Min(lowPt, pt1); upPt = Max(upPt, pt2); } } if (findExtend) { lowPt > low; upPt > up; return RTNORM; } return RTNONE; }