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

24/01/2022

Вставка растрового файла в AutoCAD при помощи ObjectARX

Внутри ObjectARX есть два класса, которые мы используем для представления изображений: один — AcDbRasterImage, а другой — AcDbRasterImageDef.

Объект AcDbRasterImage (объект изображения) работает с объектом AcDbRasterImageDef (объект определения изображения) для реализации растровых изображений внутри AutoCAD. Связь между этими двумя классами очень похожа на связь между объектом определения блока AutoCAD и объектом вставки блока.

Объект изображения — это объект AutoCAD с возможностью рисования и выбора, который помещает растровое изображение в пространство модели или листа в определенном месте и с определенной ориентацией. Объект изображения связан ровно с одним объектом определения изображения, которому он отправляет запросы на операции обработки изображения, необходимые для отображения и печати изображений. Поскольку объект определения изображения управляет всей информацией об изображении, его объект изображения относительно мал. Помимо местоположения и ориентации изображения, он содержит границу подрезки, параметры затухания изображения, контрастности и яркости, а также другие типичные свойства AcDbEntity, такие как слой и цвет.

Код - C++: [Выделить]
  1. void InsertImage()
  2. {
  3.     ACHAR* szName = _T("MyTest");
  4.     ACHAR *fileName = _T("C:\\temp\\newImage.jpeg");
  5.     AcGePoint3d org(10,10,0);
  6.  
  7.     AcDbDatabase *pDb =
  8.       acdbHostApplicationServices()->workingDatabase();
  9.  
  10.      AcDbRasterImageDef* pImageDef = new AcDbRasterImageDef();
  11.      Acad::ErrorStatus es = pImageDef->setSourceFileName(fileName);
  12.      if(es != Acad::eOk)
  13.      {
  14.           delete pImageDef;
  15.           return;
  16.      }
  17.      es = pImageDef->load();
  18.      ASSERT(es == Acad::eOk);
  19.      AcDbObjectId dictID = AcDbRasterImageDef::imageDictionary(pDb);
  20.  
  21.      if (dictID==AcDbObjectId::kNull)
  22.      {
  23.          es = AcDbRasterImageDef::createImageDictionary(pDb, dictID);
  24.          if(es!= Acad::eOk)
  25.          {
  26.               delete pImageDef;
  27.               ads_printf(_T("\nНе могу открыть словарь \n"));
  28.               return;
  29.          }
  30.      }
  31.      AcDbDictionary* pDict = NULL;
  32.      es = acdbOpenObject((AcDbObject*&)pDict,
  33.                                             dictID, AcDb::kForWrite);
  34.      if(es != Acad::eOk)
  35.      {
  36.           delete pImageDef;
  37.           ads_printf(_T("\nНе могу открыть словарь\n"));
  38.           return;
  39.      }
  40.      BOOL bExist = pDict->has(szName);
  41.      AcDbObjectId objID;
  42.      if (!bExist)
  43.      {
  44.           pDict->setAt(szName, pImageDef, objID);
  45.      }
  46.      else
  47.      {
  48.           pDict->getAt(szName,
  49.                     (AcDbObject*&)pImageDef,AcDb::kForWrite);
  50.           objID = pImageDef->objectId();
  51.      }
  52.      // Закрываем словарь и определение изображения.
  53.      pDict->close();
  54.      pImageDef->close();
  55.  
  56.      AcDbRasterImage* pImage = new AcDbRasterImage;
  57.      es = pImage->setImageDefId(objID);
  58.      if (es != Acad::eOk)
  59.      {
  60.           delete pImage;
  61.           return;
  62.      }
  63.  
  64.     AcDbObjectId modelId;
  65.     modelId = acdbSymUtil()->blockModelSpaceId(pDb);
  66.  
  67.     AcDbBlockTableRecord *pBTRecord;
  68.     acdbOpenAcDbObject((AcDbObject*&)pBTRecord,
  69.                                     modelId, AcDb::kForWrite);
  70.  
  71.      es = pBTRecord->appendAcDbEntity(pImage);
  72.  
  73.      pBTRecord->close();
  74.      AcDbObjectId entID = pImage->objectId();
  75.      AcGePoint3d TempPoint3d(3.0, 0, 0);
  76.      AcGeVector3d LowerRightVector = TempPoint3d.asVector();
  77.      AcGePoint3d TempPoint3d2(0, 1.5, 0);
  78.      AcGeVector3d OnPlaneVector = TempPoint3d2.asVector();
  79.      if (pImage->setOrientation(org,
  80.                 LowerRightVector, OnPlaneVector) !=Adesk::kTrue)
  81.      {
  82.           ads_printf(_T("\nНе получилось установить ориентацию изображения."));
  83.           pImage->close();
  84.           return;
  85.      }
  86.      pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
  87.      pImage->setDisplayOpt(AcDbRasterImage::kTransparent,
  88.                                                     Adesk::kTrue);
  89.  
  90.     AcDbObjectPointer<AcDbRasterImageDefReactor>
  91.                                             rasterImageDefReactor;
  92.  
  93.     // Создаем его
  94.     rasterImageDefReactor.create();
  95.  
  96.     // Устанавливаем владельца.
  97.     es = rasterImageDefReactor->setOwnerId(pImage->objectId());
  98.  
  99.     // Если всё в порядке
  100.     if (es == Acad::eOk)
  101.     {
  102.         AcDbObjectId defReactorId;
  103.         // Присваиваем объекту objectId
  104.         es = pDb->addAcDbObject(defReactorId,
  105.                             rasterImageDefReactor.object());
  106.  
  107.         // Если все в порядке
  108.         if (es == Acad::eOk)
  109.         {
  110.             // Устанавливаем id реактора
  111.             pImage->setReactorId(defReactorId);
  112.  
  113.             AcDbObjectPointer<AcDbRasterImageDef>
  114.                 rasterImagedef(pImage->imageDefId(),
  115.                                             AcDb::kForWrite);
  116.  
  117.             // Если всё в порядке
  118.             if (rasterImagedef.openStatus() == Acad::eOk)
  119.             {
  120.                 rasterImagedef->addPersistentReactor(defReactorId);
  121.             }
  122.         }
  123.     }
  124.  
  125.      pImage->close();
  126. }

 

Источник: https://adndevblog.typepad.com/autocad/2012/08/inserting-an-image-file-into-autocad-using-objectarx.html

Автор перевода: Александр Ривилис
Опубликовано 24.01.2022