ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Диапазоны Кода 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);

if (version==1)

{

//convert data from old format

acdbWcs2Ecs(asDblArray(cen3d),asDblArray(cen3d),



asDblArray(planeNormal),Adesk::kFalse);

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

mElevation = cen3d.z;

acdbWcs2Ecs(asDblArray(sp3d),asDblArray(sp3d),

asDblArray(planeNormal),Adesk::kFalse);

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

assert(mElevation == sp3d.z);

} else {

mCenter = cen2d;

mStartPoint = sp2d;

mElevation = elevation;

}

return es;

}

Законченный код для AsdkPoly определенного приложением класса может быть найден в каталоге примеров.

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

Эта выборка кода показывает, как Вы могли записывать dxfInFields () функция, которая является иждивенцем заказа (порядка).

Acad::ErrorStatus

AsdkPoly::dxfInFields(AcDbDxfFiler* filer)

{

assertWriteEnabled();

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

{

return filer->filerStatus();

}

try

{

struct resbuf rb;

// Object Version

Adesk::Int16 version;

filer->readItem(&rb);

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

throw AcDb::kDxfInt16;

version = rb.resval.rint;

if (version > VERSION)

return Acad::eMakeMeProxy;

if (version == 1)

{

AcGePoint3d cent,sp;

filer->readItem(&rb);

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

throw AcDb::kDxfXCoord

cent = asPnt3d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord + 1)

throw AcDb::kDxfXCoord + 1;

sp = asPnt3d(rb.resval.rpoint);

filer->readItem(&rb);

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

throw AcDb::kDxfInt32;

mNumSides = rb.resval.rlong;

filer->readItem(&rb);

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

throw AcDb::kDxfNormalX

mPlaneNormal = asVec3d(rb.resval.rpoint);

filer->readItem(&rb);

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

throw AcDb::kDxfText;

setName(rb.resval.rstring);

filer->readItem(&rb);

if (rb.restype != kDxfHardPointerId)

throw AcDb::kDxfHardPointerId;

acdbGetObjectId(mTextStyle, rb.resval.rlname);



// Convert data from old format.

acdbWcs2Ecs(asDblArray(cent),asDblArray(cent),

asDblArray(mPlaneNormal),Adesk::kFalse);

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

mElevation = cent.z;

acdbWcs2Ecs(asDblArray(sp),asDblArray(sp),

asDblArray(mPlaneNormal),Adesk::kFalse);

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

assert(mElevation == sp.z);

}

else if (version == 2)

{

filer->readItem(&rb);

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

throw AcDb::kDxfXCoord;

mCenter = asPnt2d(rb.resval.rpoint);

filer->readItem(&rb);

if (rb.restype != AcDb::kDxfXCoord + 1)

throw AcDb::kDxfXCoord + 1;

mStartPoint = asPnt2d(rb.resval.rpoint);

filer->readItem(&rb);

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

throw AcDb::kDxfInt32

mNumSides = rb.resval.rlong;

filer->readItem(&rb);

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

throw AcDb::kDxfNormalX;

mPlaneNormal = asVec3d(rb.resval.rpoint);

filer->readItem(&rb);

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

throw AcDb::kDxfText

setName(rb.resval.rstring);

filer->readItem(&rb);

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

throw AcDb::kDxfHardPointerId;

acdbGetObjectId(mTextStyle, rb.resval.rlname);

filer->readItem(&rb);

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

throw AcDb::kDxfReal;

mElevation = rb.resval.rreal;

}

else assert(false);

}

catch (AcDb::DxfCode code)

{

filer->pushBackItem();

filer->setError(Acad::eInvalidDxfCode,

"\nError: expected group code %d", code);

return filer->filerStatus();

}

}






Содержание раздела