乐筑天下

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

向块添加属性

[复制链接]

6

主题

39

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2009-9-29 11:05:21 | 显示全部楼层 |阅读模式
大家好,
我可以使用下面的代码向块(m_CurSpace)添加一行。
现在我还需要添加一个属性定义。
由于C++和ARX并不完全是我的一杯茶,我想知道是否有人可以向我展示一个如何向块添加属性定义的示例。
TIA,
Arno van Eeuwen
Acad::ErrorStatus CadDrawing::AddLine(const AcGePoint3d &p1, const AcGePoint3d &p2)
{
Acad::ErrorStatus es = Acad::eNullHandle;
   
if(NULL != m_pCurDb)
{

AcDbObjectPointer
line;
   
if ((es = line.create()) != Acad::eOk) 返回 es;

if ((es = line->setStartPoint(p1)) != Acad::eOk) return es;
   
if ((es = line->setEndPoint(p2)) != Acad::eOk) 返回 es;

返回 m_CurSpace->appendAcDbEntity(line));   

}
返回 es;
}

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

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

使用道具 举报

6

主题

39

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2009-9-30 02:27:51 | 显示全部楼层
我要出城了,如果其他人没有发布示例,我回来时会尝试。
回复

使用道具 举报

6

主题

39

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2009-9-30 04:32:04 | 显示全部楼层
一个简单的例子就可以了,或者提示一下在哪里可以找到这方面的文档。
期待您的回复。阿诺
回复

使用道具 举报

6

主题

39

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2009-10-9 02:28:40 | 显示全部楼层

以下是一个快速示例
  1. typedef AcDbObjectPointer AcDbBlockReferencePointer;
  2. static void ArxBlockSamp_doit(void)
  3. {
  4.   TCHAR blockName[134]; // alloc space for our blockname
  5.   AcDbObjectId btrId = AcDbObjectId::kNull ; // create a null ID
  6.   AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
  7.   if(acedGetString(0,_T("\nEnter a Block Name: "),blockName) != RTNORM)
  8.   {
  9.    acdbFail( _T("@acedGetString"));
  10.    return;
  11.   }
  12.   //call helper to get the ID of block
  13.   if(getBlockTableRecordId(blockName,btrId,pDb) != eOk)
  14.   {
  15.    acdbFail( _T("@getBlockRecordId"));
  16.    return;
  17.   }
  18.   // smart pointer to block
  19.   AcDbBlockTableRecordPointer pBlockTableRecordPointer(btrId,AcDb::kForWrite);
  20.   if(pBlockTableRecordPointer.openStatus() != eOk)
  21.   {
  22.    acdbFail( _T("@pBlockTableRecordPointer.openStatus"));
  23.    return;
  24.   }
  25.   // a pointer to a new AcDbAttributeDefinition, I use a normal pointer
  26.   // here because I want to use the ctor & I want to use it later
  27.   AcDbAttributeDefinition *pAttributeDefinition =
  28.      new AcDbAttributeDefinition(pBlockTableRecordPointer->origin(),
  29.                                  _T("Text"), _T("Tag"), _T("Prompt"));
  30.   // add the new AcDbAttributeDefinition to block
  31.   if(pBlockTableRecordPointer->appendAcDbEntity(pAttributeDefinition) != eOk)
  32.   {
  33.    delete pAttributeDefinition;
  34.    acdbFail( _T("@pBlockTableRecordPointer->appendAcDbEntity"));
  35.    return;
  36.   }
  37.   pAttributeDefinition->downgradeOpen(); // make sure its readonly
  38.   AcDbObjectIdArray blockReferenceIds;   // array to hold BlockReferenceIds
  39.   pBlockTableRecordPointer->getBlockReferenceIds(blockReferenceIds);
  40.   // helper to update BlockReferences
  41.   updateBlockReferences(blockReferenceIds, pAttributeDefinition );
  42.   pAttributeDefinition->close(); // clean up;
  43.   acutPrintf(_T("Ok!"));
  44. }
  45. static void updateBlockReferences(const AcDbObjectIdArray &blockReferenceIds,
  46.                                    AcDbAttributeDefinition *pAttributeDefinition)
  47. {
  48.   for(int i = 0 ; i blockTransform();
  49.    AcDbAttribute *pAttribute =
  50.          new AcDbAttribute(pAttributeDefinition->position().transformBy(mat),
  51.                            pAttributeDefinition->textStringConst(),
  52.                            pAttributeDefinition->tagConst());
  53.    if(pBlockReferencePointer->appendAttribute(pAttribute)!= eOk)
  54.    {
  55.     delete pAttribute;
  56.     continue;
  57.    }
  58.    pAttribute->close();
  59.   }
  60. }
  61. static Acad::ErrorStatus getBlockTableRecordId(LPCTSTR name, AcDbObjectId &btrId,
  62.                                                 AcDbDatabase *pDb)
  63. {
  64.   Acad::ErrorStatus stat = eOk;
  65.   AcDbBlockTablePointer pBlocktable(pDb->blockTableId(), AcDb::kForRead);
  66.   stat = pBlocktable.openStatus();
  67.   if(stat != eOk)
  68.    return stat;
  69.   if(pBlocktable->has(name))
  70.    return pBlocktable->getAt(name,btrId);
  71.   else
  72.    return Acad::eNotInDatabase;
  73. }

回复

使用道具 举报

6

主题

39

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2009-10-9 08:28:14 | 显示全部楼层
谢谢你丹尼尔。
这应该让我继续前进。
显然比添加线条要复杂一点......
阿诺
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-5-1 17:48 , Processed in 1.249485 second(s), 62 queries .

© 2020-2025 乐筑天下

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