乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 220|回复: 13

嵌套副本

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-22 17:20:56 | 显示全部楼层 |阅读模式
这是第一个代码,我上来复制一个嵌套对象:
  1. inline AcDbDatabase*
  2. CURDB() { return acdbHostApplicationServices()->workingDatabase(); }
  1. static void LESQsomefunctions_CNEST(void)
  2. {
  3.         const char * str;
  4.         str = "\nSelect nested entity: ";
  5.         ads_name entres;
  6.         ads_point ptres;
  7.         int pickflag = 0;
  8.         ads_matrix xformres;
  9.         resbuf* containers;       
  10.         AcDbObjectId objId;
  11.         if (acedNEntSelP(str, entres, ptres, pickflag, xformres, &containers) == RTNORM) {
  12.                 acutRelRb(containers);
  13.         if (acdbGetObjectId(objId, entres) != Acad::eOk) return;
  14.         AcDbObjectPointer pEntity(objId, AcDb::kForRead);
  15.         if (pEntity.openStatus() == Acad::eOk) {
  16.                 const char *pCname = pEntity->isA()->name();
  17.                 acutPrintf("\nNAME %s", pCname); // for debug only
  18.                 AcGeMatrix3d xform;
  19.                 AcDbEntity *pEnt = NULL;
  20.                 if (pEntity->getTransformedCopy(xform, pEnt) == Acad::eOk) {
  21.                         acutPrintf("\nNest OK. . ."); // for debug only
  22.                         AcDbObjectId curSpaceId=CURDB()->currentSpaceId();
  23.                         AcDbBlockTableRecordPointer pBlockTableRecord(curSpaceId, AcDb::kForWrite);
  24.        
  25.                         if (pBlockTableRecord.openStatus() == Acad::eOk) {
  26.                                 pBlockTableRecord->appendAcDbEntity(pEnt);
  27.                                 pEnt->transformBy(xform); //close();
  28.                         }//end of if openStatus
  29.                 }//end of getTransformedCopy
  30.         }//end of if openStatus
  31.         }else {
  32.                 acutRelRb(containers);
  33.         }
  34. }//end of command CNEST

我是否在正确的轨道上?...对象被复制了,但我认为我需要做更多的步骤...
谢谢!

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 04:03:35 | 显示全部楼层
嗨,路易丝!
1)如果实体很复杂(AcDb2dPolyline,AcDb3dPolyline等),你需要做deepClone()
2)你必须初始化xform矩阵。这并不容易。你需要递归查找所有所有者块表记录
,并获取 pBTR->origion() 和 pRef->blockTransform():
  1. AcGeMatrix3d xform = pRef->blockTransform(); // pRef - is AcDbBlockReference
  2. AcGePoint3d pt3dBlkOrigin = pBTR->origin(); // pBTR - is AcDbBlockTableRecord for this AcDbBlockReference
  3. if (pt3dBlkOrigin != AcGePoint3d::kOrigin) {
  4.     AcGeVector3d xformOrigin = xform.translation();
  5.     AcGeVector3d vectorOrigin(pt3dBlkOrigin.x,pt3dBlkOrigin.y,pt3dBlkOrigin.x);
  6.     vectorOrigin.transformBy(xform);
  7.     xformOrigin -= vectorOrigin;
  8.     xform.setTranslation(xformOrigin);
  9. }

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 17:17:32 | 显示全部楼层
嗨亚历山大;
我走了deepCloneObjects()路线...至少AutoCAD不会崩溃...我正在使用选择集和acedSSNameX(),但是很难从resbuf中获得AcDbBlockReference...从 blockTransform() 获取矩阵数据 。 。 。并且能够对所选的每个嵌套对象使用 transformBy()
克隆后无需转换即可工作。...
现在,我将暂时离开该功能....
谢谢。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 17:28:22 | 显示全部楼层
这是个好消息!
这是制作复杂实体副本的最简单方法。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 17:40:54 | 显示全部楼层
谢谢亚历山大。
嗯...我想有些代码会说得更多,请看看我在做什么[代码的某些部分是SDK示例项目的一部分]:
如您所见,如何从pRbresbuf中获取块引用?
谢谢!
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 17:55:58 | 显示全部楼层
我打算查看resbuf并做这样的事情:
是从pRb
  1. if (acdbGetObjectId(objId1, prevrb->resval.rlname) != Acad::eOk) return;
  2. AcDbObjectPointer pInsert(objId1,AcDb::kForRead);
  3. if (pInsert.openStatus() == Acad::eOk) {
  4. AcDbBlockReference *pBlock = AcDbBlockReference::cast(pInsert.object());
  5. AcGeMatrix3d mat = pBlock->blockTransform();
  6. }

