Вставка растрового файла в AutoCAD при помощи ObjectARX
Внутри ObjectARX есть два класса, которые мы используем для представления изображений: один — AcDbRasterImage, а другой — AcDbRasterImageDef.
Объект AcDbRasterImage (объект изображения) работает с объектом AcDbRasterImageDef (объект определения изображения) для реализации растровых изображений внутри AutoCAD. Связь между этими двумя классами очень похожа на связь между объектом определения блока AutoCAD и объектом вставки блока.
Объект изображения — это объект AutoCAD с возможностью рисования и выбора, который помещает растровое изображение в пространство модели или листа в определенном месте и с определенной ориентацией. Объект изображения связан ровно с одним объектом определения изображения, которому он отправляет запросы на операции обработки изображения, необходимые для отображения и печати изображений. Поскольку объект определения изображения управляет всей информацией об изображении, его объект изображения относительно мал. Помимо местоположения и ориентации изображения, он содержит границу подрезки, параметры затухания изображения, контрастности и яркости, а также другие типичные свойства AcDbEntity, такие как слой и цвет.
- void InsertImage()
- {
- ACHAR* szName = _T("MyTest");
- ACHAR *fileName = _T("C:\\temp\\newImage.jpeg");
- AcGePoint3d org(10,10,0);
- AcDbDatabase *pDb =
- acdbHostApplicationServices()->workingDatabase();
- AcDbRasterImageDef* pImageDef = new AcDbRasterImageDef();
- Acad::ErrorStatus es = pImageDef->setSourceFileName(fileName);
- if(es != Acad::eOk)
- {
- delete pImageDef;
- return;
- }
- es = pImageDef->load();
- ASSERT(es == Acad::eOk);
- AcDbObjectId dictID = AcDbRasterImageDef::imageDictionary(pDb);
- if (dictID==AcDbObjectId::kNull)
- {
- es = AcDbRasterImageDef::createImageDictionary(pDb, dictID);
- if(es!= Acad::eOk)
- {
- delete pImageDef;
- ads_printf(_T("\nНе могу открыть словарь \n"));
- return;
- }
- }
- AcDbDictionary* pDict = NULL;
- es = acdbOpenObject((AcDbObject*&)pDict,
- dictID, AcDb::kForWrite);
- if(es != Acad::eOk)
- {
- delete pImageDef;
- ads_printf(_T("\nНе могу открыть словарь\n"));
- return;
- }
- BOOL bExist = pDict->has(szName);
- AcDbObjectId objID;
- if (!bExist)
- {
- pDict->setAt(szName, pImageDef, objID);
- }
- else
- {
- pDict->getAt(szName,
- (AcDbObject*&)pImageDef,AcDb::kForWrite);
- objID = pImageDef->objectId();
- }
- // Закрываем словарь и определение изображения.
- pDict->close();
- pImageDef->close();
- AcDbRasterImage* pImage = new AcDbRasterImage;
- es = pImage->setImageDefId(objID);
- if (es != Acad::eOk)
- {
- delete pImage;
- return;
- }
- AcDbObjectId modelId;
- modelId = acdbSymUtil()->blockModelSpaceId(pDb);
- AcDbBlockTableRecord *pBTRecord;
- acdbOpenAcDbObject((AcDbObject*&)pBTRecord,
- modelId, AcDb::kForWrite);
- es = pBTRecord->appendAcDbEntity(pImage);
- pBTRecord->close();
- AcDbObjectId entID = pImage->objectId();
- AcGePoint3d TempPoint3d(3.0, 0, 0);
- AcGeVector3d LowerRightVector = TempPoint3d.asVector();
- AcGePoint3d TempPoint3d2(0, 1.5, 0);
- AcGeVector3d OnPlaneVector = TempPoint3d2.asVector();
- if (pImage->setOrientation(org,
- LowerRightVector, OnPlaneVector) !=Adesk::kTrue)
- {
- ads_printf(_T("\nНе получилось установить ориентацию изображения."));
- pImage->close();
- return;
- }
- pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
- pImage->setDisplayOpt(AcDbRasterImage::kTransparent,
- Adesk::kTrue);
- AcDbObjectPointer<AcDbRasterImageDefReactor>
- rasterImageDefReactor;
- // Создаем его
- rasterImageDefReactor.create();
- // Устанавливаем владельца.
- es = rasterImageDefReactor->setOwnerId(pImage->objectId());
- // Если всё в порядке
- if (es == Acad::eOk)
- {
- AcDbObjectId defReactorId;
- // Присваиваем объекту objectId
- es = pDb->addAcDbObject(defReactorId,
- rasterImageDefReactor.object());
- // Если все в порядке
- if (es == Acad::eOk)
- {
- // Устанавливаем id реактора
- pImage->setReactorId(defReactorId);
- AcDbObjectPointer<AcDbRasterImageDef>
- rasterImagedef(pImage->imageDefId(),
- AcDb::kForWrite);
- // Если всё в порядке
- if (rasterImagedef.openStatus() == Acad::eOk)
- {
- rasterImagedef->addPersistentReactor(defReactorId);
- }
- }
- }
- pImage->close();
- }
Опубликовано 24.01.2022