.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Prevent an erase event from happening

1 REPLY 1
SOLVED
Reply
Message 1 of 2
benjamin-cabrera
174 Views, 1 Reply

Prevent an erase event from happening

I have this code that monitor the events and generate a TXT file.

 

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using System.IO;

public class ObjectEvents
{
    private static string logFilePath = "AutoCAD_Events_Log.txt"; // Path to the log file

    [CommandMethod("RegisterDbEvents")]
    public void RegisterDbEvents()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;

        db.ObjectAppended += new ObjectEventHandler(Db_ObjectAppended);
        db.ObjectModified += new ObjectEventHandler(Db_ObjectModified);
        db.ObjectErased += new ObjectErasedEventHandler(Db_ObjectErased);

        // Clear the log file when registering new events
        if (File.Exists(logFilePath))
        {
            File.WriteAllText(logFilePath, string.Empty);
        }

        LogEvent("Database event handlers have been registered.");
    }

    // Unregisters handlers for database events
    [CommandMethod("UnregisterDbEvents")]
    public void UnregisterDbEvents()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;

        db.ObjectAppended -= new ObjectEventHandler(Db_ObjectAppended);
        db.ObjectModified -= new ObjectEventHandler(Db_ObjectModified);
        db.ObjectErased -= new ObjectErasedEventHandler(Db_ObjectErased);

        LogEvent("Database event handlers have been unregistered.");
    }

    private void Db_ObjectAppended(object sender, ObjectEventArgs e)
    {
        LogEvent("An object has been appended to the database. Type: " + e.DBObject.GetType().Name);
    }

    private void Db_ObjectModified(object sender, ObjectEventArgs e)
    {
        LogEvent("An object has been modified in the database. Type: " + e.DBObject.GetType().Name);
    }

    private void Db_ObjectErased(object sender, ObjectErasedEventArgs e)
    {
        string message = e.Erased ? "An object has been erased from the database." : "An object has been unerased in the database.";
        LogEvent(message);
    }

    private void LogEvent(string message)
    {
        using (StreamWriter sw = File.AppendText(logFilePath))
        {
            sw.WriteLine($"{System.DateTime.Now}: {message}");
        }
    }
}

 

It generates a file like this

 

2024/04/25 11:06:49: An object has been modified in the database. Type: Xrecord
2024/04/25 11:06:49: An object has been modified in the database. Type: Xrecord
2024/04/25 11:06:49: An object has been erased from the database.
2024/04/25 11:06:49: An object has been modified in the database. Type: BlockTableRecord
2024/04/25 11:06:49: An object has been erased from the database.
2024/04/25 11:06:49: An object has been erased from the database.
2024/04/25 11:06:49: An object has been erased from the database.

 

It identified an erase event but is there a way to prevent/stop/block that event from happening? Thank you.

1 REPLY 1
Message 2 of 2

You can use an ObjectOverrule for that. See this blog post

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Forma Design Contest


AutoCAD Beta