天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 131|回复: 7

[ObjectARX]-在图形数据库之间传递数据 Wblock

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-5-4 11:17:37 | 显示全部楼层 |阅读模式
  1. AcDbObjectId CBlockUtil::CopyBlockDefFromOtherDwg(const TCHAR* fileName,
  2.         const TCHAR* blkDefName)
  3. {
  4.         AcDbObjectId blockRefId = AcDbObjectId::kNull;
  5.                                 //AcDbObjectId :: kNull表示当前DWG中不存在对象(图层)
  6.         //使用采用SH采用DENYNO参数打开图形(只读打开),允许其他用户读写文件
  7.         AcDbDatabase* pSourceDwg = new AcDbDatabase(false);
  8.         Acad::ErrorStatus es = pSourceDwg->readDwgFile(fileName,
  9.                 static采用cast<AcDbDatabase::OpenMode>(采用SH采用DENYNO));
  10.         if (es != Acad::eOk)
  11.         {
  12.                 delete pSourceDwg;
  13.                 pSourceDwg = NULL;
  14.                 acutPrintf(TEXT("\n读入dwg图形错误,图形名称:%s"), fileName);
  15.                 return blockRefId;
  16.         }
  17.         //打开外部图形数据库的块表,寻找给定名称的块表记录
  18.         AcDbBlockTable* pBlkTable = NULL;
  19.         es = pSourceDwg->getBlockTable(pBlkTable, AcDb::kForRead);
  20.                          //以只读模式打开数据库的块表,pBlkTable获得块表地址
  21.         assert(es == Acad::eOk);
  22.         bool bRet = false;
  23.         if (pBlkTable->has(blkDefName))  //不存在指定的图块
  24.         {
  25.                 AcDbObjectId destBlkDefId; //指定图块的块表记录Id
  26.                 es = pBlkTable->getAt(blkDefName, destBlkDefId);
  27.                 //把指定的图块输出到一个临时的图形数据库
  28.                 AcDbDatabase *pTempDb = NULL;  //注意:这里千万不能new
  29.                 es = pSourceDwg->wblock(pTempDb, destBlkDefId);//创建一个新的数据库对象,pTempDb指向它
  30.                 assert(es == Acad::eOk);
  31.                 //把临时图形数据库作为插入块插入到当前dwg
  32.                 AcDbDatabase* pCurDb = acdbHostApplicationServices()->workingDatabase();
  33.                 es = pCurDb->insert(blockRefId, blkDefName, pTempDb);//由pDb指向的数据库中的所有
  34.             //模型空间实体都被复制到新的块表记录中,新的块表记录名称为blkDefName,Id为blockRefId
  35.                 assert(es == Acad::eOk);
  36.                 delete pTempDb;
  37.                 pTempDb = NULL;
  38.         }
  39.         else
  40.         {
  41.                 acutPrintf(TEXT("\n给定的DWG文件中,不存在指定名称的块表记录."));
  42.         }
  43.         pBlkTable->close();
  44.         delete pSourceDwg;
  45.         pSourceDwg = NULL;
  46.         return blockRefId;
  47. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:17:52 | 显示全部楼层
  1.    AcDbObjectId CBlockUtil::InsertDwgBlockDef(const TCHAR* dwgFileName,
  2.         const TCHAR* blkName, bool bOverwriteIfExist, AcDbDatabase *pDb)
  3. {
  4.         //是否包含指定名称的块定义
  5.         AcDbObjectId blkDefId = GetBlkDefId(blkName, pDb);
  6.         if (blkDefId.isNull() || bOverwriteIfExist)
  7.         {
  8.                 if (采用taccess(dwgFileName, 0) != -1)//如果指定的文件不存在,返回-1
  9.                 {
  10.                         AcDbDatabase *pBlkDb = new AcDbDatabase(false);
  11.                         Acad::ErrorStatus es = pBlkDb->readDwgFile(dwgFileName,
  12.                                               static采用cast<AcDbDatabase::OpenMode>(采用SH采用DENYNO));
  13.                         if (es == Acad::eOk)
  14.                         {
  15.                                 es = pDb->insert(blkDefId, blkName, pBlkDb);//在执行此insert函数的数据库中
  16.                                               //创建新的块表记录;由pBlkDb指向的数据库中的所有模型空间实体都
  17.                                               //被复制到新的块表记录中,名称为blkName,Id为blkDefId
  18.                                 if (es != Acad::eOk)
  19.                                 {
  20.                                         CString strMsg;
  21.                                         strMsg.Format(TEXT("CBlockUtil::InsertDwgBlockDef函数,insert失败:%d."),
  22.                                                 (int)es);
  23.                                         AfxMessageBox(strMsg);
  24.                                 }
  25.                         }
  26.                         else
  27.                         {
  28.                                 CString strMsg;
  29.                                 strMsg.Format(TEXT("CBlockUtil::InsertDwgBlockDef函数,readDwg File失败:%d."),
  30.                                         (int)es);
  31.                                 AfxMessageBox(strMsg);
  32.                         }
  33.                         delete pBlkDb;
  34.                 }
  35.                 else
  36.                 {
  37.                         AfxMessageBox(TEXT("CBlockUtil::InsertDwgBlockDef函数,未找到指定的图块文件."));
  38.                 }
  39.         }
  40.         return blkDefId;
  41. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:02 | 显示全部楼层
  1. // 获得指定名称的块定义
  2. AcDbObjectId CBlockUtil::GetBlkDefId(const TCHAR* blkDefName, AcDbDatabase *pDb)
  3. {
  4.         AcDbBlockTable* pBlockTable = NULL;
  5.         Acad::ErrorStatus es = pDb->getBlockTable(pBlockTable, AcDb::kForRead);
  6.         AcDbObjectId blkDefId;
  7.         es = pBlockTable->getAt(blkDefName, blkDefId);
  8.         pBlockTable->close();
  9.         if (es == Acad::eOk)
  10.         {
  11.                 return blkDefId;
  12.         }
  13.         else
  14.         {
  15.                 return AcDbObjectId::kNull;
  16.         }
  17. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:11 | 显示全部楼层
  1. static void AAAMyGroupInsertBlkRefFromOtherDwg() {
  2.                 CString fileName = TEXT("C:\\'包含图块.dwg");
  3.                 if (采用taccess(fileName, 0) != -1)
  4.                 {
  5.                         AcDbObjectId blkDefId = CBlockUtil::CopyBlockDefFromOtherDwg(fileName,
  6.                                 TEXT("测试图块"));
  7.                         if (blkDefId.isValid())
  8.                         {
  9.                                 CBlockUtil::InsertBlockRef(blkDefId, AcGePoint3d(100, 100, 0), 1, 0);
  10.                         }
  11.                 }
  12.                 else
  13.                 {
  14.                         acutPrintf(TEXT("\n指定的图形文件不存在"));
  15.                 }
  16.         }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:22 | 显示全部楼层
  1. // 插入块参照
  2. AcDbObjectId CBlockUtil::InsertBlockRef(AcDbObjectId blkDefId, const AcGePoint3d &insertPoint, double scale,
  3.         double rotation)
  4. {
  5.         // 设置图块的插入点、旋转角度、比例等等
  6.         AcDbBlockReference *pBlkRef = new AcDbBlockReference(insertPoint, blkDefId);
  7.         pBlkRef->setRotation(rotation);
  8.         SetScaleFactor(pBlkRef, scale);
  9.         // 把新建的图块参照实体加入到新建的块表记录中,并取得插入图块的实体Id,用于返回值
  10.         return CDwgDatabaseUtil::PostToModelSpace(pBlkRef);
  11. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:31 | 显示全部楼层
  1. // 修改块参照的插入比例
  2. void CBlockUtil::SetScaleFactor( AcDbBlockReference *pBlkRef, double scale )
  3. {
  4.         assert (pBlkRef);
  5.        
  6.         AcGeScale3d geScale(scale, scale, scale);
  7.         pBlkRef->setScaleFactors(geScale);
  8. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:46 | 显示全部楼层
  1. AcDbObjectId CDwgDatabaseUtil::PostToModelSpace(AcDbEntity *pEnt, AcDbDatabase *pDb)
  2. {
  3.         // 检查输入参数的有效性
  4.         assert(pEnt);                // 等效于assert (pEnt != NULL);
  5.                                                 // 获得当前图形数据库的块表
  6.         AcDbBlockTable *pBlkTbl = NULL;
  7.         pDb->getBlockTable(pBlkTbl, AcDb::kForRead);
  8.         // 获得模型空间对应的块表记录
  9.         AcDbBlockTableRecord *pBlkTblRcd = NULL;
  10.         pBlkTbl->getAt(ACDB采用MODEL采用SPACE, pBlkTblRcd, AcDb::kForWrite);
  11.         pBlkTbl->close();
  12.         // 将实体添加到模型空间的块表记录
  13.         AcDbObjectId entId;
  14.         Acad::ErrorStatus es = pBlkTblRcd->appendAcDbEntity(entId, pEnt);
  15.         if (es != Acad::eOk)
  16.         {
  17.                 pBlkTblRcd->close();
  18.                 delete pEnt;        // 添加失败时,要delete
  19.                 pEnt = NULL;
  20.                 return AcDbObjectId::kNull;
  21.         }
  22.         // 关闭模型空间块表记录和实体
  23.         pBlkTblRcd->close();
  24.         pEnt->close();
  25.         return entId;
  26. }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
 楼主| 发表于 2024-5-4 11:18:53 | 显示全部楼层
  1.         static void AAAMyGroupInsertDwgBlockRef() {
  2.                 CString fileName = TEXT("C:\\作为图块的文件.dwg");
  3.                 if (采用taccess(fileName, 0) != -1)
  4.                 {
  5.                         AcDbObjectId blkDefId = CBlockUtil::InsertDwgBlockDef(fileName,
  6.                                 TEXT("外部DWG图块"), true);
  7.                         if (blkDefId.isValid())
  8.                         {
  9.                                 CBlockUtil::InsertBlockRef(blkDefId, AcGePoint3d(200, 100, 0), 1, 0);
  10.                         }
  11.                 }
  12.                 else
  13.                 {
  14.                         acutPrintf(TEXT("\n指定的图形文件不存在."));
  15.                 }
  16.         }
复制代码

 

 

 

 

[ObjectARX]-在图形数据库之间传递数据 Wblock
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-5 12:28 , Processed in 0.140903 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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