ADN Open CIS
Сообщество программистов Autodesk в СНГ

13/10/2013

Обратное преобразование растрового изображения

Вставка блока (BlockReference) предоставляет матрицу преобразования "BlockTransform", которая очень полезна, когда необходимо преобразовать примитив так, чтобы свести на нет последствия перемещения, вращения и масштабирования. А растровое изображение (RasterImage) не предоставляет такой матрицы. Но мы можем её создать сами, зная значения поворота, смещения и масштабирования по X и Y. Вот код примера, который устраняет масштабирование, смещение и поворот выбранного растрового изображения:

Код - C#: [Выделить]
  1. [CommandMethod("RITest")]
  2. public void RITestMethod()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed
  7.         = Application.DocumentManager.MdiActiveDocument.Editor;
  8.  
  9.     PromptEntityOptions opts
  10.             = new PromptEntityOptions("Выберит растровое изображение : ");
  11.     opts.SetRejectMessage("Это не растровое изображение");
  12.     opts.AddAllowedClass
  13.           (
  14.             typeof(Autodesk.AutoCAD.DatabaseServices.RasterImage),
  15.             false
  16.           );
  17.  
  18.     PromptEntityResult res = ed.GetEntity(opts);
  19.     if (res.Status != PromptStatus.OK)
  20.         return;
  21.  
  22.     using (Transaction tr = db.TransactionManager.StartTransaction())
  23.     {
  24.         RasterImage ri = tr.GetObject(
  25.                                         res.ObjectId,
  26.                                         OpenMode.ForWrite
  27.                                      ) as RasterImage;
  28.  
  29.         Matrix3d invTransform = Matrix3d.Identity;
  30.  
  31.         invTransform = invTransform.PreMultiplyBy
  32.                 (
  33.                     Matrix3d.Rotation(  -ri.Rotation,
  34.                                         Vector3d.ZAxis,
  35.                                         ri.Orientation.Origin)
  36.                 );
  37.  
  38.         invTransform = invTransform.PreMultiplyBy
  39.                 (
  40.                     Matrix3d.Displacement( 
  41.                     Point3d.Origin - ri.Orientation.Origin)
  42.                 );
  43.  
  44.         Vector2d riScale = ri.Scale;
  45.         double scaleX = riScale.X;
  46.         double scaleY = riScale.Y;
  47.  
  48.         double[] coeffs = new double[]
  49.         {
  50.             scaleX, 0, 0, 0,
  51.             0, scaleY, 0, 0,
  52.             0, 0, 1, 0,
  53.             0, 0, 0, 1
  54.         };
  55.  
  56.         Matrix3d scaleMatrix = new Matrix3d(coeffs);
  57.         invTransform = invTransform.PreMultiplyBy
  58.                                     (scaleMatrix.Inverse());
  59.  
  60.         ri.TransformBy(invTransform);
  61.  
  62.         // Если вам нужна прямая матрица преобразования, а не обратная,
  63.         // то просто инвертируйте матрицу снова:
  64.         // Matrix3d riTransform = invTransform.Inverse();
  65.  
  66.         tr.Commit();
  67.     }
  68. }

Источник: 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