admin 发表于 2024-3-14 20:13:33

[每日一码] ARX插入图像的代码

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("\nCould not create dictionary\n"));
            return;
         }
   }
   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;
   }
   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;
   }

    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("\nSet Orientation failed."));
          pImage->close();
          return;
   }
   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);
            }
      }
    }

   pImage->close();
}
页: [1]
查看完整版本: [每日一码] ARX插入图像的代码