Here's a little sample to handle the PASTECLIP and PASTEORG commands.
The copied object are colored in red (10).
C#
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
namespace CatchPastedEntitiesSample
{
public class Initialization : IExtensionApplication
{
DocumentCollection docMgr;
ObjectIdCollection appendedIds;
public void Initialize()
{
docMgr = Application.DocumentManager;
appendedIds = new ObjectIdCollection();
Application.Idle += OnIdle;
}
public void Terminate()
{ }
private void OnIdle(object sender, EventArgs e)
{
var doc = docMgr.MdiActiveDocument;
if (doc != null)
{
Application.Idle -= OnIdle;
doc.CommandWillStart += Doc_CommandWillStart;
docMgr.DocumentCreated += DocMgr_DocumentCreated;
}
}
private void DocMgr_DocumentCreated(object sender, DocumentCollectionEventArgs e)
{
e.Document.CommandWillStart += Doc_CommandWillStart;
}
private void Doc_CommandWillStart(object sender, CommandEventArgs e)
{
if (e.GlobalCommandName == "PASTECLIP" || e.GlobalCommandName == "PASTEORIG")
{
var doc = docMgr.MdiActiveDocument;
appendedIds.Clear();
doc.Database.ObjectAppended += Database_ObjectAppended;
doc.CommandCancelled += Doc_CommandFailedOrCancelled;
doc.CommandFailed += Doc_CommandFailedOrCancelled;
doc.CommandEnded += Doc_CommandEnded;
}
}
private void Database_ObjectAppended(object sender, ObjectEventArgs e)
{
var dbObj = e.DBObject;
if (dbObj is Entity && dbObj.OwnerId == dbObj.Database.CurrentSpaceId)
appendedIds.Add(e.DBObject.ObjectId);
}
private void Doc_CommandEnded(object sender, CommandEventArgs e)
{
UnRegisterHandlers();
using (var tr = new OpenCloseTransaction())
{
foreach (ObjectId id in appendedIds)
{
if (!id.IsErased)
{
var ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
ent.ColorIndex = 10;
}
}
tr.Commit();
}
}
private void Doc_CommandFailedOrCancelled(object sender, CommandEventArgs e)
{
UnRegisterHandlers();
}
private void UnRegisterHandlers()
{
var doc = docMgr.MdiActiveDocument;
doc.CommandCancelled -= Doc_CommandFailedOrCancelled;
doc.CommandFailed -= Doc_CommandFailedOrCancelled;
doc.CommandEnded -= Doc_CommandEnded;
doc.Database.ObjectAppended -= Database_ObjectAppended;
}
}
}
VB
Imports System
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Public Class Initialization
Implements IExtensionApplication
Private docMgr As DocumentCollection
Private appendedIds As ObjectIdCollection
Public Sub Initialize() Implements IExtensionApplication.Initialize
docMgr = Application.DocumentManager
appendedIds = New ObjectIdCollection()
AddHandler Application.Idle, AddressOf OnIdle
End Sub
Public Sub Terminate() Implements IExtensionApplication.Terminate
End Sub
Private Sub OnIdle(ByVal sender As Object, ByVal e As EventArgs)
Dim doc = docMgr.MdiActiveDocument
If doc IsNot Nothing Then
RemoveHandler Application.Idle, AddressOf OnIdle
AddHandler doc.CommandWillStart, AddressOf Doc_CommandWillStart
AddHandler docMgr.DocumentCreated, AddressOf DocMgr_DocumentCreated
End If
End Sub
Private Sub DocMgr_DocumentCreated(ByVal sender As Object, ByVal e As DocumentCollectionEventArgs)
AddHandler e.Document.CommandWillStart, AddressOf Doc_CommandWillStart
End Sub
Private Sub Doc_CommandWillStart(ByVal sender As Object, ByVal e As CommandEventArgs)
If e.GlobalCommandName = "PASTECLIP" OrElse e.GlobalCommandName = "PASTEORIG" Then
Dim doc = docMgr.MdiActiveDocument
appendedIds.Clear()
AddHandler doc.Database.ObjectAppended, AddressOf Database_ObjectAppended
AddHandler doc.CommandCancelled, AddressOf Doc_CommandFailedOrCancelled
AddHandler doc.CommandFailed, AddressOf Doc_CommandFailedOrCancelled
AddHandler doc.CommandEnded, AddressOf Doc_CommandEnded
End If
End Sub
Private Sub Database_ObjectAppended(ByVal sender As Object, ByVal e As ObjectEventArgs)
Dim dbObj = e.DBObject
If TypeOf dbObj Is Entity AndAlso dbObj.OwnerId = dbObj.Database.CurrentSpaceId Then appendedIds.Add(e.DBObject.ObjectId)
End Sub
Private Sub Doc_CommandEnded(ByVal sender As Object, ByVal e As CommandEventArgs)
UnRegisterHandlers()
Using tr = New OpenCloseTransaction()
For Each id As ObjectId In appendedIds
If Not id.IsErased Then
Dim ent = CType(tr.GetObject(id, OpenMode.ForWrite), Entity)
ent.ColorIndex = 10
End If
Next
tr.Commit()
End Using
End Sub
Private Sub Doc_CommandFailedOrCancelled(ByVal sender As Object, ByVal e As CommandEventArgs)
UnRegisterHandlers()
End Sub
Private Sub UnRegisterHandlers()
Dim doc = docMgr.MdiActiveDocument
RemoveHandler doc.CommandCancelled, AddressOf Doc_CommandFailedOrCancelled
RemoveHandler doc.CommandFailed, AddressOf Doc_CommandFailedOrCancelled
RemoveHandler doc.CommandEnded, AddressOf Doc_CommandEnded
RemoveHandler doc.Database.ObjectAppended, AddressOf Database_ObjectAppended
End Sub
End Class