Ir al contenido

Capítulo 14: Event Handlers - Reaccionar a eventos

Capítulo 14: Event Handlers - Reaccionar a eventos

Sección titulada «Capítulo 14: Event Handlers - Reaccionar a eventos»

Parte II: Primeros pasos con EPLAN API - Sección 5: Atributos de scripting - Nivel: Principiante-Intermedio


Al finalizar este capítulo serás capaz de:

  • Entender qué es un event handler y cuándo usarlo
  • Diferenciar entre [Start], [DeclareAction] y [DeclareEventHandler]
  • Crear scripts que se ejecutan automáticamente al ocurrir eventos
  • Conocer los eventos más comunes de EPLAN
  • Implementar event handlers con y sin parámetros

Antes de comenzar este capítulo debes:

  • Haber completado los Capítulos 12 ([Start]) y 13 ([DeclareAction])
  • Entender atributos de C#
  • Conocer PathMap y CommandLineInterpreter
  • Saber usar try-catch para manejo de errores

Hasta ahora has aprendido dos formas de ejecutar código en EPLAN:

  • [Start] - Se ejecuta manualmente al abrir el script
  • [DeclareAction] - Se ejecuta al llamar la acción por nombre

Pero ¿qué pasa si quieres que tu código se ejecute automáticamente cuando ocurre algo en EPLAN?

Por ejemplo:

  • Cuando el usuario cierra un proyecto
  • Cuando se abre una página
  • Cuando se ejecuta cualquier acción
  • Cuando ocurre un error

Para eso existen los Event Handlers.


Un Event Handler (manejador de eventos) es un método que se ejecuta automáticamente cuando ocurre un evento específico en EPLAN.

Analogía: Es como un detector de movimiento que enciende la luz automáticamente cuando alguien entra a una habitación.

[DeclareEventHandler("NombreDelEvento")]
public void MiMetodo()
{
// Código que se ejecuta cuando ocurre el evento
}

Componentes:

  • [DeclareEventHandler("...")] - Atributo con el nombre del evento
  • "NombreDelEvento" - String que identifica el evento a capturar
  • public void - Método público sin valor de retorno

El atributo está en el mismo namespace que los anteriores:

using Eplan.EplApi.Scripting;

Característica[Start][DeclareAction][DeclareEventHandler]
EjecuciónManual al abrir scriptManual al llamar acciónAutomática al ocurrir evento
NombreAnónimoCon nombreCon nombre de evento
CantidadSolo unoMúltiplesMúltiples
ParámetroNo aceptaNombre de acciónNombre de evento
Uso típicoScripts standaloneAcciones reutilizablesAutomatización reactiva
Cuándo se ejecutaAl abrir el .csAl invocar por nombreAl ocurrir el evento

3.1 Event Handler simple: Al cerrar proyecto

Sección titulada «3.1 Event Handler simple: Al cerrar proyecto»

Archivo: 01_EventHandlerSimple.cs

using System.Windows.Forms;
using Eplan.EplApi.Scripting;
public class EventHandlerSimple
{
[DeclareEventHandler("onActionStart.String.XPrjActionProjectClose")]
public void AlCerrarProyecto()
{
MessageBox.Show("Scripting is great!");
}
}

Evento: onActionStart.String.XPrjActionProjectClose

  • onActionStart - Se ejecuta al INICIAR una acción
  • String - Tipo de dato
  • XPrjActionProjectClose - Acción de cerrar proyecto

Comportamiento: Cada vez que el usuario cierre un proyecto en EPLAN, se mostrará el MessageBox automáticamente.

A diferencia de [Start] y [DeclareAction], los event handlers NO se ejecutan al abrir el script una vez. Necesitas registrarlos para que estén activos.

Formas de registrar:

  1. Ejecutar el script una vez - Algunos event handlers se registran temporalmente
  2. Usar [DeclareRegister] - Para que se carguen automáticamente al iniciar EPLAN (Capítulo 15)

Basándome en los scripts oficiales de EPLAN-Scripting-4.0, estos son los eventos documentados:

Evento: Eplan.EplApi.OnUserPreCloseProject

  • Cuándo se ejecuta: Antes de cerrar un proyecto
  • Uso típico: Realizar acciones finales (exportar, guardar configuración, limpiar archivos temporales)

Ejemplo:

[DeclareEventHandler("Eplan.EplApi.OnUserPreCloseProject")]
public void AntesDeCerrarProyecto()
{
MessageBox.Show("El proyecto se va a cerrar");
}

Evento: onActionStart.String.<NombreAccion>

  • Cuándo se ejecuta: Al INICIAR una acción específica
  • Uso típico: Preparar datos antes de ejecutar una acción

Ejemplo:

[DeclareEventHandler("onActionStart.String.XPrjActionProjectClose")]
public void AntesDeAccion()
{
MessageBox.Show("Se va a ejecutar la acción de cerrar proyecto");
}

