Community
Civil 3D Customization
Welcome to Autodesk’s AutoCAD Civil 3D Forums. Share your knowledge, ask questions, and explore popular AutoCAD Civil 3D Customization topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Add more than one handler for specific event.

1 REPLY 1
Reply
Message 1 of 2
joantopo
752 Views, 1 Reply

Add more than one handler for specific event.

Hi.

 

I have method (GetAlineaciones) = GetAlignments to get all alignments in active document.

 

  public static List<Alignments> GetAlineaciones()     
        {
               
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;  // por si queremos preguntar o responder en la línea de comandos
            Database db = Application.DocumentManager.MdiActiveDocument.Database;

            Autodesk.Civil.ApplicationServices.CivilDocument civDoc = default(Autodesk.Civil.ApplicationServices.CivilDocument);
            civDoc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument; //obtener el documento de Civil
            ObjectIdCollection alignColl = civDoc.GetAlignmentIds();  //obtener la colección de alineaciones

    
            if (alignColl.Count == 0)  //alignColl=align collection
            {
                return null;
            }
            List<toolsC3D.Alignments> aligns = new List<toolsC3D.Alignments>();   // instancia de la nueva lista
            Alignments aBobj = default(Alignments);
            using (Transaction trans = HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
            {
                int i = 0;
                foreach (ObjectId id in alignColl)  // para cada alineación abierta para leer
                {
                    try
                    {
                        Alignment align = trans.GetObject(id, OpenMode.ForRead) as Alignment;
 
                        aBobj = new toolsC3D.Alignments();

                        aBobj.Id = align.Id;
                        aBobj.IdString = align.Id.ToString(); //tendremos el Id también como string
                        //aBobj.IndiceFila = i; //posición que ocupa en la lista empezando por 0
                        aBobj.Name = align.Name;                    
                        aBobj.Description = align.Description;      
                        aBobj.CriteriaFileName = align.CriteriaFileName;   
                        aBobj.DesignCheckSetName = align.DesignCheckSetName;  
                        aBobj.Length = align.Length;                    
                        aBobj.UseDesignCriteriaFile = align.UseDesignCriteriaFile;
                        aBobj.UseDesignCheckSet = align.UseDesignCheckSet;
                        aBobj.AlignmentType = align.AlignmentType;
                        aBobj.StartingStation = align.StartingStation;
                        aBobj.EndingStation = align.EndingStation;
                        aBobj.stringStartingStation = functions.funciones_genéricas.formatoPK(align.StartingStation);  //string p.k inicial
                        aBobj.stringLength = functions.funciones_genéricas.stringdecimales(align.Length,variables_globales.decimalesLongitud) + " m."; //string
                     
                        
                        aBobj.DesignSpeedCollection = align.DesignSpeeds;  // la colección de los tramos de Vp

                      
                   

                        if (align.SuperelevationCriticalStations.Count < 2)  //si count=0 es que no se ha calculado. Si es count=2 se calculó pero se han eliminado los puntos críticos y sólo queda el inicial y final de alineación
                        {
                           aBobj.CalculoPeraltes = "No";   
                       }
                      else
                        {
                            if (align.SuperelevationCriticalStations.Count == 2)
                            {
                                aBobj.CalculoPeraltes = "**Sin datos**";   
                            }
                            else
                            {
                                aBobj.CalculoPeraltes = functions.FunctionsPeraltes.DevolverNombreCurva(functions.FunctionsPeraltes.NombreCurvaPrimera(align.Id),align.Id);
                            }
                            
                           
                        }
                     
                 
                        aligns.Add(aBobj);  // se va añadiendo cada alineación, con sus propiedades, a la lista(aligns)

                        i++;

                        if (variables_globales.regenAlinAUTO == true)
                        {
                            //permitimos los eventos (+=)

                            Document doc = Application.DocumentManager.MdiActiveDocument;

                                align.Erased += new ObjectErasedEventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                // align.Reappended += new EventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin); //si se elimina del dibujo y se vuelve a recuperar con un "deshacer" ctrl+z
                                //align.Unappended += new EventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                align.Copied += new ObjectEventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                doc.Database.ObjectModified += new ObjectEventHandler(callback_ObjectModified);
                                doc.CommandEnded += new CommandEventHandler(callback_CommandEnded);

                                //align.Modified += new EventHandler(callback_ObjectModified);
                        }
                        else
                        {

                        }


                    }
                    catch
                    {
                    }
                }
            }
            return aligns;
        }

 

 

However, I want add more than one handler (one for each alignment) for specific event.

If one alignment has already one handler (for example ObjectModified) I don´t want to add again  the same handler.

 

Now, I have this in this method:

 

    if (variables_globales.regenAlinAUTO == true)
                        {
                            //permitimos los eventos (+=)

                            Document doc = Application.DocumentManager.MdiActiveDocument;

                                align.Erased += new ObjectErasedEventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                // align.Reappended += new EventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin); //si se elimina del dibujo y se vuelve a recuperar con un "deshacer" ctrl+z
                                //align.Unappended += new EventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                align.Copied += new ObjectEventHandler(TypeViewer.TypeViewerControl.ProcesRegenAlin);
                                doc.Database.ObjectModified += new ObjectEventHandler(callback_ObjectModified);
                                doc.CommandEnded += new CommandEventHandler(callback_CommandEnded);

                                //align.Modified += new EventHandler(callback_ObjectModified);
                        }
                        else
                        {

                        }

 I have read this:

http://adndevblog.typepad.com/autocad/2013/04/removing-all-custom-handlers-of-an-event.html

 

and I have read about: GetInvocationList() but I don´t understand it.

 

 

Thank you.

 

 

Autocad C3D 2019 SP3, 2020 & 2021
Intel I9 9900K with frontal watercooler alphacool eisbaer 360 (original fans mounted in pull)- 3 fans Corsair 120 ML PRO in push.
MOBO Gygabyte Z390 Aorus Master- Corsair RGB Vengeance 64GB RAM (4x16) CL16
Nvidia Quadro RTX 4000
Samsung 970 EVO PLUS 1TB (unit C). Samsung 970 PRO 512GB (for data)
Power Supply: Corsair TX850M PLUS


Descubre mi programa VisorNET para Civil 3D:
https://apps.autodesk.com/CIV3D/es/Detail/Index?id=appstore.exchange.autodesk.com%3avisornet_windows32and64%3aes
1 REPLY 1
Message 2 of 2

In this case, why not track the events at the Database level? That way you track all and avoid duplicated handles...
Regards,



Augusto Goncalves
Twitter @augustomaia
Autodesk Developer Network

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

Post to forums  

Rail Community


Autodesk Design & Make Report