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

       

Функции преобразования


AcDbEntity класс обеспечивает две функции преобразования:

virtual Acad::ErrorStatus

AcDbEntity::transformBy(const AcGeMatrix3d& xform);

virtual Acad::ErrorStatus

AcDbEntity::getTransformedCopy(const AcGeMatrix3d& xform,

AcDbEntity*& ent) const;

TransformBy () функция изменяет примитив, используя указанную матрицу.

В AutoCAD, это называется перемещением власти{*захвата*}, вращать, масштабировать, и отражать режимы. В некоторых случаях{*делах*}, однако, применяя преобразование требует, чтобы новый примитив был создан. В таких случаях{*делах*}, getTransformedCopy () функция используется так, чтобы заканчивающийся примитив мог быть образец различного класса чем первоначальный примитив.

Когда Вы взрываете блочную ссылку{*справочники*}, которая неоднородно масштабировалась, getTransformedCopy () функция - обратился к примитивам в блочной ссылке{*справочниках*}, чтобы создать новые примитивы (см. “ Взрывающиеся Примитивы ” на странице 123).


AcDbEntity класс предлагает две функции преобразования. TransformBy() функция применяет матрицу к объекту. GetTransformedCopy () функция дает возможность объекту возвратить копию себя С преобразованием, прикладным к этому.

Если объект однородно масштабируется и ортогональный, заданное по умолчанию выполнение AcDbEntity:: getTransformedCopy () функция имитирует объект и затем вызывает transformBy () функция на имитируемом объекте. (Используйте AcGeMatrix3d:: isUniScaledOrtho () функция, чтобы определить, масштабируется ли входная матрица однородно и ортогональный.)

Заказной AsdkPoly класс перегружает, и transformBy () функция и getTransformedCopy () функция. Когда AsdkPoly неравномерно масштабируется, это становится ломаной линией.



Acad::ErrorStatus

AsdkPoly::transformBy(const AcGeMatrix3d& xform)

{

// If we’re dragging, we aren’t really going to change our

// data, so we don’t want to make an undo recording nor do

// we really care if the object’s open for write.

//

if (mDragDataFlags & kCloneMeForDraggingCalled) {

mDragDataFlags &= kUseDragCache;

mDragPlaneNormal = mPlaneNormal;

mDragElevation = mElevation;

AcGeMatrix2d xform2d(xform.convertToLocal(mDragPlaneNormal,

mDragElevation));

mDragCenter = xform2d * center();

mDragStartPoint = xform2d * startPoint();

mDragPlaneNormal.normalize();

} else {

assertWriteEnabled();

AcGeMatrix2d xform2d(xform.convertToLocal(mPlaneNormal,

mElevation));

mCenter.transformBy(xform2d);

mStartPoint.transformBy(xform2d);

mPlaneNormal.normalize();

}

return Acad::eOk;

}

Acad::ErrorStatus AsdkPoly::getTransformedCopy(

const AcGeMatrix3d& mat,

AcDbEntity*& ent) const

{

assertReadEnabled();

Acad::ErrorStatus es = Acad::eOk;

AcGePoint3dArray vertexArray;

if ((es = getVertices3d(vertexArray)) != Acad::eOk)

{

return es;

}

for (int i = 0; i < vertexArray.length(); i++) {

vertexArray[i].transformBy(mat);

}

AcDbSpline *pSpline = NULL;

if ((es = rx_makeSpline(vertexArray, pSpline)) != Acad::eOk)

{

return es;

}

assert(pSpline != NULL);

pSpline->setPropertiesFrom(this);

ent = pSpline;

return es;

}



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