Evento: onActionEnd.String.*

  • Cuándo se ejecuta: Al FINALIZAR cualquier acción (el asterisco es wildcard)
  • Uso típico: Logging, captura de errores, auditoría

Ejemplo:

[DeclareEventHandler("onActionEnd.String.*")]
public void DespuesDeAccion(IEventParameter iEventParameter)
{
// Se ejecuta después de CUALQUIER acción en EPLAN
}

Nota: Este event handler requiere el parámetro IEventParameter para obtener información del evento.


Algunos eventos proporcionan información adicional sobre lo que ocurrió. Para acceder a esa información, el event handler debe aceptar un parámetro de tipo IEventParameter.

[DeclareEventHandler("NombreDelEvento")]
public void MiMetodo(IEventParameter iEventParameter)
{
// Acceder a información del evento
}

5.3 Ejemplo avanzado: Capturar nombre de acción

Sección titulada «5.3 Ejemplo avanzado: Capturar nombre de acción»

Este ejemplo está basado en EPLAN-Scripting-4.0/99_AdditionalExamples/12_HTTPServerEplan/ActionNameServer/actionNameOnServer.cs:

using System;
using Eplan.EplApi.Scripting;
using Eplan.EplApi.ApplicationFramework;
using System.Windows.Forms;
public class EventHandlerAvanzado
{
[DeclareEventHandler("onActionEnd.String.*")]
public long DespuesDeCualquierAccion(IEventParameter iEventParameter)
{
try
{
// Convertir IEventParameter a EventParameterString
EventParameterString oEventParameterString = new EventParameterString(iEventParameter);
// Extraer el nombre de la acción ejecutada
string nombreAccion = oEventParameterString.String;
// Hacer algo con el nombre de la acción
// Ejemplo: Logging, auditoría, enviar a servidor, etc.
MessageBox.Show("Se ejecutó: " + nombreAccion);
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
return 0;
}
}

Línea 14-15: Conversión de parámetro

EventParameterString oEventParameterString = new EventParameterString(iEventParameter);
string nombreAccion = oEventParameterString.String;
  • IEventParameter es la interfaz base para parámetros de eventos
  • EventParameterString es una implementación concreta que contiene un string
  • Se crea un EventParameterString a partir del IEventParameter
  • La propiedad .String contiene el valor (en este caso, el nombre de la acción ejecutada)

Valor de retorno: Los event handlers con IEventParameter pueden devolver long (aunque generalmente se devuelve 0).


6. Proyecto del capítulo: Exportar PDF al cerrar

Sección titulada «6. Proyecto del capítulo: Exportar PDF al cerrar»

Crear un event handler que pregunte al usuario si desea exportar el proyecto a PDF antes de cerrarlo.

Este script está basado directamente en EPLAN-Scripting-4.0/16_Export/03_PdfOnClosing.cs:

using System.IO;
using System.Windows.Forms;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;
public class ExportarPdfAlCerrar
{
[DeclareEventHandler("Eplan.EplApi.OnUserPreCloseProject")]
public void AlCerrarProyecto()
{
// Obtener información del proyecto usando PathMap
string rutaDocumentos = PathMap.SubstitutePath("$(DOC)");
string nombreProyecto = PathMap.SubstitutePath("$(PROJECTNAME)");
// Preguntar al usuario
DialogResult resultado = MessageBox.Show(
"Do you want export a PDF for project '" + nombreProyecto + "' ?",
"PDF-Export",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);
if (resultado == DialogResult.Yes)
{
// Crear barra de progreso
Progress progress = new Progress("SimpleProgress");
progress.SetAllowCancel(true);
progress.SetAskOnCancel(true);
progress.BeginPart(100, "");
progress.ShowImmediately();
// Preparar exportación
CommandLineInterpreter cli = new CommandLineInterpreter();
ActionCallingContext acc = new ActionCallingContext();
string archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);
acc.AddParameter("TYPE", "PDFPROJECTSCHEME");
acc.AddParameter("EXPORTFILE", archivoCompleto);
acc.AddParameter("EXPORTSCHEME", "EPLAN_default_value");
// Ejecutar exportación
cli.Execute("export", acc);
// Cerrar barra de progreso
progress.EndPart(true);
}
}
}

Líneas 9-10: Obtener información del proyecto

string rutaDocumentos = PathMap.SubstitutePath("$(DOC)");
string nombreProyecto = PathMap.SubstitutePath("$(PROJECTNAME)");
  • $(DOC) - Ruta de la carpeta de documentos del proyecto
  • $(PROJECTNAME) - Nombre del proyecto actual

Líneas 12-18: Preguntar al usuario

DialogResult resultado = MessageBox.Show(
"Do you want export a PDF for project '" + nombreProyecto + "' ?",
"PDF-Export",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question
);

