明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7415|回复: 13

[原创]图层合并

  [复制链接]
发表于 2004-5-19 19:51:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-5-19 20:23:29 编辑

将一个图层的所有对象转移到另一个图层,并删除原图层。
  1. AcDbObjectId eId;
  2. AcDbObject *pObj;
  3. AcDbEntity *pE;ads_name ss;
  4. ads_name ent;
  5. ads_point pt;
  6. long len;
  7. char * layer_tc1;
  8. char * layer_tc2;
  9. struct resbuf eb;
  10. struct resbuf blc;  
  11. int rc = acedEntSel("\n选择被合并图层实体:",ent,pt);
  12. switch(rc)
  13. {
  14.   case RTERROR :
  15.     acutPrintf("\n未选中实体! ");
  16.   break;  case RTCAN :
  17.     acutPrintf("\n取消! ");
  18.   break;  case RTNORM :      
  19.     acdbGetObjectId(eId,ent);
  20.     acdbOpenObject(pE, eId, AcDb::kForRead, false);
  21.     layer_tc1 = pE->layer();//查询实体所在的图层   
  22.     pE->close();    int rcc = acedEntSel("\n选择合并图层实体:",ent,pt);
  23.     switch(rcc)
  24.     {
  25.       case RTERROR :
  26.         acutPrintf("\n未选中实体! ");
  27.       break;      case RTCAN :
  28.         acutPrintf("\n取消! ");
  29.       break;      case RTNORM :            
  30.         acdbGetObjectId(eId,ent);
  31.         acdbOpenObject(pE, eId, AcDb::kForRead, false);
  32.         layer_tc2 = pE->layer();        
  33.         pE->close();        eb.restype = 8;//层名
  34.         eb.resval.rstring = layer_tc1;
  35.         eb.rbnext = NULL;
  36.         acedSSGet("X",NULL,NULL,&eb,ss);
  37.         free(eb.resval.rstring);        acedSSLength(ss,&len);
  38.         for(int i=0; i<len; i++)
  39.         {
  40.           acedSSName(ss,i,ent);
  41.           acdbGetObjectId(eId,ent);
  42.           acdbOpenObject(pE, eId, AcDb::kForWrite, false);
  43.           pE->setLayer(layer_tc2);
  44.           pE->close();   
  45.         }
  46.         acedSSFree(ss);        blc.restype = RTSTR;
  47.         blc.resval.rstring = "0";
  48.         acedSetVar("CLAYER",&blc);//设置当前图层为0层   
  49.         AcDbLayerTable * pLayerTbl;//定义层表指针
  50.         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTbl, AcDb::kForWrite);
  51.          
  52.         AcDbLayerTableRecord * pLayerTblRcd; //定义层表记录指针
  53.         if ( Acad::eOk == pLayerTbl->getAt(layer_tc1 , pLayerTblRcd , AcDb::kForWrite))
  54.         {
  55.           pLayerTblRcd->erase(true);//删除图层
  56.         }        
  57.         pLayerTblRcd->close();
  58.         pLayerTbl->close();
  59.         free(layer_tc2);
  60.       break;
  61.     }
  62.     free(layer_tc);      
  63.   break;
  64. }      
复制代码

评分

参与人数 1激情 +10 收起 理由
BDYCAD + 10 【好评】好程序值得推廣

查看全部评分

发表于 2019-11-10 17:44:48 | 显示全部楼层
Now laymrg has been built-in command. Thanks for sharing ^^
发表于 2019-4-6 09:09:45 | 显示全部楼层
要是能直接在图层特性管理器对话框操作就更好了
发表于 2020-9-4 07:59:46 | 显示全部楼层
感谢楼主分享 下载试试!
发表于 2004-5-20 19:24:00 | 显示全部楼层
为什么这么烦琐,可能是我看不明白吧!选中一层所有的对象,往另一层一放,在purge不完事了哈哈见笑!
发表于 2004-5-20 19:51:00 | 显示全部楼层
就是 用LISP写出来,就这么简单 (defun test(O_Lay D_Lay)
(command "_.change" (ssget "x" (list (cons 8 O_Lay))) "" "p" "la" D_Lay "")
(command "_.purge" "la" O_Lay "n")
)

评分

参与人数 1激情 +10 收起 理由
BDYCAD + 10 【好评】精簡. good

查看全部评分

 楼主| 发表于 2004-5-20 22:12:00 | 显示全部楼层
liub1979发表于2004-5-20 19:24:00为什么这么烦琐,可能是我看不明白吧!选中一层所有的对象,往另一层一放,在purge不完事了哈哈见笑!

图层和实体太多了就不好办了! 还是用程序比较好。

本帖子中包含更多资源

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

x
发表于 2004-5-23 20:58:00 | 显示全部楼层
好象是等高线吧!你的程序咋用,简单的说明一下 : ) "因为不象3楼那么好懂"
发表于 2008-10-24 16:04:00 | 显示全部楼层
如果图层锁定了,能起作用吗?
发表于 2010-8-9 22:49:00 | 显示全部楼层
学习了,谢谢
发表于 2010-8-27 22:37:00 | 显示全部楼层
3楼的程序非常简洁,高手!
发表于 2010-9-5 21:56:00 | 显示全部楼层
能否编写成一个小插件 使用
发表于 2010-12-26 03:22:04 | 显示全部楼层
什么东西啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 08:45 , Processed in 0.208355 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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