cdinten 发表于 2012-12-3 18:50:49

实体的属性复制和粘贴

本帖最后由 cdinten 于 2012-12-3 18:56 编辑

嗯,说说最开始的意图。由于最近收到许多其他公司发送过来的各种产品的总成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
   {
      
       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) asBlockTableRecord;
         //选择源实体
         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,小心点。
运行效果如下:

全都设置为 最开始选择的绿色虚线了。
注意,为了查看线宽效果,你需要打开显式线宽的开关。

嗯,希望对大家有用,反正我目前用起来顺手多了。
附带解决方案文件。我使用的VS2010 +.NET Framework 3.5在CAD2010下开发的,其实大家完全可以使用其中的代码转移到其他版本的CAD中,因为没有使用任何太高深和前卫的东西。

欢迎到我的博客灌水:http://379910987.blog.163.com/

cdinten 发表于 2012-12-3 19:03:59

不会使用明经的插入代码,我的代码不能被换行,有点奇怪
页: [1]
查看完整版本: 实体的属性复制和粘贴