Тема: Получение списка координат подрезанного (Clip) растра

Как получить список координат подрезанного (Clipом) растра?
У обьекта AcadRasterImage нет таких свойств?
Есть только метод ClipBoundary устанавливающий clip.
Но как получить координаты уже поджрезанного растра???

Re: Получение списка координат подрезанного (Clip) растра

Если я правильно понял вопрос, то где-то так:

void GetImageClip(void)
{
  Acad::ErrorStatus es;
  ads_name en; ads_point p;
  if (acedEntSel("\nSelect clipped IMAGE: ", en, p) != RTNORM) {
    return;
  }
  AcDbObjectId objId;
  if (acdbGetObjectId(objId,en) != Acad::eOk) return;
  AcDbObjectPointer<AcDbRasterImage> pEnt(objId,AcDb::kForRead);
  if ((es = pEnt.openStatus()) == Acad::eOk) {
    if (pEnt->isClipped()) {
      AcGePoint2dArray clipPixs = pEnt->clipBoundary();
      AcGeMatrix3d mTrans;  pEnt->getPixelToModelTransform(mTrans);
      acutPrintf("\nClip boundary has %d vertices:", clipPixs.length());
      for (int i=0; i < clipPixs.length(); i++) {
        AcGePoint3d p(clipPixs[i][X],clipPixs[i][Y],0);
        p.transformBy(mTrans);
        acutPrintf("\n Vertex N%d=(%g %g %g)",i,p[X],p[Y],p[Z]);
      }
    } else {
      acutPrintf("\nIMAGE has not clip boundary!");
    }
  } else {
    acutPrintf("\nError pEnt.openStatus(): %s",acadErrorStatusText(es));
  }
  return;
}

Обрати внимание, что первая и последняя вершины совпадают.

Re: Получение списка координат подрезанного (Clip) растра

Еще один вариант:

void GetImageVertexes(void)
{
  Acad::ErrorStatus es;
  ads_name en; ads_point p;
  if (acedEntSel("\nSelect clipped IMAGE: ", en, p) != RTNORM) {
    return;
  }
  AcDbObjectId objId;
  if (acdbGetObjectId(objId,en) != Acad::eOk) return;
  AcDbObjectPointer<AcDbRasterImage> pEnt(objId,AcDb::kForRead);
  if ((es = pEnt.openStatus()) == Acad::eOk) {
    AcGePoint3dArray clipVerts;
    if ((es = pEnt->getVertices(clipVerts)) != Acad::eOk) {
      acutPrintf("\nError pEnt->getVertices(clipVerts): %s",acadErrorStatusText(es));
      return;
    }
    acutPrintf("\nClip boundary has %d vertices:", clipVerts.length());
    for (int i=0; i < clipVerts.length(); i++) {
      acutPrintf("\n Vertex N%d=(%g %g %g)",i,clipVerts[i][X],clipVerts[i][Y],clipVerts[i][Z]);
    }
  } else {
    acutPrintf("\nError pEnt.openStatus(): %s",acadErrorStatusText(es));
  }
  return;
}

Этот вариант вернет 4 вершины IMAGE даже если нет Clip boundary или все вершины Clip boundary, если она есть.

Re: Получение списка координат подрезанного (Clip) растра

Ну и напоследок функция, которая позволяет по выбранной полилинии выполнить обрезку растра:

