找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1394|回复: 5

[求助] 请问如何重新定义一个已有的块定义

[复制链接]
发表于 2019-1-8 13:48:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
用arx重新定义一个已有的块定义该怎么操作,
我目前是打开该块定义的块表记录,删除块表记录中的实体,然后在添加实体
但是如果在图中已经有了一个原来块定义的块参照的话,执行这个重新定义个命令,需要regen一下才能变成新的块参照,这个问题该怎么解决,求大神解答
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2019-1-8 13:56:19 | 显示全部楼层
不用整图REGEN, 找到引用的INSERT后,REGEN这个INSERT就行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-8 14:11:48 | 显示全部楼层
newer 发表于 2019-1-8 13:56
不用整图REGEN, 找到引用的INSERT后,REGEN这个INSERT就行

感谢大神的解答

blockDefName 是图中已经存在的块定义的名称

blkDefId = CBlockUtil::GetBlkDefId(blockDefName);
if (isOverwriteIfExist)               // 如果是覆盖的话
{
        // 创建块表记录器,用于访问块定义中的所有实体
        AcDbBlockTableRecord* pBlkDefRcd = NULL;
        acdbOpenObject(pBlkDefRcd, blkDefId, AcDb::kForWrite);
        AcDbBlockTableRecordIterator* pItr = NULL;
        pBlkDefRcd ->newIterator(pItr);

        for (pItr ->start(); !pItr ->done(); pItr ->step())
        {
                AcDbEntity* pEnt = NULL;
                if (pItr ->getEntity(pEnt, AcDb::kForWrite) == Acad::eOk)
                {
                        pEnt ->erase();
                        pEnt ->close();
                }
        }
        delete pItr;

        // 向块表记录中添加实体
        AcDbLine* pLine1 = new AcDbLine(AcGePoint3d(-1,0,0), AcGePoint3d(1,0,0));
        AcDbLine* pLine2 = new AcDbLine(AcGePoint3d(-0.5,-0.5,0), AcGePoint3d(0.5,0.5,0));
        AcDbObjectId entId;
        pBlkDefRcd ->appendAcDbEntity(entId, pLine1);
        pBlkDefRcd ->appendAcDbEntity(entId, pLine2);

        // 关闭实体和块表记录
        pLine1 ->close();
        pLine2 ->close();
        pBlkDefRcd ->close();
}

这是修改的代码,请问这样写有没有什么问题,这样写的话就会出现我描述的需要regen一下的问题,有没有能够不regen,覆盖原块定义之后,图中原有的块参照自己会更新,如果必须要regen的话,该怎么写,感谢大神

点评

用上面ST说的  详情 回复 发表于 2019-1-8 15:24
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2019-1-8 14:36:34 | 显示全部楼层
Acad::ErrorStatus getBlockReferenceIds(
    AcDbObjectIdArray& ids,
    bool bDirectOnly = true,
    bool bForceValidity = false
) const;
遍历 重新插入
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2019-1-8 15:24:13 | 显示全部楼层
本帖最后由 newer 于 2019-1-8 15:25 编辑
happy24170 发表于 2019-1-8 14:11
感谢大神的解答

blockDefName 是图中已经存在的块定义的名称

用上面ST说的

Acad::ErrorStatus getBlockReferenceIds(
    AcDbObjectIdArray& ids,
    bool bDirectOnly = true,
    bool bForceValidity = false
) const;

遍历 ids, 对每个实体用下面的
  1. BOOL XdDbUtils::ads_regen(AcDbEntity *&pEnt)
  2. {
  3.         AcDbObjectId id;
  4.         Acad::ErrorStatus es;

  5.         AcDbObjectId lyrId;
  6.         AcDbObjectIdArray lyrIDarr;
  7.         AcDbLayerTableRecord *pLyrRec;
  8.         lyrId = pEnt->layerId();
  9.         if (acdbOpenObject(pLyrRec, lyrId, kForRead) == eOk)
  10.         {
  11.                 if (pLyrRec->isLocked())
  12.                 {
  13.                         pLyrRec->upgradeOpen();
  14.                         pLyrRec->setIsLocked(false);
  15.                         lyrIDarr.append(lyrId);
  16.                 }
  17.                 pLyrRec->close();
  18.         }
  19.         if (!pEnt->isWriteEnabled())
  20.         {
  21.                 pEnt->upgradeOpen();
  22.                 pEnt->recordGraphicsModified();
  23.                 pEnt->draw();
  24.                 pEnt->downgradeOpen();
  25.         }
  26.         else {
  27.                 if (pEnt->objectId() != AcDbObjectId::kNull)
  28.                 {
  29.                         pEnt->recordGraphicsModified();
  30.                         pEnt->draw();
  31.                 }
  32.         }
  33.         if (!lyrIDarr.isEmpty())
  34.         {
  35.                 for (int i = 0; i<lyrIDarr.length(); i++)
  36.                 {
  37.                         if (acdbOpenObject(pLyrRec, lyrIDarr, kForWrite) == eOk)
  38.                         {
  39.                                 pLyrRec->setIsLocked(true);
  40.                                 pLyrRec->close();
  41.                         }
  42.                 }
  43.         }
  44.         return TRUE;
  45. }





论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-8 15:42:20 | 显示全部楼层
好的,谢谢各位大神
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-8 05:17 , Processed in 0.180177 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表