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

24/01/2014

Как масштабировать неравномерно по осям изображение, чтобы заполнить область?

Растровые изображения относятся к категории примитивов, которые поддерживают неравномерное масштабирование по осям.

Примитивы, которые также поддерживают неравномерное масштабирование:

AcDbLeader, AcDbMLine, AcDbMText, AcDbOle2Frame, AcDbPloyFaceMesh, AcDbPolygonMesh, AcDbRay, AcDbXline, AcDbFcf, AcDbSolid, AcDbEllipse, AcDbSpline, AcDbImage.

В AutoCAD .NET API нет встроенных методов для создания неравномерно масштабированной матрицы. Так что вам придется создать такую матрицу самостоятельно заполнив её коэффициенты. Построение матрицы масштабирования довольно просто, так как это диагональная матрица, которая содержит соотвествующие масштабные коэффициенты по направлениям X, Y и Z.

Команда на C# показывает как выполнить неравномерное масштабирование растра так, чтобы он заполнил прямоугольник (Ширина x Высота):

Код - C#: [Выделить]
  1. [CommandMethod("Scale2Fit")]
  2. public void Scale2Fit()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptEntityOptions peo = new PromptEntityOptions(
  9.         "\nВыберите растровое изображение: ");
  10.  
  11.     peo.SetRejectMessage("\nНеправильный выбор...");
  12.     peo.AddAllowedClass(typeof(RasterImage), false);
  13.  
  14.     PromptEntityResult per = ed.GetEntity(peo);
  15.  
  16.     if (per.Status != PromptStatus.OK)
  17.         return;
  18.  
  19.     double width = 50;
  20.     double height = 30;
  21.  
  22.     using (Transaction Tx =
  23.         db.TransactionManager.StartTransaction())
  24.     {
  25.         RasterImage image = Tx.GetObject(
  26.             per.ObjectId,
  27.             OpenMode.ForWrite)
  28.                 as RasterImage;
  29.  
  30.         Point3d origin = image.Orientation.Origin;
  31.  
  32.         double scaleX = width / image.Width;
  33.         double scaleY = height / image.Height;
  34.  
  35.         double[] coeffs = new double[]
  36.         {
  37.             scaleX, 0, 0, 0,
  38.             0, scaleY, 0, 0,
  39.             0, 0, 1, 0,
  40.             0, 0, 0, 1
  41.         };
  42.  
  43.         Matrix3d matrix = new Matrix3d(coeffs);
  44.  
  45.         image.TransformBy(matrix);
  46.  
  47.         // Сбрасываем начальную позицию
  48.         image.Orientation = new CoordinateSystem3d(
  49.             origin,
  50.             image.Orientation.Xaxis,
  51.             image.Orientation.Yaxis);
  52.  
  53.         Tx.Commit();
  54.     }
  55. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/05/how-to-scale-non-uniformly-a-raster-image-to-fit-a-given-area.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=481

Опубликовано 24.01.2014
Отредактировано 26.01.2014 в 07:50:03