- 积分
- 3649
- 明经币
- 个
- 注册时间
- 2008-2-17
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 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
|