public class DeepCloneOverrule : ObjectOverrule<BlockReference>
{
public static readonly DeepCloneOverrule Instance
= new DeepCloneOverrule
(); internal static HashSet<ObjectId> idsToChange { get; set; }
private DeepCloneOverrule()
: base(OverruleStatus.On)
{
}
public override DBObject DeepClone(DBObject dbObject, DBObject ownerObject, IdMapping idMap, bool isPrimary)
{
try
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
if (idsToChange.Contains(dbObject.Id))
{
var db = dbObject.Database;
using (var tr = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord mb1r;
if (bt.Has("MyBlock1"))
mb1r = (BlockTableRecord)tr.GetObject(bt["MyBlock1"], OpenMode.ForRead);
else
{
var mbr = (BlockTableRecord)tr.GetObject(bt["MyBlock"], OpenMode.ForRead);
var col
= new ObjectIdCollection
(); foreach (ObjectId id in mbr)
col.Add(id);
var map
= new IdMapping
(); mb1r
= new BlockTableRecord
(); mb1r.Name = "MyBlock1";
bt.UpgradeOpen();
bt.Add(mb1r);
tr.AddNewlyCreatedDBObject(mb1r, true);
db.DeepCloneObjects(col, mb1r.Id, map, false);
}
var mb = (BlockReference)dbObject;
var mb1
= new BlockReference
(Point3d
.Origin, mb1r
.Id); var owner = (BlockTableRecord)ownerObject;
if (!owner.IsWriteEnabled)
owner.UpgradeOpen();
owner.AppendEntity(mb1);
tr.AddNewlyCreatedDBObject(mb1, true);
mb1.GenerateAttibutes();
mb1.TransformBy(mb.BlockTransform);
var dict
= new Dictionary
<string, AttributeReference
>(); foreach (ObjectId attId in mb1.AttributeCollection)
{
var ar = (AttributeReference)tr.GetObject(attId, OpenMode.ForWrite);
dict.Add(ar.Tag, ar);
}
foreach (ObjectId attId in mb.AttributeCollection)
{
var ar = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead);
dict[ar.Tag].TextString = ar.TextString;
}
idMap
.Add(new IdPair
(mb
.ObjectId, mb1
.ObjectId,
false, isPrimary,
true)); tr.Commit();
ed.WriteMessage("\nAll done");
return mb1;
}
}
return base.DeepClone(dbObject, ownerObject, idMap, isPrimary);
}
catch (System.Exception e)
{
Application.ShowAlertDialog(string.Format("Error:\n{0}", e.ToString()));
return base.DeepClone(dbObject, ownerObject, idMap, isPrimary);
}
}
}
///Based on code from:
///https://www.theswamp.org/index.php?topic=45662.msg508188#msg508188
///Thank You Jeff H!
public enum OverruleStatus
{
Off = 0,
On = 1
}
public abstract class ObjectOverrule<T> : ObjectOverrule where T : DBObject
{
private readonly RXClass _targetClass
= RXObject
.GetClass(typeof(T
)); OverruleStatus _status = OverruleStatus.Off;
public OverruleStatus Status
{
get
{
return _status;
}
set
{
if (value == OverruleStatus.On && _status == OverruleStatus.Off)
{
AddOverrule(_targetClass, this, true);
_status = OverruleStatus.On;
}
else if (value == OverruleStatus.Off && _status == OverruleStatus.On)
{
RemoveOverrule(_targetClass, this);
_status = OverruleStatus.Off;
}
}
}
protected ObjectOverrule(OverruleStatus status = OverruleStatus.On)
{
Status = status;
}
}