最近做一个把CAD图块转换为Revit模型的功能,需要对大量的图块进行重命名的操作,AutoCAD提供的方法需要从整个块表中找到要重命名的图块,效率实在太低,就自己写了一个工具。
环境配置
吐槽:感觉CAD二次开发的环境配置要比Revit麻烦的多。先要根据CAD的版本,把需要的开发工具理清楚,安装包找全,安装好,一天就过去了。
环境:ObjectARX2014
+wizards2014
+AutoCAD2014
+VS2012
代码
选择图块,获取图块名称
var doc = Application.DocumentManager.MdiActiveDocument;
PromptSelectionOptions options = new PromptSelectionOptions();
options.SingleOnly = true;
var result = doc.Editor.GetSelection();
string oldName=null;
if (result.Status == PromptStatus.OK)
{
var db = HostApplicationServices.WorkingDatabase;
using (var tr = db.TransactionManager.StartTransaction())
{
ObjectId[] idArray = result.Value.GetObjectIds();
foreach (ObjectId blkId in idArray)
{
BlockReference blkRef = (BlockReference)tr.GetObject(blkId, OpenMode.ForRead);
if (blkRef != null)
{
oldName=blkRef.Name;
}
}
tr.Commit();
}
}
调出窗口,输入新的图块名称
Window1 win = new Window1();
Application.ShowModalWindow(win);
newName = win.newName;
RenameBlock(oldName, newName);
win.Close();
修改图块名称
public void RenameBlock(string oldName, string newName)
{
if (string.IsNullOrEmpty(oldName) || string.IsNullOrEmpty(newName))
{
return;
}
// get the working Database
var db = HostApplicationServices.WorkingDatabase;
// start a transaction
using (var tr = db.TransactionManager.StartTransaction())
{
// open the block table
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
// check if the block table contains the block to rename
if (bt.Has(oldName))
{
// check if the block table already contains a block named as the new name
if (bt.Has(newName))
{
Application.ShowAlertDialog("A block named " + newName + "already exits");
}
else
{
// open the block definition
var btr = (BlockTableRecord)tr.GetObject(bt[oldName], OpenMode.ForWrite);
// rename the bloc
btr.Name = newName;
}
}
else
{
Application.ShowAlertDialog("Block " + oldName + " not found");
}
tr.Commit();
}
}
网友评论