乐筑天下

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

插图块??

[复制链接]

5

主题

26

帖子

2

银币

初来乍到

Rank: 1

铜币
46
发表于 2003-1-14 17:11:00 | 显示全部楼层 |阅读模式
请问:用ARX怎么插入一个图块(不用CAD的命令)!谢谢!
回复

使用道具 举报

14

主题

230

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
286
发表于 2003-1-15 09:13:00 | 显示全部楼层
如果你要插入外部图块,也就是说,要将另一张DWG图形插入,建议使用AcDbDatabase::insert()函数,以下代码用于插入AcDbBlockReference对象,即块参考。
void addBlockWithAttributes()
{
    AcGePoint3d basePoint;  //插入基点
    if(acedGetPoint(NULL,"\n请输入图块插入点:",asDblArray(basePoint))!= RTNORM)
        return;
  double textAngle;  //属性文字旋转角度
    if(acedGetAngle(asDblArray(basePoint),"\n属性文字旋转角度:", &textAngle)!= RTNORM)
        return;
    double textHeight;  //属性文字高度
    if(acedGetDist(asDblArray(basePoint),"\n属性文字高度:", textHeight)!= RTNORM)
        return;
    // 定义要插入的图块ID
  AcDbObjectId blockId;
    defineBlockWithAttributes(blockId, basePoint,textHeight, textAngle);
    // 第一步,给新的块参考对象分配内存
    AcDbBlockReference *pBlkRef = new AcDbBlockReference;
    // 第二步,定义好的图块ID赋给块参考对象
    pBlkRef->setBlockTableRecord(blockId);
    // 若使用UCS,建立UCS与WCS之间的转换
  struct resbuf to, from;
    from.restype = RTSHORT;
    from.resval.rint = 1;   // UCS
    to.restype = RTSHORT;
    to.resval.rint = 0;    // WCS
    AcGeVector3d normal(0.0, 0.0, 1.0);
    acedTrans(&(normal.x), &from, &to, Adesk::kTrue,&(normal.x));
    // 设置块参考对象的插入点
    pBlkRef->setPosition(basePoint);
    // 指定LCS角度为0.
  pBlkRef->setRotation(0.0);
    pBlkRef->setNormal(normal);
    // 第三步,打开当前AcDb数据库模型空间块表记录
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,      AcDb::kForWrite);
    pBlockTable->close();
    // 向模型空间添加块参考对象
    AcDbObjectId newEntId;
    pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
    pBlockTableRecord->close();
  //以上是新建块参考对象的方法,以下读出块表并设置属性值
    // 第四步,打开块表记录
    AcDbBlockTableRecord *pBlockDef;
    acdbOpenObject(pBlockDef, blockId, AcDb::kForRead);
    // 建立块表记录浏览器,遍历块表
  AcDbBlockTableRecordIterator *pIterator;
    pBlockDef->newIterator(pIterator);
    AcDbEntity *pEnt;
    AcDbAttributeDefinition *pAttdef;
    for (pIterator->start(); !pIterator->done();pIterator->step())
    {
    pIterator->getEntity(pEnt, AcDb::kForRead);
        // 保证对象是块参考对象,且属性非常量
    pAttdef = AcDbAttributeDefinition::cast(pEnt);
        if (pAttdef != NULL && !pAttdef->isConstant()) {
            // 因属性非常量,需要定义一个属性对象
            AcDbAttribute *pAtt = new AcDbAttribute();
            pAtt->setPropertiesFrom(pAttdef);
            pAtt->setInvisible(pAttdef->isInvisible());
            basePoint = pAttdef->position();
            basePoint += pBlkRef->position().asVector();
            pAtt->setPosition(basePoint);
            pAtt->setHeight(pAttdef->height());
            pAtt->setRotation(pAttdef->rotation());
            pAtt->setTag("Tag");
            pAtt->setFieldLength(25);
            char *pStr = pAttdef->tag();
            pAtt->setTag(pStr);
            free(pStr);
            pAtt->setFieldLength(pAttdef->fieldLength());
            // 输入属性值
      pAtt->setTextString("Assigned Attribute Value");
            AcDbObjectId attId;
            pBlkRef->appendAttribute(attId, pAtt);
            pAtt->close();
        }
        pEnt->close(); // 不要忘记释放内存
    }
    delete pIterator;
    pBlockDef->close();
    pBlkRef->close();
}
回复

使用道具 举报

5

主题

26

帖子

2

银币

初来乍到

Rank: 1

铜币
46
发表于 2003-1-15 18:38:00 | 显示全部楼层
非常感谢!!!
回复

使用道具 举报

5

主题

26

帖子

2

银币

初来乍到

Rank: 1

铜币
46
发表于 2003-1-17 11:26:00 | 显示全部楼层
还有没有别的方法?
回复

使用道具 举报

3

主题

12

帖子

1

银币

初来乍到

Rank: 1

铜币
24
发表于 2003-2-13 23:49:00 | 显示全部楼层
AcDbEntity* copyFromId(AcDbObjectId objId)
{
    AcDbEntity *pRet=NULL;
    static AcDbObjectId modelSpaceId;
    if (modelSpaceId.isNull())
    {
        AcDbBlockTable *pBlkTbl;
        getBlockTable(pBlkTbl, AcDb::kForRead);
        pBlkTbl->getAt(ACDB_MODEL_SPACE, modelSpaceId);
        pBlkTbl->close();
    }
    AcDbObjectIdArray objIds;
    objIds.append(objId);
    AcDbIdMapping idMap;
    wblockCloneObjects(objIds, modelSpaceId, idMap, AcDb::kDrcIgnore);
    AcDbIdPair idPair(objId, AcDbObjectId::kNull, false, false);
    if (idMap.compute(idPair) == TRUE && idPair.value() != NULL)
    {
        acdbOpenObject(pRet, idPair.value(), AcDb::kForWrite);
    }
    return pRet;
}
该成员函数实现在不同的数据库中复制对象。参数中objId是另一个图形数据库的对象Id返回的pRet是已经存在于this图形数据库的实体。
回复

使用道具 举报

8

主题

28

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2005-4-6 16:44:00 | 显示全部楼层
leeyeafu版主你好,初学ARX,请多指点:
defineBlockWithAttributes(blockId, basePoint,textHeight, textAngle);         //未定义
谢谢
回复

使用道具 举报

8

主题

28

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2005-4-11 15:22:00 | 显示全部楼层
请问leeyeafu版主,插入块的时候,如何使块分解插入到当前图形中?
回复

使用道具 举报

3

主题

9

帖子

4

银币

初来乍到

Rank: 1

铜币
21
发表于 2005-4-13 15:54:00 | 显示全部楼层
请问版主 上面那个程序的 头文件是 什么?
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 07:54 , Processed in 0.297486 second(s), 68 queries .

© 2020-2025 乐筑天下

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