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;
}