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

29/05/2013

Получение координат контура подрезки

Вопрос:
Я могу установить контур подрезки при помощи метода AcadRasterImage.ClipBoundary, но как я могу получить координаты уже существующего контура подрезки? Я знаю, что если контур прямоугольный, то я могу получить граничный прямоугольник, ширину и высоту. А если контур подрезки имеет неправильную (непрямоугольную) форму, то я не могу найти ни одного метода, чтобы получить его координаты.

Решение:
Эквивалент метода из ObjectARX AcDbRasterImage::clipBoundary() не представлен в текущей модели ActiveX Automation.

Мы можем самостоятельно предоставить такой метод. Полный проект прилагается: ImgClipBoundary

Код - C++: [Выделить]
  1. STDMETHODIMP CClipBoundaryObj::GetImageClipBoundary(
  2.     VARIANT* pVarDblArray,
  3.     VARIANT acadImage)
  4. {
  5.     // TODO: Add your implementation code here
  6.     try
  7.     {
  8.         CComQIPtr<IAcadRasterImage>
  9.             pAcadImage(acadImage.punkVal);
  10.         if(!pAcadImage)
  11.             throw E_POINTER;
  12.         CComQIPtr<IAcadBaseObject>
  13.             pBaseObj(pAcadImage);
  14.         if(!pBaseObj)
  15.             throw E_POINTER;
  16.         AcDbObjectId id;
  17.         pBaseObj->GetObjectId(&id);
  18.         AcDbObjectPointer<AcDbRasterImage>
  19.             pImage(id, AcDb::kForRead);
  20.  
  21.         if(pImage.openStatus() != Acad::eOk)
  22.             throw E_UNEXPECTED;
  23.         AcGePoint2dArray array = pImage->clipBoundary();
  24.  
  25.         int len = array.length();
  26.         if(len == 0)
  27.             throw E_FAIL;
  28.  
  29.         AcGeMatrix3d mat;
  30.         pImage->getPixelToModelTransform(mat);
  31.         mat.inverse();
  32.         AcAxPoint2dArray pts;
  33.         for(int i=0; i<len; i++)
  34.         {
  35.             AcGePoint3d pt(array[i].x, array[i].y, 0);
  36.             pt.transformBy(mat);
  37.             pts.append(AcGePoint2d(pt.x, pt.y));
  38.         }
  39.         pts.setVariant(pVarDblArray);
  40.     }
  41.  
  42.     catch(const HRESULT h)
  43.     {
  44.         // for now
  45.         acutPrintf(_T("\nЧто-то не так."));
  46.         return h;
  47.     }
  48.  
  49.     return S_OK;
  50. }

Для использования этого способа:
1. Постройте приложенный проект и загрузите его в AutoCAD
2. Откройте VBA IDE
3. В меню Tools >> Reference: выберите ARX. Теперь вы можете увидеть еще одну библиотеку, доступную в списке:

4. Выполните следующий VBA-код. Он создаёт картину и делает её подрезку, а затем получает координаты контура подрезки при помощи метода из asdkImgClipBoundary.

 

Код - VBA: [Выделить]
  1.  
  2. Sub Example_ClipBoundary()
  3.       ' Этот пример добавляет растр в пространство модели.
  4.       ' Затем растр подрезается.
  5.       ' Этот пример использует файл "downtown.jpg",
  6.       ' который есть в каталоге прикрепления
  7.       ' Если у вас нет этого файла, или он находится по другому пути,
  8.       ' вставьте правильный путь и имя в переменную
  9.       ' imageName ниже.
  10.  
  11.       Dim insertionPoint(0 To 2) As Double
  12.       Dim scalefactor As Double
  13.       Dim rotationAngle As Double
  14.       Dim imageName As String
  15.       Dim rasterObj As AcadRasterImage
  16.       imageName = "C:\downtown.jpg"
  17.       insertionPoint(0) = 5#
  18.       insertionPoint(1) = 5#
  19.       insertionPoint(2) = 0#
  20.       scalefactor = 2#
  21.       rotationAngle = 0
  22.       On Error Resume Next
  23.       ' Вставляем растр в пространство модели
  24.       Set rasterObj = ThisDrawing.ModelSpace. _
  25.            AddRaster(imageName, insertionPoint, scalefactor, rotationAngle)
  26.       If Err.Description = "Filer error" Then
  27.       MsgBox imageName & " не может быть найден."
  28.       Exit Sub
  29.       End If
  30.       ZoomAll
  31.       MsgBox "Подрезать растр?", , "Пример ClipBoundary"
  32.       ' Создание контура подрезки из массива точек
  33.       Dim clipPoints(0 To 9) As Double
  34.       clipPoints(0) = 6: clipPoints(1) = 6.75
  35.       clipPoints(2) = 7: clipPoints(3) = 6
  36.       clipPoints(4) = 6: clipPoints(5) = 5
  37.       clipPoints(6) = 5: clipPoints(7) = 6
  38.       clipPoints(8) = 6: clipPoints(9) = 6.75
  39.       ' Подрезаем растр
  40.       rasterObj.ClipBoundary clipPoints
  41.       ' Разрешим показ контура подрезки
  42.       rasterObj.ClippingEnabled = True
  43.       ThisDrawing.Regen acActiveViewport
  44.       'MsgBox "Растр подрезан.", , "Пример ClipBoundary"
  45.       On Error GoTo 0
  46.       ' Получаем координаты контура подрезки
  47.       Dim xObj As asdkImgClipBoundaryLib.ClipBoundaryObj
  48.       Set xObj = ThisDrawing.Application. _
  49.          GetInterfaceObject("ImgClipBoundary.ClipBoundaryObj.1")
  50.       Dim boundary As Variant
  51.       xObj.GetImageClipBoundary boundary, rasterObj
  52. End Sub
  53.  

 

Источник: http://adndevblog.typepad.com/autocad/2013/02/get-image-clip-boundary-coordinates.html

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

Опубликовано 29.05.2013
Отредактировано 08.06.2013 в 01:15:30