然后将矩阵数据应用到嵌套对象中...我知道听起来很简单...但事实并非如此...他他
  1. pEnt->transformBy(mat);

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 18:21:38 | 显示全部楼层
有没有人能够使用getTransformedCopy()并让嵌套副本工作?....
例如,以下函数有效,但是...崩溃自动CAD....我必须使用什么才能使其正常工作?
注意:从头开始绘制[因为 AutoCAD 会崩溃]中测试代码。...画一些 lwpolylines 和线条,圆圈 - 将它们转换为一个块,然后调用命令 CNEST...,它将工作一段时间
  1. static void LESQsomefunctions_CNEST(void)
  2. {
  3.         const char * str;
  4.         str = "\nSelect nested entity: ";
  5.         ads_name entres;
  6.         ads_point ptres;
  7.         int pickflag = 0;
  8.         ads_matrix xformres;
  9.         resbuf *containers, *rb, *prevrb;       
  10.         AcDbObjectId objId, objId1;
  11.         if (acedNEntSelP(str, entres, ptres, pickflag, xformres, &containers) == RTNORM) {
  12.                 rb = containers;
  13.                 while (rb != NULL) {
  14.                         prevrb = rb;
  15.                         rb = containers->rbnext;
  16.                 }
  17.       if (acdbGetObjectId(objId1, prevrb->resval.rlname) != Acad::eOk) return;
  18.                
  19.           acutRelRb(rb);
  20.           acutRelRb(containers);
  21.           acutRelRb(prevrb);
  22.        
  23.           if (acdbGetObjectId(objId, entres) != Acad::eOk) return;
  24.        
  25.           AcDbObjectPointer pEntity(objId, AcDb::kForRead);
  26.           AcDbObjectPointer pInsert(objId1,AcDb::kForRead);
  27.        
  28.           if (pEntity.openStatus() == Acad::eOk && pInsert.openStatus() == Acad::eOk) {
  29.                 const char *pCname = pEntity->isA()->name();
  30.                 acutPrintf("\nNest object is: %s", pCname);
  31.                 const char *pCname1 = pInsert->isA()->name();
  32.                 acutPrintf("\nTop object is: %s", pCname1);
  33.                 AcDbBlockReference *pBlock = AcDbBlockReference::cast(pInsert.object());
  34.                 AcGeMatrix3d mat = pBlock->blockTransform();
  35.                 AcGeMatrix3d xform;
  36.                 AcDbEntity *pEnt = NULL;
  37.                 if (pEntity->getTransformedCopy(xform, pEnt) == Acad::eOk) {
  38.                         acutPrintf("\nNest OK. . .");
  39.                         AcDbObjectId curSpaceId=CURDB()->currentSpaceId();
  40.                         AcDbBlockTableRecordPointer pBlockTableRecord(curSpaceId, AcDb::kForWrite);
  41.        
  42.                         if (pBlockTableRecord.openStatus() == Acad::eOk) {
  43.                                 pBlockTableRecord->appendAcDbEntity(pEnt);
  44.                                 pEnt->transformBy(mat);
  45.                                 pEnt->close();
  46.                         }//end of if openStatus
  47.                 }//end of getTransformedCopy
  48.         }//end of if openStatus
  49.         }else {  
  50.                 acutRelRb(rb);
  51.                 acutRelRb(containers);
  52.                 acutRelRb(prevrb);
  53.         }
  54. }//end of command CNEST

另一个
沼泽者怎么样,你们中的任何一个,已经尝试过任何替代方法来克隆对象在ObjectARX中?
谢谢!
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 22:00:02 | 显示全部楼层
would -
rb =容器;
while (rb!= NULL){
prev Rb = Rb;
Rb = containers-> Rb next;最好写成-
Rb = containers;
while (rb!= NULL){
prev Rb = Rb;Rb =  Rb --> Rb next;
??高温
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 22:06:40 | 显示全部楼层
报废了,我想得有点难了:丑陋:
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2006-3-23 23:56:31 | 显示全部楼层
Luis,如果您选择一个不属于块引用的项目会发生什么??
即如果您选择在命令的最后一次运行中添加到db的新实体之一
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 16:40 , Processed in 0.165451 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表