Функции преобразования
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;
}