- UID
- 658062
- 积分
- 2147
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-10-22
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
// using System.Linq;
#region "Selection block by attribute tag"
// get the real block name. //
public static string EffectiveName(Transaction tr, BlockReference bref)
{
BlockTableRecord btr = null;
if ((bref.IsDynamicBlock)
| (bref.Name.StartsWith("*U", StringComparison.InvariantCultureIgnoreCase)))
{
btr = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
}
else
{
btr = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
}
return btr.Name;
}
[CommandMethod("SelectByAttributeValue", "byval", CommandFlags.Modal)]
public void GetSelectionByAtt()
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
string m_str = string.Empty;
PromptStringOptions psto = new PromptStringOptions("\nEnter the tag to find (case-nonsensitive): ");
// to disable the blank space in user input
psto.AllowSpaces = false;
PromptResult pstr = ed.GetString(psto);
if (pstr.Status != PromptStatus.OK) return;
m_str = pstr.StringResult.ToUpper();
List<object[]> blockdata = new List<object[]>();
PromptSelectionOptions pso = new PromptSelectionOptions();
pso.MessageForRemoval = "\nFailed to select a blocks!";
pso.MessageForAdding = "\nPlease select a blocks: ";
// build filter to select all attributed blocks
SelectionFilter filter =
new SelectionFilter(
new TypedValue[] { new TypedValue(0, "insert"),
new TypedValue(66, 1) }
);
// perform block selection
PromptSelectionResult sres = ed.GetSelection(pso, filter);// might be SelectAll instead
if (sres.Status != PromptStatus.OK) return;
try
{
SelectionSet sset = sres.Value;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
foreach (SelectedObject sobj in sset)
{
Entity ent = tr.GetObject(sobj.ObjectId, OpenMode.ForRead, false) as Entity;
BlockReference bref = ent as BlockReference;
AttributeCollection attribs = bref.AttributeCollection;
foreach (ObjectId attid in attribs)
{
AttributeReference attref = tr.GetObject(attid, OpenMode.ForRead, false) as AttributeReference;
if (attref.Tag == m_str)
{
object[] datum = new object[] { EffectiveName(tr, bref), attref.Tag, attref.TextString };
// add block info to the list
blockdata.Add(datum);
}
}
}
// display total result
//foreach (object[] item in blockdata)
// ed.WriteMessage("\n{0}\t{1}\t{2}", item[0], item[1],item[2]);
var grps = from blk in blockdata
group blk by new
{
Name =blk.ElementAt(0), Tag =blk.ElementAt(1),AttValue=blk.ElementAt(2)
}
into grp
select new
{
BlockName=grp.First().ElementAt(0),
Tag=grp.First().ElementAt(1),
AttValue=grp.First().ElementAt(2),
Count= grp.Count()
};
// display subtotals
foreach (var grp in grps)
{
ed.WriteMessage("\n[ Block Name: {0} |Tag: {1} | Value: {2} | Count: {3} ]\n",
grp.BlockName,
grp.Tag,
grp.AttValue,
grp.Count
);
}
tr.Commit();
}
}
catch (System.Exception ex)
{
Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(ex.Message + "\n" + ex.StackTrace);
}
finally
{
}
}
#endregion |
|