void SetImageClip(void)
{
  Acad::ErrorStatus es;
  ads_name en; ads_point p;
  if (acedEntSel("\nSelect IMAGE: ", en, p) != RTNORM) {
    return;
  }
  AcDbObjectId objImageid;
  if (acdbGetObjectId(objImageid,en) != Acad::eOk) return;
  if (acedEntSel("\nSelect Polyline as clip boundary : ", en, p) != RTNORM) {
    return;
  }
  AcDbObjectId objPlineid;
  if (acdbGetObjectId(objPlineid,en) != Acad::eOk) return;
  AcDbObjectPointer<AcDbPolyline> pPline(objPlineid,AcDb::kForRead);
  if ((es = pPline.openStatus()) != Acad::eOk) {
    acutPrintf("\nError pPline.openStatus(): %s",acadErrorStatusText(es));
    return;
  }
  AcGePoint3dArray pClip;
  pClip.setLogicalLength(pPline->numVerts());
  for (int nVert=0; nVert < pPline->numVerts(); nVert++) {
    pPline->getPointAt(nVert,pClip[nVert]);
  }
  AcDbObjectPointer<AcDbRasterImage> pEnt(objImageid,AcDb::kForWrite);
  if ((es = pEnt.openStatus()) == Acad::eOk) {
    AcGeMatrix3d mTrans;  pEnt->getPixelToModelTransform(mTrans);
    mTrans.invert();
    AcGePoint2dArray pClip2D; pClip2D.setLogicalLength(pClip.length());
    for (int nVert=0; nVert < pClip.length(); nVert++) {
      pClip2D[nVert] = asPnt2d(asDblArray(pClip[nVert].transformBy(mTrans)));
    }
    if (pClip[0] != pClip[pClip.length()-1]) {
      pClip2D.append(pClip2D[0]);
    }
    AcGeVector2d iSize = pEnt->imageSize();
    // All boundary points must be inside image!
    for (int i=0; i < pClip2D.length(); i++) {
      if (pClip2D[i][X] < 0.0 || iSize[X] < pClip2D[i][X] ||
          pClip2D[i][Y] < 0.0 || iSize[Y] < pClip2D[i][Y]) {
       acutPrintf("\nInvalid clip boundary!!!");
       return;
      }
    }
    pEnt->setClipBoundary(AcDbRasterImage::kPoly,pClip2D);
  } else {
    acutPrintf("\nError pEnt.openStatus(): %s",acadErrorStatusText(es));
  }
  return;
}

Re: Получение списка координат подрезанного (Clip) растра

А возможно ли получить координаты обрезанного раcтра в Delphi? Подскажите как это сделать?

Re: Получение списка координат подрезанного (Clip) растра

Пытался сделать по аналогии:
RasterImage:IAcadRasterImage;
Boundry:OleVariant;
....
Boundry:=VarArrayCreate([0,9],VarDouble);
Boundry[0]:=1;
Boundry[1]:=2;
Boundry[2]:=2;
Boundry[3]:=2;
Boundry[4]:=2;
Boundry[5]:=1;
Boundry[6]:=1;
Boundry[7]:=1;
Boundry[8]:=1;
Boundry[9]:=2;
....
   //AcDbObjectPointer<AcDbRasterImage> pEnt(objId,AcDb::kForRead);
   //if (pEnt->isClipped()) {
   //AcGePoint2dArray clipPixs = pEnt->clipBoundary();
   //AcGeMatrix3d mTrans;  pEnt->getPixelToModelTransform(mTrans);
но
   RasterImage.ClipBoundary(Boundry); - сама обрезка работает прекрасно
   Boundry:=RasterImage.ClipBoundary(); - выводит ошибку not enought actual parameters
   Boundry:=RasterImage.ClipBoundary(Boundry); - тоже не работает

AcGePoint2dArray - такого типа данных вообще не нашел в AutoCAD.tlb

Помогите пожалуста, как из delphi получить координаты обрезки???

Re: Получение списка координат подрезанного (Clip) растра

свойства isClipped() у IAcadRasterImage тоже нет!

Re: Получение списка координат подрезанного (Clip) растра

AlexSAPR пишет:

AcGePoint2dArray - такого типа данных вообще не нашел в AutoCAD.tlb

Не путай ObjectARX и ActiveX-модель AutoCAD. В ActiveX такого класса нет и быть не может.
Похоже средствами ActiveX (и соответственно в Delphi) получить контур подрезки нельзя.

Re: Получение списка координат подрезанного (Clip) растра

Спасибо за ответ. Так получается что нет никаких способов(переменная...), что бы сделать это из delphi?