从.NET程序得到AutoCAD的块属性从AutoCAD .NET程序使用pickfirst选择集

本文提供两个AutoCAD.NET程序示例,一是如何通过用户选择的块引用获取块属性,并在AutoCAD控制台中显示;二是如何使用pickfirst选择集进行实体选择与处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从.NET程序得到AutoCAD的块属性从AutoCAD .NET程序使用pickfirst选择集  

2010-02-02 17:32:07|  分类: 默认分类|举报|字号 订阅

从.NET程序得到AutoCAD的块属性(2006.9.15)
 下面的代码要求用户选择块引用,然后在他们中查找包含的属性,然后在AutoCAD控制台中显示。
using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace MyApplication
{
public class DumpAttributes
{
[CommandMethod("LISTATT")]
    public void ListAttributes()
    {
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
Database db = HostApplicationServices.WorkingDatabase;//与当前文档中的DB的区别?
Transaction tr = db.TransactionManager.StartTransaction();
Try  //开始事务
{
//构建一个过滤器以便只有块参照被选择
TypedValue[] filList = new TypedValue[1] 
{new TypedValue((int)DxfCode.Start, "INSERT")};
SelectionFilter filter = new SelectionFilter(filList);//用过滤器列表来初始化选择过滤器
PromptSelectionOptions opts = new PromptSelectionOptions();
opts.MessageForAdding = "Select block references: ";
PromptSelectionResult res = ed.GetSelection(opts, filter);
if (res.Status != PromptStatus.OK) //选择不成功就什么都不做
return;
SelectionSet selSet = res.Value;
ObjectId[] idArray = selSet.GetObjectIds();
foreach (ObjectId blkId in idArray)
{
BlockReference blkRef = (BlockReference)
tr.GetObject(blkId, OpenMode.ForRead);
BlockTableRecord btr =  (BlockTableRecord)tr.
GetObject(blkRef.BlockTableRecord, OpenMode.ForRead);
ed.WriteMessage("\nBlock: " btr.Name);
btr.Dispose();
AttributeCollection attCol = blkRef.AttributeCollection;
foreach (ObjectId attId in attCol)
{
AttributeReference attRef = (AttributeReference)
tr.GetObject(attId, OpenMode.ForRead);
string str = ("\n  Attribute Tag: " attRef.Tag 
"\n    Attribute String: " attRef.TextString);
ed.WriteMessage(str);
}
}
tr.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
   {
ed.WriteMessage(("Exception: " ex.Message));
}
finally
{
tr.Dispose();
}
}
}
}

从AutoCAD .NET程序使用pickfirst选择集(2006.9.18)
 许多工作在实体集之上的AutoCAD命令有两种类型的工作方式:动作-名字或名字-动作。这意味着若用户已经预告选择了一个集合的实体(“名字”),然后发起命令(“动作”),命令就不会需要请求用户选择他们了。
 这就会使用一些东西来调用pickfirst或暗指AutoCAD中的选择集。要在命令中利用这个特性的优势,首先需要使用一个特别的命令标志“UsePickSet”:这告诉AutoCAD编辑器在调用命令时不要清除这个pickfirst集。然后命令的实现会使用编辑器对象的SelectImplied()方法来得到pickfirst集,这就可以用了。在这个阶段也可以使用SetImpliedSelection()来清除pickfirst集。
 下面的C#代码展示了一些额外的,例如,在没有pickfirst集时,怎么退回去请求用户去选择对象。如,我们用被选择的实体来做什么…在此例中,每个实体都被打开来读并调用其list()方法来dump出它的内容到命令行中。当然,你也可以做一些更有意思的事情了。
using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace SelectionTest
{
public class PickfirstTestCmds
{
//必须指定UsePickSet标志
[CommandMethod("PFT", CommandFlags.UsePickSet |
CommandFlags.Redraw |
CommandFlags.Modal)]
static public void PickFirstTest()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
try
{
 //得到pickfirst集
PromptSelectionResult selectionRes = ed.SelectImplied();
//如果没有pickfirst集
if (selectionRes.Status == PromptStatus.Error)
{
//请求用户选择实体
PromptSelectionOptions selectionOpts = new PromptSelectionOptions();
selectionOpts.MessageForAdding = "\nSelect objects to list: ";
selectionRes = ed.GetSelection(selectionOpts);
}
else//如果有pickfirst集,清除它
{
ed.SetImpliedSelection(new ObjectId[0]);
}
//如果用户在此时还没有取消操作
if (selectionRes.Status == PromptStatus.OK)
{
//一个一个地利用被选择的对象
Transaction tr = doc.TransactionManager.StartTransaction();
try
{
ObjectId[] objIds = selectionRes.Value.GetObjectIds();
foreach (ObjectId objId in objIds)
{
Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
//此例中,只是dump它的的属性到命令行中
ent.List();
ent.Dispose();
}
//尽管没有对实体作改变,但使用Commit(),因为这样比回滚操//作要快些
tr.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(ex.Message);
tr.Abort();
}
}
}
catch(Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(ex.Message);
}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值