Spline Nesnelerini Lwpolyline Nesnelerine Çevirme
ObjectArx AcDbSpline nesnesi, toPolyline(…) adlı bir methodu zaten içeriyor. ConvertSplineToLwPolyline(…) fonksiyonu ise bu methodu kullanarak, çizimdeki Spline nesnelerini Lwpolyline nesnelerine çevirmekten başka bir şey yapmıyor.
void PolyConverter::ConvertSplineToLwPolyline(void)
{
// Spline nesnelerinin seçimi için filtre oluşturulması
struct resbuf eb;
TCHAR sbuf[10];
eb.restype = 0;
wcscpy(sbuf, _T("SPLINE"));
eb.resval.rstring = sbuf;
eb.rbnext = NULL;
ads_name ss;
if (acedSSGet(NULL, NULL, NULL, eb, ss) != RTNORM)
{
acutRelRb(eb);
return;
}
// resbuf'ın serbest bırakılması
acutRelRb(eb);
// Seçilen nesnelerin sayısının bulunması
long length = 0;
if ((acedSSLength(ss, length) != RTNORM) || (length == 0))
{
acedSSFree(ss);
return;
}
ads_name ent;
AcDbObjectId id = AcDbObjectId::kNull;
AcDbDatabase *pCurDb = acdbCurDwg();
AcApDocument *pDoc = acDocManager->mdiActiveDocument();
// Aktif dökümanın kilitlenmesi
acDocManager->lockDocument(pDoc);
acedSetStatusBarProgressMeter(_T("Nesneler çevriliyor.Lüffen işlemin bitmesini bekleyiniz..."), 0, length);
// İşlem yığını yöneticisinin başlatılması
AcTransaction *tr = acTransactionManagerPtr()->startTransaction();
int abort = 0;
for (long i = 0; i < length; i++)
{
if (acedSSName(ss, i, ent) != RTNORM) continue;
if (acdbGetObjectId(id, ent) != Acad::eOk) continue;
AcDbObject *pEnt = NULL;
// Seçilen nesnenin yazma amaçlı açılması
if(tr->getObject((AcDbObject *)pEnt, id, AcDb::kForWrite) != Acad::eOk)
continue;
//Spline nesnesinin elde edilmesi
if(pEnt->isKindOf(AcDbSpline::desc()))
{
AcDbSpline *pSpline = static_cast<AcDbSpline*>(pEnt);
AcDbPolyline *pPline;
AcDbObjectId objId = AcDbObjectId::kNull;
Acad::ErrorStatus es = pSpline->toPolyline((AcDbCurve *)pPline);
if(es == Acad::eOk)
{
if(addPolyline(pCurDb, tr, static_cast<AcDbEntity*>(pEnt)->layer(), pPline, objId) == Acad::eOk)
{
pEnt->erase();
}
}
}
acedSetStatusBarProgressMeterPos(i);
// Eğer kullanıcı işlemi iptal ederse işlem yığınını iptal edilmesi
abort = acedUsrBrk();
if(abort == 1)
{
acutPrintf(_T("\nİşlem iptal edildi..."));
break;
}
}
if(abort == 0)
acTransactionManagerPtr()->endTransaction();
else
acTransactionManagerPtr()->abortTransaction();
acedRestoreStatusBar();
acDocManager->unlockDocument(pDoc);
// Seçim setinin serbest bırakılması
acedSSFree(ss);
}
Acad::ErrorStatus PolyConverter::addPolyline(AcDbDatabase *db, AcTransaction *tr, ACHAR *LayerName, AcDbPolyline *pPline, AcDbObjectId Id)
{
Acad::ErrorStatus es;
pPline->setLayer(LayerName);
es = addToCurrentSpace(pPline, acdbCurDwg(), tr, Id);
return es;
}
Yorum yapın