天气与日历 切换到窄版

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

//ObjectARX中如何选择块参照中的对象

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
//ObjectARX中如何选择块参照中的对象

BOOL SelectEntsFromBlock(CString csPrompt, PickSet &ssResult,AcGePoint3d& ptBase)
{
         ads_name ent;
         ads_point pt;
         ads_matrix mat;
         struct resbuf* pHead = NULL;
         int iRet = acedNEntSelP(csPrompt, ent, pt, FALSE, mat, &pHead);

         ads_name entOuterBlock;
         if (iRet == RTNORM)
         {
                 if (!pHead)
                 {
                         acutPrintf(_T("这并不是一个块参照中的对象"));
                         return FALSE;
                 }

                 ptBase.x = pt[0];
                 ptBase.y = pt[1];
                 ptBase.z = pt[2];

                 //如果ent为块参照中的嵌套块参照对象,例如块参照A嵌套块参照B,块参照B嵌套块参照C,
                 //用户点取了嵌套块C的某个实体,以下循环可以将ent修改为块参照B;并且获得最外层的块参照的ads_name
                 while (pHead && pHead->restype == RTENAME)
                 {
                         if (pHead && !pHead->rbnext)        //如果点取的是块参照中的非嵌套对象
                         {
                                 ads_name_set(pHead->resval.rlname, entOuterBlock);
                                 break;
                         }
                         else if (pHead->rbnext && !pHead->rbnext->rbnext)        //如果点取的是块参照的嵌套对象
                         {
                                 ads_name_set(pHead->resval.rlname, ent);
                                 ads_name_set(pHead->rbnext->resval.rlname, entOuterBlock);
                                 break;
                         }
                         pHead = pHead->rbnext;
                 }

                 //求解块参照的变换矩阵
                 AcGeMatrix3d matBlockRef;
                 AcDbObjectId id;
                 acdbGetObjectId(id, entOuterBlock);                //获取最外层块参照的ID
                 AcDbBlockReference* pOuterBlockRef = NULL;
                 if (Acad::eOk == acdbOpenObject(pOuterBlockRef, id, AcDb::kForRead))
                 {
                         if (pOuterBlockRef)
                         {
                                 //获取转换矩阵,从块表记录中的MCS坐标转为当前图形的WCS坐标
                                 matBlockRef = pOuterBlockRef->blockTransform();
                         }
                         pOuterBlockRef->close();
                 }

                 acdbGetObjectId(id, ent);        //获取用户选中实体的ID
                 AcDbEntity* pEnt = NULL;
                 AcDbEntity* pEntClone = NULL;
                 if (Acad::eOk == acdbOpenObject(pEnt, id, AcDb::kForRead))
                 {
                         if (pEnt)
                         {
                                 pEntClone = (AcDbEntity*)pEnt->clone();
                                 //此步骤是关键,复制出来实体以后,将实体从块参照自己的WCS坐标系转换为当前数据库的WCS
                                 pEntClone->transformBy(matBlockRef);
                                 CMDatabase::PostToModelSpace(pEntClone);        //加入到当前数据库
                         }
                         pEnt->close();
                 }

                 //这里省略了对选择对象进行拖动的代码
                 //...........

                 return TRUE;
         }
         else
                 return FALSE;
}

 

 

 

 

//ObjectARX中如何选择块参照中的对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 09:22 , Processed in 0.164834 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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