找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 490|回复: 2

[ARX程序]:如何删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?

[复制链接]
发表于 2003-3-13 10:03:37 | 显示全部楼层 |阅读模式

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

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

×
在不关闭当前文档的前提下,如何做到删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?
问题很急,望高手给小妹提供些建议。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-3-13 14:41:41 | 显示全部楼层

Re: [ARX程序]:如何删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?

最初由 ppengxm 发布
[B]在不关闭当前文档的前提下,如何做到删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?
问题很急,望高手给小妹提供些建议。 [/B]


Look this.

  1. #include "dbobjptr.h"

  2. // Function name    : HYT_ClearLayers
  3. // Description      : 清除无关图层, 删除ModalSpace中不以"FC_"打头的层
  4. // Return type      : void
  5. void HYT_ClearLayers()
  6. {
  7. #ifdef OARXWIZDEBUG
  8.     acutPrintf ("\nOARXWIZDEBUG - HYT_ClearLayers() called.");
  9. #endif // OARXWIZDEBUG

  10.     // TODO: Implement the command

  11.     Acad::ErrorStatus es;
  12.     AcDbDatabase* pCurDb = acdbHostApplicationServices()-> workingDatabase();

  13.     AcDbLayerTablePointer spLayerTable(pCurDb,AcDb::kForWrite);
  14.     es = spLayerTable.openStatus();
  15.     if (es == Acad::eOk)
  16.     {
  17.         AcDbLayerTableIterator* pIterator;
  18.         spLayerTable-> newIterator (pIterator);
  19.         
  20.         AcDbLayerTableRecord* pLayer;
  21.         char* pLayerName=NULL;
  22.         
  23.         for (; !pIterator-> done(); pIterator-> step()) {
  24.             
  25.             pIterator-> getRecord (pLayer,AcDb::kForWrite) ;
  26.             
  27.             pLayer-> getName(pLayerName);
  28.             if (acutWcMatch(pLayerName,"FC_*")!=RTNORM)
  29.             {
  30.                 if (pLayer-> isLocked())
  31.                     pLayer-> setIsLocked(false);
  32.             }
  33.             pLayer-> close();
  34.             acutDelString(pLayerName);
  35.         }

  36.         delete pIterator ;
  37.     }
  38.     else
  39.         return;

  40.     AcDbBlockTableRecordPointer spBlkRcd(ACDB_MODEL_SPACE, pCurDb, AcDb::kForRead);
  41.     es = spBlkRcd.openStatus();
  42.     if (es == Acad::eOk)
  43.     {
  44.         AcDbBlockTableRecordIterator *pIter;
  45.         es = spBlkRcd-> newIterator(pIter);
  46.         if (es == Acad::eOk)
  47.         {
  48.             AcDbEntity *pEnt;
  49.             char *pLayerName = NULL;
  50.             for (pIter-> start(); !pIter-> done(); pIter-> step())
  51.             {
  52.                 es = pIter-> getEntity(pEnt,AcDb::kForRead);
  53.                 if (es == Acad::eOk)
  54.                 {
  55.                     pLayerName = pEnt-> layer();
  56.                     
  57.                     if (acutWcMatch(pLayerName,"FC_*")!=RTNORM)
  58.                     {
  59.                         es = pEnt-> upgradeOpen();
  60.                         if (es == Acad::eOk)
  61.                             pEnt-> erase();
  62.                     };
  63.                     acutDelString(pLayerName);
  64.                     pEnt-> close();
  65.                 }
  66.             }
  67.             delete pIter;
  68.         }
  69.     }
  70.     else
  71.         return;
  72.    
  73.     AcDbLayerTableIterator* pIterator;
  74.     spLayerTable-> newIterator(pIterator);
  75.    
  76.     AcDbLayerTableRecord* pLayer;
  77.     char* pLayerName=NULL;
  78.    
  79.     for (; !pIterator-> done(); pIterator-> step()) {
  80.         
  81.         pIterator-> getRecord (pLayer,AcDb::kForWrite) ;
  82.         
  83.         pLayer-> getName(pLayerName);
  84.         if (acutWcMatch(pLayerName,"0,FC_*")!=RTNORM)
  85.         {
  86.             pLayer-> erase();
  87.         }
  88.         pLayer-> close();
  89.         acutDelString(pLayerName);
  90.     }
  91.    
  92.     delete pIterator;
  93. }

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-3-13 19:06:40 | 显示全部楼层

Re: [ARX程序]:如何删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?

最初由 ppengxm 发布
[B]在不关闭当前文档的前提下,如何做到删除当前数据库中所有层,使其恢复到只有一个基本的0层呢?
问题很急,望高手给小妹提供些建议。 [/B]


一个层要删除,必须保证没有对象引用该层,确定后,就可以用AcDbObject::erase() 删除掉了。

判断一个层是否被引用,可以使用

  1. <normalfont>
  2. AcDbDatabase::purge Function Acad::ErrorStatus

  3. purge(

  4. AcDbObjectIdArray& ids);

  5. ids Input array of object ID entities of objects

  6. </normalfont>


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 20:38 , Processed in 0.179302 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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