Gile, have a look at this pattern
public class Commands
{
struct DuplicatePattern
{
public string Name;
public string Layer;
public ObjectId OwnerId;
public double PositionX;
public double PositionY;
public double PositionZ;
public double Rotation;
public double ScaleX;
public double ScaleY;
public double ScaleZ;
}
static Predicate<DuplicatePattern> Eq(DuplicatePattern b)
{
return delegate(DuplicatePattern a)
{
return
a.Name.Equals(b.Name) &&
a.Layer.Equals(b.Layer) &&
a.OwnerId.Equals(b.OwnerId) &&
a.PositionX.Equals(b.PositionX) &&
a.PositionY.Equals(b.PositionY) &&
a.PositionZ.Equals(b.PositionZ) &&
a.Rotation.Equals(b.Rotation) &&
a.ScaleX.Equals(b.ScaleX) &&
a.ScaleY.Equals(b.ScaleY) &&
a.ScaleZ.Equals(b.ScaleZ);
};
}
private int DeleteDuplicatedBlockRef()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
int result = 0;
SelectionFilter filter = new SelectionFilter(new TypedValue[1] { new TypedValue(0, "INSERT") });
PromptSelectionResult psr = ed.SelectAll(filter);
if (psr.Status != PromptStatus.OK)
return 0;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
List<DuplicatePattern> Patterns = new List<DuplicatePattern>();
foreach (ObjectId id in psr.Value.GetObjectIds())
{
BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForWrite, false);
DuplicatePattern dp = new DuplicatePattern();
dp.OwnerId = br.OwnerId;
dp.Name = br.Name;
dp.Layer = br.Layer;
dp.PositionX = Math.Round(br.Position.X, 6);
dp.PositionY = Math.Round(br.Position.Y, 6);
dp.PositionZ = Math.Round(br.Position.Z, 6);
dp.Rotation = Math.Round(br.Rotation, 6);
dp.ScaleX = Math.Round(br.ScaleFactors.X, 6);
dp.ScaleY = Math.Round(br.ScaleFactors.Y, 6);
dp.ScaleZ = Math.Round(br.ScaleFactors.Z, 6);
if (Patterns.FindIndex(Eq(dp)) > -1)
{
br.Erase();
result++;
}
else
{
Patterns.Add(dp);
}
}
tr.Commit();
}
return result;
}
[CommandMethod("Cs_gile")]
public void DelDupBlkRef()
{
DateTime t0 = DateTime.Now;
int del = DeleteDuplicatedBlockRef();
DateTime t1 = DateTime.Now;
TimeSpan ts = t1 - t0;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(
"{0} duplicated block(s) have been erased in {1} milliseconds",
del, ts.TotalMilliseconds);
}
}