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;
[assembly: ExtensionApplication(typeof(Rivilis.MonitorPaste))]
namespace Rivilis
{
public class MonitorPaste : IExtensionApplication
{
private AcAp.DocumentCollection m_docMan;
private AcAp.Document m_doc;
private AcDb.Database m_db;
private bool m_bBeginPaste;
private AcDb.ObjectIdCollection ids;
void IExtensionApplication.Initialize()
{
ids = new AcDb.ObjectIdCollection();
m_bBeginPaste = false;
m_docMan = AcAp.Application.DocumentManager;
m_doc = m_docMan.MdiActiveDocument;
m_db = m_doc.Database;
m_doc.CommandWillStart += new AcAp.CommandEventHandler(MonitorCommandWillStarted);
m_doc.CommandEnded += new AcAp.CommandEventHandler(MonitorCommandEnded);
m_doc.CommandCancelled += new AcAp.CommandEventHandler(MonitorCommandCanceled);
m_doc.CommandFailed += new AcAp.CommandEventHandler(MonitorCommandCanceled);
m_db.ObjectAppended += new AcDb.ObjectEventHandler(MonitorObjectAppended);
m_db.ObjectUnappended += new AcDb.ObjectEventHandler(MonitorObjectUnappended);
m_db.ObjectReappended += new AcDb.ObjectEventHandler(MonitorObjectReappended);
m_db.ObjectErased += new AcDb.ObjectErasedEventHandler(MonitorObjectErased);
}
void IExtensionApplication.Terminate()
{
}
private void MonitorCommandWillStarted(Object o, CommandEventArgs e)
{
if (e.GlobalCommandName.Substring(0, 5) == "PASTE") // Any of PASTE command (e.g., PASTECLIP, PASTEORIG, etc.)
{
m_bBeginPaste = true;
}
}
private void MonitorCommandEnded(Object o, CommandEventArgs e)
{
if (e.GlobalCommandName.Substring(0, 5) == "PASTE" && m_bBeginPaste)
{
m_doc.Editor.WriteMessage("\nCommand added {0} entities:", ids.Count);
foreach (ObjectId id in ids)
{
m_doc.Editor.WriteMessage("\n\t{0} {1}", id.ObjectClass.Name,id);
}
}
m_bBeginPaste = false; ids.Clear();
}
private void MonitorCommandCanceled(Object o, CommandEventArgs e)
{
m_bBeginPaste = false; ids.Clear();
}
private void MonitorObjectAppended(object sender, ObjectEventArgs e)
{
if (!m_bBeginPaste) return;
// Only entities from current space (Model or Layout) will be added
if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId) ids.Add(e.DBObject.ObjectId);
}
private void MonitorObjectUnappended(object sender, ObjectEventArgs e)
{
if (!m_bBeginPaste) return;
if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
}
private void MonitorObjectReappended(object sender, ObjectEventArgs e)
{
if (!m_bBeginPaste) return;
// Only Entity from current space (Model or Layout) will be added
if (!ids.Contains(e.DBObject.ObjectId) && e.DBObject.OwnerId == m_db.CurrentSpaceId) ids.Add(e.DBObject.ObjectId);
}
private void MonitorObjectErased(object sender, ObjectErasedEventArgs e)
{
if (!m_bBeginPaste) return;
if (ids.Contains(e.DBObject.ObjectId)) ids.Remove(e.DBObject.ObjectId);
}
}
}