明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3280|回复: 4

CAD.NET API一日一练(5)图块改色

[复制链接]
发表于 2011-11-3 15:50:37 | 显示全部楼层 |阅读模式
本帖最后由 mrhvslisp 于 2011-11-4 15:05 编辑

代码已更正,感谢sailorcwx 的指导,谢谢!!!
  1. #region//图块改色
  2.         [CommandMethod("BlockColor")]
  3.         public void BlockColor()
  4.         {
  5.             Document doc = Application.DocumentManager.MdiActiveDocument;
  6.             Database db = doc.Database;
  7.             Editor ed = doc.Editor;

  8.             TypedValue[] filter = new TypedValue[1];
  9.             filter[0] = new TypedValue(0, "insert");
  10.             SelectionFilter ssfilter = new SelectionFilter(filter);
  11.             PromptSelectionResult ssresult = ed.GetSelection(ssfilter);
  12.             if (ssresult.Status != PromptStatus.OK)
  13.             {
  14.                 return;
  15.             }
  16.             PromptIntegerOptions  intoptions=new PromptIntegerOptions ("");
  17.             intoptions.Message = "\n请指定颜色";
  18.             intoptions.AllowArbitraryInput = false;
  19.             intoptions.AllowNone = true ;
  20.             intoptions.DefaultValue = 1;
  21.             intoptions.AllowNegative = false;
  22.                         
  23.             PromptIntegerResult intresult=ed.GetInteger(intoptions);
  24.             if (intresult .Status!=PromptStatus.OK)
  25.             {
  26.                 return;
  27.             }


  28.             List <BlockTableRecord> list=new List<BlockTableRecord> ();
  29.             
  30.             list = getlist(db, ssresult,intresult,list);

  31.              using (Transaction trans = db.TransactionManager.StartTransaction())
  32.             {
  33.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  34.                 foreach (BlockTableRecord blkr in list)
  35.                 {
  36.                     ModifyColor(blkr, trans, bt, intresult);
  37.                 }         
  38.                 trans.Commit();
  39.             }
  40.             
  41.             
  42.         }

  43.         //获取块定义集合(块表记录集合)
  44.         public List<BlockTableRecord> getlist(Database db, PromptSelectionResult ssresult,PromptIntegerResult intresult,  List <BlockTableRecord> list)
  45.         {
  46.             using (Transaction trans = db.TransactionManager.StartTransaction())
  47.             {
  48.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);

  49.                 foreach (ObjectId id in ssresult.Value.GetObjectIds())
  50.                 {
  51.                     BlockReference ent = trans.GetObject(id, OpenMode.ForWrite) as BlockReference;
  52.                     ent.ColorIndex = intresult.Value;

  53.                     BlockTableRecord blkr = trans.GetObject(bt[ent.Name], OpenMode.ForRead) as BlockTableRecord;
  54.                     if (!list.Contains(blkr))
  55.                     {
  56.                         list.Add(blkr);
  57.                     }

  58.                 }
  59.                 trans.Commit();
  60.                 return list;
  61.             }
  62.         }

  63.         //对块定义改色      
  64.         public void ModifyColor(BlockTableRecord blkr, Transaction trans, BlockTable bt, PromptIntegerResult intresult)
  65.         {
  66.             BlockTableRecordEnumerator enu = blkr.GetEnumerator();//获取块枚举器
  67.             while (enu.MoveNext())
  68.             {
  69.                 Entity ent = (Entity)trans.GetObject(enu.Current, OpenMode.ForWrite);
  70.                 ent.ColorIndex = intresult.Value;
  71.                  if (ent is BlockReference)
  72.                 {
  73.                     ent.ColorIndex = intresult.Value;
  74.                     blkr = trans.GetObject(bt[((BlockReference)ent).Name], OpenMode.ForWrite)as BlockTableRecord;
  75.                     ModifyColor(blkr, trans, bt, intresult);
  76.                 }
  77.             }
  78.         }
  79.            
  80.         



发表于 2011-11-4 14:39:55 | 显示全部楼层
本帖最后由 sailorcwx 于 2011-11-4 14:42 编辑

我不是版主,不过我分析一下
你最后的ent.BlockName得到的其实是上一层的块参照名称,打个比方,你的"块1“内嵌"块2",那么你的
ent.BlockName返回的是"块1",ent.Name才是它的块名"块2",所以导致了死循环,因此应该添加一个转换
BlockReference ent1 = (BlockReference)ent;
然后用ent.Name来读取块名
blkr = trans.GetObject(bt[ent1.Name], OpenMode.ForWrite)as BlockTableRecord;

评分

参与人数 1明经币 +1 收起 理由
mrhvslisp + 1 很给力!

查看全部评分

 楼主| 发表于 2011-11-4 15:01:33 | 显示全部楼层
sailorcwx 发表于 2011-11-4 14:39
我不是版主,不过我分析一下
你最后的ent.BlockName得到的其实是上一层的块参照名称,打个比方,你的"块1“ ...

哈哈,完全正确,学习了,感谢老师指导
发表于 2013-6-7 15:11:57 | 显示全部楼层
好贴,一定支持。
发表于 2013-6-7 15:22:17 | 显示全部楼层
好贴,一定支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-18 16:44 , Processed in 0.163123 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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