ОБРАТИТЕ ВНИМАНИЕ, имеет ли ваш класс целочисленные компоненты данных, Вы должны использовать чтение и функции записи, которые явно заявляют целочисленный размер (например, writeInt32).

Следующее - типовой код от AsdkPoly:: dwgOutFields ():

Acad::ErrorStatus

AsdkPoly::dwgOutFields(AcDbDwgFiler* filer) const

{

assertReadEnabled();

Acad::ErrorStatus es;

if ((es = AcDbCurve::dwgOutFields(filer)) != Acad::eOk)

{

return es;

}

// Object Version - must always be the first item.

//

Adesk::Int16 version = VERSION;

filer->writeItem(version);

filer->writePoint2d(mCenter);

filer->writePoint2d(mStartPoint);

filer->writeInt32(mNumSides);

filer->writeVector3d(mPlaneNormal);

filer->writeString(mpName);

// mTextStyle is a hard pointer id, so filing it out to

// the purge filer (kPurgeFiler) prevents purging of

// this object.

//

filer->writeHardPointerId(mTextStyle);

filer->writeDouble(mElevation);

return filer->filerStatus();

}

Типовой Код для dwgInFields ()

Следующее - типовой код для AsdkPoly:: dwgInFields ():

Acad::ErrorStatus

AsdkPoly::dwgInFields(AcDbDwgFiler* filer)

{

assertWriteEnabled();

Acad::ErrorStatus es;

if ((es = AcDbCurve::dwgInFields(filer)) != Acad::eOk)

{

return es;

}

// Object Version - must always be the first item.

//

Adesk::Int16 version;

filer->readItem(&version);

if (version > VERSION)

return Acad::eMakeMeProxy;

switch (version)

{

case 1:

{

AcGePoint3d center;

filer->readPoint3d(&center);

НЕ нашли? Не то? Что вы ищете?

AcGePoint3d startPoint;

filer->readPoint3d(&startPoint);

filer->readInt32(&mNumSides);

filer->readVector3d(&mPlaneNormal);

acutDelString(mpName);

filer->readString(&mpName);

filer->readHardPointerId(&mTextStyle);

//convert data from old format

acdbWcs2Ecs(asDblArray(center),asDblArray(center),

asDblArray(mPlaneNormal),Adesk::kFalse);

mCenter. set(center. x,center. y);

mElevation = center. z;

acdbWcs2Ecs(asDblArray(startPoint),asDblArray(startPoint),

asDblArray(mPlaneNormal),Adesk::kFalse);

mStartPoint. set(startPoint. x,startPoint. y);

assert(mElevation == startPoint. z);

break;

}

case 2:

filer->readPoint2d(&mCenter);

filer->readPoint2d(&mStartPoint);

filer->readInt32(&mNumSides);

filer->readVector3d(&mPlaneNormal);

acutDelString(mpName);

filer->readString(&mpName);

filer->readHardPointerId(&mTextStyle);

filer->readDouble(&mElevation);

break;

default:

assert(false);

}

return filer->filerStatus();

}

Реализация DXF Файловые Функции

Если Вы осуществляете dxfOutFields () и dxfInFields () для нового класса, ваш полученный класс должен сначала вызвать assertReadEnabled () или assertWriteEnabled (). Это должно тогда назвать ту же самую функцию родительский класс (супер-передачей сообщений).

Диапазоны Кода DXF-группы

DXF представление объекта составлено из пар кодов группы и данных, с каждым отображением кода группы к определенному типу данных. Когда Вы определяете ваше собственное DXF представление, первая группа данных Вы записываете и читаете, должен быть маркер данных подкласса. Этот маркер состоит из кода группы 100, сопровождаемых строкой, которая является текущим именем класса. Тогда, Вы выбираете коды группы от следующей таблицы, которые соответствуют типам данных каждого поля данных, которое Вы записываете.

DXF group code ranges for object representation

From

To

Data Type

1

4

Text

6

9

Text

10

17

Point or vector (3 reals)

38

59

Real

60

79

16-bit integer

90

99

32-bit integer

100

100

Subclass data marker

102

102

Text

140

149

Real

170

179

16-bit integer

210

219

3 reals

270

279

16-bit integer

280

289

8-bit integer

300

309

Text

310

319

Binary chunk

320

329

Handle

330

339

Soft Pointer ID

340

349

Hard Pointer ID

350

359

Soft owner ID

360

369

Hard owner ID

Объект ID транслирует к rlname. Например, AcDbObjectId соответствует ads_name, который представлен в resval объединении как rlname.

Порядок зависимости

С DXF, по усмотрению автора класса, группы данных могут быть представлены в произвольном порядке, или произвольно опущен. Некоторые классы поддерживают независимость порядка групп данных, в то время как другие делают нет. Если Вы позволяете независимость порядка, то ваш dxfInFields () функция должен использовать инструкцию выключателя, чтобы выбрать действие, основанное на значении кода группы. Независимость порядка обычно соответствующая объектам с фиксированным и предсказуемым набором полей. Объекты с массивами переменной длины или структурами имеют тенденцию быть иждивенцем заказа, когда они зарегистрированы из и в.

