嵌套副本
这是第一个代码,我上来复制一个嵌套对象: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 ***** 嗨,路易丝!
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);
}
嗨亚历山大;
我走了deepCloneObjects()路线...至少AutoCAD不会崩溃...我正在使用选择集和acedSSNameX(),但是很难从resbuf中获得AcDbBlockReference...从 blockTransform() 获取矩阵数据 。 。 。并且能够对所选的每个嵌套对象使用 transformBy()
克隆后无需转换即可工作。...
现在,我将暂时离开该功能....
谢谢。 这是个好消息!
这是制作复杂实体副本的最简单方法。 谢谢亚历山大。
嗯...我想有些代码会说得更多,请看看我在做什么[代码的某些部分是SDK示例项目的一部分]:
如您所见,如何从pRbresbuf中获取块引用?
谢谢! 我打算查看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);
有没有人能够使用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中?
谢谢! would -
rb =容器;
while (rb!= NULL){
prev Rb = Rb;
Rb = containers-> Rb next;最好写成-
Rb = containers;
while (rb!= NULL){
prev Rb = Rb;Rb =Rb --> Rb next;
??高温 报废了,我想得有点难了:丑陋: Luis,如果您选择一个不属于块引用的项目会发生什么??
即如果您选择在命令的最后一次运行中添加到db的新实体之一
页:
[1]
2