#include „dbents.h" //atentie! ordinea de intrare/iesire a datelor membre trebuie sa fie identica Acad::ErrorStatus Custom::dxfInFields( AcDbDxfFiler* filer ) { assertWriteEnabled(); Acad::ErrorStatus es = Acad::eOk; if( ( AcDbObject::dxfInFields(filer) != Acad::eOk ) || ! filer->atSubclassData( kConstClassName ) ) { return filer->filerStatus(); } struct resbuf rb; filer->readItem( &rb ); if( rb.restype == AcDb::kDxfXCoord ) { mStartPoint.set( rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z] ); } else { goto outWithError; } filer->readItem( &rb ); if( rb.restype == AcDb::kDxfXCoord ) { mEndPoint.set( rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z] ); } else { goto outWithError; } filer->readItem( &rb ); if( rb.restype == AcDb::kDxfReal ) { mRadius1 = rb.resval.rreal; } else { goto outWithError; } filer->readItem( &rb ); if( rb.restype == AcDb::kDxfReal ) { mRadius2 = rb.resval.rreal; } else { goto outWithError; } return filer->filerStatus(); outWithError: filer->pushBackItem(); filer->setError( Acad::eInvalidDxfCode, „nError: wrong group code", NULL ); return filer->filerStatus(); } //In aceasta ordine vor fi citite datele membre in metoda de mai sus Acad::ErrorStatus Custom::dxfOutFields( AcDbDxfFiler* filer) const { assertReadEnabled(); AcDbObject::dxfOutFields(filer); filer->writeItem(AcDb::kDxfSubclass, kConstClassName ); filer->writeItem( AcDb::kDxfXCoord, mStartPoint ); filer->writeItem( AcDb::kDxfXCoord, mEndPoint ); filer->writeItem( AcDb::kDxfReal, mRadius1 ); filer->writeItem( AcDb::kDxfReal, mRadius2 ); return filer->filerStatus(); } Acad::ErrorStatus Custom::transformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); AcGeVector3d radius1 = mEndPoint - mStartPoint; AcGeVector3d radius2 = mStartPoint - mEndPoint; radius1.normalize(); radius2.normalize(); radius1 *= mRadius1; radius2 *= mRadius2; mStartPoint.transformBy(xform); mEndPoint.transformBy(xform); radius1.transformBy(xform); radius2.transformBy(xform); mRadius1 = radius1.length(); mRadius2 = radius2.length(); return Acad::eOk; } void Custom::list() const { assertReadEnabled(); AcDbEntity::list(); ads_printf( „Start point: X=%9.16q0, Y=%9.16q0, Z=%9.16q0n", mStartPoint[X], mStartPoint[Y], mStartPoint[Z] ); ads_printf( „End point: X=%9.16q0, Y=%9.16q0, Z=%9.16q0n", mEndPoint[X], mEndPoint[Y], mEndPoint[Z] ); ads_printf( „Radius1: %9.16q0n", mRadius1 ); ads_printf( „Radius2: %9.16q0n", mRadius2 ); } Acad::ErrorStatus Custom::explode( AcDbVoidPtrArray& entitySet) const { // ads_alert( „Acest obiect nu explodeaza. E ud!" ); // return Acad::eNotApplicable; AcDbCircle *circle1, *circle2; //normala este cablata! AcGeVector3d v( 0.0, 0.0, 1.0 ); //calculam centrele viitoarelor cercuri AcGeVector3d v1 = mEndPoint - mStartPoint; AcGeVector3d v2 = mStartPoint - mEndPoint; v1.normalize(); v2.normalize(); AcGePoint3d center1 = mStartPoint + v1 * mRadius1; AcGePoint3d center2 = mEndPoint + v2 * mRadius2; //constructorii noilor entitati circle1 = new AcDbCircle( center1, v, mRadius1 ); circle2 = new AcDbCircle( center2, v, mRadius2 ); entitySet.append( circle1 ); entitySet.append( circle2 ); return Acad::eOk; }