找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 123|回复: 0

ObjectArx C++ 附加PDF底图参照

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-5-2 22:31:04 | 显示全部楼层 |阅读模式
  1. #include "adsmigr.h"
  2. #include "acutmigr.h"
  3. #include "dbapserv.h"
  4. #include "afxstr.h"
  5. #include "boost/filesystem.hpp"
  6. #include "acdocman.h"
  7. #include "dbunderlaydef.h"
  8. #include "dbunderlayref.h"
  9. #include "dbobjptr.h"
  10. void attachPdf()
  11. {   
  12.     CString sPdfPath;
  13.     CString sPdfName, sPassword;
  14.     int nPage;
  15.         AcGePoint3d ptInsert;
  16.         double dScale, dRotate;
  17.        
  18.         if (sPdfName.IsEmpty())
  19.         {
  20.                 acutPrintf(采用T("\n PDF参照名称为空"));
  21.                 return;
  22.         }
  23.         if (!boost::filesystem::exists(sPdfPath.GetString()))
  24.         {
  25.                 acutPrintf(采用T("\n PDF路径: %s 不存在"), sPdfPath);
  26.                 return;
  27.         }
  28.         AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  29.     acDocManager->lockDocument(curDoc(), AcAp::kWrite, NULL, NULL, false);
  30.         // PDF字典
  31.         CString sPdfDict = AcDbUnderlayDefinition::dictionaryKey(AcDbPdfDefinition::desc());
  32.         AcDbObjectId pdfDictId = getDictionaryId(pDb, sPdfDict, true);
  33.         AcDbObjectId pdfDefId = AcDbObjectId::kNull;
  34.         CreatePDFDefinition(pdfDefId, pDb, pdfDictId, sPdfPath, sPdfName, nPage, sPassword);
  35.         CreatePdfReference(pDb, pdfDefId, ptInsert, dScale, dRotate);
  36. }
  37. AcDbObjectId getDictionaryId(AcDbDatabase* pDb, const CString& sDicName, bool bCreate = true)
  38. {
  39.         AcDbObjectId dictId = AcDbObjectId::kNull;
  40.         if (!pDb)
  41.                 return dictId;
  42.         AcDbDictionary* pNamedObj;
  43.         Acad::ErrorStatus es = pDb->getNamedObjectsDictionary(pNamedObj, AcDb::kForRead);
  44.         if (es != Acad::eOk)
  45.                 return dictId;
  46.         es = pNamedObj->getAt(sDicName, dictId);
  47.         if (es == Acad::eKeyNotFound && bCreate)
  48.         {
  49.                 AcDbDictionary* pDictary = new AcDbDictionary;
  50.                 pNamedObj->setAt(sDicName, pDictary, dictId);
  51.         }
  52.         pNamedObj->close();
  53.         return dictId;
  54. }
  55. void CreatePDFDefinition(AcDbObjectId& pdfDefId, AcDbDatabase* pDb, const AcDbObjectId& pdfDictId, const CString& sPdfPath, const CString& sPdfName, int nPage, const CString& sPassword)
  56. {
  57.         if (!pDb)
  58.                 return;
  59.         AcDbDictionaryPointer pPdfDictionary(pdfDictId, AcDb::kForWrite);
  60.         if (pPdfDictionary.openStatus() != Acad::eOk)
  61.         {
  62.                 acutPrintf(采用T("\n 打开字典失败"));
  63.                 return;
  64.         }
  65.         // PDF定义对象
  66.         AcDbPdfDefinition* pPdfDef = new AcDbPdfDefinition();
  67.         Acad::ErrorStatus es = pPdfDef->setSourceFileName(sPdfPath);
  68.         if (es != Acad::eOk)
  69.         {
  70.                 delete pPdfDef;
  71.                 acutPrintf(采用T("\n 设置PDF路径失败"));
  72.                 return;
  73.         }
  74.         CString sPage;
  75.         sPage.Format(采用T("%d"), nPage);
  76.         pPdfDef->setItemName(sPage);// 设置PDF页数
  77.         es = pPdfDef->load(sPassword);
  78.         if (es != Acad::eOk)
  79.         {
  80.                 delete pPdfDef;
  81.                 acutPrintf(采用T("\n 加载PDF指定页失败"));
  82.                 return;
  83.         }
  84.         // 创建PDF项
  85.         CString sKey;
  86.         sKey.Format(采用T("%s-%s"), sPdfName, sPage);
  87.         AcDbObjectId pdfDefId = AcDbObjectId::kNull;
  88.         if (!pPdfDictionary->has(sKey))
  89.                 pPdfDictionary->setAt(sKey, pPdfDef, pdfDefId);
  90.         else
  91.         {
  92.                 pPdfDictionary->getAt(sKey, (AcDbObject*&)pPdfDef, AcDb::kForWrite);
  93.                 pdfDefId = pPdfDef->objectId();
  94.         }
  95.         pPdfDictionary.close();
  96.         pPdfDef->close();
  97. }
  98. void CreatePdfReference(AcDbDatabase* pDb, const AcDbObjectId& pdfDefId, const AcGePoint3d& ptInsert, double dScale, double dRotate)
  99. {
  100.         if (!pDb)
  101.                 return;
  102.         // PDF引用
  103.         AcDbPdfReference* pPdfReference = new AcDbPdfReference;
  104.         pPdfReference->setDefinitionId(pdfDefId);
  105.         pPdfReference->setPosition(ptInsert);
  106.         pPdfReference->setScaleFactors(AcGeScale3d(dScale));
  107.         pPdfReference->setRotation(dRotate);
  108.         pPdfReference->setDatabaseDefaults(pDb);
  109.         pPdfReference->setFade(25);                                // 设置淡入度
  110.         pPdfReference->setContrast(88);                        // 设置对比度
  111.         pPdfReference->setIsMonochrome(true);        // 设置单色
  112.         AcDbObjectPointer<AcDbBlockTableRecord> pRec(pDb->currentSpaceId(), AcDb::kForWrite);
  113.         if (pRec.openStatus() != Acad::eOk)
  114.         {
  115.                 delete pPdfReference;
  116.                 return;
  117.         }
  118.         AcDbObjectId pdfReferId = AcDbObjectId::kNull;
  119.         Acad::ErrorStatus es = pRec->appendAcDbEntity(pdfReferId, pPdfReference);
  120.         if (es != Acad::eOk)
  121.         {
  122.                 pRec->close();
  123.                 delete pPdfReference;
  124.                 return;
  125.         }
  126.         pRec->close();
  127.         pPdfReference->close();
  128.         return;
  129. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 17:29 , Processed in 0.116857 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表