13/10/2013
Обратное преобразование растрового изображения
Вставка блока (BlockReference) предоставляет матрицу преобразования "BlockTransform", которая очень полезна, когда необходимо преобразовать примитив так, чтобы свести на нет последствия перемещения, вращения и масштабирования. А растровое изображение (RasterImage) не предоставляет такой матрицы. Но мы можем её создать сами, зная значения поворота, смещения и масштабирования по X и Y. Вот код примера, который устраняет масштабирование, смещение и поворот выбранного растрового изображения:
Код - C#: [Выделить]
- [CommandMethod("RITest")]
- public void RITestMethod()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed
- = Application.DocumentManager.MdiActiveDocument.Editor;
- PromptEntityOptions opts
- = new PromptEntityOptions("Выберит растровое изображение : ");
- opts.SetRejectMessage("Это не растровое изображение");
- opts.AddAllowedClass
- (
- typeof(Autodesk.AutoCAD.DatabaseServices.RasterImage),
- false
- );
- PromptEntityResult res = ed.GetEntity(opts);
- if (res.Status != PromptStatus.OK)
- return;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- RasterImage ri = tr.GetObject(
- res.ObjectId,
- OpenMode.ForWrite
- ) as RasterImage;
- Matrix3d invTransform = Matrix3d.Identity;
- invTransform = invTransform.PreMultiplyBy
- (
- Matrix3d.Rotation( -ri.Rotation,
- Vector3d.ZAxis,
- ri.Orientation.Origin)
- );
- invTransform = invTransform.PreMultiplyBy
- (
- Matrix3d.Displacement(
- Point3d.Origin - ri.Orientation.Origin)
- );
- Vector2d riScale = ri.Scale;
- double scaleX = riScale.X;
- double scaleY = riScale.Y;
- double[] coeffs = new double[]
- {
- scaleX, 0, 0, 0,
- 0, scaleY, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1
- };
- Matrix3d scaleMatrix = new Matrix3d(coeffs);
- invTransform = invTransform.PreMultiplyBy
- (scaleMatrix.Inverse());
- ri.TransformBy(invTransform);
- // Если вам нужна прямая матрица преобразования, а не обратная,
- // то просто инвертируйте матрицу снова:
- // Matrix3d riTransform = invTransform.Inverse();
- tr.Commit();
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2013/08/rasterimage-inverse-transform.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=248
Опубликовано 13.10.2013Отредактировано 13.10.2013 в 13:09:22