using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using AcRx = Autodesk.AutoCAD.Runtime;
using AcAp = Autodesk.AutoCAD.ApplicationServices;
using AcDb = Autodesk.AutoCAD.DatabaseServices;
using AcGe = Autodesk.AutoCAD.Geometry;
using AcEd = Autodesk.AutoCAD.EditorInput;
// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(TestRename.MyCommands))]
namespace TestRename
{
public class MyCommands
{
[CommandMethod("RenBlock")]
public void RenBlock()
{
AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
AcEd.Editor ed = doc.Editor;
AcEd.PromptEntityOptions pr1 =
new AcEd.PromptEntityOptions("\nУкажите вставку блока для переименования: ");
pr1.SetRejectMessage("Это не вставка блока!");
pr1.AddAllowedClass(typeof(AcDb.BlockReference), true);
AcEd.PromptEntityResult res1 = ed.GetEntity(pr1);
if (res1.Status != AcEd.PromptStatus.OK) return;
AcDb.ObjectId idBtr = AcDb.ObjectId.Null;
bool isDynamic = false;
bool isUnnamed = false;
string old_name;
using (AcDb.BlockReference br =
res1.ObjectId.Open(AcDb.OpenMode.ForRead) as AcDb.BlockReference)
{
idBtr = br.BlockTableRecord;
isDynamic = br.IsDynamicBlock;
using (AcDb.BlockTableRecord btr =
idBtr.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTableRecord)
{
old_name = btr.Name;
isUnnamed = btr.IsAnonymous;
}
}
AcEd.PromptStringOptions pr2 =
new AcEd.PromptStringOptions("\nУкажите новое имя блока: ");
pr2.DefaultValue = old_name;
AcEd.PromptResult res2 = ed.GetString(pr2);
if (res2.Status != AcEd.PromptStatus.OK) return;
string new_name = res2.StringResult;
if (String.Compare(new_name, old_name, true) == 0) return;
if (AcDb.SymbolUtilityServices.ValidateCompatibleSymbolName(
new_name, true, false,
AcDb.SymbolUtilityServices.IsCompatibilityMode(doc.Database)) != AcRx.ErrorStatus.OK)
{
ed.WriteMessage("\nНедопустимое имя для блока \'{0}\'!", new_name);
return;
}
if (isDynamic && isUnnamed)
{
using (AcDb.BlockTableRecord btr =
idBtr.Open(AcDb.OpenMode.ForRead) as AcDb.BlockTableRecord)
{
try
{
AcDb.ObjectId idBtrNew = AcDb.ObjectId.Null;
using (AcDb.BlockTableRecord btr_new = new AcDb.BlockTableRecord())
{
btr_new.Name = new_name;
// btr_new.CopyFrom(btr);
btr_new.Origin = btr.Origin;
btr_new.BlockScaling = btr.BlockScaling;
btr_new.Annotative = btr.Annotative;
btr_new.Units = btr.Units;
using (AcDb.BlockTable bt = doc.Database.BlockTableId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTable)
{
idBtrNew = bt.Add(btr_new);
}
}
AcDb.ObjectIdCollection ids = new AcDb.ObjectIdCollection();
foreach (AcDb.ObjectId id in btr) ids.Add(id);
AcDb.IdMapping map = new AcDb.IdMapping();
doc.Database.DeepCloneObjects(ids, idBtrNew, map, true);
using (AcDb.BlockReference br =
res1.ObjectId.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockReference)
{
br.BlockTableRecord = idBtrNew;
}
}
catch
{
ed.WriteMessage("\nБлок \'{0}\' нельзя переименовать в \'{1}\'!",
old_name, new_name);
}
}
}
else
{
using (AcDb.BlockTableRecord btr =
idBtr.Open(AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord)
{
try
{
btr.Name = new_name;
}
catch
{
ed.WriteMessage("\nБлок \'{0}\' нельзя переименовать в \'{1}\'!",
old_name, new_name);
}
}
}
}
}
}