注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

实体属性的复制和粘贴  

2012-12-03 18:41:39|  分类: ObjectARX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
嗯,说说最开始的意图。由于最近收到许多其他公司发送过来的各种产品的总成CAD图纸,老实说,图纸画的很漂亮,而且设计规范,标注合理清晰,很值得学习。但是也不是完美的。他们的图纸的问题是,一个图形文件也就三四种颜色,三四种线条、线宽等等,可是仔细一查看就会发现有很多种图层,然后我在选择的时候会有些麻烦,即使是同样的绿色,由于有的是使用的ByLayer、有的是ByBlock,有的则是直接设定的。仔细探究就会知道,这些图层都是一个个设计人员自己搞的,总成也是拼起来的,因此,问题就来了,许多标注的地方都分布于十几个图层,虽然最后的颜色是一样的,但是有时候为了关闭标注,很麻烦,我就想能不能把其中一个作为目标格式,其他的都能够用Word中的格式刷一样给设置好属性,虽然在CAD中也不是很麻烦,只要依次设定就行了,不过前提是要查询目标格式,然后又记下来,还是有点小麻烦的。
于是就自己写了一个。
啰啰嗦嗦这么久,还是上代码来的干脆,其实很简单。
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;

namespace XDUtility
{
   public class Commander
   {
       [CommandMethod("EPB", CommandFlags.Modal | CommandFlags.UsePickSet)]
       public static void EntityPropertyBrush()
       {
           Document doc = Application.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           Transaction trans = db.TransactionManager.StartTransaction();
           BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
           BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
           //选择源实体
           PromptEntityResult per;            
           do
           {
               per = ed.GetEntity("\n选择携带目标属性实体");
               if(per.Status==PromptStatus.Cancel)
                   return;
           } while (per.Status != PromptStatus.OK);
           
           
           Entity ent = trans.GetObject(per.ObjectId, OpenMode.ForRead) as Entity;
           if (ent == null)
           {
               ed.WriteMessage("\n选择目标属性实体失败,命令退出.\n");
               return;
           }
           else
           {
               ed.WriteMessage(string.Format("目标属性:图层:{0},线型:{1},", ent.Layer, ent.Linetype));
               ed.WriteMessage(string.Format("线宽:{0},颜色:{1}\n", ent.LineWeight, ent.Color.ColorIndex));
           }
           
           //获取被修改实体
           PromptSelectionResult psr;
           do
           {
               psr = ed.GetSelection();
               if (psr.Status == PromptStatus.Cancel)
                   return;
           } while (psr.Status != PromptStatus.OK);
           SelectionSet ss = psr.Value;
           if (ss == null)
           {
               ed.WriteMessage("\n选择被修改实体失败,命令退出.\n");
               return;
           }

           foreach (SelectedObject so in ss)
           {
               Entity selected_ent = trans.GetObject(so.ObjectId, OpenMode.ForWrite) as Entity;
               selected_ent.Layer = ent.Layer;
               selected_ent.Linetype = ent.Linetype;
               selected_ent.LineWeight = ent.LineWeight;
               selected_ent.Color = ent.Color;
           }
           trans.Commit();
           trans.Dispose();
       }
   }
}
注意没有使用try-catch进行异常控制,所以使用时可能出现的异常,会弄死AutoCAD,小心点。
运行效果如下:
实体的属性复制 - Castor - 趁年轻,多折腾
 
全都设置为 最开始选择的绿色虚线了。
注意,为了查看线宽效果,你需要打开显式线宽的开关。
  评论这张
 
阅读(791)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016