Muestra un diálogo con botones Sí/No.

Líneas 20-27: Crear barra de progreso

Progress progress = new Progress("SimpleProgress");
progress.SetAllowCancel(true);
progress.SetAskOnCancel(true);
progress.BeginPart(100, "");
progress.ShowImmediately();

Muestra barra de progreso durante la exportación.

Líneas 29-35: Configurar exportación

CommandLineInterpreter cli = new CommandLineInterpreter();
ActionCallingContext acc = new ActionCallingContext();
string archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);
acc.AddParameter("TYPE", "PDFPROJECTSCHEME");
acc.AddParameter("EXPORTFILE", archivoCompleto);
acc.AddParameter("EXPORTSCHEME", "EPLAN_default_value");
  • TYPE: Tipo de exportación (PDF de esquema de proyecto)
  • EXPORTFILE: Ruta donde guardar el PDF
  • EXPORTSCHEME: Esquema de exportación a usar

Líneas 37-41: Ejecutar y finalizar

cli.Execute("export", acc);
progress.EndPart(true);

Ejecuta la exportación y cierra la barra de progreso.


Automatización completa:

  • No requiere intervención del usuario
  • Se ejecutan en el momento exacto necesario
  • Permiten workflows automáticos

Casos de uso:

  • Exportar automáticamente al cerrar proyecto
  • Validar datos antes de guardar
  • Logging de todas las acciones
  • Sincronización automática con sistemas externos
  • Auditoría de cambios

No persisten entre sesiones:

  • Los event handlers solo están activos mientras el script esté cargado
  • Para tenerlos siempre activos, debes usar [DeclareRegister] (Capítulo 15)

Difíciles de debuggear:

  • Se ejecutan automáticamente, puede ser difícil saber cuándo y por qué
  • Errores pueden pasar desapercibidos

Documentación limitada:

  • No hay lista oficial completa de todos los eventos disponibles
  • Debes investigar o basarte en ejemplos

Error: Crear el script pero nunca ejecutarlo, esperando que funcione automáticamente.

Solución: Debes ejecutar el script al menos una vez para registrar el event handler, o usar [DeclareRegister] para carga automática.

Error:

[DeclareEventHandler("onProjectClose")] // ✗ Nombre incorrecto

Solución: Usa los nombres exactos de eventos documentados. Los nombres son case-sensitive.

Error:

[DeclareEventHandler("onActionEnd.String.*")]
public void Bloqueante(IEventParameter iEventParameter)
{
// Operación muy larga sin Progress
for (int i = 0; i < 1000000; i++) {
// ...
}
}

Solución: Los event handlers deben ser rápidos. Si necesitas operaciones largas, usa Progress o ejecución asíncrona.


En este capítulo aprendiste:

  • Los Event Handlers se ejecutan automáticamente cuando ocurre un evento
  • Se declaran con el atributo [DeclareEventHandler(“NombreEvento”)]
  • Eventos principales: Eplan.EplApi.OnUserPreCloseProject, onActionStart.String.*, onActionEnd.String.*
  • Event handlers pueden tener parámetros (IEventParameter) para acceder a información del evento
  • Usos típicos: exportación automática, validación, logging, auditoría
  • Requieren registro para estar activos (temporal o permanente con [DeclareRegister])

P: ¿Dónde está la lista completa de eventos disponibles?

R: No hay una lista pública oficial completa. Los eventos documentados aparecen en los scripts de ejemplo de EPLAN-Scripting-4.0. También puedes consultarlos en la documentación de la API (EplanAPI.chm).

P: ¿Puedo tener múltiples event handlers en el mismo script?

R: Sí, puedes tener varios [DeclareEventHandler] para diferentes eventos en el mismo archivo.

P: ¿Los event handlers persisten después de cerrar EPLAN?

R: No. Debes volver a ejecutar el script cada vez que abras EPLAN, o usar [DeclareRegister] para carga automática (próximo capítulo).

P: ¿Puedo cancelar un evento?

R: Depende del evento. Algunos eventos como OnUserPreCloseProject permiten cierta interacción, pero no estoy al 90% seguro de cómo cancelar eventos sin más documentación.


Capítulo 13: [DeclareAction] - Acciones personalizadas

Capítulo 15: Register/Unregister - Carga automática

En el próximo capítulo aprenderás a hacer que tus scripts y event handlers se carguen automáticamente al iniciar EPLAN.


Última actualización: Enero 2025 Tiempo de lectura estimado: 25-30 minutos Código de ejemplo: code/cap-14/ Scripts de referencia:

  • EPLAN-Scripting-4.0/01_FirstSteps/03_DeclareEventHandler.cs
  • EPLAN-Scripting-4.0/16_Export/03_PdfOnClosing.cs