Получение координат контура подрезки
Вопрос:
Я могу установить контур подрезки при помощи метода AcadRasterImage.ClipBoundary, но как я могу получить координаты уже существующего контура подрезки? Я знаю, что если контур прямоугольный, то я могу получить граничный прямоугольник, ширину и высоту. А если контур подрезки имеет неправильную (непрямоугольную) форму, то я не могу найти ни одного метода, чтобы получить его координаты.
Решение:
Эквивалент метода из ObjectARX AcDbRasterImage::clipBoundary() не представлен в текущей модели ActiveX Automation.
Мы можем самостоятельно предоставить такой метод. Полный проект прилагается: ImgClipBoundary
- STDMETHODIMP CClipBoundaryObj::GetImageClipBoundary(
- VARIANT* pVarDblArray,
- VARIANT acadImage)
- {
- // TODO: Add your implementation code here
- try
- {
- CComQIPtr<IAcadRasterImage>
- pAcadImage(acadImage.punkVal);
- if(!pAcadImage)
- throw E_POINTER;
- CComQIPtr<IAcadBaseObject>
- pBaseObj(pAcadImage);
- if(!pBaseObj)
- throw E_POINTER;
- AcDbObjectId id;
- pBaseObj->GetObjectId(&id);
- AcDbObjectPointer<AcDbRasterImage>
- pImage(id, AcDb::kForRead);
- if(pImage.openStatus() != Acad::eOk)
- throw E_UNEXPECTED;
- AcGePoint2dArray array = pImage->clipBoundary();
- int len = array.length();
- if(len == 0)
- throw E_FAIL;
- AcGeMatrix3d mat;
- pImage->getPixelToModelTransform(mat);
- mat.inverse();
- AcAxPoint2dArray pts;
- for(int i=0; i<len; i++)
- {
- AcGePoint3d pt(array[i].x, array[i].y, 0);
- pt.transformBy(mat);
- pts.append(AcGePoint2d(pt.x, pt.y));
- }
- pts.setVariant(pVarDblArray);
- }
- catch(const HRESULT h)
- {
- // for now
- acutPrintf(_T("\nЧто-то не так."));
- return h;
- }
- return S_OK;
- }
Для использования этого способа:
1. Постройте приложенный проект и загрузите его в AutoCAD
2. Откройте VBA IDE
3. В меню Tools >> Reference: выберите ARX. Теперь вы можете увидеть еще одну библиотеку, доступную в списке:
4. Выполните следующий VBA-код. Он создаёт картину и делает её подрезку, а затем получает координаты контура подрезки при помощи метода из asdkImgClipBoundary.
- Sub Example_ClipBoundary()
- ' Этот пример добавляет растр в пространство модели.
- ' Затем растр подрезается.
- ' Этот пример использует файл "downtown.jpg",
- ' который есть в каталоге прикрепления
- ' Если у вас нет этого файла, или он находится по другому пути,
- ' вставьте правильный путь и имя в переменную
- ' imageName ниже.
- Dim insertionPoint(0 To 2) As Double
- Dim scalefactor As Double
- Dim rotationAngle As Double
- Dim imageName As String
- Dim rasterObj As AcadRasterImage
- imageName = "C:\downtown.jpg"
- insertionPoint(0) = 5#
- insertionPoint(1) = 5#
- insertionPoint(2) = 0#
- scalefactor = 2#
- rotationAngle = 0
- On Error Resume Next
- ' Вставляем растр в пространство модели
- Set rasterObj = ThisDrawing.ModelSpace. _
- AddRaster(imageName, insertionPoint, scalefactor, rotationAngle)
- If Err.Description = "Filer error" Then
- MsgBox imageName & " не может быть найден."
- Exit Sub
- End If
- ZoomAll
- MsgBox "Подрезать растр?", , "Пример ClipBoundary"
- ' Создание контура подрезки из массива точек
- Dim clipPoints(0 To 9) As Double
- clipPoints(0) = 6: clipPoints(1) = 6.75
- clipPoints(2) = 7: clipPoints(3) = 6
- clipPoints(4) = 6: clipPoints(5) = 5
- clipPoints(6) = 5: clipPoints(7) = 6
- clipPoints(8) = 6: clipPoints(9) = 6.75
- ' Подрезаем растр
- rasterObj.ClipBoundary clipPoints
- ' Разрешим показ контура подрезки
- rasterObj.ClippingEnabled = True
- ThisDrawing.Regen acActiveViewport
- 'MsgBox "Растр подрезан.", , "Пример ClipBoundary"
- On Error GoTo 0
- ' Получаем координаты контура подрезки
- Dim xObj As asdkImgClipBoundaryLib.ClipBoundaryObj
- Set xObj = ThisDrawing.Application. _
- GetInterfaceObject("ImgClipBoundary.ClipBoundaryObj.1")
- Dim boundary As Variant
- xObj.GetImageClipBoundary boundary, rasterObj
- End Sub
Источник: http://adndevblog.typepad.com/autocad/2013/02/get-image-clip-boundary-coordinates.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=70.0
Отредактировано 08.06.2013 в 01:15:30