明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2331|回复: 1

实体的属性复制和粘贴

[复制链接]
发表于 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
   {
       [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) 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/

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-12-3 19:03:59 | 显示全部楼层
不会使用明经的插入代码,我的代码不能被换行,有点奇怪
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 16:39 , Processed in 0.171072 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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