ОБРАТИТЕ ВНИМАНИЕ, имеет ли ваш класс целочисленные компоненты данных, Вы должны использовать чтение и функции записи, которые явно заявляют целочисленный размер (например, 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(¢er);
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 |