Типовой Код для dxfOutFields ()

Следующее - типовой код от AsdkPoly:: dxfOutFields ():

Acad::ErrorStatus

AsdkPoly::dxfOutFields(AcDbDxfFiler* filer) const

{

assertReadEnabled();

Acad::ErrorStatus es;

if ((es = AcDbCurve::dxfOutFields(filer))

!= Acad::eOk)

{

return es;

}

filer->writeItem(AcDb::kDxfSubclass, "AsdkPoly");

// Object Version

//

Adesk::Int16 version = VERSION;

filer->writeInt16(AcDb::kDxfInt16, version);

filer->writePoint2d(AcDb::kDxfXCoord, mCenter);

filer->writePoint2d(AcDb::kDxfXCoord + 1, mStartPoint);

filer->writeInt32(AcDb::kDxfInt32, mNumSides);

// Always use max precision when writing out the normal.

filer->writeVector3d(AcDb::kDxfNormalX, mPlaneNormal,16);

filer->writeString(AcDb::kDxfText, mpName);

filer->writeItem(AcDb::kDxfHardPointerId, mTextStyle);

filer->writeDouble(AcDb::kDxfReal, mElevation);

return filer->filerStatus();

}

Типовой Код для dxfInFields () с Независимостью порядка

Следующее - типовой код для AsdkPoly:: dxfInFields ():

Acad::ErrorStatus

AsdkPoly::dxfInFields(AcDbDxfFiler* filer)

{

assertWriteEnabled();

Acad::ErrorStatus es = Acad::eOk;

resbuf rb;

if ((AcDbCurve::dxfInFields(filer) != Acad::eOk) || !filer->atSubclassData("AsdkPoly"))

{

return filer->filerStatus();

}

// Object Version

Adesk::Int16 version;

filer->readItem(&rb);

if (rb. restype!= AcDb::kDxfInt16)

{

filer->pushBackItem();

filer->setError(Acad::eInvalidDxfCode,

"\nError: expected group code %d (version)",

AcDb::kDxfInt16);

return filer->filerStatus();

}

version = rb. resval. rint;

if (version > VERSION)

return Acad::eMakeMeProxy;

AcGePoint3d cen3d, sp3d;

AcGePoint2d cen2d, sp2d;

long numSides;

AcDbObjectId textStyle;

double elevation;

Adesk::UInt32 fieldsFlags = 0;

char * pName = NULL;

AcGeVector3d planeNormal;

while ((es == Acad::eOk) && ((es = filer->readResBuf(&rb)) == Acad::eOk))

{

switch (rb. restype) {

case AcDb::kDxfXCoord:

if (version == 1)

cen3d = asPnt3d(rb. resval. rpoint);

else

cen2d = asPnt2d(rb. resval. rpoint);

fieldsFlags |= 0x1;

break;

case AcDb::kDxfXCoord + 1:

if (version == 1)

sp3d = asPnt3d(rb. resval. rpoint);

else

sp2d = asPnt2d(rb. resval. rpoint);

fieldsFlags |= 0x2;

break;

case AcDb::kDxfInt32:

numSides = rb. resval. rlong;

fieldsFlags |= 0x4;

break;

case AcDb::kDxfNormalX:

planeNormal = asVec3d(rb. resval. rpoint);

fieldsFlags |= 0x8;

break;

case AcDb::kDxfText:

acutUpdString(rb. resval. rstring, pName);

fieldsFlags |= 0x11;

break;

case AcDb::kDxfHardPointerId:

acdbGetObjectId(textStyle, rb. resval. rlname);

fieldsFlags |= 0x12;

break;

case AcDb::kDxfReal:

if (version == 2)

{

fieldsFlags |= 0x10;

elevation = rb. resval. rreal;

break;

}

//fall through intentional

default:

// An unrecognized group. Push it back so that

// the subclass can read it again.

filer->pushBackItem();

es = Acad::eEndOfFile;

break;

}

}

// At this point, the es variable must contain eEndOfFile,

// either from readResBuf() or from pushbackBackItem(). If

// not, it indicates that an error happened and we should

// return immediately.

//

if (es!= Acad::eEndOfFile)

return Acad::eInvalidResBuf;

// Now check to be sure all necessary group codes were

// present.

//

// Mandatory fields:

// - center

// - start point

// - normal

// - number of sides

// - elevation (if version > 1)

short required[] =

{AcDb::kDxfXCoord, AcDb::kDxfXCoord+1, AcDb::kDxfInt32,

AcDb::kDxfNormalX, AcDb::kDxfReal};

for (short i = 0; i < (version>1?4:3); i++) {

if (!fieldsFlags & 0x1) {

filer->setError(Acad::eMissingDxfField,

"\nMissing DXF group code: %d", 2, required[i]);

return Acad::eMissingDxfField;

} else

fieldsFlags >>= 1;

}

mPlaneNormal = planeNormal;

mNumSides = numSides;

mTextStyle = textStyle;

setName(pName);

acutDelString(pName);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132