乐筑天下

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

如何修改OdResBufPtr变量?

[复制链接]

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-17 12:49:42 | 显示全部楼层 |阅读模式
大家好
我尝试使用以下代码将一些扩展数据附加到现有实体:
OdResBufPtr pRb=OdResBuf::newRb(OdResBuf::kDxfRegAppName,strippname)
pRb->setNext(OdResBuf::newRb(OdResBuf::kdxfstring,myString))
pRb->last()->setNext(OdResBuf::newRb(OdResBuf::kDxfXdInteger16,someInteger))
OdResBufPtr-podresbufptrr=pEnt->xData(_T(“my_APP”)
OdString:myString=pOdResBufPtr->next()->getString()
OdInt16:someInteger=pOdResBufPtr->last()->getInt16()
到此为止还可以,但我如何修改我的someInteger并写回扩展数据
我尝试:
pOdResBufPtr->last()->setNext(OdResBuf::newRb(OdResBuf::kdxfxdInteger 16,someInteger++)
但不起作用,someInteger仍然具有旧值
任何IDEAlast()->setInt16( someInteger++ )
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-17 21:37:07 | 显示全部楼层
嗨,丹尼尔
修改现有扩展数据的最佳方式是什么?我是否必须重新创建完整的OdResBufPtr变量,然后使用setXData()将新扩展数据重新附加到我的实体
似乎只有调用pOdResBufPtr->last()->setInt16(someInteger++),才不会记录新的整数值。
谢谢
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-18 04:43:48 | 显示全部楼层
稍微玩转这段代码,看看是否可以更新扩展数据。
  1. #pragma once
  2. class CommandDoIt : public OdStaticRxObject
  3. {
  4. public:
  5.   const OdString localName() const { return globalName(); }
  6.   const OdString groupName() const { return DD_T("DoIt"); }
  7.   const OdString globalName() const { return OdString("DoIt"); }
  8.   void execute(OdEdCommandContext* pCmdCtx)
  9.   {
  10.     OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
  11.     OdDbUserIOPtr pDbIO = pDbCmdCtx->dbUserIO();
  12.     OdDbDatabasePtr pDb = pDbCmdCtx->database();
  13.     //Always keap your head!!!
  14.     OdResBufPtr pHead = OdResBuf::newRb(OdResBuf::kDxfXdInteger16, (short)0);
  15.     OdResBufPtr pTail = pHead;
  16.     for(short i = 1 ; i setNext(OdResBuf::newRb(OdResBuf::kDxfXdInteger16, i));
  17.     }
  18.     for(OdResBufPtr pTemp = pHead; !pTemp.isNull() ; pTemp = pTemp->next())
  19.     {
  20.        sds_printf(_T("\n%d"), pTemp->getInt16());
  21.     }
  22.     for(OdResBufPtr pTemp = pHead; !pTemp.isNull() ; pTemp = pTemp->next())
  23.     {
  24.        pTemp->setInt16(short(pTemp->getInt16() + 100));
  25.     }
  26.     for(OdResBufPtr pTemp = pHead; !pTemp.isNull() ; pTemp = pTemp->next())
  27.     {
  28.        sds_printf(_T("\n%d"), pTemp->getInt16());
  29.     }
  30.   }
  31. };

回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-18 11:53:56 | 显示全部楼层
嗨丹尼尔!
谢谢你的例子,不幸的是,仍然不适合我。我有以下情况:对于实体,我尝试附加两个东西:字符串和整数。
使用 xData info 设置实体的第一个操作:
OdResBufPtr pHead = OdResBuf::newRb(OdResBuf::kDxfRegAppName, strAppName);
  OdResBufPtr pTail = pHead;
pTail=pTail->setNext(OdResBuf::newRb(OdResBuf::kDxfXdAsciiString, myString));
pTail=pTail->setNext(OdResBuf::newRb(OdResBuf::kDxfXdInteger16, someInteger));
myObjId.safeOpenObject(OdDb::kForWrite)->setXData(pHead);
pHead.release();
pTail.release();
在我的代码中的某个时刻,我尝试只更改整数(这不再是一个索引)。ResBuf的其余部分保持不变!
我试过这个:
//second action: try to modify the integer xData
OdResBufPtr pHead=pEnt->xData(strAppName);
  if(!pHead.isNull())
{
OdResBufPtr pTail = pHead;
     pTail=pTail->next();
OdString myString=pTail->getString();
pTail=pTail->next();
OdInt16 someInteger=pTail->getInt16();

pTail->setInt16(someInteger++);
     myObjId.safeOpenObject(OdDb::kForWrite)->setXData(pHead);
pHead.release();
pTail.release();
}
我尝试访问修改后的整数 xData - someInt - 但我仍然得到与第一点相同的初始值。我需要最快的解决方案,因为这个例程必须在大量的entites上工作(一千个也许更多),并且读/修改/写必须非常快。
怎么了?
话筒
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-20 13:18:17 | 显示全部楼层
请查看此代码
  1. #pragma once
  2. // (entget(car(entsel)) '("MYAPP"))
  3. class CommandPutIt : public OdStaticRxObject
  4. {
  5. public:
  6.   const OdString localName() const { return globalName(); }
  7.   const OdString groupName() const { return DD_T("putIt"); }
  8.   const OdString globalName() const { return OdString("putIt"); }
  9.   void execute(OdEdCommandContext* pCmdCtx)
  10.   {
  11.     OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
  12.     OdDbUserIOPtr pDbIO = pDbCmdCtx->dbUserIO();
  13.     OdDbDatabasePtr pDb = pDbCmdCtx->database();
  14.     __int64 freq, start, end;
  15.     try
  16.     {
  17.       if(pDb.isNull())
  18.         throw OdError(eNoDatabase);
  19.       if(!pDb->newRegApp(DD_T("MYAPP")))
  20.         throw OdError("Can't Register appname");
  21.       OdDbSelectionSetPtr pSS = pDbIO->select(DD_T("Select Entities: "));
  22.       QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
  23.       QueryPerformanceCounter((LARGE_INTEGER*)&start);
  24.       OdDbObjectIdArray ids = pSS->objectIdArray();
  25.       OdResBufPtr pHead = OdResBuf::newRb(OdResBuf::kDxfRegAppName,DD_T("MYAPP") );
  26.       OdResBufPtr pTail = pHead;
  27.       pTail = pTail->setNext(OdResBuf::newRb( OdResBuf::kDxfXdAsciiString, DD_T("String") ));
  28.       pTail = pTail->setNext(OdResBuf::newRb( OdResBuf::kDxfXdInteger16, (short)32 ));
  29.       for(size_t iter = 0 ; iter setXData(pHead);
  30.       }
  31.     }
  32.     catch (OdError& e)//++-- Catch OdExceptions
  33.     {
  34.       pDbIO->putString("\n" + e.description());
  35.     }
  36.     QueryPerformanceCounter((LARGE_INTEGER*)&end);
  37.     sds_printf(_T("\n%g Seconds\n"), (double)(end - start) / (double) freq);       
  38.   }
  39. };
  40. class CommandGetIt : public OdStaticRxObject
  41. {
  42. public:
  43.   const OdString localName() const { return globalName(); }
  44.   const OdString groupName() const { return DD_T("GetIt"); }
  45.   const OdString globalName() const { return OdString("GetIt"); }
  46.   void execute(OdEdCommandContext* pCmdCtx)
  47.   {
  48.     OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
  49.     OdDbUserIOPtr pDbIO = pDbCmdCtx->dbUserIO();
  50.     OdDbDatabasePtr pDb = pDbCmdCtx->database();
  51.     __int64 freq, start, end;
  52.    
  53.     try
  54.     {
  55.       if(pDb.isNull())
  56.         throw OdError(eNoDatabase);
  57.       OdDbSelectionSetPtr pSS = pDbIO->select(DD_T("Select Entities: "));
  58.       QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
  59.       QueryPerformanceCounter((LARGE_INTEGER*)&start);
  60.       OdDbObjectIdArray ids = pSS->objectIdArray();
  61.       for(size_t iter = 0 ; iter xData(DD_T("MYAPP"));
  62.         if(pHead.isNull())
  63.           continue;
  64.         OdResBufPtr pTail = pHead;
  65.         pTail = pTail->next();
  66.         pTail->setString(DD_T("New String"));
  67.         pTail = pTail->next();
  68.         pTail->setInt16( (short) 64);
  69.         pEnt->setXData(pHead);
  70.       }
  71.     }
  72.     catch (OdError& e)//++-- Catch OdExceptions
  73.     {
  74.       pDbIO->putString("\n" + e.description());
  75.     }
  76.     QueryPerformanceCounter((LARGE_INTEGER*)&end);
  77.     sds_printf(_T("\n%g Seconds\n"), (double)(end - start) / (double) freq);       
  78.   }
  79. };

回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-20 21:24:46 | 显示全部楼层
这套程序完美无瑕<这是我的错误<再次感谢你,丹尼尔<迈克
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-6 01:08 , Processed in 0.156892 second(s), 64 queries .

© 2020-2025 乐筑天下

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