MickD 发表于 2006-3-22 17:20:56

嵌套副本

这是第一个代码,我上来复制一个嵌套对象:
inline AcDbDatabase*
CURDB() { return acdbHostApplicationServices()->workingDatabase(); }

static void LESQsomefunctions_CNEST(void)
{
        const char * str;
        str = "\nSelect nested entity: ";
        ads_name entres;
        ads_point ptres;
        int pickflag = 0;
        ads_matrix xformres;
        resbuf* containers;       
        AcDbObjectId objId;
        if (acedNEntSelP(str, entres, ptres, pickflag, xformres, &containers) == RTNORM) {
                acutRelRb(containers);
        if (acdbGetObjectId(objId, entres) != Acad::eOk) return;
        AcDbObjectPointer pEntity(objId, AcDb::kForRead);
        if (pEntity.openStatus() == Acad::eOk) {
                const char *pCname = pEntity->isA()->name();
                acutPrintf("\nNAME %s", pCname); // for debug only
                AcGeMatrix3d xform;
                AcDbEntity *pEnt = NULL;
                if (pEntity->getTransformedCopy(xform, pEnt) == Acad::eOk) {
                        acutPrintf("\nNest OK. . ."); // for debug only
                        AcDbObjectId curSpaceId=CURDB()->currentSpaceId();
                        AcDbBlockTableRecordPointer pBlockTableRecord(curSpaceId, AcDb::kForWrite);
       
                        if (pBlockTableRecord.openStatus() == Acad::eOk) {
                                pBlockTableRecord->appendAcDbEntity(pEnt);
                                pEnt->transformBy(xform); //close();
                        }//end of if openStatus
                }//end of getTransformedCopy
        }//end of if openStatus
        }else {
                acutRelRb(containers);
        }
}//end of command CNEST

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

MickD 发表于 2006-3-23 04:03:35

嗨,路易丝!
1)如果实体很复杂(AcDb2dPolyline,AcDb3dPolyline等),你需要做deepClone()
2)你必须初始化xform矩阵。这并不容易。你需要递归查找所有所有者块表记录
,并获取 pBTR->origion() 和 pRef->blockTransform():
AcGeMatrix3d xform = pRef->blockTransform(); // pRef - is AcDbBlockReference
AcGePoint3d pt3dBlkOrigin = pBTR->origin(); // pBTR - is AcDbBlockTableRecord for this AcDbBlockReference
if (pt3dBlkOrigin != AcGePoint3d::kOrigin) {
    AcGeVector3d xformOrigin = xform.translation();
    AcGeVector3d vectorOrigin(pt3dBlkOrigin.x,pt3dBlkOrigin.y,pt3dBlkOrigin.x);
    vectorOrigin.transformBy(xform);
    xformOrigin -= vectorOrigin;
    xform.setTranslation(xformOrigin);
}

MickD 发表于 2006-3-23 17:17:32

嗨亚历山大;
我走了deepCloneObjects()路线...至少AutoCAD不会崩溃...我正在使用选择集和acedSSNameX(),但是很难从resbuf中获得AcDbBlockReference...从 blockTransform() 获取矩阵数据 。 。 。并且能够对所选的每个嵌套对象使用 transformBy()
克隆后无需转换即可工作。...
现在,我将暂时离开该功能....
谢谢。

MickD 发表于 2006-3-23 17:28:22

这是个好消息!
这是制作复杂实体副本的最简单方法。

MickD 发表于 2006-3-23 17:40:54

谢谢亚历山大。
嗯...我想有些代码会说得更多,请看看我在做什么[代码的某些部分是SDK示例项目的一部分]:
如您所见,如何从pRbresbuf中获取块引用?
谢谢!

MickD 发表于 2006-3-23 17:55:58

我打算查看resbuf并做这样的事情:
是从pRb
if (acdbGetObjectId(objId1, prevrb->resval.rlname) != Acad::eOk) return;
AcDbObjectPointer pInsert(objId1,AcDb::kForRead);
if (pInsert.openStatus() == Acad::eOk) {
AcDbBlockReference *pBlock = AcDbBlockReference::cast(pInsert.object());
AcGeMatrix3d mat = pBlock->blockTransform();
}

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

MickD 发表于 2006-3-23 18:21:38

有没有人能够使用getTransformedCopy()并让嵌套副本工作?....
例如,以下函数有效,但是...崩溃自动CAD....我必须使用什么才能使其正常工作?
注意:从头开始绘制[因为 AutoCAD 会崩溃]中测试代码。...画一些 lwpolylines 和线条,圆圈 - 将它们转换为一个块,然后调用命令 CNEST...,它将工作一段时间
static void LESQsomefunctions_CNEST(void)
{
        const char * str;
        str = "\nSelect nested entity: ";
        ads_name entres;
        ads_point ptres;
        int pickflag = 0;
        ads_matrix xformres;
        resbuf *containers, *rb, *prevrb;       
        AcDbObjectId objId, objId1;
        if (acedNEntSelP(str, entres, ptres, pickflag, xformres, &containers) == RTNORM) {
                rb = containers;
                while (rb != NULL) {
                        prevrb = rb;
                        rb = containers->rbnext;
                }
      if (acdbGetObjectId(objId1, prevrb->resval.rlname) != Acad::eOk) return;
               
          acutRelRb(rb);
          acutRelRb(containers);
          acutRelRb(prevrb);
       
          if (acdbGetObjectId(objId, entres) != Acad::eOk) return;
       
          AcDbObjectPointer pEntity(objId, AcDb::kForRead);
          AcDbObjectPointer pInsert(objId1,AcDb::kForRead);
       
          if (pEntity.openStatus() == Acad::eOk && pInsert.openStatus() == Acad::eOk) {
                const char *pCname = pEntity->isA()->name();
                acutPrintf("\nNest object is: %s", pCname);
                const char *pCname1 = pInsert->isA()->name();
                acutPrintf("\nTop object is: %s", pCname1);
                AcDbBlockReference *pBlock = AcDbBlockReference::cast(pInsert.object());
                AcGeMatrix3d mat = pBlock->blockTransform();
                AcGeMatrix3d xform;
                AcDbEntity *pEnt = NULL;
                if (pEntity->getTransformedCopy(xform, pEnt) == Acad::eOk) {
                        acutPrintf("\nNest OK. . .");
                        AcDbObjectId curSpaceId=CURDB()->currentSpaceId();
                        AcDbBlockTableRecordPointer pBlockTableRecord(curSpaceId, AcDb::kForWrite);
       
                        if (pBlockTableRecord.openStatus() == Acad::eOk) {
                                pBlockTableRecord->appendAcDbEntity(pEnt);
                                pEnt->transformBy(mat);
                                pEnt->close();
                        }//end of if openStatus
                }//end of getTransformedCopy
        }//end of if openStatus
        }else {
                acutRelRb(rb);
                acutRelRb(containers);
                acutRelRb(prevrb);
        }
}//end of command CNEST

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

MickD 发表于 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;
??高温

MickD 发表于 2006-3-23 22:06:40

报废了,我想得有点难了:丑陋:

MickD 发表于 2006-3-23 23:56:31

Luis,如果您选择一个不属于块引用的项目会发生什么??
即如果您选择在命令的最后一次运行中添加到db的新实体之一
页: [1] 2
查看完整版本: 嵌套副本