bool imageAttach(ACHAR * fileName, ACHAR* szName, AcGePoint3d org, double dScale, double rotation, AcDbDatabase *pDb)
{
AcDbRasterImageDef* pImageDef = new AcDbRasterImageDef();
Acad::ErrorStatus es = pImageDef->setSourceFileName(fileName);
if (es != Acad::eOk)
{
delete pImageDef;
return false;
}
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("\nCould not create dictionary\n"));
return false;
}
}
AcDbDictionary* pDict = NULL;
es = acdbOpenObject((AcDbObject*&)pDict,
dictID, AcDb::kForWrite);
if (es != Acad::eOk)
{
delete pImageDef;
ads_printf(_T("\nCould not open dictionary\n"));
return false;
}
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();
}
// close Dictionary and Definition.
pDict->close();
pImageDef->close();
AcDbRasterImage* pImage = new AcDbRasterImage;
es = pImage->setImageDefId(objID);
if (es != Acad::eOk)
{
delete pImage;
return false;
}
AcDbObjectId modelId;
modelId = acdbSymUtil()->blockModelSpaceId(pDb);
AcDbBlockTableRecord *pBTRecord;
acdbOpenAcDbObject((AcDbObject*&)pBTRecord,
modelId, AcDb::kForWrite);
es = pBTRecord->appendAcDbEntity(pImage);
pBTRecord->close();
AcGeVector2d vec2d = pImage->imageSize();
AcDbObjectId entID = pImage->objectId();
AcGePoint3d TempPoint3d(vec2d.x / 3.8462*dScale, 0, 0);
AcGeVector3d LowerRightVector = TempPoint3d.asVector();
AcGePoint3d TempPoint3d2(0, vec2d.y / 3.8462*dScale, 0);
AcGeVector3d OnPlaneVector = TempPoint3d2.asVector();
if (pImage->setOrientation(org,
LowerRightVector, OnPlaneVector) != Adesk::kTrue)
{
ads_printf(_T("\nSet Orientation failed."));
pImage->close();
return false;
}
pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
pImage->setDisplayOpt(AcDbRasterImage::kTransparent,
Adesk::kTrue);
AcDbObjectPointer<AcDbRasterImageDefReactor>
rasterImageDefReactor;
// new it
rasterImageDefReactor.create();
// Set the entity to be its owner.
es = rasterImageDefReactor->setOwnerId(pImage->objectId());
// if ok
if (es == Acad::eOk)
{
AcDbObjectId defReactorId;
// assign the object an objectId
es = pDb->addAcDbObject(defReactorId,
rasterImageDefReactor.object());
// if ok
if (es == Acad::eOk)
{
// set the image reactor id
pImage->setReactorId(defReactorId);
AcDbObjectPointer<AcDbRasterImageDef>
rasterImagedef(pImage->imageDefId(),
AcDb::kForWrite);
// if ok
if (rasterImagedef.openStatus() == Acad::eOk)
{
rasterImagedef->addPersistentReactor(defReactorId);
}
}
}
AcDbObjectId imageId = pImage->objectId();
pImage->close();
Rotate(imageId, org, rotation);
return true;
}