[{"data":1,"prerenderedAt":78966},["ShallowReactive",2],{"guia-\u002Fguia\u002Fcasos-reales\u002Fcap-36-remoting\u002F":3,"guia-all-chapters":244},{"id":4,"title":5,"body":6,"description":235,"extension":236,"meta":237,"navigation":238,"path":239,"seo":240,"stem":241,"tagline":242,"__hash__":243},"guia\u002Fguia\u002Fcasos-reales\u002Fcap-36-remoting.md","Capítulo 36: EPLAN Remoting: control desde otra app",{"type":7,"value":8,"toc":227},"minimark",[9,27,35,42,45,50,58,61,63,67,81,84,114,116,120,125,137,142,158,160,164,167,210,217,220,222],[10,11,12],"blockquote",{},[13,14,15,19,20,19,23,26],"p",{},[16,17,18],"strong",{},"Parte XIII"," - ",[16,21,22],{},"Sección 27",[16,24,25],{},"Nivel",": Experto",[13,28,29,30,34],{},"Llegamos al final del viaje con la técnica de integración definitiva.\nHasta ahora, nuestros scripts vivían ",[31,32,33],"em",{},"dentro"," de EPLAN. Pero, ¿y si tenemos una aplicación externa (un configurador de ventas en .NET, un programa de lotes nocturnos) que necesita \"conducir\" EPLAN?",[13,36,37,38,41],{},"Para esto existe ",[16,39,40],{},"EPLAN Remoting",".",[43,44],"hr",{},[46,47,49],"h2",{"id":48},"_1-cómo-funciona","1. ¿Cómo funciona?",[13,51,52,53,57],{},"Cuando EPLAN arranca, levanta un servidor TCP interno (oculto).\nUsando la librería ",[54,55,56],"code",{},"Eplan.EplApi.RemoteClient.dll",", podemos conectarnos a ese puerto y enviarle comandos (\"Action Strings\").",[13,59,60],{},"Es como tener a un operador invisible tecleando comandos en la consola de EPLAN.",[43,62],{},[46,64,66],{"id":65},"_2-el-código-cliente-externo","2. El Código (Cliente Externo)",[13,68,69,70,73,74,77,78,41],{},"El archivo ",[54,71,72],{},"01_ConsolaExterna.cs"," ",[16,75,76],{},"NO"," es un script CS. Es código para crear un ",[54,79,80],{},".exe",[13,82,83],{},"Los pasos son:",[85,86,87,98,106],"ol",{},[88,89,90,93,94,97],"li",{},[16,91,92],{},"Descubrimiento",": ",[54,95,96],{},"GetActiveEplanServersOnLocalMachine"," nos dice qué EPLANes están abiertos y en qué puertos.",[88,99,100,93,103,41],{},[16,101,102],{},"Conexión",[54,104,105],{},"Connect(\"localhost\", port)",[88,107,108,93,111,41],{},[16,109,110],{},"Ejecución",[54,112,113],{},"ExecuteAction(\"nombreAccion \u002Fparam:valor\")",[43,115],{},[46,117,119],{"id":118},"_3-limitaciones-y-casos-de-uso","3. Limitaciones y Casos de Uso",[13,121,122],{},[16,123,124],{},"Ventajas:",[126,127,128,131,134],"ul",{},[88,129,130],{},"Permite orquestar EPLAN desde fuera.",[88,132,133],{},"La aplicación externa no se congela si se gestiona bien.",[88,135,136],{},"Puedes controlar múltiples instancias de EPLAN.",[13,138,139],{},[16,140,141],{},"Desventajas:",[126,143,144,155],{},[88,145,146,147,150,151,154],{},"Solo puedes invocar ",[16,148,149],{},"Acciones"," (CLI). No puedes acceder al Modelo de Objetos (DOM) directamente desde fuera (como leer ",[54,152,153],{},"Page.Name",").",[88,156,157],{},"Para leer datos complejos, solías tener que escribir un script dentro de EPLAN que exporte a TXT, ejecutarlo por Remoting, y luego leer el TXT desde fuera.",[43,159],{},[46,161,163],{"id":162},"_4-gran-final","4. GRAN FINAL",[13,165,166],{},"Hemos recorrido un largo camino:",[85,168,169,174,180,186,192,198,204],{},[88,170,171],{},[16,172,173],{},"Fundamentos de C#",[88,175,176,179],{},[16,177,178],{},"Scripts básicos"," con MessageBox.",[88,181,182,185],{},[16,183,184],{},"Automatización"," de páginas y macros.",[88,187,188,191],{},[16,189,190],{},"Interfaces"," con Windows Forms.",[88,193,194,197],{},[16,195,196],{},"Archivos"," y Sistemas de Archivos.",[88,199,200,203],{},[16,201,202],{},"Master Data"," y Bases de Datos.",[88,205,206,209],{},[16,207,208],{},"Conectividad"," HTTP y Remoting.",[13,211,212,213,216],{},"Ahora tienes las herramientas para convertirte en un ",[16,214,215],{},"Arquitecto de Automatización EPLAN",".\nEl límite ya no es la herramienta, es tu imaginación.",[13,218,219],{},"¡Feliz Scripting!",[43,221],{},[13,223,224],{},[16,225,226],{},"FIN DEL LIBRO",{"title":228,"searchDepth":229,"depth":229,"links":230},"",2,[231,232,233,234],{"id":48,"depth":229,"text":49},{"id":65,"depth":229,"text":66},{"id":118,"depth":229,"text":119},{"id":162,"depth":229,"text":163},"Usa EPLAN Remoting para controlar EPLAN Electric P8 desde una aplicación externa en C# y automatizar procesos por lotes.","md",{},true,"\u002Fguia\u002Fcasos-reales\u002Fcap-36-remoting",{"title":5,"description":235},"guia\u002Fcasos-reales\u002Fcap-36-remoting",null,"XbR6n3PghK2hpdL4LtrxJMJ9Hh-FiOENKalrTvLwRgA",[245,681,2268,5869,10739,16760,22980,29308,33334,36397,42572,49586,51897,54604,56368,58580,60017,62019,63587,65417,67022,68709,69615,70249,72342,74573,75241,75731,76597,77228,77614,78058,78296,78487,78648,78815],{"id":246,"title":247,"body":248,"description":675,"extension":236,"meta":676,"navigation":238,"path":677,"seo":678,"stem":679,"tagline":242,"__hash__":680},"guia\u002Fguia\u002Ffundamentos\u002Fcap-01-introduccion-programacion.md","Capítulo 1: Introducción a C# para EPLAN",{"type":7,"value":249,"toc":663},[250,263,265,269,272,315,317,321,324,326,330,335,338,343,346,349,363,366,371,374,382,390,392,396,402,405,411,417,428,431,436,481,484,486,490,497,501,527,531,534,568,571,573,577,580,622,624,628,631,642,645,647,653,659],[10,251,252],{},[13,253,254,19,257,19,260,262],{},[16,255,256],{},"Parte I",[16,258,259],{},"Sección 1: Introducción",[16,261,25],{},": Principiante",[43,264],{},[46,266,268],{"id":267},"objetivos-de-aprendizaje","Objetivos de aprendizaje",[13,270,271],{},"Al finalizar este capítulo comprenderás:",[126,273,276,288,297,306],{"className":274},[275],"contains-task-list",[88,277,280,73,284,287],{"className":278},[279],"task-list-item",[281,282],"input",{"disabled":238,"type":283},"checkbox",[16,285,286],{},"Qué es realmente programar"," (más allá de escribir código).",[88,289,291,73,293,296],{"className":290},[279],[281,292],{"disabled":238,"type":283},[16,294,295],{},"Qué es un algoritmo"," y cómo los usas cada día sin saberlo.",[88,298,300,73,302,305],{"className":299},[279],[281,301],{"disabled":238,"type":283},[16,303,304],{},"Por qué usamos C#"," para automatizar EPLAN.",[88,307,309,73,311,314],{"className":308},[279],[281,310],{"disabled":238,"type":283},[16,312,313],{},"Cómo funciona la comunicación"," entre tú, el código y la máquina.",[43,316],{},[46,318,320],{"id":319},"requisitos-previos","Requisitos previos",[13,322,323],{},"Ninguno. Este es el primer contacto técnico. Solo necesitas curiosidad.",[43,325],{},[46,327,329],{"id":328},"contenido","Contenido",[331,332,334],"h3",{"id":333},"_1-qué-es-programar","1. ¿Qué es programar?",[13,336,337],{},"A menudo se piensa que programar es \"escribir líneas de texto críptico en una pantalla negra\". Esa es la forma, pero no el fondo.",[13,339,340],{},[16,341,342],{},"Programar es el arte de dar instrucciones precisas.",[13,344,345],{},"Imagina que tienes un asistente muy trabajador y extremadamente rápido, pero completamente literal y sin sentido común. Ese asistente es la computadora.",[13,347,348],{},"Si le dices \"tráeme un café\", el asistente se quedará quieto. ¿Por qué? Porque la instrucción es ambigua.",[126,350,351,354,357,360],{},[88,352,353],{},"¿De dónde saco el café?",[88,355,356],{},"¿En qué taza?",[88,358,359],{},"¿Con azúcar?",[88,361,362],{},"¿Caliente o frío?",[13,364,365],{},"Programar consiste en romper una tarea compleja (hacer un café) en una serie de pasos tan simples e inequívocos que no haya lugar a error.",[367,368,370],"h4",{"id":369},"la-precisión-es-la-clave","La precisión es la clave",[13,372,373],{},"Las computadoras no \"entienden\" lo que quieres, solo ejecutan lo que escribes.",[126,375,376,379],{},[88,377,378],{},"Si escribes mal una instrucción, el programa fallará.",[88,380,381],{},"Si la lógica es incorrecta, el programa hará algo incorrecto (pero lo hará muy rápido).",[10,383,384],{},[13,385,386,389],{},[16,387,388],{},"Regla de oro",": El error casi nunca es de la máquina. Es de las instrucciones que le dimos.",[43,391],{},[331,393,395],{"id":394},"_2-el-algoritmo-la-receta-de-cocina","2. El Algoritmo: La receta de cocina",[13,397,398,399,41],{},"La palabra \"algoritmo\" suena intimidante, pero es simplemente una ",[16,400,401],{},"secuencia ordenada de pasos para resolver un problema",[13,403,404],{},"El ejemplo más clásico es una receta de cocina.",[13,406,407,410],{},[16,408,409],{},"Problema",": Hacer un sándwich de jamón y queso.",[13,412,413,416],{},[16,414,415],{},"Algoritmo Humano",":",[85,418,419,422,425],{},[88,420,421],{},"Agarra dos panes.",[88,423,424],{},"Ponles jamón y queso.",[88,426,427],{},"Cómelo.",[13,429,430],{},"Esto funciona porque los humanos tenemos contexto y sentido común.",[13,432,433,416],{},[16,434,435],{},"Algoritmo Computacional (Programación)",[85,437,438,443,455,458,461,464,467,470,473,476],{},[88,439,440,41],{},[16,441,442],{},"Inicio",[88,444,445,446],{},"Verificar si hay pan en la despensa.\n",[126,447,448],{},[88,449,450,451,454],{},"Si NO hay pan: ",[16,452,453],{},"Error",", detener proceso.",[88,456,457],{},"Tomar 2 rebanadas de pan.",[88,459,460],{},"Colocar rebanada A sobre el plato.",[88,462,463],{},"Tomar 1 rebanada de jamón.",[88,465,466],{},"Colocar jamón sobre rebanada A.",[88,468,469],{},"Tomar 1 rebanada de queso.",[88,471,472],{},"Colocar queso sobre jamón.",[88,474,475],{},"Colocar rebanada B sobre queso.",[88,477,478,41],{},[16,479,480],{},"Fin",[13,482,483],{},"Cuando aprendas a programar, aprenderás a pensar de esta manera estructurada. EPLAN no \"hace los planos solos\", tú le dices paso a paso cómo hacerlos.",[43,485],{},[331,487,489],{"id":488},"_3-el-lenguaje-por-qué-c","3. El Lenguaje: ¿Por qué C#?",[13,491,492,493,496],{},"Para comunicarnos con la computadora necesitamos un idioma común. Existen cientos de lenguajes de programación (Python, Java, C++, JavaScript), pero en el mundo de EPLAN, el rey es ",[16,494,495],{},"C#"," (leído \"C Sharp\").",[367,498,500],{"id":499},"por-qué-c","¿Por qué C#?",[85,502,503,509,515,521],{},[88,504,505,508],{},[16,506,507],{},"Es el lenguaje nativo de EPLAN API",": EPLAN está construido sobre tecnología .NET de Microsoft, y C# es el lenguaje principal de .NET.",[88,510,511,514],{},[16,512,513],{},"Es moderno y potente",": Te permite hacer desde scripts simples hasta aplicaciones complejas.",[88,516,517,520],{},[16,518,519],{},"Es fuertemente tipado",": El lenguaje te ayuda a evitar errores antes de ejecutar el código (te avisa si intentas sumar \"peras\" con \"manzanas\").",[88,522,523,526],{},[16,524,525],{},"Gran comunidad",": Hay millones de desarrolladores C# en el mundo. Si tienes una duda, alguien ya la ha resuelto en Internet.",[367,528,530],{"id":529},"código-fuente-vs-código-máquina","Código Fuente vs. Código Máquina",[13,532,533],{},"Las computadoras solo entienden \"ceros y unos\" (código binario). Nosotros entendemos texto.",[85,535,536,557,563],{},[88,537,538,541,542],{},[16,539,540],{},"Código Fuente",": Lo que tú escribes en C#. Es legible por humanos (más o menos).\n",[543,544,548],"pre",{"className":545,"code":546,"language":547,"meta":228,"style":228},"language-csharp shiki shiki-themes github-light github-dark","MessageBox.Show(\"Hola Mundo\");\n","csharp",[54,549,550],{"__ignoreMap":228},[551,552,555],"span",{"class":553,"line":554},"line",1,[551,556,546],{},[88,558,559,562],{},[16,560,561],{},"Compilador",": Es un traductor. Toma tu código C# y lo traduce a un lenguaje intermedio que la computadora puede procesar.",[88,564,565,567],{},[16,566,110],{},": La computadora sigue las instrucciones traducidas.",[13,569,570],{},"Cuando escribes scripts en EPLAN, el proceso es casi transparente para ti, pero es importante saber que ocurre esa \"traducción\".",[43,572],{},[331,574,576],{"id":575},"_4-conceptos-fundamentales-que-veremos","4. Conceptos fundamentales que veremos",[13,578,579],{},"Durante la Parte I de la guía, exploraremos los bloques de construcción de cualquier programa. No te preocupes por memorizarlos ahora, solo familiarízate con los nombres:",[126,581,582,588,594,603,612],{},[88,583,584,587],{},[16,585,586],{},"Variables",": Son \"cajas\" donde guardamos datos. Una caja para guardar un número, otra para guardar un texto (como el nombre de un proyecto).",[88,589,590,593],{},[16,591,592],{},"Tipos de datos",": Definen qué cabe en cada caja. En una caja de \"Números Enteros\" no puedes guardar el texto \"Hola\".",[88,595,596,599,600],{},[16,597,598],{},"Condicionales (If\u002FElse)",": Permiten tomar decisiones. ",[31,601,602],{},"\"Si el proyecto tiene más de 100 páginas, expórtalo en PDF. Si no, no hagas nada.\"",[88,604,605,608,609],{},[16,606,607],{},"Bucles (Loops)",": Permiten repetir tareas. ",[31,610,611],{},"\"Por cada página del proyecto, escribe su nombre en un Excel.\"",[88,613,614,617,618,621],{},[16,615,616],{},"Funciones\u002FMétodos",": Son acciones agrupadas. ",[31,619,620],{},"\"ImprimirPlano()\""," podría contener los 20 pasos necesarios para imprimir, resumidos en una sola orden.",[43,623],{},[331,625,627],{"id":626},"_5-resumen","5. Resumen",[13,629,630],{},"Programar no es magia. Es el proceso de:",[85,632,633,636,639],{},[88,634,635],{},"Entender un problema.",[88,637,638],{},"Diseñar una solución paso a paso (algoritmo).",[88,640,641],{},"Traducir esos pasos a un lenguaje que la máquina entienda (C#).",[13,643,644],{},"En el siguiente capítulo configuraremos tu entorno para que puedas escribir y ejecutar tus primeras líneas de código.",[43,646],{},[13,648,649,652],{},[16,650,651],{},"Siguiente paso:"," Capítulo 2 - Tu entorno de trabajo.",[13,654,655,658],{},[16,656,657],{},"Última actualización",": Enero 2026",[660,661,662],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":228,"searchDepth":229,"depth":229,"links":664},[665,666,667],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":328,"depth":229,"text":329,"children":668},[669,671,672,673,674],{"id":333,"depth":670,"text":334},3,{"id":394,"depth":670,"text":395},{"id":488,"depth":670,"text":489},{"id":575,"depth":670,"text":576},{"id":626,"depth":670,"text":627},"Empieza a programar en C# para automatizar EPLAN Electric P8. Aprende los fundamentos desde cero, sin experiencia previa. Guía gratuita paso a paso.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-01-introduccion-programacion",{"title":247,"description":675},"guia\u002Ffundamentos\u002Fcap-01-introduccion-programacion","Py2XIL34wFOO5e2jRRruLk_uexYMf9fKSxg4IcTRGKQ",{"id":682,"title":683,"body":684,"description":2262,"extension":236,"meta":2263,"navigation":238,"path":2264,"seo":2265,"stem":2266,"tagline":242,"__hash__":2267},"guia\u002Fguia\u002Ffundamentos\u002Fcap-02-tu-entorno.md","Capítulo 2: Entorno para scripts EPLAN en C#",{"type":7,"value":685,"toc":2243},[686,696,698,700,703,720,722,724,727,735,737,741,746,749,755,757,759,763,766,769,789,791,795,799,802,813,816,818,822,825,829,836,839,842,850,855,881,885,888,902,905,907,911,918,922,927,932,949,960,965,987,992,996,1007,1012,1020,1028,1033,1037,1048,1052,1063,1073,1077,1080,1099,1105,1107,1111,1114,1194,1200,1204,1221,1227,1233,1236,1256,1260,1282,1288,1294,1301,1329,1336,1342,1348,1350,1354,1357,1361,1401,1405,1408,1480,1484,1500,1504,1507,1538,1543,1546,1552,1557,1563,1565,1569,1572,1588,1594,1607,1616,1633,1638,1651,1672,1677,1697,1710,1716,1718,1722,1725,1891,1896,1910,1916,1926,1928,1932,1938,1942,1956,1963,1965,1969,1973,1979,1984,1991,1995,2000,2004,2022,2024,2028,2031,2035,2060,2066,2086,2091,2116,2119,2121,2125,2128,2133,2162,2167,2206,2211,2222,2227,2235,2237,2241],[10,687,688],{},[13,689,690,19,692,19,694,262],{},[16,691,256],{},[16,693,259],{},[16,695,25],{},[43,697],{},[46,699,268],{"id":267},[13,701,702],{},"Al finalizar este capítulo serás capaz de:",[126,704,705,708,711,714,717],{},[88,706,707],{},"Configurar correctamente las carpetas de scripts en EPLAN",[88,709,710],{},"Elegir y configurar un editor de texto adecuado",[88,712,713],{},"Entender la estructura básica de un script EPLAN",[88,715,716],{},"Ejecutar tu primer script \"Hello World\" en EPLAN",[88,718,719],{},"Configurar el entorno para el resto de la guía",[43,721],{},[46,723,320],{"id":319},[13,725,726],{},"Antes de comenzar este capítulo debes:",[126,728,729,732],{},[88,730,731],{},"Tener instalado EPLAN Electric P8 (versión 2020 o superior)",[88,733,734],{},"Haber leído el Capítulo 1 y estar motivado para empezar",[43,736],{},[46,738,740],{"id":739},"proyecto-del-capítulo","Proyecto del capítulo",[13,742,743],{},[16,744,745],{},"Tu primer script funcional en EPLAN",[13,747,748],{},"Al final de este capítulo habrás ejecutado tu primer script que mostrará un mensaje en EPLAN. No entenderás todavía el código (eso viene después), pero verás que SÍ puedes hacer que EPLAN ejecute tus instrucciones.",[13,750,751,754],{},[16,752,753],{},"Tiempo estimado",": 30-45 minutos",[43,756],{},[46,758,329],{"id":328},[331,760,762],{"id":761},"_1-introducción","1. Introducción",[13,764,765],{},"Antes de escribir código, necesitas preparar tu espacio de trabajo. Piensa en esto como organizar tu taller antes de empezar un proyecto: necesitas saber dónde están tus herramientas, cómo acceder a ellas, y tener todo ordenado.",[13,767,768],{},"En este capítulo configuraremos:",[85,770,771,777,783],{},[88,772,773,776],{},[16,774,775],{},"Carpetas de scripts",": Dónde guardar tus archivos .cs",[88,778,779,782],{},[16,780,781],{},"Editor de texto",": Dónde escribir código cómodamente",[88,784,785,788],{},[16,786,787],{},"EPLAN",": Cómo ejecutar scripts desde la interfaz",[43,790],{},[331,792,794],{"id":793},"_2-versión-de-eplan","2. Versión de EPLAN",[367,796,798],{"id":797},"_21-diferencias-entre-versiones","2.1 Diferencias entre versiones",[13,800,801],{},"Si tienes una versión más antigua (2020-2025):",[126,803,804,807,810],{},[88,805,806],{},"La mayoría del código funcionará igual",[88,808,809],{},"Puede haber pequeñas diferencias en nombres de métodos",[88,811,812],{},"Algunas funcionalidades nuevas no estarán disponibles",[13,814,815],{},"Si encuentras alguna incompatibilidad, revisa la documentación de tu versión.",[43,817],{},[331,819,821],{"id":820},"_3-estructura-de-carpetas-para-scripts","3. Estructura de carpetas para scripts",[13,823,824],{},"EPLAN puede ejecutar scripts desde varias ubicaciones. Vamos a crear una estructura organizada que usaremos durante toda la guía.",[367,826,828],{"id":827},"_31-carpeta-principal-de-scripts","3.1 Carpeta principal de scripts",[13,830,831,832,835],{},"Para facilitar el seguimiento de los ejemplos de esta guía, ",[16,833,834],{},"recomendamos"," crear una estructura de carpetas estándar en la raíz de tu disco.",[13,837,838],{},"Crea la siguiente estructura:",[13,840,841],{},"Carpeta local:",[543,843,848],{"className":844,"code":846,"language":847},[845],"language-text","C:\\EPLAN_Scripts\\\n├── Aprendizaje\\        (scripts de esta guía)\n├── Produccion\\         (scripts terminados y probados)\n├── Backup\\             (respaldos)\n└── Recursos\\           (archivos auxiliares)\n","text",[54,849,846],{"__ignoreMap":228},[13,851,852],{},[16,853,854],{},"¿Por qué esta estructura?",[126,856,857,863,869,875],{},[88,858,859,862],{},[54,860,861],{},"Aprendizaje\\",": Scripts de práctica, experimentación",[88,864,865,868],{},[54,866,867],{},"Produccion\\",": Scripts validados y listos para usar en proyectos reales",[88,870,871,874],{},[54,872,873],{},"Backup\\",": Versiones anteriores por si algo sale mal",[88,876,877,880],{},[54,878,879],{},"Recursos\\",": Plantillas, archivos de configuración, imágenes, etc.",[367,882,884],{"id":883},"_32-configurar-eplan-para-encontrar-tus-scripts","3.2 Configurar EPLAN para encontrar tus scripts",[13,886,887],{},"EPLAN necesita saber dónde buscar tus scripts:",[85,889,890,893,899],{},[88,891,892],{},"Abre EPLAN",[88,894,895,896],{},"Ve a ",[16,897,898],{},"Fichero > Ajustes > Usuario > Gestión > Directorios",[88,900,901],{},"En \"Scripts\", añade tu carpeta",[13,903,904],{},"Ahora EPLAN buscará scripts en esa carpeta.",[43,906],{},[331,908,910],{"id":909},"_4-editor-de-texto","4. Editor de texto",[13,912,913,914,917],{},"Necesitas un editor de texto para escribir código. ",[16,915,916],{},"NO uses Notepad"," (bloc de notas de Windows) porque no tiene resaltado de sintaxis ni autocompletado.",[367,919,921],{"id":920},"_41-opciones-recomendadas","4.1 Opciones recomendadas",[13,923,924],{},[16,925,926],{},"Opción 1: Visual Studio Code (Recomendado)",[13,928,929,416],{},[16,930,931],{},"Ventajas",[126,933,934,937,940,943,946],{},[88,935,936],{},"Gratuito y ligero",[88,938,939],{},"Resaltado de sintaxis para C#",[88,941,942],{},"Extensiones útiles",[88,944,945],{},"Terminal integrado",[88,947,948],{},"IntelliSense (autocompletado inteligente)",[13,950,951,93,954],{},[16,952,953],{},"Descargar",[955,956,957],"a",{"href":957,"rel":958},"https:\u002F\u002Fcode.visualstudio.com\u002F",[959],"nofollow",[13,961,962,416],{},[16,963,964],{},"Configuración básica",[85,966,967,970,973],{},[88,968,969],{},"Instalar Visual Studio Code",[88,971,972],{},"Abrir VS Code",[88,974,975,976],{},"Instalar extensión \"C#\" de Microsoft:\n",[126,977,978,981,984],{},[88,979,980],{},"Clic en el icono de extensiones (cuadrado con 4 cuadrados pequeños)",[88,982,983],{},"Buscar \"C#\"",[88,985,986],{},"Instalar \"C# for Visual Studio Code\"",[13,988,989],{},[16,990,991],{},"Opción 2: Notepad++",[13,993,994,416],{},[16,995,931],{},[126,997,998,1001,1004],{},[88,999,1000],{},"Muy ligero",[88,1002,1003],{},"Resaltado de sintaxis básico",[88,1005,1006],{},"Gratuito",[13,1008,1009,416],{},[16,1010,1011],{},"Desventajas",[126,1013,1014,1017],{},[88,1015,1016],{},"No tiene IntelliSense",[88,1018,1019],{},"Menos funcionalidades que VS Code",[13,1021,1022,93,1024],{},[16,1023,953],{},[955,1025,1026],{"href":1026,"rel":1027},"https:\u002F\u002Fnotepad-plus-plus.org\u002F",[959],[13,1029,1030],{},[16,1031,1032],{},"Opción 3: Visual Studio Community",[13,1034,1035,416],{},[16,1036,931],{},[126,1038,1039,1042,1045],{},[88,1040,1041],{},"IDE completo y profesional",[88,1043,1044],{},"Mejor IntelliSense",[88,1046,1047],{},"Debugging avanzado",[13,1049,1050,416],{},[16,1051,1011],{},[126,1053,1054,1057,1060],{},[88,1055,1056],{},"Muy pesado (varios GB)",[88,1058,1059],{},"Overkill para scripts simples",[88,1061,1062],{},"Tiempo de instalación largo",[13,1064,1065,1068,1069,1072],{},[16,1066,1067],{},"Recomendación",": Usa ",[16,1070,1071],{},"Visual Studio Code"," para esta guía. Es el mejor balance entre funcionalidad y peso.",[367,1074,1076],{"id":1075},"_42-configurar-vs-code-para-eplan","4.2 Configurar VS Code para EPLAN",[13,1078,1079],{},"Una vez instalado VS Code:",[85,1081,1082,1085,1090,1096],{},[88,1083,1084],{},"Abre VS Code",[88,1086,895,1087],{},[16,1088,1089],{},"Archivo > Abrir carpeta",[88,1091,1092,1093],{},"Selecciona ",[54,1094,1095],{},"C:\\EPLAN_Scripts\\Aprendizaje",[88,1097,1098],{},"Esta será tu carpeta de trabajo",[13,1100,1101,1104],{},[16,1102,1103],{},"Tip",": Crea un acceso directo de VS Code con esta carpeta ya abierta para ahorrar tiempo.",[43,1106],{},[331,1108,1110],{"id":1109},"_5-estructura-de-un-script-eplan","5. Estructura de un script EPLAN",[13,1112,1113],{},"Antes de escribir tu primer script, veamos cómo luce un script EPLAN mínimo:",[543,1115,1117],{"className":545,"code":1116,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class MiPrimerScript\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Tu código aquí\n        MessageBox.Show(\"Hola desde EPLAN!\", \"Mi Primer Script\");\n    }\n}\n",[54,1118,1119,1124,1129,1134,1140,1146,1152,1158,1164,1170,1176,1182,1188],{"__ignoreMap":228},[551,1120,1121],{"class":553,"line":554},[551,1122,1123],{},"using System;\n",[551,1125,1126],{"class":553,"line":229},[551,1127,1128],{},"using Eplan.EplApi.Base;\n",[551,1130,1131],{"class":553,"line":670},[551,1132,1133],{},"using Eplan.EplApi.ApplicationFramework;\n",[551,1135,1137],{"class":553,"line":1136},4,[551,1138,1139],{"emptyLinePlaceholder":238},"\n",[551,1141,1143],{"class":553,"line":1142},5,[551,1144,1145],{},"public class MiPrimerScript\n",[551,1147,1149],{"class":553,"line":1148},6,[551,1150,1151],{},"{\n",[551,1153,1155],{"class":553,"line":1154},7,[551,1156,1157],{},"    [Start]\n",[551,1159,1161],{"class":553,"line":1160},8,[551,1162,1163],{},"    public void Ejecutar()\n",[551,1165,1167],{"class":553,"line":1166},9,[551,1168,1169],{},"    {\n",[551,1171,1173],{"class":553,"line":1172},10,[551,1174,1175],{},"        \u002F\u002F Tu código aquí\n",[551,1177,1179],{"class":553,"line":1178},11,[551,1180,1181],{},"        MessageBox.Show(\"Hola desde EPLAN!\", \"Mi Primer Script\");\n",[551,1183,1185],{"class":553,"line":1184},12,[551,1186,1187],{},"    }\n",[551,1189,1191],{"class":553,"line":1190},13,[551,1192,1193],{},"}\n",[13,1195,1196,1199],{},[16,1197,1198],{},"No te preocupes por entender cada línea todavía",". Pero aquí está la estructura básica:",[367,1201,1203],{"id":1202},"_51-sección-de-using","5.1 Sección de \"using\"",[543,1205,1207],{"className":545,"code":1206,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n",[54,1208,1209,1213,1217],{"__ignoreMap":228},[551,1210,1211],{"class":553,"line":554},[551,1212,1123],{},[551,1214,1215],{"class":553,"line":229},[551,1216,1128],{},[551,1218,1219],{"class":553,"line":670},[551,1220,1133],{},[13,1222,1223,1226],{},[16,1224,1225],{},"¿Qué hace?",": Le dice a C# qué librerías (conjuntos de código preescrito) vas a usar.",[13,1228,1229,1232],{},[16,1230,1231],{},"Analogía",": Es como decir \"voy a usar herramientas de la caja roja y de la caja azul\" antes de empezar un trabajo.",[13,1234,1235],{},"Las librerías más comunes para EPLAN son:",[126,1237,1238,1244,1250],{},[88,1239,1240,1243],{},[54,1241,1242],{},"System",": Funcionalidades básicas de C#",[88,1245,1246,1249],{},[54,1247,1248],{},"Eplan.EplApi.Base",": Clases fundamentales de EPLAN",[88,1251,1252,1255],{},[54,1253,1254],{},"Eplan.EplApi.ApplicationFramework",": Interfaz con la aplicación EPLAN",[367,1257,1259],{"id":1258},"_52-declaración-de-clase","5.2 Declaración de clase",[543,1261,1263],{"className":545,"code":1262,"language":547,"meta":228,"style":228},"public class MiPrimerScript\n{\n    \u002F\u002F Contenido\n}\n",[54,1264,1265,1269,1273,1278],{"__ignoreMap":228},[551,1266,1267],{"class":553,"line":554},[551,1268,1145],{},[551,1270,1271],{"class":553,"line":229},[551,1272,1151],{},[551,1274,1275],{"class":553,"line":670},[551,1276,1277],{},"    \u002F\u002F Contenido\n",[551,1279,1280],{"class":553,"line":1136},[551,1281,1193],{},[13,1283,1284,1287],{},[16,1285,1286],{},"¿Qué es una clase?",": Por ahora, piénsalo como un \"contenedor\" de código. Todo el código de tu script vive dentro de una clase.",[13,1289,1290,1293],{},[16,1291,1292],{},"Regla importante",": El nombre de la clase debe ser descriptivo de lo que hace el script.",[367,1295,1297,1298],{"id":1296},"_53-método-con-atributo-start","5.3 Método con atributo ",[551,1299,1300],{},"Start",[543,1302,1304],{"className":545,"code":1303,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()\n{\n    \u002F\u002F Tu código\n}\n",[54,1305,1306,1311,1316,1320,1325],{"__ignoreMap":228},[551,1307,1308],{"class":553,"line":554},[551,1309,1310],{},"[Start]\n",[551,1312,1313],{"class":553,"line":229},[551,1314,1315],{},"public void Ejecutar()\n",[551,1317,1318],{"class":553,"line":670},[551,1319,1151],{},[551,1321,1322],{"class":553,"line":1136},[551,1323,1324],{},"    \u002F\u002F Tu código\n",[551,1326,1327],{"class":553,"line":1142},[551,1328,1193],{},[13,1330,1331,1335],{},[16,1332,1333],{},[551,1334,1300],{},": Le dice a EPLAN \"empieza ejecutando este método\".",[13,1337,1338,1341],{},[16,1339,1340],{},"public void Ejecutar()",": Define un método (función) llamado \"Ejecutar\".",[13,1343,1344,1347],{},[16,1345,1346],{},"Entre llaves { }",": Va todo el código que quieres que se ejecute.",[43,1349],{},[331,1351,1353],{"id":1352},"_6-tu-primer-script-hello-world","6. Tu primer script: Hello World",[13,1355,1356],{},"Ahora sí, vamos a crear tu primer script funcional.",[367,1358,1360],{"id":1359},"paso-1-crear-el-archivo","Paso 1: Crear el archivo",[85,1362,1363,1366,1383],{},[88,1364,1365],{},"Abre tu editor de texto (VS Code)",[88,1367,1368,1369],{},"Crea un nuevo archivo:\n",[126,1370,1371,1377],{},[88,1372,1373,1374],{},"En VS Code: ",[16,1375,1376],{},"Archivo > Nuevo archivo",[88,1378,1379,1380],{},"O presiona ",[54,1381,1382],{},"Ctrl + N",[88,1384,1385,1386,1389],{},"Guarda el archivo como: ",[54,1387,1388],{},"C:\\EPLAN_Scripts\\Aprendizaje\\HelloWorld.cs",[126,1390,1391],{},[88,1392,1393,1396,1397,1400],{},[16,1394,1395],{},"Importante",": La extensión debe ser ",[54,1398,1399],{},".cs"," (C Sharp)",[367,1402,1404],{"id":1403},"paso-2-escribir-el-código","Paso 2: Escribir el código",[13,1406,1407],{},"Copia exactamente este código en tu archivo:",[543,1409,1411],{"className":545,"code":1410,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class HelloWorld\n{\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"¡Hola! Este es mi primer script en EPLAN.\",\n                       \"Mi Primer Script\",\n                       MessageBoxButtons.OK,\n                       MessageBoxIcon.Information);\n    }\n}\n",[54,1412,1413,1417,1421,1425,1429,1434,1438,1442,1446,1450,1455,1460,1465,1470,1475],{"__ignoreMap":228},[551,1414,1415],{"class":553,"line":554},[551,1416,1123],{},[551,1418,1419],{"class":553,"line":229},[551,1420,1128],{},[551,1422,1423],{"class":553,"line":670},[551,1424,1133],{},[551,1426,1427],{"class":553,"line":1136},[551,1428,1139],{"emptyLinePlaceholder":238},[551,1430,1431],{"class":553,"line":1142},[551,1432,1433],{},"public class HelloWorld\n",[551,1435,1436],{"class":553,"line":1148},[551,1437,1151],{},[551,1439,1440],{"class":553,"line":1154},[551,1441,1157],{},[551,1443,1444],{"class":553,"line":1160},[551,1445,1163],{},[551,1447,1448],{"class":553,"line":1166},[551,1449,1169],{},[551,1451,1452],{"class":553,"line":1172},[551,1453,1454],{},"        MessageBox.Show(\"¡Hola! Este es mi primer script en EPLAN.\",\n",[551,1456,1457],{"class":553,"line":1178},[551,1458,1459],{},"                       \"Mi Primer Script\",\n",[551,1461,1462],{"class":553,"line":1184},[551,1463,1464],{},"                       MessageBoxButtons.OK,\n",[551,1466,1467],{"class":553,"line":1190},[551,1468,1469],{},"                       MessageBoxIcon.Information);\n",[551,1471,1473],{"class":553,"line":1472},14,[551,1474,1187],{},[551,1476,1478],{"class":553,"line":1477},15,[551,1479,1193],{},[367,1481,1483],{"id":1482},"paso-3-guardar","Paso 3: Guardar",[126,1485,1486,1493],{},[88,1487,1488,1489,1492],{},"Presiona ",[54,1490,1491],{},"Ctrl + S"," para guardar",[88,1494,1495,1496,1499],{},"Verifica que el archivo se guardó como ",[54,1497,1498],{},"HelloWorld.cs"," en la carpeta correcta",[367,1501,1503],{"id":1502},"paso-4-ejecutar-desde-eplan","Paso 4: Ejecutar desde EPLAN",[13,1505,1506],{},"Ahora viene la parte emocionante:",[85,1508,1509,1511,1517,1522],{},[88,1510,892],{},[88,1512,1513,1516],{},[16,1514,1515],{},"No necesitas tener un proyecto abierto"," (este script funciona sin proyecto)",[88,1518,895,1519],{},[16,1520,1521],{},"Fichero > Extras > Interfaces > Ejecutar script...",[88,1523,1524,1525],{},"En el diálogo que aparece:\n",[126,1526,1527,1532],{},[88,1528,1529,1530],{},"Busca y selecciona ",[54,1531,1498],{},[88,1533,1534,1535],{},"Clic en ",[16,1536,1537],{},"Ejecutar",[13,1539,1540],{},[16,1541,1542],{},"¿Qué debería pasar?",[13,1544,1545],{},"Deberías ver un cuadro de diálogo con el mensaje:",[543,1547,1550],{"className":1548,"code":1549,"language":847},[845],"\"¡Hola! Este es mi primer script en EPLAN.\"\n",[54,1551,1549],{"__ignoreMap":228},[13,1553,1554],{},[16,1555,1556],{},"Si lo ves: ¡Felicidades! Acabas de ejecutar tu primer script.",[13,1558,1559,1562],{},[16,1560,1561],{},"Si no lo ves",": Ve a la sección de \"Problemas comunes\" más abajo.",[43,1564],{},[331,1566,1568],{"id":1567},"_7-entendiendo-lo-que-acabas-de-hacer","7. Entendiendo lo que acabas de hacer",[13,1570,1571],{},"Analicemos el script línea por línea:",[543,1573,1574],{"className":545,"code":1206,"language":547,"meta":228,"style":228},[54,1575,1576,1580,1584],{"__ignoreMap":228},[551,1577,1578],{"class":553,"line":554},[551,1579,1123],{},[551,1581,1582],{"class":553,"line":229},[551,1583,1128],{},[551,1585,1586],{"class":553,"line":670},[551,1587,1133],{},[13,1589,1590,1593],{},[16,1591,1592],{},"Líneas 1-3",": Importamos las librerías necesarias.",[543,1595,1597],{"className":545,"code":1596,"language":547,"meta":228,"style":228},"public class HelloWorld\n{\n",[54,1598,1599,1603],{"__ignoreMap":228},[551,1600,1601],{"class":553,"line":554},[551,1602,1433],{},[551,1604,1605],{"class":553,"line":229},[551,1606,1151],{},[13,1608,1609,1612,1613,41],{},[16,1610,1611],{},"Línea 5",": Declaramos una clase llamada ",[54,1614,1615],{},"HelloWorld",[543,1617,1619],{"className":545,"code":1618,"language":547,"meta":228,"style":228},"    [Start]\n    public void Ejecutar()\n    {\n",[54,1620,1621,1625,1629],{"__ignoreMap":228},[551,1622,1623],{"class":553,"line":554},[551,1624,1157],{},[551,1626,1627],{"class":553,"line":229},[551,1628,1163],{},[551,1630,1631],{"class":553,"line":670},[551,1632,1169],{},[13,1634,1635,416],{},[16,1636,1637],{},"Líneas 7-8",[126,1639,1640,1646],{},[88,1641,1642,1645],{},[54,1643,1644],{},"[Start]",": Marca este método como punto de entrada",[88,1647,1648,1650],{},[54,1649,1340],{},": Define el método que se ejecutará",[543,1652,1654],{"className":545,"code":1653,"language":547,"meta":228,"style":228},"        MessageBox.Show(\"¡Hola! Este es mi primer script en EPLAN.\",\n                       \"Mi Primer Script\",\n                       MessageBoxButtons.OK,\n                       MessageBoxIcon.Information);\n",[54,1655,1656,1660,1664,1668],{"__ignoreMap":228},[551,1657,1658],{"class":553,"line":554},[551,1659,1454],{},[551,1661,1662],{"class":553,"line":229},[551,1663,1459],{},[551,1665,1666],{"class":553,"line":670},[551,1667,1464],{},[551,1669,1670],{"class":553,"line":1136},[551,1671,1469],{},[13,1673,1674,416],{},[16,1675,1676],{},"Líneas 10-13",[126,1678,1679,1685,1688,1691,1694],{},[88,1680,1681,1684],{},[54,1682,1683],{},"MessageBox.Show()",": Muestra un cuadro de diálogo",[88,1686,1687],{},"Primer parámetro: El mensaje a mostrar",[88,1689,1690],{},"Segundo parámetro: El título de la ventana",[88,1692,1693],{},"Tercer parámetro: Qué botones mostrar (OK, Sí\u002FNo, etc.)",[88,1695,1696],{},"Cuarto parámetro: Qué icono mostrar (Información, Error, Advertencia)",[543,1698,1700],{"className":545,"code":1699,"language":547,"meta":228,"style":228},"    }\n}\n",[54,1701,1702,1706],{"__ignoreMap":228},[551,1703,1704],{"class":553,"line":554},[551,1705,1187],{},[551,1707,1708],{"class":553,"line":229},[551,1709,1193],{},[13,1711,1712,1715],{},[16,1713,1714],{},"Líneas 15-16",": Cierran el método y la clase.",[43,1717],{},[331,1719,1721],{"id":1720},"_8-mejorando-tu-primer-script","8. Mejorando tu primer script",[13,1723,1724],{},"Ahora que funciona, vamos a mejorarlo un poco. Modifica tu script para que se vea así:",[543,1726,1728],{"className":545,"code":1727,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class HelloWorld\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Obtener la fecha y hora actual\n        DateTime ahora = DateTime.Now;\n        string fechaHora = ahora.ToString(\"dd\u002FMM\u002Fyyyy HH:mm:ss\");\n\n        \u002F\u002F Obtener el nombre del usuario de Windows\n        string usuario = Environment.UserName;\n\n        \u002F\u002F Construir el mensaje personalizado\n        string mensaje = string.Format(\n            \"¡Hola {0}!\\n\\n\" +\n            \"Este es tu primer script en EPLAN.\\n\" +\n            \"Fecha y hora: {1}\\n\\n\" +\n            \"¡Bienvenido al mundo de la automatización!\",\n            usuario,\n            fechaHora);\n\n        \u002F\u002F Mostrar el mensaje\n        MessageBox.Show(mensaje,\n                       \"Mi Primer Script Mejorado\",\n                       MessageBoxButtons.OK,\n                       MessageBoxIcon.Information);\n    }\n}\n",[54,1729,1730,1734,1738,1742,1746,1750,1754,1758,1762,1766,1771,1776,1781,1785,1790,1795,1800,1806,1812,1818,1824,1830,1836,1842,1848,1853,1859,1865,1871,1876,1881,1886],{"__ignoreMap":228},[551,1731,1732],{"class":553,"line":554},[551,1733,1123],{},[551,1735,1736],{"class":553,"line":229},[551,1737,1128],{},[551,1739,1740],{"class":553,"line":670},[551,1741,1133],{},[551,1743,1744],{"class":553,"line":1136},[551,1745,1139],{"emptyLinePlaceholder":238},[551,1747,1748],{"class":553,"line":1142},[551,1749,1433],{},[551,1751,1752],{"class":553,"line":1148},[551,1753,1151],{},[551,1755,1756],{"class":553,"line":1154},[551,1757,1157],{},[551,1759,1760],{"class":553,"line":1160},[551,1761,1163],{},[551,1763,1764],{"class":553,"line":1166},[551,1765,1169],{},[551,1767,1768],{"class":553,"line":1172},[551,1769,1770],{},"        \u002F\u002F Obtener la fecha y hora actual\n",[551,1772,1773],{"class":553,"line":1178},[551,1774,1775],{},"        DateTime ahora = DateTime.Now;\n",[551,1777,1778],{"class":553,"line":1184},[551,1779,1780],{},"        string fechaHora = ahora.ToString(\"dd\u002FMM\u002Fyyyy HH:mm:ss\");\n",[551,1782,1783],{"class":553,"line":1190},[551,1784,1139],{"emptyLinePlaceholder":238},[551,1786,1787],{"class":553,"line":1472},[551,1788,1789],{},"        \u002F\u002F Obtener el nombre del usuario de Windows\n",[551,1791,1792],{"class":553,"line":1477},[551,1793,1794],{},"        string usuario = Environment.UserName;\n",[551,1796,1798],{"class":553,"line":1797},16,[551,1799,1139],{"emptyLinePlaceholder":238},[551,1801,1803],{"class":553,"line":1802},17,[551,1804,1805],{},"        \u002F\u002F Construir el mensaje personalizado\n",[551,1807,1809],{"class":553,"line":1808},18,[551,1810,1811],{},"        string mensaje = string.Format(\n",[551,1813,1815],{"class":553,"line":1814},19,[551,1816,1817],{},"            \"¡Hola {0}!\\n\\n\" +\n",[551,1819,1821],{"class":553,"line":1820},20,[551,1822,1823],{},"            \"Este es tu primer script en EPLAN.\\n\" +\n",[551,1825,1827],{"class":553,"line":1826},21,[551,1828,1829],{},"            \"Fecha y hora: {1}\\n\\n\" +\n",[551,1831,1833],{"class":553,"line":1832},22,[551,1834,1835],{},"            \"¡Bienvenido al mundo de la automatización!\",\n",[551,1837,1839],{"class":553,"line":1838},23,[551,1840,1841],{},"            usuario,\n",[551,1843,1845],{"class":553,"line":1844},24,[551,1846,1847],{},"            fechaHora);\n",[551,1849,1851],{"class":553,"line":1850},25,[551,1852,1139],{"emptyLinePlaceholder":238},[551,1854,1856],{"class":553,"line":1855},26,[551,1857,1858],{},"        \u002F\u002F Mostrar el mensaje\n",[551,1860,1862],{"class":553,"line":1861},27,[551,1863,1864],{},"        MessageBox.Show(mensaje,\n",[551,1866,1868],{"class":553,"line":1867},28,[551,1869,1870],{},"                       \"Mi Primer Script Mejorado\",\n",[551,1872,1874],{"class":553,"line":1873},29,[551,1875,1464],{},[551,1877,1879],{"class":553,"line":1878},30,[551,1880,1469],{},[551,1882,1884],{"class":553,"line":1883},31,[551,1885,1187],{},[551,1887,1889],{"class":553,"line":1888},32,[551,1890,1193],{},[13,1892,1893],{},[16,1894,1895],{},"¿Qué hace este script mejorado?",[85,1897,1898,1901,1904,1907],{},[88,1899,1900],{},"Obtiene la fecha y hora actual",[88,1902,1903],{},"Obtiene tu nombre de usuario de Windows",[88,1905,1906],{},"Construye un mensaje personalizado con esa información",[88,1908,1909],{},"Lo muestra en un cuadro de diálogo",[13,1911,1912,1915],{},[16,1913,1914],{},"Ejecútalo nuevamente"," para ver la diferencia.",[13,1917,1918,1921,1922,1925],{},[16,1919,1920],{},"Nota",": Los comentarios (líneas que empiezan con ",[54,1923,1924],{},"\u002F\u002F",") no se ejecutan. Son solo notas para los humanos.",[43,1927],{},[331,1929,1931],{"id":1930},"_9-acceso-rápido-a-scripts","9. Acceso rápido a scripts",[13,1933,1934,1935,1937],{},"Cada vez que quieras ejecutar un script, ir a ",[16,1936,1521],{}," es tedioso. Veamos formas más rápidas:",[367,1939,1941],{"id":1940},"_91-crear-un-menú-personalizado","9.1 Crear un menú personalizado",[85,1943,1944,1947,1950],{},[88,1945,1946],{},"En EPLAN, haz click en la cinta.",[88,1948,1949],{},"Crea un grupo de comandos nuevo.",[88,1951,1952,1953,41],{},"Busca ",[16,1954,1955],{},"Ejecutar scripts",[13,1957,1958],{},[1959,1960],"img",{"alt":1961,"src":1962},"Botón ejecutar script","\u002Fguia-cinta-1.png",[43,1964],{},[331,1966,1968],{"id":1967},"_10-problemas-comunes","10. Problemas comunes",[367,1970,1972],{"id":1971},"problema-1-el-archivo-no-aparece-en-el-diálogo","Problema 1: \"El archivo no aparece en el diálogo\"",[13,1974,1975,1978],{},[16,1976,1977],{},"Causa",": No tiene la extensión correcta.",[13,1980,1981,416],{},[16,1982,1983],{},"Solución",[85,1985,1986],{},[88,1987,1988,1989],{},"Verifica que el archivo termina en ",[54,1990,1399],{},[367,1992,1994],{"id":1993},"problema-2-error-de-compilación-o-error-de-sintaxis","Problema 2: \"Error de compilación\" o \"Error de sintaxis\"",[13,1996,1997,1999],{},[16,1998,1977],{},": Probablemente copiaste mal el código o falta un punto y coma.",[13,2001,2002,416],{},[16,2003,1983],{},[85,2005,2006,2009,2012,2019],{},[88,2007,2008],{},"Verifica que copiaste exactamente el código de la guía.",[88,2010,2011],{},"Presta atención a mayúsculas y minúsculas (C# es case-sensitive).",[88,2013,2014,2015,2018],{},"Verifica que no falten punto y coma ",[54,2016,2017],{},";"," al final de las líneas.",[88,2020,2021],{},"Los mensajes del sistema te ayudarán a identificar el problema.",[43,2023],{},[46,2025,2027],{"id":2026},"deep-dive-namespaces-de-eplan-disponibles","Deep Dive: Namespaces de EPLAN disponibles",[13,2029,2030],{},"Para scripts simples, estos son los namespaces que usarás:",[13,2032,2033,1243],{},[16,2034,1242],{},[543,2036,2038],{"className":545,"code":2037,"language":547,"meta":228,"style":228},"using System;                     \u002F\u002F Básico\nusing System.IO;                  \u002F\u002F Archivos y carpetas\nusing System.Text;                \u002F\u002F Manipulación de texto\nusing System.Collections.Generic; \u002F\u002F Listas y colecciones\n",[54,2039,2040,2045,2050,2055],{"__ignoreMap":228},[551,2041,2042],{"class":553,"line":554},[551,2043,2044],{},"using System;                     \u002F\u002F Básico\n",[551,2046,2047],{"class":553,"line":229},[551,2048,2049],{},"using System.IO;                  \u002F\u002F Archivos y carpetas\n",[551,2051,2052],{"class":553,"line":670},[551,2053,2054],{},"using System.Text;                \u002F\u002F Manipulación de texto\n",[551,2056,2057],{"class":553,"line":1136},[551,2058,2059],{},"using System.Collections.Generic; \u002F\u002F Listas y colecciones\n",[13,2061,2062,2065],{},[16,2063,2064],{},"EPLAN API",": Funcionalidades de EPLAN",[543,2067,2069],{"className":545,"code":2068,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;                    \u002F\u002F Clases base\nusing Eplan.EplApi.ApplicationFramework;    \u002F\u002F Aplicación\nusing Eplan.EplApi.Scripting;              \u002F\u002F Scripts\n",[54,2070,2071,2076,2081],{"__ignoreMap":228},[551,2072,2073],{"class":553,"line":554},[551,2074,2075],{},"using Eplan.EplApi.Base;                    \u002F\u002F Clases base\n",[551,2077,2078],{"class":553,"line":229},[551,2079,2080],{},"using Eplan.EplApi.ApplicationFramework;    \u002F\u002F Aplicación\n",[551,2082,2083],{"class":553,"line":670},[551,2084,2085],{},"using Eplan.EplApi.Scripting;              \u002F\u002F Scripts\n",[13,2087,2088,416],{},[16,2089,2090],{},"Extras incluidos gratis",[543,2092,2094],{"className":545,"code":2093,"language":547,"meta":228,"style":228},"using System.Windows.Forms;   \u002F\u002F GUI (formularios, botones)\nusing System.Net.Http;        \u002F\u002F Peticiones HTTP\u002FREST\nusing Newtonsoft.Json;        \u002F\u002F Manejo de JSON\nusing System.Xml.Linq;        \u002F\u002F Manejo de XML\n",[54,2095,2096,2101,2106,2111],{"__ignoreMap":228},[551,2097,2098],{"class":553,"line":554},[551,2099,2100],{},"using System.Windows.Forms;   \u002F\u002F GUI (formularios, botones)\n",[551,2102,2103],{"class":553,"line":229},[551,2104,2105],{},"using System.Net.Http;        \u002F\u002F Peticiones HTTP\u002FREST\n",[551,2107,2108],{"class":553,"line":670},[551,2109,2110],{},"using Newtonsoft.Json;        \u002F\u002F Manejo de JSON\n",[551,2112,2113],{"class":553,"line":1136},[551,2114,2115],{},"using System.Xml.Linq;        \u002F\u002F Manejo de XML\n",[13,2117,2118],{},"No necesitas memorizar esto ahora. Lo irás usando naturalmente en los próximos capítulos.",[43,2120],{},[46,2122,2124],{"id":2123},"mejores-prácticas-desde-el-inicio","Mejores prácticas desde el inicio",[13,2126,2127],{},"Aunque apenas estás empezando, adopta estas buenas costumbres desde ahora:",[13,2129,2130],{},[16,2131,2132],{},"1. Nombres descriptivos",[543,2134,2136],{"className":545,"code":2135,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\npublic class Script1 { }\n\n\u002F\u002F Bien\npublic class ExportarPDFMultiidioma { }\n",[54,2137,2138,2143,2148,2152,2157],{"__ignoreMap":228},[551,2139,2140],{"class":553,"line":554},[551,2141,2142],{},"\u002F\u002F Mal\n",[551,2144,2145],{"class":553,"line":229},[551,2146,2147],{},"public class Script1 { }\n",[551,2149,2150],{"class":553,"line":670},[551,2151,1139],{"emptyLinePlaceholder":238},[551,2153,2154],{"class":553,"line":1136},[551,2155,2156],{},"\u002F\u002F Bien\n",[551,2158,2159],{"class":553,"line":1142},[551,2160,2161],{},"public class ExportarPDFMultiidioma { }\n",[13,2163,2164],{},[16,2165,2166],{},"2. Comentarios útiles",[543,2168,2170],{"className":545,"code":2169,"language":547,"meta":228,"style":228},"\u002F\u002F Mal (obvio)\n\u002F\u002F Mostrar mensaje\nMessageBox.Show(\"Hola\");\n\n\u002F\u002F Bien (explica el por qué)\n\u002F\u002F Informar al usuario que la exportación comenzó\nMessageBox.Show(\"Exportación iniciada. Por favor espere...\");\n",[54,2171,2172,2177,2182,2187,2191,2196,2201],{"__ignoreMap":228},[551,2173,2174],{"class":553,"line":554},[551,2175,2176],{},"\u002F\u002F Mal (obvio)\n",[551,2178,2179],{"class":553,"line":229},[551,2180,2181],{},"\u002F\u002F Mostrar mensaje\n",[551,2183,2184],{"class":553,"line":670},[551,2185,2186],{},"MessageBox.Show(\"Hola\");\n",[551,2188,2189],{"class":553,"line":1136},[551,2190,1139],{"emptyLinePlaceholder":238},[551,2192,2193],{"class":553,"line":1142},[551,2194,2195],{},"\u002F\u002F Bien (explica el por qué)\n",[551,2197,2198],{"class":553,"line":1148},[551,2199,2200],{},"\u002F\u002F Informar al usuario que la exportación comenzó\n",[551,2202,2203],{"class":553,"line":1154},[551,2204,2205],{},"MessageBox.Show(\"Exportación iniciada. Por favor espere...\");\n",[13,2207,2208],{},[16,2209,2210],{},"3. Organización de archivos",[126,2212,2213,2216,2219],{},[88,2214,2215],{},"Un script por archivo",[88,2217,2218],{},"Nombre del archivo = Nombre de la clase",[88,2220,2221],{},"Usa carpetas para categorizar",[13,2223,2224],{},[16,2225,2226],{},"4. Backup regular",[126,2228,2229],{},[88,2230,2231,2232,2234],{},"Copia tus scripts a la carpeta ",[54,2233,873],{}," antes de hacer cambios grandes.\nTambién puedes hacer el uso de Git para el control de versiones.",[43,2236],{},[13,2238,2239,658],{},[16,2240,657],{},[660,2242,662],{},{"title":228,"searchDepth":229,"depth":229,"links":2244},[2245,2246,2247,2248,2260,2261],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":2249},[2250,2251,2252,2253,2254,2255,2256,2257,2258,2259],{"id":761,"depth":670,"text":762},{"id":793,"depth":670,"text":794},{"id":820,"depth":670,"text":821},{"id":909,"depth":670,"text":910},{"id":1109,"depth":670,"text":1110},{"id":1352,"depth":670,"text":1353},{"id":1567,"depth":670,"text":1568},{"id":1720,"depth":670,"text":1721},{"id":1930,"depth":670,"text":1931},{"id":1967,"depth":670,"text":1968},{"id":2026,"depth":229,"text":2027},{"id":2123,"depth":229,"text":2124},"Configura tu entorno de trabajo para escribir scripts EPLAN en C# desde cero y empezar a automatizar EPLAN Electric P8 sin licencias premium.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-02-tu-entorno",{"title":683,"description":2262},"guia\u002Ffundamentos\u002Fcap-02-tu-entorno","uORzOo1OSvj0idw15AvrojtmVaLNKq1kdKcWLNlnDNQ",{"id":2269,"title":2270,"body":2271,"description":5863,"extension":236,"meta":5864,"navigation":238,"path":5865,"seo":5866,"stem":5867,"tagline":242,"__hash__":5868},"guia\u002Fguia\u002Ffundamentos\u002Fcap-03-variables-tipos-datos.md","Capítulo 3: Variables y tipos de datos en C#",{"type":7,"value":2272,"toc":5822},[2273,2284,2286,2288,2290,2338,2340,2342,2344,2355,2357,2359,2364,2367,2381,2386,2388,2390,2394,2397,2408,2414,2418,2425,2431,2442,2445,2465,2467,2471,2482,2493,2496,2498,2502,2508,2528,2533,2547,2552,2577,2579,2583,2588,2608,2612,2623,2627,2652,2658,2678,2680,2684,2689,2709,2713,2724,2728,2758,2763,2783,2796,2811,2813,2817,2822,2842,2846,2864,2868,2898,2903,2923,2925,2929,2933,2936,2942,2945,2970,2974,2977,3021,3026,3041,3045,3048,3073,3076,3085,3088,3108,3110,3114,3117,3121,3202,3206,3213,3267,3271,3278,3326,3332,3362,3365,3394,3396,3400,3403,3407,3413,3433,3438,3444,3448,3454,3474,3482,3488,3503,3507,3510,3573,3578,3627,3631,3634,3718,3720,3724,3728,3822,3827,3856,3860,3866,3886,3889,3908,3912,3915,3988,3993,4020,4022,4026,4029,4033,4088,4090,4094,4149,4155,4157,4161,4222,4227,4229,4233,4262,4267,4269,4273,4386,4395,4403,4412,4415,4417,4421,4460,4462,4466,4830,4847,4849,4853,4857,4860,4865,4890,4895,4915,4920,4939,4943,4952,4986,4992,5001,5010,5030,5034,5037,5062,5068,5072,5078,5112,5118,5122,5127,5164,5169,5215,5220,5272,5277,5306,5310,5314,5320,5331,5351,5358,5367,5369,5373,5378,5393,5398,5413,5415,5419,5424,5433,5438,5447,5449,5453,5456,5460,5466,5469,5486,5496,5660,5662,5666,5670,5673,5684,5687,5695,5702,5704,5709,5723,5725,5729,5733,5747,5751,5762,5766,5778,5782,5798,5802,5814,5816,5820],[10,2274,2275],{},[13,2276,2277,19,2279,19,2282,262],{},[16,2278,256],{},[16,2280,2281],{},"Sección 1: Fundamentos de C#",[16,2283,25],{},[43,2285],{},[46,2287,268],{"id":267},[13,2289,702],{},[126,2291,2293,2302,2311,2320,2329],{"className":2292},[275],[88,2294,2296,73,2298,2301],{"className":2295},[279],[281,2297],{"disabled":238,"type":283},[16,2299,2300],{},"Entender qué es una variable"," y por qué las necesitamos en programación",[88,2303,2305,73,2307,2310],{"className":2304},[279],[281,2306],{"disabled":238,"type":283},[16,2308,2309],{},"Declarar y usar"," los tipos de datos básicos en C# (string, int, double, bool)",[88,2312,2314,73,2316,2319],{"className":2313},[279],[281,2315],{"disabled":238,"type":283},[16,2317,2318],{},"Aplicar convenciones de nombres"," correctas para variables",[88,2321,2323,73,2325,2328],{"className":2322},[279],[281,2324],{"disabled":238,"type":283},[16,2326,2327],{},"Realizar conversiones"," entre diferentes tipos de datos",[88,2330,2332,73,2334,2337],{"className":2331},[279],[281,2333],{"disabled":238,"type":283},[16,2335,2336],{},"Calcular valores"," de circuitos eléctricos usando variables",[43,2339],{},[46,2341,320],{"id":319},[13,2343,726],{},[126,2345,2346,2349,2352],{},[88,2347,2348],{},"Haber completado el Capítulo 2",[88,2350,2351],{},"Tener tu entorno de scripts configurado",[88,2353,2354],{},"Poder ejecutar scripts en EPLAN",[43,2356],{},[46,2358,740],{"id":739},[13,2360,2361],{},[16,2362,2363],{},"Calculadora de Circuitos Básicos",[13,2365,2366],{},"Al final de este capítulo habrás construido un script que calcula:",[126,2368,2369,2372,2375,2378],{},[88,2370,2371],{},"Resistencia total en serie",[88,2373,2374],{},"Voltaje usando Ley de Ohm",[88,2376,2377],{},"Potencia de un circuito",[88,2379,2380],{},"Conversiones de unidades eléctricas",[13,2382,2383,2385],{},[16,2384,753],{},": 30-40 minutos",[43,2387],{},[46,2389,329],{"id":328},[331,2391,2393],{"id":2392},"_1-introducción-qué-es-una-variable","1. Introducción: ¿Qué es una variable?",[13,2395,2396],{},"Imagina que estás diseñando un circuito y necesitas anotar varios valores:",[126,2398,2399,2402,2405],{},[88,2400,2401],{},"Voltaje de entrada: 230V",[88,2403,2404],{},"Corriente: 16A",[88,2406,2407],{},"Factor de potencia: 0.85",[13,2409,2410,2411,41],{},"En papel, escribirías estos valores en algún lugar. En programación, ",[16,2412,2413],{},"las variables son contenedores con nombre donde guardamos valores",[367,2415,2417],{"id":2416},"analogía-con-la-ingeniería","Analogía con la ingeniería",[13,2419,2420,2421,2424],{},"Piensa en las variables como ",[16,2422,2423],{},"puntos de medición etiquetados"," en un esquema:",[543,2426,2429],{"className":2427,"code":2428,"language":847},[845],"[230V] ----[R1]----[R2]---- [GND]\n  ↑         ↑       ↑\nvoltaje    res1    res2\n",[54,2430,2428],{"__ignoreMap":228},[13,2432,2433,2434,2437,2438,2441],{},"Cada punto tiene un ",[16,2435,2436],{},"nombre"," (voltaje, res1, res2) y un ",[16,2439,2440],{},"valor"," (230, 100, 220).",[13,2443,2444],{},"En C#, esto sería:",[543,2446,2448],{"className":545,"code":2447,"language":547,"meta":228,"style":228},"double voltaje = 230.0;\ndouble res1 = 100.0;\ndouble res2 = 220.0;\n",[54,2449,2450,2455,2460],{"__ignoreMap":228},[551,2451,2452],{"class":553,"line":554},[551,2453,2454],{},"double voltaje = 230.0;\n",[551,2456,2457],{"class":553,"line":229},[551,2458,2459],{},"double res1 = 100.0;\n",[551,2461,2462],{"class":553,"line":670},[551,2463,2464],{},"double res2 = 220.0;\n",[43,2466],{},[331,2468,2470],{"id":2469},"_2-tipos-de-datos-básicos-en-c","2. Tipos de datos básicos en C#",[13,2472,2473,2474,2477,2478,2481],{},"C# es un lenguaje ",[16,2475,2476],{},"fuertemente tipado",". Esto significa que cada variable tiene un ",[16,2479,2480],{},"tipo específico"," que define:",[126,2483,2484,2487,2490],{},[88,2485,2486],{},"Qué tipo de información puede almacenar",[88,2488,2489],{},"Cuánta memoria ocupa",[88,2491,2492],{},"Qué operaciones puedes hacer con ella",[13,2494,2495],{},"Los 4 tipos básicos que usarás constantemente son:",[43,2497],{},[367,2499,2501],{"id":2500},"_21-string-texto","2.1 string - Texto",[13,2503,2504,2507],{},[16,2505,2506],{},"Uso",": Para almacenar palabras, frases, nombres, descripciones.",[543,2509,2511],{"className":545,"code":2510,"language":547,"meta":228,"style":228},"string proyecto = \"Armario Principal\";\nstring cliente = \"Industrias XYZ\";\nstring ubicacion = \"Planta 2 - Sección A\";\n",[54,2512,2513,2518,2523],{"__ignoreMap":228},[551,2514,2515],{"class":553,"line":554},[551,2516,2517],{},"string proyecto = \"Armario Principal\";\n",[551,2519,2520],{"class":553,"line":229},[551,2521,2522],{},"string cliente = \"Industrias XYZ\";\n",[551,2524,2525],{"class":553,"line":670},[551,2526,2527],{},"string ubicacion = \"Planta 2 - Sección A\";\n",[13,2529,2530,416],{},[16,2531,2532],{},"Características",[126,2534,2535,2541,2544],{},[88,2536,2537,2538],{},"Se declara con comillas dobles: ",[54,2539,2540],{},"\"texto\"",[88,2542,2543],{},"Puede contener cualquier carácter (letras, números, símbolos)",[88,2545,2546],{},"Inmutable (no puedes modificar caracteres individuales directamente)",[13,2548,2549,416],{},[16,2550,2551],{},"Ejemplos prácticos en EPLAN",[543,2553,2555],{"className":545,"code":2554,"language":547,"meta":228,"style":228},"string nombreProyecto = \"P-2025-001\";\nstring designacion = \"Q1\";\nstring fabricante = \"Siemens\";\nstring descripcion = \"Contactor principal 3P 65A\";\n",[54,2556,2557,2562,2567,2572],{"__ignoreMap":228},[551,2558,2559],{"class":553,"line":554},[551,2560,2561],{},"string nombreProyecto = \"P-2025-001\";\n",[551,2563,2564],{"class":553,"line":229},[551,2565,2566],{},"string designacion = \"Q1\";\n",[551,2568,2569],{"class":553,"line":670},[551,2570,2571],{},"string fabricante = \"Siemens\";\n",[551,2573,2574],{"class":553,"line":1136},[551,2575,2576],{},"string descripcion = \"Contactor principal 3P 65A\";\n",[43,2578],{},[367,2580,2582],{"id":2581},"_22-int-números-enteros","2.2 int - Números enteros",[13,2584,2585,2587],{},[16,2586,2506],{},": Para cantidades completas sin decimales.",[543,2589,2591],{"className":545,"code":2590,"language":547,"meta":228,"style":228},"int numeroPages = 45;\nint cantidadBornes = 120;\nint año = 2025;\n",[54,2592,2593,2598,2603],{"__ignoreMap":228},[551,2594,2595],{"class":553,"line":554},[551,2596,2597],{},"int numeroPages = 45;\n",[551,2599,2600],{"class":553,"line":229},[551,2601,2602],{},"int cantidadBornes = 120;\n",[551,2604,2605],{"class":553,"line":670},[551,2606,2607],{},"int año = 2025;\n",[13,2609,2610,416],{},[16,2611,2532],{},[126,2613,2614,2617,2620],{},[88,2615,2616],{},"Solo números enteros: -2147483648 a 2147483647",[88,2618,2619],{},"Sin decimales",[88,2621,2622],{},"Operaciones matemáticas: +, -, *, \u002F, %",[13,2624,2625,416],{},[16,2626,2551],{},[543,2628,2630],{"className":545,"code":2629,"language":547,"meta":228,"style":228},"int numeroPagina = 15;\nint cantidadCables = 247;\nint numeroCircuito = 3;\nint potenciaNominal = 400;  \u002F\u002F Watts como número entero\n",[54,2631,2632,2637,2642,2647],{"__ignoreMap":228},[551,2633,2634],{"class":553,"line":554},[551,2635,2636],{},"int numeroPagina = 15;\n",[551,2638,2639],{"class":553,"line":229},[551,2640,2641],{},"int cantidadCables = 247;\n",[551,2643,2644],{"class":553,"line":670},[551,2645,2646],{},"int numeroCircuito = 3;\n",[551,2648,2649],{"class":553,"line":1136},[551,2650,2651],{},"int potenciaNominal = 400;  \u002F\u002F Watts como número entero\n",[13,2653,2654,2657],{},[16,2655,2656],{},"Caso típico",": Contar elementos",[543,2659,2661],{"className":545,"code":2660,"language":547,"meta":228,"style":228},"int totalContactores = 12;\nint contactoresUsados = 8;\nint contactoresDisponibles = totalContactores - contactoresUsados;  \u002F\u002F 4\n",[54,2662,2663,2668,2673],{"__ignoreMap":228},[551,2664,2665],{"class":553,"line":554},[551,2666,2667],{},"int totalContactores = 12;\n",[551,2669,2670],{"class":553,"line":229},[551,2671,2672],{},"int contactoresUsados = 8;\n",[551,2674,2675],{"class":553,"line":670},[551,2676,2677],{},"int contactoresDisponibles = totalContactores - contactoresUsados;  \u002F\u002F 4\n",[43,2679],{},[367,2681,2683],{"id":2682},"_23-double-números-decimales","2.3 double - Números decimales",[13,2685,2686,2688],{},[16,2687,2506],{},": Para valores con decimales (mediciones eléctricas, cálculos precisos).",[543,2690,2692],{"className":545,"code":2691,"language":547,"meta":228,"style":228},"double voltaje = 230.5;\ndouble corriente = 16.3;\ndouble resistencia = 10.75;\n",[54,2693,2694,2699,2704],{"__ignoreMap":228},[551,2695,2696],{"class":553,"line":554},[551,2697,2698],{},"double voltaje = 230.5;\n",[551,2700,2701],{"class":553,"line":229},[551,2702,2703],{},"double corriente = 16.3;\n",[551,2705,2706],{"class":553,"line":670},[551,2707,2708],{},"double resistencia = 10.75;\n",[13,2710,2711,416],{},[16,2712,2532],{},[126,2714,2715,2718,2721],{},[88,2716,2717],{},"Números con decimales",[88,2719,2720],{},"Precisión de ~15-17 dígitos decimales",[88,2722,2723],{},"Se usa punto (.) como separador decimal (no coma)",[13,2725,2726,416],{},[16,2727,2551],{},[543,2729,2731],{"className":545,"code":2730,"language":547,"meta":228,"style":228},"double voltajeLinea = 400.0;\ndouble corrienteNominal = 16.5;\ndouble factorPotencia = 0.92;\ndouble seccionCable = 2.5;  \u002F\u002F mm²\ndouble longitudCable = 47.8;  \u002F\u002F metros\n",[54,2732,2733,2738,2743,2748,2753],{"__ignoreMap":228},[551,2734,2735],{"class":553,"line":554},[551,2736,2737],{},"double voltajeLinea = 400.0;\n",[551,2739,2740],{"class":553,"line":229},[551,2741,2742],{},"double corrienteNominal = 16.5;\n",[551,2744,2745],{"class":553,"line":670},[551,2746,2747],{},"double factorPotencia = 0.92;\n",[551,2749,2750],{"class":553,"line":1136},[551,2751,2752],{},"double seccionCable = 2.5;  \u002F\u002F mm²\n",[551,2754,2755],{"class":553,"line":1142},[551,2756,2757],{},"double longitudCable = 47.8;  \u002F\u002F metros\n",[13,2759,2760,2762],{},[16,2761,2656],{},": Ley de Ohm",[543,2764,2766],{"className":545,"code":2765,"language":547,"meta":228,"style":228},"double voltaje = 230.0;     \u002F\u002F V\ndouble corriente = 10.5;    \u002F\u002F A\ndouble resistencia = voltaje \u002F corriente;  \u002F\u002F 21.90476... Ω\n",[54,2767,2768,2773,2778],{"__ignoreMap":228},[551,2769,2770],{"class":553,"line":554},[551,2771,2772],{},"double voltaje = 230.0;     \u002F\u002F V\n",[551,2774,2775],{"class":553,"line":229},[551,2776,2777],{},"double corriente = 10.5;    \u002F\u002F A\n",[551,2779,2780],{"class":553,"line":670},[551,2781,2782],{},"double resistencia = voltaje \u002F corriente;  \u002F\u002F 21.90476... Ω\n",[13,2784,2785,2788,2789,2792,2793,416],{},[16,2786,2787],{},"Nota importante",": Siempre usa ",[54,2790,2791],{},".0"," aunque sea número entero para que C# lo trate como ",[54,2794,2795],{},"double",[543,2797,2799],{"className":545,"code":2798,"language":547,"meta":228,"style":228},"double valor1 = 100.0;   \u002F\u002F Correcto\ndouble valor2 = 100;     \u002F\u002F También funciona, pero menos claro\n",[54,2800,2801,2806],{"__ignoreMap":228},[551,2802,2803],{"class":553,"line":554},[551,2804,2805],{},"double valor1 = 100.0;   \u002F\u002F Correcto\n",[551,2807,2808],{"class":553,"line":229},[551,2809,2810],{},"double valor2 = 100;     \u002F\u002F También funciona, pero menos claro\n",[43,2812],{},[367,2814,2816],{"id":2815},"_24-bool-valores-lógicos-verdaderofalso","2.4 bool - Valores lógicos (verdadero\u002Ffalso)",[13,2818,2819,2821],{},[16,2820,2506],{},": Para condiciones, estados, banderas.",[543,2823,2825],{"className":545,"code":2824,"language":547,"meta":228,"style":228},"bool proyectoAbierto = true;\nbool tieneErrores = false;\nbool esEmergencia = true;\n",[54,2826,2827,2832,2837],{"__ignoreMap":228},[551,2828,2829],{"class":553,"line":554},[551,2830,2831],{},"bool proyectoAbierto = true;\n",[551,2833,2834],{"class":553,"line":229},[551,2835,2836],{},"bool tieneErrores = false;\n",[551,2838,2839],{"class":553,"line":670},[551,2840,2841],{},"bool esEmergencia = true;\n",[13,2843,2844,416],{},[16,2845,2532],{},[126,2847,2848,2858,2861],{},[88,2849,2850,2851,2854,2855],{},"Solo dos valores posibles: ",[54,2852,2853],{},"true"," o ",[54,2856,2857],{},"false",[88,2859,2860],{},"Fundamental para tomar decisiones (lo veremos en Capítulo 5)",[88,2862,2863],{},"No se escribe entre comillas",[13,2865,2866,416],{},[16,2867,2551],{},[543,2869,2871],{"className":545,"code":2870,"language":547,"meta":228,"style":228},"bool proyectoModificado = true;\nbool exportacionExitosa = false;\nbool requiereAprobacion = true;\nbool esTrifasico = true;\nbool tieneProteccionDiferencial = false;\n",[54,2872,2873,2878,2883,2888,2893],{"__ignoreMap":228},[551,2874,2875],{"class":553,"line":554},[551,2876,2877],{},"bool proyectoModificado = true;\n",[551,2879,2880],{"class":553,"line":229},[551,2881,2882],{},"bool exportacionExitosa = false;\n",[551,2884,2885],{"class":553,"line":670},[551,2886,2887],{},"bool requiereAprobacion = true;\n",[551,2889,2890],{"class":553,"line":1136},[551,2891,2892],{},"bool esTrifasico = true;\n",[551,2894,2895],{"class":553,"line":1142},[551,2896,2897],{},"bool tieneProteccionDiferencial = false;\n",[13,2899,2900,2902],{},[16,2901,2656],{},": Estados del proyecto",[543,2904,2906],{"className":545,"code":2905,"language":547,"meta":228,"style":228},"bool proyectoGuardado = false;\nbool cambiosPendientes = true;\nbool backupRealizado = true;\n",[54,2907,2908,2913,2918],{"__ignoreMap":228},[551,2909,2910],{"class":553,"line":554},[551,2911,2912],{},"bool proyectoGuardado = false;\n",[551,2914,2915],{"class":553,"line":229},[551,2916,2917],{},"bool cambiosPendientes = true;\n",[551,2919,2920],{"class":553,"line":670},[551,2921,2922],{},"bool backupRealizado = true;\n",[43,2924],{},[331,2926,2928],{"id":2927},"_3-declaración-y-asignación-de-variables","3. Declaración y asignación de variables",[367,2930,2932],{"id":2931},"_31-declaración-básica","3.1 Declaración básica",[13,2934,2935],{},"La sintaxis básica es:",[543,2937,2940],{"className":2938,"code":2939,"language":847},[845],"tipo nombreVariable = valor;\n",[54,2941,2939],{"__ignoreMap":228},[13,2943,2944],{},"Ejemplos:",[543,2946,2948],{"className":545,"code":2947,"language":547,"meta":228,"style":228},"string modelo = \"3RT2026-1BB40\";\nint cantidad = 5;\ndouble precio = 127.50;\nbool disponible = true;\n",[54,2949,2950,2955,2960,2965],{"__ignoreMap":228},[551,2951,2952],{"class":553,"line":554},[551,2953,2954],{},"string modelo = \"3RT2026-1BB40\";\n",[551,2956,2957],{"class":553,"line":229},[551,2958,2959],{},"int cantidad = 5;\n",[551,2961,2962],{"class":553,"line":670},[551,2963,2964],{},"double precio = 127.50;\n",[551,2966,2967],{"class":553,"line":1136},[551,2968,2969],{},"bool disponible = true;\n",[367,2971,2973],{"id":2972},"_32-declaración-sin-valor-inicial","3.2 Declaración sin valor inicial",[13,2975,2976],{},"Puedes declarar una variable sin darle valor inmediatamente:",[543,2978,2980],{"className":545,"code":2979,"language":547,"meta":228,"style":228},"string nombreCliente;\nint numeroPedido;\ndouble precioTotal;\n\n\u002F\u002F Más adelante en el código...\nnombreCliente = \"Acme Corp\";\nnumeroPedido = 1001;\nprecioTotal = 1250.75;\n",[54,2981,2982,2987,2992,2997,3001,3006,3011,3016],{"__ignoreMap":228},[551,2983,2984],{"class":553,"line":554},[551,2985,2986],{},"string nombreCliente;\n",[551,2988,2989],{"class":553,"line":229},[551,2990,2991],{},"int numeroPedido;\n",[551,2993,2994],{"class":553,"line":670},[551,2995,2996],{},"double precioTotal;\n",[551,2998,2999],{"class":553,"line":1136},[551,3000,1139],{"emptyLinePlaceholder":238},[551,3002,3003],{"class":553,"line":1142},[551,3004,3005],{},"\u002F\u002F Más adelante en el código...\n",[551,3007,3008],{"class":553,"line":1148},[551,3009,3010],{},"nombreCliente = \"Acme Corp\";\n",[551,3012,3013],{"class":553,"line":1154},[551,3014,3015],{},"numeroPedido = 1001;\n",[551,3017,3018],{"class":553,"line":1160},[551,3019,3020],{},"precioTotal = 1250.75;\n",[13,3022,3023,3025],{},[16,3024,1395],{},": Si intentas usar una variable sin asignarle valor, C# dará error:",[543,3027,3029],{"className":545,"code":3028,"language":547,"meta":228,"style":228},"int cantidad;\nint total = cantidad * 2;  \u002F\u002F ERROR: \"Use of unassigned local variable 'cantidad'\"\n",[54,3030,3031,3036],{"__ignoreMap":228},[551,3032,3033],{"class":553,"line":554},[551,3034,3035],{},"int cantidad;\n",[551,3037,3038],{"class":553,"line":229},[551,3039,3040],{},"int total = cantidad * 2;  \u002F\u002F ERROR: \"Use of unassigned local variable 'cantidad'\"\n",[367,3042,3044],{"id":3043},"_33-múltiples-variables-del-mismo-tipo","3.3 Múltiples variables del mismo tipo",[13,3046,3047],{},"Puedes declarar varias variables del mismo tipo en una línea:",[543,3049,3051],{"className":545,"code":3050,"language":547,"meta":228,"style":228},"double voltajeL1, voltajeL2, voltajeL3;\nvoltajeL1 = 230.0;\nvoltajeL2 = 232.5;\nvoltajeL3 = 229.8;\n",[54,3052,3053,3058,3063,3068],{"__ignoreMap":228},[551,3054,3055],{"class":553,"line":554},[551,3056,3057],{},"double voltajeL1, voltajeL2, voltajeL3;\n",[551,3059,3060],{"class":553,"line":229},[551,3061,3062],{},"voltajeL1 = 230.0;\n",[551,3064,3065],{"class":553,"line":670},[551,3066,3067],{},"voltajeL2 = 232.5;\n",[551,3069,3070],{"class":553,"line":1136},[551,3071,3072],{},"voltajeL3 = 229.8;\n",[13,3074,3075],{},"O con valores iniciales:",[543,3077,3079],{"className":545,"code":3078,"language":547,"meta":228,"style":228},"double voltajeL1 = 230.0, voltajeL2 = 232.5, voltajeL3 = 229.8;\n",[54,3080,3081],{"__ignoreMap":228},[551,3082,3083],{"class":553,"line":554},[551,3084,3078],{},[13,3086,3087],{},"Aunque para legibilidad, generalmente preferimos:",[543,3089,3091],{"className":545,"code":3090,"language":547,"meta":228,"style":228},"double voltajeL1 = 230.0;\ndouble voltajeL2 = 232.5;\ndouble voltajeL3 = 229.8;\n",[54,3092,3093,3098,3103],{"__ignoreMap":228},[551,3094,3095],{"class":553,"line":554},[551,3096,3097],{},"double voltajeL1 = 230.0;\n",[551,3099,3100],{"class":553,"line":229},[551,3101,3102],{},"double voltajeL2 = 232.5;\n",[551,3104,3105],{"class":553,"line":670},[551,3106,3107],{},"double voltajeL3 = 229.8;\n",[43,3109],{},[331,3111,3113],{"id":3112},"_4-convenciones-de-nombres-naming-conventions","4. Convenciones de nombres (Naming conventions)",[13,3115,3116],{},"Seguir convenciones de nombres hace tu código más legible y profesional.",[367,3118,3120],{"id":3119},"_41-reglas-obligatorias-el-código-no-compilará-si-no-las-sigues","4.1 Reglas obligatorias (el código no compilará si no las sigues)",[85,3122,3123,3153,3178],{},[88,3124,3125,3128],{},[16,3126,3127],{},"Solo letras, números y guión bajo (_)",[543,3129,3131],{"className":545,"code":3130,"language":547,"meta":228,"style":228},"int valor1;        \u002F\u002F OK\nint valor_uno;     \u002F\u002F OK\nint valor-uno;     \u002F\u002F ERROR: no se permiten guiones\nint valor uno;     \u002F\u002F ERROR: no se permiten espacios\n",[54,3132,3133,3138,3143,3148],{"__ignoreMap":228},[551,3134,3135],{"class":553,"line":554},[551,3136,3137],{},"int valor1;        \u002F\u002F OK\n",[551,3139,3140],{"class":553,"line":229},[551,3141,3142],{},"int valor_uno;     \u002F\u002F OK\n",[551,3144,3145],{"class":553,"line":670},[551,3146,3147],{},"int valor-uno;     \u002F\u002F ERROR: no se permiten guiones\n",[551,3149,3150],{"class":553,"line":1136},[551,3151,3152],{},"int valor uno;     \u002F\u002F ERROR: no se permiten espacios\n",[88,3154,3155,3158],{},[16,3156,3157],{},"Debe comenzar con letra o guión bajo",[543,3159,3161],{"className":545,"code":3160,"language":547,"meta":228,"style":228},"int numero;        \u002F\u002F OK\nint _temporal;     \u002F\u002F OK\nint 1numero;       \u002F\u002F ERROR: no puede empezar con número\n",[54,3162,3163,3168,3173],{"__ignoreMap":228},[551,3164,3165],{"class":553,"line":554},[551,3166,3167],{},"int numero;        \u002F\u002F OK\n",[551,3169,3170],{"class":553,"line":229},[551,3171,3172],{},"int _temporal;     \u002F\u002F OK\n",[551,3174,3175],{"class":553,"line":670},[551,3176,3177],{},"int 1numero;       \u002F\u002F ERROR: no puede empezar con número\n",[88,3179,3180,3183],{},[16,3181,3182],{},"No puede ser una palabra reservada de C#",[543,3184,3186],{"className":545,"code":3185,"language":547,"meta":228,"style":228},"int numero;        \u002F\u002F OK\nint int;           \u002F\u002F ERROR: 'int' es palabra reservada\nint string;        \u002F\u002F ERROR: 'string' es palabra reservada\n",[54,3187,3188,3192,3197],{"__ignoreMap":228},[551,3189,3190],{"class":553,"line":554},[551,3191,3167],{},[551,3193,3194],{"class":553,"line":229},[551,3195,3196],{},"int int;           \u002F\u002F ERROR: 'int' es palabra reservada\n",[551,3198,3199],{"class":553,"line":670},[551,3200,3201],{},"int string;        \u002F\u002F ERROR: 'string' es palabra reservada\n",[367,3203,3205],{"id":3204},"_42-convenciones-recomendadas-estilo-camelcase-para-variables","4.2 Convenciones recomendadas (estilo camelCase para variables)",[13,3207,3208,3209,3212],{},"En C#, las variables locales usan ",[16,3210,3211],{},"camelCase",": primera palabra en minúscula, siguientes palabras con mayúscula inicial.",[543,3214,3216],{"className":545,"code":3215,"language":547,"meta":228,"style":228},"\u002F\u002F Bien (camelCase)\nstring nombreProyecto;\nint numeroPagina;\ndouble voltajeNominal;\nbool esCircuitoEmergencia;\n\n\u002F\u002F Mal (otros estilos)\nstring NombreProyecto;        \u002F\u002F PascalCase (se usa para clases, no variables)\nstring nombre_proyecto;       \u002F\u002F snake_case (común en Python, no en C#)\nstring nombreproyecto;        \u002F\u002F Difícil de leer\n",[54,3217,3218,3223,3228,3233,3238,3243,3247,3252,3257,3262],{"__ignoreMap":228},[551,3219,3220],{"class":553,"line":554},[551,3221,3222],{},"\u002F\u002F Bien (camelCase)\n",[551,3224,3225],{"class":553,"line":229},[551,3226,3227],{},"string nombreProyecto;\n",[551,3229,3230],{"class":553,"line":670},[551,3231,3232],{},"int numeroPagina;\n",[551,3234,3235],{"class":553,"line":1136},[551,3236,3237],{},"double voltajeNominal;\n",[551,3239,3240],{"class":553,"line":1142},[551,3241,3242],{},"bool esCircuitoEmergencia;\n",[551,3244,3245],{"class":553,"line":1148},[551,3246,1139],{"emptyLinePlaceholder":238},[551,3248,3249],{"class":553,"line":1154},[551,3250,3251],{},"\u002F\u002F Mal (otros estilos)\n",[551,3253,3254],{"class":553,"line":1160},[551,3255,3256],{},"string NombreProyecto;        \u002F\u002F PascalCase (se usa para clases, no variables)\n",[551,3258,3259],{"class":553,"line":1166},[551,3260,3261],{},"string nombre_proyecto;       \u002F\u002F snake_case (común en Python, no en C#)\n",[551,3263,3264],{"class":553,"line":1172},[551,3265,3266],{},"string nombreproyecto;        \u002F\u002F Difícil de leer\n",[367,3268,3270],{"id":3269},"_43-nombres-descriptivos","4.3 Nombres descriptivos",[13,3272,3273,3274,3277],{},"Usa nombres que expliquen ",[16,3275,3276],{},"qué contiene"," la variable:",[543,3279,3281],{"className":545,"code":3280,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: nombres genéricos\nstring s;\nint n;\ndouble x;\n\n\u002F\u002F Bien: nombres descriptivos\nstring nombreCliente;\nint cantidadContactores;\ndouble seccionCable;\n",[54,3282,3283,3288,3293,3298,3303,3307,3312,3316,3321],{"__ignoreMap":228},[551,3284,3285],{"class":553,"line":554},[551,3286,3287],{},"\u002F\u002F Mal: nombres genéricos\n",[551,3289,3290],{"class":553,"line":229},[551,3291,3292],{},"string s;\n",[551,3294,3295],{"class":553,"line":670},[551,3296,3297],{},"int n;\n",[551,3299,3300],{"class":553,"line":1136},[551,3301,3302],{},"double x;\n",[551,3304,3305],{"class":553,"line":1142},[551,3306,1139],{"emptyLinePlaceholder":238},[551,3308,3309],{"class":553,"line":1148},[551,3310,3311],{},"\u002F\u002F Bien: nombres descriptivos\n",[551,3313,3314],{"class":553,"line":1154},[551,3315,2986],{},[551,3317,3318],{"class":553,"line":1160},[551,3319,3320],{},"int cantidadContactores;\n",[551,3322,3323],{"class":553,"line":1166},[551,3324,3325],{},"double seccionCable;\n",[13,3327,3328,3331],{},[16,3329,3330],{},"Para ingenieros eléctricos",", incluye la unidad cuando sea relevante:",[543,3333,3335],{"className":545,"code":3334,"language":547,"meta":228,"style":228},"double voltajeV;              \u002F\u002F Voltaje en Voltios\ndouble corrienteA;            \u002F\u002F Corriente en Amperios\ndouble resistenciaOhm;        \u002F\u002F Resistencia en Ohmios\ndouble longitudMetros;        \u002F\u002F Longitud en metros\ndouble seccionMM2;            \u002F\u002F Sección en mm²\n",[54,3336,3337,3342,3347,3352,3357],{"__ignoreMap":228},[551,3338,3339],{"class":553,"line":554},[551,3340,3341],{},"double voltajeV;              \u002F\u002F Voltaje en Voltios\n",[551,3343,3344],{"class":553,"line":229},[551,3345,3346],{},"double corrienteA;            \u002F\u002F Corriente en Amperios\n",[551,3348,3349],{"class":553,"line":670},[551,3350,3351],{},"double resistenciaOhm;        \u002F\u002F Resistencia en Ohmios\n",[551,3353,3354],{"class":553,"line":1136},[551,3355,3356],{},"double longitudMetros;        \u002F\u002F Longitud en metros\n",[551,3358,3359],{"class":553,"line":1142},[551,3360,3361],{},"double seccionMM2;            \u002F\u002F Sección en mm²\n",[13,3363,3364],{},"O mejor aún, usa nombres claros sin abreviar:",[543,3366,3368],{"className":545,"code":3367,"language":547,"meta":228,"style":228},"double voltajeLinea;\ndouble corrienteNominal;\ndouble resistenciaTotal;\ndouble longitudCable;\ndouble seccionCable;\n",[54,3369,3370,3375,3380,3385,3390],{"__ignoreMap":228},[551,3371,3372],{"class":553,"line":554},[551,3373,3374],{},"double voltajeLinea;\n",[551,3376,3377],{"class":553,"line":229},[551,3378,3379],{},"double corrienteNominal;\n",[551,3381,3382],{"class":553,"line":670},[551,3383,3384],{},"double resistenciaTotal;\n",[551,3386,3387],{"class":553,"line":1136},[551,3388,3389],{},"double longitudCable;\n",[551,3391,3392],{"class":553,"line":1142},[551,3393,3325],{},[43,3395],{},[331,3397,3399],{"id":3398},"_5-conversiones-de-tipos-type-casting","5. Conversiones de tipos (Type casting)",[13,3401,3402],{},"A veces necesitas convertir un valor de un tipo a otro.",[367,3404,3406],{"id":3405},"_51-conversión-implícita-automática","5.1 Conversión implícita (automática)",[13,3408,3409,3410,416],{},"C# convierte automáticamente cuando ",[16,3411,3412],{},"no hay riesgo de perder información",[543,3414,3416],{"className":545,"code":3415,"language":547,"meta":228,"style":228},"int numeroPaginas = 10;\ndouble numeroDecimal = numeroPaginas;  \u002F\u002F int → double (OK automático)\n\u002F\u002F numeroDecimal ahora vale 10.0\n",[54,3417,3418,3423,3428],{"__ignoreMap":228},[551,3419,3420],{"class":553,"line":554},[551,3421,3422],{},"int numeroPaginas = 10;\n",[551,3424,3425],{"class":553,"line":229},[551,3426,3427],{},"double numeroDecimal = numeroPaginas;  \u002F\u002F int → double (OK automático)\n",[551,3429,3430],{"class":553,"line":670},[551,3431,3432],{},"\u002F\u002F numeroDecimal ahora vale 10.0\n",[13,3434,3435,416],{},[16,3436,3437],{},"Jerarquía de conversión implícita",[543,3439,3442],{"className":3440,"code":3441,"language":847},[845],"int → long → float → double\n",[54,3443,3441],{"__ignoreMap":228},[367,3445,3447],{"id":3446},"_52-conversión-explícita-casting","5.2 Conversión explícita (casting)",[13,3449,3450,3451,416],{},"Cuando vas de un tipo \"más grande\" a uno \"más pequeño\", necesitas ",[16,3452,3453],{},"casting explícito",[543,3455,3457],{"className":545,"code":3456,"language":547,"meta":228,"style":228},"double voltajeDecimal = 230.7;\nint voltajeEntero = (int)voltajeDecimal;  \u002F\u002F double → int\n\u002F\u002F voltajeEntero = 230 (se trunca el decimal)\n",[54,3458,3459,3464,3469],{"__ignoreMap":228},[551,3460,3461],{"class":553,"line":554},[551,3462,3463],{},"double voltajeDecimal = 230.7;\n",[551,3465,3466],{"class":553,"line":229},[551,3467,3468],{},"int voltajeEntero = (int)voltajeDecimal;  \u002F\u002F double → int\n",[551,3470,3471],{"class":553,"line":670},[551,3472,3473],{},"\u002F\u002F voltajeEntero = 230 (se trunca el decimal)\n",[13,3475,3476,93,3479],{},[16,3477,3478],{},"Sintaxis",[54,3480,3481],{},"(tipoDestino)variable",[13,3483,3484,3487],{},[16,3485,3486],{},"Cuidado",": Se pierde la parte decimal",[543,3489,3491],{"className":545,"code":3490,"language":547,"meta":228,"style":228},"double precio = 127.89;\nint precioEntero = (int)precio;  \u002F\u002F precioEntero = 127 (no 128!)\n",[54,3492,3493,3498],{"__ignoreMap":228},[551,3494,3495],{"class":553,"line":554},[551,3496,3497],{},"double precio = 127.89;\n",[551,3499,3500],{"class":553,"line":229},[551,3501,3502],{},"int precioEntero = (int)precio;  \u002F\u002F precioEntero = 127 (no 128!)\n",[367,3504,3506],{"id":3505},"_53-conversión-usando-métodos-convert","5.3 Conversión usando métodos Convert",[13,3508,3509],{},"Para conversiones más seguras y controladas:",[543,3511,3513],{"className":545,"code":3512,"language":547,"meta":228,"style":228},"\u002F\u002F De string a números\nstring textoVoltaje = \"230\";\nint voltaje = Convert.ToInt32(textoVoltaje);\n\nstring textoCorriente = \"16.5\";\ndouble corriente = Convert.ToDouble(textoCorriente);\n\n\u002F\u002F De números a string\nint cantidad = 42;\nstring textoAntidad = Convert.ToString(cantidad);\n\u002F\u002F o más simple:\nstring textoCantidad2 = cantidad.ToString();\n",[54,3514,3515,3520,3525,3530,3534,3539,3544,3548,3553,3558,3563,3568],{"__ignoreMap":228},[551,3516,3517],{"class":553,"line":554},[551,3518,3519],{},"\u002F\u002F De string a números\n",[551,3521,3522],{"class":553,"line":229},[551,3523,3524],{},"string textoVoltaje = \"230\";\n",[551,3526,3527],{"class":553,"line":670},[551,3528,3529],{},"int voltaje = Convert.ToInt32(textoVoltaje);\n",[551,3531,3532],{"class":553,"line":1136},[551,3533,1139],{"emptyLinePlaceholder":238},[551,3535,3536],{"class":553,"line":1142},[551,3537,3538],{},"string textoCorriente = \"16.5\";\n",[551,3540,3541],{"class":553,"line":1148},[551,3542,3543],{},"double corriente = Convert.ToDouble(textoCorriente);\n",[551,3545,3546],{"class":553,"line":1154},[551,3547,1139],{"emptyLinePlaceholder":238},[551,3549,3550],{"class":553,"line":1160},[551,3551,3552],{},"\u002F\u002F De números a string\n",[551,3554,3555],{"class":553,"line":1166},[551,3556,3557],{},"int cantidad = 42;\n",[551,3559,3560],{"class":553,"line":1172},[551,3561,3562],{},"string textoAntidad = Convert.ToString(cantidad);\n",[551,3564,3565],{"class":553,"line":1178},[551,3566,3567],{},"\u002F\u002F o más simple:\n",[551,3569,3570],{"class":553,"line":1184},[551,3571,3572],{},"string textoCantidad2 = cantidad.ToString();\n",[13,3574,3575,416],{},[16,3576,3577],{},"Conversiones comunes",[543,3579,3581],{"className":545,"code":3580,"language":547,"meta":228,"style":228},"\u002F\u002F String → números\nint numero = Convert.ToInt32(\"123\");\ndouble decimal = Convert.ToDouble(\"45.67\");\nbool estado = Convert.ToBoolean(\"true\");\n\n\u002F\u002F Números → string\nstring texto1 = Convert.ToString(230);\nstring texto2 = (16.5).ToString();\nstring texto3 = true.ToString();  \u002F\u002F \"True\"\n",[54,3582,3583,3588,3593,3598,3603,3607,3612,3617,3622],{"__ignoreMap":228},[551,3584,3585],{"class":553,"line":554},[551,3586,3587],{},"\u002F\u002F String → números\n",[551,3589,3590],{"class":553,"line":229},[551,3591,3592],{},"int numero = Convert.ToInt32(\"123\");\n",[551,3594,3595],{"class":553,"line":670},[551,3596,3597],{},"double decimal = Convert.ToDouble(\"45.67\");\n",[551,3599,3600],{"class":553,"line":1136},[551,3601,3602],{},"bool estado = Convert.ToBoolean(\"true\");\n",[551,3604,3605],{"class":553,"line":1142},[551,3606,1139],{"emptyLinePlaceholder":238},[551,3608,3609],{"class":553,"line":1148},[551,3610,3611],{},"\u002F\u002F Números → string\n",[551,3613,3614],{"class":553,"line":1154},[551,3615,3616],{},"string texto1 = Convert.ToString(230);\n",[551,3618,3619],{"class":553,"line":1160},[551,3620,3621],{},"string texto2 = (16.5).ToString();\n",[551,3623,3624],{"class":553,"line":1166},[551,3625,3626],{},"string texto3 = true.ToString();  \u002F\u002F \"True\"\n",[367,3628,3630],{"id":3629},"_54-parse-y-tryparse","5.4 Parse y TryParse",[13,3632,3633],{},"Para convertir strings a números, también puedes usar:",[543,3635,3637],{"className":545,"code":3636,"language":547,"meta":228,"style":228},"\u002F\u002F Parse (genera error si falla)\nstring texto = \"230\";\nint voltaje = int.Parse(texto);\n\n\u002F\u002F TryParse (devuelve true\u002Ffalse si funcionó)\nstring textoEntrada = \"230\";\nint voltajeResultado;\nbool exito = int.TryParse(textoEntrada, out voltajeResultado);\n\nif (exito)\n{\n    \u002F\u002F voltajeResultado contiene 230\n}\nelse\n{\n    \u002F\u002F La conversión falló\n}\n",[54,3638,3639,3644,3649,3654,3658,3663,3668,3673,3678,3682,3687,3691,3696,3700,3705,3709,3714],{"__ignoreMap":228},[551,3640,3641],{"class":553,"line":554},[551,3642,3643],{},"\u002F\u002F Parse (genera error si falla)\n",[551,3645,3646],{"class":553,"line":229},[551,3647,3648],{},"string texto = \"230\";\n",[551,3650,3651],{"class":553,"line":670},[551,3652,3653],{},"int voltaje = int.Parse(texto);\n",[551,3655,3656],{"class":553,"line":1136},[551,3657,1139],{"emptyLinePlaceholder":238},[551,3659,3660],{"class":553,"line":1142},[551,3661,3662],{},"\u002F\u002F TryParse (devuelve true\u002Ffalse si funcionó)\n",[551,3664,3665],{"class":553,"line":1148},[551,3666,3667],{},"string textoEntrada = \"230\";\n",[551,3669,3670],{"class":553,"line":1154},[551,3671,3672],{},"int voltajeResultado;\n",[551,3674,3675],{"class":553,"line":1160},[551,3676,3677],{},"bool exito = int.TryParse(textoEntrada, out voltajeResultado);\n",[551,3679,3680],{"class":553,"line":1166},[551,3681,1139],{"emptyLinePlaceholder":238},[551,3683,3684],{"class":553,"line":1172},[551,3685,3686],{},"if (exito)\n",[551,3688,3689],{"class":553,"line":1178},[551,3690,1151],{},[551,3692,3693],{"class":553,"line":1184},[551,3694,3695],{},"    \u002F\u002F voltajeResultado contiene 230\n",[551,3697,3698],{"class":553,"line":1190},[551,3699,1193],{},[551,3701,3702],{"class":553,"line":1472},[551,3703,3704],{},"else\n",[551,3706,3707],{"class":553,"line":1477},[551,3708,1151],{},[551,3710,3711],{"class":553,"line":1797},[551,3712,3713],{},"    \u002F\u002F La conversión falló\n",[551,3715,3716],{"class":553,"line":1802},[551,3717,1193],{},[43,3719],{},[331,3721,3723],{"id":3722},"_6-operaciones-básicas-con-variables","6. Operaciones básicas con variables",[367,3725,3727],{"id":3726},"_61-operaciones-aritméticas","6.1 Operaciones aritméticas",[543,3729,3731],{"className":545,"code":3730,"language":547,"meta":228,"style":228},"double voltaje = 230.0;\ndouble corriente = 10.5;\n\n\u002F\u002F Suma\ndouble suma = voltaje + corriente;  \u002F\u002F 240.5\n\n\u002F\u002F Resta\ndouble diferencia = voltaje - corriente;  \u002F\u002F 219.5\n\n\u002F\u002F Multiplicación\ndouble potencia = voltaje * corriente;  \u002F\u002F 2415.0 W\n\n\u002F\u002F División\ndouble resistencia = voltaje \u002F corriente;  \u002F\u002F 21.904... Ω\n\n\u002F\u002F Módulo (resto de división)\nint totalCables = 100;\nint cablesPorBandeja = 12;\nint sobran = totalCables % cablesPorBandeja;  \u002F\u002F 4\n",[54,3732,3733,3737,3742,3746,3751,3756,3760,3765,3770,3774,3779,3784,3788,3793,3798,3802,3807,3812,3817],{"__ignoreMap":228},[551,3734,3735],{"class":553,"line":554},[551,3736,2454],{},[551,3738,3739],{"class":553,"line":229},[551,3740,3741],{},"double corriente = 10.5;\n",[551,3743,3744],{"class":553,"line":670},[551,3745,1139],{"emptyLinePlaceholder":238},[551,3747,3748],{"class":553,"line":1136},[551,3749,3750],{},"\u002F\u002F Suma\n",[551,3752,3753],{"class":553,"line":1142},[551,3754,3755],{},"double suma = voltaje + corriente;  \u002F\u002F 240.5\n",[551,3757,3758],{"class":553,"line":1148},[551,3759,1139],{"emptyLinePlaceholder":238},[551,3761,3762],{"class":553,"line":1154},[551,3763,3764],{},"\u002F\u002F Resta\n",[551,3766,3767],{"class":553,"line":1160},[551,3768,3769],{},"double diferencia = voltaje - corriente;  \u002F\u002F 219.5\n",[551,3771,3772],{"class":553,"line":1166},[551,3773,1139],{"emptyLinePlaceholder":238},[551,3775,3776],{"class":553,"line":1172},[551,3777,3778],{},"\u002F\u002F Multiplicación\n",[551,3780,3781],{"class":553,"line":1178},[551,3782,3783],{},"double potencia = voltaje * corriente;  \u002F\u002F 2415.0 W\n",[551,3785,3786],{"class":553,"line":1184},[551,3787,1139],{"emptyLinePlaceholder":238},[551,3789,3790],{"class":553,"line":1190},[551,3791,3792],{},"\u002F\u002F División\n",[551,3794,3795],{"class":553,"line":1472},[551,3796,3797],{},"double resistencia = voltaje \u002F corriente;  \u002F\u002F 21.904... Ω\n",[551,3799,3800],{"class":553,"line":1477},[551,3801,1139],{"emptyLinePlaceholder":238},[551,3803,3804],{"class":553,"line":1797},[551,3805,3806],{},"\u002F\u002F Módulo (resto de división)\n",[551,3808,3809],{"class":553,"line":1802},[551,3810,3811],{},"int totalCables = 100;\n",[551,3813,3814],{"class":553,"line":1808},[551,3815,3816],{},"int cablesPorBandeja = 12;\n",[551,3818,3819],{"class":553,"line":1814},[551,3820,3821],{},"int sobran = totalCables % cablesPorBandeja;  \u002F\u002F 4\n",[13,3823,3824,416],{},[16,3825,3826],{},"Importante con división de enteros",[543,3828,3830],{"className":545,"code":3829,"language":547,"meta":228,"style":228},"int dividendo = 10;\nint divisor = 3;\nint resultadoEntero = dividendo \u002F divisor;  \u002F\u002F 3 (no 3.33!)\n\ndouble resultadoCorrecto = (double)dividendo \u002F divisor;  \u002F\u002F 3.333...\n",[54,3831,3832,3837,3842,3847,3851],{"__ignoreMap":228},[551,3833,3834],{"class":553,"line":554},[551,3835,3836],{},"int dividendo = 10;\n",[551,3838,3839],{"class":553,"line":229},[551,3840,3841],{},"int divisor = 3;\n",[551,3843,3844],{"class":553,"line":670},[551,3845,3846],{},"int resultadoEntero = dividendo \u002F divisor;  \u002F\u002F 3 (no 3.33!)\n",[551,3848,3849],{"class":553,"line":1136},[551,3850,1139],{"emptyLinePlaceholder":238},[551,3852,3853],{"class":553,"line":1142},[551,3854,3855],{},"double resultadoCorrecto = (double)dividendo \u002F divisor;  \u002F\u002F 3.333...\n",[367,3857,3859],{"id":3858},"_62-concatenación-de-strings","6.2 Concatenación de strings",[13,3861,3862,3863,416],{},"Unir textos con el operador ",[54,3864,3865],{},"+",[543,3867,3869],{"className":545,"code":3868,"language":547,"meta":228,"style":228},"string nombre = \"Motor\";\nstring numero = \"M1\";\nstring completo = nombre + \" \" + numero;  \u002F\u002F \"Motor M1\"\n",[54,3870,3871,3876,3881],{"__ignoreMap":228},[551,3872,3873],{"class":553,"line":554},[551,3874,3875],{},"string nombre = \"Motor\";\n",[551,3877,3878],{"class":553,"line":229},[551,3879,3880],{},"string numero = \"M1\";\n",[551,3882,3883],{"class":553,"line":670},[551,3884,3885],{},"string completo = nombre + \" \" + numero;  \u002F\u002F \"Motor M1\"\n",[13,3887,3888],{},"Combinar strings y números:",[543,3890,3892],{"className":545,"code":3891,"language":547,"meta":228,"style":228},"int cantidad = 5;\nstring mensaje = \"Se encontraron \" + cantidad + \" errores\";\n\u002F\u002F \"Se encontraron 5 errores\"\n",[54,3893,3894,3898,3903],{"__ignoreMap":228},[551,3895,3896],{"class":553,"line":554},[551,3897,2959],{},[551,3899,3900],{"class":553,"line":229},[551,3901,3902],{},"string mensaje = \"Se encontraron \" + cantidad + \" errores\";\n",[551,3904,3905],{"class":553,"line":670},[551,3906,3907],{},"\u002F\u002F \"Se encontraron 5 errores\"\n",[367,3909,3911],{"id":3910},"_63-formato-con-stringformat","6.3 Formato con string.Format",[13,3913,3914],{},"Para construir strings más complejos:",[543,3916,3918],{"className":545,"code":3917,"language":547,"meta":228,"style":228},"string cliente = \"Acme Corp\";\nint cantidad = 15;\ndouble precio = 127.50;\n\nstring mensaje = string.Format(\n    \"Cliente: {0}\\nCantidad: {1}\\nPrecio: ${2:F2}\",\n    cliente,\n    cantidad,\n    precio\n);\n\u002F\u002F Resultado:\n\u002F\u002F Cliente: Acme Corp\n\u002F\u002F Cantidad: 15\n\u002F\u002F Precio: $127.50\n",[54,3919,3920,3925,3930,3934,3938,3943,3948,3953,3958,3963,3968,3973,3978,3983],{"__ignoreMap":228},[551,3921,3922],{"class":553,"line":554},[551,3923,3924],{},"string cliente = \"Acme Corp\";\n",[551,3926,3927],{"class":553,"line":229},[551,3928,3929],{},"int cantidad = 15;\n",[551,3931,3932],{"class":553,"line":670},[551,3933,2964],{},[551,3935,3936],{"class":553,"line":1136},[551,3937,1139],{"emptyLinePlaceholder":238},[551,3939,3940],{"class":553,"line":1142},[551,3941,3942],{},"string mensaje = string.Format(\n",[551,3944,3945],{"class":553,"line":1148},[551,3946,3947],{},"    \"Cliente: {0}\\nCantidad: {1}\\nPrecio: ${2:F2}\",\n",[551,3949,3950],{"class":553,"line":1154},[551,3951,3952],{},"    cliente,\n",[551,3954,3955],{"class":553,"line":1160},[551,3956,3957],{},"    cantidad,\n",[551,3959,3960],{"class":553,"line":1166},[551,3961,3962],{},"    precio\n",[551,3964,3965],{"class":553,"line":1172},[551,3966,3967],{},");\n",[551,3969,3970],{"class":553,"line":1178},[551,3971,3972],{},"\u002F\u002F Resultado:\n",[551,3974,3975],{"class":553,"line":1184},[551,3976,3977],{},"\u002F\u002F Cliente: Acme Corp\n",[551,3979,3980],{"class":553,"line":1190},[551,3981,3982],{},"\u002F\u002F Cantidad: 15\n",[551,3984,3985],{"class":553,"line":1472},[551,3986,3987],{},"\u002F\u002F Precio: $127.50\n",[13,3989,3990,416],{},[16,3991,3992],{},"Placeholders",[126,3994,3995,4008,4014],{},[88,3996,3997,4000,4001,4000,4004,4007],{},[54,3998,3999],{},"{0}",", ",[54,4002,4003],{},"{1}",[54,4005,4006],{},"{2}",": posición del argumento",[88,4009,4010,4013],{},[54,4011,4012],{},":F2",": formato con 2 decimales",[88,4015,4016,4019],{},[54,4017,4018],{},"\\n",": salto de línea",[43,4021],{},[46,4023,4025],{"id":4024},"manos-a-la-obra-construyendo-el-proyecto","Manos a la obra: Construyendo el proyecto",[13,4027,4028],{},"Vamos a crear un script que realiza cálculos eléctricos básicos usando variables.",[331,4030,4032],{"id":4031},"paso-1-estructura-básica","Paso 1: Estructura básica",[543,4034,4036],{"className":545,"code":4035,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class CalculadoraCircuitos\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Aquí irá nuestro código\n    }\n}\n",[54,4037,4038,4042,4046,4050,4054,4059,4063,4067,4071,4075,4080,4084],{"__ignoreMap":228},[551,4039,4040],{"class":553,"line":554},[551,4041,1123],{},[551,4043,4044],{"class":553,"line":229},[551,4045,1128],{},[551,4047,4048],{"class":553,"line":670},[551,4049,1133],{},[551,4051,4052],{"class":553,"line":1136},[551,4053,1139],{"emptyLinePlaceholder":238},[551,4055,4056],{"class":553,"line":1142},[551,4057,4058],{},"public class CalculadoraCircuitos\n",[551,4060,4061],{"class":553,"line":1148},[551,4062,1151],{},[551,4064,4065],{"class":553,"line":1154},[551,4066,1157],{},[551,4068,4069],{"class":553,"line":1160},[551,4070,1163],{},[551,4072,4073],{"class":553,"line":1166},[551,4074,1169],{},[551,4076,4077],{"class":553,"line":1172},[551,4078,4079],{},"        \u002F\u002F Aquí irá nuestro código\n",[551,4081,4082],{"class":553,"line":1178},[551,4083,1187],{},[551,4085,4086],{"class":553,"line":1184},[551,4087,1193],{},[43,4089],{},[331,4091,4093],{"id":4092},"paso-2-declarar-variables-para-un-circuito-simple","Paso 2: Declarar variables para un circuito simple",[543,4095,4097],{"className":545,"code":4096,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()\n{\n    \u002F\u002F Datos del circuito\n    double voltaje = 230.0;      \u002F\u002F Voltios\n    double corriente = 16.0;     \u002F\u002F Amperios\n    double factorPotencia = 0.85;\n\n    string nombreCircuito = \"Circuito de Iluminación Planta 2\";\n    bool esTrifasico = false;\n}\n",[54,4098,4099,4103,4107,4111,4116,4121,4126,4131,4135,4140,4145],{"__ignoreMap":228},[551,4100,4101],{"class":553,"line":554},[551,4102,1310],{},[551,4104,4105],{"class":553,"line":229},[551,4106,1315],{},[551,4108,4109],{"class":553,"line":670},[551,4110,1151],{},[551,4112,4113],{"class":553,"line":1136},[551,4114,4115],{},"    \u002F\u002F Datos del circuito\n",[551,4117,4118],{"class":553,"line":1142},[551,4119,4120],{},"    double voltaje = 230.0;      \u002F\u002F Voltios\n",[551,4122,4123],{"class":553,"line":1148},[551,4124,4125],{},"    double corriente = 16.0;     \u002F\u002F Amperios\n",[551,4127,4128],{"class":553,"line":1154},[551,4129,4130],{},"    double factorPotencia = 0.85;\n",[551,4132,4133],{"class":553,"line":1160},[551,4134,1139],{"emptyLinePlaceholder":238},[551,4136,4137],{"class":553,"line":1166},[551,4138,4139],{},"    string nombreCircuito = \"Circuito de Iluminación Planta 2\";\n",[551,4141,4142],{"class":553,"line":1172},[551,4143,4144],{},"    bool esTrifasico = false;\n",[551,4146,4147],{"class":553,"line":1178},[551,4148,1193],{},[13,4150,4151,4154],{},[16,4152,4153],{},"¿Qué acabamos de hacer?","\nDeclaramos las variables necesarias para un circuito eléctrico básico.",[43,4156],{},[331,4158,4160],{"id":4159},"paso-3-calcular-resistencia-ley-de-ohm","Paso 3: Calcular resistencia (Ley de Ohm)",[543,4162,4164],{"className":545,"code":4163,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()\n{\n    \u002F\u002F Datos del circuito\n    double voltaje = 230.0;\n    double corriente = 16.0;\n    double factorPotencia = 0.85;\n    string nombreCircuito = \"Circuito de Iluminación Planta 2\";\n    bool esTrifasico = false;\n\n    \u002F\u002F Cálculo 1: Resistencia (R = V \u002F I)\n    double resistencia = voltaje \u002F corriente;\n}\n",[54,4165,4166,4170,4174,4178,4182,4187,4192,4196,4200,4204,4208,4213,4218],{"__ignoreMap":228},[551,4167,4168],{"class":553,"line":554},[551,4169,1310],{},[551,4171,4172],{"class":553,"line":229},[551,4173,1315],{},[551,4175,4176],{"class":553,"line":670},[551,4177,1151],{},[551,4179,4180],{"class":553,"line":1136},[551,4181,4115],{},[551,4183,4184],{"class":553,"line":1142},[551,4185,4186],{},"    double voltaje = 230.0;\n",[551,4188,4189],{"class":553,"line":1148},[551,4190,4191],{},"    double corriente = 16.0;\n",[551,4193,4194],{"class":553,"line":1154},[551,4195,4130],{},[551,4197,4198],{"class":553,"line":1160},[551,4199,4139],{},[551,4201,4202],{"class":553,"line":1166},[551,4203,4144],{},[551,4205,4206],{"class":553,"line":1172},[551,4207,1139],{"emptyLinePlaceholder":238},[551,4209,4210],{"class":553,"line":1178},[551,4211,4212],{},"    \u002F\u002F Cálculo 1: Resistencia (R = V \u002F I)\n",[551,4214,4215],{"class":553,"line":1184},[551,4216,4217],{},"    double resistencia = voltaje \u002F corriente;\n",[551,4219,4220],{"class":553,"line":1190},[551,4221,1193],{},[13,4223,4224,4226],{},[16,4225,4153],{},"\nAplicamos la Ley de Ohm para calcular la resistencia del circuito.",[43,4228],{},[331,4230,4232],{"id":4231},"paso-4-calcular-potencia","Paso 4: Calcular potencia",[543,4234,4236],{"className":545,"code":4235,"language":547,"meta":228,"style":228},"\u002F\u002F Cálculo 2: Potencia aparente (S = V * I)\ndouble potenciaAparente = voltaje * corriente;\n\n\u002F\u002F Cálculo 3: Potencia activa (P = V * I * cos φ)\ndouble potenciaActiva = voltaje * corriente * factorPotencia;\n",[54,4237,4238,4243,4248,4252,4257],{"__ignoreMap":228},[551,4239,4240],{"class":553,"line":554},[551,4241,4242],{},"\u002F\u002F Cálculo 2: Potencia aparente (S = V * I)\n",[551,4244,4245],{"class":553,"line":229},[551,4246,4247],{},"double potenciaAparente = voltaje * corriente;\n",[551,4249,4250],{"class":553,"line":670},[551,4251,1139],{"emptyLinePlaceholder":238},[551,4253,4254],{"class":553,"line":1136},[551,4255,4256],{},"\u002F\u002F Cálculo 3: Potencia activa (P = V * I * cos φ)\n",[551,4258,4259],{"class":553,"line":1142},[551,4260,4261],{},"double potenciaActiva = voltaje * corriente * factorPotencia;\n",[13,4263,4264,4266],{},[16,4265,4153],{},"\nCalculamos la potencia aparente y la potencia activa considerando el factor de potencia.",[43,4268],{},[331,4270,4272],{"id":4271},"paso-5-construir-mensaje-con-resultados","Paso 5: Construir mensaje con resultados",[543,4274,4276],{"className":545,"code":4275,"language":547,"meta":228,"style":228},"\u002F\u002F Construir el mensaje con formato\nstring mensaje = string.Format(\n    \"=== CALCULADORA DE CIRCUITOS ===\\n\\n\" +\n    \"Circuito: {0}\\n\" +\n    \"Tipo: {1}\\n\\n\" +\n    \"DATOS DE ENTRADA:\\n\" +\n    \"Voltaje: {2:F1} V\\n\" +\n    \"Corriente: {3:F1} A\\n\" +\n    \"Factor de potencia: {4:F2}\\n\\n\" +\n    \"RESULTADOS CALCULADOS:\\n\" +\n    \"Resistencia: {5:F2} Ω\\n\" +\n    \"Potencia aparente: {6:F2} VA\\n\" +\n    \"Potencia activa: {7:F2} W\",\n    nombreCircuito,\n    esTrifasico ? \"Trifásico\" : \"Monofásico\",\n    voltaje,\n    corriente,\n    factorPotencia,\n    resistencia,\n    potenciaAparente,\n    potenciaActiva\n);\n",[54,4277,4278,4283,4287,4292,4297,4302,4307,4312,4317,4322,4327,4332,4337,4342,4347,4352,4357,4362,4367,4372,4377,4382],{"__ignoreMap":228},[551,4279,4280],{"class":553,"line":554},[551,4281,4282],{},"\u002F\u002F Construir el mensaje con formato\n",[551,4284,4285],{"class":553,"line":229},[551,4286,3942],{},[551,4288,4289],{"class":553,"line":670},[551,4290,4291],{},"    \"=== CALCULADORA DE CIRCUITOS ===\\n\\n\" +\n",[551,4293,4294],{"class":553,"line":1136},[551,4295,4296],{},"    \"Circuito: {0}\\n\" +\n",[551,4298,4299],{"class":553,"line":1142},[551,4300,4301],{},"    \"Tipo: {1}\\n\\n\" +\n",[551,4303,4304],{"class":553,"line":1148},[551,4305,4306],{},"    \"DATOS DE ENTRADA:\\n\" +\n",[551,4308,4309],{"class":553,"line":1154},[551,4310,4311],{},"    \"Voltaje: {2:F1} V\\n\" +\n",[551,4313,4314],{"class":553,"line":1160},[551,4315,4316],{},"    \"Corriente: {3:F1} A\\n\" +\n",[551,4318,4319],{"class":553,"line":1166},[551,4320,4321],{},"    \"Factor de potencia: {4:F2}\\n\\n\" +\n",[551,4323,4324],{"class":553,"line":1172},[551,4325,4326],{},"    \"RESULTADOS CALCULADOS:\\n\" +\n",[551,4328,4329],{"class":553,"line":1178},[551,4330,4331],{},"    \"Resistencia: {5:F2} Ω\\n\" +\n",[551,4333,4334],{"class":553,"line":1184},[551,4335,4336],{},"    \"Potencia aparente: {6:F2} VA\\n\" +\n",[551,4338,4339],{"class":553,"line":1190},[551,4340,4341],{},"    \"Potencia activa: {7:F2} W\",\n",[551,4343,4344],{"class":553,"line":1472},[551,4345,4346],{},"    nombreCircuito,\n",[551,4348,4349],{"class":553,"line":1477},[551,4350,4351],{},"    esTrifasico ? \"Trifásico\" : \"Monofásico\",\n",[551,4353,4354],{"class":553,"line":1797},[551,4355,4356],{},"    voltaje,\n",[551,4358,4359],{"class":553,"line":1802},[551,4360,4361],{},"    corriente,\n",[551,4363,4364],{"class":553,"line":1808},[551,4365,4366],{},"    factorPotencia,\n",[551,4368,4369],{"class":553,"line":1814},[551,4370,4371],{},"    resistencia,\n",[551,4373,4374],{"class":553,"line":1820},[551,4375,4376],{},"    potenciaAparente,\n",[551,4378,4379],{"class":553,"line":1826},[551,4380,4381],{},"    potenciaActiva\n",[551,4383,4384],{"class":553,"line":1832},[551,4385,3967],{},[13,4387,4388,4390,4391,4394],{},[16,4389,4153],{},"\nUsamos ",[54,4392,4393],{},"string.Format"," para construir un mensaje formateado con todos los resultados.",[13,4396,4397,73,4400,416],{},[16,4398,4399],{},"Nota sobre el operador ternario",[54,4401,4402],{},"? :",[543,4404,4406],{"className":545,"code":4405,"language":547,"meta":228,"style":228},"esTrifasico ? \"Trifásico\" : \"Monofásico\"\n",[54,4407,4408],{"__ignoreMap":228},[551,4409,4410],{"class":553,"line":554},[551,4411,4405],{},[13,4413,4414],{},"Esto significa: \"Si esTrifasico es true, usa 'Trifásico', si no, usa 'Monofásico'\". Lo veremos en detalle en el Capítulo 5.",[43,4416],{},[331,4418,4420],{"id":4419},"paso-6-mostrar-resultados","Paso 6: Mostrar resultados",[543,4422,4424],{"className":545,"code":4423,"language":547,"meta":228,"style":228},"\u002F\u002F Mostrar en MessageBox\nMessageBox.Show(\n    mensaje,\n    \"Calculadora de Circuitos Eléctricos\",\n    MessageBoxButtons.OK,\n    MessageBoxIcon.Information\n);\n",[54,4425,4426,4431,4436,4441,4446,4451,4456],{"__ignoreMap":228},[551,4427,4428],{"class":553,"line":554},[551,4429,4430],{},"\u002F\u002F Mostrar en MessageBox\n",[551,4432,4433],{"class":553,"line":229},[551,4434,4435],{},"MessageBox.Show(\n",[551,4437,4438],{"class":553,"line":670},[551,4439,4440],{},"    mensaje,\n",[551,4442,4443],{"class":553,"line":1136},[551,4444,4445],{},"    \"Calculadora de Circuitos Eléctricos\",\n",[551,4447,4448],{"class":553,"line":1142},[551,4449,4450],{},"    MessageBoxButtons.OK,\n",[551,4452,4453],{"class":553,"line":1148},[551,4454,4455],{},"    MessageBoxIcon.Information\n",[551,4457,4458],{"class":553,"line":1154},[551,4459,3967],{},[43,4461],{},[331,4463,4465],{"id":4464},"código-completo-del-proyecto","Código completo del proyecto",[543,4467,4469],{"className":545,"code":4468,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class CalculadoraCircuitos\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DEL CIRCUITO\n        \u002F\u002F ========================================\n\n        double voltaje = 230.0;              \u002F\u002F Voltios\n        double corriente = 16.0;             \u002F\u002F Amperios\n        double factorPotencia = 0.85;        \u002F\u002F cos φ\n        string nombreCircuito = \"Circuito de Iluminación Planta 2\";\n        bool esTrifasico = false;\n\n        \u002F\u002F ========================================\n        \u002F\u002F CÁLCULOS\n        \u002F\u002F ========================================\n\n        \u002F\u002F Resistencia usando Ley de Ohm: R = V \u002F I\n        double resistencia = voltaje \u002F corriente;\n\n        \u002F\u002F Potencia aparente: S = V * I\n        double potenciaAparente = voltaje * corriente;\n\n        \u002F\u002F Potencia activa: P = V * I * cos φ\n        double potenciaActiva = voltaje * corriente * factorPotencia;\n\n        \u002F\u002F ========================================\n        \u002F\u002F CONSTRUCCIÓN DEL MENSAJE\n        \u002F\u002F ========================================\n\n        string mensaje = string.Format(\n            \"=== CALCULADORA DE CIRCUITOS ===\\n\\n\" +\n            \"Circuito: {0}\\n\" +\n            \"Tipo: {1}\\n\\n\" +\n            \"DATOS DE ENTRADA:\\n\" +\n            \"Voltaje: {2:F1} V\\n\" +\n            \"Corriente: {3:F1} A\\n\" +\n            \"Factor de potencia: {4:F2}\\n\\n\" +\n            \"RESULTADOS CALCULADOS:\\n\" +\n            \"Resistencia: {5:F2} Ω\\n\" +\n            \"Potencia aparente: {6:F2} VA\\n\" +\n            \"Potencia activa: {7:F2} W\",\n            nombreCircuito,\n            esTrifasico ? \"Trifásico\" : \"Monofásico\",\n            voltaje,\n            corriente,\n            factorPotencia,\n            resistencia,\n            potenciaAparente,\n            potenciaActiva\n        );\n\n        \u002F\u002F ========================================\n        \u002F\u002F MOSTRAR RESULTADOS\n        \u002F\u002F ========================================\n\n        MessageBox.Show(\n            mensaje,\n            \"Calculadora de Circuitos Eléctricos\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Information\n        );\n    }\n}\n",[54,4470,4471,4475,4479,4483,4487,4491,4495,4499,4503,4507,4512,4517,4521,4525,4530,4535,4540,4545,4550,4554,4558,4563,4567,4571,4576,4581,4585,4590,4595,4599,4604,4609,4613,4618,4624,4629,4634,4639,4645,4651,4657,4663,4669,4675,4681,4687,4693,4699,4705,4711,4717,4723,4729,4735,4741,4747,4753,4759,4764,4769,4775,4780,4785,4791,4797,4803,4809,4815,4820,4825],{"__ignoreMap":228},[551,4472,4473],{"class":553,"line":554},[551,4474,1123],{},[551,4476,4477],{"class":553,"line":229},[551,4478,1128],{},[551,4480,4481],{"class":553,"line":670},[551,4482,1133],{},[551,4484,4485],{"class":553,"line":1136},[551,4486,1139],{"emptyLinePlaceholder":238},[551,4488,4489],{"class":553,"line":1142},[551,4490,4058],{},[551,4492,4493],{"class":553,"line":1148},[551,4494,1151],{},[551,4496,4497],{"class":553,"line":1154},[551,4498,1157],{},[551,4500,4501],{"class":553,"line":1160},[551,4502,1163],{},[551,4504,4505],{"class":553,"line":1166},[551,4506,1169],{},[551,4508,4509],{"class":553,"line":1172},[551,4510,4511],{},"        \u002F\u002F ========================================\n",[551,4513,4514],{"class":553,"line":1178},[551,4515,4516],{},"        \u002F\u002F DATOS DEL CIRCUITO\n",[551,4518,4519],{"class":553,"line":1184},[551,4520,4511],{},[551,4522,4523],{"class":553,"line":1190},[551,4524,1139],{"emptyLinePlaceholder":238},[551,4526,4527],{"class":553,"line":1472},[551,4528,4529],{},"        double voltaje = 230.0;              \u002F\u002F Voltios\n",[551,4531,4532],{"class":553,"line":1477},[551,4533,4534],{},"        double corriente = 16.0;             \u002F\u002F Amperios\n",[551,4536,4537],{"class":553,"line":1797},[551,4538,4539],{},"        double factorPotencia = 0.85;        \u002F\u002F cos φ\n",[551,4541,4542],{"class":553,"line":1802},[551,4543,4544],{},"        string nombreCircuito = \"Circuito de Iluminación Planta 2\";\n",[551,4546,4547],{"class":553,"line":1808},[551,4548,4549],{},"        bool esTrifasico = false;\n",[551,4551,4552],{"class":553,"line":1814},[551,4553,1139],{"emptyLinePlaceholder":238},[551,4555,4556],{"class":553,"line":1820},[551,4557,4511],{},[551,4559,4560],{"class":553,"line":1826},[551,4561,4562],{},"        \u002F\u002F CÁLCULOS\n",[551,4564,4565],{"class":553,"line":1832},[551,4566,4511],{},[551,4568,4569],{"class":553,"line":1838},[551,4570,1139],{"emptyLinePlaceholder":238},[551,4572,4573],{"class":553,"line":1844},[551,4574,4575],{},"        \u002F\u002F Resistencia usando Ley de Ohm: R = V \u002F I\n",[551,4577,4578],{"class":553,"line":1850},[551,4579,4580],{},"        double resistencia = voltaje \u002F corriente;\n",[551,4582,4583],{"class":553,"line":1855},[551,4584,1139],{"emptyLinePlaceholder":238},[551,4586,4587],{"class":553,"line":1861},[551,4588,4589],{},"        \u002F\u002F Potencia aparente: S = V * I\n",[551,4591,4592],{"class":553,"line":1867},[551,4593,4594],{},"        double potenciaAparente = voltaje * corriente;\n",[551,4596,4597],{"class":553,"line":1873},[551,4598,1139],{"emptyLinePlaceholder":238},[551,4600,4601],{"class":553,"line":1878},[551,4602,4603],{},"        \u002F\u002F Potencia activa: P = V * I * cos φ\n",[551,4605,4606],{"class":553,"line":1883},[551,4607,4608],{},"        double potenciaActiva = voltaje * corriente * factorPotencia;\n",[551,4610,4611],{"class":553,"line":1888},[551,4612,1139],{"emptyLinePlaceholder":238},[551,4614,4616],{"class":553,"line":4615},33,[551,4617,4511],{},[551,4619,4621],{"class":553,"line":4620},34,[551,4622,4623],{},"        \u002F\u002F CONSTRUCCIÓN DEL MENSAJE\n",[551,4625,4627],{"class":553,"line":4626},35,[551,4628,4511],{},[551,4630,4632],{"class":553,"line":4631},36,[551,4633,1139],{"emptyLinePlaceholder":238},[551,4635,4637],{"class":553,"line":4636},37,[551,4638,1811],{},[551,4640,4642],{"class":553,"line":4641},38,[551,4643,4644],{},"            \"=== CALCULADORA DE CIRCUITOS ===\\n\\n\" +\n",[551,4646,4648],{"class":553,"line":4647},39,[551,4649,4650],{},"            \"Circuito: {0}\\n\" +\n",[551,4652,4654],{"class":553,"line":4653},40,[551,4655,4656],{},"            \"Tipo: {1}\\n\\n\" +\n",[551,4658,4660],{"class":553,"line":4659},41,[551,4661,4662],{},"            \"DATOS DE ENTRADA:\\n\" +\n",[551,4664,4666],{"class":553,"line":4665},42,[551,4667,4668],{},"            \"Voltaje: {2:F1} V\\n\" +\n",[551,4670,4672],{"class":553,"line":4671},43,[551,4673,4674],{},"            \"Corriente: {3:F1} A\\n\" +\n",[551,4676,4678],{"class":553,"line":4677},44,[551,4679,4680],{},"            \"Factor de potencia: {4:F2}\\n\\n\" +\n",[551,4682,4684],{"class":553,"line":4683},45,[551,4685,4686],{},"            \"RESULTADOS CALCULADOS:\\n\" +\n",[551,4688,4690],{"class":553,"line":4689},46,[551,4691,4692],{},"            \"Resistencia: {5:F2} Ω\\n\" +\n",[551,4694,4696],{"class":553,"line":4695},47,[551,4697,4698],{},"            \"Potencia aparente: {6:F2} VA\\n\" +\n",[551,4700,4702],{"class":553,"line":4701},48,[551,4703,4704],{},"            \"Potencia activa: {7:F2} W\",\n",[551,4706,4708],{"class":553,"line":4707},49,[551,4709,4710],{},"            nombreCircuito,\n",[551,4712,4714],{"class":553,"line":4713},50,[551,4715,4716],{},"            esTrifasico ? \"Trifásico\" : \"Monofásico\",\n",[551,4718,4720],{"class":553,"line":4719},51,[551,4721,4722],{},"            voltaje,\n",[551,4724,4726],{"class":553,"line":4725},52,[551,4727,4728],{},"            corriente,\n",[551,4730,4732],{"class":553,"line":4731},53,[551,4733,4734],{},"            factorPotencia,\n",[551,4736,4738],{"class":553,"line":4737},54,[551,4739,4740],{},"            resistencia,\n",[551,4742,4744],{"class":553,"line":4743},55,[551,4745,4746],{},"            potenciaAparente,\n",[551,4748,4750],{"class":553,"line":4749},56,[551,4751,4752],{},"            potenciaActiva\n",[551,4754,4756],{"class":553,"line":4755},57,[551,4757,4758],{},"        );\n",[551,4760,4762],{"class":553,"line":4761},58,[551,4763,1139],{"emptyLinePlaceholder":238},[551,4765,4767],{"class":553,"line":4766},59,[551,4768,4511],{},[551,4770,4772],{"class":553,"line":4771},60,[551,4773,4774],{},"        \u002F\u002F MOSTRAR RESULTADOS\n",[551,4776,4778],{"class":553,"line":4777},61,[551,4779,4511],{},[551,4781,4783],{"class":553,"line":4782},62,[551,4784,1139],{"emptyLinePlaceholder":238},[551,4786,4788],{"class":553,"line":4787},63,[551,4789,4790],{},"        MessageBox.Show(\n",[551,4792,4794],{"class":553,"line":4793},64,[551,4795,4796],{},"            mensaje,\n",[551,4798,4800],{"class":553,"line":4799},65,[551,4801,4802],{},"            \"Calculadora de Circuitos Eléctricos\",\n",[551,4804,4806],{"class":553,"line":4805},66,[551,4807,4808],{},"            MessageBoxButtons.OK,\n",[551,4810,4812],{"class":553,"line":4811},67,[551,4813,4814],{},"            MessageBoxIcon.Information\n",[551,4816,4818],{"class":553,"line":4817},68,[551,4819,4758],{},[551,4821,4823],{"class":553,"line":4822},69,[551,4824,1187],{},[551,4826,4828],{"class":553,"line":4827},70,[551,4829,1193],{},[13,4831,4832,4835,4836,4000,4839,4842,4843,4846],{},[16,4833,4834],{},"Ejercicio",": Cambia los valores de ",[54,4837,4838],{},"voltaje",[54,4840,4841],{},"corriente"," y ",[54,4844,4845],{},"factorPotencia"," para probar diferentes circuitos.",[43,4848],{},[46,4850,4852],{"id":4851},"deep-dive-entendiendo-en-profundidad","Deep Dive: Entendiendo en profundidad",[331,4854,4856],{"id":4855},"tipos-de-datos-numéricos-adicionales","Tipos de datos numéricos adicionales",[13,4858,4859],{},"C# tiene más tipos numéricos para casos específicos:",[13,4861,4862,416],{},[16,4863,4864],{},"Enteros de diferentes tamaños",[543,4866,4868],{"className":545,"code":4867,"language":547,"meta":228,"style":228},"byte numeroSmall = 255;          \u002F\u002F 0 a 255 (8 bits)\nshort numeroMedio = 32000;       \u002F\u002F -32,768 a 32,767 (16 bits)\nint numeroNormal = 2000000;      \u002F\u002F -2.1B a 2.1B (32 bits)\nlong numeroGrande = 9000000000L; \u002F\u002F -9.2E18 a 9.2E18 (64 bits)\n",[54,4869,4870,4875,4880,4885],{"__ignoreMap":228},[551,4871,4872],{"class":553,"line":554},[551,4873,4874],{},"byte numeroSmall = 255;          \u002F\u002F 0 a 255 (8 bits)\n",[551,4876,4877],{"class":553,"line":229},[551,4878,4879],{},"short numeroMedio = 32000;       \u002F\u002F -32,768 a 32,767 (16 bits)\n",[551,4881,4882],{"class":553,"line":670},[551,4883,4884],{},"int numeroNormal = 2000000;      \u002F\u002F -2.1B a 2.1B (32 bits)\n",[551,4886,4887],{"class":553,"line":1136},[551,4888,4889],{},"long numeroGrande = 9000000000L; \u002F\u002F -9.2E18 a 9.2E18 (64 bits)\n",[13,4891,4892,416],{},[16,4893,4894],{},"Decimales de diferentes precisiones",[543,4896,4898],{"className":545,"code":4897,"language":547,"meta":228,"style":228},"float precisionBaja = 123.45f;      \u002F\u002F ~7 dígitos de precisión\ndouble precisionMedia = 123.456789; \u002F\u002F ~15-17 dígitos\ndecimal precisionAlta = 123.456789012345m; \u002F\u002F ~28-29 dígitos\n",[54,4899,4900,4905,4910],{"__ignoreMap":228},[551,4901,4902],{"class":553,"line":554},[551,4903,4904],{},"float precisionBaja = 123.45f;      \u002F\u002F ~7 dígitos de precisión\n",[551,4906,4907],{"class":553,"line":229},[551,4908,4909],{},"double precisionMedia = 123.456789; \u002F\u002F ~15-17 dígitos\n",[551,4911,4912],{"class":553,"line":670},[551,4913,4914],{},"decimal precisionAlta = 123.456789012345m; \u002F\u002F ~28-29 dígitos\n",[13,4916,4917],{},[16,4918,4919],{},"¿Cuándo usar cada uno?",[126,4921,4922,4928,4933],{},[88,4923,4924,4927],{},[16,4925,4926],{},"int",": Para contar cosas (páginas, cables, bornes) - 99% de los casos",[88,4929,4930,4932],{},[16,4931,2795],{},": Para cálculos eléctricos (voltajes, corrientes, resistencias)",[88,4934,4935,4938],{},[16,4936,4937],{},"decimal",": Para cálculos financieros (precios, costos) donde necesitas precisión exacta",[331,4940,4942],{"id":4941},"el-problema-de-la-precisión-de-punto-flotante","El problema de la precisión de punto flotante",[13,4944,4945,4946,4842,4949,4951],{},"Los tipos ",[54,4947,4948],{},"float",[54,4950,2795],{}," tienen limitaciones de precisión:",[543,4953,4955],{"className":545,"code":4954,"language":547,"meta":228,"style":228},"double valor1 = 0.1;\ndouble valor2 = 0.2;\ndouble suma = valor1 + valor2;\n\n\u002F\u002F Esperarías: 0.3\n\u002F\u002F Obtienes: 0.30000000000000004\n",[54,4956,4957,4962,4967,4972,4976,4981],{"__ignoreMap":228},[551,4958,4959],{"class":553,"line":554},[551,4960,4961],{},"double valor1 = 0.1;\n",[551,4963,4964],{"class":553,"line":229},[551,4965,4966],{},"double valor2 = 0.2;\n",[551,4968,4969],{"class":553,"line":670},[551,4970,4971],{},"double suma = valor1 + valor2;\n",[551,4973,4974],{"class":553,"line":1136},[551,4975,1139],{"emptyLinePlaceholder":238},[551,4977,4978],{"class":553,"line":1142},[551,4979,4980],{},"\u002F\u002F Esperarías: 0.3\n",[551,4982,4983],{"class":553,"line":1148},[551,4984,4985],{},"\u002F\u002F Obtienes: 0.30000000000000004\n",[13,4987,4988,4991],{},[16,4989,4990],{},"Solución 1",": Redondear cuando sea necesario:",[543,4993,4995],{"className":545,"code":4994,"language":547,"meta":228,"style":228},"double resultado = Math.Round(suma, 2);  \u002F\u002F 0.3\n",[54,4996,4997],{"__ignoreMap":228},[551,4998,4999],{"class":553,"line":554},[551,5000,4994],{},[13,5002,5003,5006,5007,5009],{},[16,5004,5005],{},"Solución 2",": Usar ",[54,5008,4937],{}," para valores exactos:",[543,5011,5013],{"className":545,"code":5012,"language":547,"meta":228,"style":228},"decimal precio1 = 0.1m;\ndecimal precio2 = 0.2m;\ndecimal precioTotal = precio1 + precio2;  \u002F\u002F Exactamente 0.3\n",[54,5014,5015,5020,5025],{"__ignoreMap":228},[551,5016,5017],{"class":553,"line":554},[551,5018,5019],{},"decimal precio1 = 0.1m;\n",[551,5021,5022],{"class":553,"line":229},[551,5023,5024],{},"decimal precio2 = 0.2m;\n",[551,5026,5027],{"class":553,"line":670},[551,5028,5029],{},"decimal precioTotal = precio1 + precio2;  \u002F\u002F Exactamente 0.3\n",[331,5031,5033],{"id":5032},"valores-por-defecto","Valores por defecto",[13,5035,5036],{},"Si no inicializas una variable de clase, tiene un valor por defecto:",[543,5038,5040],{"className":545,"code":5039,"language":547,"meta":228,"style":228},"int numero;         \u002F\u002F 0\ndouble decimal;     \u002F\u002F 0.0\nbool estado;        \u002F\u002F false\nstring texto;       \u002F\u002F null\n",[54,5041,5042,5047,5052,5057],{"__ignoreMap":228},[551,5043,5044],{"class":553,"line":554},[551,5045,5046],{},"int numero;         \u002F\u002F 0\n",[551,5048,5049],{"class":553,"line":229},[551,5050,5051],{},"double decimal;     \u002F\u002F 0.0\n",[551,5053,5054],{"class":553,"line":670},[551,5055,5056],{},"bool estado;        \u002F\u002F false\n",[551,5058,5059],{"class":553,"line":1136},[551,5060,5061],{},"string texto;       \u002F\u002F null\n",[13,5063,5064,5065,41],{},"Pero en variables locales (dentro de métodos), ",[16,5066,5067],{},"debes inicializar antes de usar",[331,5069,5071],{"id":5070},"constantes","Constantes",[13,5073,5074,5075,416],{},"Para valores que nunca cambian, usa ",[54,5076,5077],{},"const",[543,5079,5081],{"className":545,"code":5080,"language":547,"meta":228,"style":228},"const double PI = 3.14159265359;\nconst int VOLTAJE_NOMINAL_EU = 230;\nconst double FRECUENCIA_RED = 50.0;  \u002F\u002F Hz en Europa\n\n\u002F\u002F Intentar cambiarlas da error:\nPI = 3.14;  \u002F\u002F ERROR: Cannot assign to a constant\n",[54,5082,5083,5088,5093,5098,5102,5107],{"__ignoreMap":228},[551,5084,5085],{"class":553,"line":554},[551,5086,5087],{},"const double PI = 3.14159265359;\n",[551,5089,5090],{"class":553,"line":229},[551,5091,5092],{},"const int VOLTAJE_NOMINAL_EU = 230;\n",[551,5094,5095],{"class":553,"line":670},[551,5096,5097],{},"const double FRECUENCIA_RED = 50.0;  \u002F\u002F Hz en Europa\n",[551,5099,5100],{"class":553,"line":1136},[551,5101,1139],{"emptyLinePlaceholder":238},[551,5103,5104],{"class":553,"line":1142},[551,5105,5106],{},"\u002F\u002F Intentar cambiarlas da error:\n",[551,5108,5109],{"class":553,"line":1148},[551,5110,5111],{},"PI = 3.14;  \u002F\u002F ERROR: Cannot assign to a constant\n",[13,5113,5114,5117],{},[16,5115,5116],{},"Convención",": constantes en MAYÚSCULAS con guiones bajos.",[331,5119,5121],{"id":5120},"mejores-prácticas","Mejores prácticas",[13,5123,5124],{},[16,5125,5126],{},"1. Inicializa siempre las variables",[543,5128,5130],{"className":545,"code":5129,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\nint contador;\ncontador++;  \u002F\u002F Puede dar error\n\n\u002F\u002F Bien\nint contador = 0;\ncontador++;\n",[54,5131,5132,5136,5141,5146,5150,5154,5159],{"__ignoreMap":228},[551,5133,5134],{"class":553,"line":554},[551,5135,2142],{},[551,5137,5138],{"class":553,"line":229},[551,5139,5140],{},"int contador;\n",[551,5142,5143],{"class":553,"line":670},[551,5144,5145],{},"contador++;  \u002F\u002F Puede dar error\n",[551,5147,5148],{"class":553,"line":1136},[551,5149,1139],{"emptyLinePlaceholder":238},[551,5151,5152],{"class":553,"line":1142},[551,5153,2156],{},[551,5155,5156],{"class":553,"line":1148},[551,5157,5158],{},"int contador = 0;\n",[551,5160,5161],{"class":553,"line":1154},[551,5162,5163],{},"contador++;\n",[13,5165,5166],{},[16,5167,5168],{},"2. Usa nombres descriptivos",[543,5170,5172],{"className":545,"code":5171,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\ndouble v = 230;\ndouble i = 16;\ndouble p = v * i;\n\n\u002F\u002F Bien\ndouble voltaje = 230.0;\ndouble corriente = 16.0;\ndouble potencia = voltaje * corriente;\n",[54,5173,5174,5178,5183,5188,5193,5197,5201,5205,5210],{"__ignoreMap":228},[551,5175,5176],{"class":553,"line":554},[551,5177,2142],{},[551,5179,5180],{"class":553,"line":229},[551,5181,5182],{},"double v = 230;\n",[551,5184,5185],{"class":553,"line":670},[551,5186,5187],{},"double i = 16;\n",[551,5189,5190],{"class":553,"line":1136},[551,5191,5192],{},"double p = v * i;\n",[551,5194,5195],{"class":553,"line":1142},[551,5196,1139],{"emptyLinePlaceholder":238},[551,5198,5199],{"class":553,"line":1148},[551,5200,2156],{},[551,5202,5203],{"class":553,"line":1154},[551,5204,2454],{},[551,5206,5207],{"class":553,"line":1160},[551,5208,5209],{},"double corriente = 16.0;\n",[551,5211,5212],{"class":553,"line":1166},[551,5213,5214],{},"double potencia = voltaje * corriente;\n",[13,5216,5217],{},[16,5218,5219],{},"3. Agrupa variables relacionadas",[543,5221,5223],{"className":545,"code":5222,"language":547,"meta":228,"style":228},"\u002F\u002F Bien organizado\n\u002F\u002F Datos del circuito\ndouble voltaje = 230.0;\ndouble corriente = 16.0;\ndouble factorPotencia = 0.85;\n\n\u002F\u002F Datos del cliente\nstring nombreCliente = \"Acme Corp\";\nstring proyecto = \"Planta Nueva\";\nint numeroPedido = 2025001;\n",[54,5224,5225,5230,5235,5239,5243,5248,5252,5257,5262,5267],{"__ignoreMap":228},[551,5226,5227],{"class":553,"line":554},[551,5228,5229],{},"\u002F\u002F Bien organizado\n",[551,5231,5232],{"class":553,"line":229},[551,5233,5234],{},"\u002F\u002F Datos del circuito\n",[551,5236,5237],{"class":553,"line":670},[551,5238,2454],{},[551,5240,5241],{"class":553,"line":1136},[551,5242,5209],{},[551,5244,5245],{"class":553,"line":1142},[551,5246,5247],{},"double factorPotencia = 0.85;\n",[551,5249,5250],{"class":553,"line":1148},[551,5251,1139],{"emptyLinePlaceholder":238},[551,5253,5254],{"class":553,"line":1154},[551,5255,5256],{},"\u002F\u002F Datos del cliente\n",[551,5258,5259],{"class":553,"line":1160},[551,5260,5261],{},"string nombreCliente = \"Acme Corp\";\n",[551,5263,5264],{"class":553,"line":1166},[551,5265,5266],{},"string proyecto = \"Planta Nueva\";\n",[551,5268,5269],{"class":553,"line":1172},[551,5270,5271],{},"int numeroPedido = 2025001;\n",[13,5273,5274],{},[16,5275,5276],{},"4. Usa el tipo más simple que funcione",[543,5278,5280],{"className":545,"code":5279,"language":547,"meta":228,"style":228},"\u002F\u002F Innecesariamente complejo\ndecimal cantidadCables = 47m;\n\n\u002F\u002F Mejor\nint cantidadCables = 47;\n",[54,5281,5282,5287,5292,5296,5301],{"__ignoreMap":228},[551,5283,5284],{"class":553,"line":554},[551,5285,5286],{},"\u002F\u002F Innecesariamente complejo\n",[551,5288,5289],{"class":553,"line":229},[551,5290,5291],{},"decimal cantidadCables = 47m;\n",[551,5293,5294],{"class":553,"line":670},[551,5295,1139],{"emptyLinePlaceholder":238},[551,5297,5298],{"class":553,"line":1136},[551,5299,5300],{},"\u002F\u002F Mejor\n",[551,5302,5303],{"class":553,"line":1142},[551,5304,5305],{},"int cantidadCables = 47;\n",[331,5307,5309],{"id":5308},"errores-comunes","Errores comunes",[367,5311,5313],{"id":5312},"error-1-dividir-enteros-esperando-decimal","Error 1: Dividir enteros esperando decimal",[13,5315,5316,5319],{},[16,5317,5318],{},"Síntoma",": El resultado de una división es 0 cuando esperabas un decimal.",[13,5321,5322,5324,5325,5327,5328,5330],{},[16,5323,1977],{},": Al dividir dos ",[54,5326,4926],{},", el resultado es ",[54,5329,4926],{}," (se trunca).",[543,5332,5334],{"className":545,"code":5333,"language":547,"meta":228,"style":228},"int totalCables = 10;\nint bandejas = 3;\nint cablesPorBandeja = totalCables \u002F bandejas;  \u002F\u002F 3, no 3.33!\n",[54,5335,5336,5341,5346],{"__ignoreMap":228},[551,5337,5338],{"class":553,"line":554},[551,5339,5340],{},"int totalCables = 10;\n",[551,5342,5343],{"class":553,"line":229},[551,5344,5345],{},"int bandejas = 3;\n",[551,5347,5348],{"class":553,"line":670},[551,5349,5350],{},"int cablesPorBandeja = totalCables \u002F bandejas;  \u002F\u002F 3, no 3.33!\n",[13,5352,5353,5355,5356,416],{},[16,5354,1983],{},": Convierte al menos uno a ",[54,5357,2795],{},[543,5359,5361],{"className":545,"code":5360,"language":547,"meta":228,"style":228},"double cablesPorBandeja = (double)totalCables \u002F bandejas;  \u002F\u002F 3.333...\n",[54,5362,5363],{"__ignoreMap":228},[551,5364,5365],{"class":553,"line":554},[551,5366,5360],{},[43,5368],{},[367,5370,5372],{"id":5371},"error-2-olvidar-el-sufijo-en-floatdecimal","Error 2: Olvidar el sufijo en float\u002Fdecimal",[13,5374,5375,5377],{},[16,5376,5318],{},": Error de compilación al asignar un literal.",[543,5379,5381],{"className":545,"code":5380,"language":547,"meta":228,"style":228},"float valor = 123.45;    \u002F\u002F ERROR: Cannot implicitly convert double to float\ndecimal precio = 99.99;  \u002F\u002F ERROR: Cannot implicitly convert double to decimal\n",[54,5382,5383,5388],{"__ignoreMap":228},[551,5384,5385],{"class":553,"line":554},[551,5386,5387],{},"float valor = 123.45;    \u002F\u002F ERROR: Cannot implicitly convert double to float\n",[551,5389,5390],{"class":553,"line":229},[551,5391,5392],{},"decimal precio = 99.99;  \u002F\u002F ERROR: Cannot implicitly convert double to decimal\n",[13,5394,5395,5397],{},[16,5396,1983],{},": Agrega el sufijo apropiado:",[543,5399,5401],{"className":545,"code":5400,"language":547,"meta":228,"style":228},"float valor = 123.45f;   \u002F\u002F 'f' para float\ndecimal precio = 99.99m; \u002F\u002F 'm' para decimal\n",[54,5402,5403,5408],{"__ignoreMap":228},[551,5404,5405],{"class":553,"line":554},[551,5406,5407],{},"float valor = 123.45f;   \u002F\u002F 'f' para float\n",[551,5409,5410],{"class":553,"line":229},[551,5411,5412],{},"decimal precio = 99.99m; \u002F\u002F 'm' para decimal\n",[43,5414],{},[367,5416,5418],{"id":5417},"error-3-usar-string-sin-comillas","Error 3: Usar string sin comillas",[13,5420,5421,5423],{},[16,5422,5318],{},": Error de compilación.",[543,5425,5427],{"className":545,"code":5426,"language":547,"meta":228,"style":228},"string nombre = Cliente;  \u002F\u002F ERROR: 'Cliente' does not exist\n",[54,5428,5429],{"__ignoreMap":228},[551,5430,5431],{"class":553,"line":554},[551,5432,5426],{},[13,5434,5435,5437],{},[16,5436,1983],{},": Texto siempre entre comillas:",[543,5439,5441],{"className":545,"code":5440,"language":547,"meta":228,"style":228},"string nombre = \"Cliente\";\n",[54,5442,5443],{"__ignoreMap":228},[551,5444,5445],{"class":553,"line":554},[551,5446,5440],{},[43,5448],{},[46,5450,5452],{"id":5451},"desafíos-opcional","Desafíos (Opcional)",[13,5454,5455],{},"Si quieres practicar más, intenta:",[331,5457,5459],{"id":5458},"desafío-1-calculadora-de-caída-de-tensión","Desafío 1: Calculadora de caída de tensión",[13,5461,5462,5465],{},[16,5463,5464],{},"Dificultad",": Bajo",[13,5467,5468],{},"Calcula la caída de tensión en un cable usando:",[126,5470,5471,5474,5477,5480,5483],{},[88,5472,5473],{},"Fórmula: ΔV = 2 × L × I × ρ \u002F S",[88,5475,5476],{},"L = longitud del cable (metros)",[88,5478,5479],{},"I = corriente (Amperios)",[88,5481,5482],{},"ρ = resistividad del cobre (0.018 Ω·mm²\u002Fm)",[88,5484,5485],{},"S = sección del cable (mm²)",[5487,5488,5489,5493],"details",{},[5490,5491,5492],"summary",{},"Pista",[13,5494,5495],{},"Declara variables para cada parámetro, luego aplica la fórmula directamente.",[5487,5497,5498,5500],{},[5490,5499,1983],{},[543,5501,5503],{"className":545,"code":5502,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class CaidaTension\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Datos del cable\n        double longitudMetros = 50.0;\n        double corrienteAmperios = 16.0;\n        double seccionMM2 = 2.5;\n        double resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n\n        \u002F\u002F Cálculo de caída de tensión\n        double caidaTension = 2 * longitudMetros * corrienteAmperios * resistividadCobre \u002F seccionMM2;\n\n        \u002F\u002F Resultado\n        string mensaje = string.Format(\n            \"CÁLCULO DE CAÍDA DE TENSIÓN\\n\\n\" +\n            \"Longitud: {0} m\\n\" +\n            \"Corriente: {1} A\\n\" +\n            \"Sección: {2} mm²\\n\\n\" +\n            \"Caída de tensión: {3:F2} V\",\n            longitudMetros,\n            corrienteAmperios,\n            seccionMM2,\n            caidaTension\n        );\n\n        MessageBox.Show(mensaje, \"Caída de Tensión\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n    }\n}\n",[54,5504,5505,5509,5513,5517,5521,5526,5530,5534,5538,5542,5547,5552,5557,5562,5567,5571,5576,5581,5585,5590,5594,5599,5604,5609,5614,5619,5624,5629,5634,5639,5643,5647,5652,5656],{"__ignoreMap":228},[551,5506,5507],{"class":553,"line":554},[551,5508,1123],{},[551,5510,5511],{"class":553,"line":229},[551,5512,1128],{},[551,5514,5515],{"class":553,"line":670},[551,5516,1133],{},[551,5518,5519],{"class":553,"line":1136},[551,5520,1139],{"emptyLinePlaceholder":238},[551,5522,5523],{"class":553,"line":1142},[551,5524,5525],{},"public class CaidaTension\n",[551,5527,5528],{"class":553,"line":1148},[551,5529,1151],{},[551,5531,5532],{"class":553,"line":1154},[551,5533,1157],{},[551,5535,5536],{"class":553,"line":1160},[551,5537,1163],{},[551,5539,5540],{"class":553,"line":1166},[551,5541,1169],{},[551,5543,5544],{"class":553,"line":1172},[551,5545,5546],{},"        \u002F\u002F Datos del cable\n",[551,5548,5549],{"class":553,"line":1178},[551,5550,5551],{},"        double longitudMetros = 50.0;\n",[551,5553,5554],{"class":553,"line":1184},[551,5555,5556],{},"        double corrienteAmperios = 16.0;\n",[551,5558,5559],{"class":553,"line":1190},[551,5560,5561],{},"        double seccionMM2 = 2.5;\n",[551,5563,5564],{"class":553,"line":1472},[551,5565,5566],{},"        double resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n",[551,5568,5569],{"class":553,"line":1477},[551,5570,1139],{"emptyLinePlaceholder":238},[551,5572,5573],{"class":553,"line":1797},[551,5574,5575],{},"        \u002F\u002F Cálculo de caída de tensión\n",[551,5577,5578],{"class":553,"line":1802},[551,5579,5580],{},"        double caidaTension = 2 * longitudMetros * corrienteAmperios * resistividadCobre \u002F seccionMM2;\n",[551,5582,5583],{"class":553,"line":1808},[551,5584,1139],{"emptyLinePlaceholder":238},[551,5586,5587],{"class":553,"line":1814},[551,5588,5589],{},"        \u002F\u002F Resultado\n",[551,5591,5592],{"class":553,"line":1820},[551,5593,1811],{},[551,5595,5596],{"class":553,"line":1826},[551,5597,5598],{},"            \"CÁLCULO DE CAÍDA DE TENSIÓN\\n\\n\" +\n",[551,5600,5601],{"class":553,"line":1832},[551,5602,5603],{},"            \"Longitud: {0} m\\n\" +\n",[551,5605,5606],{"class":553,"line":1838},[551,5607,5608],{},"            \"Corriente: {1} A\\n\" +\n",[551,5610,5611],{"class":553,"line":1844},[551,5612,5613],{},"            \"Sección: {2} mm²\\n\\n\" +\n",[551,5615,5616],{"class":553,"line":1850},[551,5617,5618],{},"            \"Caída de tensión: {3:F2} V\",\n",[551,5620,5621],{"class":553,"line":1855},[551,5622,5623],{},"            longitudMetros,\n",[551,5625,5626],{"class":553,"line":1861},[551,5627,5628],{},"            corrienteAmperios,\n",[551,5630,5631],{"class":553,"line":1867},[551,5632,5633],{},"            seccionMM2,\n",[551,5635,5636],{"class":553,"line":1873},[551,5637,5638],{},"            caidaTension\n",[551,5640,5641],{"class":553,"line":1878},[551,5642,4758],{},[551,5644,5645],{"class":553,"line":1883},[551,5646,1139],{"emptyLinePlaceholder":238},[551,5648,5649],{"class":553,"line":1888},[551,5650,5651],{},"        MessageBox.Show(mensaje, \"Caída de Tensión\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[551,5653,5654],{"class":553,"line":4615},[551,5655,1187],{},[551,5657,5658],{"class":553,"line":4620},[551,5659,1193],{},[43,5661],{},[331,5663,5665],{"id":5664},"desafío-2-convertidor-de-unidades-eléctricas","Desafío 2: Convertidor de unidades eléctricas",[13,5667,5668,5465],{},[16,5669,5464],{},[13,5671,5672],{},"Crea un script que convierta:",[126,5674,5675,5678,5681],{},[88,5676,5677],{},"kW a HP (caballos de fuerza)",[88,5679,5680],{},"HP a kW",[88,5682,5683],{},"mm² a AWG (aproximado)",[13,5685,5686],{},"Conversiones:",[126,5688,5689,5692],{},[88,5690,5691],{},"1 HP = 0.746 kW",[88,5693,5694],{},"1 kW = 1.341 HP",[5487,5696,5697,5699],{},[5490,5698,5492],{},[13,5700,5701],{},"Declara variables para cada valor de entrada, luego multiplica por los factores de conversión.",[43,5703],{},[13,5705,5706,416],{},[16,5707,5708],{},"Conceptos clave para recordar",[126,5710,5711,5714,5717,5720],{},[88,5712,5713],{},"Siempre inicializa tus variables",[88,5715,5716],{},"Usa el tipo apropiado para cada dato",[88,5718,5719],{},"Nombres descriptivos hacen el código más legible",[88,5721,5722],{},"La división de enteros trunca el resultado",[43,5724],{},[46,5726,5728],{"id":5727},"preguntas-frecuentes","Preguntas frecuentes",[331,5730,5732],{"id":5731},"p-por-qué-usar-double-en-vez-de-float-para-cálculos-eléctricos","P: ¿Por qué usar double en vez de float para cálculos eléctricos?",[13,5734,5735,73,5738,5740,5741,5743,5744,5746],{},[16,5736,5737],{},"R:",[54,5739,2795],{}," tiene el doble de precisión que ",[54,5742,4948],{}," (15-17 dígitos vs 7 dígitos). Para cálculos eléctricos donde la precisión importa, ",[54,5745,2795],{}," es la opción estándar. Además, es el tipo por defecto en C# para literales decimales.",[331,5748,5750],{"id":5749},"p-cuándo-debo-usar-decimal-en-vez-de-double","P: ¿Cuándo debo usar decimal en vez de double?",[13,5752,5753,5755,5756,5758,5759,5761],{},[16,5754,5737],{}," Usa ",[54,5757,4937],{}," para cálculos financieros (precios, costos, presupuestos) donde necesitas precisión exacta. Para cálculos de ingeniería (voltajes, corrientes, resistencias), ",[54,5760,2795],{}," es suficiente y más eficiente.",[331,5763,5765],{"id":5764},"p-puedo-cambiar-el-tipo-de-una-variable-después-de-declararla","P: ¿Puedo cambiar el tipo de una variable después de declararla?",[13,5767,5768,5770,5771,5774,5775,5777],{},[16,5769,5737],{}," No. C# es fuertemente tipado. Una vez que declaras ",[54,5772,5773],{},"int numero",", esa variable siempre será ",[54,5776,4926],{},". Si necesitas otro tipo, debes declarar una nueva variable.",[331,5779,5781],{"id":5780},"p-por-qué-mi-división-de-enteros-da-0","P: ¿Por qué mi división de enteros da 0?",[13,5783,5784,5786,5787,5327,5789,5791,5792,5794,5795,41],{},[16,5785,5737],{}," Porque al dividir dos ",[54,5788,4926],{},[54,5790,4926],{}," y se trunca. Solución: convierte al menos uno a ",[54,5793,2795],{}," antes de dividir: ",[54,5796,5797],{},"(double)dividendo \u002F divisor",[331,5799,5801],{"id":5800},"p-importa-si-uso-230-o-2300-para-un-double","P: ¿Importa si uso 230 o 230.0 para un double?",[13,5803,5804,5806,5807,5810,5811,5813],{},[16,5805,5737],{}," Funcionalmente no, pero ",[54,5808,5809],{},"230.0"," es más claro y explícito. Es una buena práctica usar ",[54,5812,2791],{}," para indicar que es un número decimal.",[43,5815],{},[13,5817,5818,658],{},[31,5819,657],{},[660,5821,662],{},{"title":228,"searchDepth":229,"depth":229,"links":5823},[5824,5825,5826,5827,5835,5844,5852,5856],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":5828},[5829,5830,5831,5832,5833,5834],{"id":2392,"depth":670,"text":2393},{"id":2469,"depth":670,"text":2470},{"id":2927,"depth":670,"text":2928},{"id":3112,"depth":670,"text":3113},{"id":3398,"depth":670,"text":3399},{"id":3722,"depth":670,"text":3723},{"id":4024,"depth":229,"text":4025,"children":5836},[5837,5838,5839,5840,5841,5842,5843],{"id":4031,"depth":670,"text":4032},{"id":4092,"depth":670,"text":4093},{"id":4159,"depth":670,"text":4160},{"id":4231,"depth":670,"text":4232},{"id":4271,"depth":670,"text":4272},{"id":4419,"depth":670,"text":4420},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":5845},[5846,5847,5848,5849,5850,5851],{"id":4855,"depth":670,"text":4856},{"id":4941,"depth":670,"text":4942},{"id":5032,"depth":670,"text":5033},{"id":5070,"depth":670,"text":5071},{"id":5120,"depth":670,"text":5121},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":5452,"children":5853},[5854,5855],{"id":5458,"depth":670,"text":5459},{"id":5664,"depth":670,"text":5665},{"id":5727,"depth":229,"text":5728,"children":5857},[5858,5859,5860,5861,5862],{"id":5731,"depth":670,"text":5732},{"id":5749,"depth":670,"text":5750},{"id":5764,"depth":670,"text":5765},{"id":5780,"depth":670,"text":5781},{"id":5800,"depth":670,"text":5801},"Aprende variables y tipos de datos en C# para EPLAN: la base para programar en C# y automatizar EPLAN Electric P8 paso a paso.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-03-variables-tipos-datos",{"title":2270,"description":5863},"guia\u002Ffundamentos\u002Fcap-03-variables-tipos-datos","j7VqE9dI9vCvYTqBE4QGg-nPTWxE4W3DZ8WPNPy3UNA",{"id":5870,"title":5871,"body":5872,"description":10733,"extension":236,"meta":10734,"navigation":238,"path":10735,"seo":10736,"stem":10737,"tagline":242,"__hash__":10738},"guia\u002Fguia\u002Ffundamentos\u002Fcap-04-operaciones-expresiones.md","Capítulo 4: Operaciones y expresiones en C#",{"type":7,"value":5873,"toc":10689},[5874,5884,5886,5888,5890,5938,5940,5942,5944,5958,5960,5962,5967,5970,5984,5989,5991,5993,5997,6000,6014,6021,6041,6043,6047,6062,6066,6077,6097,6102,6107,6161,6166,6204,6206,6210,6213,6237,6243,6272,6278,6324,6326,6330,6333,6372,6378,6426,6428,6432,6438,6486,6492,6530,6535,6575,6577,6581,6588,6728,6733,6767,6773,6819,6828,6871,6873,6877,6880,6884,6893,6913,6918,6967,6972,7001,7007,7045,7047,7051,7060,7079,7083,7130,7135,7177,7179,7183,7186,7200,7204,7231,7237,7269,7271,7275,7278,7325,7330,7345,7347,7351,7357,7361,7466,7470,7490,7505,7510,7540,7555,7559,7565,7594,7599,7645,7648,7659,7661,7665,7668,7672,7713,7717,7793,7797,7869,7873,7969,7971,7973,7979,7983,8137,8142,8144,8148,8243,8248,8250,8254,8340,8342,8346,8453,8458,8460,8464,8544,8546,8550,8636,8638,8642,8866,8871,8873,8875,9798,9800,9802,9806,9814,9819,9843,9861,9866,9889,9895,9951,9955,9958,9997,10002,10006,10012,10036,10039,10084,10088,10093,10146,10151,10207,10212,10247,10249,10253,10258,10290,10294,10317,10319,10323,10328,10342,10347,10355,10357,10361,10364,10384,10388,10397,10399,10401,10405,10410,10413,10424,10427,10437,10439,10443,10448,10451,10462,10465,10473,10488,10490,10494,10498,10501,10504,10515,10518,10520,10524,10535,10537,10539,10543,10560,10564,10569,10573,10585,10589,10597,10601,10610,10612,10616,10619,10670,10672,10687],[10,5875,5876],{},[13,5877,5878,19,5880,19,5882,262],{},[16,5879,256],{},[16,5881,2281],{},[16,5883,25],{},[43,5885],{},[46,5887,268],{"id":267},[13,5889,702],{},[126,5891,5893,5902,5911,5920,5929],{"className":5892},[275],[88,5894,5896,73,5898,5901],{"className":5895},[279],[281,5897],{"disabled":238,"type":283},[16,5899,5900],{},"Usar operadores aritméticos"," avanzados para cálculos complejos",[88,5903,5905,73,5907,5910],{"className":5904},[279],[281,5906],{"disabled":238,"type":283},[16,5908,5909],{},"Aplicar operadores de comparación"," para evaluar condiciones",[88,5912,5914,73,5916,5919],{"className":5913},[279],[281,5915],{"disabled":238,"type":283},[16,5917,5918],{},"Combinar operadores lógicos"," para expresiones complejas",[88,5921,5923,73,5925,5928],{"className":5922},[279],[281,5924],{"disabled":238,"type":283},[16,5926,5927],{},"Entender la precedencia"," de operadores en expresiones",[88,5930,5932,73,5934,5937],{"className":5931},[279],[281,5933],{"disabled":238,"type":283},[16,5935,5936],{},"Construir expresiones"," matemáticas complejas para ingeniería eléctrica",[43,5939],{},[46,5941,320],{"id":319},[13,5943,726],{},[126,5945,5946,5949,5952,5955],{},[88,5947,5948],{},"Haber completado el Capítulo 3",[88,5950,5951],{},"Entender qué son las variables",[88,5953,5954],{},"Conocer los tipos básicos (int, double, string, bool)",[88,5956,5957],{},"Saber declarar y asignar valores a variables",[43,5959],{},[46,5961,740],{"id":739},[13,5963,5964],{},[16,5965,5966],{},"Sistema de Verificación de Instalación Eléctrica",[13,5968,5969],{},"Al final de este capítulo habrás construido un script que:",[126,5971,5972,5975,5978,5981],{},[88,5973,5974],{},"Verifica si un circuito cumple con normas técnicas",[88,5976,5977],{},"Compara valores medidos con límites permitidos",[88,5979,5980],{},"Calcula caídas de tensión y las valida",[88,5982,5983],{},"Genera reportes de conformidad con múltiples condiciones",[13,5985,5986,5988],{},[16,5987,753],{},": 40-50 minutos",[43,5990],{},[46,5992,329],{"id":328},[331,5994,5996],{"id":5995},"_1-introducción-de-cálculos-simples-a-expresiones-complejas","1. Introducción: De cálculos simples a expresiones complejas",[13,5998,5999],{},"En el capítulo anterior vimos operaciones básicas:",[543,6001,6003],{"className":545,"code":6002,"language":547,"meta":228,"style":228},"double resistencia = voltaje \u002F corriente;\ndouble potencia = voltaje * corriente;\n",[54,6004,6005,6010],{"__ignoreMap":228},[551,6006,6007],{"class":553,"line":554},[551,6008,6009],{},"double resistencia = voltaje \u002F corriente;\n",[551,6011,6012],{"class":553,"line":229},[551,6013,5214],{},[13,6015,6016,6017,6020],{},"En este capítulo aprenderás a construir ",[16,6018,6019],{},"expresiones más complejas"," que combinan múltiples operaciones y condiciones, como las que usas en ingeniería:",[126,6022,6023,6029,6035],{},[88,6024,6025,6028],{},[16,6026,6027],{},"Verificar rangos",": ¿El voltaje está entre 207V y 253V? (230V ±10%)",[88,6030,6031,6034],{},[16,6032,6033],{},"Validar condiciones",": ¿La caída de tensión es menor al 3% Y la corriente no excede el límite?",[88,6036,6037,6040],{},[16,6038,6039],{},"Cálculos complejos",": Potencia trifásica, factor de corrección, dimensionado de cables",[43,6042],{},[331,6044,6046],{"id":6045},"_2-operadores-aritméticos-avanzados","2. Operadores aritméticos avanzados",[13,6048,6049,6050,4000,6052,4000,6055,4000,6058,6061],{},"Ya conoces los básicos: ",[54,6051,3865],{},[54,6053,6054],{},"-",[54,6056,6057],{},"*",[54,6059,6060],{},"\u002F",". Veamos operadores adicionales y técnicas útiles.",[367,6063,6065],{"id":6064},"_21-módulo-resto-de-división","2.1 Módulo (%) - Resto de división",[13,6067,6068,6069,6072,6073,6076],{},"El operador módulo ",[54,6070,6071],{},"%"," devuelve el ",[16,6074,6075],{},"resto"," de una división entera.",[543,6078,6080],{"className":545,"code":6079,"language":547,"meta":228,"style":228},"int total = 17;\nint grupo = 5;\nint resto = total % grupo;  \u002F\u002F 2 (17 ÷ 5 = 3 con resto 2)\n",[54,6081,6082,6087,6092],{"__ignoreMap":228},[551,6083,6084],{"class":553,"line":554},[551,6085,6086],{},"int total = 17;\n",[551,6088,6089],{"class":553,"line":229},[551,6090,6091],{},"int grupo = 5;\n",[551,6093,6094],{"class":553,"line":670},[551,6095,6096],{},"int resto = total % grupo;  \u002F\u002F 2 (17 ÷ 5 = 3 con resto 2)\n",[13,6098,6099,416],{},[16,6100,6101],{},"Casos prácticos",[13,6103,6104],{},[16,6105,6106],{},"Ejemplo 1: Detectar si un número es par o impar",[543,6108,6110],{"className":545,"code":6109,"language":547,"meta":228,"style":228},"int numeroCable = 24;\nint resto = numeroCable % 2;\n\nif (resto == 0)\n{\n    \u002F\u002F Es par\n}\nelse\n{\n    \u002F\u002F Es impar\n}\n",[54,6111,6112,6117,6122,6126,6131,6135,6140,6144,6148,6152,6157],{"__ignoreMap":228},[551,6113,6114],{"class":553,"line":554},[551,6115,6116],{},"int numeroCable = 24;\n",[551,6118,6119],{"class":553,"line":229},[551,6120,6121],{},"int resto = numeroCable % 2;\n",[551,6123,6124],{"class":553,"line":670},[551,6125,1139],{"emptyLinePlaceholder":238},[551,6127,6128],{"class":553,"line":1136},[551,6129,6130],{},"if (resto == 0)\n",[551,6132,6133],{"class":553,"line":1142},[551,6134,1151],{},[551,6136,6137],{"class":553,"line":1148},[551,6138,6139],{},"    \u002F\u002F Es par\n",[551,6141,6142],{"class":553,"line":1154},[551,6143,1193],{},[551,6145,6146],{"class":553,"line":1160},[551,6147,3704],{},[551,6149,6150],{"class":553,"line":1166},[551,6151,1151],{},[551,6153,6154],{"class":553,"line":1172},[551,6155,6156],{},"    \u002F\u002F Es impar\n",[551,6158,6159],{"class":553,"line":1178},[551,6160,1193],{},[13,6162,6163],{},[16,6164,6165],{},"Ejemplo 2: Distribuir cables en bandejas",[543,6167,6169],{"className":545,"code":6168,"language":547,"meta":228,"style":228},"int totalCables = 47;\nint capacidadBandeja = 12;\n\nint bandejasCompletas = totalCables \u002F capacidadBandeja;  \u002F\u002F 3\nint cablesEnUltimaBandeja = totalCables % capacidadBandeja;  \u002F\u002F 11\n\n\u002F\u002F Necesitas 4 bandejas (3 completas + 1 parcial)\n",[54,6170,6171,6176,6181,6185,6190,6195,6199],{"__ignoreMap":228},[551,6172,6173],{"class":553,"line":554},[551,6174,6175],{},"int totalCables = 47;\n",[551,6177,6178],{"class":553,"line":229},[551,6179,6180],{},"int capacidadBandeja = 12;\n",[551,6182,6183],{"class":553,"line":670},[551,6184,1139],{"emptyLinePlaceholder":238},[551,6186,6187],{"class":553,"line":1136},[551,6188,6189],{},"int bandejasCompletas = totalCables \u002F capacidadBandeja;  \u002F\u002F 3\n",[551,6191,6192],{"class":553,"line":1142},[551,6193,6194],{},"int cablesEnUltimaBandeja = totalCables % capacidadBandeja;  \u002F\u002F 11\n",[551,6196,6197],{"class":553,"line":1148},[551,6198,1139],{"emptyLinePlaceholder":238},[551,6200,6201],{"class":553,"line":1154},[551,6202,6203],{},"\u002F\u002F Necesitas 4 bandejas (3 completas + 1 parcial)\n",[43,6205],{},[367,6207,6209],{"id":6208},"_22-operadores-de-incremento-y-decremento","2.2 Operadores de incremento y decremento",[13,6211,6212],{},"Para aumentar o disminuir una variable en 1:",[543,6214,6216],{"className":545,"code":6215,"language":547,"meta":228,"style":228},"int contador = 10;\n\ncontador++;  \u002F\u002F contador = contador + 1  →  11\ncontador--;  \u002F\u002F contador = contador - 1  →  10\n",[54,6217,6218,6223,6227,6232],{"__ignoreMap":228},[551,6219,6220],{"class":553,"line":554},[551,6221,6222],{},"int contador = 10;\n",[551,6224,6225],{"class":553,"line":229},[551,6226,1139],{"emptyLinePlaceholder":238},[551,6228,6229],{"class":553,"line":670},[551,6230,6231],{},"contador++;  \u002F\u002F contador = contador + 1  →  11\n",[551,6233,6234],{"class":553,"line":1136},[551,6235,6236],{},"contador--;  \u002F\u002F contador = contador - 1  →  10\n",[13,6238,6239,6242],{},[16,6240,6241],{},"Dos formas",": prefijo y postfijo",[543,6244,6246],{"className":545,"code":6245,"language":547,"meta":228,"style":228},"int a = 5;\nint b = ++a;  \u002F\u002F Primero incrementa, luego asigna: a=6, b=6\n\nint c = 5;\nint d = c++;  \u002F\u002F Primero asigna, luego incrementa: c=6, d=5\n",[54,6247,6248,6253,6258,6262,6267],{"__ignoreMap":228},[551,6249,6250],{"class":553,"line":554},[551,6251,6252],{},"int a = 5;\n",[551,6254,6255],{"class":553,"line":229},[551,6256,6257],{},"int b = ++a;  \u002F\u002F Primero incrementa, luego asigna: a=6, b=6\n",[551,6259,6260],{"class":553,"line":670},[551,6261,1139],{"emptyLinePlaceholder":238},[551,6263,6264],{"class":553,"line":1136},[551,6265,6266],{},"int c = 5;\n",[551,6268,6269],{"class":553,"line":1142},[551,6270,6271],{},"int d = c++;  \u002F\u002F Primero asigna, luego incrementa: c=6, d=5\n",[13,6273,6274,6277],{},[16,6275,6276],{},"En la práctica",", úsalos en líneas separadas para claridad:",[543,6279,6281],{"className":545,"code":6280,"language":547,"meta":228,"style":228},"int erroresEncontrados = 0;\n\n\u002F\u002F Encontraste un error\nerroresEncontrados++;\n\n\u002F\u002F Encontraste otro\nerroresEncontrados++;\n\n\u002F\u002F erroresEncontrados ahora es 2\n",[54,6282,6283,6288,6292,6297,6302,6306,6311,6315,6319],{"__ignoreMap":228},[551,6284,6285],{"class":553,"line":554},[551,6286,6287],{},"int erroresEncontrados = 0;\n",[551,6289,6290],{"class":553,"line":229},[551,6291,1139],{"emptyLinePlaceholder":238},[551,6293,6294],{"class":553,"line":670},[551,6295,6296],{},"\u002F\u002F Encontraste un error\n",[551,6298,6299],{"class":553,"line":1136},[551,6300,6301],{},"erroresEncontrados++;\n",[551,6303,6304],{"class":553,"line":1142},[551,6305,1139],{"emptyLinePlaceholder":238},[551,6307,6308],{"class":553,"line":1148},[551,6309,6310],{},"\u002F\u002F Encontraste otro\n",[551,6312,6313],{"class":553,"line":1154},[551,6314,6301],{},[551,6316,6317],{"class":553,"line":1160},[551,6318,1139],{"emptyLinePlaceholder":238},[551,6320,6321],{"class":553,"line":1166},[551,6322,6323],{},"\u002F\u002F erroresEncontrados ahora es 2\n",[43,6325],{},[367,6327,6329],{"id":6328},"_23-operadores-de-asignación-compuesta","2.3 Operadores de asignación compuesta",[13,6331,6332],{},"Atajos para operaciones frecuentes:",[543,6334,6336],{"className":545,"code":6335,"language":547,"meta":228,"style":228},"int cantidad = 10;\n\ncantidad += 5;   \u002F\u002F cantidad = cantidad + 5  →  15\ncantidad -= 3;   \u002F\u002F cantidad = cantidad - 3  →  12\ncantidad *= 2;   \u002F\u002F cantidad = cantidad * 2  →  24\ncantidad \u002F= 4;   \u002F\u002F cantidad = cantidad \u002F 4  →  6\ncantidad %= 5;   \u002F\u002F cantidad = cantidad % 5  →  1\n",[54,6337,6338,6343,6347,6352,6357,6362,6367],{"__ignoreMap":228},[551,6339,6340],{"class":553,"line":554},[551,6341,6342],{},"int cantidad = 10;\n",[551,6344,6345],{"class":553,"line":229},[551,6346,1139],{"emptyLinePlaceholder":238},[551,6348,6349],{"class":553,"line":670},[551,6350,6351],{},"cantidad += 5;   \u002F\u002F cantidad = cantidad + 5  →  15\n",[551,6353,6354],{"class":553,"line":1136},[551,6355,6356],{},"cantidad -= 3;   \u002F\u002F cantidad = cantidad - 3  →  12\n",[551,6358,6359],{"class":553,"line":1142},[551,6360,6361],{},"cantidad *= 2;   \u002F\u002F cantidad = cantidad * 2  →  24\n",[551,6363,6364],{"class":553,"line":1148},[551,6365,6366],{},"cantidad \u002F= 4;   \u002F\u002F cantidad = cantidad \u002F 4  →  6\n",[551,6368,6369],{"class":553,"line":1154},[551,6370,6371],{},"cantidad %= 5;   \u002F\u002F cantidad = cantidad % 5  →  1\n",[13,6373,6374,6377],{},[16,6375,6376],{},"Ejemplo práctico",": Acumular valores",[543,6379,6381],{"className":545,"code":6380,"language":547,"meta":228,"style":228},"double potenciaTotal = 0.0;\n\ndouble motor1 = 7.5;   \u002F\u002F kW\ndouble motor2 = 11.0;  \u002F\u002F kW\ndouble motor3 = 5.5;   \u002F\u002F kW\n\npotenciaTotal += motor1;  \u002F\u002F 7.5\npotenciaTotal += motor2;  \u002F\u002F 18.5\npotenciaTotal += motor3;  \u002F\u002F 24.0 kW\n",[54,6382,6383,6388,6392,6397,6402,6407,6411,6416,6421],{"__ignoreMap":228},[551,6384,6385],{"class":553,"line":554},[551,6386,6387],{},"double potenciaTotal = 0.0;\n",[551,6389,6390],{"class":553,"line":229},[551,6391,1139],{"emptyLinePlaceholder":238},[551,6393,6394],{"class":553,"line":670},[551,6395,6396],{},"double motor1 = 7.5;   \u002F\u002F kW\n",[551,6398,6399],{"class":553,"line":1136},[551,6400,6401],{},"double motor2 = 11.0;  \u002F\u002F kW\n",[551,6403,6404],{"class":553,"line":1142},[551,6405,6406],{},"double motor3 = 5.5;   \u002F\u002F kW\n",[551,6408,6409],{"class":553,"line":1148},[551,6410,1139],{"emptyLinePlaceholder":238},[551,6412,6413],{"class":553,"line":1154},[551,6414,6415],{},"potenciaTotal += motor1;  \u002F\u002F 7.5\n",[551,6417,6418],{"class":553,"line":1160},[551,6419,6420],{},"potenciaTotal += motor2;  \u002F\u002F 18.5\n",[551,6422,6423],{"class":553,"line":1166},[551,6424,6425],{},"potenciaTotal += motor3;  \u002F\u002F 24.0 kW\n",[43,6427],{},[367,6429,6431],{"id":6430},"_24-potencias-y-raíces-math","2.4 Potencias y raíces (Math)",[13,6433,6434,6435,416],{},"Para operaciones matemáticas avanzadas, usa la clase ",[54,6436,6437],{},"Math",[543,6439,6441],{"className":545,"code":6440,"language":547,"meta":228,"style":228},"\u002F\u002F Potencia: Math.Pow(base, exponente)\ndouble area = Math.Pow(5, 2);  \u002F\u002F 5² = 25\n\n\u002F\u002F Raíz cuadrada\ndouble lado = Math.Sqrt(25);  \u002F\u002F √25 = 5\n\n\u002F\u002F Raíz cúbica (elevar a 1\u002F3)\ndouble volumen = 27;\ndouble arista = Math.Pow(volumen, 1.0\u002F3.0);  \u002F\u002F ∛27 = 3\n",[54,6442,6443,6448,6453,6457,6462,6467,6471,6476,6481],{"__ignoreMap":228},[551,6444,6445],{"class":553,"line":554},[551,6446,6447],{},"\u002F\u002F Potencia: Math.Pow(base, exponente)\n",[551,6449,6450],{"class":553,"line":229},[551,6451,6452],{},"double area = Math.Pow(5, 2);  \u002F\u002F 5² = 25\n",[551,6454,6455],{"class":553,"line":670},[551,6456,1139],{"emptyLinePlaceholder":238},[551,6458,6459],{"class":553,"line":1136},[551,6460,6461],{},"\u002F\u002F Raíz cuadrada\n",[551,6463,6464],{"class":553,"line":1142},[551,6465,6466],{},"double lado = Math.Sqrt(25);  \u002F\u002F √25 = 5\n",[551,6468,6469],{"class":553,"line":1148},[551,6470,1139],{"emptyLinePlaceholder":238},[551,6472,6473],{"class":553,"line":1154},[551,6474,6475],{},"\u002F\u002F Raíz cúbica (elevar a 1\u002F3)\n",[551,6477,6478],{"class":553,"line":1160},[551,6479,6480],{},"double volumen = 27;\n",[551,6482,6483],{"class":553,"line":1166},[551,6484,6485],{},"double arista = Math.Pow(volumen, 1.0\u002F3.0);  \u002F\u002F ∛27 = 3\n",[13,6487,6488,6491],{},[16,6489,6490],{},"Caso práctico",": Cálculo de potencia trifásica",[543,6493,6495],{"className":545,"code":6494,"language":547,"meta":228,"style":228},"double voltaje = 400.0;        \u002F\u002F V línea-línea\ndouble corriente = 50.0;       \u002F\u002F A\ndouble factorPotencia = 0.85;\n\n\u002F\u002F P = √3 × V × I × cos φ\ndouble potencia = Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n\u002F\u002F 29,527 W ≈ 29.5 kW\n",[54,6496,6497,6502,6507,6511,6515,6520,6525],{"__ignoreMap":228},[551,6498,6499],{"class":553,"line":554},[551,6500,6501],{},"double voltaje = 400.0;        \u002F\u002F V línea-línea\n",[551,6503,6504],{"class":553,"line":229},[551,6505,6506],{},"double corriente = 50.0;       \u002F\u002F A\n",[551,6508,6509],{"class":553,"line":670},[551,6510,5247],{},[551,6512,6513],{"class":553,"line":1136},[551,6514,1139],{"emptyLinePlaceholder":238},[551,6516,6517],{"class":553,"line":1142},[551,6518,6519],{},"\u002F\u002F P = √3 × V × I × cos φ\n",[551,6521,6522],{"class":553,"line":1148},[551,6523,6524],{},"double potencia = Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n",[551,6526,6527],{"class":553,"line":1154},[551,6528,6529],{},"\u002F\u002F 29,527 W ≈ 29.5 kW\n",[13,6531,6532,416],{},[16,6533,6534],{},"Otras funciones útiles",[543,6536,6538],{"className":545,"code":6537,"language":547,"meta":228,"style":228},"Math.Abs(-15.5);      \u002F\u002F Valor absoluto: 15.5\nMath.Round(15.678);   \u002F\u002F Redondeo: 16\nMath.Round(15.678, 2); \u002F\u002F Redondeo 2 decimales: 15.68\nMath.Ceiling(15.1);   \u002F\u002F Redondeo hacia arriba: 16\nMath.Floor(15.9);     \u002F\u002F Redondeo hacia abajo: 15\nMath.Max(10, 20);     \u002F\u002F Máximo: 20\nMath.Min(10, 20);     \u002F\u002F Mínimo: 10\n",[54,6539,6540,6545,6550,6555,6560,6565,6570],{"__ignoreMap":228},[551,6541,6542],{"class":553,"line":554},[551,6543,6544],{},"Math.Abs(-15.5);      \u002F\u002F Valor absoluto: 15.5\n",[551,6546,6547],{"class":553,"line":229},[551,6548,6549],{},"Math.Round(15.678);   \u002F\u002F Redondeo: 16\n",[551,6551,6552],{"class":553,"line":670},[551,6553,6554],{},"Math.Round(15.678, 2); \u002F\u002F Redondeo 2 decimales: 15.68\n",[551,6556,6557],{"class":553,"line":1136},[551,6558,6559],{},"Math.Ceiling(15.1);   \u002F\u002F Redondeo hacia arriba: 16\n",[551,6561,6562],{"class":553,"line":1142},[551,6563,6564],{},"Math.Floor(15.9);     \u002F\u002F Redondeo hacia abajo: 15\n",[551,6566,6567],{"class":553,"line":1148},[551,6568,6569],{},"Math.Max(10, 20);     \u002F\u002F Máximo: 20\n",[551,6571,6572],{"class":553,"line":1154},[551,6573,6574],{},"Math.Min(10, 20);     \u002F\u002F Mínimo: 10\n",[43,6576],{},[331,6578,6580],{"id":6579},"_3-operadores-de-comparación","3. Operadores de comparación",[13,6582,6583,6584,6587],{},"Comparan dos valores y devuelven un ",[54,6585,6586],{},"bool"," (true o false).",[6589,6590,6591,6610],"table",{},[6592,6593,6594],"thead",{},[6595,6596,6597,6601,6604,6607],"tr",{},[6598,6599,6600],"th",{},"Operador",[6598,6602,6603],{},"Significado",[6598,6605,6606],{},"Ejemplo",[6598,6608,6609],{},"Resultado",[6611,6612,6613,6633,6652,6671,6690,6709],"tbody",{},[6595,6614,6615,6621,6624,6629],{},[6616,6617,6618],"td",{},[54,6619,6620],{},"==",[6616,6622,6623],{},"Igual a",[6616,6625,6626],{},[54,6627,6628],{},"5 == 5",[6616,6630,6631],{},[54,6632,2853],{},[6595,6634,6635,6640,6643,6648],{},[6616,6636,6637],{},[54,6638,6639],{},"!=",[6616,6641,6642],{},"Diferente de",[6616,6644,6645],{},[54,6646,6647],{},"5 != 3",[6616,6649,6650],{},[54,6651,2853],{},[6595,6653,6654,6659,6662,6667],{},[6616,6655,6656],{},[54,6657,6658],{},">",[6616,6660,6661],{},"Mayor que",[6616,6663,6664],{},[54,6665,6666],{},"10 > 5",[6616,6668,6669],{},[54,6670,2853],{},[6595,6672,6673,6678,6681,6686],{},[6616,6674,6675],{},[54,6676,6677],{},"\u003C",[6616,6679,6680],{},"Menor que",[6616,6682,6683],{},[54,6684,6685],{},"10 \u003C 5",[6616,6687,6688],{},[54,6689,2857],{},[6595,6691,6692,6697,6700,6705],{},[6616,6693,6694],{},[54,6695,6696],{},">=",[6616,6698,6699],{},"Mayor o igual",[6616,6701,6702],{},[54,6703,6704],{},"10 >= 10",[6616,6706,6707],{},[54,6708,2853],{},[6595,6710,6711,6716,6719,6724],{},[6616,6712,6713],{},[54,6714,6715],{},"\u003C=",[6616,6717,6718],{},"Menor o igual",[6616,6720,6721],{},[54,6722,6723],{},"10 \u003C= 5",[6616,6725,6726],{},[54,6727,2857],{},[13,6729,6730,416],{},[16,6731,6732],{},"Ejemplos prácticos",[543,6734,6736],{"className":545,"code":6735,"language":547,"meta":228,"style":228},"double voltajeMedido = 235.5;\ndouble voltajeNominal = 230.0;\n\nbool voltajeMayor = voltajeMedido > voltajeNominal;  \u002F\u002F true\nbool voltajeIgual = voltajeMedido == voltajeNominal; \u002F\u002F false\nbool volajeDiferente = voltajeMedido != voltajeNominal; \u002F\u002F true\n",[54,6737,6738,6743,6748,6752,6757,6762],{"__ignoreMap":228},[551,6739,6740],{"class":553,"line":554},[551,6741,6742],{},"double voltajeMedido = 235.5;\n",[551,6744,6745],{"class":553,"line":229},[551,6746,6747],{},"double voltajeNominal = 230.0;\n",[551,6749,6750],{"class":553,"line":670},[551,6751,1139],{"emptyLinePlaceholder":238},[551,6753,6754],{"class":553,"line":1136},[551,6755,6756],{},"bool voltajeMayor = voltajeMedido > voltajeNominal;  \u002F\u002F true\n",[551,6758,6759],{"class":553,"line":1142},[551,6760,6761],{},"bool voltajeIgual = voltajeMedido == voltajeNominal; \u002F\u002F false\n",[551,6763,6764],{"class":553,"line":1148},[551,6765,6766],{},"bool volajeDiferente = voltajeMedido != voltajeNominal; \u002F\u002F true\n",[13,6768,6769,6772],{},[16,6770,6771],{},"Uso típico",": Verificar límites",[543,6774,6776],{"className":545,"code":6775,"language":547,"meta":228,"style":228},"double corriente = 18.5;\ndouble corrienteMaxima = 16.0;\n\nbool excedeLimite = corriente > corrienteMaxima;  \u002F\u002F true\n\nif (excedeLimite)\n{\n    MessageBox.Show(\"¡ADVERTENCIA! Corriente excede el límite.\");\n}\n",[54,6777,6778,6783,6788,6792,6797,6801,6806,6810,6815],{"__ignoreMap":228},[551,6779,6780],{"class":553,"line":554},[551,6781,6782],{},"double corriente = 18.5;\n",[551,6784,6785],{"class":553,"line":229},[551,6786,6787],{},"double corrienteMaxima = 16.0;\n",[551,6789,6790],{"class":553,"line":670},[551,6791,1139],{"emptyLinePlaceholder":238},[551,6793,6794],{"class":553,"line":1136},[551,6795,6796],{},"bool excedeLimite = corriente > corrienteMaxima;  \u002F\u002F true\n",[551,6798,6799],{"class":553,"line":1142},[551,6800,1139],{"emptyLinePlaceholder":238},[551,6802,6803],{"class":553,"line":1148},[551,6804,6805],{},"if (excedeLimite)\n",[551,6807,6808],{"class":553,"line":1154},[551,6809,1151],{},[551,6811,6812],{"class":553,"line":1160},[551,6813,6814],{},"    MessageBox.Show(\"¡ADVERTENCIA! Corriente excede el límite.\");\n",[551,6816,6817],{"class":553,"line":1166},[551,6818,1193],{},[13,6820,6821,6824,6825,6827],{},[16,6822,6823],{},"Importante con double",": No uses ",[54,6826,6620],{}," para comparar decimales",[543,6829,6831],{"className":545,"code":6830,"language":547,"meta":228,"style":228},"double a = 0.1 + 0.2;  \u002F\u002F 0.30000000000000004\ndouble b = 0.3;\n\nbool sonIguales = (a == b);  \u002F\u002F Puede ser false debido a precisión\n\n\u002F\u002F Mejor: compara con tolerancia\ndouble tolerancia = 0.0001;\nbool sonIgualesAprox = Math.Abs(a - b) \u003C tolerancia;  \u002F\u002F true\n",[54,6832,6833,6838,6843,6847,6852,6856,6861,6866],{"__ignoreMap":228},[551,6834,6835],{"class":553,"line":554},[551,6836,6837],{},"double a = 0.1 + 0.2;  \u002F\u002F 0.30000000000000004\n",[551,6839,6840],{"class":553,"line":229},[551,6841,6842],{},"double b = 0.3;\n",[551,6844,6845],{"class":553,"line":670},[551,6846,1139],{"emptyLinePlaceholder":238},[551,6848,6849],{"class":553,"line":1136},[551,6850,6851],{},"bool sonIguales = (a == b);  \u002F\u002F Puede ser false debido a precisión\n",[551,6853,6854],{"class":553,"line":1142},[551,6855,1139],{"emptyLinePlaceholder":238},[551,6857,6858],{"class":553,"line":1148},[551,6859,6860],{},"\u002F\u002F Mejor: compara con tolerancia\n",[551,6862,6863],{"class":553,"line":1154},[551,6864,6865],{},"double tolerancia = 0.0001;\n",[551,6867,6868],{"class":553,"line":1160},[551,6869,6870],{},"bool sonIgualesAprox = Math.Abs(a - b) \u003C tolerancia;  \u002F\u002F true\n",[43,6872],{},[331,6874,6876],{"id":6875},"_4-operadores-lógicos","4. Operadores lógicos",[13,6878,6879],{},"Combinan múltiples condiciones booleanas.",[367,6881,6883],{"id":6882},"_41-and-lógico-y","4.1 AND lógico (&&) - \"Y\"",[13,6885,6886,6888,6889,6892],{},[54,6887,2853],{}," solo si ",[16,6890,6891],{},"ambas"," condiciones son verdaderas.",[543,6894,6896],{"className":545,"code":6895,"language":547,"meta":228,"style":228},"bool condicion1 = true;\nbool condicion2 = true;\nbool resultado = condicion1 && condicion2;  \u002F\u002F true\n",[54,6897,6898,6903,6908],{"__ignoreMap":228},[551,6899,6900],{"class":553,"line":554},[551,6901,6902],{},"bool condicion1 = true;\n",[551,6904,6905],{"class":553,"line":229},[551,6906,6907],{},"bool condicion2 = true;\n",[551,6909,6910],{"class":553,"line":670},[551,6911,6912],{},"bool resultado = condicion1 && condicion2;  \u002F\u002F true\n",[13,6914,6915,416],{},[16,6916,6917],{},"Tabla de verdad",[6589,6919,6920,6933],{},[6592,6921,6922],{},[6595,6923,6924,6927,6930],{},[6598,6925,6926],{},"A",[6598,6928,6929],{},"B",[6598,6931,6932],{},"A && B",[6611,6934,6935,6943,6951,6959],{},[6595,6936,6937,6939,6941],{},[6616,6938,2853],{},[6616,6940,2853],{},[6616,6942,2853],{},[6595,6944,6945,6947,6949],{},[6616,6946,2853],{},[6616,6948,2857],{},[6616,6950,2857],{},[6595,6952,6953,6955,6957],{},[6616,6954,2857],{},[6616,6956,2853],{},[6616,6958,2857],{},[6595,6960,6961,6963,6965],{},[6616,6962,2857],{},[6616,6964,2857],{},[6616,6966,2857],{},[13,6968,6969,6971],{},[16,6970,6376],{},": Verificar rango de voltaje",[543,6973,6975],{"className":545,"code":6974,"language":547,"meta":228,"style":228},"double voltaje = 235.0;\ndouble minimo = 207.0;  \u002F\u002F 230V - 10%\ndouble maximo = 253.0;  \u002F\u002F 230V + 10%\n\nbool dentroRango = (voltaje >= minimo) && (voltaje \u003C= maximo);  \u002F\u002F true\n",[54,6976,6977,6982,6987,6992,6996],{"__ignoreMap":228},[551,6978,6979],{"class":553,"line":554},[551,6980,6981],{},"double voltaje = 235.0;\n",[551,6983,6984],{"class":553,"line":229},[551,6985,6986],{},"double minimo = 207.0;  \u002F\u002F 230V - 10%\n",[551,6988,6989],{"class":553,"line":670},[551,6990,6991],{},"double maximo = 253.0;  \u002F\u002F 230V + 10%\n",[551,6993,6994],{"class":553,"line":1136},[551,6995,1139],{"emptyLinePlaceholder":238},[551,6997,6998],{"class":553,"line":1142},[551,6999,7000],{},"bool dentroRango = (voltaje >= minimo) && (voltaje \u003C= maximo);  \u002F\u002F true\n",[13,7002,7003,7006],{},[16,7004,7005],{},"Otro ejemplo",": Validar circuito completo",[543,7008,7010],{"className":545,"code":7009,"language":547,"meta":228,"style":228},"double corriente = 15.5;\ndouble corrienteMaxima = 16.0;\ndouble caidaTension = 5.2;\ndouble caidaMaxima = 6.9;  \u002F\u002F 3% de 230V\n\nbool circuitoOK = (corriente \u003C= corrienteMaxima) && (caidaTension \u003C= caidaMaxima);\n\u002F\u002F true (ambas condiciones se cumplen)\n",[54,7011,7012,7017,7021,7026,7031,7035,7040],{"__ignoreMap":228},[551,7013,7014],{"class":553,"line":554},[551,7015,7016],{},"double corriente = 15.5;\n",[551,7018,7019],{"class":553,"line":229},[551,7020,6787],{},[551,7022,7023],{"class":553,"line":670},[551,7024,7025],{},"double caidaTension = 5.2;\n",[551,7027,7028],{"class":553,"line":1136},[551,7029,7030],{},"double caidaMaxima = 6.9;  \u002F\u002F 3% de 230V\n",[551,7032,7033],{"class":553,"line":1142},[551,7034,1139],{"emptyLinePlaceholder":238},[551,7036,7037],{"class":553,"line":1148},[551,7038,7039],{},"bool circuitoOK = (corriente \u003C= corrienteMaxima) && (caidaTension \u003C= caidaMaxima);\n",[551,7041,7042],{"class":553,"line":1154},[551,7043,7044],{},"\u002F\u002F true (ambas condiciones se cumplen)\n",[43,7046],{},[367,7048,7050],{"id":7049},"_42-or-lógico-o","4.2 OR lógico (||) - \"O\"",[13,7052,7053,7055,7056,7059],{},[54,7054,2853],{}," si ",[16,7057,7058],{},"al menos una"," condición es verdadera.",[543,7061,7063],{"className":545,"code":7062,"language":547,"meta":228,"style":228},"bool condicion1 = true;\nbool condicion2 = false;\nbool resultado = condicion1 || condicion2;  \u002F\u002F true\n",[54,7064,7065,7069,7074],{"__ignoreMap":228},[551,7066,7067],{"class":553,"line":554},[551,7068,6902],{},[551,7070,7071],{"class":553,"line":229},[551,7072,7073],{},"bool condicion2 = false;\n",[551,7075,7076],{"class":553,"line":670},[551,7077,7078],{},"bool resultado = condicion1 || condicion2;  \u002F\u002F true\n",[13,7080,7081,416],{},[16,7082,6917],{},[6589,7084,7085,7096],{},[6592,7086,7087],{},[6595,7088,7089,7091,7093],{},[6598,7090,6926],{},[6598,7092,6929],{},[6598,7094,7095],{},"A || B",[6611,7097,7098,7106,7114,7122],{},[6595,7099,7100,7102,7104],{},[6616,7101,2853],{},[6616,7103,2853],{},[6616,7105,2853],{},[6595,7107,7108,7110,7112],{},[6616,7109,2853],{},[6616,7111,2857],{},[6616,7113,2853],{},[6595,7115,7116,7118,7120],{},[6616,7117,2857],{},[6616,7119,2853],{},[6616,7121,2853],{},[6595,7123,7124,7126,7128],{},[6616,7125,2857],{},[6616,7127,2857],{},[6616,7129,2857],{},[13,7131,7132,7134],{},[16,7133,6376],{},": Detectar situaciones anormales",[543,7136,7138],{"className":545,"code":7137,"language":547,"meta":228,"style":228},"double voltaje = 195.0;\ndouble corriente = 18.5;\n\nbool voltajeBajo = voltaje \u003C 207.0;\nbool corrienteAlta = corriente > 16.0;\n\nbool requiereAtencion = voltajeBajo || corrienteAlta;  \u002F\u002F true\n\u002F\u002F (cualquiera de las dos condiciones anormales activa la alerta)\n",[54,7139,7140,7145,7149,7153,7158,7163,7167,7172],{"__ignoreMap":228},[551,7141,7142],{"class":553,"line":554},[551,7143,7144],{},"double voltaje = 195.0;\n",[551,7146,7147],{"class":553,"line":229},[551,7148,6782],{},[551,7150,7151],{"class":553,"line":670},[551,7152,1139],{"emptyLinePlaceholder":238},[551,7154,7155],{"class":553,"line":1136},[551,7156,7157],{},"bool voltajeBajo = voltaje \u003C 207.0;\n",[551,7159,7160],{"class":553,"line":1142},[551,7161,7162],{},"bool corrienteAlta = corriente > 16.0;\n",[551,7164,7165],{"class":553,"line":1148},[551,7166,1139],{"emptyLinePlaceholder":238},[551,7168,7169],{"class":553,"line":1154},[551,7170,7171],{},"bool requiereAtencion = voltajeBajo || corrienteAlta;  \u002F\u002F true\n",[551,7173,7174],{"class":553,"line":1160},[551,7175,7176],{},"\u002F\u002F (cualquiera de las dos condiciones anormales activa la alerta)\n",[43,7178],{},[367,7180,7182],{"id":7181},"_43-not-lógico-no","4.3 NOT lógico (!) - \"NO\"",[13,7184,7185],{},"Invierte el valor booleano.",[543,7187,7189],{"className":545,"code":7188,"language":547,"meta":228,"style":228},"bool proyectoAbierto = true;\nbool proyectoCerrado = !proyectoAbierto;  \u002F\u002F false\n",[54,7190,7191,7195],{"__ignoreMap":228},[551,7192,7193],{"class":553,"line":554},[551,7194,2831],{},[551,7196,7197],{"class":553,"line":229},[551,7198,7199],{},"bool proyectoCerrado = !proyectoAbierto;  \u002F\u002F false\n",[13,7201,7202,416],{},[16,7203,6732],{},[543,7205,7207],{"className":545,"code":7206,"language":547,"meta":228,"style":228},"bool tieneErrores = false;\nbool estaLimpio = !tieneErrores;  \u002F\u002F true\n\nbool esTrifasico = true;\nbool esMonofasico = !esTrifasico;  \u002F\u002F false\n",[54,7208,7209,7213,7218,7222,7226],{"__ignoreMap":228},[551,7210,7211],{"class":553,"line":554},[551,7212,2836],{},[551,7214,7215],{"class":553,"line":229},[551,7216,7217],{},"bool estaLimpio = !tieneErrores;  \u002F\u002F true\n",[551,7219,7220],{"class":553,"line":670},[551,7221,1139],{"emptyLinePlaceholder":238},[551,7223,7224],{"class":553,"line":1136},[551,7225,2892],{},[551,7227,7228],{"class":553,"line":1142},[551,7229,7230],{},"bool esMonofasico = !esTrifasico;  \u002F\u002F false\n",[13,7232,7233,7236],{},[16,7234,7235],{},"Uso común",": Verificar negaciones",[543,7238,7240],{"className":545,"code":7239,"language":547,"meta":228,"style":228},"bool backupRealizado = false;\n\nif (!backupRealizado)\n{\n    MessageBox.Show(\"Advertencia: No se ha realizado backup.\");\n}\n",[54,7241,7242,7247,7251,7256,7260,7265],{"__ignoreMap":228},[551,7243,7244],{"class":553,"line":554},[551,7245,7246],{},"bool backupRealizado = false;\n",[551,7248,7249],{"class":553,"line":229},[551,7250,1139],{"emptyLinePlaceholder":238},[551,7252,7253],{"class":553,"line":670},[551,7254,7255],{},"if (!backupRealizado)\n",[551,7257,7258],{"class":553,"line":1136},[551,7259,1151],{},[551,7261,7262],{"class":553,"line":1142},[551,7263,7264],{},"    MessageBox.Show(\"Advertencia: No se ha realizado backup.\");\n",[551,7266,7267],{"class":553,"line":1148},[551,7268,1193],{},[43,7270],{},[367,7272,7274],{"id":7273},"_44-combinando-operadores-lógicos","4.4 Combinando operadores lógicos",[13,7276,7277],{},"Puedes combinar múltiples operadores:",[543,7279,7281],{"className":545,"code":7280,"language":547,"meta":228,"style":228},"double voltaje = 235.0;\ndouble corriente = 15.0;\ndouble temperatura = 45.0;\n\nbool voltajeOK = (voltaje >= 207.0) && (voltaje \u003C= 253.0);\nbool corrienteOK = corriente \u003C= 16.0;\nbool temperaturaOK = temperatura \u003C= 50.0;\n\nbool sistemaOK = voltajeOK && corrienteOK && temperaturaOK;  \u002F\u002F true\n",[54,7282,7283,7287,7292,7297,7301,7306,7311,7316,7320],{"__ignoreMap":228},[551,7284,7285],{"class":553,"line":554},[551,7286,6981],{},[551,7288,7289],{"class":553,"line":229},[551,7290,7291],{},"double corriente = 15.0;\n",[551,7293,7294],{"class":553,"line":670},[551,7295,7296],{},"double temperatura = 45.0;\n",[551,7298,7299],{"class":553,"line":1136},[551,7300,1139],{"emptyLinePlaceholder":238},[551,7302,7303],{"class":553,"line":1142},[551,7304,7305],{},"bool voltajeOK = (voltaje >= 207.0) && (voltaje \u003C= 253.0);\n",[551,7307,7308],{"class":553,"line":1148},[551,7309,7310],{},"bool corrienteOK = corriente \u003C= 16.0;\n",[551,7312,7313],{"class":553,"line":1154},[551,7314,7315],{},"bool temperaturaOK = temperatura \u003C= 50.0;\n",[551,7317,7318],{"class":553,"line":1160},[551,7319,1139],{"emptyLinePlaceholder":238},[551,7321,7322],{"class":553,"line":1166},[551,7323,7324],{},"bool sistemaOK = voltajeOK && corrienteOK && temperaturaOK;  \u002F\u002F true\n",[13,7326,7327,416],{},[16,7328,7329],{},"Con OR y AND",[543,7331,7333],{"className":545,"code":7332,"language":547,"meta":228,"style":228},"\u002F\u002F Alerta si: voltaje fuera de rango O corriente alta\nbool alerta = (voltaje \u003C 207.0 || voltaje > 253.0) || (corriente > 16.0);\n",[54,7334,7335,7340],{"__ignoreMap":228},[551,7336,7337],{"class":553,"line":554},[551,7338,7339],{},"\u002F\u002F Alerta si: voltaje fuera de rango O corriente alta\n",[551,7341,7342],{"class":553,"line":229},[551,7343,7344],{},"bool alerta = (voltaje \u003C 207.0 || voltaje > 253.0) || (corriente > 16.0);\n",[43,7346],{},[331,7348,7350],{"id":7349},"_5-precedencia-de-operadores","5. Precedencia de operadores",[13,7352,7353,7354,41],{},"Cuando combinas múltiples operadores, C# los evalúa en un ",[16,7355,7356],{},"orden específico",[367,7358,7360],{"id":7359},"_51-orden-de-precedencia-de-mayor-a-menor","5.1 Orden de precedencia (de mayor a menor)",[85,7362,7363,7371,7382,7393,7404,7413,7426,7435,7443,7451],{},[88,7364,7365,73,7368],{},[16,7366,7367],{},"Paréntesis",[54,7369,7370],{},"( )",[88,7372,7373,73,7376,4000,7379],{},[16,7374,7375],{},"Incremento\u002FDecremento",[54,7377,7378],{},"++",[54,7380,7381],{},"--",[88,7383,7384,73,7387,4000,7390,7392],{},[16,7385,7386],{},"Unarios",[54,7388,7389],{},"!",[54,7391,6054],{}," (negación)",[88,7394,7395,73,7398,4000,7400,4000,7402],{},[16,7396,7397],{},"Multiplicación, División, Módulo",[54,7399,6057],{},[54,7401,6060],{},[54,7403,6071],{},[88,7405,7406,73,7409,4000,7411],{},[16,7407,7408],{},"Suma, Resta",[54,7410,3865],{},[54,7412,6054],{},[88,7414,7415,73,7418,4000,7420,4000,7422,4000,7424],{},[16,7416,7417],{},"Comparación",[54,7419,6677],{},[54,7421,6658],{},[54,7423,6715],{},[54,7425,6696],{},[88,7427,7428,73,7431,4000,7433],{},[16,7429,7430],{},"Igualdad",[54,7432,6620],{},[54,7434,6639],{},[88,7436,7437,73,7440],{},[16,7438,7439],{},"AND lógico",[54,7441,7442],{},"&&",[88,7444,7445,73,7448],{},[16,7446,7447],{},"OR lógico",[54,7449,7450],{},"||",[88,7452,7453,73,7456,4000,7459,4000,7462,7465],{},[16,7454,7455],{},"Asignación",[54,7457,7458],{},"=",[54,7460,7461],{},"+=",[54,7463,7464],{},"-=",", etc.",[367,7467,7469],{"id":7468},"_52-ejemplos-de-precedencia","5.2 Ejemplos de precedencia",[543,7471,7473],{"className":545,"code":7472,"language":547,"meta":228,"style":228},"int resultado = 5 + 3 * 2;  \u002F\u002F 11, no 16\n\u002F\u002F Porque * tiene mayor precedencia que +\n\u002F\u002F Equivale a: 5 + (3 * 2)\n",[54,7474,7475,7480,7485],{"__ignoreMap":228},[551,7476,7477],{"class":553,"line":554},[551,7478,7479],{},"int resultado = 5 + 3 * 2;  \u002F\u002F 11, no 16\n",[551,7481,7482],{"class":553,"line":229},[551,7483,7484],{},"\u002F\u002F Porque * tiene mayor precedencia que +\n",[551,7486,7487],{"class":553,"line":670},[551,7488,7489],{},"\u002F\u002F Equivale a: 5 + (3 * 2)\n",[543,7491,7493],{"className":545,"code":7492,"language":547,"meta":228,"style":228},"int resultado = (5 + 3) * 2;  \u002F\u002F 16\n\u002F\u002F Los paréntesis fuerzan el orden\n",[54,7494,7495,7500],{"__ignoreMap":228},[551,7496,7497],{"class":553,"line":554},[551,7498,7499],{},"int resultado = (5 + 3) * 2;  \u002F\u002F 16\n",[551,7501,7502],{"class":553,"line":229},[551,7503,7504],{},"\u002F\u002F Los paréntesis fuerzan el orden\n",[13,7506,7507,416],{},[16,7508,7509],{},"Con operadores lógicos",[543,7511,7513],{"className":545,"code":7512,"language":547,"meta":228,"style":228},"bool resultado = true || false && false;  \u002F\u002F true\n\u002F\u002F && tiene mayor precedencia que ||\n\u002F\u002F Equivale a: true || (false && false)\n\u002F\u002F Equivale a: true || false\n\u002F\u002F Resultado: true\n",[54,7514,7515,7520,7525,7530,7535],{"__ignoreMap":228},[551,7516,7517],{"class":553,"line":554},[551,7518,7519],{},"bool resultado = true || false && false;  \u002F\u002F true\n",[551,7521,7522],{"class":553,"line":229},[551,7523,7524],{},"\u002F\u002F && tiene mayor precedencia que ||\n",[551,7526,7527],{"class":553,"line":670},[551,7528,7529],{},"\u002F\u002F Equivale a: true || (false && false)\n",[551,7531,7532],{"class":553,"line":1136},[551,7533,7534],{},"\u002F\u002F Equivale a: true || false\n",[551,7536,7537],{"class":553,"line":1142},[551,7538,7539],{},"\u002F\u002F Resultado: true\n",[543,7541,7543],{"className":545,"code":7542,"language":547,"meta":228,"style":228},"bool resultado = (true || false) && false;  \u002F\u002F false\n\u002F\u002F Paréntesis cambian el orden\n",[54,7544,7545,7550],{"__ignoreMap":228},[551,7546,7547],{"class":553,"line":554},[551,7548,7549],{},"bool resultado = (true || false) && false;  \u002F\u002F false\n",[551,7551,7552],{"class":553,"line":229},[551,7553,7554],{},"\u002F\u002F Paréntesis cambian el orden\n",[367,7556,7558],{"id":7557},"_53-buenas-prácticas","5.3 Buenas prácticas",[13,7560,7561,7564],{},[16,7562,7563],{},"Siempre usa paréntesis"," cuando tengas dudas o cuando mejore la legibilidad:",[543,7566,7568],{"className":545,"code":7567,"language":547,"meta":228,"style":228},"\u002F\u002F Poco claro\nbool ok = voltaje > 207 && voltaje \u003C 253 || corriente \u003C 16;\n\n\u002F\u002F Claro con paréntesis\nbool ok = ((voltaje > 207) && (voltaje \u003C 253)) || (corriente \u003C 16);\n",[54,7569,7570,7575,7580,7584,7589],{"__ignoreMap":228},[551,7571,7572],{"class":553,"line":554},[551,7573,7574],{},"\u002F\u002F Poco claro\n",[551,7576,7577],{"class":553,"line":229},[551,7578,7579],{},"bool ok = voltaje > 207 && voltaje \u003C 253 || corriente \u003C 16;\n",[551,7581,7582],{"class":553,"line":670},[551,7583,1139],{"emptyLinePlaceholder":238},[551,7585,7586],{"class":553,"line":1136},[551,7587,7588],{},"\u002F\u002F Claro con paréntesis\n",[551,7590,7591],{"class":553,"line":1142},[551,7592,7593],{},"bool ok = ((voltaje > 207) && (voltaje \u003C 253)) || (corriente \u003C 16);\n",[13,7595,7596,416],{},[16,7597,7598],{},"Ejemplo práctico bien estructurado",[543,7600,7602],{"className":545,"code":7601,"language":547,"meta":228,"style":228},"double voltaje = 235.0;\ndouble corriente = 15.5;\ndouble caidaTension = 5.0;\n\nbool voltajeDentroRango = (voltaje >= 207.0) && (voltaje \u003C= 253.0);\nbool corrienteSegura = (corriente \u003C= 16.0);\nbool caidaTensionAceptable = (caidaTension \u003C= 6.9);\n\nbool instalacionCorrecta = voltajeDentroRango && corrienteSegura && caidaTensionAceptable;\n",[54,7603,7604,7608,7612,7617,7621,7626,7631,7636,7640],{"__ignoreMap":228},[551,7605,7606],{"class":553,"line":554},[551,7607,6981],{},[551,7609,7610],{"class":553,"line":229},[551,7611,7016],{},[551,7613,7614],{"class":553,"line":670},[551,7615,7616],{},"double caidaTension = 5.0;\n",[551,7618,7619],{"class":553,"line":1136},[551,7620,1139],{"emptyLinePlaceholder":238},[551,7622,7623],{"class":553,"line":1142},[551,7624,7625],{},"bool voltajeDentroRango = (voltaje >= 207.0) && (voltaje \u003C= 253.0);\n",[551,7627,7628],{"class":553,"line":1148},[551,7629,7630],{},"bool corrienteSegura = (corriente \u003C= 16.0);\n",[551,7632,7633],{"class":553,"line":1154},[551,7634,7635],{},"bool caidaTensionAceptable = (caidaTension \u003C= 6.9);\n",[551,7637,7638],{"class":553,"line":1160},[551,7639,1139],{"emptyLinePlaceholder":238},[551,7641,7642],{"class":553,"line":1166},[551,7643,7644],{},"bool instalacionCorrecta = voltajeDentroRango && corrienteSegura && caidaTensionAceptable;\n",[13,7646,7647],{},"Este estilo:",[126,7649,7650,7653,7656],{},[88,7651,7652],{},"Es fácil de leer",[88,7654,7655],{},"Es fácil de depurar",[88,7657,7658],{},"Es fácil de modificar",[43,7660],{},[331,7662,7664],{"id":7663},"_6-expresiones-complejas-en-ingeniería-eléctrica","6. Expresiones complejas en ingeniería eléctrica",[13,7666,7667],{},"Veamos cómo construir expresiones reales que usarías en proyectos.",[367,7669,7671],{"id":7670},"_61-verificar-rango-de-voltaje-10","6.1 Verificar rango de voltaje (±10%)",[543,7673,7675],{"className":545,"code":7674,"language":547,"meta":228,"style":228},"double voltajeNominal = 230.0;\ndouble voltajeMedido = 235.5;\ndouble tolerancia = 0.10;  \u002F\u002F 10%\n\ndouble minimo = voltajeNominal * (1 - tolerancia);  \u002F\u002F 207V\ndouble maximo = voltajeNominal * (1 + tolerancia);  \u002F\u002F 253V\n\nbool voltajeOK = (voltajeMedido >= minimo) && (voltajeMedido \u003C= maximo);\n",[54,7676,7677,7681,7685,7690,7694,7699,7704,7708],{"__ignoreMap":228},[551,7678,7679],{"class":553,"line":554},[551,7680,6747],{},[551,7682,7683],{"class":553,"line":229},[551,7684,6742],{},[551,7686,7687],{"class":553,"line":670},[551,7688,7689],{},"double tolerancia = 0.10;  \u002F\u002F 10%\n",[551,7691,7692],{"class":553,"line":1136},[551,7693,1139],{"emptyLinePlaceholder":238},[551,7695,7696],{"class":553,"line":1142},[551,7697,7698],{},"double minimo = voltajeNominal * (1 - tolerancia);  \u002F\u002F 207V\n",[551,7700,7701],{"class":553,"line":1148},[551,7702,7703],{},"double maximo = voltajeNominal * (1 + tolerancia);  \u002F\u002F 253V\n",[551,7705,7706],{"class":553,"line":1154},[551,7707,1139],{"emptyLinePlaceholder":238},[551,7709,7710],{"class":553,"line":1160},[551,7711,7712],{},"bool voltajeOK = (voltajeMedido >= minimo) && (voltajeMedido \u003C= maximo);\n",[367,7714,7716],{"id":7715},"_62-calcular-y-validar-caída-de-tensión","6.2 Calcular y validar caída de tensión",[543,7718,7720],{"className":545,"code":7719,"language":547,"meta":228,"style":228},"\u002F\u002F Datos del cable\ndouble longitudMetros = 50.0;\ndouble corrienteAmperios = 16.0;\ndouble seccionMM2 = 2.5;\ndouble resistividadCobre = 0.018;\n\n\u002F\u002F Cálculo de caída de tensión\ndouble caidaTension = (2 * longitudMetros * corrienteAmperios * resistividadCobre) \u002F seccionMM2;\n\n\u002F\u002F Validar contra límite del 3%\ndouble voltajeNominal = 230.0;\ndouble caidaMaximaPermitida = voltajeNominal * 0.03;  \u002F\u002F 6.9V\n\nbool caidaAceptable = caidaTension \u003C= caidaMaximaPermitida;\ndouble porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n",[54,7721,7722,7727,7732,7737,7742,7747,7751,7756,7761,7765,7770,7774,7779,7783,7788],{"__ignoreMap":228},[551,7723,7724],{"class":553,"line":554},[551,7725,7726],{},"\u002F\u002F Datos del cable\n",[551,7728,7729],{"class":553,"line":229},[551,7730,7731],{},"double longitudMetros = 50.0;\n",[551,7733,7734],{"class":553,"line":670},[551,7735,7736],{},"double corrienteAmperios = 16.0;\n",[551,7738,7739],{"class":553,"line":1136},[551,7740,7741],{},"double seccionMM2 = 2.5;\n",[551,7743,7744],{"class":553,"line":1142},[551,7745,7746],{},"double resistividadCobre = 0.018;\n",[551,7748,7749],{"class":553,"line":1148},[551,7750,1139],{"emptyLinePlaceholder":238},[551,7752,7753],{"class":553,"line":1154},[551,7754,7755],{},"\u002F\u002F Cálculo de caída de tensión\n",[551,7757,7758],{"class":553,"line":1160},[551,7759,7760],{},"double caidaTension = (2 * longitudMetros * corrienteAmperios * resistividadCobre) \u002F seccionMM2;\n",[551,7762,7763],{"class":553,"line":1166},[551,7764,1139],{"emptyLinePlaceholder":238},[551,7766,7767],{"class":553,"line":1172},[551,7768,7769],{},"\u002F\u002F Validar contra límite del 3%\n",[551,7771,7772],{"class":553,"line":1178},[551,7773,6747],{},[551,7775,7776],{"class":553,"line":1184},[551,7777,7778],{},"double caidaMaximaPermitida = voltajeNominal * 0.03;  \u002F\u002F 6.9V\n",[551,7780,7781],{"class":553,"line":1190},[551,7782,1139],{"emptyLinePlaceholder":238},[551,7784,7785],{"class":553,"line":1472},[551,7786,7787],{},"bool caidaAceptable = caidaTension \u003C= caidaMaximaPermitida;\n",[551,7789,7790],{"class":553,"line":1477},[551,7791,7792],{},"double porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n",[367,7794,7796],{"id":7795},"_63-dimensionar-cable-por-corriente-admisible","6.3 Dimensionar cable por corriente admisible",[543,7798,7800],{"className":545,"code":7799,"language":547,"meta":228,"style":228},"double corrienteCircuito = 32.0;  \u002F\u002F A\ndouble factorTemperatura = 0.94;\ndouble factorAgrupacion = 0.80;\n\n\u002F\u002F Corriente corregida que debe soportar el cable\ndouble corrienteCorregida = corrienteCircuito \u002F (factorTemperatura * factorAgrupacion);\n\n\u002F\u002F ¿Cable de 6mm² (43A) es suficiente?\ndouble corrienteAdmisible6mm = 43.0;\nbool cable6mmSuficiente = corrienteAdmisible6mm >= corrienteCorregida;\n\n\u002F\u002F ¿Cable de 4mm² (36A) es suficiente?\ndouble corrienteAdmisible4mm = 36.0;\nbool cable4mmSuficiente = corrienteAdmisible4mm >= corrienteCorregida;\n",[54,7801,7802,7807,7812,7817,7821,7826,7831,7835,7840,7845,7850,7854,7859,7864],{"__ignoreMap":228},[551,7803,7804],{"class":553,"line":554},[551,7805,7806],{},"double corrienteCircuito = 32.0;  \u002F\u002F A\n",[551,7808,7809],{"class":553,"line":229},[551,7810,7811],{},"double factorTemperatura = 0.94;\n",[551,7813,7814],{"class":553,"line":670},[551,7815,7816],{},"double factorAgrupacion = 0.80;\n",[551,7818,7819],{"class":553,"line":1136},[551,7820,1139],{"emptyLinePlaceholder":238},[551,7822,7823],{"class":553,"line":1142},[551,7824,7825],{},"\u002F\u002F Corriente corregida que debe soportar el cable\n",[551,7827,7828],{"class":553,"line":1148},[551,7829,7830],{},"double corrienteCorregida = corrienteCircuito \u002F (factorTemperatura * factorAgrupacion);\n",[551,7832,7833],{"class":553,"line":1154},[551,7834,1139],{"emptyLinePlaceholder":238},[551,7836,7837],{"class":553,"line":1160},[551,7838,7839],{},"\u002F\u002F ¿Cable de 6mm² (43A) es suficiente?\n",[551,7841,7842],{"class":553,"line":1166},[551,7843,7844],{},"double corrienteAdmisible6mm = 43.0;\n",[551,7846,7847],{"class":553,"line":1172},[551,7848,7849],{},"bool cable6mmSuficiente = corrienteAdmisible6mm >= corrienteCorregida;\n",[551,7851,7852],{"class":553,"line":1178},[551,7853,1139],{"emptyLinePlaceholder":238},[551,7855,7856],{"class":553,"line":1184},[551,7857,7858],{},"\u002F\u002F ¿Cable de 4mm² (36A) es suficiente?\n",[551,7860,7861],{"class":553,"line":1190},[551,7862,7863],{},"double corrienteAdmisible4mm = 36.0;\n",[551,7865,7866],{"class":553,"line":1472},[551,7867,7868],{},"bool cable4mmSuficiente = corrienteAdmisible4mm >= corrienteCorregida;\n",[367,7870,7872],{"id":7871},"_64-factor-de-potencia-y-potencia-reactiva","6.4 Factor de potencia y potencia reactiva",[543,7874,7876],{"className":545,"code":7875,"language":547,"meta":228,"style":228},"double potenciaActiva = 15000.0;    \u002F\u002F W\ndouble factorPotencia = 0.75;\n\n\u002F\u002F Calcular potencia aparente: S = P \u002F cos φ\ndouble potenciaAparente = potenciaActiva \u002F factorPotencia;  \u002F\u002F 20000 VA\n\n\u002F\u002F Calcular potencia reactiva: Q = √(S² - P²)\ndouble potenciaReactiva = Math.Sqrt(\n    Math.Pow(potenciaAparente, 2) - Math.Pow(potenciaActiva, 2)\n);  \u002F\u002F 13229 VAr\n\n\u002F\u002F ¿Factor de potencia aceptable? (mínimo 0.92)\nbool fpAceptable = factorPotencia >= 0.92;\n\n\u002F\u002F Capacitor necesario para corregir a 0.92\ndouble factorPotenciaObjetivo = 0.92;\ndouble anguloActual = Math.Acos(factorPotencia);\ndouble anguloObjetivo = Math.Acos(factorPotenciaObjetivo);\ndouble potenciaCapacitor = potenciaActiva * (Math.Tan(anguloActual) - Math.Tan(anguloObjetivo));\n",[54,7877,7878,7883,7888,7892,7897,7902,7906,7911,7916,7921,7926,7930,7935,7940,7944,7949,7954,7959,7964],{"__ignoreMap":228},[551,7879,7880],{"class":553,"line":554},[551,7881,7882],{},"double potenciaActiva = 15000.0;    \u002F\u002F W\n",[551,7884,7885],{"class":553,"line":229},[551,7886,7887],{},"double factorPotencia = 0.75;\n",[551,7889,7890],{"class":553,"line":670},[551,7891,1139],{"emptyLinePlaceholder":238},[551,7893,7894],{"class":553,"line":1136},[551,7895,7896],{},"\u002F\u002F Calcular potencia aparente: S = P \u002F cos φ\n",[551,7898,7899],{"class":553,"line":1142},[551,7900,7901],{},"double potenciaAparente = potenciaActiva \u002F factorPotencia;  \u002F\u002F 20000 VA\n",[551,7903,7904],{"class":553,"line":1148},[551,7905,1139],{"emptyLinePlaceholder":238},[551,7907,7908],{"class":553,"line":1154},[551,7909,7910],{},"\u002F\u002F Calcular potencia reactiva: Q = √(S² - P²)\n",[551,7912,7913],{"class":553,"line":1160},[551,7914,7915],{},"double potenciaReactiva = Math.Sqrt(\n",[551,7917,7918],{"class":553,"line":1166},[551,7919,7920],{},"    Math.Pow(potenciaAparente, 2) - Math.Pow(potenciaActiva, 2)\n",[551,7922,7923],{"class":553,"line":1172},[551,7924,7925],{},");  \u002F\u002F 13229 VAr\n",[551,7927,7928],{"class":553,"line":1178},[551,7929,1139],{"emptyLinePlaceholder":238},[551,7931,7932],{"class":553,"line":1184},[551,7933,7934],{},"\u002F\u002F ¿Factor de potencia aceptable? (mínimo 0.92)\n",[551,7936,7937],{"class":553,"line":1190},[551,7938,7939],{},"bool fpAceptable = factorPotencia >= 0.92;\n",[551,7941,7942],{"class":553,"line":1472},[551,7943,1139],{"emptyLinePlaceholder":238},[551,7945,7946],{"class":553,"line":1477},[551,7947,7948],{},"\u002F\u002F Capacitor necesario para corregir a 0.92\n",[551,7950,7951],{"class":553,"line":1797},[551,7952,7953],{},"double factorPotenciaObjetivo = 0.92;\n",[551,7955,7956],{"class":553,"line":1802},[551,7957,7958],{},"double anguloActual = Math.Acos(factorPotencia);\n",[551,7960,7961],{"class":553,"line":1808},[551,7962,7963],{},"double anguloObjetivo = Math.Acos(factorPotenciaObjetivo);\n",[551,7965,7966],{"class":553,"line":1814},[551,7967,7968],{},"double potenciaCapacitor = potenciaActiva * (Math.Tan(anguloActual) - Math.Tan(anguloObjetivo));\n",[43,7970],{},[46,7972,4025],{"id":4024},[13,7974,7975,7976,7978],{},"Vamos a crear un ",[16,7977,5966],{}," que valida múltiples parámetros.",[331,7980,7982],{"id":7981},"paso-1-estructura-básica-y-datos-de-entrada","Paso 1: Estructura básica y datos de entrada",[543,7984,7986],{"className":545,"code":7985,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class VerificacionInstalacion\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DE LA INSTALACIÓN\n        \u002F\u002F ========================================\n\n        string nombreCircuito = \"Circuito Taller - Línea 3\";\n\n        \u002F\u002F Parámetros eléctricos medidos\n        double voltajeMedido = 225.0;        \u002F\u002F V\n        double corrienteMedida = 14.8;       \u002F\u002F A\n        double factorPotencia = 0.88;\n\n        \u002F\u002F Datos del cable instalado\n        double longitudCable = 45.0;         \u002F\u002F m\n        double seccionCable = 2.5;           \u002F\u002F mm²\n        double corrienteAdmisible = 21.0;    \u002F\u002F A (tabla para 2.5mm²)\n\n        \u002F\u002F Límites normativos\n        double voltajeNominal = 230.0;       \u002F\u002F V\n        double corrienteCircuito = 16.0;     \u002F\u002F A (protección)\n        double toleranciaVoltaje = 0.10;     \u002F\u002F 10%\n        double caidaMaximaPorcentaje = 0.03; \u002F\u002F 3%\n        double factorPotenciaMinimo = 0.85;\n    }\n}\n",[54,7987,7988,7992,7996,8000,8004,8009,8013,8017,8021,8025,8029,8034,8038,8042,8047,8051,8056,8061,8066,8071,8075,8080,8085,8090,8095,8099,8104,8109,8114,8119,8124,8129,8133],{"__ignoreMap":228},[551,7989,7990],{"class":553,"line":554},[551,7991,1123],{},[551,7993,7994],{"class":553,"line":229},[551,7995,1128],{},[551,7997,7998],{"class":553,"line":670},[551,7999,1133],{},[551,8001,8002],{"class":553,"line":1136},[551,8003,1139],{"emptyLinePlaceholder":238},[551,8005,8006],{"class":553,"line":1142},[551,8007,8008],{},"public class VerificacionInstalacion\n",[551,8010,8011],{"class":553,"line":1148},[551,8012,1151],{},[551,8014,8015],{"class":553,"line":1154},[551,8016,1157],{},[551,8018,8019],{"class":553,"line":1160},[551,8020,1163],{},[551,8022,8023],{"class":553,"line":1166},[551,8024,1169],{},[551,8026,8027],{"class":553,"line":1172},[551,8028,4511],{},[551,8030,8031],{"class":553,"line":1178},[551,8032,8033],{},"        \u002F\u002F DATOS DE LA INSTALACIÓN\n",[551,8035,8036],{"class":553,"line":1184},[551,8037,4511],{},[551,8039,8040],{"class":553,"line":1190},[551,8041,1139],{"emptyLinePlaceholder":238},[551,8043,8044],{"class":553,"line":1472},[551,8045,8046],{},"        string nombreCircuito = \"Circuito Taller - Línea 3\";\n",[551,8048,8049],{"class":553,"line":1477},[551,8050,1139],{"emptyLinePlaceholder":238},[551,8052,8053],{"class":553,"line":1797},[551,8054,8055],{},"        \u002F\u002F Parámetros eléctricos medidos\n",[551,8057,8058],{"class":553,"line":1802},[551,8059,8060],{},"        double voltajeMedido = 225.0;        \u002F\u002F V\n",[551,8062,8063],{"class":553,"line":1808},[551,8064,8065],{},"        double corrienteMedida = 14.8;       \u002F\u002F A\n",[551,8067,8068],{"class":553,"line":1814},[551,8069,8070],{},"        double factorPotencia = 0.88;\n",[551,8072,8073],{"class":553,"line":1820},[551,8074,1139],{"emptyLinePlaceholder":238},[551,8076,8077],{"class":553,"line":1826},[551,8078,8079],{},"        \u002F\u002F Datos del cable instalado\n",[551,8081,8082],{"class":553,"line":1832},[551,8083,8084],{},"        double longitudCable = 45.0;         \u002F\u002F m\n",[551,8086,8087],{"class":553,"line":1838},[551,8088,8089],{},"        double seccionCable = 2.5;           \u002F\u002F mm²\n",[551,8091,8092],{"class":553,"line":1844},[551,8093,8094],{},"        double corrienteAdmisible = 21.0;    \u002F\u002F A (tabla para 2.5mm²)\n",[551,8096,8097],{"class":553,"line":1850},[551,8098,1139],{"emptyLinePlaceholder":238},[551,8100,8101],{"class":553,"line":1855},[551,8102,8103],{},"        \u002F\u002F Límites normativos\n",[551,8105,8106],{"class":553,"line":1861},[551,8107,8108],{},"        double voltajeNominal = 230.0;       \u002F\u002F V\n",[551,8110,8111],{"class":553,"line":1867},[551,8112,8113],{},"        double corrienteCircuito = 16.0;     \u002F\u002F A (protección)\n",[551,8115,8116],{"class":553,"line":1873},[551,8117,8118],{},"        double toleranciaVoltaje = 0.10;     \u002F\u002F 10%\n",[551,8120,8121],{"class":553,"line":1878},[551,8122,8123],{},"        double caidaMaximaPorcentaje = 0.03; \u002F\u002F 3%\n",[551,8125,8126],{"class":553,"line":1883},[551,8127,8128],{},"        double factorPotenciaMinimo = 0.85;\n",[551,8130,8131],{"class":553,"line":1888},[551,8132,1187],{},[551,8134,8135],{"class":553,"line":4615},[551,8136,1193],{},[13,8138,8139,8141],{},[16,8140,4153],{},"\nDefinimos todos los parámetros que vamos a verificar en una instalación real.",[43,8143],{},[331,8145,8147],{"id":8146},"paso-2-verificación-de-voltaje","Paso 2: Verificación de voltaje",[543,8149,8151],{"className":545,"code":8150,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VERIFICACIÓN 1: RANGO DE VOLTAJE\n\u002F\u002F ========================================\n\ndouble voltajeMinimo = voltajeNominal * (1 - toleranciaVoltaje);\ndouble voltajeMaximo = voltajeNominal * (1 + toleranciaVoltaje);\n\nbool voltajeOK = (voltajeMedido >= voltajeMinimo) && (voltajeMedido \u003C= voltajeMaximo);\n\nstring resultadoVoltaje;\nif (voltajeOK)\n{\n    resultadoVoltaje = string.Format(\"OK ({0:F1}V está entre {1:F1}V y {2:F1}V)\",\n        voltajeMedido, voltajeMinimo, voltajeMaximo);\n}\nelse\n{\n    resultadoVoltaje = string.Format(\"FALLO ({0:F1}V fuera del rango {1:F1}V - {2:F1}V)\",\n        voltajeMedido, voltajeMinimo, voltajeMaximo);\n}\n",[54,8152,8153,8158,8163,8167,8171,8176,8181,8185,8190,8194,8199,8204,8208,8213,8218,8222,8226,8230,8235,8239],{"__ignoreMap":228},[551,8154,8155],{"class":553,"line":554},[551,8156,8157],{},"\u002F\u002F ========================================\n",[551,8159,8160],{"class":553,"line":229},[551,8161,8162],{},"\u002F\u002F VERIFICACIÓN 1: RANGO DE VOLTAJE\n",[551,8164,8165],{"class":553,"line":670},[551,8166,8157],{},[551,8168,8169],{"class":553,"line":1136},[551,8170,1139],{"emptyLinePlaceholder":238},[551,8172,8173],{"class":553,"line":1142},[551,8174,8175],{},"double voltajeMinimo = voltajeNominal * (1 - toleranciaVoltaje);\n",[551,8177,8178],{"class":553,"line":1148},[551,8179,8180],{},"double voltajeMaximo = voltajeNominal * (1 + toleranciaVoltaje);\n",[551,8182,8183],{"class":553,"line":1154},[551,8184,1139],{"emptyLinePlaceholder":238},[551,8186,8187],{"class":553,"line":1160},[551,8188,8189],{},"bool voltajeOK = (voltajeMedido >= voltajeMinimo) && (voltajeMedido \u003C= voltajeMaximo);\n",[551,8191,8192],{"class":553,"line":1166},[551,8193,1139],{"emptyLinePlaceholder":238},[551,8195,8196],{"class":553,"line":1172},[551,8197,8198],{},"string resultadoVoltaje;\n",[551,8200,8201],{"class":553,"line":1178},[551,8202,8203],{},"if (voltajeOK)\n",[551,8205,8206],{"class":553,"line":1184},[551,8207,1151],{},[551,8209,8210],{"class":553,"line":1190},[551,8211,8212],{},"    resultadoVoltaje = string.Format(\"OK ({0:F1}V está entre {1:F1}V y {2:F1}V)\",\n",[551,8214,8215],{"class":553,"line":1472},[551,8216,8217],{},"        voltajeMedido, voltajeMinimo, voltajeMaximo);\n",[551,8219,8220],{"class":553,"line":1477},[551,8221,1193],{},[551,8223,8224],{"class":553,"line":1797},[551,8225,3704],{},[551,8227,8228],{"class":553,"line":1802},[551,8229,1151],{},[551,8231,8232],{"class":553,"line":1808},[551,8233,8234],{},"    resultadoVoltaje = string.Format(\"FALLO ({0:F1}V fuera del rango {1:F1}V - {2:F1}V)\",\n",[551,8236,8237],{"class":553,"line":1814},[551,8238,8217],{},[551,8240,8241],{"class":553,"line":1820},[551,8242,1193],{},[13,8244,8245,8247],{},[16,8246,4153],{},"\nVerificamos que el voltaje medido esté dentro del rango ±10% del nominal.",[43,8249],{},[331,8251,8253],{"id":8252},"paso-3-verificación-de-corriente","Paso 3: Verificación de corriente",[543,8255,8257],{"className":545,"code":8256,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VERIFICACIÓN 2: CORRIENTE\n\u002F\u002F ========================================\n\nbool corrienteOK = (corrienteMedida \u003C= corrienteCircuito);\n\nstring resultadoCorriente;\nif (corrienteOK)\n{\n    double porcentajeUso = (corrienteMedida \u002F corrienteCircuito) * 100;\n    resultadoCorriente = string.Format(\"OK ({0:F1}A \u002F {1:F1}A = {2:F1}% de uso)\",\n        corrienteMedida, corrienteCircuito, porcentajeUso);\n}\nelse\n{\n    resultadoCorriente = string.Format(\"FALLO ({0:F1}A excede límite de {1:F1}A)\",\n        corrienteMedida, corrienteCircuito);\n}\n",[54,8258,8259,8263,8268,8272,8276,8281,8285,8290,8295,8299,8304,8309,8314,8318,8322,8326,8331,8336],{"__ignoreMap":228},[551,8260,8261],{"class":553,"line":554},[551,8262,8157],{},[551,8264,8265],{"class":553,"line":229},[551,8266,8267],{},"\u002F\u002F VERIFICACIÓN 2: CORRIENTE\n",[551,8269,8270],{"class":553,"line":670},[551,8271,8157],{},[551,8273,8274],{"class":553,"line":1136},[551,8275,1139],{"emptyLinePlaceholder":238},[551,8277,8278],{"class":553,"line":1142},[551,8279,8280],{},"bool corrienteOK = (corrienteMedida \u003C= corrienteCircuito);\n",[551,8282,8283],{"class":553,"line":1148},[551,8284,1139],{"emptyLinePlaceholder":238},[551,8286,8287],{"class":553,"line":1154},[551,8288,8289],{},"string resultadoCorriente;\n",[551,8291,8292],{"class":553,"line":1160},[551,8293,8294],{},"if (corrienteOK)\n",[551,8296,8297],{"class":553,"line":1166},[551,8298,1151],{},[551,8300,8301],{"class":553,"line":1172},[551,8302,8303],{},"    double porcentajeUso = (corrienteMedida \u002F corrienteCircuito) * 100;\n",[551,8305,8306],{"class":553,"line":1178},[551,8307,8308],{},"    resultadoCorriente = string.Format(\"OK ({0:F1}A \u002F {1:F1}A = {2:F1}% de uso)\",\n",[551,8310,8311],{"class":553,"line":1184},[551,8312,8313],{},"        corrienteMedida, corrienteCircuito, porcentajeUso);\n",[551,8315,8316],{"class":553,"line":1190},[551,8317,1193],{},[551,8319,8320],{"class":553,"line":1472},[551,8321,3704],{},[551,8323,8324],{"class":553,"line":1477},[551,8325,1151],{},[551,8327,8328],{"class":553,"line":1797},[551,8329,8330],{},"    resultadoCorriente = string.Format(\"FALLO ({0:F1}A excede límite de {1:F1}A)\",\n",[551,8332,8333],{"class":553,"line":1802},[551,8334,8335],{},"        corrienteMedida, corrienteCircuito);\n",[551,8337,8338],{"class":553,"line":1808},[551,8339,1193],{},[43,8341],{},[331,8343,8345],{"id":8344},"paso-4-cálculo-y-verificación-de-caída-de-tensión","Paso 4: Cálculo y verificación de caída de tensión",[543,8347,8349],{"className":545,"code":8348,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VERIFICACIÓN 3: CAÍDA DE TENSIÓN\n\u002F\u002F ========================================\n\ndouble resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n\ndouble caidaTension = (2 * longitudCable * corrienteMedida * resistividadCobre) \u002F seccionCable;\ndouble porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\ndouble caidaMaximaVoltios = voltajeNominal * caidaMaximaPorcentaje;\n\nbool caidaTensionOK = (caidaTension \u003C= caidaMaximaVoltios);\n\nstring resultadoCaida;\nif (caidaTensionOK)\n{\n    resultadoCaida = string.Format(\"OK ({0:F2}V = {1:F2}% \u003C {2:F2}%)\",\n        caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n}\nelse\n{\n    resultadoCaida = string.Format(\"FALLO ({0:F2}V = {1:F2}% > {2:F2}%)\",\n        caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n}\n",[54,8350,8351,8355,8360,8364,8368,8373,8377,8382,8386,8391,8395,8400,8404,8409,8414,8418,8423,8428,8432,8436,8440,8445,8449],{"__ignoreMap":228},[551,8352,8353],{"class":553,"line":554},[551,8354,8157],{},[551,8356,8357],{"class":553,"line":229},[551,8358,8359],{},"\u002F\u002F VERIFICACIÓN 3: CAÍDA DE TENSIÓN\n",[551,8361,8362],{"class":553,"line":670},[551,8363,8157],{},[551,8365,8366],{"class":553,"line":1136},[551,8367,1139],{"emptyLinePlaceholder":238},[551,8369,8370],{"class":553,"line":1142},[551,8371,8372],{},"double resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n",[551,8374,8375],{"class":553,"line":1148},[551,8376,1139],{"emptyLinePlaceholder":238},[551,8378,8379],{"class":553,"line":1154},[551,8380,8381],{},"double caidaTension = (2 * longitudCable * corrienteMedida * resistividadCobre) \u002F seccionCable;\n",[551,8383,8384],{"class":553,"line":1160},[551,8385,7792],{},[551,8387,8388],{"class":553,"line":1166},[551,8389,8390],{},"double caidaMaximaVoltios = voltajeNominal * caidaMaximaPorcentaje;\n",[551,8392,8393],{"class":553,"line":1172},[551,8394,1139],{"emptyLinePlaceholder":238},[551,8396,8397],{"class":553,"line":1178},[551,8398,8399],{},"bool caidaTensionOK = (caidaTension \u003C= caidaMaximaVoltios);\n",[551,8401,8402],{"class":553,"line":1184},[551,8403,1139],{"emptyLinePlaceholder":238},[551,8405,8406],{"class":553,"line":1190},[551,8407,8408],{},"string resultadoCaida;\n",[551,8410,8411],{"class":553,"line":1472},[551,8412,8413],{},"if (caidaTensionOK)\n",[551,8415,8416],{"class":553,"line":1477},[551,8417,1151],{},[551,8419,8420],{"class":553,"line":1797},[551,8421,8422],{},"    resultadoCaida = string.Format(\"OK ({0:F2}V = {1:F2}% \u003C {2:F2}%)\",\n",[551,8424,8425],{"class":553,"line":1802},[551,8426,8427],{},"        caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n",[551,8429,8430],{"class":553,"line":1808},[551,8431,1193],{},[551,8433,8434],{"class":553,"line":1814},[551,8435,3704],{},[551,8437,8438],{"class":553,"line":1820},[551,8439,1151],{},[551,8441,8442],{"class":553,"line":1826},[551,8443,8444],{},"    resultadoCaida = string.Format(\"FALLO ({0:F2}V = {1:F2}% > {2:F2}%)\",\n",[551,8446,8447],{"class":553,"line":1832},[551,8448,8427],{},[551,8450,8451],{"class":553,"line":1838},[551,8452,1193],{},[13,8454,8455,8457],{},[16,8456,4153],{},"\nCalculamos la caída de tensión en el cable y verificamos que esté bajo el 3%.",[43,8459],{},[331,8461,8463],{"id":8462},"paso-5-verificación-de-factor-de-potencia","Paso 5: Verificación de factor de potencia",[543,8465,8467],{"className":545,"code":8466,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VERIFICACIÓN 4: FACTOR DE POTENCIA\n\u002F\u002F ========================================\n\nbool factorPotenciaOK = (factorPotencia >= factorPotenciaMinimo);\n\nstring resultadoFP;\nif (factorPotenciaOK)\n{\n    resultadoFP = string.Format(\"OK ({0:F2} >= {1:F2})\",\n        factorPotencia, factorPotenciaMinimo);\n}\nelse\n{\n    resultadoFP = string.Format(\"BAJO ({0:F2} \u003C {1:F2})\",\n        factorPotencia, factorPotenciaMinimo);\n}\n",[54,8468,8469,8473,8478,8482,8486,8491,8495,8500,8505,8509,8514,8519,8523,8527,8531,8536,8540],{"__ignoreMap":228},[551,8470,8471],{"class":553,"line":554},[551,8472,8157],{},[551,8474,8475],{"class":553,"line":229},[551,8476,8477],{},"\u002F\u002F VERIFICACIÓN 4: FACTOR DE POTENCIA\n",[551,8479,8480],{"class":553,"line":670},[551,8481,8157],{},[551,8483,8484],{"class":553,"line":1136},[551,8485,1139],{"emptyLinePlaceholder":238},[551,8487,8488],{"class":553,"line":1142},[551,8489,8490],{},"bool factorPotenciaOK = (factorPotencia >= factorPotenciaMinimo);\n",[551,8492,8493],{"class":553,"line":1148},[551,8494,1139],{"emptyLinePlaceholder":238},[551,8496,8497],{"class":553,"line":1154},[551,8498,8499],{},"string resultadoFP;\n",[551,8501,8502],{"class":553,"line":1160},[551,8503,8504],{},"if (factorPotenciaOK)\n",[551,8506,8507],{"class":553,"line":1166},[551,8508,1151],{},[551,8510,8511],{"class":553,"line":1172},[551,8512,8513],{},"    resultadoFP = string.Format(\"OK ({0:F2} >= {1:F2})\",\n",[551,8515,8516],{"class":553,"line":1178},[551,8517,8518],{},"        factorPotencia, factorPotenciaMinimo);\n",[551,8520,8521],{"class":553,"line":1184},[551,8522,1193],{},[551,8524,8525],{"class":553,"line":1190},[551,8526,3704],{},[551,8528,8529],{"class":553,"line":1472},[551,8530,1151],{},[551,8532,8533],{"class":553,"line":1477},[551,8534,8535],{},"    resultadoFP = string.Format(\"BAJO ({0:F2} \u003C {1:F2})\",\n",[551,8537,8538],{"class":553,"line":1797},[551,8539,8518],{},[551,8541,8542],{"class":553,"line":1802},[551,8543,1193],{},[43,8545],{},[331,8547,8549],{"id":8548},"paso-6-verificación-de-dimensionado-de-cable","Paso 6: Verificación de dimensionado de cable",[543,8551,8553],{"className":545,"code":8552,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VERIFICACIÓN 5: DIMENSIONADO CABLE\n\u002F\u002F ========================================\n\nbool cableDimensionadoOK = (corrienteAdmisible >= corrienteMedida);\n\nstring resultadoCable;\nif (cableDimensionadoOK)\n{\n    double margenSeguridad = ((corrienteAdmisible - corrienteMedida) \u002F corrienteAdmisible) * 100;\n    resultadoCable = string.Format(\"OK ({0}mm² soporta {1:F1}A, medido {2:F1}A, margen {3:F1}%)\",\n        seccionCable, corrienteAdmisible, corrienteMedida, margenSeguridad);\n}\nelse\n{\n    resultadoCable = string.Format(\"FALLO ({0}mm² solo soporta {1:F1}A, medido {2:F1}A)\",\n        seccionCable, corrienteAdmisible, corrienteMedida);\n}\n",[54,8554,8555,8559,8564,8568,8572,8577,8581,8586,8591,8595,8600,8605,8610,8614,8618,8622,8627,8632],{"__ignoreMap":228},[551,8556,8557],{"class":553,"line":554},[551,8558,8157],{},[551,8560,8561],{"class":553,"line":229},[551,8562,8563],{},"\u002F\u002F VERIFICACIÓN 5: DIMENSIONADO CABLE\n",[551,8565,8566],{"class":553,"line":670},[551,8567,8157],{},[551,8569,8570],{"class":553,"line":1136},[551,8571,1139],{"emptyLinePlaceholder":238},[551,8573,8574],{"class":553,"line":1142},[551,8575,8576],{},"bool cableDimensionadoOK = (corrienteAdmisible >= corrienteMedida);\n",[551,8578,8579],{"class":553,"line":1148},[551,8580,1139],{"emptyLinePlaceholder":238},[551,8582,8583],{"class":553,"line":1154},[551,8584,8585],{},"string resultadoCable;\n",[551,8587,8588],{"class":553,"line":1160},[551,8589,8590],{},"if (cableDimensionadoOK)\n",[551,8592,8593],{"class":553,"line":1166},[551,8594,1151],{},[551,8596,8597],{"class":553,"line":1172},[551,8598,8599],{},"    double margenSeguridad = ((corrienteAdmisible - corrienteMedida) \u002F corrienteAdmisible) * 100;\n",[551,8601,8602],{"class":553,"line":1178},[551,8603,8604],{},"    resultadoCable = string.Format(\"OK ({0}mm² soporta {1:F1}A, medido {2:F1}A, margen {3:F1}%)\",\n",[551,8606,8607],{"class":553,"line":1184},[551,8608,8609],{},"        seccionCable, corrienteAdmisible, corrienteMedida, margenSeguridad);\n",[551,8611,8612],{"class":553,"line":1190},[551,8613,1193],{},[551,8615,8616],{"class":553,"line":1472},[551,8617,3704],{},[551,8619,8620],{"class":553,"line":1477},[551,8621,1151],{},[551,8623,8624],{"class":553,"line":1797},[551,8625,8626],{},"    resultadoCable = string.Format(\"FALLO ({0}mm² solo soporta {1:F1}A, medido {2:F1}A)\",\n",[551,8628,8629],{"class":553,"line":1802},[551,8630,8631],{},"        seccionCable, corrienteAdmisible, corrienteMedida);\n",[551,8633,8634],{"class":553,"line":1808},[551,8635,1193],{},[43,8637],{},[331,8639,8641],{"id":8640},"paso-7-evaluación-general-y-construcción-del-mensaje","Paso 7: Evaluación general y construcción del mensaje",[543,8643,8645],{"className":545,"code":8644,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F EVALUACIÓN GENERAL\n\u002F\u002F ========================================\n\nbool instalacionConforme = voltajeOK && corrienteOK && caidaTensionOK &&\n                           factorPotenciaOK && cableDimensionadoOK;\n\nstring estadoGeneral = instalacionConforme ? \"CONFORME\" : \"NO CONFORME\";\n\n\u002F\u002F ========================================\n\u002F\u002F CONSTRUCCIÓN DEL REPORTE\n\u002F\u002F ========================================\n\nstring reporte = string.Format(\n    \"=== VERIFICACIÓN DE INSTALACIÓN ELÉCTRICA ===\\n\\n\" +\n    \"Circuito: {0}\\n\" +\n    \"Estado: {1}\\n\\n\" +\n    \"RESULTADOS:\\n\\n\" +\n    \"1. Voltaje: {2}\\n\" +\n    \"2. Corriente: {3}\\n\" +\n    \"3. Caída tensión: {4}\\n\" +\n    \"4. Factor potencia: {5}\\n\" +\n    \"5. Dimensionado cable: {6}\\n\\n\" +\n    \"DATOS TÉCNICOS:\\n\" +\n    \"- Cable: {7}mm², {8}m\\n\" +\n    \"- Potencia activa: {9:F2} W\\n\" +\n    \"- Potencia aparente: {10:F2} VA\",\n    nombreCircuito,\n    estadoGeneral,\n    resultadoVoltaje,\n    resultadoCorriente,\n    resultadoCaida,\n    resultadoFP,\n    resultadoCable,\n    seccionCable,\n    longitudCable,\n    voltajeMedido * corrienteMedida * factorPotencia,\n    voltajeMedido * corrienteMedida\n);\n\n\u002F\u002F ========================================\n\u002F\u002F MOSTRAR REPORTE\n\u002F\u002F ========================================\n\nMessageBoxIcon icono = instalacionConforme ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n\nMessageBox.Show(reporte, \"Verificación de Instalación\", MessageBoxButtons.OK, icono);\n",[54,8646,8647,8651,8656,8660,8664,8669,8674,8678,8683,8687,8691,8696,8700,8704,8709,8714,8718,8723,8728,8733,8738,8743,8748,8753,8758,8763,8768,8773,8777,8782,8787,8792,8797,8802,8807,8812,8817,8822,8827,8831,8835,8839,8844,8848,8852,8857,8861],{"__ignoreMap":228},[551,8648,8649],{"class":553,"line":554},[551,8650,8157],{},[551,8652,8653],{"class":553,"line":229},[551,8654,8655],{},"\u002F\u002F EVALUACIÓN GENERAL\n",[551,8657,8658],{"class":553,"line":670},[551,8659,8157],{},[551,8661,8662],{"class":553,"line":1136},[551,8663,1139],{"emptyLinePlaceholder":238},[551,8665,8666],{"class":553,"line":1142},[551,8667,8668],{},"bool instalacionConforme = voltajeOK && corrienteOK && caidaTensionOK &&\n",[551,8670,8671],{"class":553,"line":1148},[551,8672,8673],{},"                           factorPotenciaOK && cableDimensionadoOK;\n",[551,8675,8676],{"class":553,"line":1154},[551,8677,1139],{"emptyLinePlaceholder":238},[551,8679,8680],{"class":553,"line":1160},[551,8681,8682],{},"string estadoGeneral = instalacionConforme ? \"CONFORME\" : \"NO CONFORME\";\n",[551,8684,8685],{"class":553,"line":1166},[551,8686,1139],{"emptyLinePlaceholder":238},[551,8688,8689],{"class":553,"line":1172},[551,8690,8157],{},[551,8692,8693],{"class":553,"line":1178},[551,8694,8695],{},"\u002F\u002F CONSTRUCCIÓN DEL REPORTE\n",[551,8697,8698],{"class":553,"line":1184},[551,8699,8157],{},[551,8701,8702],{"class":553,"line":1190},[551,8703,1139],{"emptyLinePlaceholder":238},[551,8705,8706],{"class":553,"line":1472},[551,8707,8708],{},"string reporte = string.Format(\n",[551,8710,8711],{"class":553,"line":1477},[551,8712,8713],{},"    \"=== VERIFICACIÓN DE INSTALACIÓN ELÉCTRICA ===\\n\\n\" +\n",[551,8715,8716],{"class":553,"line":1797},[551,8717,4296],{},[551,8719,8720],{"class":553,"line":1802},[551,8721,8722],{},"    \"Estado: {1}\\n\\n\" +\n",[551,8724,8725],{"class":553,"line":1808},[551,8726,8727],{},"    \"RESULTADOS:\\n\\n\" +\n",[551,8729,8730],{"class":553,"line":1814},[551,8731,8732],{},"    \"1. Voltaje: {2}\\n\" +\n",[551,8734,8735],{"class":553,"line":1820},[551,8736,8737],{},"    \"2. Corriente: {3}\\n\" +\n",[551,8739,8740],{"class":553,"line":1826},[551,8741,8742],{},"    \"3. Caída tensión: {4}\\n\" +\n",[551,8744,8745],{"class":553,"line":1832},[551,8746,8747],{},"    \"4. Factor potencia: {5}\\n\" +\n",[551,8749,8750],{"class":553,"line":1838},[551,8751,8752],{},"    \"5. Dimensionado cable: {6}\\n\\n\" +\n",[551,8754,8755],{"class":553,"line":1844},[551,8756,8757],{},"    \"DATOS TÉCNICOS:\\n\" +\n",[551,8759,8760],{"class":553,"line":1850},[551,8761,8762],{},"    \"- Cable: {7}mm², {8}m\\n\" +\n",[551,8764,8765],{"class":553,"line":1855},[551,8766,8767],{},"    \"- Potencia activa: {9:F2} W\\n\" +\n",[551,8769,8770],{"class":553,"line":1861},[551,8771,8772],{},"    \"- Potencia aparente: {10:F2} VA\",\n",[551,8774,8775],{"class":553,"line":1867},[551,8776,4346],{},[551,8778,8779],{"class":553,"line":1873},[551,8780,8781],{},"    estadoGeneral,\n",[551,8783,8784],{"class":553,"line":1878},[551,8785,8786],{},"    resultadoVoltaje,\n",[551,8788,8789],{"class":553,"line":1883},[551,8790,8791],{},"    resultadoCorriente,\n",[551,8793,8794],{"class":553,"line":1888},[551,8795,8796],{},"    resultadoCaida,\n",[551,8798,8799],{"class":553,"line":4615},[551,8800,8801],{},"    resultadoFP,\n",[551,8803,8804],{"class":553,"line":4620},[551,8805,8806],{},"    resultadoCable,\n",[551,8808,8809],{"class":553,"line":4626},[551,8810,8811],{},"    seccionCable,\n",[551,8813,8814],{"class":553,"line":4631},[551,8815,8816],{},"    longitudCable,\n",[551,8818,8819],{"class":553,"line":4636},[551,8820,8821],{},"    voltajeMedido * corrienteMedida * factorPotencia,\n",[551,8823,8824],{"class":553,"line":4641},[551,8825,8826],{},"    voltajeMedido * corrienteMedida\n",[551,8828,8829],{"class":553,"line":4647},[551,8830,3967],{},[551,8832,8833],{"class":553,"line":4653},[551,8834,1139],{"emptyLinePlaceholder":238},[551,8836,8837],{"class":553,"line":4659},[551,8838,8157],{},[551,8840,8841],{"class":553,"line":4665},[551,8842,8843],{},"\u002F\u002F MOSTRAR REPORTE\n",[551,8845,8846],{"class":553,"line":4671},[551,8847,8157],{},[551,8849,8850],{"class":553,"line":4677},[551,8851,1139],{"emptyLinePlaceholder":238},[551,8853,8854],{"class":553,"line":4683},[551,8855,8856],{},"MessageBoxIcon icono = instalacionConforme ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n",[551,8858,8859],{"class":553,"line":4689},[551,8860,1139],{"emptyLinePlaceholder":238},[551,8862,8863],{"class":553,"line":4695},[551,8864,8865],{},"MessageBox.Show(reporte, \"Verificación de Instalación\", MessageBoxButtons.OK, icono);\n",[13,8867,8868,8870],{},[16,8869,4153],{},"\nCombinamos todos los resultados en un reporte completo y mostramos un icono diferente según el resultado.",[43,8872],{},[331,8874,4465],{"id":4464},[543,8876,8878],{"className":545,"code":8877,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class VerificacionInstalacion\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DE LA INSTALACIÓN\n        \u002F\u002F ========================================\n\n        string nombreCircuito = \"Circuito Taller - Línea 3\";\n\n        \u002F\u002F Parámetros eléctricos medidos\n        double voltajeMedido = 225.0;        \u002F\u002F V\n        double corrienteMedida = 14.8;       \u002F\u002F A\n        double factorPotencia = 0.88;\n\n        \u002F\u002F Datos del cable instalado\n        double longitudCable = 45.0;         \u002F\u002F m\n        double seccionCable = 2.5;           \u002F\u002F mm²\n        double corrienteAdmisible = 21.0;    \u002F\u002F A (tabla para 2.5mm²)\n\n        \u002F\u002F Límites normativos\n        double voltajeNominal = 230.0;       \u002F\u002F V\n        double corrienteCircuito = 16.0;     \u002F\u002F A (protección)\n        double toleranciaVoltaje = 0.10;     \u002F\u002F 10%\n        double caidaMaximaPorcentaje = 0.03; \u002F\u002F 3%\n        double factorPotenciaMinimo = 0.85;\n\n        \u002F\u002F ========================================\n        \u002F\u002F VERIFICACIÓN 1: RANGO DE VOLTAJE\n        \u002F\u002F ========================================\n\n        double voltajeMinimo = voltajeNominal * (1 - toleranciaVoltaje);\n        double voltajeMaximo = voltajeNominal * (1 + toleranciaVoltaje);\n\n        bool voltajeOK = (voltajeMedido >= voltajeMinimo) && (voltajeMedido \u003C= voltajeMaximo);\n\n        string resultadoVoltaje;\n        if (voltajeOK)\n        {\n            resultadoVoltaje = string.Format(\"OK ({0:F1}V está entre {1:F1}V y {2:F1}V)\",\n                voltajeMedido, voltajeMinimo, voltajeMaximo);\n        }\n        else\n        {\n            resultadoVoltaje = string.Format(\"FALLO ({0:F1}V fuera del rango {1:F1}V - {2:F1}V)\",\n                voltajeMedido, voltajeMinimo, voltajeMaximo);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F VERIFICACIÓN 2: CORRIENTE\n        \u002F\u002F ========================================\n\n        bool corrienteOK = (corrienteMedida \u003C= corrienteCircuito);\n\n        string resultadoCorriente;\n        if (corrienteOK)\n        {\n            double porcentajeUso = (corrienteMedida \u002F corrienteCircuito) * 100;\n            resultadoCorriente = string.Format(\"OK ({0:F1}A \u002F {1:F1}A = {2:F1}% de uso)\",\n                corrienteMedida, corrienteCircuito, porcentajeUso);\n        }\n        else\n        {\n            resultadoCorriente = string.Format(\"FALLO ({0:F1}A excede límite de {1:F1}A)\",\n                corrienteMedida, corrienteCircuito);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F VERIFICACIÓN 3: CAÍDA DE TENSIÓN\n        \u002F\u002F ========================================\n\n        double resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n\n        double caidaTension = (2 * longitudCable * corrienteMedida * resistividadCobre) \u002F seccionCable;\n        double porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n        double caidaMaximaVoltios = voltajeNominal * caidaMaximaPorcentaje;\n\n        bool caidaTensionOK = (caidaTension \u003C= caidaMaximaVoltios);\n\n        string resultadoCaida;\n        if (caidaTensionOK)\n        {\n            resultadoCaida = string.Format(\"OK ({0:F2}V = {1:F2}% \u003C {2:F2}%)\",\n                caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n        }\n        else\n        {\n            resultadoCaida = string.Format(\"FALLO ({0:F2}V = {1:F2}% > {2:F2}%)\",\n                caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F VERIFICACIÓN 4: FACTOR DE POTENCIA\n        \u002F\u002F ========================================\n\n        bool factorPotenciaOK = (factorPotencia >= factorPotenciaMinimo);\n\n        string resultadoFP;\n        if (factorPotenciaOK)\n        {\n            resultadoFP = string.Format(\"OK ({0:F2} >= {1:F2})\",\n                factorPotencia, factorPotenciaMinimo);\n        }\n        else\n        {\n            resultadoFP = string.Format(\"BAJO ({0:F2} \u003C {1:F2})\",\n                factorPotencia, factorPotenciaMinimo);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F VERIFICACIÓN 5: DIMENSIONADO CABLE\n        \u002F\u002F ========================================\n\n        bool cableDimensionadoOK = (corrienteAdmisible >= corrienteMedida);\n\n        string resultadoCable;\n        if (cableDimensionadoOK)\n        {\n            double margenSeguridad = ((corrienteAdmisible - corrienteMedida) \u002F corrienteAdmisible) * 100;\n            resultadoCable = string.Format(\"OK ({0}mm² soporta {1:F1}A, medido {2:F1}A, margen {3:F1}%)\",\n                seccionCable, corrienteAdmisible, corrienteMedida, margenSeguridad);\n        }\n        else\n        {\n            resultadoCable = string.Format(\"FALLO ({0}mm² solo soporta {1:F1}A, medido {2:F1}A)\",\n                seccionCable, corrienteAdmisible, corrienteMedida);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F EVALUACIÓN GENERAL\n        \u002F\u002F ========================================\n\n        bool instalacionConforme = voltajeOK && corrienteOK && caidaTensionOK &&\n                                   factorPotenciaOK && cableDimensionadoOK;\n\n        string estadoGeneral = instalacionConforme ? \"CONFORME\" : \"NO CONFORME\";\n\n        \u002F\u002F ========================================\n        \u002F\u002F CONSTRUCCIÓN DEL REPORTE\n        \u002F\u002F ========================================\n\n        string reporte = string.Format(\n            \"=== VERIFICACIÓN DE INSTALACIÓN ELÉCTRICA ===\\n\\n\" +\n            \"Circuito: {0}\\n\" +\n            \"Estado: {1}\\n\\n\" +\n            \"RESULTADOS:\\n\\n\" +\n            \"1. Voltaje: {2}\\n\" +\n            \"2. Corriente: {3}\\n\" +\n            \"3. Caída tensión: {4}\\n\" +\n            \"4. Factor potencia: {5}\\n\" +\n            \"5. Dimensionado cable: {6}\\n\\n\" +\n            \"DATOS TÉCNICOS:\\n\" +\n            \"- Cable: {7}mm², {8}m\\n\" +\n            \"- Potencia activa: {9:F2} W\\n\" +\n            \"- Potencia aparente: {10:F2} VA\",\n            nombreCircuito,\n            estadoGeneral,\n            resultadoVoltaje,\n            resultadoCorriente,\n            resultadoCaida,\n            resultadoFP,\n            resultadoCable,\n            seccionCable,\n            longitudCable,\n            voltajeMedido * corrienteMedida * factorPotencia,\n            voltajeMedido * corrienteMedida\n        );\n\n        \u002F\u002F ========================================\n        \u002F\u002F MOSTRAR REPORTE\n        \u002F\u002F ========================================\n\n        MessageBoxIcon icono = instalacionConforme ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n\n        MessageBox.Show(reporte, \"Verificación de Instalación\", MessageBoxButtons.OK, icono);\n    }\n}\n",[54,8879,8880,8884,8888,8892,8896,8900,8904,8908,8912,8916,8920,8924,8928,8932,8936,8940,8944,8948,8952,8956,8960,8964,8968,8972,8976,8980,8984,8988,8992,8996,9000,9004,9008,9012,9017,9021,9025,9030,9035,9039,9044,9048,9053,9058,9063,9068,9073,9078,9083,9087,9092,9096,9100,9104,9108,9113,9117,9121,9126,9130,9135,9140,9144,9149,9154,9159,9163,9167,9171,9176,9181,9186,9191,9196,9202,9207,9212,9217,9222,9228,9234,9240,9245,9251,9256,9262,9268,9273,9279,9285,9290,9295,9300,9306,9311,9316,9321,9326,9332,9337,9342,9348,9353,9359,9365,9370,9376,9382,9387,9392,9397,9403,9408,9413,9418,9423,9429,9434,9439,9445,9450,9456,9462,9467,9473,9479,9485,9490,9495,9500,9506,9512,9517,9522,9527,9533,9538,9543,9549,9555,9560,9566,9571,9576,9582,9587,9592,9598,9604,9609,9615,9621,9627,9633,9639,9645,9651,9657,9663,9669,9675,9680,9686,9692,9698,9704,9710,9716,9722,9728,9734,9740,9745,9750,9755,9761,9766,9771,9777,9782,9788,9793],{"__ignoreMap":228},[551,8881,8882],{"class":553,"line":554},[551,8883,1123],{},[551,8885,8886],{"class":553,"line":229},[551,8887,1128],{},[551,8889,8890],{"class":553,"line":670},[551,8891,1133],{},[551,8893,8894],{"class":553,"line":1136},[551,8895,1139],{"emptyLinePlaceholder":238},[551,8897,8898],{"class":553,"line":1142},[551,8899,8008],{},[551,8901,8902],{"class":553,"line":1148},[551,8903,1151],{},[551,8905,8906],{"class":553,"line":1154},[551,8907,1157],{},[551,8909,8910],{"class":553,"line":1160},[551,8911,1163],{},[551,8913,8914],{"class":553,"line":1166},[551,8915,1169],{},[551,8917,8918],{"class":553,"line":1172},[551,8919,4511],{},[551,8921,8922],{"class":553,"line":1178},[551,8923,8033],{},[551,8925,8926],{"class":553,"line":1184},[551,8927,4511],{},[551,8929,8930],{"class":553,"line":1190},[551,8931,1139],{"emptyLinePlaceholder":238},[551,8933,8934],{"class":553,"line":1472},[551,8935,8046],{},[551,8937,8938],{"class":553,"line":1477},[551,8939,1139],{"emptyLinePlaceholder":238},[551,8941,8942],{"class":553,"line":1797},[551,8943,8055],{},[551,8945,8946],{"class":553,"line":1802},[551,8947,8060],{},[551,8949,8950],{"class":553,"line":1808},[551,8951,8065],{},[551,8953,8954],{"class":553,"line":1814},[551,8955,8070],{},[551,8957,8958],{"class":553,"line":1820},[551,8959,1139],{"emptyLinePlaceholder":238},[551,8961,8962],{"class":553,"line":1826},[551,8963,8079],{},[551,8965,8966],{"class":553,"line":1832},[551,8967,8084],{},[551,8969,8970],{"class":553,"line":1838},[551,8971,8089],{},[551,8973,8974],{"class":553,"line":1844},[551,8975,8094],{},[551,8977,8978],{"class":553,"line":1850},[551,8979,1139],{"emptyLinePlaceholder":238},[551,8981,8982],{"class":553,"line":1855},[551,8983,8103],{},[551,8985,8986],{"class":553,"line":1861},[551,8987,8108],{},[551,8989,8990],{"class":553,"line":1867},[551,8991,8113],{},[551,8993,8994],{"class":553,"line":1873},[551,8995,8118],{},[551,8997,8998],{"class":553,"line":1878},[551,8999,8123],{},[551,9001,9002],{"class":553,"line":1883},[551,9003,8128],{},[551,9005,9006],{"class":553,"line":1888},[551,9007,1139],{"emptyLinePlaceholder":238},[551,9009,9010],{"class":553,"line":4615},[551,9011,4511],{},[551,9013,9014],{"class":553,"line":4620},[551,9015,9016],{},"        \u002F\u002F VERIFICACIÓN 1: RANGO DE VOLTAJE\n",[551,9018,9019],{"class":553,"line":4626},[551,9020,4511],{},[551,9022,9023],{"class":553,"line":4631},[551,9024,1139],{"emptyLinePlaceholder":238},[551,9026,9027],{"class":553,"line":4636},[551,9028,9029],{},"        double voltajeMinimo = voltajeNominal * (1 - toleranciaVoltaje);\n",[551,9031,9032],{"class":553,"line":4641},[551,9033,9034],{},"        double voltajeMaximo = voltajeNominal * (1 + toleranciaVoltaje);\n",[551,9036,9037],{"class":553,"line":4647},[551,9038,1139],{"emptyLinePlaceholder":238},[551,9040,9041],{"class":553,"line":4653},[551,9042,9043],{},"        bool voltajeOK = (voltajeMedido >= voltajeMinimo) && (voltajeMedido \u003C= voltajeMaximo);\n",[551,9045,9046],{"class":553,"line":4659},[551,9047,1139],{"emptyLinePlaceholder":238},[551,9049,9050],{"class":553,"line":4665},[551,9051,9052],{},"        string resultadoVoltaje;\n",[551,9054,9055],{"class":553,"line":4671},[551,9056,9057],{},"        if (voltajeOK)\n",[551,9059,9060],{"class":553,"line":4677},[551,9061,9062],{},"        {\n",[551,9064,9065],{"class":553,"line":4683},[551,9066,9067],{},"            resultadoVoltaje = string.Format(\"OK ({0:F1}V está entre {1:F1}V y {2:F1}V)\",\n",[551,9069,9070],{"class":553,"line":4689},[551,9071,9072],{},"                voltajeMedido, voltajeMinimo, voltajeMaximo);\n",[551,9074,9075],{"class":553,"line":4695},[551,9076,9077],{},"        }\n",[551,9079,9080],{"class":553,"line":4701},[551,9081,9082],{},"        else\n",[551,9084,9085],{"class":553,"line":4707},[551,9086,9062],{},[551,9088,9089],{"class":553,"line":4713},[551,9090,9091],{},"            resultadoVoltaje = string.Format(\"FALLO ({0:F1}V fuera del rango {1:F1}V - {2:F1}V)\",\n",[551,9093,9094],{"class":553,"line":4719},[551,9095,9072],{},[551,9097,9098],{"class":553,"line":4725},[551,9099,9077],{},[551,9101,9102],{"class":553,"line":4731},[551,9103,1139],{"emptyLinePlaceholder":238},[551,9105,9106],{"class":553,"line":4737},[551,9107,4511],{},[551,9109,9110],{"class":553,"line":4743},[551,9111,9112],{},"        \u002F\u002F VERIFICACIÓN 2: CORRIENTE\n",[551,9114,9115],{"class":553,"line":4749},[551,9116,4511],{},[551,9118,9119],{"class":553,"line":4755},[551,9120,1139],{"emptyLinePlaceholder":238},[551,9122,9123],{"class":553,"line":4761},[551,9124,9125],{},"        bool corrienteOK = (corrienteMedida \u003C= corrienteCircuito);\n",[551,9127,9128],{"class":553,"line":4766},[551,9129,1139],{"emptyLinePlaceholder":238},[551,9131,9132],{"class":553,"line":4771},[551,9133,9134],{},"        string resultadoCorriente;\n",[551,9136,9137],{"class":553,"line":4777},[551,9138,9139],{},"        if (corrienteOK)\n",[551,9141,9142],{"class":553,"line":4782},[551,9143,9062],{},[551,9145,9146],{"class":553,"line":4787},[551,9147,9148],{},"            double porcentajeUso = (corrienteMedida \u002F corrienteCircuito) * 100;\n",[551,9150,9151],{"class":553,"line":4793},[551,9152,9153],{},"            resultadoCorriente = string.Format(\"OK ({0:F1}A \u002F {1:F1}A = {2:F1}% de uso)\",\n",[551,9155,9156],{"class":553,"line":4799},[551,9157,9158],{},"                corrienteMedida, corrienteCircuito, porcentajeUso);\n",[551,9160,9161],{"class":553,"line":4805},[551,9162,9077],{},[551,9164,9165],{"class":553,"line":4811},[551,9166,9082],{},[551,9168,9169],{"class":553,"line":4817},[551,9170,9062],{},[551,9172,9173],{"class":553,"line":4822},[551,9174,9175],{},"            resultadoCorriente = string.Format(\"FALLO ({0:F1}A excede límite de {1:F1}A)\",\n",[551,9177,9178],{"class":553,"line":4827},[551,9179,9180],{},"                corrienteMedida, corrienteCircuito);\n",[551,9182,9184],{"class":553,"line":9183},71,[551,9185,9077],{},[551,9187,9189],{"class":553,"line":9188},72,[551,9190,1139],{"emptyLinePlaceholder":238},[551,9192,9194],{"class":553,"line":9193},73,[551,9195,4511],{},[551,9197,9199],{"class":553,"line":9198},74,[551,9200,9201],{},"        \u002F\u002F VERIFICACIÓN 3: CAÍDA DE TENSIÓN\n",[551,9203,9205],{"class":553,"line":9204},75,[551,9206,4511],{},[551,9208,9210],{"class":553,"line":9209},76,[551,9211,1139],{"emptyLinePlaceholder":238},[551,9213,9215],{"class":553,"line":9214},77,[551,9216,5566],{},[551,9218,9220],{"class":553,"line":9219},78,[551,9221,1139],{"emptyLinePlaceholder":238},[551,9223,9225],{"class":553,"line":9224},79,[551,9226,9227],{},"        double caidaTension = (2 * longitudCable * corrienteMedida * resistividadCobre) \u002F seccionCable;\n",[551,9229,9231],{"class":553,"line":9230},80,[551,9232,9233],{},"        double porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n",[551,9235,9237],{"class":553,"line":9236},81,[551,9238,9239],{},"        double caidaMaximaVoltios = voltajeNominal * caidaMaximaPorcentaje;\n",[551,9241,9243],{"class":553,"line":9242},82,[551,9244,1139],{"emptyLinePlaceholder":238},[551,9246,9248],{"class":553,"line":9247},83,[551,9249,9250],{},"        bool caidaTensionOK = (caidaTension \u003C= caidaMaximaVoltios);\n",[551,9252,9254],{"class":553,"line":9253},84,[551,9255,1139],{"emptyLinePlaceholder":238},[551,9257,9259],{"class":553,"line":9258},85,[551,9260,9261],{},"        string resultadoCaida;\n",[551,9263,9265],{"class":553,"line":9264},86,[551,9266,9267],{},"        if (caidaTensionOK)\n",[551,9269,9271],{"class":553,"line":9270},87,[551,9272,9062],{},[551,9274,9276],{"class":553,"line":9275},88,[551,9277,9278],{},"            resultadoCaida = string.Format(\"OK ({0:F2}V = {1:F2}% \u003C {2:F2}%)\",\n",[551,9280,9282],{"class":553,"line":9281},89,[551,9283,9284],{},"                caidaTension, porcentajeCaida, caidaMaximaPorcentaje * 100);\n",[551,9286,9288],{"class":553,"line":9287},90,[551,9289,9077],{},[551,9291,9293],{"class":553,"line":9292},91,[551,9294,9082],{},[551,9296,9298],{"class":553,"line":9297},92,[551,9299,9062],{},[551,9301,9303],{"class":553,"line":9302},93,[551,9304,9305],{},"            resultadoCaida = string.Format(\"FALLO ({0:F2}V = {1:F2}% > {2:F2}%)\",\n",[551,9307,9309],{"class":553,"line":9308},94,[551,9310,9284],{},[551,9312,9314],{"class":553,"line":9313},95,[551,9315,9077],{},[551,9317,9319],{"class":553,"line":9318},96,[551,9320,1139],{"emptyLinePlaceholder":238},[551,9322,9324],{"class":553,"line":9323},97,[551,9325,4511],{},[551,9327,9329],{"class":553,"line":9328},98,[551,9330,9331],{},"        \u002F\u002F VERIFICACIÓN 4: FACTOR DE POTENCIA\n",[551,9333,9335],{"class":553,"line":9334},99,[551,9336,4511],{},[551,9338,9340],{"class":553,"line":9339},100,[551,9341,1139],{"emptyLinePlaceholder":238},[551,9343,9345],{"class":553,"line":9344},101,[551,9346,9347],{},"        bool factorPotenciaOK = (factorPotencia >= factorPotenciaMinimo);\n",[551,9349,9351],{"class":553,"line":9350},102,[551,9352,1139],{"emptyLinePlaceholder":238},[551,9354,9356],{"class":553,"line":9355},103,[551,9357,9358],{},"        string resultadoFP;\n",[551,9360,9362],{"class":553,"line":9361},104,[551,9363,9364],{},"        if (factorPotenciaOK)\n",[551,9366,9368],{"class":553,"line":9367},105,[551,9369,9062],{},[551,9371,9373],{"class":553,"line":9372},106,[551,9374,9375],{},"            resultadoFP = string.Format(\"OK ({0:F2} >= {1:F2})\",\n",[551,9377,9379],{"class":553,"line":9378},107,[551,9380,9381],{},"                factorPotencia, factorPotenciaMinimo);\n",[551,9383,9385],{"class":553,"line":9384},108,[551,9386,9077],{},[551,9388,9390],{"class":553,"line":9389},109,[551,9391,9082],{},[551,9393,9395],{"class":553,"line":9394},110,[551,9396,9062],{},[551,9398,9400],{"class":553,"line":9399},111,[551,9401,9402],{},"            resultadoFP = string.Format(\"BAJO ({0:F2} \u003C {1:F2})\",\n",[551,9404,9406],{"class":553,"line":9405},112,[551,9407,9381],{},[551,9409,9411],{"class":553,"line":9410},113,[551,9412,9077],{},[551,9414,9416],{"class":553,"line":9415},114,[551,9417,1139],{"emptyLinePlaceholder":238},[551,9419,9421],{"class":553,"line":9420},115,[551,9422,4511],{},[551,9424,9426],{"class":553,"line":9425},116,[551,9427,9428],{},"        \u002F\u002F VERIFICACIÓN 5: DIMENSIONADO CABLE\n",[551,9430,9432],{"class":553,"line":9431},117,[551,9433,4511],{},[551,9435,9437],{"class":553,"line":9436},118,[551,9438,1139],{"emptyLinePlaceholder":238},[551,9440,9442],{"class":553,"line":9441},119,[551,9443,9444],{},"        bool cableDimensionadoOK = (corrienteAdmisible >= corrienteMedida);\n",[551,9446,9448],{"class":553,"line":9447},120,[551,9449,1139],{"emptyLinePlaceholder":238},[551,9451,9453],{"class":553,"line":9452},121,[551,9454,9455],{},"        string resultadoCable;\n",[551,9457,9459],{"class":553,"line":9458},122,[551,9460,9461],{},"        if (cableDimensionadoOK)\n",[551,9463,9465],{"class":553,"line":9464},123,[551,9466,9062],{},[551,9468,9470],{"class":553,"line":9469},124,[551,9471,9472],{},"            double margenSeguridad = ((corrienteAdmisible - corrienteMedida) \u002F corrienteAdmisible) * 100;\n",[551,9474,9476],{"class":553,"line":9475},125,[551,9477,9478],{},"            resultadoCable = string.Format(\"OK ({0}mm² soporta {1:F1}A, medido {2:F1}A, margen {3:F1}%)\",\n",[551,9480,9482],{"class":553,"line":9481},126,[551,9483,9484],{},"                seccionCable, corrienteAdmisible, corrienteMedida, margenSeguridad);\n",[551,9486,9488],{"class":553,"line":9487},127,[551,9489,9077],{},[551,9491,9493],{"class":553,"line":9492},128,[551,9494,9082],{},[551,9496,9498],{"class":553,"line":9497},129,[551,9499,9062],{},[551,9501,9503],{"class":553,"line":9502},130,[551,9504,9505],{},"            resultadoCable = string.Format(\"FALLO ({0}mm² solo soporta {1:F1}A, medido {2:F1}A)\",\n",[551,9507,9509],{"class":553,"line":9508},131,[551,9510,9511],{},"                seccionCable, corrienteAdmisible, corrienteMedida);\n",[551,9513,9515],{"class":553,"line":9514},132,[551,9516,9077],{},[551,9518,9520],{"class":553,"line":9519},133,[551,9521,1139],{"emptyLinePlaceholder":238},[551,9523,9525],{"class":553,"line":9524},134,[551,9526,4511],{},[551,9528,9530],{"class":553,"line":9529},135,[551,9531,9532],{},"        \u002F\u002F EVALUACIÓN GENERAL\n",[551,9534,9536],{"class":553,"line":9535},136,[551,9537,4511],{},[551,9539,9541],{"class":553,"line":9540},137,[551,9542,1139],{"emptyLinePlaceholder":238},[551,9544,9546],{"class":553,"line":9545},138,[551,9547,9548],{},"        bool instalacionConforme = voltajeOK && corrienteOK && caidaTensionOK &&\n",[551,9550,9552],{"class":553,"line":9551},139,[551,9553,9554],{},"                                   factorPotenciaOK && cableDimensionadoOK;\n",[551,9556,9558],{"class":553,"line":9557},140,[551,9559,1139],{"emptyLinePlaceholder":238},[551,9561,9563],{"class":553,"line":9562},141,[551,9564,9565],{},"        string estadoGeneral = instalacionConforme ? \"CONFORME\" : \"NO CONFORME\";\n",[551,9567,9569],{"class":553,"line":9568},142,[551,9570,1139],{"emptyLinePlaceholder":238},[551,9572,9574],{"class":553,"line":9573},143,[551,9575,4511],{},[551,9577,9579],{"class":553,"line":9578},144,[551,9580,9581],{},"        \u002F\u002F CONSTRUCCIÓN DEL REPORTE\n",[551,9583,9585],{"class":553,"line":9584},145,[551,9586,4511],{},[551,9588,9590],{"class":553,"line":9589},146,[551,9591,1139],{"emptyLinePlaceholder":238},[551,9593,9595],{"class":553,"line":9594},147,[551,9596,9597],{},"        string reporte = string.Format(\n",[551,9599,9601],{"class":553,"line":9600},148,[551,9602,9603],{},"            \"=== VERIFICACIÓN DE INSTALACIÓN ELÉCTRICA ===\\n\\n\" +\n",[551,9605,9607],{"class":553,"line":9606},149,[551,9608,4650],{},[551,9610,9612],{"class":553,"line":9611},150,[551,9613,9614],{},"            \"Estado: {1}\\n\\n\" +\n",[551,9616,9618],{"class":553,"line":9617},151,[551,9619,9620],{},"            \"RESULTADOS:\\n\\n\" +\n",[551,9622,9624],{"class":553,"line":9623},152,[551,9625,9626],{},"            \"1. Voltaje: {2}\\n\" +\n",[551,9628,9630],{"class":553,"line":9629},153,[551,9631,9632],{},"            \"2. Corriente: {3}\\n\" +\n",[551,9634,9636],{"class":553,"line":9635},154,[551,9637,9638],{},"            \"3. Caída tensión: {4}\\n\" +\n",[551,9640,9642],{"class":553,"line":9641},155,[551,9643,9644],{},"            \"4. Factor potencia: {5}\\n\" +\n",[551,9646,9648],{"class":553,"line":9647},156,[551,9649,9650],{},"            \"5. Dimensionado cable: {6}\\n\\n\" +\n",[551,9652,9654],{"class":553,"line":9653},157,[551,9655,9656],{},"            \"DATOS TÉCNICOS:\\n\" +\n",[551,9658,9660],{"class":553,"line":9659},158,[551,9661,9662],{},"            \"- Cable: {7}mm², {8}m\\n\" +\n",[551,9664,9666],{"class":553,"line":9665},159,[551,9667,9668],{},"            \"- Potencia activa: {9:F2} W\\n\" +\n",[551,9670,9672],{"class":553,"line":9671},160,[551,9673,9674],{},"            \"- Potencia aparente: {10:F2} VA\",\n",[551,9676,9678],{"class":553,"line":9677},161,[551,9679,4710],{},[551,9681,9683],{"class":553,"line":9682},162,[551,9684,9685],{},"            estadoGeneral,\n",[551,9687,9689],{"class":553,"line":9688},163,[551,9690,9691],{},"            resultadoVoltaje,\n",[551,9693,9695],{"class":553,"line":9694},164,[551,9696,9697],{},"            resultadoCorriente,\n",[551,9699,9701],{"class":553,"line":9700},165,[551,9702,9703],{},"            resultadoCaida,\n",[551,9705,9707],{"class":553,"line":9706},166,[551,9708,9709],{},"            resultadoFP,\n",[551,9711,9713],{"class":553,"line":9712},167,[551,9714,9715],{},"            resultadoCable,\n",[551,9717,9719],{"class":553,"line":9718},168,[551,9720,9721],{},"            seccionCable,\n",[551,9723,9725],{"class":553,"line":9724},169,[551,9726,9727],{},"            longitudCable,\n",[551,9729,9731],{"class":553,"line":9730},170,[551,9732,9733],{},"            voltajeMedido * corrienteMedida * factorPotencia,\n",[551,9735,9737],{"class":553,"line":9736},171,[551,9738,9739],{},"            voltajeMedido * corrienteMedida\n",[551,9741,9743],{"class":553,"line":9742},172,[551,9744,4758],{},[551,9746,9748],{"class":553,"line":9747},173,[551,9749,1139],{"emptyLinePlaceholder":238},[551,9751,9753],{"class":553,"line":9752},174,[551,9754,4511],{},[551,9756,9758],{"class":553,"line":9757},175,[551,9759,9760],{},"        \u002F\u002F MOSTRAR REPORTE\n",[551,9762,9764],{"class":553,"line":9763},176,[551,9765,4511],{},[551,9767,9769],{"class":553,"line":9768},177,[551,9770,1139],{"emptyLinePlaceholder":238},[551,9772,9774],{"class":553,"line":9773},178,[551,9775,9776],{},"        MessageBoxIcon icono = instalacionConforme ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n",[551,9778,9780],{"class":553,"line":9779},179,[551,9781,1139],{"emptyLinePlaceholder":238},[551,9783,9785],{"class":553,"line":9784},180,[551,9786,9787],{},"        MessageBox.Show(reporte, \"Verificación de Instalación\", MessageBoxButtons.OK, icono);\n",[551,9789,9791],{"class":553,"line":9790},181,[551,9792,1187],{},[551,9794,9796],{"class":553,"line":9795},182,[551,9797,1193],{},[43,9799],{},[46,9801,4852],{"id":4851},[331,9803,9805],{"id":9804},"evaluación-de-cortocircuito-short-circuit-evaluation","Evaluación de cortocircuito (short-circuit evaluation)",[13,9807,9808,9809,4842,9811,9813],{},"Los operadores ",[54,9810,7442],{},[54,9812,7450],{}," son \"perezosos\": si el resultado ya es obvio, no evalúan el resto.",[13,9815,9816,416],{},[16,9817,9818],{},"Con AND (&&)",[543,9820,9822],{"className":545,"code":9821,"language":547,"meta":228,"style":228},"bool a = false;\nbool b = ExpresionCompleja();  \u002F\u002F Esta función NO se ejecutará\n\nbool resultado = a && b;  \u002F\u002F false (porque a ya es false)\n",[54,9823,9824,9829,9834,9838],{"__ignoreMap":228},[551,9825,9826],{"class":553,"line":554},[551,9827,9828],{},"bool a = false;\n",[551,9830,9831],{"class":553,"line":229},[551,9832,9833],{},"bool b = ExpresionCompleja();  \u002F\u002F Esta función NO se ejecutará\n",[551,9835,9836],{"class":553,"line":670},[551,9837,1139],{"emptyLinePlaceholder":238},[551,9839,9840],{"class":553,"line":1136},[551,9841,9842],{},"bool resultado = a && b;  \u002F\u002F false (porque a ya es false)\n",[13,9844,9845,9846,9848,9849,9851,9852,9854,9855,73,9858,41],{},"Si ",[54,9847,955],{}," es ",[54,9850,2857],{},", el resultado siempre será ",[54,9853,2857],{},", así que C# ",[16,9856,9857],{},"no evalúa",[54,9859,9860],{},"b",[13,9862,9863,416],{},[16,9864,9865],{},"Con OR (||)",[543,9867,9869],{"className":545,"code":9868,"language":547,"meta":228,"style":228},"bool a = true;\nbool b = ExpresionCompleja();  \u002F\u002F Esta función NO se ejecutará\n\nbool resultado = a || b;  \u002F\u002F true (porque a ya es true)\n",[54,9870,9871,9876,9880,9884],{"__ignoreMap":228},[551,9872,9873],{"class":553,"line":554},[551,9874,9875],{},"bool a = true;\n",[551,9877,9878],{"class":553,"line":229},[551,9879,9833],{},[551,9881,9882],{"class":553,"line":670},[551,9883,1139],{"emptyLinePlaceholder":238},[551,9885,9886],{"class":553,"line":1136},[551,9887,9888],{},"bool resultado = a || b;  \u002F\u002F true (porque a ya es true)\n",[13,9890,9891,9894],{},[16,9892,9893],{},"Uso práctico",": Evitar errores de división por cero",[543,9896,9898],{"className":545,"code":9897,"language":547,"meta":228,"style":228},"double divisor = 0;\ndouble dividendo = 10;\n\n\u002F\u002F Peligroso: siempre divide, puede dar error\nif (dividendo \u002F divisor > 5) { }  \u002F\u002F ERROR: divide por cero\n\n\u002F\u002F Seguro: solo divide si divisor != 0\nif (divisor != 0 && (dividendo \u002F divisor > 5))\n{\n    \u002F\u002F Solo entra aquí si divisor != 0\n}\n",[54,9899,9900,9905,9910,9914,9919,9924,9928,9933,9938,9942,9947],{"__ignoreMap":228},[551,9901,9902],{"class":553,"line":554},[551,9903,9904],{},"double divisor = 0;\n",[551,9906,9907],{"class":553,"line":229},[551,9908,9909],{},"double dividendo = 10;\n",[551,9911,9912],{"class":553,"line":670},[551,9913,1139],{"emptyLinePlaceholder":238},[551,9915,9916],{"class":553,"line":1136},[551,9917,9918],{},"\u002F\u002F Peligroso: siempre divide, puede dar error\n",[551,9920,9921],{"class":553,"line":1142},[551,9922,9923],{},"if (dividendo \u002F divisor > 5) { }  \u002F\u002F ERROR: divide por cero\n",[551,9925,9926],{"class":553,"line":1148},[551,9927,1139],{"emptyLinePlaceholder":238},[551,9929,9930],{"class":553,"line":1154},[551,9931,9932],{},"\u002F\u002F Seguro: solo divide si divisor != 0\n",[551,9934,9935],{"class":553,"line":1160},[551,9936,9937],{},"if (divisor != 0 && (dividendo \u002F divisor > 5))\n",[551,9939,9940],{"class":553,"line":1166},[551,9941,1151],{},[551,9943,9944],{"class":553,"line":1172},[551,9945,9946],{},"    \u002F\u002F Solo entra aquí si divisor != 0\n",[551,9948,9949],{"class":553,"line":1178},[551,9950,1193],{},[331,9952,9954],{"id":9953},"operadores-bit-a-bit","Operadores bit a bit",[13,9956,9957],{},"Para manipulación de bits (poco común en EPLAN, pero útil para flags):",[543,9959,9961],{"className":545,"code":9960,"language":547,"meta":228,"style":228},"int a = 5;   \u002F\u002F 0101 en binario\nint b = 3;   \u002F\u002F 0011 en binario\n\nint andBit = a & b;   \u002F\u002F 0001 = 1\nint orBit = a | b;    \u002F\u002F 0111 = 7\nint xorBit = a ^ b;   \u002F\u002F 0110 = 6\nint notBit = ~a;      \u002F\u002F 1010 (invertido)\n",[54,9962,9963,9968,9973,9977,9982,9987,9992],{"__ignoreMap":228},[551,9964,9965],{"class":553,"line":554},[551,9966,9967],{},"int a = 5;   \u002F\u002F 0101 en binario\n",[551,9969,9970],{"class":553,"line":229},[551,9971,9972],{},"int b = 3;   \u002F\u002F 0011 en binario\n",[551,9974,9975],{"class":553,"line":670},[551,9976,1139],{"emptyLinePlaceholder":238},[551,9978,9979],{"class":553,"line":1136},[551,9980,9981],{},"int andBit = a & b;   \u002F\u002F 0001 = 1\n",[551,9983,9984],{"class":553,"line":1142},[551,9985,9986],{},"int orBit = a | b;    \u002F\u002F 0111 = 7\n",[551,9988,9989],{"class":553,"line":1148},[551,9990,9991],{},"int xorBit = a ^ b;   \u002F\u002F 0110 = 6\n",[551,9993,9994],{"class":553,"line":1154},[551,9995,9996],{},"int notBit = ~a;      \u002F\u002F 1010 (invertido)\n",[13,9998,9999,10001],{},[16,10000,9893],{},": Trabajar con flags de EPLAN (lo veremos en capítulos avanzados).",[331,10003,10005],{"id":10004},"operador-de-coalescencia-nula","Operador de coalescencia nula (??)",[13,10007,10008,10009,416],{},"Para valores que pueden ser ",[54,10010,10011],{},"null",[543,10013,10015],{"className":545,"code":10014,"language":547,"meta":228,"style":228},"string nombreProyecto = ObtenerNombre();  \u002F\u002F Puede devolver null\n\nstring nombreFinal = nombreProyecto ?? \"Sin nombre\";\n\u002F\u002F Si nombreProyecto es null, usa \"Sin nombre\"\n",[54,10016,10017,10022,10026,10031],{"__ignoreMap":228},[551,10018,10019],{"class":553,"line":554},[551,10020,10021],{},"string nombreProyecto = ObtenerNombre();  \u002F\u002F Puede devolver null\n",[551,10023,10024],{"class":553,"line":229},[551,10025,1139],{"emptyLinePlaceholder":238},[551,10027,10028],{"class":553,"line":670},[551,10029,10030],{},"string nombreFinal = nombreProyecto ?? \"Sin nombre\";\n",[551,10032,10033],{"class":553,"line":1136},[551,10034,10035],{},"\u002F\u002F Si nombreProyecto es null, usa \"Sin nombre\"\n",[13,10037,10038],{},"Equivalente a:",[543,10040,10042],{"className":545,"code":10041,"language":547,"meta":228,"style":228},"string nombreFinal;\nif (nombreProyecto != null)\n{\n    nombreFinal = nombreProyecto;\n}\nelse\n{\n    nombreFinal = \"Sin nombre\";\n}\n",[54,10043,10044,10049,10054,10058,10063,10067,10071,10075,10080],{"__ignoreMap":228},[551,10045,10046],{"class":553,"line":554},[551,10047,10048],{},"string nombreFinal;\n",[551,10050,10051],{"class":553,"line":229},[551,10052,10053],{},"if (nombreProyecto != null)\n",[551,10055,10056],{"class":553,"line":670},[551,10057,1151],{},[551,10059,10060],{"class":553,"line":1136},[551,10061,10062],{},"    nombreFinal = nombreProyecto;\n",[551,10064,10065],{"class":553,"line":1142},[551,10066,1193],{},[551,10068,10069],{"class":553,"line":1148},[551,10070,3704],{},[551,10072,10073],{"class":553,"line":1154},[551,10074,1151],{},[551,10076,10077],{"class":553,"line":1160},[551,10078,10079],{},"    nombreFinal = \"Sin nombre\";\n",[551,10081,10082],{"class":553,"line":1166},[551,10083,1193],{},[331,10085,10087],{"id":10086},"mejores-prácticas-con-expresiones","Mejores prácticas con expresiones",[13,10089,10090],{},[16,10091,10092],{},"1. Divide expresiones complejas en pasos",[543,10094,10096],{"className":545,"code":10095,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: difícil de leer y depurar\nbool ok = (v >= vMin && v \u003C= vMax) && (i \u003C= iMax) && ((2*l*i*r)\u002Fs \u003C= vMax*0.03);\n\n\u002F\u002F Bien: cada verificación es clara\nbool voltajeOK = (voltaje >= voltajeMinimo) && (voltaje \u003C= voltajeMaximo);\nbool corrienteOK = (corriente \u003C= corrienteMaxima);\ndouble caidaTension = (2 * longitud * corriente * resistividad) \u002F seccion;\nbool caidaOK = (caidaTension \u003C= voltajeMaximo * 0.03);\n\nbool todoOK = voltajeOK && corrienteOK && caidaOK;\n",[54,10097,10098,10103,10108,10112,10117,10122,10127,10132,10137,10141],{"__ignoreMap":228},[551,10099,10100],{"class":553,"line":554},[551,10101,10102],{},"\u002F\u002F Mal: difícil de leer y depurar\n",[551,10104,10105],{"class":553,"line":229},[551,10106,10107],{},"bool ok = (v >= vMin && v \u003C= vMax) && (i \u003C= iMax) && ((2*l*i*r)\u002Fs \u003C= vMax*0.03);\n",[551,10109,10110],{"class":553,"line":670},[551,10111,1139],{"emptyLinePlaceholder":238},[551,10113,10114],{"class":553,"line":1136},[551,10115,10116],{},"\u002F\u002F Bien: cada verificación es clara\n",[551,10118,10119],{"class":553,"line":1142},[551,10120,10121],{},"bool voltajeOK = (voltaje >= voltajeMinimo) && (voltaje \u003C= voltajeMaximo);\n",[551,10123,10124],{"class":553,"line":1148},[551,10125,10126],{},"bool corrienteOK = (corriente \u003C= corrienteMaxima);\n",[551,10128,10129],{"class":553,"line":1154},[551,10130,10131],{},"double caidaTension = (2 * longitud * corriente * resistividad) \u002F seccion;\n",[551,10133,10134],{"class":553,"line":1160},[551,10135,10136],{},"bool caidaOK = (caidaTension \u003C= voltajeMaximo * 0.03);\n",[551,10138,10139],{"class":553,"line":1166},[551,10140,1139],{"emptyLinePlaceholder":238},[551,10142,10143],{"class":553,"line":1172},[551,10144,10145],{},"bool todoOK = voltajeOK && corrienteOK && caidaOK;\n",[13,10147,10148],{},[16,10149,10150],{},"2. Usa variables intermedias con nombres descriptivos",[543,10152,10154],{"className":545,"code":10153,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\ndouble x = (v * i * 1.732 * 0.85) \u002F 1000;\n\n\u002F\u002F Bien\ndouble voltaje = 400.0;\ndouble corriente = 50.0;\ndouble raizDeTres = 1.732;\ndouble factorPotencia = 0.85;\ndouble potenciaKW = (voltaje * corriente * raizDeTres * factorPotencia) \u002F 1000;\n\u002F\u002F O mejor aún:\ndouble potenciaKW = (voltaje * corriente * Math.Sqrt(3) * factorPotencia) \u002F 1000;\n",[54,10155,10156,10160,10165,10169,10173,10178,10183,10188,10192,10197,10202],{"__ignoreMap":228},[551,10157,10158],{"class":553,"line":554},[551,10159,2142],{},[551,10161,10162],{"class":553,"line":229},[551,10163,10164],{},"double x = (v * i * 1.732 * 0.85) \u002F 1000;\n",[551,10166,10167],{"class":553,"line":670},[551,10168,1139],{"emptyLinePlaceholder":238},[551,10170,10171],{"class":553,"line":1136},[551,10172,2156],{},[551,10174,10175],{"class":553,"line":1142},[551,10176,10177],{},"double voltaje = 400.0;\n",[551,10179,10180],{"class":553,"line":1148},[551,10181,10182],{},"double corriente = 50.0;\n",[551,10184,10185],{"class":553,"line":1154},[551,10186,10187],{},"double raizDeTres = 1.732;\n",[551,10189,10190],{"class":553,"line":1160},[551,10191,5247],{},[551,10193,10194],{"class":553,"line":1166},[551,10195,10196],{},"double potenciaKW = (voltaje * corriente * raizDeTres * factorPotencia) \u002F 1000;\n",[551,10198,10199],{"class":553,"line":1172},[551,10200,10201],{},"\u002F\u002F O mejor aún:\n",[551,10203,10204],{"class":553,"line":1178},[551,10205,10206],{},"double potenciaKW = (voltaje * corriente * Math.Sqrt(3) * factorPotencia) \u002F 1000;\n",[13,10208,10209],{},[16,10210,10211],{},"3. Comenta fórmulas complejas",[543,10213,10215],{"className":545,"code":10214,"language":547,"meta":228,"style":228},"\u002F\u002F Sección mínima de cable según ITC-BT-19\n\u002F\u002F S = (2 * L * I) \u002F (γ * ΔU)\n\u002F\u002F donde: γ = conductividad (56 m\u002FΩ·mm² para Cu)\n\u002F\u002F        ΔU = caída de tensión admisible\ndouble seccionMinima = (2 * longitudMetros * corrienteAmperios) \u002F\n                       (56 * caidaTensionAdmisible);\n",[54,10216,10217,10222,10227,10232,10237,10242],{"__ignoreMap":228},[551,10218,10219],{"class":553,"line":554},[551,10220,10221],{},"\u002F\u002F Sección mínima de cable según ITC-BT-19\n",[551,10223,10224],{"class":553,"line":229},[551,10225,10226],{},"\u002F\u002F S = (2 * L * I) \u002F (γ * ΔU)\n",[551,10228,10229],{"class":553,"line":670},[551,10230,10231],{},"\u002F\u002F donde: γ = conductividad (56 m\u002FΩ·mm² para Cu)\n",[551,10233,10234],{"class":553,"line":1136},[551,10235,10236],{},"\u002F\u002F        ΔU = caída de tensión admisible\n",[551,10238,10239],{"class":553,"line":1142},[551,10240,10241],{},"double seccionMinima = (2 * longitudMetros * corrienteAmperios) \u002F\n",[551,10243,10244],{"class":553,"line":1148},[551,10245,10246],{},"                       (56 * caidaTensionAdmisible);\n",[331,10248,5309],{"id":5308},[367,10250,10252],{"id":10251},"error-1-confundir-con","Error 1: Confundir = con ==",[13,10254,10255,10257],{},[16,10256,5318],{},": Asignación en lugar de comparación.",[543,10259,10261],{"className":545,"code":10260,"language":547,"meta":228,"style":228},"int voltaje = 230;\n\nif (voltaje = 400)  \u002F\u002F ERROR: asignación, no comparación\n{\n    \u002F\u002F Este bloque siempre se ejecuta\n}\n",[54,10262,10263,10268,10272,10277,10281,10286],{"__ignoreMap":228},[551,10264,10265],{"class":553,"line":554},[551,10266,10267],{},"int voltaje = 230;\n",[551,10269,10270],{"class":553,"line":229},[551,10271,1139],{"emptyLinePlaceholder":238},[551,10273,10274],{"class":553,"line":670},[551,10275,10276],{},"if (voltaje = 400)  \u002F\u002F ERROR: asignación, no comparación\n",[551,10278,10279],{"class":553,"line":1136},[551,10280,1151],{},[551,10282,10283],{"class":553,"line":1142},[551,10284,10285],{},"    \u002F\u002F Este bloque siempre se ejecuta\n",[551,10287,10288],{"class":553,"line":1148},[551,10289,1193],{},[13,10291,10292,416],{},[16,10293,1983],{},[543,10295,10297],{"className":545,"code":10296,"language":547,"meta":228,"style":228},"if (voltaje == 400)  \u002F\u002F Comparación correcta\n{\n    \u002F\u002F Solo entra si voltaje es 400\n}\n",[54,10298,10299,10304,10308,10313],{"__ignoreMap":228},[551,10300,10301],{"class":553,"line":554},[551,10302,10303],{},"if (voltaje == 400)  \u002F\u002F Comparación correcta\n",[551,10305,10306],{"class":553,"line":229},[551,10307,1151],{},[551,10309,10310],{"class":553,"line":670},[551,10311,10312],{},"    \u002F\u002F Solo entra si voltaje es 400\n",[551,10314,10315],{"class":553,"line":1136},[551,10316,1193],{},[43,10318],{},[367,10320,10322],{"id":10321},"error-2-olvidar-paréntesis-en-expresiones-mixtas","Error 2: Olvidar paréntesis en expresiones mixtas",[13,10324,10325,10327],{},[16,10326,5318],{},": Resultado inesperado por precedencia.",[543,10329,10331],{"className":545,"code":10330,"language":547,"meta":228,"style":228},"bool ok = voltaje > 207 && voltaje \u003C 253 || corriente \u003C 16;\n\u002F\u002F ¿Qué se evalúa primero?\n",[54,10332,10333,10337],{"__ignoreMap":228},[551,10334,10335],{"class":553,"line":554},[551,10336,7579],{},[551,10338,10339],{"class":553,"line":229},[551,10340,10341],{},"\u002F\u002F ¿Qué se evalúa primero?\n",[13,10343,10344,10346],{},[16,10345,1983],{},": Usa paréntesis",[543,10348,10349],{"className":545,"code":7593,"language":547,"meta":228,"style":228},[54,10350,10351],{"__ignoreMap":228},[551,10352,10353],{"class":553,"line":554},[551,10354,7593],{},[43,10356],{},[367,10358,10360],{"id":10359},"error-3-división-entera-cuando-esperas-decimal","Error 3: División entera cuando esperas decimal",[13,10362,10363],{},"Ya lo vimos en el capítulo anterior, pero es tan común que vale la pena repetirlo:",[543,10365,10367],{"className":545,"code":10366,"language":547,"meta":228,"style":228},"int total = 100;\nint partes = 3;\ndouble resultado = total \u002F partes;  \u002F\u002F 33.0, no 33.333...\n",[54,10368,10369,10374,10379],{"__ignoreMap":228},[551,10370,10371],{"class":553,"line":554},[551,10372,10373],{},"int total = 100;\n",[551,10375,10376],{"class":553,"line":229},[551,10377,10378],{},"int partes = 3;\n",[551,10380,10381],{"class":553,"line":670},[551,10382,10383],{},"double resultado = total \u002F partes;  \u002F\u002F 33.0, no 33.333...\n",[13,10385,10386,416],{},[16,10387,1983],{},[543,10389,10391],{"className":545,"code":10390,"language":547,"meta":228,"style":228},"double resultado = (double)total \u002F partes;  \u002F\u002F 33.333...\n",[54,10392,10393],{"__ignoreMap":228},[551,10394,10395],{"class":553,"line":554},[551,10396,10390],{},[43,10398],{},[46,10400,5452],{"id":5451},[331,10402,10404],{"id":10403},"desafío-1-selector-de-cable-automático","Desafío 1: Selector de cable automático",[13,10406,10407,10409],{},[16,10408,5464],{},": Media",[13,10411,10412],{},"Crea un script que dados:",[126,10414,10415,10418,10421],{},[88,10416,10417],{},"Corriente del circuito",[88,10419,10420],{},"Longitud del cable",[88,10422,10423],{},"Caída de tensión máxima permitida",[13,10425,10426],{},"Determine la sección mínima necesaria de cable y sugiera la sección normalizada más cercana (1.5, 2.5, 4, 6, 10, 16 mm²).",[5487,10428,10429,10431,10434],{},[5490,10430,5492],{},[13,10432,10433],{},"Usa la fórmula: S = (2 × L × I × ρ) \u002F ΔV",[13,10435,10436],{},"Luego compara el resultado con cada sección normalizada hasta encontrar la primera que sea mayor o igual.",[43,10438],{},[331,10440,10442],{"id":10441},"desafío-2-calculadora-de-corrección-de-factor-de-potencia","Desafío 2: Calculadora de corrección de factor de potencia",[13,10444,10445,10447],{},[16,10446,5464],{},": Alta",[13,10449,10450],{},"Crea un script que:",[126,10452,10453,10456,10459],{},[88,10454,10455],{},"Reciba: potencia activa, factor de potencia actual, factor de potencia objetivo",[88,10457,10458],{},"Calcule: capacidad del banco de capacitores necesario (kVAr)",[88,10460,10461],{},"Valide: que el factor de potencia objetivo sea mayor que el actual",[13,10463,10464],{},"Fórmulas:",[126,10466,10467,10470],{},[88,10468,10469],{},"Qc = P × (tan(φ1) - tan(φ2))",[88,10471,10472],{},"donde φ = acos(factor de potencia)",[5487,10474,10475,10477],{},[5490,10476,5492],{},[13,10478,10479,10480,10483,10484,10487],{},"Usa ",[54,10481,10482],{},"Math.Acos()"," para obtener el ángulo a partir del factor de potencia, y ",[54,10485,10486],{},"Math.Tan()"," para la tangente.",[43,10489],{},[331,10491,10493],{"id":10492},"desafío-3-verificador-de-cortocircuito","Desafío 3: Verificador de cortocircuito",[13,10495,10496,10447],{},[16,10497,5464],{},[13,10499,10500],{},"Calcula la corriente de cortocircuito en el extremo de un cable y verifica si el poder de corte del interruptor es suficiente.",[13,10502,10503],{},"Datos:",[126,10505,10506,10509,10512],{},[88,10507,10508],{},"Corriente de cortocircuito en el origen (Icc)",[88,10510,10511],{},"Impedancia del cable: Z = (ρ × L) \u002F S",[88,10513,10514],{},"Icc en el extremo = V \u002F Z_total",[13,10516,10517],{},"Valida que el interruptor tenga capacidad suficiente.",[43,10519],{},[46,10521,10523],{"id":10522},"recursos-adicionales","Recursos adicionales",[126,10525,10526,10533],{},[88,10527,10528],{},[955,10529,10532],{"href":10530,"rel":10531},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Foperators\u002F",[959],"Documentación de C# - Operadores",[88,10534],{},[43,10536],{},[46,10538,5728],{"id":5727},[331,10540,10542],{"id":10541},"p-cuándo-uso-y-cuándo-uso","P: ¿Cuándo uso && y cuándo uso ||?",[13,10544,10545,5755,10547,10549,10550,10553,10554,10556,10557,10559],{},[16,10546,5737],{},[54,10548,7442],{}," (AND) cuando ",[16,10551,10552],{},"todas"," las condiciones deben cumplirse. Usa ",[54,10555,7450],{}," (OR) cuando ",[16,10558,7058],{}," debe cumplirse. Piensa: \"Voltaje OK Y corriente OK\" usa &&. \"Voltaje fuera de rango O corriente excesiva\" usa ||.",[331,10561,10563],{"id":10562},"p-por-qué-a-veces-uso-paréntesis-en-expresiones-y-a-veces-no","P: ¿Por qué a veces uso paréntesis en expresiones y a veces no?",[13,10565,10566,10568],{},[16,10567,5737],{}," Los paréntesis fuerzan el orden de evaluación y mejoran la legibilidad. Siempre úsalos cuando combines operadores diferentes (aritméticos con lógicos) o cuando tengas dudas sobre precedencia.",[331,10570,10572],{"id":10571},"p-cuál-es-la-diferencia-entre-i-y-i","P: ¿Cuál es la diferencia entre i++ y ++i?",[13,10574,10575,73,10577,10580,10581,10584],{},[16,10576,5737],{},[54,10578,10579],{},"i++"," (postfijo) devuelve el valor actual y luego incrementa. ",[54,10582,10583],{},"++i"," (prefijo) incrementa primero y luego devuelve el nuevo valor. En la práctica, úsalos en líneas separadas y no habrá diferencia.",[331,10586,10588],{"id":10587},"p-puedo-comparar-dos-double-con","P: ¿Puedo comparar dos double con == ?",[13,10590,10591,10593,10594,41],{},[16,10592,5737],{}," Técnicamente sí, pero no es recomendable por problemas de precisión de punto flotante. Es mejor comparar con una tolerancia: ",[54,10595,10596],{},"Math.Abs(a - b) \u003C 0.0001",[331,10598,10600],{"id":10599},"p-qué-pasa-si-divido-por-cero","P: ¿Qué pasa si divido por cero?",[13,10602,10603,10605,10606,10609],{},[16,10604,5737],{}," Con enteros, lanza una excepción (error). Con double, devuelve ",[54,10607,10608],{},"Infinity",". Siempre valida que el divisor no sea cero antes de dividir.",[43,10611],{},[46,10613,10615],{"id":10614},"checklist-de-completitud","Checklist de completitud",[13,10617,10618],{},"Antes de pasar al siguiente capítulo, asegúrate de:",[126,10620,10622,10628,10634,10640,10646,10652,10658,10664],{"className":10621},[275],[88,10623,10625,10627],{"className":10624},[279],[281,10626],{"disabled":238,"type":283}," Entender todos los operadores aritméticos (incluyendo % y ++)",[88,10629,10631,10633],{"className":10630},[279],[281,10632],{"disabled":238,"type":283}," Poder usar operadores de comparación para evaluar condiciones",[88,10635,10637,10639],{"className":10636},[279],[281,10638],{"disabled":238,"type":283}," Saber combinar condiciones con &&, ||, y !",[88,10641,10643,10645],{"className":10642},[279],[281,10644],{"disabled":238,"type":283}," Entender el orden de precedencia de operadores",[88,10647,10649,10651],{"className":10648},[279],[281,10650],{"disabled":238,"type":283}," Haber ejecutado exitosamente el script de verificación",[88,10653,10655,10657],{"className":10654},[279],[281,10656],{"disabled":238,"type":283}," Poder construir expresiones complejas para cálculos eléctricos",[88,10659,10661,10663],{"className":10660},[279],[281,10662],{"disabled":238,"type":283}," Saber dividir expresiones complejas en pasos más simples",[88,10665,10667,10669],{"className":10666},[279],[281,10668],{"disabled":238,"type":283}," (Opcional) Haber intentado al menos un desafío",[43,10671],{},[13,10673,10674,10676,10677,10680,10681,93,10684],{},[31,10675,657],{},": Enero 2025\n",[31,10678,10679],{},"Tiempo de lectura estimado",": 45-50 minutos\n",[31,10682,10683],{},"Código de ejemplo",[54,10685,10686],{},"code\u002Fcap-04\u002F",[660,10688,662],{},{"title":228,"searchDepth":229,"depth":229,"links":10690},[10691,10692,10693,10694,10702,10712,10719,10724,10725,10732],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":10695},[10696,10697,10698,10699,10700,10701],{"id":5995,"depth":670,"text":5996},{"id":6045,"depth":670,"text":6046},{"id":6579,"depth":670,"text":6580},{"id":6875,"depth":670,"text":6876},{"id":7349,"depth":670,"text":7350},{"id":7663,"depth":670,"text":7664},{"id":4024,"depth":229,"text":4025,"children":10703},[10704,10705,10706,10707,10708,10709,10710,10711],{"id":7981,"depth":670,"text":7982},{"id":8146,"depth":670,"text":8147},{"id":8252,"depth":670,"text":8253},{"id":8344,"depth":670,"text":8345},{"id":8462,"depth":670,"text":8463},{"id":8548,"depth":670,"text":8549},{"id":8640,"depth":670,"text":8641},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":10713},[10714,10715,10716,10717,10718],{"id":9804,"depth":670,"text":9805},{"id":9953,"depth":670,"text":9954},{"id":10004,"depth":670,"text":10005},{"id":10086,"depth":670,"text":10087},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":5452,"children":10720},[10721,10722,10723],{"id":10403,"depth":670,"text":10404},{"id":10441,"depth":670,"text":10442},{"id":10492,"depth":670,"text":10493},{"id":10522,"depth":229,"text":10523},{"id":5727,"depth":229,"text":5728,"children":10726},[10727,10728,10729,10730,10731],{"id":10541,"depth":670,"text":10542},{"id":10562,"depth":670,"text":10563},{"id":10571,"depth":670,"text":10572},{"id":10587,"depth":670,"text":10588},{"id":10599,"depth":670,"text":10600},{"id":10614,"depth":229,"text":10615},"Operaciones y expresiones en C# para cálculos eléctricos: practica para programar en C# y automatizar EPLAN Electric P8 con confianza.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-04-operaciones-expresiones",{"title":5871,"description":10733},"guia\u002Ffundamentos\u002Fcap-04-operaciones-expresiones","P8jN45FQ0NypCsgLw-gbaW1IZJYnjCha-kdHx07qWF8",{"id":10740,"title":10741,"body":10742,"description":16754,"extension":236,"meta":16755,"navigation":238,"path":16756,"seo":16757,"stem":16758,"tagline":242,"__hash__":16759},"guia\u002Fguia\u002Ffundamentos\u002Fcap-05-control-flujo-if-else.md","Capítulo 5: Condicionales if\u002Felse en C#",{"type":7,"value":10743,"toc":16708},[10744,10755,10757,10759,10761,10809,10811,10813,10815,10829,10831,10833,10838,10840,10854,10859,10861,10863,10867,10873,10907,10914,10916,10920,10923,10946,10950,10982,10987,11009,11013,11055,11059,11064,11099,11104,11140,11145,11186,11190,11197,11211,11217,11225,11231,11252,11254,11258,11266,11305,11309,11362,11366,11372,11379,11383,11388,11437,11442,11491,11496,11544,11546,11550,11557,11633,11652,11656,11773,11777,11902,11906,11912,11918,11920,11924,11930,11975,11979,12081,12085,12249,12253,12256,12324,12330,12358,12361,12363,12367,12374,12383,12386,12425,12429,12434,12453,12458,12478,12483,12502,12506,12512,12537,12542,12623,12627,12632,12640,12645,12656,12658,12662,12665,12669,12706,12738,12742,12778,12781,12817,12821,12906,12908,12910,12914,12918,13014,13016,13020,13151,13156,13158,13162,13327,13332,13334,13338,13552,13557,13559,13563,13643,13645,13649,13769,13774,13776,13780,14011,14016,14018,14022,14287,14289,14291,15687,15689,15691,15695,15701,15738,15745,15802,15806,15813,15940,15944,15947,16093,16095,16100,16154,16159,16236,16241,16308,16310,16314,16343,16347,16368,16370,16374,16377,16379,16383,16413,16417,16439,16441,16443,16447,16451,16454,16468,16471,16478,16480,16484,16489,16492,16503,16506,16513,16515,16519,16523,16525,16542,16549,16551,16553,16565,16567,16569,16573,16591,16595,16600,16604,16612,16616,16621,16625,16630,16632,16634,16636,16692,16694,16706],[10,10745,10746],{},[13,10747,10748,19,10750,19,10753,262],{},[16,10749,256],{},[16,10751,10752],{},"Sección 2: Lógica de programación",[16,10754,25],{},[43,10756],{},[46,10758,268],{"id":267},[13,10760,702],{},[126,10762,10764,10773,10782,10791,10800],{"className":10763},[275],[88,10765,10767,73,10769,10772],{"className":10766},[279],[281,10768],{"disabled":238,"type":283},[16,10770,10771],{},"Usar if\u002Felse"," para ejecutar código condicionalmente",[88,10774,10776,73,10778,10781],{"className":10775},[279],[281,10777],{"disabled":238,"type":283},[16,10779,10780],{},"Encadenar condiciones"," con else if para múltiples casos",[88,10783,10785,73,10787,10790],{"className":10784},[279],[281,10786],{"disabled":238,"type":283},[16,10788,10789],{},"Anidar estructuras"," if dentro de otras",[88,10792,10794,73,10796,10799],{"className":10793},[279],[281,10795],{"disabled":238,"type":283},[16,10797,10798],{},"Aplicar el operador ternario"," para asignaciones condicionales simples",[88,10801,10803,73,10805,10808],{"className":10802},[279],[281,10804],{"disabled":238,"type":283},[16,10806,10807],{},"Construir lógica de decisión"," para selección automática de componentes eléctricos",[43,10810],{},[46,10812,320],{"id":319},[13,10814,726],{},[126,10816,10817,10820,10823,10826],{},[88,10818,10819],{},"Haber completado el Capítulo 4",[88,10821,10822],{},"Entender operadores de comparación (==, !=, >, \u003C, >=, \u003C=)",[88,10824,10825],{},"Entender operadores lógicos (&&, ||, !)",[88,10827,10828],{},"Saber construir expresiones booleanas",[43,10830],{},[46,10832,740],{"id":739},[13,10834,10835],{},[16,10836,10837],{},"Selector Automático de Protecciones Eléctricas",[13,10839,5969],{},[126,10841,10842,10845,10848,10851],{},[88,10843,10844],{},"Selecciona automáticamente el interruptor magnetotérmico adecuado",[88,10846,10847],{},"Determina la sección de cable necesaria",[88,10849,10850],{},"Calcula el tipo de protección diferencial requerida",[88,10852,10853],{},"Genera especificaciones técnicas completas",[13,10855,10856,10858],{},[16,10857,753],{},": 45-55 minutos",[43,10860],{},[46,10862,329],{"id":328},[331,10864,10866],{"id":10865},"_1-introducción-tomar-decisiones-en-el-código","1. Introducción: Tomar decisiones en el código",[13,10868,10869,10870,416],{},"Hasta ahora, nuestros scripts ejecutaban todas las líneas secuencialmente, de arriba a abajo. Pero en la vida real, necesitamos ",[16,10871,10872],{},"tomar decisiones",[126,10874,10875,10886,10898],{},[88,10876,10877,10878,10881,10882,10885],{},"\"",[16,10879,10880],{},"Si"," el voltaje es mayor a 253V, ",[16,10883,10884],{},"entonces"," mostrar una alerta\"",[88,10887,10877,10888,10890,10891,10893,10894,10897],{},[16,10889,10880],{}," la corriente excede 16A, ",[16,10892,10884],{}," seleccionar un cable más grueso, ",[16,10895,10896],{},"si no",", usar el cable estándar\"",[88,10899,10877,10900,10902,10903,10906],{},[16,10901,10880],{}," es circuito de iluminación, usar protección tipo B; ",[16,10904,10905],{},"si"," es motor, usar tipo D\"",[13,10908,10909,10910,10913],{},"La estructura ",[54,10911,10912],{},"if\u002Felse"," te permite ejecutar diferentes bloques de código según condiciones.",[43,10915],{},[331,10917,10919],{"id":10918},"_2-la-estructura-if-básica","2. La estructura if básica",[13,10921,10922],{},"La sintaxis más simple:",[543,10924,10926],{"className":545,"code":10925,"language":547,"meta":228,"style":228},"if (condicion)\n{\n    \u002F\u002F Código que se ejecuta si la condición es true\n}\n",[54,10927,10928,10933,10937,10942],{"__ignoreMap":228},[551,10929,10930],{"class":553,"line":554},[551,10931,10932],{},"if (condicion)\n",[551,10934,10935],{"class":553,"line":229},[551,10936,1151],{},[551,10938,10939],{"class":553,"line":670},[551,10940,10941],{},"    \u002F\u002F Código que se ejecuta si la condición es true\n",[551,10943,10944],{"class":553,"line":1136},[551,10945,1193],{},[13,10947,10948,416],{},[16,10949,6376],{},[543,10951,10953],{"className":545,"code":10952,"language":547,"meta":228,"style":228},"double voltaje = 260.0;\n\nif (voltaje > 253.0)\n{\n    MessageBox.Show(\"Advertencia: Voltaje excesivo detectado.\");\n}\n",[54,10954,10955,10960,10964,10969,10973,10978],{"__ignoreMap":228},[551,10956,10957],{"class":553,"line":554},[551,10958,10959],{},"double voltaje = 260.0;\n",[551,10961,10962],{"class":553,"line":229},[551,10963,1139],{"emptyLinePlaceholder":238},[551,10965,10966],{"class":553,"line":670},[551,10967,10968],{},"if (voltaje > 253.0)\n",[551,10970,10971],{"class":553,"line":1136},[551,10972,1151],{},[551,10974,10975],{"class":553,"line":1142},[551,10976,10977],{},"    MessageBox.Show(\"Advertencia: Voltaje excesivo detectado.\");\n",[551,10979,10980],{"class":553,"line":1148},[551,10981,1193],{},[13,10983,10984,416],{},[16,10985,10986],{},"Flujo de ejecución",[85,10988,10989,10995,11004],{},[88,10990,10991,10992],{},"Se evalúa la condición ",[54,10993,10994],{},"voltaje > 253.0",[88,10996,10997,10998,11000,11001],{},"Si es ",[54,10999,2853],{},", se ejecuta el bloque entre ",[54,11002,11003],{},"{ }",[88,11005,10997,11006,11008],{},[54,11007,2857],{},", se salta el bloque y continúa después",[367,11010,11012],{"id":11011},"_21-anatomía-del-if","2.1 Anatomía del if",[543,11014,11016],{"className":545,"code":11015,"language":547,"meta":228,"style":228},"if (condicion)\n   ↑        ↑\n   |        └─ Expresión booleana (true\u002Ffalse)\n   └────────── Palabra clave\n{\n    \u002F\u002F Bloque de código\n    \u002F\u002F Puede tener múltiples líneas\n}\n",[54,11017,11018,11022,11027,11032,11037,11041,11046,11051],{"__ignoreMap":228},[551,11019,11020],{"class":553,"line":554},[551,11021,10932],{},[551,11023,11024],{"class":553,"line":229},[551,11025,11026],{},"   ↑        ↑\n",[551,11028,11029],{"class":553,"line":670},[551,11030,11031],{},"   |        └─ Expresión booleana (true\u002Ffalse)\n",[551,11033,11034],{"class":553,"line":1136},[551,11035,11036],{},"   └────────── Palabra clave\n",[551,11038,11039],{"class":553,"line":1142},[551,11040,1151],{},[551,11042,11043],{"class":553,"line":1148},[551,11044,11045],{},"    \u002F\u002F Bloque de código\n",[551,11047,11048],{"class":553,"line":1154},[551,11049,11050],{},"    \u002F\u002F Puede tener múltiples líneas\n",[551,11052,11053],{"class":553,"line":1160},[551,11054,1193],{},[367,11056,11058],{"id":11057},"_22-ejemplos-prácticos","2.2 Ejemplos prácticos",[13,11060,11061],{},[16,11062,11063],{},"Ejemplo 1: Validar corriente",[543,11065,11067],{"className":545,"code":11066,"language":547,"meta":228,"style":228},"double corriente = 18.5;\ndouble corrienteMaxima = 16.0;\n\nif (corriente > corrienteMaxima)\n{\n    MessageBox.Show(\"La corriente excede el límite permitido.\");\n}\n",[54,11068,11069,11073,11077,11081,11086,11090,11095],{"__ignoreMap":228},[551,11070,11071],{"class":553,"line":554},[551,11072,6782],{},[551,11074,11075],{"class":553,"line":229},[551,11076,6787],{},[551,11078,11079],{"class":553,"line":670},[551,11080,1139],{"emptyLinePlaceholder":238},[551,11082,11083],{"class":553,"line":1136},[551,11084,11085],{},"if (corriente > corrienteMaxima)\n",[551,11087,11088],{"class":553,"line":1142},[551,11089,1151],{},[551,11091,11092],{"class":553,"line":1148},[551,11093,11094],{},"    MessageBox.Show(\"La corriente excede el límite permitido.\");\n",[551,11096,11097],{"class":553,"line":1154},[551,11098,1193],{},[13,11100,11101],{},[16,11102,11103],{},"Ejemplo 2: Verificar proyecto abierto",[543,11105,11107],{"className":545,"code":11106,"language":547,"meta":228,"style":228},"bool proyectoAbierto = true;\n\nif (proyectoAbierto)\n{\n    \u002F\u002F Procesar el proyecto\n    MessageBox.Show(\"Procesando proyecto...\");\n}\n",[54,11108,11109,11113,11117,11122,11126,11131,11136],{"__ignoreMap":228},[551,11110,11111],{"class":553,"line":554},[551,11112,2831],{},[551,11114,11115],{"class":553,"line":229},[551,11116,1139],{"emptyLinePlaceholder":238},[551,11118,11119],{"class":553,"line":670},[551,11120,11121],{},"if (proyectoAbierto)\n",[551,11123,11124],{"class":553,"line":1136},[551,11125,1151],{},[551,11127,11128],{"class":553,"line":1142},[551,11129,11130],{},"    \u002F\u002F Procesar el proyecto\n",[551,11132,11133],{"class":553,"line":1148},[551,11134,11135],{},"    MessageBox.Show(\"Procesando proyecto...\");\n",[551,11137,11138],{"class":553,"line":1154},[551,11139,1193],{},[13,11141,11142],{},[16,11143,11144],{},"Ejemplo 3: Condición compuesta",[543,11146,11148],{"className":545,"code":11147,"language":547,"meta":228,"style":228},"double voltaje = 195.0;\ndouble voltajeMinimo = 207.0;\ndouble voltajeMaximo = 253.0;\n\nif (voltaje \u003C voltajeMinimo || voltaje > voltajeMaximo)\n{\n    MessageBox.Show(\"Voltaje fuera del rango permitido (207V - 253V).\");\n}\n",[54,11149,11150,11154,11159,11164,11168,11173,11177,11182],{"__ignoreMap":228},[551,11151,11152],{"class":553,"line":554},[551,11153,7144],{},[551,11155,11156],{"class":553,"line":229},[551,11157,11158],{},"double voltajeMinimo = 207.0;\n",[551,11160,11161],{"class":553,"line":670},[551,11162,11163],{},"double voltajeMaximo = 253.0;\n",[551,11165,11166],{"class":553,"line":1136},[551,11167,1139],{"emptyLinePlaceholder":238},[551,11169,11170],{"class":553,"line":1142},[551,11171,11172],{},"if (voltaje \u003C voltajeMinimo || voltaje > voltajeMaximo)\n",[551,11174,11175],{"class":553,"line":1148},[551,11176,1151],{},[551,11178,11179],{"class":553,"line":1154},[551,11180,11181],{},"    MessageBox.Show(\"Voltaje fuera del rango permitido (207V - 253V).\");\n",[551,11183,11184],{"class":553,"line":1160},[551,11185,1193],{},[367,11187,11189],{"id":11188},"_23-if-de-una-línea-sin-llaves","2.3 If de una línea (sin llaves)",[13,11191,11192,11193,11196],{},"Si solo hay ",[16,11194,11195],{},"una instrucción",", puedes omitir las llaves:",[543,11198,11200],{"className":545,"code":11199,"language":547,"meta":228,"style":228},"if (voltaje > 253.0)\n    MessageBox.Show(\"Voltaje alto\");\n",[54,11201,11202,11206],{"__ignoreMap":228},[551,11203,11204],{"class":553,"line":554},[551,11205,10968],{},[551,11207,11208],{"class":553,"line":229},[551,11209,11210],{},"    MessageBox.Show(\"Voltaje alto\");\n",[13,11212,11213,11216],{},[16,11214,11215],{},"Pero no es recomendable"," porque:",[126,11218,11219,11222],{},[88,11220,11221],{},"Es fácil agregar otra línea y olvidar las llaves",[88,11223,11224],{},"Reduce la legibilidad",[13,11226,11227,11230],{},[16,11228,11229],{},"Mejor práctica",": Siempre usa llaves, incluso para una línea:",[543,11232,11234],{"className":545,"code":11233,"language":547,"meta":228,"style":228},"if (voltaje > 253.0)\n{\n    MessageBox.Show(\"Voltaje alto\");\n}\n",[54,11235,11236,11240,11244,11248],{"__ignoreMap":228},[551,11237,11238],{"class":553,"line":554},[551,11239,10968],{},[551,11241,11242],{"class":553,"line":229},[551,11243,1151],{},[551,11245,11246],{"class":553,"line":670},[551,11247,11210],{},[551,11249,11250],{"class":553,"line":1136},[551,11251,1193],{},[43,11253],{},[331,11255,11257],{"id":11256},"_3-la-estructura-ifelse","3. La estructura if\u002Felse",[13,11259,11260,11261,11263,11264,416],{},"Para ejecutar un código cuando la condición es ",[54,11262,2853],{}," y otro cuando es ",[54,11265,2857],{},[543,11267,11269],{"className":545,"code":11268,"language":547,"meta":228,"style":228},"if (condicion)\n{\n    \u002F\u002F Se ejecuta si condicion es true\n}\nelse\n{\n    \u002F\u002F Se ejecuta si condicion es false\n}\n",[54,11270,11271,11275,11279,11284,11288,11292,11296,11301],{"__ignoreMap":228},[551,11272,11273],{"class":553,"line":554},[551,11274,10932],{},[551,11276,11277],{"class":553,"line":229},[551,11278,1151],{},[551,11280,11281],{"class":553,"line":670},[551,11282,11283],{},"    \u002F\u002F Se ejecuta si condicion es true\n",[551,11285,11286],{"class":553,"line":1136},[551,11287,1193],{},[551,11289,11290],{"class":553,"line":1142},[551,11291,3704],{},[551,11293,11294],{"class":553,"line":1148},[551,11295,1151],{},[551,11297,11298],{"class":553,"line":1154},[551,11299,11300],{},"    \u002F\u002F Se ejecuta si condicion es false\n",[551,11302,11303],{"class":553,"line":1160},[551,11304,1193],{},[13,11306,11307,416],{},[16,11308,6376],{},[543,11310,11312],{"className":545,"code":11311,"language":547,"meta":228,"style":228},"double corriente = 14.5;\ndouble corrienteMaxima = 16.0;\n\nif (corriente \u003C= corrienteMaxima)\n{\n    MessageBox.Show(\"Corriente dentro de límites normales.\");\n}\nelse\n{\n    MessageBox.Show(\"Corriente excede el límite. Revisar instalación.\");\n}\n",[54,11313,11314,11319,11323,11327,11332,11336,11341,11345,11349,11353,11358],{"__ignoreMap":228},[551,11315,11316],{"class":553,"line":554},[551,11317,11318],{},"double corriente = 14.5;\n",[551,11320,11321],{"class":553,"line":229},[551,11322,6787],{},[551,11324,11325],{"class":553,"line":670},[551,11326,1139],{"emptyLinePlaceholder":238},[551,11328,11329],{"class":553,"line":1136},[551,11330,11331],{},"if (corriente \u003C= corrienteMaxima)\n",[551,11333,11334],{"class":553,"line":1142},[551,11335,1151],{},[551,11337,11338],{"class":553,"line":1148},[551,11339,11340],{},"    MessageBox.Show(\"Corriente dentro de límites normales.\");\n",[551,11342,11343],{"class":553,"line":1154},[551,11344,1193],{},[551,11346,11347],{"class":553,"line":1160},[551,11348,3704],{},[551,11350,11351],{"class":553,"line":1166},[551,11352,1151],{},[551,11354,11355],{"class":553,"line":1172},[551,11356,11357],{},"    MessageBox.Show(\"Corriente excede el límite. Revisar instalación.\");\n",[551,11359,11360],{"class":553,"line":1178},[551,11361,1193],{},[367,11363,11365],{"id":11364},"_31-flujo-de-ejecución","3.1 Flujo de ejecución",[543,11367,11370],{"className":11368,"code":11369,"language":847},[845],"        ┌─────────────┐\n        │  if (cond)  │\n        └──────┬──────┘\n               │\n        ┌──────┴──────┐\n        │             │\n      true          false\n        │             │\n    ┌───▼───┐     ┌───▼───┐\n    │ if {} │     │else {} │\n    └───┬───┘     └───┬───┘\n        │             │\n        └──────┬──────┘\n               │\n           continúa\n",[54,11371,11369],{"__ignoreMap":228},[13,11373,11374,11375,11378],{},"Solo ",[16,11376,11377],{},"uno"," de los dos bloques se ejecuta, nunca ambos.",[367,11380,11382],{"id":11381},"_32-ejemplos-prácticos","3.2 Ejemplos prácticos",[13,11384,11385],{},[16,11386,11387],{},"Ejemplo 1: Clasificar proyecto por tamaño",[543,11389,11391],{"className":545,"code":11390,"language":547,"meta":228,"style":228},"int numeroPaginas = 45;\n\nif (numeroPaginas \u003C= 20)\n{\n    MessageBox.Show(\"Proyecto pequeño (hasta 20 páginas).\");\n}\nelse\n{\n    MessageBox.Show(\"Proyecto grande (más de 20 páginas).\");\n}\n",[54,11392,11393,11398,11402,11407,11411,11416,11420,11424,11428,11433],{"__ignoreMap":228},[551,11394,11395],{"class":553,"line":554},[551,11396,11397],{},"int numeroPaginas = 45;\n",[551,11399,11400],{"class":553,"line":229},[551,11401,1139],{"emptyLinePlaceholder":238},[551,11403,11404],{"class":553,"line":670},[551,11405,11406],{},"if (numeroPaginas \u003C= 20)\n",[551,11408,11409],{"class":553,"line":1136},[551,11410,1151],{},[551,11412,11413],{"class":553,"line":1142},[551,11414,11415],{},"    MessageBox.Show(\"Proyecto pequeño (hasta 20 páginas).\");\n",[551,11417,11418],{"class":553,"line":1148},[551,11419,1193],{},[551,11421,11422],{"class":553,"line":1154},[551,11423,3704],{},[551,11425,11426],{"class":553,"line":1160},[551,11427,1151],{},[551,11429,11430],{"class":553,"line":1166},[551,11431,11432],{},"    MessageBox.Show(\"Proyecto grande (más de 20 páginas).\");\n",[551,11434,11435],{"class":553,"line":1172},[551,11436,1193],{},[13,11438,11439],{},[16,11440,11441],{},"Ejemplo 2: Seleccionar tipo de cable",[543,11443,11445],{"className":545,"code":11444,"language":547,"meta":228,"style":228},"bool ambienteHumedo = true;\n\nif (ambienteHumedo)\n{\n    MessageBox.Show(\"Usar cable tipo H07RN-F (resistente a humedad).\");\n}\nelse\n{\n    MessageBox.Show(\"Usar cable tipo H07V-K (instalación estándar).\");\n}\n",[54,11446,11447,11452,11456,11461,11465,11470,11474,11478,11482,11487],{"__ignoreMap":228},[551,11448,11449],{"class":553,"line":554},[551,11450,11451],{},"bool ambienteHumedo = true;\n",[551,11453,11454],{"class":553,"line":229},[551,11455,1139],{"emptyLinePlaceholder":238},[551,11457,11458],{"class":553,"line":670},[551,11459,11460],{},"if (ambienteHumedo)\n",[551,11462,11463],{"class":553,"line":1136},[551,11464,1151],{},[551,11466,11467],{"class":553,"line":1142},[551,11468,11469],{},"    MessageBox.Show(\"Usar cable tipo H07RN-F (resistente a humedad).\");\n",[551,11471,11472],{"class":553,"line":1148},[551,11473,1193],{},[551,11475,11476],{"class":553,"line":1154},[551,11477,3704],{},[551,11479,11480],{"class":553,"line":1160},[551,11481,1151],{},[551,11483,11484],{"class":553,"line":1166},[551,11485,11486],{},"    MessageBox.Show(\"Usar cable tipo H07V-K (instalación estándar).\");\n",[551,11488,11489],{"class":553,"line":1172},[551,11490,1193],{},[13,11492,11493],{},[16,11494,11495],{},"Ejemplo 3: Determinar tipo de sistema",[543,11497,11499],{"className":545,"code":11498,"language":547,"meta":228,"style":228},"double voltaje = 400.0;\n\nif (voltaje > 380.0)\n{\n    MessageBox.Show(\"Sistema trifásico (400V).\");\n}\nelse\n{\n    MessageBox.Show(\"Sistema monofásico (230V).\");\n}\n",[54,11500,11501,11505,11509,11514,11518,11523,11527,11531,11535,11540],{"__ignoreMap":228},[551,11502,11503],{"class":553,"line":554},[551,11504,10177],{},[551,11506,11507],{"class":553,"line":229},[551,11508,1139],{"emptyLinePlaceholder":238},[551,11510,11511],{"class":553,"line":670},[551,11512,11513],{},"if (voltaje > 380.0)\n",[551,11515,11516],{"class":553,"line":1136},[551,11517,1151],{},[551,11519,11520],{"class":553,"line":1142},[551,11521,11522],{},"    MessageBox.Show(\"Sistema trifásico (400V).\");\n",[551,11524,11525],{"class":553,"line":1148},[551,11526,1193],{},[551,11528,11529],{"class":553,"line":1154},[551,11530,3704],{},[551,11532,11533],{"class":553,"line":1160},[551,11534,1151],{},[551,11536,11537],{"class":553,"line":1166},[551,11538,11539],{},"    MessageBox.Show(\"Sistema monofásico (230V).\");\n",[551,11541,11542],{"class":553,"line":1172},[551,11543,1193],{},[43,11545],{},[331,11547,11549],{"id":11548},"_4-la-estructura-else-if-múltiples-condiciones","4. La estructura else if - múltiples condiciones",[13,11551,11552,11553,11556],{},"Cuando tienes ",[16,11554,11555],{},"más de dos casos"," posibles:",[543,11558,11560],{"className":545,"code":11559,"language":547,"meta":228,"style":228},"if (condicion1)\n{\n    \u002F\u002F Se ejecuta si condicion1 es true\n}\nelse if (condicion2)\n{\n    \u002F\u002F Se ejecuta si condicion1 es false y condicion2 es true\n}\nelse if (condicion3)\n{\n    \u002F\u002F Se ejecuta si condicion1 y condicion2 son false, y condicion3 es true\n}\nelse\n{\n    \u002F\u002F Se ejecuta si ninguna condición anterior es true\n}\n",[54,11561,11562,11567,11571,11576,11580,11585,11589,11594,11598,11603,11607,11612,11616,11620,11624,11629],{"__ignoreMap":228},[551,11563,11564],{"class":553,"line":554},[551,11565,11566],{},"if (condicion1)\n",[551,11568,11569],{"class":553,"line":229},[551,11570,1151],{},[551,11572,11573],{"class":553,"line":670},[551,11574,11575],{},"    \u002F\u002F Se ejecuta si condicion1 es true\n",[551,11577,11578],{"class":553,"line":1136},[551,11579,1193],{},[551,11581,11582],{"class":553,"line":1142},[551,11583,11584],{},"else if (condicion2)\n",[551,11586,11587],{"class":553,"line":1148},[551,11588,1151],{},[551,11590,11591],{"class":553,"line":1154},[551,11592,11593],{},"    \u002F\u002F Se ejecuta si condicion1 es false y condicion2 es true\n",[551,11595,11596],{"class":553,"line":1160},[551,11597,1193],{},[551,11599,11600],{"class":553,"line":1166},[551,11601,11602],{},"else if (condicion3)\n",[551,11604,11605],{"class":553,"line":1172},[551,11606,1151],{},[551,11608,11609],{"class":553,"line":1178},[551,11610,11611],{},"    \u002F\u002F Se ejecuta si condicion1 y condicion2 son false, y condicion3 es true\n",[551,11613,11614],{"class":553,"line":1184},[551,11615,1193],{},[551,11617,11618],{"class":553,"line":1190},[551,11619,3704],{},[551,11621,11622],{"class":553,"line":1472},[551,11623,1151],{},[551,11625,11626],{"class":553,"line":1477},[551,11627,11628],{},"    \u002F\u002F Se ejecuta si ninguna condición anterior es true\n",[551,11630,11631],{"class":553,"line":1797},[551,11632,1193],{},[13,11634,11635,11637,11638,11641,11642,2854,11645,11648,11649,11651],{},[16,11636,1395],{},": Se evalúan ",[16,11639,11640],{},"en orden",". El primer ",[54,11643,11644],{},"if",[54,11646,11647],{},"else if"," que sea ",[54,11650,2853],{}," se ejecuta, y se salta el resto.",[367,11653,11655],{"id":11654},"_41-ejemplo-práctico-clasificar-sección-de-cable","4.1 Ejemplo práctico: Clasificar sección de cable",[543,11657,11659],{"className":545,"code":11658,"language":547,"meta":228,"style":228},"double corriente = 25.0;\nstring seccionRecomendada;\n\nif (corriente \u003C= 16.0)\n{\n    seccionRecomendada = \"2.5 mm²\";\n}\nelse if (corriente \u003C= 20.0)\n{\n    seccionRecomendada = \"4 mm²\";\n}\nelse if (corriente \u003C= 25.0)\n{\n    seccionRecomendada = \"6 mm²\";\n}\nelse if (corriente \u003C= 32.0)\n{\n    seccionRecomendada = \"10 mm²\";\n}\nelse\n{\n    seccionRecomendada = \"Requiere cálculo específico (> 32A)\";\n}\n\nMessageBox.Show(\"Sección recomendada: \" + seccionRecomendada);\n",[54,11660,11661,11666,11671,11675,11680,11684,11689,11693,11698,11702,11707,11711,11716,11720,11725,11729,11734,11738,11743,11747,11751,11755,11760,11764,11768],{"__ignoreMap":228},[551,11662,11663],{"class":553,"line":554},[551,11664,11665],{},"double corriente = 25.0;\n",[551,11667,11668],{"class":553,"line":229},[551,11669,11670],{},"string seccionRecomendada;\n",[551,11672,11673],{"class":553,"line":670},[551,11674,1139],{"emptyLinePlaceholder":238},[551,11676,11677],{"class":553,"line":1136},[551,11678,11679],{},"if (corriente \u003C= 16.0)\n",[551,11681,11682],{"class":553,"line":1142},[551,11683,1151],{},[551,11685,11686],{"class":553,"line":1148},[551,11687,11688],{},"    seccionRecomendada = \"2.5 mm²\";\n",[551,11690,11691],{"class":553,"line":1154},[551,11692,1193],{},[551,11694,11695],{"class":553,"line":1160},[551,11696,11697],{},"else if (corriente \u003C= 20.0)\n",[551,11699,11700],{"class":553,"line":1166},[551,11701,1151],{},[551,11703,11704],{"class":553,"line":1172},[551,11705,11706],{},"    seccionRecomendada = \"4 mm²\";\n",[551,11708,11709],{"class":553,"line":1178},[551,11710,1193],{},[551,11712,11713],{"class":553,"line":1184},[551,11714,11715],{},"else if (corriente \u003C= 25.0)\n",[551,11717,11718],{"class":553,"line":1190},[551,11719,1151],{},[551,11721,11722],{"class":553,"line":1472},[551,11723,11724],{},"    seccionRecomendada = \"6 mm²\";\n",[551,11726,11727],{"class":553,"line":1477},[551,11728,1193],{},[551,11730,11731],{"class":553,"line":1797},[551,11732,11733],{},"else if (corriente \u003C= 32.0)\n",[551,11735,11736],{"class":553,"line":1802},[551,11737,1151],{},[551,11739,11740],{"class":553,"line":1808},[551,11741,11742],{},"    seccionRecomendada = \"10 mm²\";\n",[551,11744,11745],{"class":553,"line":1814},[551,11746,1193],{},[551,11748,11749],{"class":553,"line":1820},[551,11750,3704],{},[551,11752,11753],{"class":553,"line":1826},[551,11754,1151],{},[551,11756,11757],{"class":553,"line":1832},[551,11758,11759],{},"    seccionRecomendada = \"Requiere cálculo específico (> 32A)\";\n",[551,11761,11762],{"class":553,"line":1838},[551,11763,1193],{},[551,11765,11766],{"class":553,"line":1844},[551,11767,1139],{"emptyLinePlaceholder":238},[551,11769,11770],{"class":553,"line":1850},[551,11771,11772],{},"MessageBox.Show(\"Sección recomendada: \" + seccionRecomendada);\n",[367,11774,11776],{"id":11775},"_42-ejemplo-clasificar-factor-de-potencia","4.2 Ejemplo: Clasificar factor de potencia",[543,11778,11780],{"className":545,"code":11779,"language":547,"meta":228,"style":228},"double factorPotencia = 0.78;\nstring clasificacion;\n\nif (factorPotencia >= 0.95)\n{\n    clasificacion = \"Excelente - No requiere corrección\";\n}\nelse if (factorPotencia >= 0.90)\n{\n    clasificacion = \"Bueno - Corrección opcional\";\n}\nelse if (factorPotencia >= 0.85)\n{\n    clasificacion = \"Aceptable - Corrección recomendada\";\n}\nelse\n{\n    clasificacion = \"Bajo - Corrección necesaria\";\n}\n\nstring mensaje = string.Format(\n    \"Factor de potencia: {0:F2}\\nClasificación: {1}\",\n    factorPotencia,\n    clasificacion\n);\n\nMessageBox.Show(mensaje);\n",[54,11781,11782,11787,11792,11796,11801,11805,11810,11814,11819,11823,11828,11832,11837,11841,11846,11850,11854,11858,11863,11867,11871,11875,11880,11884,11889,11893,11897],{"__ignoreMap":228},[551,11783,11784],{"class":553,"line":554},[551,11785,11786],{},"double factorPotencia = 0.78;\n",[551,11788,11789],{"class":553,"line":229},[551,11790,11791],{},"string clasificacion;\n",[551,11793,11794],{"class":553,"line":670},[551,11795,1139],{"emptyLinePlaceholder":238},[551,11797,11798],{"class":553,"line":1136},[551,11799,11800],{},"if (factorPotencia >= 0.95)\n",[551,11802,11803],{"class":553,"line":1142},[551,11804,1151],{},[551,11806,11807],{"class":553,"line":1148},[551,11808,11809],{},"    clasificacion = \"Excelente - No requiere corrección\";\n",[551,11811,11812],{"class":553,"line":1154},[551,11813,1193],{},[551,11815,11816],{"class":553,"line":1160},[551,11817,11818],{},"else if (factorPotencia >= 0.90)\n",[551,11820,11821],{"class":553,"line":1166},[551,11822,1151],{},[551,11824,11825],{"class":553,"line":1172},[551,11826,11827],{},"    clasificacion = \"Bueno - Corrección opcional\";\n",[551,11829,11830],{"class":553,"line":1178},[551,11831,1193],{},[551,11833,11834],{"class":553,"line":1184},[551,11835,11836],{},"else if (factorPotencia >= 0.85)\n",[551,11838,11839],{"class":553,"line":1190},[551,11840,1151],{},[551,11842,11843],{"class":553,"line":1472},[551,11844,11845],{},"    clasificacion = \"Aceptable - Corrección recomendada\";\n",[551,11847,11848],{"class":553,"line":1477},[551,11849,1193],{},[551,11851,11852],{"class":553,"line":1797},[551,11853,3704],{},[551,11855,11856],{"class":553,"line":1802},[551,11857,1151],{},[551,11859,11860],{"class":553,"line":1808},[551,11861,11862],{},"    clasificacion = \"Bajo - Corrección necesaria\";\n",[551,11864,11865],{"class":553,"line":1814},[551,11866,1193],{},[551,11868,11869],{"class":553,"line":1820},[551,11870,1139],{"emptyLinePlaceholder":238},[551,11872,11873],{"class":553,"line":1826},[551,11874,3942],{},[551,11876,11877],{"class":553,"line":1832},[551,11878,11879],{},"    \"Factor de potencia: {0:F2}\\nClasificación: {1}\",\n",[551,11881,11882],{"class":553,"line":1838},[551,11883,4366],{},[551,11885,11886],{"class":553,"line":1844},[551,11887,11888],{},"    clasificacion\n",[551,11890,11891],{"class":553,"line":1850},[551,11892,3967],{},[551,11894,11895],{"class":553,"line":1855},[551,11896,1139],{"emptyLinePlaceholder":238},[551,11898,11899],{"class":553,"line":1861},[551,11900,11901],{},"MessageBox.Show(mensaje);\n",[367,11903,11905],{"id":11904},"_43-flujo-de-ejecución-con-else-if","4.3 Flujo de ejecución con else if",[543,11907,11910],{"className":11908,"code":11909,"language":847},[845],"if (cond1)?\n    ├─ true  → ejecuta bloque 1 → FIN\n    └─ false → else if (cond2)?\n                  ├─ true  → ejecuta bloque 2 → FIN\n                  └─ false → else if (cond3)?\n                                ├─ true  → ejecuta bloque 3 → FIN\n                                └─ false → else (bloque 4) → FIN\n",[54,11911,11909],{"__ignoreMap":228},[13,11913,11914,11917],{},[16,11915,11916],{},"Solo uno"," de los bloques se ejecuta.",[43,11919],{},[331,11921,11923],{"id":11922},"_5-if-anidados-nested-if","5. If anidados (nested if)",[13,11925,11926,11927,11929],{},"Puedes colocar un ",[54,11928,11644],{}," dentro de otro:",[543,11931,11933],{"className":545,"code":11932,"language":547,"meta":228,"style":228},"if (condicionExterna)\n{\n    \u002F\u002F Código nivel 1\n\n    if (condicionInterna)\n    {\n        \u002F\u002F Código nivel 2\n    }\n}\n",[54,11934,11935,11940,11944,11949,11953,11958,11962,11967,11971],{"__ignoreMap":228},[551,11936,11937],{"class":553,"line":554},[551,11938,11939],{},"if (condicionExterna)\n",[551,11941,11942],{"class":553,"line":229},[551,11943,1151],{},[551,11945,11946],{"class":553,"line":670},[551,11947,11948],{},"    \u002F\u002F Código nivel 1\n",[551,11950,11951],{"class":553,"line":1136},[551,11952,1139],{"emptyLinePlaceholder":238},[551,11954,11955],{"class":553,"line":1142},[551,11956,11957],{},"    if (condicionInterna)\n",[551,11959,11960],{"class":553,"line":1148},[551,11961,1169],{},[551,11963,11964],{"class":553,"line":1154},[551,11965,11966],{},"        \u002F\u002F Código nivel 2\n",[551,11968,11969],{"class":553,"line":1160},[551,11970,1187],{},[551,11972,11973],{"class":553,"line":1166},[551,11974,1193],{},[367,11976,11978],{"id":11977},"_51-ejemplo-práctico-validación-de-circuito-completo","5.1 Ejemplo práctico: Validación de circuito completo",[543,11980,11982],{"className":545,"code":11981,"language":547,"meta":228,"style":228},"double voltaje = 230.0;\ndouble corriente = 15.5;\n\n\u002F\u002F Verificación nivel 1: Voltaje\nif (voltaje >= 207.0 && voltaje \u003C= 253.0)\n{\n    MessageBox.Show(\"Voltaje OK\");\n\n    \u002F\u002F Verificación nivel 2: Corriente (solo si voltaje OK)\n    if (corriente \u003C= 16.0)\n    {\n        MessageBox.Show(\"Corriente OK\\nCircuito completamente validado.\");\n    }\n    else\n    {\n        MessageBox.Show(\"Corriente excesiva. Revisar.\");\n    }\n}\nelse\n{\n    MessageBox.Show(\"Voltaje fuera de rango. No se verificó la corriente.\");\n}\n",[54,11983,11984,11988,11992,11996,12001,12006,12010,12015,12019,12024,12029,12033,12038,12042,12047,12051,12056,12060,12064,12068,12072,12077],{"__ignoreMap":228},[551,11985,11986],{"class":553,"line":554},[551,11987,2454],{},[551,11989,11990],{"class":553,"line":229},[551,11991,7016],{},[551,11993,11994],{"class":553,"line":670},[551,11995,1139],{"emptyLinePlaceholder":238},[551,11997,11998],{"class":553,"line":1136},[551,11999,12000],{},"\u002F\u002F Verificación nivel 1: Voltaje\n",[551,12002,12003],{"class":553,"line":1142},[551,12004,12005],{},"if (voltaje >= 207.0 && voltaje \u003C= 253.0)\n",[551,12007,12008],{"class":553,"line":1148},[551,12009,1151],{},[551,12011,12012],{"class":553,"line":1154},[551,12013,12014],{},"    MessageBox.Show(\"Voltaje OK\");\n",[551,12016,12017],{"class":553,"line":1160},[551,12018,1139],{"emptyLinePlaceholder":238},[551,12020,12021],{"class":553,"line":1166},[551,12022,12023],{},"    \u002F\u002F Verificación nivel 2: Corriente (solo si voltaje OK)\n",[551,12025,12026],{"class":553,"line":1172},[551,12027,12028],{},"    if (corriente \u003C= 16.0)\n",[551,12030,12031],{"class":553,"line":1178},[551,12032,1169],{},[551,12034,12035],{"class":553,"line":1184},[551,12036,12037],{},"        MessageBox.Show(\"Corriente OK\\nCircuito completamente validado.\");\n",[551,12039,12040],{"class":553,"line":1190},[551,12041,1187],{},[551,12043,12044],{"class":553,"line":1472},[551,12045,12046],{},"    else\n",[551,12048,12049],{"class":553,"line":1477},[551,12050,1169],{},[551,12052,12053],{"class":553,"line":1797},[551,12054,12055],{},"        MessageBox.Show(\"Corriente excesiva. Revisar.\");\n",[551,12057,12058],{"class":553,"line":1802},[551,12059,1187],{},[551,12061,12062],{"class":553,"line":1808},[551,12063,1193],{},[551,12065,12066],{"class":553,"line":1814},[551,12067,3704],{},[551,12069,12070],{"class":553,"line":1820},[551,12071,1151],{},[551,12073,12074],{"class":553,"line":1826},[551,12075,12076],{},"    MessageBox.Show(\"Voltaje fuera de rango. No se verificó la corriente.\");\n",[551,12078,12079],{"class":553,"line":1832},[551,12080,1193],{},[367,12082,12084],{"id":12083},"_52-ejemplo-selección-de-protección-diferencial","5.2 Ejemplo: Selección de protección diferencial",[543,12086,12088],{"className":545,"code":12087,"language":547,"meta":228,"style":228},"string tipoCarga = \"Motor\";  \u002F\u002F Opciones: \"Iluminacion\", \"Motor\", \"Informatica\"\ndouble corriente = 20.0;\n\nif (tipoCarga == \"Motor\")\n{\n    \u002F\u002F Motores requieren Tipo A (sensibles a CC)\n    if (corriente \u003C= 25.0)\n    {\n        MessageBox.Show(\"Diferencial: Tipo A, 30mA, 25A\");\n    }\n    else if (corriente \u003C= 40.0)\n    {\n        MessageBox.Show(\"Diferencial: Tipo A, 30mA, 40A\");\n    }\n    else\n    {\n        MessageBox.Show(\"Diferencial: Tipo A, 300mA, 63A o superior\");\n    }\n}\nelse if (tipoCarga == \"Informatica\")\n{\n    \u002F\u002F Informática requiere Tipo B (sensibles a CC y alta frecuencia)\n    MessageBox.Show(\"Diferencial: Tipo B, 30mA, corriente según carga\");\n}\nelse\n{\n    \u002F\u002F Iluminación y otros: Tipo AC estándar\n    if (corriente \u003C= 25.0)\n    {\n        MessageBox.Show(\"Diferencial: Tipo AC, 30mA, 25A\");\n    }\n    else\n    {\n        MessageBox.Show(\"Diferencial: Tipo AC, 30mA, 40A\");\n    }\n}\n",[54,12089,12090,12095,12100,12104,12109,12113,12118,12123,12127,12132,12136,12141,12145,12150,12154,12158,12162,12167,12171,12175,12180,12184,12189,12194,12198,12202,12206,12211,12215,12219,12224,12228,12232,12236,12241,12245],{"__ignoreMap":228},[551,12091,12092],{"class":553,"line":554},[551,12093,12094],{},"string tipoCarga = \"Motor\";  \u002F\u002F Opciones: \"Iluminacion\", \"Motor\", \"Informatica\"\n",[551,12096,12097],{"class":553,"line":229},[551,12098,12099],{},"double corriente = 20.0;\n",[551,12101,12102],{"class":553,"line":670},[551,12103,1139],{"emptyLinePlaceholder":238},[551,12105,12106],{"class":553,"line":1136},[551,12107,12108],{},"if (tipoCarga == \"Motor\")\n",[551,12110,12111],{"class":553,"line":1142},[551,12112,1151],{},[551,12114,12115],{"class":553,"line":1148},[551,12116,12117],{},"    \u002F\u002F Motores requieren Tipo A (sensibles a CC)\n",[551,12119,12120],{"class":553,"line":1154},[551,12121,12122],{},"    if (corriente \u003C= 25.0)\n",[551,12124,12125],{"class":553,"line":1160},[551,12126,1169],{},[551,12128,12129],{"class":553,"line":1166},[551,12130,12131],{},"        MessageBox.Show(\"Diferencial: Tipo A, 30mA, 25A\");\n",[551,12133,12134],{"class":553,"line":1172},[551,12135,1187],{},[551,12137,12138],{"class":553,"line":1178},[551,12139,12140],{},"    else if (corriente \u003C= 40.0)\n",[551,12142,12143],{"class":553,"line":1184},[551,12144,1169],{},[551,12146,12147],{"class":553,"line":1190},[551,12148,12149],{},"        MessageBox.Show(\"Diferencial: Tipo A, 30mA, 40A\");\n",[551,12151,12152],{"class":553,"line":1472},[551,12153,1187],{},[551,12155,12156],{"class":553,"line":1477},[551,12157,12046],{},[551,12159,12160],{"class":553,"line":1797},[551,12161,1169],{},[551,12163,12164],{"class":553,"line":1802},[551,12165,12166],{},"        MessageBox.Show(\"Diferencial: Tipo A, 300mA, 63A o superior\");\n",[551,12168,12169],{"class":553,"line":1808},[551,12170,1187],{},[551,12172,12173],{"class":553,"line":1814},[551,12174,1193],{},[551,12176,12177],{"class":553,"line":1820},[551,12178,12179],{},"else if (tipoCarga == \"Informatica\")\n",[551,12181,12182],{"class":553,"line":1826},[551,12183,1151],{},[551,12185,12186],{"class":553,"line":1832},[551,12187,12188],{},"    \u002F\u002F Informática requiere Tipo B (sensibles a CC y alta frecuencia)\n",[551,12190,12191],{"class":553,"line":1838},[551,12192,12193],{},"    MessageBox.Show(\"Diferencial: Tipo B, 30mA, corriente según carga\");\n",[551,12195,12196],{"class":553,"line":1844},[551,12197,1193],{},[551,12199,12200],{"class":553,"line":1850},[551,12201,3704],{},[551,12203,12204],{"class":553,"line":1855},[551,12205,1151],{},[551,12207,12208],{"class":553,"line":1861},[551,12209,12210],{},"    \u002F\u002F Iluminación y otros: Tipo AC estándar\n",[551,12212,12213],{"class":553,"line":1867},[551,12214,12122],{},[551,12216,12217],{"class":553,"line":1873},[551,12218,1169],{},[551,12220,12221],{"class":553,"line":1878},[551,12222,12223],{},"        MessageBox.Show(\"Diferencial: Tipo AC, 30mA, 25A\");\n",[551,12225,12226],{"class":553,"line":1883},[551,12227,1187],{},[551,12229,12230],{"class":553,"line":1888},[551,12231,12046],{},[551,12233,12234],{"class":553,"line":4615},[551,12235,1169],{},[551,12237,12238],{"class":553,"line":4620},[551,12239,12240],{},"        MessageBox.Show(\"Diferencial: Tipo AC, 30mA, 40A\");\n",[551,12242,12243],{"class":553,"line":4626},[551,12244,1187],{},[551,12246,12247],{"class":553,"line":4631},[551,12248,1193],{},[367,12250,12252],{"id":12251},"_53-cuidado-con-la-complejidad","5.3 Cuidado con la complejidad",[13,12254,12255],{},"Demasiados niveles de anidación reducen la legibilidad:",[543,12257,12259],{"className":545,"code":12258,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: demasiado anidado (difícil de leer)\nif (condicion1)\n{\n    if (condicion2)\n    {\n        if (condicion3)\n        {\n            if (condicion4)\n            {\n                \u002F\u002F ¿Qué condiciones deben cumplirse para llegar aquí?\n            }\n        }\n    }\n}\n",[54,12260,12261,12266,12270,12274,12279,12283,12288,12292,12297,12302,12307,12312,12316,12320],{"__ignoreMap":228},[551,12262,12263],{"class":553,"line":554},[551,12264,12265],{},"\u002F\u002F Mal: demasiado anidado (difícil de leer)\n",[551,12267,12268],{"class":553,"line":229},[551,12269,11566],{},[551,12271,12272],{"class":553,"line":670},[551,12273,1151],{},[551,12275,12276],{"class":553,"line":1136},[551,12277,12278],{},"    if (condicion2)\n",[551,12280,12281],{"class":553,"line":1142},[551,12282,1169],{},[551,12284,12285],{"class":553,"line":1148},[551,12286,12287],{},"        if (condicion3)\n",[551,12289,12290],{"class":553,"line":1154},[551,12291,9062],{},[551,12293,12294],{"class":553,"line":1160},[551,12295,12296],{},"            if (condicion4)\n",[551,12298,12299],{"class":553,"line":1166},[551,12300,12301],{},"            {\n",[551,12303,12304],{"class":553,"line":1172},[551,12305,12306],{},"                \u002F\u002F ¿Qué condiciones deben cumplirse para llegar aquí?\n",[551,12308,12309],{"class":553,"line":1178},[551,12310,12311],{},"            }\n",[551,12313,12314],{"class":553,"line":1184},[551,12315,9077],{},[551,12317,12318],{"class":553,"line":1190},[551,12319,1187],{},[551,12321,12322],{"class":553,"line":1472},[551,12323,1193],{},[13,12325,12326,12329],{},[16,12327,12328],{},"Mejor",": Usa operadores lógicos para combinar condiciones:",[543,12331,12333],{"className":545,"code":12332,"language":547,"meta":228,"style":228},"\u002F\u002F Bien: claro y directo\nif (condicion1 && condicion2 && condicion3 && condicion4)\n{\n    \u002F\u002F Claramente se necesitan las 4 condiciones\n}\n",[54,12334,12335,12340,12345,12349,12354],{"__ignoreMap":228},[551,12336,12337],{"class":553,"line":554},[551,12338,12339],{},"\u002F\u002F Bien: claro y directo\n",[551,12341,12342],{"class":553,"line":229},[551,12343,12344],{},"if (condicion1 && condicion2 && condicion3 && condicion4)\n",[551,12346,12347],{"class":553,"line":670},[551,12348,1151],{},[551,12350,12351],{"class":553,"line":1136},[551,12352,12353],{},"    \u002F\u002F Claramente se necesitan las 4 condiciones\n",[551,12355,12356],{"class":553,"line":1142},[551,12357,1193],{},[13,12359,12360],{},"O divide en funciones (lo veremos en capítulos futuros).",[43,12362],{},[331,12364,12366],{"id":12365},"_6-operador-ternario","6. Operador ternario (? :)",[13,12368,12369,12370,12373],{},"Para ",[16,12371,12372],{},"asignaciones condicionales simples",", existe un atajo:",[543,12375,12377],{"className":545,"code":12376,"language":547,"meta":228,"style":228},"variable = condicion ? valorSiTrue : valorSiFalse;\n",[54,12378,12379],{"__ignoreMap":228},[551,12380,12381],{"class":553,"line":554},[551,12382,12376],{},[13,12384,12385],{},"Es equivalente a:",[543,12387,12389],{"className":545,"code":12388,"language":547,"meta":228,"style":228},"if (condicion)\n{\n    variable = valorSiTrue;\n}\nelse\n{\n    variable = valorSiFalse;\n}\n",[54,12390,12391,12395,12399,12404,12408,12412,12416,12421],{"__ignoreMap":228},[551,12392,12393],{"class":553,"line":554},[551,12394,10932],{},[551,12396,12397],{"class":553,"line":229},[551,12398,1151],{},[551,12400,12401],{"class":553,"line":670},[551,12402,12403],{},"    variable = valorSiTrue;\n",[551,12405,12406],{"class":553,"line":1136},[551,12407,1193],{},[551,12409,12410],{"class":553,"line":1142},[551,12411,3704],{},[551,12413,12414],{"class":553,"line":1148},[551,12415,1151],{},[551,12417,12418],{"class":553,"line":1154},[551,12419,12420],{},"    variable = valorSiFalse;\n",[551,12422,12423],{"class":553,"line":1160},[551,12424,1193],{},[367,12426,12428],{"id":12427},"_61-ejemplos-prácticos","6.1 Ejemplos prácticos",[13,12430,12431],{},[16,12432,12433],{},"Ejemplo 1: Determinar tipo de sistema",[543,12435,12437],{"className":545,"code":12436,"language":547,"meta":228,"style":228},"double voltaje = 400.0;\nstring tipoSistema = (voltaje > 300) ? \"Trifásico\" : \"Monofásico\";\n\u002F\u002F tipoSistema = \"Trifásico\"\n",[54,12438,12439,12443,12448],{"__ignoreMap":228},[551,12440,12441],{"class":553,"line":554},[551,12442,10177],{},[551,12444,12445],{"class":553,"line":229},[551,12446,12447],{},"string tipoSistema = (voltaje > 300) ? \"Trifásico\" : \"Monofásico\";\n",[551,12449,12450],{"class":553,"line":670},[551,12451,12452],{},"\u002F\u002F tipoSistema = \"Trifásico\"\n",[13,12454,12455],{},[16,12456,12457],{},"Ejemplo 2: Clasificar proyecto",[543,12459,12461],{"className":545,"code":12460,"language":547,"meta":228,"style":228},"int numeroPaginas = 15;\nstring tamaño = (numeroPaginas \u003C= 20) ? \"Pequeño\" : \"Grande\";\n\u002F\u002F tamaño = \"Pequeño\"\n",[54,12462,12463,12468,12473],{"__ignoreMap":228},[551,12464,12465],{"class":553,"line":554},[551,12466,12467],{},"int numeroPaginas = 15;\n",[551,12469,12470],{"class":553,"line":229},[551,12471,12472],{},"string tamaño = (numeroPaginas \u003C= 20) ? \"Pequeño\" : \"Grande\";\n",[551,12474,12475],{"class":553,"line":670},[551,12476,12477],{},"\u002F\u002F tamaño = \"Pequeño\"\n",[13,12479,12480],{},[16,12481,12482],{},"Ejemplo 3: Determinar estado",[543,12484,12486],{"className":545,"code":12485,"language":547,"meta":228,"style":228},"bool tieneErrores = false;\nstring estado = tieneErrores ? \"Con errores\" : \"Sin errores\";\n\u002F\u002F estado = \"Sin errores\"\n",[54,12487,12488,12492,12497],{"__ignoreMap":228},[551,12489,12490],{"class":553,"line":554},[551,12491,2836],{},[551,12493,12494],{"class":553,"line":229},[551,12495,12496],{},"string estado = tieneErrores ? \"Con errores\" : \"Sin errores\";\n",[551,12498,12499],{"class":553,"line":670},[551,12500,12501],{},"\u002F\u002F estado = \"Sin errores\"\n",[367,12503,12505],{"id":12504},"_62-ternarios-anidados-usar-con-precaución","6.2 Ternarios anidados (usar con precaución)",[13,12507,12508,12509,416],{},"Puedes anidar operadores ternarios, pero ",[16,12510,12511],{},"reduce la legibilidad",[543,12513,12515],{"className":545,"code":12514,"language":547,"meta":228,"style":228},"double corriente = 22.0;\nstring seccion = (corriente \u003C= 16) ? \"2.5mm²\" :\n                 (corriente \u003C= 20) ? \"4mm²\" :\n                 (corriente \u003C= 25) ? \"6mm²\" : \"10mm²\";\n",[54,12516,12517,12522,12527,12532],{"__ignoreMap":228},[551,12518,12519],{"class":553,"line":554},[551,12520,12521],{},"double corriente = 22.0;\n",[551,12523,12524],{"class":553,"line":229},[551,12525,12526],{},"string seccion = (corriente \u003C= 16) ? \"2.5mm²\" :\n",[551,12528,12529],{"class":553,"line":670},[551,12530,12531],{},"                 (corriente \u003C= 20) ? \"4mm²\" :\n",[551,12533,12534],{"class":553,"line":1136},[551,12535,12536],{},"                 (corriente \u003C= 25) ? \"6mm²\" : \"10mm²\";\n",[13,12538,12539,416],{},[16,12540,12541],{},"Para casos complejos, usa if\u002Felse if",[543,12543,12545],{"className":545,"code":12544,"language":547,"meta":228,"style":228},"string seccion;\nif (corriente \u003C= 16)\n{\n    seccion = \"2.5mm²\";\n}\nelse if (corriente \u003C= 20)\n{\n    seccion = \"4mm²\";\n}\nelse if (corriente \u003C= 25)\n{\n    seccion = \"6mm²\";\n}\nelse\n{\n    seccion = \"10mm²\";\n}\n",[54,12546,12547,12552,12557,12561,12566,12570,12575,12579,12584,12588,12593,12597,12602,12606,12610,12614,12619],{"__ignoreMap":228},[551,12548,12549],{"class":553,"line":554},[551,12550,12551],{},"string seccion;\n",[551,12553,12554],{"class":553,"line":229},[551,12555,12556],{},"if (corriente \u003C= 16)\n",[551,12558,12559],{"class":553,"line":670},[551,12560,1151],{},[551,12562,12563],{"class":553,"line":1136},[551,12564,12565],{},"    seccion = \"2.5mm²\";\n",[551,12567,12568],{"class":553,"line":1142},[551,12569,1193],{},[551,12571,12572],{"class":553,"line":1148},[551,12573,12574],{},"else if (corriente \u003C= 20)\n",[551,12576,12577],{"class":553,"line":1154},[551,12578,1151],{},[551,12580,12581],{"class":553,"line":1160},[551,12582,12583],{},"    seccion = \"4mm²\";\n",[551,12585,12586],{"class":553,"line":1166},[551,12587,1193],{},[551,12589,12590],{"class":553,"line":1172},[551,12591,12592],{},"else if (corriente \u003C= 25)\n",[551,12594,12595],{"class":553,"line":1178},[551,12596,1151],{},[551,12598,12599],{"class":553,"line":1184},[551,12600,12601],{},"    seccion = \"6mm²\";\n",[551,12603,12604],{"class":553,"line":1190},[551,12605,1193],{},[551,12607,12608],{"class":553,"line":1472},[551,12609,3704],{},[551,12611,12612],{"class":553,"line":1477},[551,12613,1151],{},[551,12615,12616],{"class":553,"line":1797},[551,12617,12618],{},"    seccion = \"10mm²\";\n",[551,12620,12621],{"class":553,"line":1802},[551,12622,1193],{},[367,12624,12626],{"id":12625},"_63-cuándo-usar-el-operador-ternario","6.3 Cuándo usar el operador ternario",[13,12628,12629,416],{},[16,12630,12631],{},"Usa ternario para",[126,12633,12634,12637],{},[88,12635,12636],{},"Asignaciones simples con dos opciones",[88,12638,12639],{},"Casos donde mejora la concisión sin sacrificar claridad",[13,12641,12642,416],{},[16,12643,12644],{},"Usa if\u002Felse para",[126,12646,12647,12650,12653],{},[88,12648,12649],{},"Múltiples líneas de código en cada rama",[88,12651,12652],{},"Más de dos opciones",[88,12654,12655],{},"Cuando la legibilidad es más importante que la brevedad",[43,12657],{},[331,12659,12661],{"id":12660},"_7-comparación-de-strings","7. Comparación de strings",[13,12663,12664],{},"Comparar textos requiere cuidado especial:",[367,12666,12668],{"id":12667},"_71-comparación-exacta-sensible-a-mayúsculas","7.1 Comparación exacta (sensible a mayúsculas)",[543,12670,12672],{"className":545,"code":12671,"language":547,"meta":228,"style":228},"string tipo = \"Motor\";\n\nif (tipo == \"Motor\")\n{\n    MessageBox.Show(\"Tipo Motor detectado\");\n}\n\u002F\u002F Coincide: \"Motor\" == \"Motor\"\n",[54,12673,12674,12679,12683,12688,12692,12697,12701],{"__ignoreMap":228},[551,12675,12676],{"class":553,"line":554},[551,12677,12678],{},"string tipo = \"Motor\";\n",[551,12680,12681],{"class":553,"line":229},[551,12682,1139],{"emptyLinePlaceholder":238},[551,12684,12685],{"class":553,"line":670},[551,12686,12687],{},"if (tipo == \"Motor\")\n",[551,12689,12690],{"class":553,"line":1136},[551,12691,1151],{},[551,12693,12694],{"class":553,"line":1142},[551,12695,12696],{},"    MessageBox.Show(\"Tipo Motor detectado\");\n",[551,12698,12699],{"class":553,"line":1148},[551,12700,1193],{},[551,12702,12703],{"class":553,"line":1154},[551,12704,12705],{},"\u002F\u002F Coincide: \"Motor\" == \"Motor\"\n",[543,12707,12709],{"className":545,"code":12708,"language":547,"meta":228,"style":228},"string tipo = \"motor\";  \u002F\u002F Minúsculas\n\nif (tipo == \"Motor\")  \u002F\u002F No coincide\n{\n    \u002F\u002F No entra aquí\n}\n",[54,12710,12711,12716,12720,12725,12729,12734],{"__ignoreMap":228},[551,12712,12713],{"class":553,"line":554},[551,12714,12715],{},"string tipo = \"motor\";  \u002F\u002F Minúsculas\n",[551,12717,12718],{"class":553,"line":229},[551,12719,1139],{"emptyLinePlaceholder":238},[551,12721,12722],{"class":553,"line":670},[551,12723,12724],{},"if (tipo == \"Motor\")  \u002F\u002F No coincide\n",[551,12726,12727],{"class":553,"line":1136},[551,12728,1151],{},[551,12730,12731],{"class":553,"line":1142},[551,12732,12733],{},"    \u002F\u002F No entra aquí\n",[551,12735,12736],{"class":553,"line":1148},[551,12737,1193],{},[367,12739,12741],{"id":12740},"_72-comparación-insensible-a-mayúsculas","7.2 Comparación insensible a mayúsculas",[543,12743,12745],{"className":545,"code":12744,"language":547,"meta":228,"style":228},"string tipo = \"motor\";\n\nif (tipo.ToLower() == \"motor\")  \u002F\u002F Convierte a minúsculas\n{\n    MessageBox.Show(\"Tipo Motor detectado\");\n    \u002F\u002F Ahora sí coincide\n}\n",[54,12746,12747,12752,12756,12761,12765,12769,12774],{"__ignoreMap":228},[551,12748,12749],{"class":553,"line":554},[551,12750,12751],{},"string tipo = \"motor\";\n",[551,12753,12754],{"class":553,"line":229},[551,12755,1139],{"emptyLinePlaceholder":238},[551,12757,12758],{"class":553,"line":670},[551,12759,12760],{},"if (tipo.ToLower() == \"motor\")  \u002F\u002F Convierte a minúsculas\n",[551,12762,12763],{"class":553,"line":1136},[551,12764,1151],{},[551,12766,12767],{"class":553,"line":1142},[551,12768,12696],{},[551,12770,12771],{"class":553,"line":1148},[551,12772,12773],{},"    \u002F\u002F Ahora sí coincide\n",[551,12775,12776],{"class":553,"line":1154},[551,12777,1193],{},[13,12779,12780],{},"O mejor aún:",[543,12782,12784],{"className":545,"code":12783,"language":547,"meta":228,"style":228},"string tipo = \"MOTOR\";\n\nif (tipo.Equals(\"motor\", StringComparison.OrdinalIgnoreCase))\n{\n    MessageBox.Show(\"Tipo Motor detectado\");\n    \u002F\u002F Coincide independientemente de mayúsculas\n}\n",[54,12785,12786,12791,12795,12800,12804,12808,12813],{"__ignoreMap":228},[551,12787,12788],{"class":553,"line":554},[551,12789,12790],{},"string tipo = \"MOTOR\";\n",[551,12792,12793],{"class":553,"line":229},[551,12794,1139],{"emptyLinePlaceholder":238},[551,12796,12797],{"class":553,"line":670},[551,12798,12799],{},"if (tipo.Equals(\"motor\", StringComparison.OrdinalIgnoreCase))\n",[551,12801,12802],{"class":553,"line":1136},[551,12803,1151],{},[551,12805,12806],{"class":553,"line":1142},[551,12807,12696],{},[551,12809,12810],{"class":553,"line":1148},[551,12811,12812],{},"    \u002F\u002F Coincide independientemente de mayúsculas\n",[551,12814,12815],{"class":553,"line":1154},[551,12816,1193],{},[367,12818,12820],{"id":12819},"_73-ejemplo-práctico-completo","7.3 Ejemplo práctico completo",[543,12822,12824],{"className":545,"code":12823,"language":547,"meta":228,"style":228},"string tipoCargaInput = \"motor\";  \u002F\u002F Usuario escribió en minúsculas\n\nif (tipoCargaInput.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n{\n    MessageBox.Show(\"Protección Tipo D (arranque de motores)\");\n}\nelse if (tipoCargaInput.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n{\n    MessageBox.Show(\"Protección Tipo B (iluminación)\");\n}\nelse if (tipoCargaInput.Equals(\"General\", StringComparison.OrdinalIgnoreCase))\n{\n    MessageBox.Show(\"Protección Tipo C (uso general)\");\n}\nelse\n{\n    MessageBox.Show(\"Tipo de carga no reconocido\");\n}\n",[54,12825,12826,12831,12835,12840,12844,12849,12853,12858,12862,12867,12871,12876,12880,12885,12889,12893,12897,12902],{"__ignoreMap":228},[551,12827,12828],{"class":553,"line":554},[551,12829,12830],{},"string tipoCargaInput = \"motor\";  \u002F\u002F Usuario escribió en minúsculas\n",[551,12832,12833],{"class":553,"line":229},[551,12834,1139],{"emptyLinePlaceholder":238},[551,12836,12837],{"class":553,"line":670},[551,12838,12839],{},"if (tipoCargaInput.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n",[551,12841,12842],{"class":553,"line":1136},[551,12843,1151],{},[551,12845,12846],{"class":553,"line":1142},[551,12847,12848],{},"    MessageBox.Show(\"Protección Tipo D (arranque de motores)\");\n",[551,12850,12851],{"class":553,"line":1148},[551,12852,1193],{},[551,12854,12855],{"class":553,"line":1154},[551,12856,12857],{},"else if (tipoCargaInput.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n",[551,12859,12860],{"class":553,"line":1160},[551,12861,1151],{},[551,12863,12864],{"class":553,"line":1166},[551,12865,12866],{},"    MessageBox.Show(\"Protección Tipo B (iluminación)\");\n",[551,12868,12869],{"class":553,"line":1172},[551,12870,1193],{},[551,12872,12873],{"class":553,"line":1178},[551,12874,12875],{},"else if (tipoCargaInput.Equals(\"General\", StringComparison.OrdinalIgnoreCase))\n",[551,12877,12878],{"class":553,"line":1184},[551,12879,1151],{},[551,12881,12882],{"class":553,"line":1190},[551,12883,12884],{},"    MessageBox.Show(\"Protección Tipo C (uso general)\");\n",[551,12886,12887],{"class":553,"line":1472},[551,12888,1193],{},[551,12890,12891],{"class":553,"line":1477},[551,12892,3704],{},[551,12894,12895],{"class":553,"line":1797},[551,12896,1151],{},[551,12898,12899],{"class":553,"line":1802},[551,12900,12901],{},"    MessageBox.Show(\"Tipo de carga no reconocido\");\n",[551,12903,12904],{"class":553,"line":1808},[551,12905,1193],{},[43,12907],{},[46,12909,4025],{"id":4024},[13,12911,7975,12912,41],{},[16,12913,10837],{},[331,12915,12917],{"id":12916},"paso-1-estructura-básica-y-entrada-de-datos","Paso 1: Estructura básica y entrada de datos",[543,12919,12921],{"className":545,"code":12920,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class SelectorProtecciones\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DEL CIRCUITO\n        \u002F\u002F ========================================\n\n        string nombreCircuito = \"Línea producción - Zona 2\";\n        string tipoCarga = \"Motor\";  \u002F\u002F Opciones: \"Iluminacion\", \"Motor\", \"Tomas\", \"Informatica\"\n        double corrienteNominal = 18.5;  \u002F\u002F Amperios\n        double longitudCable = 42.0;     \u002F\u002F Metros\n        bool ambienteHumedo = false;\n        double voltajeNominal = 230.0;   \u002F\u002F Voltios\n    }\n}\n",[54,12922,12923,12927,12931,12935,12939,12944,12948,12952,12956,12960,12964,12968,12972,12976,12981,12986,12991,12996,13001,13006,13010],{"__ignoreMap":228},[551,12924,12925],{"class":553,"line":554},[551,12926,1123],{},[551,12928,12929],{"class":553,"line":229},[551,12930,1128],{},[551,12932,12933],{"class":553,"line":670},[551,12934,1133],{},[551,12936,12937],{"class":553,"line":1136},[551,12938,1139],{"emptyLinePlaceholder":238},[551,12940,12941],{"class":553,"line":1142},[551,12942,12943],{},"public class SelectorProtecciones\n",[551,12945,12946],{"class":553,"line":1148},[551,12947,1151],{},[551,12949,12950],{"class":553,"line":1154},[551,12951,1157],{},[551,12953,12954],{"class":553,"line":1160},[551,12955,1163],{},[551,12957,12958],{"class":553,"line":1166},[551,12959,1169],{},[551,12961,12962],{"class":553,"line":1172},[551,12963,4511],{},[551,12965,12966],{"class":553,"line":1178},[551,12967,4516],{},[551,12969,12970],{"class":553,"line":1184},[551,12971,4511],{},[551,12973,12974],{"class":553,"line":1190},[551,12975,1139],{"emptyLinePlaceholder":238},[551,12977,12978],{"class":553,"line":1472},[551,12979,12980],{},"        string nombreCircuito = \"Línea producción - Zona 2\";\n",[551,12982,12983],{"class":553,"line":1477},[551,12984,12985],{},"        string tipoCarga = \"Motor\";  \u002F\u002F Opciones: \"Iluminacion\", \"Motor\", \"Tomas\", \"Informatica\"\n",[551,12987,12988],{"class":553,"line":1797},[551,12989,12990],{},"        double corrienteNominal = 18.5;  \u002F\u002F Amperios\n",[551,12992,12993],{"class":553,"line":1802},[551,12994,12995],{},"        double longitudCable = 42.0;     \u002F\u002F Metros\n",[551,12997,12998],{"class":553,"line":1808},[551,12999,13000],{},"        bool ambienteHumedo = false;\n",[551,13002,13003],{"class":553,"line":1814},[551,13004,13005],{},"        double voltajeNominal = 230.0;   \u002F\u002F Voltios\n",[551,13007,13008],{"class":553,"line":1820},[551,13009,1187],{},[551,13011,13012],{"class":553,"line":1826},[551,13013,1193],{},[43,13015],{},[331,13017,13019],{"id":13018},"paso-2-selección-de-curva-de-disparo-magnetotérmico","Paso 2: Selección de curva de disparo (magnetotérmico)",[543,13021,13023],{"className":545,"code":13022,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 1: SELECCIONAR CURVA DE DISPARO\n\u002F\u002F ========================================\n\nstring curvaDisparo;\nstring justificacionCurva;\n\nif (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n{\n    curvaDisparo = \"Curva D\";\n    justificacionCurva = \"Motores tienen alta corriente de arranque (6-8x In)\";\n}\nelse if (tipoCarga.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n{\n    curvaDisparo = \"Curva B\";\n    justificacionCurva = \"Iluminación tiene bajo pico de arranque\";\n}\nelse if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n{\n    curvaDisparo = \"Curva C\";\n    justificacionCurva = \"Equipos informáticos tienen pico moderado\";\n}\nelse\n{\n    \u002F\u002F Tomas y uso general\n    curvaDisparo = \"Curva C\";\n    justificacionCurva = \"Uso general y tomas de corriente\";\n}\n",[54,13024,13025,13029,13034,13038,13042,13047,13052,13056,13061,13065,13070,13075,13079,13084,13088,13093,13098,13102,13107,13111,13116,13121,13125,13129,13133,13138,13142,13147],{"__ignoreMap":228},[551,13026,13027],{"class":553,"line":554},[551,13028,8157],{},[551,13030,13031],{"class":553,"line":229},[551,13032,13033],{},"\u002F\u002F PASO 1: SELECCIONAR CURVA DE DISPARO\n",[551,13035,13036],{"class":553,"line":670},[551,13037,8157],{},[551,13039,13040],{"class":553,"line":1136},[551,13041,1139],{"emptyLinePlaceholder":238},[551,13043,13044],{"class":553,"line":1142},[551,13045,13046],{},"string curvaDisparo;\n",[551,13048,13049],{"class":553,"line":1148},[551,13050,13051],{},"string justificacionCurva;\n",[551,13053,13054],{"class":553,"line":1154},[551,13055,1139],{"emptyLinePlaceholder":238},[551,13057,13058],{"class":553,"line":1160},[551,13059,13060],{},"if (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n",[551,13062,13063],{"class":553,"line":1166},[551,13064,1151],{},[551,13066,13067],{"class":553,"line":1172},[551,13068,13069],{},"    curvaDisparo = \"Curva D\";\n",[551,13071,13072],{"class":553,"line":1178},[551,13073,13074],{},"    justificacionCurva = \"Motores tienen alta corriente de arranque (6-8x In)\";\n",[551,13076,13077],{"class":553,"line":1184},[551,13078,1193],{},[551,13080,13081],{"class":553,"line":1190},[551,13082,13083],{},"else if (tipoCarga.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n",[551,13085,13086],{"class":553,"line":1472},[551,13087,1151],{},[551,13089,13090],{"class":553,"line":1477},[551,13091,13092],{},"    curvaDisparo = \"Curva B\";\n",[551,13094,13095],{"class":553,"line":1797},[551,13096,13097],{},"    justificacionCurva = \"Iluminación tiene bajo pico de arranque\";\n",[551,13099,13100],{"class":553,"line":1802},[551,13101,1193],{},[551,13103,13104],{"class":553,"line":1808},[551,13105,13106],{},"else if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n",[551,13108,13109],{"class":553,"line":1814},[551,13110,1151],{},[551,13112,13113],{"class":553,"line":1820},[551,13114,13115],{},"    curvaDisparo = \"Curva C\";\n",[551,13117,13118],{"class":553,"line":1826},[551,13119,13120],{},"    justificacionCurva = \"Equipos informáticos tienen pico moderado\";\n",[551,13122,13123],{"class":553,"line":1832},[551,13124,1193],{},[551,13126,13127],{"class":553,"line":1838},[551,13128,3704],{},[551,13130,13131],{"class":553,"line":1844},[551,13132,1151],{},[551,13134,13135],{"class":553,"line":1850},[551,13136,13137],{},"    \u002F\u002F Tomas y uso general\n",[551,13139,13140],{"class":553,"line":1855},[551,13141,13115],{},[551,13143,13144],{"class":553,"line":1861},[551,13145,13146],{},"    justificacionCurva = \"Uso general y tomas de corriente\";\n",[551,13148,13149],{"class":553,"line":1867},[551,13150,1193],{},[13,13152,13153,13155],{},[16,13154,4153],{},"\nSeleccionamos la curva de disparo apropiada según el tipo de carga. Cada tipo requiere diferente sensibilidad para evitar disparos innecesarios.",[43,13157],{},[331,13159,13161],{"id":13160},"paso-3-selección-de-corriente-nominal-del-magnetotérmico","Paso 3: Selección de corriente nominal del magnetotérmico",[543,13163,13165],{"className":545,"code":13164,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 2: SELECCIONAR CORRIENTE NOMINAL\n\u002F\u002F ========================================\n\nint corrienteMagnetotermico;\n\nif (corrienteNominal \u003C= 10.0)\n{\n    corrienteMagnetotermico = 10;\n}\nelse if (corrienteNominal \u003C= 16.0)\n{\n    corrienteMagnetotermico = 16;\n}\nelse if (corrienteNominal \u003C= 20.0)\n{\n    corrienteMagnetotermico = 20;\n}\nelse if (corrienteNominal \u003C= 25.0)\n{\n    corrienteMagnetotermico = 25;\n}\nelse if (corrienteNominal \u003C= 32.0)\n{\n    corrienteMagnetotermico = 32;\n}\nelse if (corrienteNominal \u003C= 40.0)\n{\n    corrienteMagnetotermico = 40;\n}\nelse\n{\n    corrienteMagnetotermico = 63;\n}\n\ndouble margenProteccion = ((corrienteMagnetotermico - corrienteNominal) \u002F corrienteNominal) * 100;\n",[54,13166,13167,13171,13176,13180,13184,13189,13193,13198,13202,13207,13211,13216,13220,13225,13229,13234,13238,13243,13247,13252,13256,13261,13265,13270,13274,13279,13283,13288,13292,13297,13301,13305,13309,13314,13318,13322],{"__ignoreMap":228},[551,13168,13169],{"class":553,"line":554},[551,13170,8157],{},[551,13172,13173],{"class":553,"line":229},[551,13174,13175],{},"\u002F\u002F PASO 2: SELECCIONAR CORRIENTE NOMINAL\n",[551,13177,13178],{"class":553,"line":670},[551,13179,8157],{},[551,13181,13182],{"class":553,"line":1136},[551,13183,1139],{"emptyLinePlaceholder":238},[551,13185,13186],{"class":553,"line":1142},[551,13187,13188],{},"int corrienteMagnetotermico;\n",[551,13190,13191],{"class":553,"line":1148},[551,13192,1139],{"emptyLinePlaceholder":238},[551,13194,13195],{"class":553,"line":1154},[551,13196,13197],{},"if (corrienteNominal \u003C= 10.0)\n",[551,13199,13200],{"class":553,"line":1160},[551,13201,1151],{},[551,13203,13204],{"class":553,"line":1166},[551,13205,13206],{},"    corrienteMagnetotermico = 10;\n",[551,13208,13209],{"class":553,"line":1172},[551,13210,1193],{},[551,13212,13213],{"class":553,"line":1178},[551,13214,13215],{},"else if (corrienteNominal \u003C= 16.0)\n",[551,13217,13218],{"class":553,"line":1184},[551,13219,1151],{},[551,13221,13222],{"class":553,"line":1190},[551,13223,13224],{},"    corrienteMagnetotermico = 16;\n",[551,13226,13227],{"class":553,"line":1472},[551,13228,1193],{},[551,13230,13231],{"class":553,"line":1477},[551,13232,13233],{},"else if (corrienteNominal \u003C= 20.0)\n",[551,13235,13236],{"class":553,"line":1797},[551,13237,1151],{},[551,13239,13240],{"class":553,"line":1802},[551,13241,13242],{},"    corrienteMagnetotermico = 20;\n",[551,13244,13245],{"class":553,"line":1808},[551,13246,1193],{},[551,13248,13249],{"class":553,"line":1814},[551,13250,13251],{},"else if (corrienteNominal \u003C= 25.0)\n",[551,13253,13254],{"class":553,"line":1820},[551,13255,1151],{},[551,13257,13258],{"class":553,"line":1826},[551,13259,13260],{},"    corrienteMagnetotermico = 25;\n",[551,13262,13263],{"class":553,"line":1832},[551,13264,1193],{},[551,13266,13267],{"class":553,"line":1838},[551,13268,13269],{},"else if (corrienteNominal \u003C= 32.0)\n",[551,13271,13272],{"class":553,"line":1844},[551,13273,1151],{},[551,13275,13276],{"class":553,"line":1850},[551,13277,13278],{},"    corrienteMagnetotermico = 32;\n",[551,13280,13281],{"class":553,"line":1855},[551,13282,1193],{},[551,13284,13285],{"class":553,"line":1861},[551,13286,13287],{},"else if (corrienteNominal \u003C= 40.0)\n",[551,13289,13290],{"class":553,"line":1867},[551,13291,1151],{},[551,13293,13294],{"class":553,"line":1873},[551,13295,13296],{},"    corrienteMagnetotermico = 40;\n",[551,13298,13299],{"class":553,"line":1878},[551,13300,1193],{},[551,13302,13303],{"class":553,"line":1883},[551,13304,3704],{},[551,13306,13307],{"class":553,"line":1888},[551,13308,1151],{},[551,13310,13311],{"class":553,"line":4615},[551,13312,13313],{},"    corrienteMagnetotermico = 63;\n",[551,13315,13316],{"class":553,"line":4620},[551,13317,1193],{},[551,13319,13320],{"class":553,"line":4626},[551,13321,1139],{"emptyLinePlaceholder":238},[551,13323,13324],{"class":553,"line":4631},[551,13325,13326],{},"double margenProteccion = ((corrienteMagnetotermico - corrienteNominal) \u002F corrienteNominal) * 100;\n",[13,13328,13329,13331],{},[16,13330,4153],{},"\nSeleccionamos el valor normalizado de corriente inmediatamente superior a la corriente nominal del circuito.",[43,13333],{},[331,13335,13337],{"id":13336},"paso-4-selección-de-sección-de-cable","Paso 4: Selección de sección de cable",[543,13339,13341],{"className":545,"code":13340,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 3: SELECCIONAR SECCIÓN DE CABLE\n\u002F\u002F ========================================\n\ndouble seccionCable;\ndouble corrienteAdmisible;\n\n\u002F\u002F Tabla simplificada de corrientes admisibles (instalación tipo B)\nif (corrienteMagnetotermico \u003C= 10)\n{\n    seccionCable = 1.5;\n    corrienteAdmisible = 15.0;\n}\nelse if (corrienteMagnetotermico \u003C= 16)\n{\n    seccionCable = 2.5;\n    corrienteAdmisible = 21.0;\n}\nelse if (corrienteMagnetotermico \u003C= 20)\n{\n    seccionCable = 4.0;\n    corrienteAdmisible = 27.0;\n}\nelse if (corrienteMagnetotermico \u003C= 25)\n{\n    seccionCable = 6.0;\n    corrienteAdmisible = 36.0;\n}\nelse if (corrienteMagnetotermico \u003C= 32)\n{\n    seccionCable = 10.0;\n    corrienteAdmisible = 50.0;\n}\nelse if (corrienteMagnetotermico \u003C= 40)\n{\n    seccionCable = 16.0;\n    corrienteAdmisible = 68.0;\n}\nelse\n{\n    seccionCable = 25.0;\n    corrienteAdmisible = 89.0;\n}\n\n\u002F\u002F Validar que el cable soporte la corriente del magnetotérmico\nbool cableSuficiente = (corrienteAdmisible >= corrienteMagnetotermico);\n",[54,13342,13343,13347,13352,13356,13360,13364,13369,13373,13378,13383,13387,13392,13397,13401,13406,13410,13415,13420,13424,13429,13433,13438,13443,13447,13452,13456,13461,13466,13470,13475,13479,13484,13489,13493,13498,13502,13507,13512,13516,13520,13524,13529,13534,13538,13542,13547],{"__ignoreMap":228},[551,13344,13345],{"class":553,"line":554},[551,13346,8157],{},[551,13348,13349],{"class":553,"line":229},[551,13350,13351],{},"\u002F\u002F PASO 3: SELECCIONAR SECCIÓN DE CABLE\n",[551,13353,13354],{"class":553,"line":670},[551,13355,8157],{},[551,13357,13358],{"class":553,"line":1136},[551,13359,1139],{"emptyLinePlaceholder":238},[551,13361,13362],{"class":553,"line":1142},[551,13363,3325],{},[551,13365,13366],{"class":553,"line":1148},[551,13367,13368],{},"double corrienteAdmisible;\n",[551,13370,13371],{"class":553,"line":1154},[551,13372,1139],{"emptyLinePlaceholder":238},[551,13374,13375],{"class":553,"line":1160},[551,13376,13377],{},"\u002F\u002F Tabla simplificada de corrientes admisibles (instalación tipo B)\n",[551,13379,13380],{"class":553,"line":1166},[551,13381,13382],{},"if (corrienteMagnetotermico \u003C= 10)\n",[551,13384,13385],{"class":553,"line":1172},[551,13386,1151],{},[551,13388,13389],{"class":553,"line":1178},[551,13390,13391],{},"    seccionCable = 1.5;\n",[551,13393,13394],{"class":553,"line":1184},[551,13395,13396],{},"    corrienteAdmisible = 15.0;\n",[551,13398,13399],{"class":553,"line":1190},[551,13400,1193],{},[551,13402,13403],{"class":553,"line":1472},[551,13404,13405],{},"else if (corrienteMagnetotermico \u003C= 16)\n",[551,13407,13408],{"class":553,"line":1477},[551,13409,1151],{},[551,13411,13412],{"class":553,"line":1797},[551,13413,13414],{},"    seccionCable = 2.5;\n",[551,13416,13417],{"class":553,"line":1802},[551,13418,13419],{},"    corrienteAdmisible = 21.0;\n",[551,13421,13422],{"class":553,"line":1808},[551,13423,1193],{},[551,13425,13426],{"class":553,"line":1814},[551,13427,13428],{},"else if (corrienteMagnetotermico \u003C= 20)\n",[551,13430,13431],{"class":553,"line":1820},[551,13432,1151],{},[551,13434,13435],{"class":553,"line":1826},[551,13436,13437],{},"    seccionCable = 4.0;\n",[551,13439,13440],{"class":553,"line":1832},[551,13441,13442],{},"    corrienteAdmisible = 27.0;\n",[551,13444,13445],{"class":553,"line":1838},[551,13446,1193],{},[551,13448,13449],{"class":553,"line":1844},[551,13450,13451],{},"else if (corrienteMagnetotermico \u003C= 25)\n",[551,13453,13454],{"class":553,"line":1850},[551,13455,1151],{},[551,13457,13458],{"class":553,"line":1855},[551,13459,13460],{},"    seccionCable = 6.0;\n",[551,13462,13463],{"class":553,"line":1861},[551,13464,13465],{},"    corrienteAdmisible = 36.0;\n",[551,13467,13468],{"class":553,"line":1867},[551,13469,1193],{},[551,13471,13472],{"class":553,"line":1873},[551,13473,13474],{},"else if (corrienteMagnetotermico \u003C= 32)\n",[551,13476,13477],{"class":553,"line":1878},[551,13478,1151],{},[551,13480,13481],{"class":553,"line":1883},[551,13482,13483],{},"    seccionCable = 10.0;\n",[551,13485,13486],{"class":553,"line":1888},[551,13487,13488],{},"    corrienteAdmisible = 50.0;\n",[551,13490,13491],{"class":553,"line":4615},[551,13492,1193],{},[551,13494,13495],{"class":553,"line":4620},[551,13496,13497],{},"else if (corrienteMagnetotermico \u003C= 40)\n",[551,13499,13500],{"class":553,"line":4626},[551,13501,1151],{},[551,13503,13504],{"class":553,"line":4631},[551,13505,13506],{},"    seccionCable = 16.0;\n",[551,13508,13509],{"class":553,"line":4636},[551,13510,13511],{},"    corrienteAdmisible = 68.0;\n",[551,13513,13514],{"class":553,"line":4641},[551,13515,1193],{},[551,13517,13518],{"class":553,"line":4647},[551,13519,3704],{},[551,13521,13522],{"class":553,"line":4653},[551,13523,1151],{},[551,13525,13526],{"class":553,"line":4659},[551,13527,13528],{},"    seccionCable = 25.0;\n",[551,13530,13531],{"class":553,"line":4665},[551,13532,13533],{},"    corrienteAdmisible = 89.0;\n",[551,13535,13536],{"class":553,"line":4671},[551,13537,1193],{},[551,13539,13540],{"class":553,"line":4677},[551,13541,1139],{"emptyLinePlaceholder":238},[551,13543,13544],{"class":553,"line":4683},[551,13545,13546],{},"\u002F\u002F Validar que el cable soporte la corriente del magnetotérmico\n",[551,13548,13549],{"class":553,"line":4689},[551,13550,13551],{},"bool cableSuficiente = (corrienteAdmisible >= corrienteMagnetotermico);\n",[13,13553,13554,13556],{},[16,13555,4153],{},"\nSeleccionamos la sección de cable que puede soportar la corriente del magnetotérmico, siguiendo tablas de corrientes admisibles.",[43,13558],{},[331,13560,13562],{"id":13561},"paso-5-selección-de-tipo-de-cable-según-ambiente","Paso 5: Selección de tipo de cable según ambiente",[543,13564,13566],{"className":545,"code":13565,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 4: SELECCIONAR TIPO DE CABLE\n\u002F\u002F ========================================\n\nstring tipoCable;\nstring descripcionCable;\n\nif (ambienteHumedo)\n{\n    tipoCable = \"H07RN-F\";\n    descripcionCable = \"Cable flexible resistente a humedad y aceites\";\n}\nelse\n{\n    tipoCable = \"H07V-K\";\n    descripcionCable = \"Cable flexible para instalación estándar\";\n}\n",[54,13567,13568,13572,13577,13581,13585,13590,13595,13599,13603,13607,13612,13617,13621,13625,13629,13634,13639],{"__ignoreMap":228},[551,13569,13570],{"class":553,"line":554},[551,13571,8157],{},[551,13573,13574],{"class":553,"line":229},[551,13575,13576],{},"\u002F\u002F PASO 4: SELECCIONAR TIPO DE CABLE\n",[551,13578,13579],{"class":553,"line":670},[551,13580,8157],{},[551,13582,13583],{"class":553,"line":1136},[551,13584,1139],{"emptyLinePlaceholder":238},[551,13586,13587],{"class":553,"line":1142},[551,13588,13589],{},"string tipoCable;\n",[551,13591,13592],{"class":553,"line":1148},[551,13593,13594],{},"string descripcionCable;\n",[551,13596,13597],{"class":553,"line":1154},[551,13598,1139],{"emptyLinePlaceholder":238},[551,13600,13601],{"class":553,"line":1160},[551,13602,11460],{},[551,13604,13605],{"class":553,"line":1166},[551,13606,1151],{},[551,13608,13609],{"class":553,"line":1172},[551,13610,13611],{},"    tipoCable = \"H07RN-F\";\n",[551,13613,13614],{"class":553,"line":1178},[551,13615,13616],{},"    descripcionCable = \"Cable flexible resistente a humedad y aceites\";\n",[551,13618,13619],{"class":553,"line":1184},[551,13620,1193],{},[551,13622,13623],{"class":553,"line":1190},[551,13624,3704],{},[551,13626,13627],{"class":553,"line":1472},[551,13628,1151],{},[551,13630,13631],{"class":553,"line":1477},[551,13632,13633],{},"    tipoCable = \"H07V-K\";\n",[551,13635,13636],{"class":553,"line":1797},[551,13637,13638],{},"    descripcionCable = \"Cable flexible para instalación estándar\";\n",[551,13640,13641],{"class":553,"line":1802},[551,13642,1193],{},[43,13644],{},[331,13646,13648],{"id":13647},"paso-6-cálculo-de-caída-de-tensión","Paso 6: Cálculo de caída de tensión",[543,13650,13652],{"className":545,"code":13651,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 5: CALCULAR CAÍDA DE TENSIÓN\n\u002F\u002F ========================================\n\ndouble resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\ndouble caidaTension = (2 * longitudCable * corrienteNominal * resistividadCobre) \u002F seccionCable;\ndouble porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n\nbool caidaAceptable = (porcentajeCaida \u003C= 3.0);\n\nstring advertenciaCaida = \"\";\nif (!caidaAceptable)\n{\n    advertenciaCaida = \"\\n¡ADVERTENCIA! Caída de tensión excede 3%\";\n    \u002F\u002F Sugerir sección superior\n    double seccionSuperior = seccionCable;\n    if (seccionCable == 1.5) seccionSuperior = 2.5;\n    else if (seccionCable == 2.5) seccionSuperior = 4.0;\n    else if (seccionCable == 4.0) seccionSuperior = 6.0;\n    else if (seccionCable == 6.0) seccionSuperior = 10.0;\n    else if (seccionCable == 10.0) seccionSuperior = 16.0;\n    else if (seccionCable == 16.0) seccionSuperior = 25.0;\n\n    advertenciaCaida += string.Format(\"\\nConsiderar sección {0}mm²\", seccionSuperior);\n}\n",[54,13653,13654,13658,13663,13667,13671,13675,13680,13684,13688,13693,13697,13702,13707,13711,13716,13721,13726,13731,13736,13741,13746,13751,13756,13760,13765],{"__ignoreMap":228},[551,13655,13656],{"class":553,"line":554},[551,13657,8157],{},[551,13659,13660],{"class":553,"line":229},[551,13661,13662],{},"\u002F\u002F PASO 5: CALCULAR CAÍDA DE TENSIÓN\n",[551,13664,13665],{"class":553,"line":670},[551,13666,8157],{},[551,13668,13669],{"class":553,"line":1136},[551,13670,1139],{"emptyLinePlaceholder":238},[551,13672,13673],{"class":553,"line":1142},[551,13674,8372],{},[551,13676,13677],{"class":553,"line":1148},[551,13678,13679],{},"double caidaTension = (2 * longitudCable * corrienteNominal * resistividadCobre) \u002F seccionCable;\n",[551,13681,13682],{"class":553,"line":1154},[551,13683,7792],{},[551,13685,13686],{"class":553,"line":1160},[551,13687,1139],{"emptyLinePlaceholder":238},[551,13689,13690],{"class":553,"line":1166},[551,13691,13692],{},"bool caidaAceptable = (porcentajeCaida \u003C= 3.0);\n",[551,13694,13695],{"class":553,"line":1172},[551,13696,1139],{"emptyLinePlaceholder":238},[551,13698,13699],{"class":553,"line":1178},[551,13700,13701],{},"string advertenciaCaida = \"\";\n",[551,13703,13704],{"class":553,"line":1184},[551,13705,13706],{},"if (!caidaAceptable)\n",[551,13708,13709],{"class":553,"line":1190},[551,13710,1151],{},[551,13712,13713],{"class":553,"line":1472},[551,13714,13715],{},"    advertenciaCaida = \"\\n¡ADVERTENCIA! Caída de tensión excede 3%\";\n",[551,13717,13718],{"class":553,"line":1477},[551,13719,13720],{},"    \u002F\u002F Sugerir sección superior\n",[551,13722,13723],{"class":553,"line":1797},[551,13724,13725],{},"    double seccionSuperior = seccionCable;\n",[551,13727,13728],{"class":553,"line":1802},[551,13729,13730],{},"    if (seccionCable == 1.5) seccionSuperior = 2.5;\n",[551,13732,13733],{"class":553,"line":1808},[551,13734,13735],{},"    else if (seccionCable == 2.5) seccionSuperior = 4.0;\n",[551,13737,13738],{"class":553,"line":1814},[551,13739,13740],{},"    else if (seccionCable == 4.0) seccionSuperior = 6.0;\n",[551,13742,13743],{"class":553,"line":1820},[551,13744,13745],{},"    else if (seccionCable == 6.0) seccionSuperior = 10.0;\n",[551,13747,13748],{"class":553,"line":1826},[551,13749,13750],{},"    else if (seccionCable == 10.0) seccionSuperior = 16.0;\n",[551,13752,13753],{"class":553,"line":1832},[551,13754,13755],{},"    else if (seccionCable == 16.0) seccionSuperior = 25.0;\n",[551,13757,13758],{"class":553,"line":1838},[551,13759,1139],{"emptyLinePlaceholder":238},[551,13761,13762],{"class":553,"line":1844},[551,13763,13764],{},"    advertenciaCaida += string.Format(\"\\nConsiderar sección {0}mm²\", seccionSuperior);\n",[551,13766,13767],{"class":553,"line":1850},[551,13768,1193],{},[13,13770,13771,13773],{},[16,13772,4153],{},"\nCalculamos la caída de tensión y verificamos que esté bajo el 3%. Si no, sugerimos una sección superior.",[43,13775],{},[331,13777,13779],{"id":13778},"paso-7-selección-de-diferencial","Paso 7: Selección de diferencial",[543,13781,13783],{"className":545,"code":13782,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 6: SELECCIONAR DIFERENCIAL\n\u002F\u002F ========================================\n\nstring tipoDiferencial;\nint sensibilidadDiferencial;  \u002F\u002F mA\nint corrienteDiferencial;\n\n\u002F\u002F Tipo de diferencial según carga\nif (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n{\n    tipoDiferencial = \"Tipo A\";  \u002F\u002F Sensible a corriente alterna y continua pulsante\n}\nelse if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n{\n    tipoDiferencial = \"Tipo B\";  \u002F\u002F Sensible a corriente continua\n}\nelse\n{\n    tipoDiferencial = \"Tipo AC\";  \u002F\u002F Sensible a corriente alterna (estándar)\n}\n\n\u002F\u002F Sensibilidad según ambiente\nif (ambienteHumedo)\n{\n    sensibilidadDiferencial = 30;  \u002F\u002F Alta sensibilidad en ambiente húmedo\n}\nelse\n{\n    if (corrienteMagnetotermico > 32)\n    {\n        sensibilidadDiferencial = 300;  \u002F\u002F Menor sensibilidad para altas corrientes\n    }\n    else\n    {\n        sensibilidadDiferencial = 30;\n    }\n}\n\n\u002F\u002F Corriente nominal del diferencial (debe ser >= magnetotérmico)\nif (corrienteMagnetotermico \u003C= 25)\n{\n    corrienteDiferencial = 25;\n}\nelse if (corrienteMagnetotermico \u003C= 40)\n{\n    corrienteDiferencial = 40;\n}\nelse\n{\n    corrienteDiferencial = 63;\n}\n",[54,13784,13785,13789,13794,13798,13802,13807,13812,13817,13821,13826,13830,13834,13839,13843,13847,13851,13856,13860,13864,13868,13873,13877,13881,13886,13890,13894,13899,13903,13907,13911,13916,13920,13925,13929,13933,13937,13942,13946,13950,13954,13959,13964,13968,13973,13977,13981,13985,13990,13994,13998,14002,14007],{"__ignoreMap":228},[551,13786,13787],{"class":553,"line":554},[551,13788,8157],{},[551,13790,13791],{"class":553,"line":229},[551,13792,13793],{},"\u002F\u002F PASO 6: SELECCIONAR DIFERENCIAL\n",[551,13795,13796],{"class":553,"line":670},[551,13797,8157],{},[551,13799,13800],{"class":553,"line":1136},[551,13801,1139],{"emptyLinePlaceholder":238},[551,13803,13804],{"class":553,"line":1142},[551,13805,13806],{},"string tipoDiferencial;\n",[551,13808,13809],{"class":553,"line":1148},[551,13810,13811],{},"int sensibilidadDiferencial;  \u002F\u002F mA\n",[551,13813,13814],{"class":553,"line":1154},[551,13815,13816],{},"int corrienteDiferencial;\n",[551,13818,13819],{"class":553,"line":1160},[551,13820,1139],{"emptyLinePlaceholder":238},[551,13822,13823],{"class":553,"line":1166},[551,13824,13825],{},"\u002F\u002F Tipo de diferencial según carga\n",[551,13827,13828],{"class":553,"line":1172},[551,13829,13060],{},[551,13831,13832],{"class":553,"line":1178},[551,13833,1151],{},[551,13835,13836],{"class":553,"line":1184},[551,13837,13838],{},"    tipoDiferencial = \"Tipo A\";  \u002F\u002F Sensible a corriente alterna y continua pulsante\n",[551,13840,13841],{"class":553,"line":1190},[551,13842,1193],{},[551,13844,13845],{"class":553,"line":1472},[551,13846,13106],{},[551,13848,13849],{"class":553,"line":1477},[551,13850,1151],{},[551,13852,13853],{"class":553,"line":1797},[551,13854,13855],{},"    tipoDiferencial = \"Tipo B\";  \u002F\u002F Sensible a corriente continua\n",[551,13857,13858],{"class":553,"line":1802},[551,13859,1193],{},[551,13861,13862],{"class":553,"line":1808},[551,13863,3704],{},[551,13865,13866],{"class":553,"line":1814},[551,13867,1151],{},[551,13869,13870],{"class":553,"line":1820},[551,13871,13872],{},"    tipoDiferencial = \"Tipo AC\";  \u002F\u002F Sensible a corriente alterna (estándar)\n",[551,13874,13875],{"class":553,"line":1826},[551,13876,1193],{},[551,13878,13879],{"class":553,"line":1832},[551,13880,1139],{"emptyLinePlaceholder":238},[551,13882,13883],{"class":553,"line":1838},[551,13884,13885],{},"\u002F\u002F Sensibilidad según ambiente\n",[551,13887,13888],{"class":553,"line":1844},[551,13889,11460],{},[551,13891,13892],{"class":553,"line":1850},[551,13893,1151],{},[551,13895,13896],{"class":553,"line":1855},[551,13897,13898],{},"    sensibilidadDiferencial = 30;  \u002F\u002F Alta sensibilidad en ambiente húmedo\n",[551,13900,13901],{"class":553,"line":1861},[551,13902,1193],{},[551,13904,13905],{"class":553,"line":1867},[551,13906,3704],{},[551,13908,13909],{"class":553,"line":1873},[551,13910,1151],{},[551,13912,13913],{"class":553,"line":1878},[551,13914,13915],{},"    if (corrienteMagnetotermico > 32)\n",[551,13917,13918],{"class":553,"line":1883},[551,13919,1169],{},[551,13921,13922],{"class":553,"line":1888},[551,13923,13924],{},"        sensibilidadDiferencial = 300;  \u002F\u002F Menor sensibilidad para altas corrientes\n",[551,13926,13927],{"class":553,"line":4615},[551,13928,1187],{},[551,13930,13931],{"class":553,"line":4620},[551,13932,12046],{},[551,13934,13935],{"class":553,"line":4626},[551,13936,1169],{},[551,13938,13939],{"class":553,"line":4631},[551,13940,13941],{},"        sensibilidadDiferencial = 30;\n",[551,13943,13944],{"class":553,"line":4636},[551,13945,1187],{},[551,13947,13948],{"class":553,"line":4641},[551,13949,1193],{},[551,13951,13952],{"class":553,"line":4647},[551,13953,1139],{"emptyLinePlaceholder":238},[551,13955,13956],{"class":553,"line":4653},[551,13957,13958],{},"\u002F\u002F Corriente nominal del diferencial (debe ser >= magnetotérmico)\n",[551,13960,13961],{"class":553,"line":4659},[551,13962,13963],{},"if (corrienteMagnetotermico \u003C= 25)\n",[551,13965,13966],{"class":553,"line":4665},[551,13967,1151],{},[551,13969,13970],{"class":553,"line":4671},[551,13971,13972],{},"    corrienteDiferencial = 25;\n",[551,13974,13975],{"class":553,"line":4677},[551,13976,1193],{},[551,13978,13979],{"class":553,"line":4683},[551,13980,13497],{},[551,13982,13983],{"class":553,"line":4689},[551,13984,1151],{},[551,13986,13987],{"class":553,"line":4695},[551,13988,13989],{},"    corrienteDiferencial = 40;\n",[551,13991,13992],{"class":553,"line":4701},[551,13993,1193],{},[551,13995,13996],{"class":553,"line":4707},[551,13997,3704],{},[551,13999,14000],{"class":553,"line":4713},[551,14001,1151],{},[551,14003,14004],{"class":553,"line":4719},[551,14005,14006],{},"    corrienteDiferencial = 63;\n",[551,14008,14009],{"class":553,"line":4725},[551,14010,1193],{},[13,14012,14013,14015],{},[16,14014,4153],{},"\nSeleccionamos el tipo de diferencial según la carga, la sensibilidad según el ambiente, y la corriente nominal.",[43,14017],{},[331,14019,14021],{"id":14020},"paso-8-construcción-del-reporte-final","Paso 8: Construcción del reporte final",[543,14023,14025],{"className":545,"code":14024,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F CONSTRUCCIÓN DEL REPORTE\n\u002F\u002F ========================================\n\nstring reporte = string.Format(\n    \"=== SELECTOR AUTOMÁTICO DE PROTECCIONES ===\\n\\n\" +\n    \"DATOS DEL CIRCUITO:\\n\" +\n    \"- Nombre: {0}\\n\" +\n    \"- Tipo de carga: {1}\\n\" +\n    \"- Corriente nominal: {2:F1} A\\n\" +\n    \"- Longitud: {3:F1} m\\n\" +\n    \"- Ambiente húmedo: {4}\\n\\n\" +\n    \"PROTECCIÓN MAGNETOTÉRMICA:\\n\" +\n    \"- {5} - {6}A\\n\" +\n    \"- Justificación: {7}\\n\" +\n    \"- Margen: {8:F1}%\\n\\n\" +\n    \"CABLE:\\n\" +\n    \"- Tipo: {9}\\n\" +\n    \"- Sección: {10}mm²\\n\" +\n    \"- Descripción: {11}\\n\" +\n    \"- Corriente admisible: {12:F1}A\\n\\n\" +\n    \"PROTECCIÓN DIFERENCIAL:\\n\" +\n    \"- {13} - {14}mA - {15}A\\n\\n\" +\n    \"CAÍDA DE TENSIÓN:\\n\" +\n    \"- Calculada: {16:F2}V ({17:F2}%)\\n\" +\n    \"- Estado: {18}{19}\",\n    nombreCircuito,\n    tipoCarga,\n    corrienteNominal,\n    longitudCable,\n    ambienteHumedo ? \"Sí\" : \"No\",\n    curvaDisparo,\n    corrienteMagnetotermico,\n    justificacionCurva,\n    margenProteccion,\n    tipoCable,\n    seccionCable,\n    descripcionCable,\n    corrienteAdmisible,\n    tipoDiferencial,\n    sensibilidadDiferencial,\n    corrienteDiferencial,\n    caidaTension,\n    porcentajeCaida,\n    caidaAceptable ? \"Aceptable (\u003C 3%)\" : \"Excesiva (> 3%)\",\n    advertenciaCaida\n);\n\n\u002F\u002F ========================================\n\u002F\u002F MOSTRAR REPORTE\n\u002F\u002F ========================================\n\nMessageBoxIcon icono = caidaAceptable ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n\nMessageBox.Show(reporte, \"Selector de Protecciones\", MessageBoxButtons.OK, icono);\n",[54,14026,14027,14031,14035,14039,14043,14047,14052,14057,14062,14067,14072,14077,14082,14087,14092,14097,14102,14107,14112,14117,14122,14127,14132,14137,14142,14147,14152,14156,14161,14166,14170,14175,14180,14185,14190,14195,14200,14204,14209,14214,14219,14224,14229,14234,14239,14244,14249,14253,14257,14261,14265,14269,14273,14278,14282],{"__ignoreMap":228},[551,14028,14029],{"class":553,"line":554},[551,14030,8157],{},[551,14032,14033],{"class":553,"line":229},[551,14034,8695],{},[551,14036,14037],{"class":553,"line":670},[551,14038,8157],{},[551,14040,14041],{"class":553,"line":1136},[551,14042,1139],{"emptyLinePlaceholder":238},[551,14044,14045],{"class":553,"line":1142},[551,14046,8708],{},[551,14048,14049],{"class":553,"line":1148},[551,14050,14051],{},"    \"=== SELECTOR AUTOMÁTICO DE PROTECCIONES ===\\n\\n\" +\n",[551,14053,14054],{"class":553,"line":1154},[551,14055,14056],{},"    \"DATOS DEL CIRCUITO:\\n\" +\n",[551,14058,14059],{"class":553,"line":1160},[551,14060,14061],{},"    \"- Nombre: {0}\\n\" +\n",[551,14063,14064],{"class":553,"line":1166},[551,14065,14066],{},"    \"- Tipo de carga: {1}\\n\" +\n",[551,14068,14069],{"class":553,"line":1172},[551,14070,14071],{},"    \"- Corriente nominal: {2:F1} A\\n\" +\n",[551,14073,14074],{"class":553,"line":1178},[551,14075,14076],{},"    \"- Longitud: {3:F1} m\\n\" +\n",[551,14078,14079],{"class":553,"line":1184},[551,14080,14081],{},"    \"- Ambiente húmedo: {4}\\n\\n\" +\n",[551,14083,14084],{"class":553,"line":1190},[551,14085,14086],{},"    \"PROTECCIÓN MAGNETOTÉRMICA:\\n\" +\n",[551,14088,14089],{"class":553,"line":1472},[551,14090,14091],{},"    \"- {5} - {6}A\\n\" +\n",[551,14093,14094],{"class":553,"line":1477},[551,14095,14096],{},"    \"- Justificación: {7}\\n\" +\n",[551,14098,14099],{"class":553,"line":1797},[551,14100,14101],{},"    \"- Margen: {8:F1}%\\n\\n\" +\n",[551,14103,14104],{"class":553,"line":1802},[551,14105,14106],{},"    \"CABLE:\\n\" +\n",[551,14108,14109],{"class":553,"line":1808},[551,14110,14111],{},"    \"- Tipo: {9}\\n\" +\n",[551,14113,14114],{"class":553,"line":1814},[551,14115,14116],{},"    \"- Sección: {10}mm²\\n\" +\n",[551,14118,14119],{"class":553,"line":1820},[551,14120,14121],{},"    \"- Descripción: {11}\\n\" +\n",[551,14123,14124],{"class":553,"line":1826},[551,14125,14126],{},"    \"- Corriente admisible: {12:F1}A\\n\\n\" +\n",[551,14128,14129],{"class":553,"line":1832},[551,14130,14131],{},"    \"PROTECCIÓN DIFERENCIAL:\\n\" +\n",[551,14133,14134],{"class":553,"line":1838},[551,14135,14136],{},"    \"- {13} - {14}mA - {15}A\\n\\n\" +\n",[551,14138,14139],{"class":553,"line":1844},[551,14140,14141],{},"    \"CAÍDA DE TENSIÓN:\\n\" +\n",[551,14143,14144],{"class":553,"line":1850},[551,14145,14146],{},"    \"- Calculada: {16:F2}V ({17:F2}%)\\n\" +\n",[551,14148,14149],{"class":553,"line":1855},[551,14150,14151],{},"    \"- Estado: {18}{19}\",\n",[551,14153,14154],{"class":553,"line":1861},[551,14155,4346],{},[551,14157,14158],{"class":553,"line":1867},[551,14159,14160],{},"    tipoCarga,\n",[551,14162,14163],{"class":553,"line":1873},[551,14164,14165],{},"    corrienteNominal,\n",[551,14167,14168],{"class":553,"line":1878},[551,14169,8816],{},[551,14171,14172],{"class":553,"line":1883},[551,14173,14174],{},"    ambienteHumedo ? \"Sí\" : \"No\",\n",[551,14176,14177],{"class":553,"line":1888},[551,14178,14179],{},"    curvaDisparo,\n",[551,14181,14182],{"class":553,"line":4615},[551,14183,14184],{},"    corrienteMagnetotermico,\n",[551,14186,14187],{"class":553,"line":4620},[551,14188,14189],{},"    justificacionCurva,\n",[551,14191,14192],{"class":553,"line":4626},[551,14193,14194],{},"    margenProteccion,\n",[551,14196,14197],{"class":553,"line":4631},[551,14198,14199],{},"    tipoCable,\n",[551,14201,14202],{"class":553,"line":4636},[551,14203,8811],{},[551,14205,14206],{"class":553,"line":4641},[551,14207,14208],{},"    descripcionCable,\n",[551,14210,14211],{"class":553,"line":4647},[551,14212,14213],{},"    corrienteAdmisible,\n",[551,14215,14216],{"class":553,"line":4653},[551,14217,14218],{},"    tipoDiferencial,\n",[551,14220,14221],{"class":553,"line":4659},[551,14222,14223],{},"    sensibilidadDiferencial,\n",[551,14225,14226],{"class":553,"line":4665},[551,14227,14228],{},"    corrienteDiferencial,\n",[551,14230,14231],{"class":553,"line":4671},[551,14232,14233],{},"    caidaTension,\n",[551,14235,14236],{"class":553,"line":4677},[551,14237,14238],{},"    porcentajeCaida,\n",[551,14240,14241],{"class":553,"line":4683},[551,14242,14243],{},"    caidaAceptable ? \"Aceptable (\u003C 3%)\" : \"Excesiva (> 3%)\",\n",[551,14245,14246],{"class":553,"line":4689},[551,14247,14248],{},"    advertenciaCaida\n",[551,14250,14251],{"class":553,"line":4695},[551,14252,3967],{},[551,14254,14255],{"class":553,"line":4701},[551,14256,1139],{"emptyLinePlaceholder":238},[551,14258,14259],{"class":553,"line":4707},[551,14260,8157],{},[551,14262,14263],{"class":553,"line":4713},[551,14264,8843],{},[551,14266,14267],{"class":553,"line":4719},[551,14268,8157],{},[551,14270,14271],{"class":553,"line":4725},[551,14272,1139],{"emptyLinePlaceholder":238},[551,14274,14275],{"class":553,"line":4731},[551,14276,14277],{},"MessageBoxIcon icono = caidaAceptable ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n",[551,14279,14280],{"class":553,"line":4737},[551,14281,1139],{"emptyLinePlaceholder":238},[551,14283,14284],{"class":553,"line":4743},[551,14285,14286],{},"MessageBox.Show(reporte, \"Selector de Protecciones\", MessageBoxButtons.OK, icono);\n",[43,14288],{},[331,14290,4465],{"id":4464},[543,14292,14294],{"className":545,"code":14293,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class SelectorProtecciones\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DEL CIRCUITO\n        \u002F\u002F ========================================\n\n        string nombreCircuito = \"Línea producción - Zona 2\";\n        string tipoCarga = \"Motor\";  \u002F\u002F Opciones: \"Iluminacion\", \"Motor\", \"Tomas\", \"Informatica\"\n        double corrienteNominal = 18.5;  \u002F\u002F Amperios\n        double longitudCable = 42.0;     \u002F\u002F Metros\n        bool ambienteHumedo = false;\n        double voltajeNominal = 230.0;   \u002F\u002F Voltios\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 1: SELECCIONAR CURVA DE DISPARO\n        \u002F\u002F ========================================\n\n        string curvaDisparo;\n        string justificacionCurva;\n\n        if (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n        {\n            curvaDisparo = \"Curva D\";\n            justificacionCurva = \"Motores tienen alta corriente de arranque (6-8x In)\";\n        }\n        else if (tipoCarga.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n        {\n            curvaDisparo = \"Curva B\";\n            justificacionCurva = \"Iluminación tiene bajo pico de arranque\";\n        }\n        else if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n        {\n            curvaDisparo = \"Curva C\";\n            justificacionCurva = \"Equipos informáticos tienen pico moderado\";\n        }\n        else\n        {\n            \u002F\u002F Tomas y uso general\n            curvaDisparo = \"Curva C\";\n            justificacionCurva = \"Uso general y tomas de corriente\";\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 2: SELECCIONAR CORRIENTE NOMINAL\n        \u002F\u002F ========================================\n\n        int corrienteMagnetotermico;\n\n        if (corrienteNominal \u003C= 10.0)\n        {\n            corrienteMagnetotermico = 10;\n        }\n        else if (corrienteNominal \u003C= 16.0)\n        {\n            corrienteMagnetotermico = 16;\n        }\n        else if (corrienteNominal \u003C= 20.0)\n        {\n            corrienteMagnetotermico = 20;\n        }\n        else if (corrienteNominal \u003C= 25.0)\n        {\n            corrienteMagnetotermico = 25;\n        }\n        else if (corrienteNominal \u003C= 32.0)\n        {\n            corrienteMagnetotermico = 32;\n        }\n        else if (corrienteNominal \u003C= 40.0)\n        {\n            corrienteMagnetotermico = 40;\n        }\n        else\n        {\n            corrienteMagnetotermico = 63;\n        }\n\n        double margenProteccion = ((corrienteMagnetotermico - corrienteNominal) \u002F corrienteNominal) * 100;\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 3: SELECCIONAR SECCIÓN DE CABLE\n        \u002F\u002F ========================================\n\n        double seccionCable;\n        double corrienteAdmisible;\n\n        \u002F\u002F Tabla simplificada de corrientes admisibles (instalación tipo B)\n        if (corrienteMagnetotermico \u003C= 10)\n        {\n            seccionCable = 1.5;\n            corrienteAdmisible = 15.0;\n        }\n        else if (corrienteMagnetotermico \u003C= 16)\n        {\n            seccionCable = 2.5;\n            corrienteAdmisible = 21.0;\n        }\n        else if (corrienteMagnetotermico \u003C= 20)\n        {\n            seccionCable = 4.0;\n            corrienteAdmisible = 27.0;\n        }\n        else if (corrienteMagnetotermico \u003C= 25)\n        {\n            seccionCable = 6.0;\n            corrienteAdmisible = 36.0;\n        }\n        else if (corrienteMagnetotermico \u003C= 32)\n        {\n            seccionCable = 10.0;\n            corrienteAdmisible = 50.0;\n        }\n        else if (corrienteMagnetotermico \u003C= 40)\n        {\n            seccionCable = 16.0;\n            corrienteAdmisible = 68.0;\n        }\n        else\n        {\n            seccionCable = 25.0;\n            corrienteAdmisible = 89.0;\n        }\n\n        \u002F\u002F Validar que el cable soporte la corriente del magnetotérmico\n        bool cableSuficiente = (corrienteAdmisible >= corrienteMagnetotermico);\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 4: SELECCIONAR TIPO DE CABLE\n        \u002F\u002F ========================================\n\n        string tipoCable;\n        string descripcionCable;\n\n        if (ambienteHumedo)\n        {\n            tipoCable = \"H07RN-F\";\n            descripcionCable = \"Cable flexible resistente a humedad y aceites\";\n        }\n        else\n        {\n            tipoCable = \"H07V-K\";\n            descripcionCable = \"Cable flexible para instalación estándar\";\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 5: CALCULAR CAÍDA DE TENSIÓN\n        \u002F\u002F ========================================\n\n        double resistividadCobre = 0.018;  \u002F\u002F Ω·mm²\u002Fm\n        double caidaTension = (2 * longitudCable * corrienteNominal * resistividadCobre) \u002F seccionCable;\n        double porcentajeCaida = (caidaTension \u002F voltajeNominal) * 100;\n\n        bool caidaAceptable = (porcentajeCaida \u003C= 3.0);\n\n        string advertenciaCaida = \"\";\n        if (!caidaAceptable)\n        {\n            advertenciaCaida = \"\\n¡ADVERTENCIA! Caída de tensión excede 3%\";\n            \u002F\u002F Sugerir sección superior\n            double seccionSuperior = seccionCable;\n            if (seccionCable == 1.5) seccionSuperior = 2.5;\n            else if (seccionCable == 2.5) seccionSuperior = 4.0;\n            else if (seccionCable == 4.0) seccionSuperior = 6.0;\n            else if (seccionCable == 6.0) seccionSuperior = 10.0;\n            else if (seccionCable == 10.0) seccionSuperior = 16.0;\n            else if (seccionCable == 16.0) seccionSuperior = 25.0;\n\n            advertenciaCaida += string.Format(\"\\nConsiderar sección {0}mm²\", seccionSuperior);\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 6: SELECCIONAR DIFERENCIAL\n        \u002F\u002F ========================================\n\n        string tipoDiferencial;\n        int sensibilidadDiferencial;  \u002F\u002F mA\n        int corrienteDiferencial;\n\n        \u002F\u002F Tipo de diferencial según carga\n        if (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n        {\n            tipoDiferencial = \"Tipo A\";  \u002F\u002F Sensible a corriente alterna y continua pulsante\n        }\n        else if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n        {\n            tipoDiferencial = \"Tipo B\";  \u002F\u002F Sensible a corriente continua\n        }\n        else\n        {\n            tipoDiferencial = \"Tipo AC\";  \u002F\u002F Sensible a corriente alterna (estándar)\n        }\n\n        \u002F\u002F Sensibilidad según ambiente\n        if (ambienteHumedo)\n        {\n            sensibilidadDiferencial = 30;  \u002F\u002F Alta sensibilidad en ambiente húmedo\n        }\n        else\n        {\n            if (corrienteMagnetotermico > 32)\n            {\n                sensibilidadDiferencial = 300;  \u002F\u002F Menor sensibilidad para altas corrientes\n            }\n            else\n            {\n                sensibilidadDiferencial = 30;\n            }\n        }\n\n        \u002F\u002F Corriente nominal del diferencial (debe ser >= magnetotérmico)\n        if (corrienteMagnetotermico \u003C= 25)\n        {\n            corrienteDiferencial = 25;\n        }\n        else if (corrienteMagnetotermico \u003C= 40)\n        {\n            corrienteDiferencial = 40;\n        }\n        else\n        {\n            corrienteDiferencial = 63;\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F CONSTRUCCIÓN DEL REPORTE\n        \u002F\u002F ========================================\n\n        string reporte = string.Format(\n            \"=== SELECTOR AUTOMÁTICO DE PROTECCIONES ===\\n\\n\" +\n            \"DATOS DEL CIRCUITO:\\n\" +\n            \"- Nombre: {0}\\n\" +\n            \"- Tipo de carga: {1}\\n\" +\n            \"- Corriente nominal: {2:F1} A\\n\" +\n            \"- Longitud: {3:F1} m\\n\" +\n            \"- Ambiente húmedo: {4}\\n\\n\" +\n            \"PROTECCIÓN MAGNETOTÉRMICA:\\n\" +\n            \"- {5} - {6}A\\n\" +\n            \"- Justificación: {7}\\n\" +\n            \"- Margen: {8:F1}%\\n\\n\" +\n            \"CABLE:\\n\" +\n            \"- Tipo: {9}\\n\" +\n            \"- Sección: {10}mm²\\n\" +\n            \"- Descripción: {11}\\n\" +\n            \"- Corriente admisible: {12:F1}A\\n\\n\" +\n            \"PROTECCIÓN DIFERENCIAL:\\n\" +\n            \"- {13} - {14}mA - {15}A\\n\\n\" +\n            \"CAÍDA DE TENSIÓN:\\n\" +\n            \"- Calculada: {16:F2}V ({17:F2}%)\\n\" +\n            \"- Estado: {18}{19}\",\n            nombreCircuito,\n            tipoCarga,\n            corrienteNominal,\n            longitudCable,\n            ambienteHumedo ? \"Sí\" : \"No\",\n            curvaDisparo,\n            corrienteMagnetotermico,\n            justificacionCurva,\n            margenProteccion,\n            tipoCable,\n            seccionCable,\n            descripcionCable,\n            corrienteAdmisible,\n            tipoDiferencial,\n            sensibilidadDiferencial,\n            corrienteDiferencial,\n            caidaTension,\n            porcentajeCaida,\n            caidaAceptable ? \"Aceptable (\u003C 3%)\" : \"Excesiva (> 3%)\",\n            advertenciaCaida\n        );\n\n        \u002F\u002F ========================================\n        \u002F\u002F MOSTRAR REPORTE\n        \u002F\u002F ========================================\n\n        MessageBoxIcon icono = caidaAceptable ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n\n        MessageBox.Show(reporte, \"Selector de Protecciones\", MessageBoxButtons.OK, icono);\n    }\n}\n",[54,14295,14296,14300,14304,14308,14312,14316,14320,14324,14328,14332,14336,14340,14344,14348,14352,14356,14360,14364,14368,14372,14376,14380,14385,14389,14393,14398,14403,14407,14412,14416,14421,14426,14430,14435,14439,14444,14449,14453,14458,14462,14467,14472,14476,14480,14484,14489,14493,14498,14502,14506,14510,14515,14519,14523,14528,14532,14537,14541,14546,14550,14555,14559,14564,14568,14573,14577,14582,14586,14591,14595,14600,14604,14609,14613,14618,14622,14627,14631,14636,14640,14644,14648,14653,14657,14661,14666,14670,14674,14679,14683,14687,14692,14697,14701,14706,14711,14715,14720,14725,14729,14734,14738,14743,14748,14752,14757,14761,14766,14771,14775,14780,14784,14789,14794,14798,14803,14807,14812,14817,14821,14826,14830,14835,14840,14844,14848,14852,14857,14862,14866,14870,14875,14880,14884,14888,14893,14897,14901,14906,14911,14915,14920,14924,14929,14934,14938,14942,14946,14951,14956,14960,14964,14968,14973,14977,14981,14985,14990,14994,14998,15003,15007,15012,15017,15021,15026,15031,15036,15041,15046,15051,15056,15061,15066,15070,15075,15079,15083,15087,15092,15096,15100,15105,15111,15117,15122,15128,15133,15138,15144,15149,15154,15159,15165,15170,15175,15180,15186,15191,15196,15202,15207,15212,15218,15223,15228,15233,15239,15244,15250,15255,15261,15266,15272,15277,15282,15287,15293,15299,15304,15310,15315,15320,15325,15331,15336,15341,15346,15352,15357,15362,15367,15372,15377,15382,15387,15393,15399,15405,15411,15417,15423,15429,15435,15441,15447,15453,15459,15465,15471,15477,15483,15489,15495,15501,15507,15513,15518,15524,15530,15535,15541,15547,15553,15559,15565,15571,15576,15582,15588,15594,15600,15606,15612,15618,15624,15630,15635,15640,15645,15650,15655,15660,15666,15671,15677,15682],{"__ignoreMap":228},[551,14297,14298],{"class":553,"line":554},[551,14299,1123],{},[551,14301,14302],{"class":553,"line":229},[551,14303,1128],{},[551,14305,14306],{"class":553,"line":670},[551,14307,1133],{},[551,14309,14310],{"class":553,"line":1136},[551,14311,1139],{"emptyLinePlaceholder":238},[551,14313,14314],{"class":553,"line":1142},[551,14315,12943],{},[551,14317,14318],{"class":553,"line":1148},[551,14319,1151],{},[551,14321,14322],{"class":553,"line":1154},[551,14323,1157],{},[551,14325,14326],{"class":553,"line":1160},[551,14327,1163],{},[551,14329,14330],{"class":553,"line":1166},[551,14331,1169],{},[551,14333,14334],{"class":553,"line":1172},[551,14335,4511],{},[551,14337,14338],{"class":553,"line":1178},[551,14339,4516],{},[551,14341,14342],{"class":553,"line":1184},[551,14343,4511],{},[551,14345,14346],{"class":553,"line":1190},[551,14347,1139],{"emptyLinePlaceholder":238},[551,14349,14350],{"class":553,"line":1472},[551,14351,12980],{},[551,14353,14354],{"class":553,"line":1477},[551,14355,12985],{},[551,14357,14358],{"class":553,"line":1797},[551,14359,12990],{},[551,14361,14362],{"class":553,"line":1802},[551,14363,12995],{},[551,14365,14366],{"class":553,"line":1808},[551,14367,13000],{},[551,14369,14370],{"class":553,"line":1814},[551,14371,13005],{},[551,14373,14374],{"class":553,"line":1820},[551,14375,1139],{"emptyLinePlaceholder":238},[551,14377,14378],{"class":553,"line":1826},[551,14379,4511],{},[551,14381,14382],{"class":553,"line":1832},[551,14383,14384],{},"        \u002F\u002F PASO 1: SELECCIONAR CURVA DE DISPARO\n",[551,14386,14387],{"class":553,"line":1838},[551,14388,4511],{},[551,14390,14391],{"class":553,"line":1844},[551,14392,1139],{"emptyLinePlaceholder":238},[551,14394,14395],{"class":553,"line":1850},[551,14396,14397],{},"        string curvaDisparo;\n",[551,14399,14400],{"class":553,"line":1855},[551,14401,14402],{},"        string justificacionCurva;\n",[551,14404,14405],{"class":553,"line":1861},[551,14406,1139],{"emptyLinePlaceholder":238},[551,14408,14409],{"class":553,"line":1867},[551,14410,14411],{},"        if (tipoCarga.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n",[551,14413,14414],{"class":553,"line":1873},[551,14415,9062],{},[551,14417,14418],{"class":553,"line":1878},[551,14419,14420],{},"            curvaDisparo = \"Curva D\";\n",[551,14422,14423],{"class":553,"line":1883},[551,14424,14425],{},"            justificacionCurva = \"Motores tienen alta corriente de arranque (6-8x In)\";\n",[551,14427,14428],{"class":553,"line":1888},[551,14429,9077],{},[551,14431,14432],{"class":553,"line":4615},[551,14433,14434],{},"        else if (tipoCarga.Equals(\"Iluminacion\", StringComparison.OrdinalIgnoreCase))\n",[551,14436,14437],{"class":553,"line":4620},[551,14438,9062],{},[551,14440,14441],{"class":553,"line":4626},[551,14442,14443],{},"            curvaDisparo = \"Curva B\";\n",[551,14445,14446],{"class":553,"line":4631},[551,14447,14448],{},"            justificacionCurva = \"Iluminación tiene bajo pico de arranque\";\n",[551,14450,14451],{"class":553,"line":4636},[551,14452,9077],{},[551,14454,14455],{"class":553,"line":4641},[551,14456,14457],{},"        else if (tipoCarga.Equals(\"Informatica\", StringComparison.OrdinalIgnoreCase))\n",[551,14459,14460],{"class":553,"line":4647},[551,14461,9062],{},[551,14463,14464],{"class":553,"line":4653},[551,14465,14466],{},"            curvaDisparo = \"Curva C\";\n",[551,14468,14469],{"class":553,"line":4659},[551,14470,14471],{},"            justificacionCurva = \"Equipos informáticos tienen pico moderado\";\n",[551,14473,14474],{"class":553,"line":4665},[551,14475,9077],{},[551,14477,14478],{"class":553,"line":4671},[551,14479,9082],{},[551,14481,14482],{"class":553,"line":4677},[551,14483,9062],{},[551,14485,14486],{"class":553,"line":4683},[551,14487,14488],{},"            \u002F\u002F Tomas y uso general\n",[551,14490,14491],{"class":553,"line":4689},[551,14492,14466],{},[551,14494,14495],{"class":553,"line":4695},[551,14496,14497],{},"            justificacionCurva = \"Uso general y tomas de corriente\";\n",[551,14499,14500],{"class":553,"line":4701},[551,14501,9077],{},[551,14503,14504],{"class":553,"line":4707},[551,14505,1139],{"emptyLinePlaceholder":238},[551,14507,14508],{"class":553,"line":4713},[551,14509,4511],{},[551,14511,14512],{"class":553,"line":4719},[551,14513,14514],{},"        \u002F\u002F PASO 2: SELECCIONAR CORRIENTE NOMINAL\n",[551,14516,14517],{"class":553,"line":4725},[551,14518,4511],{},[551,14520,14521],{"class":553,"line":4731},[551,14522,1139],{"emptyLinePlaceholder":238},[551,14524,14525],{"class":553,"line":4737},[551,14526,14527],{},"        int corrienteMagnetotermico;\n",[551,14529,14530],{"class":553,"line":4743},[551,14531,1139],{"emptyLinePlaceholder":238},[551,14533,14534],{"class":553,"line":4749},[551,14535,14536],{},"        if (corrienteNominal \u003C= 10.0)\n",[551,14538,14539],{"class":553,"line":4755},[551,14540,9062],{},[551,14542,14543],{"class":553,"line":4761},[551,14544,14545],{},"            corrienteMagnetotermico = 10;\n",[551,14547,14548],{"class":553,"line":4766},[551,14549,9077],{},[551,14551,14552],{"class":553,"line":4771},[551,14553,14554],{},"        else if (corrienteNominal \u003C= 16.0)\n",[551,14556,14557],{"class":553,"line":4777},[551,14558,9062],{},[551,14560,14561],{"class":553,"line":4782},[551,14562,14563],{},"            corrienteMagnetotermico = 16;\n",[551,14565,14566],{"class":553,"line":4787},[551,14567,9077],{},[551,14569,14570],{"class":553,"line":4793},[551,14571,14572],{},"        else if (corrienteNominal \u003C= 20.0)\n",[551,14574,14575],{"class":553,"line":4799},[551,14576,9062],{},[551,14578,14579],{"class":553,"line":4805},[551,14580,14581],{},"            corrienteMagnetotermico = 20;\n",[551,14583,14584],{"class":553,"line":4811},[551,14585,9077],{},[551,14587,14588],{"class":553,"line":4817},[551,14589,14590],{},"        else if (corrienteNominal \u003C= 25.0)\n",[551,14592,14593],{"class":553,"line":4822},[551,14594,9062],{},[551,14596,14597],{"class":553,"line":4827},[551,14598,14599],{},"            corrienteMagnetotermico = 25;\n",[551,14601,14602],{"class":553,"line":9183},[551,14603,9077],{},[551,14605,14606],{"class":553,"line":9188},[551,14607,14608],{},"        else if (corrienteNominal \u003C= 32.0)\n",[551,14610,14611],{"class":553,"line":9193},[551,14612,9062],{},[551,14614,14615],{"class":553,"line":9198},[551,14616,14617],{},"            corrienteMagnetotermico = 32;\n",[551,14619,14620],{"class":553,"line":9204},[551,14621,9077],{},[551,14623,14624],{"class":553,"line":9209},[551,14625,14626],{},"        else if (corrienteNominal \u003C= 40.0)\n",[551,14628,14629],{"class":553,"line":9214},[551,14630,9062],{},[551,14632,14633],{"class":553,"line":9219},[551,14634,14635],{},"            corrienteMagnetotermico = 40;\n",[551,14637,14638],{"class":553,"line":9224},[551,14639,9077],{},[551,14641,14642],{"class":553,"line":9230},[551,14643,9082],{},[551,14645,14646],{"class":553,"line":9236},[551,14647,9062],{},[551,14649,14650],{"class":553,"line":9242},[551,14651,14652],{},"            corrienteMagnetotermico = 63;\n",[551,14654,14655],{"class":553,"line":9247},[551,14656,9077],{},[551,14658,14659],{"class":553,"line":9253},[551,14660,1139],{"emptyLinePlaceholder":238},[551,14662,14663],{"class":553,"line":9258},[551,14664,14665],{},"        double margenProteccion = ((corrienteMagnetotermico - corrienteNominal) \u002F corrienteNominal) * 100;\n",[551,14667,14668],{"class":553,"line":9264},[551,14669,1139],{"emptyLinePlaceholder":238},[551,14671,14672],{"class":553,"line":9270},[551,14673,4511],{},[551,14675,14676],{"class":553,"line":9275},[551,14677,14678],{},"        \u002F\u002F PASO 3: SELECCIONAR SECCIÓN DE CABLE\n",[551,14680,14681],{"class":553,"line":9281},[551,14682,4511],{},[551,14684,14685],{"class":553,"line":9287},[551,14686,1139],{"emptyLinePlaceholder":238},[551,14688,14689],{"class":553,"line":9292},[551,14690,14691],{},"        double seccionCable;\n",[551,14693,14694],{"class":553,"line":9297},[551,14695,14696],{},"        double corrienteAdmisible;\n",[551,14698,14699],{"class":553,"line":9302},[551,14700,1139],{"emptyLinePlaceholder":238},[551,14702,14703],{"class":553,"line":9308},[551,14704,14705],{},"        \u002F\u002F Tabla simplificada de corrientes admisibles (instalación tipo B)\n",[551,14707,14708],{"class":553,"line":9313},[551,14709,14710],{},"        if (corrienteMagnetotermico \u003C= 10)\n",[551,14712,14713],{"class":553,"line":9318},[551,14714,9062],{},[551,14716,14717],{"class":553,"line":9323},[551,14718,14719],{},"            seccionCable = 1.5;\n",[551,14721,14722],{"class":553,"line":9328},[551,14723,14724],{},"            corrienteAdmisible = 15.0;\n",[551,14726,14727],{"class":553,"line":9334},[551,14728,9077],{},[551,14730,14731],{"class":553,"line":9339},[551,14732,14733],{},"        else if (corrienteMagnetotermico \u003C= 16)\n",[551,14735,14736],{"class":553,"line":9344},[551,14737,9062],{},[551,14739,14740],{"class":553,"line":9350},[551,14741,14742],{},"            seccionCable = 2.5;\n",[551,14744,14745],{"class":553,"line":9355},[551,14746,14747],{},"            corrienteAdmisible = 21.0;\n",[551,14749,14750],{"class":553,"line":9361},[551,14751,9077],{},[551,14753,14754],{"class":553,"line":9367},[551,14755,14756],{},"        else if (corrienteMagnetotermico \u003C= 20)\n",[551,14758,14759],{"class":553,"line":9372},[551,14760,9062],{},[551,14762,14763],{"class":553,"line":9378},[551,14764,14765],{},"            seccionCable = 4.0;\n",[551,14767,14768],{"class":553,"line":9384},[551,14769,14770],{},"            corrienteAdmisible = 27.0;\n",[551,14772,14773],{"class":553,"line":9389},[551,14774,9077],{},[551,14776,14777],{"class":553,"line":9394},[551,14778,14779],{},"        else if (corrienteMagnetotermico \u003C= 25)\n",[551,14781,14782],{"class":553,"line":9399},[551,14783,9062],{},[551,14785,14786],{"class":553,"line":9405},[551,14787,14788],{},"            seccionCable = 6.0;\n",[551,14790,14791],{"class":553,"line":9410},[551,14792,14793],{},"            corrienteAdmisible = 36.0;\n",[551,14795,14796],{"class":553,"line":9415},[551,14797,9077],{},[551,14799,14800],{"class":553,"line":9420},[551,14801,14802],{},"        else if (corrienteMagnetotermico \u003C= 32)\n",[551,14804,14805],{"class":553,"line":9425},[551,14806,9062],{},[551,14808,14809],{"class":553,"line":9431},[551,14810,14811],{},"            seccionCable = 10.0;\n",[551,14813,14814],{"class":553,"line":9436},[551,14815,14816],{},"            corrienteAdmisible = 50.0;\n",[551,14818,14819],{"class":553,"line":9441},[551,14820,9077],{},[551,14822,14823],{"class":553,"line":9447},[551,14824,14825],{},"        else if (corrienteMagnetotermico \u003C= 40)\n",[551,14827,14828],{"class":553,"line":9452},[551,14829,9062],{},[551,14831,14832],{"class":553,"line":9458},[551,14833,14834],{},"            seccionCable = 16.0;\n",[551,14836,14837],{"class":553,"line":9464},[551,14838,14839],{},"            corrienteAdmisible = 68.0;\n",[551,14841,14842],{"class":553,"line":9469},[551,14843,9077],{},[551,14845,14846],{"class":553,"line":9475},[551,14847,9082],{},[551,14849,14850],{"class":553,"line":9481},[551,14851,9062],{},[551,14853,14854],{"class":553,"line":9487},[551,14855,14856],{},"            seccionCable = 25.0;\n",[551,14858,14859],{"class":553,"line":9492},[551,14860,14861],{},"            corrienteAdmisible = 89.0;\n",[551,14863,14864],{"class":553,"line":9497},[551,14865,9077],{},[551,14867,14868],{"class":553,"line":9502},[551,14869,1139],{"emptyLinePlaceholder":238},[551,14871,14872],{"class":553,"line":9508},[551,14873,14874],{},"        \u002F\u002F Validar que el cable soporte la corriente del magnetotérmico\n",[551,14876,14877],{"class":553,"line":9514},[551,14878,14879],{},"        bool cableSuficiente = (corrienteAdmisible >= corrienteMagnetotermico);\n",[551,14881,14882],{"class":553,"line":9519},[551,14883,1139],{"emptyLinePlaceholder":238},[551,14885,14886],{"class":553,"line":9524},[551,14887,4511],{},[551,14889,14890],{"class":553,"line":9529},[551,14891,14892],{},"        \u002F\u002F PASO 4: SELECCIONAR TIPO DE CABLE\n",[551,14894,14895],{"class":553,"line":9535},[551,14896,4511],{},[551,14898,14899],{"class":553,"line":9540},[551,14900,1139],{"emptyLinePlaceholder":238},[551,14902,14903],{"class":553,"line":9545},[551,14904,14905],{},"        string tipoCable;\n",[551,14907,14908],{"class":553,"line":9551},[551,14909,14910],{},"        string descripcionCable;\n",[551,14912,14913],{"class":553,"line":9557},[551,14914,1139],{"emptyLinePlaceholder":238},[551,14916,14917],{"class":553,"line":9562},[551,14918,14919],{},"        if (ambienteHumedo)\n",[551,14921,14922],{"class":553,"line":9568},[551,14923,9062],{},[551,14925,14926],{"class":553,"line":9573},[551,14927,14928],{},"            tipoCable = \"H07RN-F\";\n",[551,14930,14931],{"class":553,"line":9578},[551,14932,14933],{},"            descripcionCable = \"Cable flexible resistente a humedad y aceites\";\n",[551,14935,14936],{"class":553,"line":9584},[551,14937,9077],{},[551,14939,14940],{"class":553,"line":9589},[551,14941,9082],{},[551,14943,14944],{"class":553,"line":9594},[551,14945,9062],{},[551,14947,14948],{"class":553,"line":9600},[551,14949,14950],{},"            tipoCable = \"H07V-K\";\n",[551,14952,14953],{"class":553,"line":9606},[551,14954,14955],{},"            descripcionCable = \"Cable flexible para instalación estándar\";\n",[551,14957,14958],{"class":553,"line":9611},[551,14959,9077],{},[551,14961,14962],{"class":553,"line":9617},[551,14963,1139],{"emptyLinePlaceholder":238},[551,14965,14966],{"class":553,"line":9623},[551,14967,4511],{},[551,14969,14970],{"class":553,"line":9629},[551,14971,14972],{},"        \u002F\u002F PASO 5: CALCULAR CAÍDA DE TENSIÓN\n",[551,14974,14975],{"class":553,"line":9635},[551,14976,4511],{},[551,14978,14979],{"class":553,"line":9641},[551,14980,1139],{"emptyLinePlaceholder":238},[551,14982,14983],{"class":553,"line":9647},[551,14984,5566],{},[551,14986,14987],{"class":553,"line":9653},[551,14988,14989],{},"        double caidaTension = (2 * longitudCable * corrienteNominal * resistividadCobre) \u002F seccionCable;\n",[551,14991,14992],{"class":553,"line":9659},[551,14993,9233],{},[551,14995,14996],{"class":553,"line":9665},[551,14997,1139],{"emptyLinePlaceholder":238},[551,14999,15000],{"class":553,"line":9671},[551,15001,15002],{},"        bool caidaAceptable = (porcentajeCaida \u003C= 3.0);\n",[551,15004,15005],{"class":553,"line":9677},[551,15006,1139],{"emptyLinePlaceholder":238},[551,15008,15009],{"class":553,"line":9682},[551,15010,15011],{},"        string advertenciaCaida = \"\";\n",[551,15013,15014],{"class":553,"line":9688},[551,15015,15016],{},"        if (!caidaAceptable)\n",[551,15018,15019],{"class":553,"line":9694},[551,15020,9062],{},[551,15022,15023],{"class":553,"line":9700},[551,15024,15025],{},"            advertenciaCaida = \"\\n¡ADVERTENCIA! Caída de tensión excede 3%\";\n",[551,15027,15028],{"class":553,"line":9706},[551,15029,15030],{},"            \u002F\u002F Sugerir sección superior\n",[551,15032,15033],{"class":553,"line":9712},[551,15034,15035],{},"            double seccionSuperior = seccionCable;\n",[551,15037,15038],{"class":553,"line":9718},[551,15039,15040],{},"            if (seccionCable == 1.5) seccionSuperior = 2.5;\n",[551,15042,15043],{"class":553,"line":9724},[551,15044,15045],{},"            else if (seccionCable == 2.5) seccionSuperior = 4.0;\n",[551,15047,15048],{"class":553,"line":9730},[551,15049,15050],{},"            else if (seccionCable == 4.0) seccionSuperior = 6.0;\n",[551,15052,15053],{"class":553,"line":9736},[551,15054,15055],{},"            else if (seccionCable == 6.0) seccionSuperior = 10.0;\n",[551,15057,15058],{"class":553,"line":9742},[551,15059,15060],{},"            else if (seccionCable == 10.0) seccionSuperior = 16.0;\n",[551,15062,15063],{"class":553,"line":9747},[551,15064,15065],{},"            else if (seccionCable == 16.0) seccionSuperior = 25.0;\n",[551,15067,15068],{"class":553,"line":9752},[551,15069,1139],{"emptyLinePlaceholder":238},[551,15071,15072],{"class":553,"line":9757},[551,15073,15074],{},"            advertenciaCaida += string.Format(\"\\nConsiderar sección {0}mm²\", seccionSuperior);\n",[551,15076,15077],{"class":553,"line":9763},[551,15078,9077],{},[551,15080,15081],{"class":553,"line":9768},[551,15082,1139],{"emptyLinePlaceholder":238},[551,15084,15085],{"class":553,"line":9773},[551,15086,4511],{},[551,15088,15089],{"class":553,"line":9779},[551,15090,15091],{},"        \u002F\u002F PASO 6: SELECCIONAR DIFERENCIAL\n",[551,15093,15094],{"class":553,"line":9784},[551,15095,4511],{},[551,15097,15098],{"class":553,"line":9790},[551,15099,1139],{"emptyLinePlaceholder":238},[551,15101,15102],{"class":553,"line":9795},[551,15103,15104],{},"        string tipoDiferencial;\n",[551,15106,15108],{"class":553,"line":15107},183,[551,15109,15110],{},"        int sensibilidadDiferencial;  \u002F\u002F mA\n",[551,15112,15114],{"class":553,"line":15113},184,[551,15115,15116],{},"        int corrienteDiferencial;\n",[551,15118,15120],{"class":553,"line":15119},185,[551,15121,1139],{"emptyLinePlaceholder":238},[551,15123,15125],{"class":553,"line":15124},186,[551,15126,15127],{},"        \u002F\u002F Tipo de diferencial según carga\n",[551,15129,15131],{"class":553,"line":15130},187,[551,15132,14411],{},[551,15134,15136],{"class":553,"line":15135},188,[551,15137,9062],{},[551,15139,15141],{"class":553,"line":15140},189,[551,15142,15143],{},"            tipoDiferencial = \"Tipo A\";  \u002F\u002F Sensible a corriente alterna y continua pulsante\n",[551,15145,15147],{"class":553,"line":15146},190,[551,15148,9077],{},[551,15150,15152],{"class":553,"line":15151},191,[551,15153,14457],{},[551,15155,15157],{"class":553,"line":15156},192,[551,15158,9062],{},[551,15160,15162],{"class":553,"line":15161},193,[551,15163,15164],{},"            tipoDiferencial = \"Tipo B\";  \u002F\u002F Sensible a corriente continua\n",[551,15166,15168],{"class":553,"line":15167},194,[551,15169,9077],{},[551,15171,15173],{"class":553,"line":15172},195,[551,15174,9082],{},[551,15176,15178],{"class":553,"line":15177},196,[551,15179,9062],{},[551,15181,15183],{"class":553,"line":15182},197,[551,15184,15185],{},"            tipoDiferencial = \"Tipo AC\";  \u002F\u002F Sensible a corriente alterna (estándar)\n",[551,15187,15189],{"class":553,"line":15188},198,[551,15190,9077],{},[551,15192,15194],{"class":553,"line":15193},199,[551,15195,1139],{"emptyLinePlaceholder":238},[551,15197,15199],{"class":553,"line":15198},200,[551,15200,15201],{},"        \u002F\u002F Sensibilidad según ambiente\n",[551,15203,15205],{"class":553,"line":15204},201,[551,15206,14919],{},[551,15208,15210],{"class":553,"line":15209},202,[551,15211,9062],{},[551,15213,15215],{"class":553,"line":15214},203,[551,15216,15217],{},"            sensibilidadDiferencial = 30;  \u002F\u002F Alta sensibilidad en ambiente húmedo\n",[551,15219,15221],{"class":553,"line":15220},204,[551,15222,9077],{},[551,15224,15226],{"class":553,"line":15225},205,[551,15227,9082],{},[551,15229,15231],{"class":553,"line":15230},206,[551,15232,9062],{},[551,15234,15236],{"class":553,"line":15235},207,[551,15237,15238],{},"            if (corrienteMagnetotermico > 32)\n",[551,15240,15242],{"class":553,"line":15241},208,[551,15243,12301],{},[551,15245,15247],{"class":553,"line":15246},209,[551,15248,15249],{},"                sensibilidadDiferencial = 300;  \u002F\u002F Menor sensibilidad para altas corrientes\n",[551,15251,15253],{"class":553,"line":15252},210,[551,15254,12311],{},[551,15256,15258],{"class":553,"line":15257},211,[551,15259,15260],{},"            else\n",[551,15262,15264],{"class":553,"line":15263},212,[551,15265,12301],{},[551,15267,15269],{"class":553,"line":15268},213,[551,15270,15271],{},"                sensibilidadDiferencial = 30;\n",[551,15273,15275],{"class":553,"line":15274},214,[551,15276,12311],{},[551,15278,15280],{"class":553,"line":15279},215,[551,15281,9077],{},[551,15283,15285],{"class":553,"line":15284},216,[551,15286,1139],{"emptyLinePlaceholder":238},[551,15288,15290],{"class":553,"line":15289},217,[551,15291,15292],{},"        \u002F\u002F Corriente nominal del diferencial (debe ser >= magnetotérmico)\n",[551,15294,15296],{"class":553,"line":15295},218,[551,15297,15298],{},"        if (corrienteMagnetotermico \u003C= 25)\n",[551,15300,15302],{"class":553,"line":15301},219,[551,15303,9062],{},[551,15305,15307],{"class":553,"line":15306},220,[551,15308,15309],{},"            corrienteDiferencial = 25;\n",[551,15311,15313],{"class":553,"line":15312},221,[551,15314,9077],{},[551,15316,15318],{"class":553,"line":15317},222,[551,15319,14825],{},[551,15321,15323],{"class":553,"line":15322},223,[551,15324,9062],{},[551,15326,15328],{"class":553,"line":15327},224,[551,15329,15330],{},"            corrienteDiferencial = 40;\n",[551,15332,15334],{"class":553,"line":15333},225,[551,15335,9077],{},[551,15337,15339],{"class":553,"line":15338},226,[551,15340,9082],{},[551,15342,15344],{"class":553,"line":15343},227,[551,15345,9062],{},[551,15347,15349],{"class":553,"line":15348},228,[551,15350,15351],{},"            corrienteDiferencial = 63;\n",[551,15353,15355],{"class":553,"line":15354},229,[551,15356,9077],{},[551,15358,15360],{"class":553,"line":15359},230,[551,15361,1139],{"emptyLinePlaceholder":238},[551,15363,15365],{"class":553,"line":15364},231,[551,15366,4511],{},[551,15368,15370],{"class":553,"line":15369},232,[551,15371,9581],{},[551,15373,15375],{"class":553,"line":15374},233,[551,15376,4511],{},[551,15378,15380],{"class":553,"line":15379},234,[551,15381,1139],{"emptyLinePlaceholder":238},[551,15383,15385],{"class":553,"line":15384},235,[551,15386,9597],{},[551,15388,15390],{"class":553,"line":15389},236,[551,15391,15392],{},"            \"=== SELECTOR AUTOMÁTICO DE PROTECCIONES ===\\n\\n\" +\n",[551,15394,15396],{"class":553,"line":15395},237,[551,15397,15398],{},"            \"DATOS DEL CIRCUITO:\\n\" +\n",[551,15400,15402],{"class":553,"line":15401},238,[551,15403,15404],{},"            \"- Nombre: {0}\\n\" +\n",[551,15406,15408],{"class":553,"line":15407},239,[551,15409,15410],{},"            \"- Tipo de carga: {1}\\n\" +\n",[551,15412,15414],{"class":553,"line":15413},240,[551,15415,15416],{},"            \"- Corriente nominal: {2:F1} A\\n\" +\n",[551,15418,15420],{"class":553,"line":15419},241,[551,15421,15422],{},"            \"- Longitud: {3:F1} m\\n\" +\n",[551,15424,15426],{"class":553,"line":15425},242,[551,15427,15428],{},"            \"- Ambiente húmedo: {4}\\n\\n\" +\n",[551,15430,15432],{"class":553,"line":15431},243,[551,15433,15434],{},"            \"PROTECCIÓN MAGNETOTÉRMICA:\\n\" +\n",[551,15436,15438],{"class":553,"line":15437},244,[551,15439,15440],{},"            \"- {5} - {6}A\\n\" +\n",[551,15442,15444],{"class":553,"line":15443},245,[551,15445,15446],{},"            \"- Justificación: {7}\\n\" +\n",[551,15448,15450],{"class":553,"line":15449},246,[551,15451,15452],{},"            \"- Margen: {8:F1}%\\n\\n\" +\n",[551,15454,15456],{"class":553,"line":15455},247,[551,15457,15458],{},"            \"CABLE:\\n\" +\n",[551,15460,15462],{"class":553,"line":15461},248,[551,15463,15464],{},"            \"- Tipo: {9}\\n\" +\n",[551,15466,15468],{"class":553,"line":15467},249,[551,15469,15470],{},"            \"- Sección: {10}mm²\\n\" +\n",[551,15472,15474],{"class":553,"line":15473},250,[551,15475,15476],{},"            \"- Descripción: {11}\\n\" +\n",[551,15478,15480],{"class":553,"line":15479},251,[551,15481,15482],{},"            \"- Corriente admisible: {12:F1}A\\n\\n\" +\n",[551,15484,15486],{"class":553,"line":15485},252,[551,15487,15488],{},"            \"PROTECCIÓN DIFERENCIAL:\\n\" +\n",[551,15490,15492],{"class":553,"line":15491},253,[551,15493,15494],{},"            \"- {13} - {14}mA - {15}A\\n\\n\" +\n",[551,15496,15498],{"class":553,"line":15497},254,[551,15499,15500],{},"            \"CAÍDA DE TENSIÓN:\\n\" +\n",[551,15502,15504],{"class":553,"line":15503},255,[551,15505,15506],{},"            \"- Calculada: {16:F2}V ({17:F2}%)\\n\" +\n",[551,15508,15510],{"class":553,"line":15509},256,[551,15511,15512],{},"            \"- Estado: {18}{19}\",\n",[551,15514,15516],{"class":553,"line":15515},257,[551,15517,4710],{},[551,15519,15521],{"class":553,"line":15520},258,[551,15522,15523],{},"            tipoCarga,\n",[551,15525,15527],{"class":553,"line":15526},259,[551,15528,15529],{},"            corrienteNominal,\n",[551,15531,15533],{"class":553,"line":15532},260,[551,15534,9727],{},[551,15536,15538],{"class":553,"line":15537},261,[551,15539,15540],{},"            ambienteHumedo ? \"Sí\" : \"No\",\n",[551,15542,15544],{"class":553,"line":15543},262,[551,15545,15546],{},"            curvaDisparo,\n",[551,15548,15550],{"class":553,"line":15549},263,[551,15551,15552],{},"            corrienteMagnetotermico,\n",[551,15554,15556],{"class":553,"line":15555},264,[551,15557,15558],{},"            justificacionCurva,\n",[551,15560,15562],{"class":553,"line":15561},265,[551,15563,15564],{},"            margenProteccion,\n",[551,15566,15568],{"class":553,"line":15567},266,[551,15569,15570],{},"            tipoCable,\n",[551,15572,15574],{"class":553,"line":15573},267,[551,15575,9721],{},[551,15577,15579],{"class":553,"line":15578},268,[551,15580,15581],{},"            descripcionCable,\n",[551,15583,15585],{"class":553,"line":15584},269,[551,15586,15587],{},"            corrienteAdmisible,\n",[551,15589,15591],{"class":553,"line":15590},270,[551,15592,15593],{},"            tipoDiferencial,\n",[551,15595,15597],{"class":553,"line":15596},271,[551,15598,15599],{},"            sensibilidadDiferencial,\n",[551,15601,15603],{"class":553,"line":15602},272,[551,15604,15605],{},"            corrienteDiferencial,\n",[551,15607,15609],{"class":553,"line":15608},273,[551,15610,15611],{},"            caidaTension,\n",[551,15613,15615],{"class":553,"line":15614},274,[551,15616,15617],{},"            porcentajeCaida,\n",[551,15619,15621],{"class":553,"line":15620},275,[551,15622,15623],{},"            caidaAceptable ? \"Aceptable (\u003C 3%)\" : \"Excesiva (> 3%)\",\n",[551,15625,15627],{"class":553,"line":15626},276,[551,15628,15629],{},"            advertenciaCaida\n",[551,15631,15633],{"class":553,"line":15632},277,[551,15634,4758],{},[551,15636,15638],{"class":553,"line":15637},278,[551,15639,1139],{"emptyLinePlaceholder":238},[551,15641,15643],{"class":553,"line":15642},279,[551,15644,4511],{},[551,15646,15648],{"class":553,"line":15647},280,[551,15649,9760],{},[551,15651,15653],{"class":553,"line":15652},281,[551,15654,4511],{},[551,15656,15658],{"class":553,"line":15657},282,[551,15659,1139],{"emptyLinePlaceholder":238},[551,15661,15663],{"class":553,"line":15662},283,[551,15664,15665],{},"        MessageBoxIcon icono = caidaAceptable ? MessageBoxIcon.Information : MessageBoxIcon.Warning;\n",[551,15667,15669],{"class":553,"line":15668},284,[551,15670,1139],{"emptyLinePlaceholder":238},[551,15672,15674],{"class":553,"line":15673},285,[551,15675,15676],{},"        MessageBox.Show(reporte, \"Selector de Protecciones\", MessageBoxButtons.OK, icono);\n",[551,15678,15680],{"class":553,"line":15679},286,[551,15681,1187],{},[551,15683,15685],{"class":553,"line":15684},287,[551,15686,1193],{},[43,15688],{},[46,15690,4852],{"id":4851},[331,15692,15694],{"id":15693},"alcance-de-variables-en-bloques-if","Alcance de variables en bloques if",[13,15696,15697,15698,15700],{},"Las variables declaradas dentro de un bloque ",[54,15699,11644],{}," solo existen dentro de ese bloque:",[543,15702,15704],{"className":545,"code":15703,"language":547,"meta":228,"style":228},"if (corriente > 16.0)\n{\n    string mensaje = \"Corriente alta\";\n    MessageBox.Show(mensaje);  \u002F\u002F OK\n}\n\nMessageBox.Show(mensaje);  \u002F\u002F ERROR: 'mensaje' no existe aquí\n",[54,15705,15706,15711,15715,15720,15725,15729,15733],{"__ignoreMap":228},[551,15707,15708],{"class":553,"line":554},[551,15709,15710],{},"if (corriente > 16.0)\n",[551,15712,15713],{"class":553,"line":229},[551,15714,1151],{},[551,15716,15717],{"class":553,"line":670},[551,15718,15719],{},"    string mensaje = \"Corriente alta\";\n",[551,15721,15722],{"class":553,"line":1136},[551,15723,15724],{},"    MessageBox.Show(mensaje);  \u002F\u002F OK\n",[551,15726,15727],{"class":553,"line":1142},[551,15728,1193],{},[551,15730,15731],{"class":553,"line":1148},[551,15732,1139],{"emptyLinePlaceholder":238},[551,15734,15735],{"class":553,"line":1154},[551,15736,15737],{},"MessageBox.Show(mensaje);  \u002F\u002F ERROR: 'mensaje' no existe aquí\n",[13,15739,15740,15742,15743,416],{},[16,15741,1983],{},": Declara la variable antes del ",[54,15744,11644],{},[543,15746,15748],{"className":545,"code":15747,"language":547,"meta":228,"style":228},"string mensaje;\n\nif (corriente > 16.0)\n{\n    mensaje = \"Corriente alta\";\n}\nelse\n{\n    mensaje = \"Corriente normal\";\n}\n\nMessageBox.Show(mensaje);  \u002F\u002F OK\n",[54,15749,15750,15755,15759,15763,15767,15772,15776,15780,15784,15789,15793,15797],{"__ignoreMap":228},[551,15751,15752],{"class":553,"line":554},[551,15753,15754],{},"string mensaje;\n",[551,15756,15757],{"class":553,"line":229},[551,15758,1139],{"emptyLinePlaceholder":238},[551,15760,15761],{"class":553,"line":670},[551,15762,15710],{},[551,15764,15765],{"class":553,"line":1136},[551,15766,1151],{},[551,15768,15769],{"class":553,"line":1142},[551,15770,15771],{},"    mensaje = \"Corriente alta\";\n",[551,15773,15774],{"class":553,"line":1148},[551,15775,1193],{},[551,15777,15778],{"class":553,"line":1154},[551,15779,3704],{},[551,15781,15782],{"class":553,"line":1160},[551,15783,1151],{},[551,15785,15786],{"class":553,"line":1166},[551,15787,15788],{},"    mensaje = \"Corriente normal\";\n",[551,15790,15791],{"class":553,"line":1172},[551,15792,1193],{},[551,15794,15795],{"class":553,"line":1178},[551,15796,1139],{"emptyLinePlaceholder":238},[551,15798,15799],{"class":553,"line":1184},[551,15800,15801],{},"MessageBox.Show(mensaje);  \u002F\u002F OK\n",[331,15803,15805],{"id":15804},"switch-como-alternativa-a-else-if","Switch como alternativa a else if",[13,15807,15808,15809,15812],{},"Para comparar una variable contra múltiples valores, ",[54,15810,15811],{},"switch"," puede ser más legible (lo veremos en el próximo capítulo):",[543,15814,15816],{"className":545,"code":15815,"language":547,"meta":228,"style":228},"\u002F\u002F Con else if\nif (tipoCarga == \"Motor\")\n{\n    curva = \"D\";\n}\nelse if (tipoCarga == \"Iluminacion\")\n{\n    curva = \"B\";\n}\nelse\n{\n    curva = \"C\";\n}\n\n\u002F\u002F Con switch (más limpio)\nswitch (tipoCarga)\n{\n    case \"Motor\":\n        curva = \"D\";\n        break;\n    case \"Iluminacion\":\n        curva = \"B\";\n        break;\n    default:\n        curva = \"C\";\n        break;\n}\n",[54,15817,15818,15823,15827,15831,15836,15840,15845,15849,15854,15858,15862,15866,15871,15875,15879,15884,15889,15893,15898,15903,15908,15913,15918,15922,15927,15932,15936],{"__ignoreMap":228},[551,15819,15820],{"class":553,"line":554},[551,15821,15822],{},"\u002F\u002F Con else if\n",[551,15824,15825],{"class":553,"line":229},[551,15826,12108],{},[551,15828,15829],{"class":553,"line":670},[551,15830,1151],{},[551,15832,15833],{"class":553,"line":1136},[551,15834,15835],{},"    curva = \"D\";\n",[551,15837,15838],{"class":553,"line":1142},[551,15839,1193],{},[551,15841,15842],{"class":553,"line":1148},[551,15843,15844],{},"else if (tipoCarga == \"Iluminacion\")\n",[551,15846,15847],{"class":553,"line":1154},[551,15848,1151],{},[551,15850,15851],{"class":553,"line":1160},[551,15852,15853],{},"    curva = \"B\";\n",[551,15855,15856],{"class":553,"line":1166},[551,15857,1193],{},[551,15859,15860],{"class":553,"line":1172},[551,15861,3704],{},[551,15863,15864],{"class":553,"line":1178},[551,15865,1151],{},[551,15867,15868],{"class":553,"line":1184},[551,15869,15870],{},"    curva = \"C\";\n",[551,15872,15873],{"class":553,"line":1190},[551,15874,1193],{},[551,15876,15877],{"class":553,"line":1472},[551,15878,1139],{"emptyLinePlaceholder":238},[551,15880,15881],{"class":553,"line":1477},[551,15882,15883],{},"\u002F\u002F Con switch (más limpio)\n",[551,15885,15886],{"class":553,"line":1797},[551,15887,15888],{},"switch (tipoCarga)\n",[551,15890,15891],{"class":553,"line":1802},[551,15892,1151],{},[551,15894,15895],{"class":553,"line":1808},[551,15896,15897],{},"    case \"Motor\":\n",[551,15899,15900],{"class":553,"line":1814},[551,15901,15902],{},"        curva = \"D\";\n",[551,15904,15905],{"class":553,"line":1820},[551,15906,15907],{},"        break;\n",[551,15909,15910],{"class":553,"line":1826},[551,15911,15912],{},"    case \"Iluminacion\":\n",[551,15914,15915],{"class":553,"line":1832},[551,15916,15917],{},"        curva = \"B\";\n",[551,15919,15920],{"class":553,"line":1838},[551,15921,15907],{},[551,15923,15924],{"class":553,"line":1844},[551,15925,15926],{},"    default:\n",[551,15928,15929],{"class":553,"line":1850},[551,15930,15931],{},"        curva = \"C\";\n",[551,15933,15934],{"class":553,"line":1855},[551,15935,15907],{},[551,15937,15938],{"class":553,"line":1861},[551,15939,1193],{},[331,15941,15943],{"id":15942},"patrón-guard-clause","Patrón Guard Clause",[13,15945,15946],{},"Para evitar anidación profunda, valida condiciones negativas primero y retorna\u002Fsalta:",[543,15948,15950],{"className":545,"code":15949,"language":547,"meta":228,"style":228},"\u002F\u002F Con anidación (difícil de leer)\nif (proyectoAbierto)\n{\n    if (tienePermisos)\n    {\n        if (noHayErrores)\n        {\n            \u002F\u002F Código principal\n        }\n    }\n}\n\n\u002F\u002F Con guard clauses (más claro)\nif (!proyectoAbierto)\n{\n    MessageBox.Show(\"Proyecto no abierto\");\n    return;\n}\n\nif (!tienePermisos)\n{\n    MessageBox.Show(\"Sin permisos\");\n    return;\n}\n\nif (hayErrores)\n{\n    MessageBox.Show(\"Proyecto con errores\");\n    return;\n}\n\n\u002F\u002F Código principal (sin anidación)\n",[54,15951,15952,15957,15961,15965,15970,15974,15979,15983,15988,15992,15996,16000,16004,16009,16014,16018,16023,16028,16032,16036,16041,16045,16050,16054,16058,16062,16067,16071,16076,16080,16084,16088],{"__ignoreMap":228},[551,15953,15954],{"class":553,"line":554},[551,15955,15956],{},"\u002F\u002F Con anidación (difícil de leer)\n",[551,15958,15959],{"class":553,"line":229},[551,15960,11121],{},[551,15962,15963],{"class":553,"line":670},[551,15964,1151],{},[551,15966,15967],{"class":553,"line":1136},[551,15968,15969],{},"    if (tienePermisos)\n",[551,15971,15972],{"class":553,"line":1142},[551,15973,1169],{},[551,15975,15976],{"class":553,"line":1148},[551,15977,15978],{},"        if (noHayErrores)\n",[551,15980,15981],{"class":553,"line":1154},[551,15982,9062],{},[551,15984,15985],{"class":553,"line":1160},[551,15986,15987],{},"            \u002F\u002F Código principal\n",[551,15989,15990],{"class":553,"line":1166},[551,15991,9077],{},[551,15993,15994],{"class":553,"line":1172},[551,15995,1187],{},[551,15997,15998],{"class":553,"line":1178},[551,15999,1193],{},[551,16001,16002],{"class":553,"line":1184},[551,16003,1139],{"emptyLinePlaceholder":238},[551,16005,16006],{"class":553,"line":1190},[551,16007,16008],{},"\u002F\u002F Con guard clauses (más claro)\n",[551,16010,16011],{"class":553,"line":1472},[551,16012,16013],{},"if (!proyectoAbierto)\n",[551,16015,16016],{"class":553,"line":1477},[551,16017,1151],{},[551,16019,16020],{"class":553,"line":1797},[551,16021,16022],{},"    MessageBox.Show(\"Proyecto no abierto\");\n",[551,16024,16025],{"class":553,"line":1802},[551,16026,16027],{},"    return;\n",[551,16029,16030],{"class":553,"line":1808},[551,16031,1193],{},[551,16033,16034],{"class":553,"line":1814},[551,16035,1139],{"emptyLinePlaceholder":238},[551,16037,16038],{"class":553,"line":1820},[551,16039,16040],{},"if (!tienePermisos)\n",[551,16042,16043],{"class":553,"line":1826},[551,16044,1151],{},[551,16046,16047],{"class":553,"line":1832},[551,16048,16049],{},"    MessageBox.Show(\"Sin permisos\");\n",[551,16051,16052],{"class":553,"line":1838},[551,16053,16027],{},[551,16055,16056],{"class":553,"line":1844},[551,16057,1193],{},[551,16059,16060],{"class":553,"line":1850},[551,16061,1139],{"emptyLinePlaceholder":238},[551,16063,16064],{"class":553,"line":1855},[551,16065,16066],{},"if (hayErrores)\n",[551,16068,16069],{"class":553,"line":1861},[551,16070,1151],{},[551,16072,16073],{"class":553,"line":1867},[551,16074,16075],{},"    MessageBox.Show(\"Proyecto con errores\");\n",[551,16077,16078],{"class":553,"line":1873},[551,16079,16027],{},[551,16081,16082],{"class":553,"line":1878},[551,16083,1193],{},[551,16085,16086],{"class":553,"line":1883},[551,16087,1139],{"emptyLinePlaceholder":238},[551,16089,16090],{"class":553,"line":1888},[551,16091,16092],{},"\u002F\u002F Código principal (sin anidación)\n",[331,16094,5121],{"id":5120},[13,16096,16097],{},[16,16098,16099],{},"1. Condiciones positivas son más legibles",[543,16101,16103],{"className":545,"code":16102,"language":547,"meta":228,"style":228},"\u002F\u002F Menos claro\nif (!(!esValido))\n{\n    \u002F\u002F ...\n}\n\n\u002F\u002F Más claro\nif (esValido)\n{\n    \u002F\u002F ...\n}\n",[54,16104,16105,16110,16115,16119,16124,16128,16132,16137,16142,16146,16150],{"__ignoreMap":228},[551,16106,16107],{"class":553,"line":554},[551,16108,16109],{},"\u002F\u002F Menos claro\n",[551,16111,16112],{"class":553,"line":229},[551,16113,16114],{},"if (!(!esValido))\n",[551,16116,16117],{"class":553,"line":670},[551,16118,1151],{},[551,16120,16121],{"class":553,"line":1136},[551,16122,16123],{},"    \u002F\u002F ...\n",[551,16125,16126],{"class":553,"line":1142},[551,16127,1193],{},[551,16129,16130],{"class":553,"line":1148},[551,16131,1139],{"emptyLinePlaceholder":238},[551,16133,16134],{"class":553,"line":1154},[551,16135,16136],{},"\u002F\u002F Más claro\n",[551,16138,16139],{"class":553,"line":1160},[551,16140,16141],{},"if (esValido)\n",[551,16143,16144],{"class":553,"line":1166},[551,16145,1151],{},[551,16147,16148],{"class":553,"line":1172},[551,16149,16123],{},[551,16151,16152],{"class":553,"line":1178},[551,16153,1193],{},[13,16155,16156],{},[16,16157,16158],{},"2. Extrae condiciones complejas a variables",[543,16160,16162],{"className":545,"code":16161,"language":547,"meta":228,"style":228},"\u002F\u002F Difícil de entender\nif ((v >= 207 && v \u003C= 253) && (i \u003C= 16) && ((2*l*i*0.018)\u002Fs \u003C= 6.9))\n{\n    \u002F\u002F ...\n}\n\n\u002F\u002F Claro\nbool voltajeOK = (voltaje >= 207 && voltaje \u003C= 253);\nbool corrienteOK = (corriente \u003C= 16);\ndouble caidaTension = (2 * longitud * corriente * 0.018) \u002F seccion;\nbool caidaOK = (caidaTension \u003C= 6.9);\n\nif (voltajeOK && corrienteOK && caidaOK)\n{\n    \u002F\u002F ...\n}\n",[54,16163,16164,16169,16174,16178,16182,16186,16190,16195,16200,16205,16210,16215,16219,16224,16228,16232],{"__ignoreMap":228},[551,16165,16166],{"class":553,"line":554},[551,16167,16168],{},"\u002F\u002F Difícil de entender\n",[551,16170,16171],{"class":553,"line":229},[551,16172,16173],{},"if ((v >= 207 && v \u003C= 253) && (i \u003C= 16) && ((2*l*i*0.018)\u002Fs \u003C= 6.9))\n",[551,16175,16176],{"class":553,"line":670},[551,16177,1151],{},[551,16179,16180],{"class":553,"line":1136},[551,16181,16123],{},[551,16183,16184],{"class":553,"line":1142},[551,16185,1193],{},[551,16187,16188],{"class":553,"line":1148},[551,16189,1139],{"emptyLinePlaceholder":238},[551,16191,16192],{"class":553,"line":1154},[551,16193,16194],{},"\u002F\u002F Claro\n",[551,16196,16197],{"class":553,"line":1160},[551,16198,16199],{},"bool voltajeOK = (voltaje >= 207 && voltaje \u003C= 253);\n",[551,16201,16202],{"class":553,"line":1166},[551,16203,16204],{},"bool corrienteOK = (corriente \u003C= 16);\n",[551,16206,16207],{"class":553,"line":1172},[551,16208,16209],{},"double caidaTension = (2 * longitud * corriente * 0.018) \u002F seccion;\n",[551,16211,16212],{"class":553,"line":1178},[551,16213,16214],{},"bool caidaOK = (caidaTension \u003C= 6.9);\n",[551,16216,16217],{"class":553,"line":1184},[551,16218,1139],{"emptyLinePlaceholder":238},[551,16220,16221],{"class":553,"line":1190},[551,16222,16223],{},"if (voltajeOK && corrienteOK && caidaOK)\n",[551,16225,16226],{"class":553,"line":1472},[551,16227,1151],{},[551,16229,16230],{"class":553,"line":1477},[551,16231,16123],{},[551,16233,16234],{"class":553,"line":1797},[551,16235,1193],{},[13,16237,16238],{},[16,16239,16240],{},"3. Usa constantes para valores mágicos",[543,16242,16244],{"className":545,"code":16243,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: ¿qué significan estos números?\nif (voltaje >= 207 && voltaje \u003C= 253)\n{\n    \u002F\u002F ...\n}\n\n\u002F\u002F Bien: significado claro\nconst double VOLTAJE_MINIMO = 207.0;  \u002F\u002F 230V - 10%\nconst double VOLTAJE_MAXIMO = 253.0;  \u002F\u002F 230V + 10%\n\nif (voltaje >= VOLTAJE_MINIMO && voltaje \u003C= VOLTAJE_MAXIMO)\n{\n    \u002F\u002F ...\n}\n",[54,16245,16246,16251,16256,16260,16264,16268,16272,16277,16282,16287,16291,16296,16300,16304],{"__ignoreMap":228},[551,16247,16248],{"class":553,"line":554},[551,16249,16250],{},"\u002F\u002F Mal: ¿qué significan estos números?\n",[551,16252,16253],{"class":553,"line":229},[551,16254,16255],{},"if (voltaje >= 207 && voltaje \u003C= 253)\n",[551,16257,16258],{"class":553,"line":670},[551,16259,1151],{},[551,16261,16262],{"class":553,"line":1136},[551,16263,16123],{},[551,16265,16266],{"class":553,"line":1142},[551,16267,1193],{},[551,16269,16270],{"class":553,"line":1148},[551,16271,1139],{"emptyLinePlaceholder":238},[551,16273,16274],{"class":553,"line":1154},[551,16275,16276],{},"\u002F\u002F Bien: significado claro\n",[551,16278,16279],{"class":553,"line":1160},[551,16280,16281],{},"const double VOLTAJE_MINIMO = 207.0;  \u002F\u002F 230V - 10%\n",[551,16283,16284],{"class":553,"line":1166},[551,16285,16286],{},"const double VOLTAJE_MAXIMO = 253.0;  \u002F\u002F 230V + 10%\n",[551,16288,16289],{"class":553,"line":1172},[551,16290,1139],{"emptyLinePlaceholder":238},[551,16292,16293],{"class":553,"line":1178},[551,16294,16295],{},"if (voltaje >= VOLTAJE_MINIMO && voltaje \u003C= VOLTAJE_MAXIMO)\n",[551,16297,16298],{"class":553,"line":1184},[551,16299,1151],{},[551,16301,16302],{"class":553,"line":1190},[551,16303,16123],{},[551,16305,16306],{"class":553,"line":1472},[551,16307,1193],{},[331,16309,5309],{"id":5308},[367,16311,16313],{"id":16312},"error-1-usar-en-lugar-de","Error 1: Usar = en lugar de ==",[543,16315,16317],{"className":545,"code":16316,"language":547,"meta":228,"style":228},"int voltaje = 230;\n\nif (voltaje = 400)  \u002F\u002F ERROR: asignación, no comparación\n{\n    \u002F\u002F ...\n}\n",[54,16318,16319,16323,16327,16331,16335,16339],{"__ignoreMap":228},[551,16320,16321],{"class":553,"line":554},[551,16322,10267],{},[551,16324,16325],{"class":553,"line":229},[551,16326,1139],{"emptyLinePlaceholder":238},[551,16328,16329],{"class":553,"line":670},[551,16330,10276],{},[551,16332,16333],{"class":553,"line":1136},[551,16334,1151],{},[551,16336,16337],{"class":553,"line":1142},[551,16338,16123],{},[551,16340,16341],{"class":553,"line":1148},[551,16342,1193],{},[13,16344,16345,416],{},[16,16346,1983],{},[543,16348,16350],{"className":545,"code":16349,"language":547,"meta":228,"style":228},"if (voltaje == 400)  \u002F\u002F Comparación correcta\n{\n    \u002F\u002F ...\n}\n",[54,16351,16352,16356,16360,16364],{"__ignoreMap":228},[551,16353,16354],{"class":553,"line":554},[551,16355,10303],{},[551,16357,16358],{"class":553,"line":229},[551,16359,1151],{},[551,16361,16362],{"class":553,"line":670},[551,16363,16123],{},[551,16365,16366],{"class":553,"line":1136},[551,16367,1193],{},[43,16369],{},[367,16371,16373],{"id":16372},"error-2-olvidar-el-break-en-switch","Error 2: Olvidar el break en switch",[13,16375,16376],{},"Lo veremos en detalle en el próximo capítulo, pero es un error muy común.",[43,16378],{},[367,16380,16382],{"id":16381},"error-3-comparar-strings-con-sin-considerar-mayúsculas","Error 3: Comparar strings con ==  sin considerar mayúsculas",[543,16384,16386],{"className":545,"code":16385,"language":547,"meta":228,"style":228},"string tipo = \"motor\";\n\nif (tipo == \"Motor\")  \u002F\u002F No coincide\n{\n    \u002F\u002F No entra\n}\n",[54,16387,16388,16392,16396,16400,16404,16409],{"__ignoreMap":228},[551,16389,16390],{"class":553,"line":554},[551,16391,12751],{},[551,16393,16394],{"class":553,"line":229},[551,16395,1139],{"emptyLinePlaceholder":238},[551,16397,16398],{"class":553,"line":670},[551,16399,12724],{},[551,16401,16402],{"class":553,"line":1136},[551,16403,1151],{},[551,16405,16406],{"class":553,"line":1142},[551,16407,16408],{},"    \u002F\u002F No entra\n",[551,16410,16411],{"class":553,"line":1148},[551,16412,1193],{},[13,16414,16415,416],{},[16,16416,1983],{},[543,16418,16420],{"className":545,"code":16419,"language":547,"meta":228,"style":228},"if (tipo.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n{\n    \u002F\u002F Ahora sí coincide\n}\n",[54,16421,16422,16427,16431,16435],{"__ignoreMap":228},[551,16423,16424],{"class":553,"line":554},[551,16425,16426],{},"if (tipo.Equals(\"Motor\", StringComparison.OrdinalIgnoreCase))\n",[551,16428,16429],{"class":553,"line":229},[551,16430,1151],{},[551,16432,16433],{"class":553,"line":670},[551,16434,12773],{},[551,16436,16437],{"class":553,"line":1136},[551,16438,1193],{},[43,16440],{},[46,16442,5452],{"id":5451},[331,16444,16446],{"id":16445},"desafío-1-clasificador-de-eficiencia-energética","Desafío 1: Clasificador de eficiencia energética",[13,16448,16449,5465],{},[16,16450,5464],{},[13,16452,16453],{},"Crea un script que clasifique motores según su eficiencia:",[126,16455,16456,16459,16462,16465],{},[88,16457,16458],{},"IE4 (Super Premium): η ≥ 95%",[88,16460,16461],{},"IE3 (Premium): 93% ≤ η \u003C 95%",[88,16463,16464],{},"IE2 (High Efficiency): 90% ≤ η \u003C 93%",[88,16466,16467],{},"IE1 (Standard): η \u003C 90%",[13,16469,16470],{},"Muestra la clasificación y una recomendación.",[5487,16472,16473,16475],{},[5490,16474,5492],{},[13,16476,16477],{},"Usa else if para cada rango de eficiencia, de mayor a menor.",[43,16479],{},[331,16481,16483],{"id":16482},"desafío-2-selector-de-tipo-de-arranque-para-motores","Desafío 2: Selector de tipo de arranque para motores",[13,16485,16486,16488],{},[16,16487,5464],{},": Medio",[13,16490,16491],{},"Crea un script que seleccione el tipo de arranque según:",[126,16493,16494,16497,16500],{},[88,16495,16496],{},"Potencia del motor (kW)",[88,16498,16499],{},"Tipo de carga (liviana, media, pesada)",[88,16501,16502],{},"Limitación de corriente de arranque (sí\u002Fno)",[13,16504,16505],{},"Opciones: Directo, Estrella-Triángulo, Arrancador suave, Variador de frecuencia",[5487,16507,16508,16510],{},[5490,16509,5492],{},[13,16511,16512],{},"Usa if anidados: primero verifica la potencia, luego el tipo de carga, finalmente la limitación de corriente.",[43,16514],{},[331,16516,16518],{"id":16517},"desafío-3-calculadora-de-compensación-reactiva-completa","Desafío 3: Calculadora de compensación reactiva completa",[13,16520,16521,10447],{},[16,16522,5464],{},[13,16524,10450],{},[85,16526,16527,16530,16533,16536,16539],{},[88,16528,16529],{},"Reciba: potencia activa, factor de potencia actual, voltaje",[88,16531,16532],{},"Determine si necesita corrección (fp \u003C 0.92)",[88,16534,16535],{},"Si necesita: calcule el banco de capacitores (kVAr) para llegar a 0.95",[88,16537,16538],{},"Seleccione el banco normalizado más cercano (5, 10, 15, 20, 25, 30, 40, 50 kVAr)",[88,16540,16541],{},"Calcule el ahorro económico estimado (penalización evitada)",[5487,16543,16544,16546],{},[5490,16545,5492],{},[13,16547,16548],{},"Usa if para verificar si necesita corrección, luego calcula el kVAr necesario, luego usa else if para seleccionar el banco normalizado.",[43,16550],{},[46,16552,10523],{"id":10522},[126,16554,16555,16563],{},[88,16556,16557,16558],{},"📖 ",[955,16559,16562],{"href":16560,"rel":16561},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Fstatements\u002Fselection-statements",[959],"Documentación de C# - if\u002Felse",[88,16564],{},[43,16566],{},[46,16568,5728],{"id":5727},[331,16570,16572],{"id":16571},"p-cuándo-usar-else-if-y-cuándo-usar-if-separados","P: ¿Cuándo usar else if y cuándo usar if separados?",[13,16574,16575,5755,16577,16579,16580,16583,16584,16586,16587,16590],{},[16,16576,5737],{},[54,16578,11647],{}," cuando las opciones son ",[16,16581,16582],{},"mutuamente excluyentes"," (solo una puede ser verdadera). Usa ",[54,16585,11644],{}," separados cuando las condiciones son ",[16,16588,16589],{},"independientes"," y pueden ser verdaderas simultáneamente.",[331,16592,16594],{"id":16593},"p-el-operador-ternario-es-más-eficiente-que-ifelse","P: ¿El operador ternario es más eficiente que if\u002Felse?",[13,16596,16597,16599],{},[16,16598,5737],{}," No hay diferencia significativa de rendimiento. Usa ternario para asignaciones simples y legibles, usa if\u002Felse para lógica más compleja.",[331,16601,16603],{"id":16602},"p-puedo-poner-un-if-dentro-de-un-else","P: ¿Puedo poner un if dentro de un else?",[13,16605,16606,16608,16609,16611],{},[16,16607,5737],{}," Sí, pero generalmente es más claro usar ",[54,16610,11647],{}," en su lugar.",[331,16613,16615],{"id":16614},"p-cuántos-niveles-de-anidación-son-aceptables","P: ¿Cuántos niveles de anidación son aceptables?",[13,16617,16618,16620],{},[16,16619,5737],{}," Como regla general, evita más de 2-3 niveles. Si necesitas más, considera refactorizar usando funciones o combinar condiciones con operadores lógicos.",[331,16622,16624],{"id":16623},"p-importa-el-orden-de-las-condiciones-en-else-if","P: ¿Importa el orden de las condiciones en else if?",[13,16626,16627,16629],{},[16,16628,5737],{}," Sí, mucho. Se evalúan en orden y se ejecuta el primer bloque verdadero. Pon las condiciones más específicas primero.",[43,16631],{},[46,16633,10615],{"id":10614},[13,16635,10618],{},[126,16637,16639,16645,16651,16657,16663,16669,16675,16681,16687],{"className":16638},[275],[88,16640,16642,16644],{"className":16641},[279],[281,16643],{"disabled":238,"type":283}," Entender cómo funciona la estructura if básica",[88,16646,16648,16650],{"className":16647},[279],[281,16649],{"disabled":238,"type":283}," Poder usar if\u002Felse para dos opciones",[88,16652,16654,16656],{"className":16653},[279],[281,16655],{"disabled":238,"type":283}," Saber encadenar múltiples opciones con else if",[88,16658,16660,16662],{"className":16659},[279],[281,16661],{"disabled":238,"type":283}," Comprender cuándo usar if anidados vs operadores lógicos",[88,16664,16666,16668],{"className":16665},[279],[281,16667],{"disabled":238,"type":283}," Saber usar el operador ternario para asignaciones simples",[88,16670,16672,16674],{"className":16671},[279],[281,16673],{"disabled":238,"type":283}," Poder comparar strings correctamente (sensible e insensible a mayúsculas)",[88,16676,16678,16680],{"className":16677},[279],[281,16679],{"disabled":238,"type":283}," Haber ejecutado exitosamente el selector de protecciones",[88,16682,16684,16686],{"className":16683},[279],[281,16685],{"disabled":238,"type":283}," Poder modificar los parámetros y ver cómo cambian las selecciones",[88,16688,16690,10669],{"className":16689},[279],[281,16691],{"disabled":238,"type":283},[43,16693],{},[13,16695,16696,10676,16698,16700,16701,93,16703],{},[31,16697,657],{},[31,16699,10679],{},": 45-55 minutos\n",[31,16702,10683],{},[54,16704,16705],{},"code\u002Fcap-05\u002F",[660,16707,662],{},{"title":228,"searchDepth":229,"depth":229,"links":16709},[16710,16711,16712,16713,16722,16733,16740,16745,16746,16753],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":16714},[16715,16716,16717,16718,16719,16720,16721],{"id":10865,"depth":670,"text":10866},{"id":10918,"depth":670,"text":10919},{"id":11256,"depth":670,"text":11257},{"id":11548,"depth":670,"text":11549},{"id":11922,"depth":670,"text":11923},{"id":12365,"depth":670,"text":12366},{"id":12660,"depth":670,"text":12661},{"id":4024,"depth":229,"text":4025,"children":16723},[16724,16725,16726,16727,16728,16729,16730,16731,16732],{"id":12916,"depth":670,"text":12917},{"id":13018,"depth":670,"text":13019},{"id":13160,"depth":670,"text":13161},{"id":13336,"depth":670,"text":13337},{"id":13561,"depth":670,"text":13562},{"id":13647,"depth":670,"text":13648},{"id":13778,"depth":670,"text":13779},{"id":14020,"depth":670,"text":14021},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":16734},[16735,16736,16737,16738,16739],{"id":15693,"depth":670,"text":15694},{"id":15804,"depth":670,"text":15805},{"id":15942,"depth":670,"text":15943},{"id":5120,"depth":670,"text":5121},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":5452,"children":16741},[16742,16743,16744],{"id":16445,"depth":670,"text":16446},{"id":16482,"depth":670,"text":16483},{"id":16517,"depth":670,"text":16518},{"id":10522,"depth":229,"text":10523},{"id":5727,"depth":229,"text":5728,"children":16747},[16748,16749,16750,16751,16752],{"id":16571,"depth":670,"text":16572},{"id":16593,"depth":670,"text":16594},{"id":16602,"depth":670,"text":16603},{"id":16614,"depth":670,"text":16615},{"id":16623,"depth":670,"text":16624},{"id":10614,"depth":229,"text":10615},"Usa condicionales if\u002Felse en C# para tomar decisiones en tus scripts EPLAN y automatizar EPLAN Electric P8 con lógica propia.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-05-control-flujo-if-else",{"title":10741,"description":16754},"guia\u002Ffundamentos\u002Fcap-05-control-flujo-if-else","m5JiNqhlHfculh6f--NQzhVF_B3LMStSE7qQ_G512_k",{"id":16761,"title":16762,"body":16763,"description":22974,"extension":236,"meta":22975,"navigation":238,"path":22976,"seo":22977,"stem":22978,"tagline":242,"__hash__":22979},"guia\u002Fguia\u002Ffundamentos\u002Fcap-06-control-flujo-switch.md","Capítulo 6: La sentencia switch en C#",{"type":7,"value":16764,"toc":22928},[16765,16775,16777,16779,16781,16829,16831,16833,16835,16849,16851,16853,16858,16860,16874,16876,16878,16882,16885,16971,16978,16987,16994,16996,17000,17003,17062,17067,17160,17164,17175,17177,17181,17248,17252,17258,17307,17312,17360,17365,17423,17425,17429,17433,17561,17565,17675,17679,17822,17824,17828,17834,17887,17891,18034,18038,18145,18147,18151,18165,18169,18239,18243,18319,18323,18430,18432,18436,18440,18445,18501,18506,18509,18515,18558,18562,18567,18611,18616,18651,18656,18683,18688,18749,18753,18830,18832,18836,18843,18847,18852,18917,18923,18965,18969,19035,19039,19050,19055,19066,19071,19082,19084,19086,19091,19093,19199,19201,19205,19373,19378,19380,19384,19545,19547,19551,20114,20119,20121,20125,20264,20266,20270,20452,20454,20456,21769,21774,21792,21794,21796,21800,21811,21821,21866,21871,21952,21957,21961,21968,22068,22071,22075,22078,22160,22162,22167,22173,22178,22233,22238,22286,22291,22294,22388,22390,22394,22438,22454,22456,22460,22494,22501,22536,22538,22542,22577,22584,22586,22588,22592,22596,22599,22610,22617,22619,22623,22627,22630,22650,22653,22655,22659,22663,22666,22680,22682,22686,22689,22727,22732,22749,22751,22753,22770,22772,22774,22778,22783,22787,22792,22796,22801,22805,22810,22835,22839,22844,22846,22848,22850,22912,22914,22926],[10,16766,16767],{},[13,16768,16769,19,16771,19,16773,262],{},[16,16770,256],{},[16,16772,10752],{},[16,16774,25],{},[43,16776],{},[46,16778,268],{"id":267},[13,16780,702],{},[126,16782,16784,16793,16802,16811,16820],{"className":16783},[275],[88,16785,16787,73,16789,16792],{"className":16786},[279],[281,16788],{"disabled":238,"type":283},[16,16790,16791],{},"Usar la estructura switch"," para comparar una variable contra múltiples valores",[88,16794,16796,73,16798,16801],{"className":16795},[279],[281,16797],{"disabled":238,"type":283},[16,16799,16800],{},"Entender cuándo switch es mejor"," que múltiples else if",[88,16803,16805,73,16807,16810],{"className":16804},[279],[281,16806],{"disabled":238,"type":283},[16,16808,16809],{},"Manejar casos múltiples"," con fall-through controlado",[88,16812,16814,73,16816,16819],{"className":16813},[279],[281,16815],{"disabled":238,"type":283},[16,16817,16818],{},"Usar el caso default"," para valores no esperados",[88,16821,16823,73,16825,16828],{"className":16822},[279],[281,16824],{"disabled":238,"type":283},[16,16826,16827],{},"Construir configuradores"," de componentes con muchas opciones",[43,16830],{},[46,16832,320],{"id":319},[13,16834,726],{},[126,16836,16837,16840,16843,16846],{},[88,16838,16839],{},"Haber completado el Capítulo 5",[88,16841,16842],{},"Entender estructuras if\u002Felse if",[88,16844,16845],{},"Saber comparar valores con ==",[88,16847,16848],{},"Conocer tipos de datos básicos",[43,16850],{},[46,16852,740],{"id":739},[13,16854,16855],{},[16,16856,16857],{},"Configurador de Componentes Eléctricos",[13,16859,5969],{},[126,16861,16862,16865,16868,16871],{},[88,16863,16864],{},"Identifica componentes por su código de artículo",[88,16866,16867],{},"Obtiene especificaciones técnicas completas",[88,16869,16870],{},"Genera descripciones formateadas para documentación",[88,16872,16873],{},"Maneja decenas de opciones de forma organizada",[43,16875],{},[46,16877,329],{"id":328},[331,16879,16881],{"id":16880},"_1-introducción-el-problema-con-muchos-else-if","1. Introducción: El problema con muchos else if",[13,16883,16884],{},"En el capítulo anterior vimos este código:",[543,16886,16888],{"className":545,"code":16887,"language":547,"meta":228,"style":228},"if (tipoCarga == \"Motor\")\n{\n    curva = \"D\";\n}\nelse if (tipoCarga == \"Iluminacion\")\n{\n    curva = \"B\";\n}\nelse if (tipoCarga == \"Tomas\")\n{\n    curva = \"C\";\n}\nelse if (tipoCarga == \"Informatica\")\n{\n    curva = \"C\";\n}\nelse\n{\n    curva = \"C\";\n}\n",[54,16889,16890,16894,16898,16902,16906,16910,16914,16918,16922,16927,16931,16935,16939,16943,16947,16951,16955,16959,16963,16967],{"__ignoreMap":228},[551,16891,16892],{"class":553,"line":554},[551,16893,12108],{},[551,16895,16896],{"class":553,"line":229},[551,16897,1151],{},[551,16899,16900],{"class":553,"line":670},[551,16901,15835],{},[551,16903,16904],{"class":553,"line":1136},[551,16905,1193],{},[551,16907,16908],{"class":553,"line":1142},[551,16909,15844],{},[551,16911,16912],{"class":553,"line":1148},[551,16913,1151],{},[551,16915,16916],{"class":553,"line":1154},[551,16917,15853],{},[551,16919,16920],{"class":553,"line":1160},[551,16921,1193],{},[551,16923,16924],{"class":553,"line":1166},[551,16925,16926],{},"else if (tipoCarga == \"Tomas\")\n",[551,16928,16929],{"class":553,"line":1172},[551,16930,1151],{},[551,16932,16933],{"class":553,"line":1178},[551,16934,15870],{},[551,16936,16937],{"class":553,"line":1184},[551,16938,1193],{},[551,16940,16941],{"class":553,"line":1190},[551,16942,12179],{},[551,16944,16945],{"class":553,"line":1472},[551,16946,1151],{},[551,16948,16949],{"class":553,"line":1477},[551,16950,15870],{},[551,16952,16953],{"class":553,"line":1797},[551,16954,1193],{},[551,16956,16957],{"class":553,"line":1802},[551,16958,3704],{},[551,16960,16961],{"class":553,"line":1808},[551,16962,1151],{},[551,16964,16965],{"class":553,"line":1814},[551,16966,15870],{},[551,16968,16969],{"class":553,"line":1820},[551,16970,1193],{},[13,16972,16973,16974,16977],{},"Esto funciona, pero con ",[16,16975,16976],{},"muchas opciones"," se vuelve repetitivo y difícil de leer.",[13,16979,16980,16983,16984,16986],{},[16,16981,16982],{},"Problema real",": Imagina un configurador que debe identificar 50 tipos diferentes de interruptores por su código de artículo. Con ",[54,16985,11647],{}," tendrías 50 bloques casi idénticos.",[13,16988,16989,16991,16992,41],{},[16,16990,1983],{},": La estructura ",[54,16993,15811],{},[43,16995],{},[331,16997,16999],{"id":16998},"_2-la-estructura-switch-básica","2. La estructura switch básica",[13,17001,17002],{},"Sintaxis:",[543,17004,17006],{"className":545,"code":17005,"language":547,"meta":228,"style":228},"switch (variable)\n{\n    case valor1:\n        \u002F\u002F Código si variable == valor1\n        break;\n    case valor2:\n        \u002F\u002F Código si variable == valor2\n        break;\n    default:\n        \u002F\u002F Código si ningún case coincide\n        break;\n}\n",[54,17007,17008,17013,17017,17022,17027,17031,17036,17041,17045,17049,17054,17058],{"__ignoreMap":228},[551,17009,17010],{"class":553,"line":554},[551,17011,17012],{},"switch (variable)\n",[551,17014,17015],{"class":553,"line":229},[551,17016,1151],{},[551,17018,17019],{"class":553,"line":670},[551,17020,17021],{},"    case valor1:\n",[551,17023,17024],{"class":553,"line":1136},[551,17025,17026],{},"        \u002F\u002F Código si variable == valor1\n",[551,17028,17029],{"class":553,"line":1142},[551,17030,15907],{},[551,17032,17033],{"class":553,"line":1148},[551,17034,17035],{},"    case valor2:\n",[551,17037,17038],{"class":553,"line":1154},[551,17039,17040],{},"        \u002F\u002F Código si variable == valor2\n",[551,17042,17043],{"class":553,"line":1160},[551,17044,15907],{},[551,17046,17047],{"class":553,"line":1166},[551,17048,15926],{},[551,17050,17051],{"class":553,"line":1172},[551,17052,17053],{},"        \u002F\u002F Código si ningún case coincide\n",[551,17055,17056],{"class":553,"line":1178},[551,17057,15907],{},[551,17059,17060],{"class":553,"line":1184},[551,17061,1193],{},[13,17063,17064,416],{},[16,17065,17066],{},"Ejemplo práctico - mismo caso anterior",[543,17068,17070],{"className":545,"code":17069,"language":547,"meta":228,"style":228},"string tipoCarga = \"Motor\";\nstring curva;\n\nswitch (tipoCarga)\n{\n    case \"Motor\":\n        curva = \"D\";\n        break;\n    case \"Iluminacion\":\n        curva = \"B\";\n        break;\n    case \"Tomas\":\n        curva = \"C\";\n        break;\n    case \"Informatica\":\n        curva = \"C\";\n        break;\n    default:\n        curva = \"C\";\n        break;\n}\n",[54,17071,17072,17077,17082,17086,17090,17094,17098,17102,17106,17110,17114,17118,17123,17127,17131,17136,17140,17144,17148,17152,17156],{"__ignoreMap":228},[551,17073,17074],{"class":553,"line":554},[551,17075,17076],{},"string tipoCarga = \"Motor\";\n",[551,17078,17079],{"class":553,"line":229},[551,17080,17081],{},"string curva;\n",[551,17083,17084],{"class":553,"line":670},[551,17085,1139],{"emptyLinePlaceholder":238},[551,17087,17088],{"class":553,"line":1136},[551,17089,15888],{},[551,17091,17092],{"class":553,"line":1142},[551,17093,1151],{},[551,17095,17096],{"class":553,"line":1148},[551,17097,15897],{},[551,17099,17100],{"class":553,"line":1154},[551,17101,15902],{},[551,17103,17104],{"class":553,"line":1160},[551,17105,15907],{},[551,17107,17108],{"class":553,"line":1166},[551,17109,15912],{},[551,17111,17112],{"class":553,"line":1172},[551,17113,15917],{},[551,17115,17116],{"class":553,"line":1178},[551,17117,15907],{},[551,17119,17120],{"class":553,"line":1184},[551,17121,17122],{},"    case \"Tomas\":\n",[551,17124,17125],{"class":553,"line":1190},[551,17126,15931],{},[551,17128,17129],{"class":553,"line":1472},[551,17130,15907],{},[551,17132,17133],{"class":553,"line":1477},[551,17134,17135],{},"    case \"Informatica\":\n",[551,17137,17138],{"class":553,"line":1797},[551,17139,15931],{},[551,17141,17142],{"class":553,"line":1802},[551,17143,15907],{},[551,17145,17146],{"class":553,"line":1808},[551,17147,15926],{},[551,17149,17150],{"class":553,"line":1814},[551,17151,15931],{},[551,17153,17154],{"class":553,"line":1820},[551,17155,15907],{},[551,17157,17158],{"class":553,"line":1826},[551,17159,1193],{},[13,17161,17162,416],{},[16,17163,931],{},[126,17165,17166,17169,17172],{},[88,17167,17168],{},"Más legible cuando hay muchas opciones",[88,17170,17171],{},"Intención clara: \"evaluar variable contra valores\"",[88,17173,17174],{},"Fácil de mantener y extender",[43,17176],{},[331,17178,17180],{"id":17179},"_3-anatomía-del-switch","3. Anatomía del switch",[543,17182,17184],{"className":545,"code":17183,"language":547,"meta":228,"style":228},"switch (expresion)  ← Variable o expresión a evaluar\n{\n    case valorConstante1:  ← Valor específico a comparar\n        \u002F\u002F Código\n        break;  ← OBLIGATORIO: sale del switch\n\n    case valorConstante2:\n        \u002F\u002F Código\n        break;\n\n    default:  ← Opcional: caso \"ninguno de los anteriores\"\n        \u002F\u002F Código\n        break;\n}\n",[54,17185,17186,17191,17195,17200,17205,17210,17214,17219,17223,17227,17231,17236,17240,17244],{"__ignoreMap":228},[551,17187,17188],{"class":553,"line":554},[551,17189,17190],{},"switch (expresion)  ← Variable o expresión a evaluar\n",[551,17192,17193],{"class":553,"line":229},[551,17194,1151],{},[551,17196,17197],{"class":553,"line":670},[551,17198,17199],{},"    case valorConstante1:  ← Valor específico a comparar\n",[551,17201,17202],{"class":553,"line":1136},[551,17203,17204],{},"        \u002F\u002F Código\n",[551,17206,17207],{"class":553,"line":1142},[551,17208,17209],{},"        break;  ← OBLIGATORIO: sale del switch\n",[551,17211,17212],{"class":553,"line":1148},[551,17213,1139],{"emptyLinePlaceholder":238},[551,17215,17216],{"class":553,"line":1154},[551,17217,17218],{},"    case valorConstante2:\n",[551,17220,17221],{"class":553,"line":1160},[551,17222,17204],{},[551,17224,17225],{"class":553,"line":1166},[551,17226,15907],{},[551,17228,17229],{"class":553,"line":1172},[551,17230,1139],{"emptyLinePlaceholder":238},[551,17232,17233],{"class":553,"line":1178},[551,17234,17235],{},"    default:  ← Opcional: caso \"ninguno de los anteriores\"\n",[551,17237,17238],{"class":553,"line":1184},[551,17239,17204],{},[551,17241,17242],{"class":553,"line":1190},[551,17243,15907],{},[551,17245,17246],{"class":553,"line":1472},[551,17247,1193],{},[367,17249,17251],{"id":17250},"_31-reglas-importantes","3.1 Reglas importantes",[13,17253,17254,17257],{},[16,17255,17256],{},"1. La expresión puede ser",": int, string, char, enum, bool (no double ni float)",[543,17259,17261],{"className":545,"code":17260,"language":547,"meta":228,"style":228},"\u002F\u002F Válido\nswitch (corrienteNominal)  \u002F\u002F int\nswitch (tipoCarga)         \u002F\u002F string\nswitch (estado)            \u002F\u002F char\nswitch (tipoProteccion)    \u002F\u002F enum\n\n\u002F\u002F NO válido\nswitch (voltaje)           \u002F\u002F double - ERROR\nswitch (temperatura)       \u002F\u002F float - ERROR\n",[54,17262,17263,17268,17273,17278,17283,17288,17292,17297,17302],{"__ignoreMap":228},[551,17264,17265],{"class":553,"line":554},[551,17266,17267],{},"\u002F\u002F Válido\n",[551,17269,17270],{"class":553,"line":229},[551,17271,17272],{},"switch (corrienteNominal)  \u002F\u002F int\n",[551,17274,17275],{"class":553,"line":670},[551,17276,17277],{},"switch (tipoCarga)         \u002F\u002F string\n",[551,17279,17280],{"class":553,"line":1136},[551,17281,17282],{},"switch (estado)            \u002F\u002F char\n",[551,17284,17285],{"class":553,"line":1142},[551,17286,17287],{},"switch (tipoProteccion)    \u002F\u002F enum\n",[551,17289,17290],{"class":553,"line":1148},[551,17291,1139],{"emptyLinePlaceholder":238},[551,17293,17294],{"class":553,"line":1154},[551,17295,17296],{},"\u002F\u002F NO válido\n",[551,17298,17299],{"class":553,"line":1160},[551,17300,17301],{},"switch (voltaje)           \u002F\u002F double - ERROR\n",[551,17303,17304],{"class":553,"line":1166},[551,17305,17306],{},"switch (temperatura)       \u002F\u002F float - ERROR\n",[13,17308,17309],{},[16,17310,17311],{},"2. Cada case debe terminar con break",[543,17313,17315],{"className":545,"code":17314,"language":547,"meta":228,"style":228},"switch (tipo)\n{\n    case \"A\":\n        MessageBox.Show(\"Tipo A\");\n        break;  \u002F\u002F OBLIGATORIO\n    case \"B\":\n        MessageBox.Show(\"Tipo B\");\n        \u002F\u002F Sin break → ERROR de compilación\n}\n",[54,17316,17317,17322,17326,17331,17336,17341,17346,17351,17356],{"__ignoreMap":228},[551,17318,17319],{"class":553,"line":554},[551,17320,17321],{},"switch (tipo)\n",[551,17323,17324],{"class":553,"line":229},[551,17325,1151],{},[551,17327,17328],{"class":553,"line":670},[551,17329,17330],{},"    case \"A\":\n",[551,17332,17333],{"class":553,"line":1136},[551,17334,17335],{},"        MessageBox.Show(\"Tipo A\");\n",[551,17337,17338],{"class":553,"line":1142},[551,17339,17340],{},"        break;  \u002F\u002F OBLIGATORIO\n",[551,17342,17343],{"class":553,"line":1148},[551,17344,17345],{},"    case \"B\":\n",[551,17347,17348],{"class":553,"line":1154},[551,17349,17350],{},"        MessageBox.Show(\"Tipo B\");\n",[551,17352,17353],{"class":553,"line":1160},[551,17354,17355],{},"        \u002F\u002F Sin break → ERROR de compilación\n",[551,17357,17358],{"class":553,"line":1166},[551,17359,1193],{},[13,17361,17362],{},[16,17363,17364],{},"3. Los valores de case deben ser constantes",[543,17366,17368],{"className":545,"code":17367,"language":547,"meta":228,"style":228},"const string TIPO_MOTOR = \"Motor\";\nint limite = 16;\n\nswitch (tipoCarga)\n{\n    case TIPO_MOTOR:        \u002F\u002F OK: constante\n        break;\n    case \"Iluminacion\":     \u002F\u002F OK: literal\n        break;\n    case limite:            \u002F\u002F ERROR: no es constante\n        break;\n}\n",[54,17369,17370,17375,17380,17384,17388,17392,17397,17401,17406,17410,17415,17419],{"__ignoreMap":228},[551,17371,17372],{"class":553,"line":554},[551,17373,17374],{},"const string TIPO_MOTOR = \"Motor\";\n",[551,17376,17377],{"class":553,"line":229},[551,17378,17379],{},"int limite = 16;\n",[551,17381,17382],{"class":553,"line":670},[551,17383,1139],{"emptyLinePlaceholder":238},[551,17385,17386],{"class":553,"line":1136},[551,17387,15888],{},[551,17389,17390],{"class":553,"line":1142},[551,17391,1151],{},[551,17393,17394],{"class":553,"line":1148},[551,17395,17396],{},"    case TIPO_MOTOR:        \u002F\u002F OK: constante\n",[551,17398,17399],{"class":553,"line":1154},[551,17400,15907],{},[551,17402,17403],{"class":553,"line":1160},[551,17404,17405],{},"    case \"Iluminacion\":     \u002F\u002F OK: literal\n",[551,17407,17408],{"class":553,"line":1166},[551,17409,15907],{},[551,17411,17412],{"class":553,"line":1172},[551,17413,17414],{},"    case limite:            \u002F\u002F ERROR: no es constante\n",[551,17416,17417],{"class":553,"line":1178},[551,17418,15907],{},[551,17420,17421],{"class":553,"line":1184},[551,17422,1193],{},[43,17424],{},[331,17426,17428],{"id":17427},"_4-ejemplos-prácticos-básicos","4. Ejemplos prácticos básicos",[367,17430,17432],{"id":17431},"_41-switch-con-int-seleccionar-sección-de-cable","4.1 Switch con int - Seleccionar sección de cable",[543,17434,17436],{"className":545,"code":17435,"language":547,"meta":228,"style":228},"int corrienteNominal = 20;\ndouble seccionCable;\n\nswitch (corrienteNominal)\n{\n    case 10:\n        seccionCable = 1.5;\n        break;\n    case 16:\n        seccionCable = 2.5;\n        break;\n    case 20:\n        seccionCable = 4.0;\n        break;\n    case 25:\n        seccionCable = 6.0;\n        break;\n    case 32:\n        seccionCable = 10.0;\n        break;\n    default:\n        seccionCable = 16.0;\n        break;\n}\n\nMessageBox.Show(string.Format(\"Corriente: {0}A → Sección: {1}mm²\",\n    corrienteNominal, seccionCable));\n",[54,17437,17438,17443,17447,17451,17456,17460,17465,17470,17474,17479,17484,17488,17493,17498,17502,17507,17512,17516,17521,17526,17530,17534,17539,17543,17547,17551,17556],{"__ignoreMap":228},[551,17439,17440],{"class":553,"line":554},[551,17441,17442],{},"int corrienteNominal = 20;\n",[551,17444,17445],{"class":553,"line":229},[551,17446,3325],{},[551,17448,17449],{"class":553,"line":670},[551,17450,1139],{"emptyLinePlaceholder":238},[551,17452,17453],{"class":553,"line":1136},[551,17454,17455],{},"switch (corrienteNominal)\n",[551,17457,17458],{"class":553,"line":1142},[551,17459,1151],{},[551,17461,17462],{"class":553,"line":1148},[551,17463,17464],{},"    case 10:\n",[551,17466,17467],{"class":553,"line":1154},[551,17468,17469],{},"        seccionCable = 1.5;\n",[551,17471,17472],{"class":553,"line":1160},[551,17473,15907],{},[551,17475,17476],{"class":553,"line":1166},[551,17477,17478],{},"    case 16:\n",[551,17480,17481],{"class":553,"line":1172},[551,17482,17483],{},"        seccionCable = 2.5;\n",[551,17485,17486],{"class":553,"line":1178},[551,17487,15907],{},[551,17489,17490],{"class":553,"line":1184},[551,17491,17492],{},"    case 20:\n",[551,17494,17495],{"class":553,"line":1190},[551,17496,17497],{},"        seccionCable = 4.0;\n",[551,17499,17500],{"class":553,"line":1472},[551,17501,15907],{},[551,17503,17504],{"class":553,"line":1477},[551,17505,17506],{},"    case 25:\n",[551,17508,17509],{"class":553,"line":1797},[551,17510,17511],{},"        seccionCable = 6.0;\n",[551,17513,17514],{"class":553,"line":1802},[551,17515,15907],{},[551,17517,17518],{"class":553,"line":1808},[551,17519,17520],{},"    case 32:\n",[551,17522,17523],{"class":553,"line":1814},[551,17524,17525],{},"        seccionCable = 10.0;\n",[551,17527,17528],{"class":553,"line":1820},[551,17529,15907],{},[551,17531,17532],{"class":553,"line":1826},[551,17533,15926],{},[551,17535,17536],{"class":553,"line":1832},[551,17537,17538],{},"        seccionCable = 16.0;\n",[551,17540,17541],{"class":553,"line":1838},[551,17542,15907],{},[551,17544,17545],{"class":553,"line":1844},[551,17546,1193],{},[551,17548,17549],{"class":553,"line":1850},[551,17550,1139],{"emptyLinePlaceholder":238},[551,17552,17553],{"class":553,"line":1855},[551,17554,17555],{},"MessageBox.Show(string.Format(\"Corriente: {0}A → Sección: {1}mm²\",\n",[551,17557,17558],{"class":553,"line":1861},[551,17559,17560],{},"    corrienteNominal, seccionCable));\n",[367,17562,17564],{"id":17563},"_42-switch-con-string-tipo-de-instalación","4.2 Switch con string - Tipo de instalación",[543,17566,17568],{"className":545,"code":17567,"language":547,"meta":228,"style":228},"string ambiente = \"Humedo\";\nstring tipoInstalacion;\n\nswitch (ambiente)\n{\n    case \"Seco\":\n        tipoInstalacion = \"Instalación estándar (B1)\";\n        break;\n    case \"Humedo\":\n        tipoInstalacion = \"Instalación protegida contra agua (B2)\";\n        break;\n    case \"Mojado\":\n        tipoInstalacion = \"Instalación sumergible (B3)\";\n        break;\n    case \"Corrosivo\":\n        tipoInstalacion = \"Instalación con protección química (B4)\";\n        break;\n    default:\n        tipoInstalacion = \"No especificado - revisar manualmente\";\n        break;\n}\n\nMessageBox.Show(tipoInstalacion);\n",[54,17569,17570,17575,17580,17584,17589,17593,17598,17603,17607,17612,17617,17621,17626,17631,17635,17640,17645,17649,17653,17658,17662,17666,17670],{"__ignoreMap":228},[551,17571,17572],{"class":553,"line":554},[551,17573,17574],{},"string ambiente = \"Humedo\";\n",[551,17576,17577],{"class":553,"line":229},[551,17578,17579],{},"string tipoInstalacion;\n",[551,17581,17582],{"class":553,"line":670},[551,17583,1139],{"emptyLinePlaceholder":238},[551,17585,17586],{"class":553,"line":1136},[551,17587,17588],{},"switch (ambiente)\n",[551,17590,17591],{"class":553,"line":1142},[551,17592,1151],{},[551,17594,17595],{"class":553,"line":1148},[551,17596,17597],{},"    case \"Seco\":\n",[551,17599,17600],{"class":553,"line":1154},[551,17601,17602],{},"        tipoInstalacion = \"Instalación estándar (B1)\";\n",[551,17604,17605],{"class":553,"line":1160},[551,17606,15907],{},[551,17608,17609],{"class":553,"line":1166},[551,17610,17611],{},"    case \"Humedo\":\n",[551,17613,17614],{"class":553,"line":1172},[551,17615,17616],{},"        tipoInstalacion = \"Instalación protegida contra agua (B2)\";\n",[551,17618,17619],{"class":553,"line":1178},[551,17620,15907],{},[551,17622,17623],{"class":553,"line":1184},[551,17624,17625],{},"    case \"Mojado\":\n",[551,17627,17628],{"class":553,"line":1190},[551,17629,17630],{},"        tipoInstalacion = \"Instalación sumergible (B3)\";\n",[551,17632,17633],{"class":553,"line":1472},[551,17634,15907],{},[551,17636,17637],{"class":553,"line":1477},[551,17638,17639],{},"    case \"Corrosivo\":\n",[551,17641,17642],{"class":553,"line":1797},[551,17643,17644],{},"        tipoInstalacion = \"Instalación con protección química (B4)\";\n",[551,17646,17647],{"class":553,"line":1802},[551,17648,15907],{},[551,17650,17651],{"class":553,"line":1808},[551,17652,15926],{},[551,17654,17655],{"class":553,"line":1814},[551,17656,17657],{},"        tipoInstalacion = \"No especificado - revisar manualmente\";\n",[551,17659,17660],{"class":553,"line":1820},[551,17661,15907],{},[551,17663,17664],{"class":553,"line":1826},[551,17665,1193],{},[551,17667,17668],{"class":553,"line":1832},[551,17669,1139],{"emptyLinePlaceholder":238},[551,17671,17672],{"class":553,"line":1838},[551,17673,17674],{},"MessageBox.Show(tipoInstalacion);\n",[367,17676,17678],{"id":17677},"_43-switch-con-char-clase-de-aislamiento","4.3 Switch con char - Clase de aislamiento",[543,17680,17682],{"className":545,"code":17681,"language":547,"meta":228,"style":228},"char claseAislamiento = 'F';\nint temperaturaMaxima;\n\nswitch (claseAislamiento)\n{\n    case 'Y':\n        temperaturaMaxima = 90;\n        break;\n    case 'A':\n        temperaturaMaxima = 105;\n        break;\n    case 'E':\n        temperaturaMaxima = 120;\n        break;\n    case 'B':\n        temperaturaMaxima = 130;\n        break;\n    case 'F':\n        temperaturaMaxima = 155;\n        break;\n    case 'H':\n        temperaturaMaxima = 180;\n        break;\n    default:\n        temperaturaMaxima = 0;\n        break;\n}\n\nMessageBox.Show(string.Format(\"Clase {0}: Temperatura máxima {1}°C\",\n    claseAislamiento, temperaturaMaxima));\n",[54,17683,17684,17689,17694,17698,17703,17707,17712,17717,17721,17726,17731,17735,17740,17745,17749,17754,17759,17763,17768,17773,17777,17782,17787,17791,17795,17800,17804,17808,17812,17817],{"__ignoreMap":228},[551,17685,17686],{"class":553,"line":554},[551,17687,17688],{},"char claseAislamiento = 'F';\n",[551,17690,17691],{"class":553,"line":229},[551,17692,17693],{},"int temperaturaMaxima;\n",[551,17695,17696],{"class":553,"line":670},[551,17697,1139],{"emptyLinePlaceholder":238},[551,17699,17700],{"class":553,"line":1136},[551,17701,17702],{},"switch (claseAislamiento)\n",[551,17704,17705],{"class":553,"line":1142},[551,17706,1151],{},[551,17708,17709],{"class":553,"line":1148},[551,17710,17711],{},"    case 'Y':\n",[551,17713,17714],{"class":553,"line":1154},[551,17715,17716],{},"        temperaturaMaxima = 90;\n",[551,17718,17719],{"class":553,"line":1160},[551,17720,15907],{},[551,17722,17723],{"class":553,"line":1166},[551,17724,17725],{},"    case 'A':\n",[551,17727,17728],{"class":553,"line":1172},[551,17729,17730],{},"        temperaturaMaxima = 105;\n",[551,17732,17733],{"class":553,"line":1178},[551,17734,15907],{},[551,17736,17737],{"class":553,"line":1184},[551,17738,17739],{},"    case 'E':\n",[551,17741,17742],{"class":553,"line":1190},[551,17743,17744],{},"        temperaturaMaxima = 120;\n",[551,17746,17747],{"class":553,"line":1472},[551,17748,15907],{},[551,17750,17751],{"class":553,"line":1477},[551,17752,17753],{},"    case 'B':\n",[551,17755,17756],{"class":553,"line":1797},[551,17757,17758],{},"        temperaturaMaxima = 130;\n",[551,17760,17761],{"class":553,"line":1802},[551,17762,15907],{},[551,17764,17765],{"class":553,"line":1808},[551,17766,17767],{},"    case 'F':\n",[551,17769,17770],{"class":553,"line":1814},[551,17771,17772],{},"        temperaturaMaxima = 155;\n",[551,17774,17775],{"class":553,"line":1820},[551,17776,15907],{},[551,17778,17779],{"class":553,"line":1826},[551,17780,17781],{},"    case 'H':\n",[551,17783,17784],{"class":553,"line":1832},[551,17785,17786],{},"        temperaturaMaxima = 180;\n",[551,17788,17789],{"class":553,"line":1838},[551,17790,15907],{},[551,17792,17793],{"class":553,"line":1844},[551,17794,15926],{},[551,17796,17797],{"class":553,"line":1850},[551,17798,17799],{},"        temperaturaMaxima = 0;\n",[551,17801,17802],{"class":553,"line":1855},[551,17803,15907],{},[551,17805,17806],{"class":553,"line":1861},[551,17807,1193],{},[551,17809,17810],{"class":553,"line":1867},[551,17811,1139],{"emptyLinePlaceholder":238},[551,17813,17814],{"class":553,"line":1873},[551,17815,17816],{},"MessageBox.Show(string.Format(\"Clase {0}: Temperatura máxima {1}°C\",\n",[551,17818,17819],{"class":553,"line":1878},[551,17820,17821],{},"    claseAislamiento, temperaturaMaxima));\n",[43,17823],{},[331,17825,17827],{"id":17826},"_5-casos-múltiples-multiple-cases","5. Casos múltiples (multiple cases)",[13,17829,17830,17831,416],{},"Cuando varios valores deben ejecutar el ",[16,17832,17833],{},"mismo código",[543,17835,17837],{"className":545,"code":17836,"language":547,"meta":228,"style":228},"switch (variable)\n{\n    case valor1:\n    case valor2:\n    case valor3:\n        \u002F\u002F Código para valor1, valor2 o valor3\n        break;\n    case valor4:\n        \u002F\u002F Código solo para valor4\n        break;\n}\n",[54,17838,17839,17843,17847,17851,17855,17860,17865,17869,17874,17879,17883],{"__ignoreMap":228},[551,17840,17841],{"class":553,"line":554},[551,17842,17012],{},[551,17844,17845],{"class":553,"line":229},[551,17846,1151],{},[551,17848,17849],{"class":553,"line":670},[551,17850,17021],{},[551,17852,17853],{"class":553,"line":1136},[551,17854,17035],{},[551,17856,17857],{"class":553,"line":1142},[551,17858,17859],{},"    case valor3:\n",[551,17861,17862],{"class":553,"line":1148},[551,17863,17864],{},"        \u002F\u002F Código para valor1, valor2 o valor3\n",[551,17866,17867],{"class":553,"line":1154},[551,17868,15907],{},[551,17870,17871],{"class":553,"line":1160},[551,17872,17873],{},"    case valor4:\n",[551,17875,17876],{"class":553,"line":1166},[551,17877,17878],{},"        \u002F\u002F Código solo para valor4\n",[551,17880,17881],{"class":553,"line":1172},[551,17882,15907],{},[551,17884,17885],{"class":553,"line":1178},[551,17886,1193],{},[367,17888,17890],{"id":17889},"_51-ejemplo-clasificar-grado-de-protección-ip","5.1 Ejemplo: Clasificar grado de protección IP",[543,17892,17894],{"className":545,"code":17893,"language":547,"meta":228,"style":228},"int gradoProteccionIP = 54;  \u002F\u002F IP54\n\nstring descripcion;\n\nswitch (gradoProteccionIP)\n{\n    case 20:\n    case 21:\n    case 22:\n        descripcion = \"Protección básica interior\";\n        break;\n    case 44:\n    case 54:\n    case 55:\n        descripcion = \"Protección contra polvo y agua (uso industrial)\";\n        break;\n    case 65:\n    case 66:\n    case 67:\n        descripcion = \"Protección alta contra agua (uso exterior)\";\n        break;\n    case 68:\n        descripcion = \"Protección total (sumergible)\";\n        break;\n    default:\n        descripcion = \"Grado IP no reconocido\";\n        break;\n}\n\nMessageBox.Show(string.Format(\"IP{0}: {1}\", gradoProteccionIP, descripcion));\n",[54,17895,17896,17901,17905,17910,17914,17919,17923,17927,17932,17937,17942,17946,17951,17956,17961,17966,17970,17975,17980,17985,17990,17994,17999,18004,18008,18012,18017,18021,18025,18029],{"__ignoreMap":228},[551,17897,17898],{"class":553,"line":554},[551,17899,17900],{},"int gradoProteccionIP = 54;  \u002F\u002F IP54\n",[551,17902,17903],{"class":553,"line":229},[551,17904,1139],{"emptyLinePlaceholder":238},[551,17906,17907],{"class":553,"line":670},[551,17908,17909],{},"string descripcion;\n",[551,17911,17912],{"class":553,"line":1136},[551,17913,1139],{"emptyLinePlaceholder":238},[551,17915,17916],{"class":553,"line":1142},[551,17917,17918],{},"switch (gradoProteccionIP)\n",[551,17920,17921],{"class":553,"line":1148},[551,17922,1151],{},[551,17924,17925],{"class":553,"line":1154},[551,17926,17492],{},[551,17928,17929],{"class":553,"line":1160},[551,17930,17931],{},"    case 21:\n",[551,17933,17934],{"class":553,"line":1166},[551,17935,17936],{},"    case 22:\n",[551,17938,17939],{"class":553,"line":1172},[551,17940,17941],{},"        descripcion = \"Protección básica interior\";\n",[551,17943,17944],{"class":553,"line":1178},[551,17945,15907],{},[551,17947,17948],{"class":553,"line":1184},[551,17949,17950],{},"    case 44:\n",[551,17952,17953],{"class":553,"line":1190},[551,17954,17955],{},"    case 54:\n",[551,17957,17958],{"class":553,"line":1472},[551,17959,17960],{},"    case 55:\n",[551,17962,17963],{"class":553,"line":1477},[551,17964,17965],{},"        descripcion = \"Protección contra polvo y agua (uso industrial)\";\n",[551,17967,17968],{"class":553,"line":1797},[551,17969,15907],{},[551,17971,17972],{"class":553,"line":1802},[551,17973,17974],{},"    case 65:\n",[551,17976,17977],{"class":553,"line":1808},[551,17978,17979],{},"    case 66:\n",[551,17981,17982],{"class":553,"line":1814},[551,17983,17984],{},"    case 67:\n",[551,17986,17987],{"class":553,"line":1820},[551,17988,17989],{},"        descripcion = \"Protección alta contra agua (uso exterior)\";\n",[551,17991,17992],{"class":553,"line":1826},[551,17993,15907],{},[551,17995,17996],{"class":553,"line":1832},[551,17997,17998],{},"    case 68:\n",[551,18000,18001],{"class":553,"line":1838},[551,18002,18003],{},"        descripcion = \"Protección total (sumergible)\";\n",[551,18005,18006],{"class":553,"line":1844},[551,18007,15907],{},[551,18009,18010],{"class":553,"line":1850},[551,18011,15926],{},[551,18013,18014],{"class":553,"line":1855},[551,18015,18016],{},"        descripcion = \"Grado IP no reconocido\";\n",[551,18018,18019],{"class":553,"line":1861},[551,18020,15907],{},[551,18022,18023],{"class":553,"line":1867},[551,18024,1193],{},[551,18026,18027],{"class":553,"line":1873},[551,18028,1139],{"emptyLinePlaceholder":238},[551,18030,18031],{"class":553,"line":1878},[551,18032,18033],{},"MessageBox.Show(string.Format(\"IP{0}: {1}\", gradoProteccionIP, descripcion));\n",[367,18035,18037],{"id":18036},"_52-ejemplo-días-laborables-vs-fin-de-semana","5.2 Ejemplo: Días laborables vs fin de semana",[543,18039,18041],{"className":545,"code":18040,"language":547,"meta":228,"style":228},"int diaSemana = 3;  \u002F\u002F 1=Lunes, 7=Domingo\nstring tipoTarifa;\n\nswitch (diaSemana)\n{\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n    case 5:\n        tipoTarifa = \"Tarifa laboral (mayor consumo industrial)\";\n        break;\n    case 6:\n    case 7:\n        tipoTarifa = \"Tarifa fin de semana (menor consumo)\";\n        break;\n    default:\n        tipoTarifa = \"Día no válido\";\n        break;\n}\n\nMessageBox.Show(tipoTarifa);\n",[54,18042,18043,18048,18053,18057,18062,18066,18071,18076,18081,18086,18091,18096,18100,18105,18110,18115,18119,18123,18128,18132,18136,18140],{"__ignoreMap":228},[551,18044,18045],{"class":553,"line":554},[551,18046,18047],{},"int diaSemana = 3;  \u002F\u002F 1=Lunes, 7=Domingo\n",[551,18049,18050],{"class":553,"line":229},[551,18051,18052],{},"string tipoTarifa;\n",[551,18054,18055],{"class":553,"line":670},[551,18056,1139],{"emptyLinePlaceholder":238},[551,18058,18059],{"class":553,"line":1136},[551,18060,18061],{},"switch (diaSemana)\n",[551,18063,18064],{"class":553,"line":1142},[551,18065,1151],{},[551,18067,18068],{"class":553,"line":1148},[551,18069,18070],{},"    case 1:\n",[551,18072,18073],{"class":553,"line":1154},[551,18074,18075],{},"    case 2:\n",[551,18077,18078],{"class":553,"line":1160},[551,18079,18080],{},"    case 3:\n",[551,18082,18083],{"class":553,"line":1166},[551,18084,18085],{},"    case 4:\n",[551,18087,18088],{"class":553,"line":1172},[551,18089,18090],{},"    case 5:\n",[551,18092,18093],{"class":553,"line":1178},[551,18094,18095],{},"        tipoTarifa = \"Tarifa laboral (mayor consumo industrial)\";\n",[551,18097,18098],{"class":553,"line":1184},[551,18099,15907],{},[551,18101,18102],{"class":553,"line":1190},[551,18103,18104],{},"    case 6:\n",[551,18106,18107],{"class":553,"line":1472},[551,18108,18109],{},"    case 7:\n",[551,18111,18112],{"class":553,"line":1477},[551,18113,18114],{},"        tipoTarifa = \"Tarifa fin de semana (menor consumo)\";\n",[551,18116,18117],{"class":553,"line":1797},[551,18118,15907],{},[551,18120,18121],{"class":553,"line":1802},[551,18122,15926],{},[551,18124,18125],{"class":553,"line":1808},[551,18126,18127],{},"        tipoTarifa = \"Día no válido\";\n",[551,18129,18130],{"class":553,"line":1814},[551,18131,15907],{},[551,18133,18134],{"class":553,"line":1820},[551,18135,1193],{},[551,18137,18138],{"class":553,"line":1826},[551,18139,1139],{"emptyLinePlaceholder":238},[551,18141,18142],{"class":553,"line":1832},[551,18143,18144],{},"MessageBox.Show(tipoTarifa);\n",[43,18146],{},[331,18148,18150],{"id":18149},"_6-el-caso-default","6. El caso default",[13,18152,18153,18154,18157,18158,18161,18162,41],{},"El bloque ",[54,18155,18156],{},"default"," se ejecuta cuando ",[16,18159,18160],{},"ningún case coincide",". Es opcional pero ",[16,18163,18164],{},"muy recomendable",[367,18166,18168],{"id":18167},"_61-sin-default-peligroso","6.1 Sin default (peligroso)",[543,18170,18172],{"className":545,"code":18171,"language":547,"meta":228,"style":228},"string tipo = \"X\";  \u002F\u002F Valor inesperado\nstring descripcion;\n\nswitch (tipo)\n{\n    case \"A\":\n        descripcion = \"Tipo A\";\n        break;\n    case \"B\":\n        descripcion = \"Tipo B\";\n        break;\n    \u002F\u002F Sin default\n}\n\nMessageBox.Show(descripcion);  \u002F\u002F ERROR: 'descripcion' no está asignada\n",[54,18173,18174,18179,18183,18187,18191,18195,18199,18204,18208,18212,18217,18221,18226,18230,18234],{"__ignoreMap":228},[551,18175,18176],{"class":553,"line":554},[551,18177,18178],{},"string tipo = \"X\";  \u002F\u002F Valor inesperado\n",[551,18180,18181],{"class":553,"line":229},[551,18182,17909],{},[551,18184,18185],{"class":553,"line":670},[551,18186,1139],{"emptyLinePlaceholder":238},[551,18188,18189],{"class":553,"line":1136},[551,18190,17321],{},[551,18192,18193],{"class":553,"line":1142},[551,18194,1151],{},[551,18196,18197],{"class":553,"line":1148},[551,18198,17330],{},[551,18200,18201],{"class":553,"line":1154},[551,18202,18203],{},"        descripcion = \"Tipo A\";\n",[551,18205,18206],{"class":553,"line":1160},[551,18207,15907],{},[551,18209,18210],{"class":553,"line":1166},[551,18211,17345],{},[551,18213,18214],{"class":553,"line":1172},[551,18215,18216],{},"        descripcion = \"Tipo B\";\n",[551,18218,18219],{"class":553,"line":1178},[551,18220,15907],{},[551,18222,18223],{"class":553,"line":1184},[551,18224,18225],{},"    \u002F\u002F Sin default\n",[551,18227,18228],{"class":553,"line":1190},[551,18229,1193],{},[551,18231,18232],{"class":553,"line":1472},[551,18233,1139],{"emptyLinePlaceholder":238},[551,18235,18236],{"class":553,"line":1477},[551,18237,18238],{},"MessageBox.Show(descripcion);  \u002F\u002F ERROR: 'descripcion' no está asignada\n",[367,18240,18242],{"id":18241},"_62-con-default-seguro","6.2 Con default (seguro)",[543,18244,18246],{"className":545,"code":18245,"language":547,"meta":228,"style":228},"string tipo = \"X\";\nstring descripcion;\n\nswitch (tipo)\n{\n    case \"A\":\n        descripcion = \"Tipo A\";\n        break;\n    case \"B\":\n        descripcion = \"Tipo B\";\n        break;\n    default:\n        descripcion = \"Tipo desconocido\";\n        break;\n}\n\nMessageBox.Show(descripcion);  \u002F\u002F \"Tipo desconocido\"\n",[54,18247,18248,18253,18257,18261,18265,18269,18273,18277,18281,18285,18289,18293,18297,18302,18306,18310,18314],{"__ignoreMap":228},[551,18249,18250],{"class":553,"line":554},[551,18251,18252],{},"string tipo = \"X\";\n",[551,18254,18255],{"class":553,"line":229},[551,18256,17909],{},[551,18258,18259],{"class":553,"line":670},[551,18260,1139],{"emptyLinePlaceholder":238},[551,18262,18263],{"class":553,"line":1136},[551,18264,17321],{},[551,18266,18267],{"class":553,"line":1142},[551,18268,1151],{},[551,18270,18271],{"class":553,"line":1148},[551,18272,17330],{},[551,18274,18275],{"class":553,"line":1154},[551,18276,18203],{},[551,18278,18279],{"class":553,"line":1160},[551,18280,15907],{},[551,18282,18283],{"class":553,"line":1166},[551,18284,17345],{},[551,18286,18287],{"class":553,"line":1172},[551,18288,18216],{},[551,18290,18291],{"class":553,"line":1178},[551,18292,15907],{},[551,18294,18295],{"class":553,"line":1184},[551,18296,15926],{},[551,18298,18299],{"class":553,"line":1190},[551,18300,18301],{},"        descripcion = \"Tipo desconocido\";\n",[551,18303,18304],{"class":553,"line":1472},[551,18305,15907],{},[551,18307,18308],{"class":553,"line":1477},[551,18309,1193],{},[551,18311,18312],{"class":553,"line":1797},[551,18313,1139],{"emptyLinePlaceholder":238},[551,18315,18316],{"class":553,"line":1802},[551,18317,18318],{},"MessageBox.Show(descripcion);  \u002F\u002F \"Tipo desconocido\"\n",[367,18320,18322],{"id":18321},"_63-default-para-validación","6.3 Default para validación",[543,18324,18326],{"className":545,"code":18325,"language":547,"meta":228,"style":228},"int corriente = 35;  \u002F\u002F Valor no estándar\ndouble seccion;\n\nswitch (corriente)\n{\n    case 10:\n        seccion = 1.5;\n        break;\n    case 16:\n        seccion = 2.5;\n        break;\n    case 20:\n        seccion = 4.0;\n        break;\n    case 25:\n        seccion = 6.0;\n        break;\n    default:\n        MessageBox.Show(\"Corriente no estándar. Requiere cálculo manual.\");\n        return;  \u002F\u002F Sale del método\n}\n\nMessageBox.Show(string.Format(\"Sección: {0}mm²\", seccion));\n",[54,18327,18328,18333,18338,18342,18347,18351,18355,18360,18364,18368,18373,18377,18381,18386,18390,18394,18399,18403,18407,18412,18417,18421,18425],{"__ignoreMap":228},[551,18329,18330],{"class":553,"line":554},[551,18331,18332],{},"int corriente = 35;  \u002F\u002F Valor no estándar\n",[551,18334,18335],{"class":553,"line":229},[551,18336,18337],{},"double seccion;\n",[551,18339,18340],{"class":553,"line":670},[551,18341,1139],{"emptyLinePlaceholder":238},[551,18343,18344],{"class":553,"line":1136},[551,18345,18346],{},"switch (corriente)\n",[551,18348,18349],{"class":553,"line":1142},[551,18350,1151],{},[551,18352,18353],{"class":553,"line":1148},[551,18354,17464],{},[551,18356,18357],{"class":553,"line":1154},[551,18358,18359],{},"        seccion = 1.5;\n",[551,18361,18362],{"class":553,"line":1160},[551,18363,15907],{},[551,18365,18366],{"class":553,"line":1166},[551,18367,17478],{},[551,18369,18370],{"class":553,"line":1172},[551,18371,18372],{},"        seccion = 2.5;\n",[551,18374,18375],{"class":553,"line":1178},[551,18376,15907],{},[551,18378,18379],{"class":553,"line":1184},[551,18380,17492],{},[551,18382,18383],{"class":553,"line":1190},[551,18384,18385],{},"        seccion = 4.0;\n",[551,18387,18388],{"class":553,"line":1472},[551,18389,15907],{},[551,18391,18392],{"class":553,"line":1477},[551,18393,17506],{},[551,18395,18396],{"class":553,"line":1797},[551,18397,18398],{},"        seccion = 6.0;\n",[551,18400,18401],{"class":553,"line":1802},[551,18402,15907],{},[551,18404,18405],{"class":553,"line":1808},[551,18406,15926],{},[551,18408,18409],{"class":553,"line":1814},[551,18410,18411],{},"        MessageBox.Show(\"Corriente no estándar. Requiere cálculo manual.\");\n",[551,18413,18414],{"class":553,"line":1820},[551,18415,18416],{},"        return;  \u002F\u002F Sale del método\n",[551,18418,18419],{"class":553,"line":1826},[551,18420,1193],{},[551,18422,18423],{"class":553,"line":1832},[551,18424,1139],{"emptyLinePlaceholder":238},[551,18426,18427],{"class":553,"line":1838},[551,18428,18429],{},"MessageBox.Show(string.Format(\"Sección: {0}mm²\", seccion));\n",[43,18431],{},[331,18433,18435],{"id":18434},"_7-switch-vs-ifelse-if-cuándo-usar-cada-uno","7. Switch vs if\u002Felse if - ¿Cuándo usar cada uno?",[367,18437,18439],{"id":18438},"_71-usa-switch-cuando","7.1 Usa switch cuando:",[13,18441,18442],{},[16,18443,18444],{},"Comparas una variable contra valores específicos constantes",[543,18446,18448],{"className":545,"code":18447,"language":547,"meta":228,"style":228},"\u002F\u002F Perfecto para switch\nswitch (codigoArticulo)\n{\n    case \"3RT2026\":\n        descripcion = \"Contactor 25A\";\n        break;\n    case \"3RT2036\":\n        descripcion = \"Contactor 40A\";\n        break;\n    \u002F\u002F ... más casos\n}\n",[54,18449,18450,18455,18460,18464,18469,18474,18478,18483,18488,18492,18497],{"__ignoreMap":228},[551,18451,18452],{"class":553,"line":554},[551,18453,18454],{},"\u002F\u002F Perfecto para switch\n",[551,18456,18457],{"class":553,"line":229},[551,18458,18459],{},"switch (codigoArticulo)\n",[551,18461,18462],{"class":553,"line":670},[551,18463,1151],{},[551,18465,18466],{"class":553,"line":1136},[551,18467,18468],{},"    case \"3RT2026\":\n",[551,18470,18471],{"class":553,"line":1142},[551,18472,18473],{},"        descripcion = \"Contactor 25A\";\n",[551,18475,18476],{"class":553,"line":1148},[551,18477,15907],{},[551,18479,18480],{"class":553,"line":1154},[551,18481,18482],{},"    case \"3RT2036\":\n",[551,18484,18485],{"class":553,"line":1160},[551,18486,18487],{},"        descripcion = \"Contactor 40A\";\n",[551,18489,18490],{"class":553,"line":1166},[551,18491,15907],{},[551,18493,18494],{"class":553,"line":1172},[551,18495,18496],{},"    \u002F\u002F ... más casos\n",[551,18498,18499],{"class":553,"line":1178},[551,18500,1193],{},[13,18502,18503],{},[16,18504,18505],{},"Tienes muchas opciones (>3-4)",[13,18507,18508],{},"Con 10+ opciones, switch es mucho más legible.",[13,18510,18511,18514],{},[16,18512,18513],{},"Los valores son discretos"," (no rangos)",[543,18516,18518],{"className":545,"code":18517,"language":547,"meta":228,"style":228},"\u002F\u002F Bien con switch\nswitch (numeroPolo)\n{\n    case 1: \u002F\u002F ...\n    case 2: \u002F\u002F ...\n    case 3: \u002F\u002F ...\n    case 4: \u002F\u002F ...\n}\n",[54,18519,18520,18525,18530,18534,18539,18544,18549,18554],{"__ignoreMap":228},[551,18521,18522],{"class":553,"line":554},[551,18523,18524],{},"\u002F\u002F Bien con switch\n",[551,18526,18527],{"class":553,"line":229},[551,18528,18529],{},"switch (numeroPolo)\n",[551,18531,18532],{"class":553,"line":670},[551,18533,1151],{},[551,18535,18536],{"class":553,"line":1136},[551,18537,18538],{},"    case 1: \u002F\u002F ...\n",[551,18540,18541],{"class":553,"line":1142},[551,18542,18543],{},"    case 2: \u002F\u002F ...\n",[551,18545,18546],{"class":553,"line":1148},[551,18547,18548],{},"    case 3: \u002F\u002F ...\n",[551,18550,18551],{"class":553,"line":1154},[551,18552,18553],{},"    case 4: \u002F\u002F ...\n",[551,18555,18556],{"class":553,"line":1160},[551,18557,1193],{},[367,18559,18561],{"id":18560},"_72-usa-ifelse-if-cuando","7.2 Usa if\u002Felse if cuando:",[13,18563,18564],{},[16,18565,18566],{},"Necesitas comparar rangos",[543,18568,18570],{"className":545,"code":18569,"language":547,"meta":228,"style":228},"\u002F\u002F NO puedes hacer esto con switch\nif (corriente \u003C= 16.0)\n{\n    seccion = 2.5;\n}\nelse if (corriente \u003C= 25.0)\n{\n    seccion = 6.0;\n}\n",[54,18571,18572,18577,18581,18585,18590,18594,18598,18602,18607],{"__ignoreMap":228},[551,18573,18574],{"class":553,"line":554},[551,18575,18576],{},"\u002F\u002F NO puedes hacer esto con switch\n",[551,18578,18579],{"class":553,"line":229},[551,18580,11679],{},[551,18582,18583],{"class":553,"line":670},[551,18584,1151],{},[551,18586,18587],{"class":553,"line":1136},[551,18588,18589],{},"    seccion = 2.5;\n",[551,18591,18592],{"class":553,"line":1142},[551,18593,1193],{},[551,18595,18596],{"class":553,"line":1148},[551,18597,11715],{},[551,18599,18600],{"class":553,"line":1154},[551,18601,1151],{},[551,18603,18604],{"class":553,"line":1160},[551,18605,18606],{},"    seccion = 6.0;\n",[551,18608,18609],{"class":553,"line":1166},[551,18610,1193],{},[13,18612,18613],{},[16,18614,18615],{},"Comparas con double o float",[543,18617,18619],{"className":545,"code":18618,"language":547,"meta":228,"style":228},"\u002F\u002F switch NO funciona con double\ndouble voltaje = 230.5;\n\nif (voltaje >= 207.0 && voltaje \u003C= 253.0)\n{\n    \u002F\u002F OK\n}\n",[54,18620,18621,18626,18630,18634,18638,18642,18647],{"__ignoreMap":228},[551,18622,18623],{"class":553,"line":554},[551,18624,18625],{},"\u002F\u002F switch NO funciona con double\n",[551,18627,18628],{"class":553,"line":229},[551,18629,2698],{},[551,18631,18632],{"class":553,"line":670},[551,18633,1139],{"emptyLinePlaceholder":238},[551,18635,18636],{"class":553,"line":1136},[551,18637,12005],{},[551,18639,18640],{"class":553,"line":1142},[551,18641,1151],{},[551,18643,18644],{"class":553,"line":1148},[551,18645,18646],{},"    \u002F\u002F OK\n",[551,18648,18649],{"class":553,"line":1154},[551,18650,1193],{},[13,18652,18653],{},[16,18654,18655],{},"Necesitas condiciones complejas",[543,18657,18659],{"className":545,"code":18658,"language":547,"meta":228,"style":228},"\u002F\u002F Condición compleja - usa if\nif (corriente > limite && temperatura \u003C 40 && !alertaActiva)\n{\n    \u002F\u002F ...\n}\n",[54,18660,18661,18666,18671,18675,18679],{"__ignoreMap":228},[551,18662,18663],{"class":553,"line":554},[551,18664,18665],{},"\u002F\u002F Condición compleja - usa if\n",[551,18667,18668],{"class":553,"line":229},[551,18669,18670],{},"if (corriente > limite && temperatura \u003C 40 && !alertaActiva)\n",[551,18672,18673],{"class":553,"line":670},[551,18674,1151],{},[551,18676,18677],{"class":553,"line":1136},[551,18678,16123],{},[551,18680,18681],{"class":553,"line":1142},[551,18682,1193],{},[13,18684,18685],{},[16,18686,18687],{},"Comparas diferentes variables en cada condición",[543,18689,18691],{"className":545,"code":18690,"language":547,"meta":228,"style":228},"\u002F\u002F Cada condición evalúa variables diferentes - usa if\nif (voltaje > 253)\n{\n    \u002F\u002F ...\n}\nelse if (corriente > 16)\n{\n    \u002F\u002F ...\n}\nelse if (temperatura > 50)\n{\n    \u002F\u002F ...\n}\n",[54,18692,18693,18698,18703,18707,18711,18715,18720,18724,18728,18732,18737,18741,18745],{"__ignoreMap":228},[551,18694,18695],{"class":553,"line":554},[551,18696,18697],{},"\u002F\u002F Cada condición evalúa variables diferentes - usa if\n",[551,18699,18700],{"class":553,"line":229},[551,18701,18702],{},"if (voltaje > 253)\n",[551,18704,18705],{"class":553,"line":670},[551,18706,1151],{},[551,18708,18709],{"class":553,"line":1136},[551,18710,16123],{},[551,18712,18713],{"class":553,"line":1142},[551,18714,1193],{},[551,18716,18717],{"class":553,"line":1148},[551,18718,18719],{},"else if (corriente > 16)\n",[551,18721,18722],{"class":553,"line":1154},[551,18723,1151],{},[551,18725,18726],{"class":553,"line":1160},[551,18727,16123],{},[551,18729,18730],{"class":553,"line":1166},[551,18731,1193],{},[551,18733,18734],{"class":553,"line":1172},[551,18735,18736],{},"else if (temperatura > 50)\n",[551,18738,18739],{"class":553,"line":1178},[551,18740,1151],{},[551,18742,18743],{"class":553,"line":1184},[551,18744,16123],{},[551,18746,18747],{"class":553,"line":1190},[551,18748,1193],{},[367,18750,18752],{"id":18751},"_73-tabla-comparativa","7.3 Tabla comparativa",[6589,18754,18755,18767],{},[6592,18756,18757],{},[6595,18758,18759,18762,18764],{},[6598,18760,18761],{},"Criterio",[6598,18763,15811],{},[6598,18765,18766],{},"if\u002Felse if",[6611,18768,18769,18780,18791,18802,18811,18820],{},[6595,18770,18771,18774,18777],{},[6616,18772,18773],{},"Tipo de variable",[6616,18775,18776],{},"int, string, char, enum, bool",[6616,18778,18779],{},"Cualquier tipo",[6595,18781,18782,18785,18788],{},[6616,18783,18784],{},"Rangos",[6616,18786,18787],{},"No",[6616,18789,18790],{},"Sí",[6595,18792,18793,18796,18799],{},[6616,18794,18795],{},"Valores exactos",[6616,18797,18798],{},"Ideal",[6616,18800,18801],{},"Funciona",[6595,18803,18804,18807,18809],{},[6616,18805,18806],{},"Múltiples variables",[6616,18808,18787],{},[6616,18810,18790],{},[6595,18812,18813,18816,18818],{},[6616,18814,18815],{},"Condiciones complejas",[6616,18817,18787],{},[6616,18819,18790],{},[6595,18821,18822,18825,18827],{},[6616,18823,18824],{},"Legibilidad (muchas opciones)",[6616,18826,12328],{},[6616,18828,18829],{},"Se complica",[43,18831],{},[331,18833,18835],{"id":18834},"_8-switch-con-expresiones-c-80","8. Switch con expresiones (C# 8.0+)",[13,18837,18838,18839,18842],{},"EPLAN 2026 soporta C# moderno, así que puedes usar ",[16,18840,18841],{},"switch expressions"," (sintaxis más compacta):",[367,18844,18846],{"id":18845},"_81-sintaxis-tradicional-vs-expression","8.1 Sintaxis tradicional vs expression",[13,18848,18849,416],{},[16,18850,18851],{},"Tradicional",[543,18853,18855],{"className":545,"code":18854,"language":547,"meta":228,"style":228},"string tipoCarga = \"Motor\";\nstring curva;\n\nswitch (tipoCarga)\n{\n    case \"Motor\":\n        curva = \"D\";\n        break;\n    case \"Iluminacion\":\n        curva = \"B\";\n        break;\n    default:\n        curva = \"C\";\n        break;\n}\n",[54,18856,18857,18861,18865,18869,18873,18877,18881,18885,18889,18893,18897,18901,18905,18909,18913],{"__ignoreMap":228},[551,18858,18859],{"class":553,"line":554},[551,18860,17076],{},[551,18862,18863],{"class":553,"line":229},[551,18864,17081],{},[551,18866,18867],{"class":553,"line":670},[551,18868,1139],{"emptyLinePlaceholder":238},[551,18870,18871],{"class":553,"line":1136},[551,18872,15888],{},[551,18874,18875],{"class":553,"line":1142},[551,18876,1151],{},[551,18878,18879],{"class":553,"line":1148},[551,18880,15897],{},[551,18882,18883],{"class":553,"line":1154},[551,18884,15902],{},[551,18886,18887],{"class":553,"line":1160},[551,18888,15907],{},[551,18890,18891],{"class":553,"line":1166},[551,18892,15912],{},[551,18894,18895],{"class":553,"line":1172},[551,18896,15917],{},[551,18898,18899],{"class":553,"line":1178},[551,18900,15907],{},[551,18902,18903],{"class":553,"line":1184},[551,18904,15926],{},[551,18906,18907],{"class":553,"line":1190},[551,18908,15931],{},[551,18910,18911],{"class":553,"line":1472},[551,18912,15907],{},[551,18914,18915],{"class":553,"line":1477},[551,18916,1193],{},[13,18918,18919,18922],{},[16,18920,18921],{},"Switch expression"," (más compacto):",[543,18924,18926],{"className":545,"code":18925,"language":547,"meta":228,"style":228},"string tipoCarga = \"Motor\";\n\nstring curva = tipoCarga switch\n{\n    \"Motor\" => \"D\",\n    \"Iluminacion\" => \"B\",\n    _ => \"C\"  \u002F\u002F _ es el default\n};\n",[54,18927,18928,18932,18936,18941,18945,18950,18955,18960],{"__ignoreMap":228},[551,18929,18930],{"class":553,"line":554},[551,18931,17076],{},[551,18933,18934],{"class":553,"line":229},[551,18935,1139],{"emptyLinePlaceholder":238},[551,18937,18938],{"class":553,"line":670},[551,18939,18940],{},"string curva = tipoCarga switch\n",[551,18942,18943],{"class":553,"line":1136},[551,18944,1151],{},[551,18946,18947],{"class":553,"line":1142},[551,18948,18949],{},"    \"Motor\" => \"D\",\n",[551,18951,18952],{"class":553,"line":1148},[551,18953,18954],{},"    \"Iluminacion\" => \"B\",\n",[551,18956,18957],{"class":553,"line":1154},[551,18958,18959],{},"    _ => \"C\"  \u002F\u002F _ es el default\n",[551,18961,18962],{"class":553,"line":1160},[551,18963,18964],{},"};\n",[367,18966,18968],{"id":18967},"_82-ejemplo-práctico-con-switch-expression","8.2 Ejemplo práctico con switch expression",[543,18970,18972],{"className":545,"code":18971,"language":547,"meta":228,"style":228},"int corriente = 20;\n\ndouble seccion = corriente switch\n{\n    10 => 1.5,\n    16 => 2.5,\n    20 => 4.0,\n    25 => 6.0,\n    32 => 10.0,\n    _ => 16.0\n};\n\nMessageBox.Show(string.Format(\"{0}A → {1}mm²\", corriente, seccion));\n",[54,18973,18974,18979,18983,18988,18992,18997,19002,19007,19012,19017,19022,19026,19030],{"__ignoreMap":228},[551,18975,18976],{"class":553,"line":554},[551,18977,18978],{},"int corriente = 20;\n",[551,18980,18981],{"class":553,"line":229},[551,18982,1139],{"emptyLinePlaceholder":238},[551,18984,18985],{"class":553,"line":670},[551,18986,18987],{},"double seccion = corriente switch\n",[551,18989,18990],{"class":553,"line":1136},[551,18991,1151],{},[551,18993,18994],{"class":553,"line":1142},[551,18995,18996],{},"    10 => 1.5,\n",[551,18998,18999],{"class":553,"line":1148},[551,19000,19001],{},"    16 => 2.5,\n",[551,19003,19004],{"class":553,"line":1154},[551,19005,19006],{},"    20 => 4.0,\n",[551,19008,19009],{"class":553,"line":1160},[551,19010,19011],{},"    25 => 6.0,\n",[551,19013,19014],{"class":553,"line":1166},[551,19015,19016],{},"    32 => 10.0,\n",[551,19018,19019],{"class":553,"line":1172},[551,19020,19021],{},"    _ => 16.0\n",[551,19023,19024],{"class":553,"line":1178},[551,19025,18964],{},[551,19027,19028],{"class":553,"line":1184},[551,19029,1139],{"emptyLinePlaceholder":238},[551,19031,19032],{"class":553,"line":1190},[551,19033,19034],{},"MessageBox.Show(string.Format(\"{0}A → {1}mm²\", corriente, seccion));\n",[13,19036,19037,416],{},[16,19038,931],{},[126,19040,19041,19044,19047],{},[88,19042,19043],{},"Más conciso",[88,19045,19046],{},"Directamente asigna el resultado",[88,19048,19049],{},"Menos líneas de código",[13,19051,19052,416],{},[16,19053,19054],{},"Cuándo usarlo",[126,19056,19057,19060,19063],{},[88,19058,19059],{},"Asignaciones simples",[88,19061,19062],{},"No necesitas múltiples líneas de código por caso",[88,19064,19065],{},"Cuando mejora la legibilidad",[13,19067,19068,416],{},[16,19069,19070],{},"Cuándo NO usarlo",[126,19072,19073,19076,19079],{},[88,19074,19075],{},"Cada caso requiere múltiples líneas",[88,19077,19078],{},"Lógica compleja dentro de cada caso",[88,19080,19081],{},"Cuando reduce la claridad",[43,19083],{},[46,19085,4025],{"id":4024},[13,19087,7975,19088,19090],{},[16,19089,16857],{}," que identifica productos por código.",[331,19092,4032],{"id":4031},[543,19094,19096],{"className":545,"code":19095,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class ConfiguradorComponentes\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F CÓDIGO DE ARTÍCULO A CONSULTAR\n        \u002F\u002F ========================================\n\n        string codigoArticulo = \"3RT2026-1BB40\";\n\n        \u002F\u002F Variables para almacenar información\n        string tipoComponente;\n        string fabricante;\n        string descripcionCorta;\n        string descripcionLarga;\n        string especificacionesTecnicas;\n    }\n}\n",[54,19097,19098,19102,19106,19110,19114,19119,19123,19127,19131,19135,19139,19144,19148,19152,19157,19161,19166,19171,19176,19181,19186,19191,19195],{"__ignoreMap":228},[551,19099,19100],{"class":553,"line":554},[551,19101,1123],{},[551,19103,19104],{"class":553,"line":229},[551,19105,1128],{},[551,19107,19108],{"class":553,"line":670},[551,19109,1133],{},[551,19111,19112],{"class":553,"line":1136},[551,19113,1139],{"emptyLinePlaceholder":238},[551,19115,19116],{"class":553,"line":1142},[551,19117,19118],{},"public class ConfiguradorComponentes\n",[551,19120,19121],{"class":553,"line":1148},[551,19122,1151],{},[551,19124,19125],{"class":553,"line":1154},[551,19126,1157],{},[551,19128,19129],{"class":553,"line":1160},[551,19130,1163],{},[551,19132,19133],{"class":553,"line":1166},[551,19134,1169],{},[551,19136,19137],{"class":553,"line":1172},[551,19138,4511],{},[551,19140,19141],{"class":553,"line":1178},[551,19142,19143],{},"        \u002F\u002F CÓDIGO DE ARTÍCULO A CONSULTAR\n",[551,19145,19146],{"class":553,"line":1184},[551,19147,4511],{},[551,19149,19150],{"class":553,"line":1190},[551,19151,1139],{"emptyLinePlaceholder":238},[551,19153,19154],{"class":553,"line":1472},[551,19155,19156],{},"        string codigoArticulo = \"3RT2026-1BB40\";\n",[551,19158,19159],{"class":553,"line":1477},[551,19160,1139],{"emptyLinePlaceholder":238},[551,19162,19163],{"class":553,"line":1797},[551,19164,19165],{},"        \u002F\u002F Variables para almacenar información\n",[551,19167,19168],{"class":553,"line":1802},[551,19169,19170],{},"        string tipoComponente;\n",[551,19172,19173],{"class":553,"line":1808},[551,19174,19175],{},"        string fabricante;\n",[551,19177,19178],{"class":553,"line":1814},[551,19179,19180],{},"        string descripcionCorta;\n",[551,19182,19183],{"class":553,"line":1820},[551,19184,19185],{},"        string descripcionLarga;\n",[551,19187,19188],{"class":553,"line":1826},[551,19189,19190],{},"        string especificacionesTecnicas;\n",[551,19192,19193],{"class":553,"line":1832},[551,19194,1187],{},[551,19196,19197],{"class":553,"line":1838},[551,19198,1193],{},[43,19200],{},[331,19202,19204],{"id":19203},"paso-2-identificar-fabricante-por-prefijo","Paso 2: Identificar fabricante por prefijo",[543,19206,19208],{"className":545,"code":19207,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 1: IDENTIFICAR FABRICANTE\n\u002F\u002F ========================================\n\nstring prefijo = codigoArticulo.Substring(0, 3);  \u002F\u002F Primeros 3 caracteres\n\nswitch (prefijo)\n{\n    case \"3RT\":\n    case \"3RV\":\n    case \"3RA\":\n    case \"3RU\":\n        fabricante = \"Siemens\";\n        break;\n    case \"LC1\":\n    case \"LR2\":\n    case \"GV2\":\n    case \"GV3\":\n        fabricante = \"Schneider Electric\";\n        break;\n    case \"AF0\":\n    case \"AF1\":\n    case \"AF2\":\n    case \"AX0\":\n        fabricante = \"ABB\";\n        break;\n    case \"DIL\":\n    case \"PKZ\":\n    case \"NZM\":\n        fabricante = \"Eaton \u002F Moeller\";\n        break;\n    default:\n        fabricante = \"Fabricante no identificado\";\n        break;\n}\n",[54,19209,19210,19214,19219,19223,19227,19232,19236,19241,19245,19250,19255,19260,19265,19270,19274,19279,19284,19289,19294,19299,19303,19308,19313,19318,19323,19328,19332,19337,19342,19347,19352,19356,19360,19365,19369],{"__ignoreMap":228},[551,19211,19212],{"class":553,"line":554},[551,19213,8157],{},[551,19215,19216],{"class":553,"line":229},[551,19217,19218],{},"\u002F\u002F PASO 1: IDENTIFICAR FABRICANTE\n",[551,19220,19221],{"class":553,"line":670},[551,19222,8157],{},[551,19224,19225],{"class":553,"line":1136},[551,19226,1139],{"emptyLinePlaceholder":238},[551,19228,19229],{"class":553,"line":1142},[551,19230,19231],{},"string prefijo = codigoArticulo.Substring(0, 3);  \u002F\u002F Primeros 3 caracteres\n",[551,19233,19234],{"class":553,"line":1148},[551,19235,1139],{"emptyLinePlaceholder":238},[551,19237,19238],{"class":553,"line":1154},[551,19239,19240],{},"switch (prefijo)\n",[551,19242,19243],{"class":553,"line":1160},[551,19244,1151],{},[551,19246,19247],{"class":553,"line":1166},[551,19248,19249],{},"    case \"3RT\":\n",[551,19251,19252],{"class":553,"line":1172},[551,19253,19254],{},"    case \"3RV\":\n",[551,19256,19257],{"class":553,"line":1178},[551,19258,19259],{},"    case \"3RA\":\n",[551,19261,19262],{"class":553,"line":1184},[551,19263,19264],{},"    case \"3RU\":\n",[551,19266,19267],{"class":553,"line":1190},[551,19268,19269],{},"        fabricante = \"Siemens\";\n",[551,19271,19272],{"class":553,"line":1472},[551,19273,15907],{},[551,19275,19276],{"class":553,"line":1477},[551,19277,19278],{},"    case \"LC1\":\n",[551,19280,19281],{"class":553,"line":1797},[551,19282,19283],{},"    case \"LR2\":\n",[551,19285,19286],{"class":553,"line":1802},[551,19287,19288],{},"    case \"GV2\":\n",[551,19290,19291],{"class":553,"line":1808},[551,19292,19293],{},"    case \"GV3\":\n",[551,19295,19296],{"class":553,"line":1814},[551,19297,19298],{},"        fabricante = \"Schneider Electric\";\n",[551,19300,19301],{"class":553,"line":1820},[551,19302,15907],{},[551,19304,19305],{"class":553,"line":1826},[551,19306,19307],{},"    case \"AF0\":\n",[551,19309,19310],{"class":553,"line":1832},[551,19311,19312],{},"    case \"AF1\":\n",[551,19314,19315],{"class":553,"line":1838},[551,19316,19317],{},"    case \"AF2\":\n",[551,19319,19320],{"class":553,"line":1844},[551,19321,19322],{},"    case \"AX0\":\n",[551,19324,19325],{"class":553,"line":1850},[551,19326,19327],{},"        fabricante = \"ABB\";\n",[551,19329,19330],{"class":553,"line":1855},[551,19331,15907],{},[551,19333,19334],{"class":553,"line":1861},[551,19335,19336],{},"    case \"DIL\":\n",[551,19338,19339],{"class":553,"line":1867},[551,19340,19341],{},"    case \"PKZ\":\n",[551,19343,19344],{"class":553,"line":1873},[551,19345,19346],{},"    case \"NZM\":\n",[551,19348,19349],{"class":553,"line":1878},[551,19350,19351],{},"        fabricante = \"Eaton \u002F Moeller\";\n",[551,19353,19354],{"class":553,"line":1883},[551,19355,15907],{},[551,19357,19358],{"class":553,"line":1888},[551,19359,15926],{},[551,19361,19362],{"class":553,"line":4615},[551,19363,19364],{},"        fabricante = \"Fabricante no identificado\";\n",[551,19366,19367],{"class":553,"line":4620},[551,19368,15907],{},[551,19370,19371],{"class":553,"line":4626},[551,19372,1193],{},[13,19374,19375,19377],{},[16,19376,4153],{},"\nIdentificamos el fabricante analizando los primeros 3 caracteres del código de artículo. Diferentes fabricantes usan diferentes prefijos.",[43,19379],{},[331,19381,19383],{"id":19382},"paso-3-identificar-tipo-de-componente","Paso 3: Identificar tipo de componente",[543,19385,19387],{"className":545,"code":19386,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 2: IDENTIFICAR TIPO DE COMPONENTE\n\u002F\u002F ========================================\n\nswitch (prefijo)\n{\n    case \"3RT\":\n    case \"LC1\":\n    case \"AF0\":\n    case \"AF1\":\n    case \"AF2\":\n    case \"DIL\":\n        tipoComponente = \"Contactor\";\n        break;\n    case \"3RV\":\n    case \"PKZ\":\n        tipoComponente = \"Guardamotor\";\n        break;\n    case \"3RA\":\n    case \"LR2\":\n    case \"AX0\":\n        tipoComponente = \"Relé térmico\";\n        break;\n    case \"3RU\":\n        tipoComponente = \"Relé de sobrecarga\";\n        break;\n    case \"GV2\":\n    case \"GV3\":\n        tipoComponente = \"Disyuntor motor\";\n        break;\n    case \"NZM\":\n        tipoComponente = \"Interruptor automático caja moldeada\";\n        break;\n    default:\n        tipoComponente = \"Componente no identificado\";\n        break;\n}\n",[54,19388,19389,19393,19398,19402,19406,19410,19414,19418,19422,19426,19430,19434,19438,19443,19447,19451,19455,19460,19464,19468,19472,19476,19481,19485,19489,19494,19498,19502,19506,19511,19515,19519,19524,19528,19532,19537,19541],{"__ignoreMap":228},[551,19390,19391],{"class":553,"line":554},[551,19392,8157],{},[551,19394,19395],{"class":553,"line":229},[551,19396,19397],{},"\u002F\u002F PASO 2: IDENTIFICAR TIPO DE COMPONENTE\n",[551,19399,19400],{"class":553,"line":670},[551,19401,8157],{},[551,19403,19404],{"class":553,"line":1136},[551,19405,1139],{"emptyLinePlaceholder":238},[551,19407,19408],{"class":553,"line":1142},[551,19409,19240],{},[551,19411,19412],{"class":553,"line":1148},[551,19413,1151],{},[551,19415,19416],{"class":553,"line":1154},[551,19417,19249],{},[551,19419,19420],{"class":553,"line":1160},[551,19421,19278],{},[551,19423,19424],{"class":553,"line":1166},[551,19425,19307],{},[551,19427,19428],{"class":553,"line":1172},[551,19429,19312],{},[551,19431,19432],{"class":553,"line":1178},[551,19433,19317],{},[551,19435,19436],{"class":553,"line":1184},[551,19437,19336],{},[551,19439,19440],{"class":553,"line":1190},[551,19441,19442],{},"        tipoComponente = \"Contactor\";\n",[551,19444,19445],{"class":553,"line":1472},[551,19446,15907],{},[551,19448,19449],{"class":553,"line":1477},[551,19450,19254],{},[551,19452,19453],{"class":553,"line":1797},[551,19454,19341],{},[551,19456,19457],{"class":553,"line":1802},[551,19458,19459],{},"        tipoComponente = \"Guardamotor\";\n",[551,19461,19462],{"class":553,"line":1808},[551,19463,15907],{},[551,19465,19466],{"class":553,"line":1814},[551,19467,19259],{},[551,19469,19470],{"class":553,"line":1820},[551,19471,19283],{},[551,19473,19474],{"class":553,"line":1826},[551,19475,19322],{},[551,19477,19478],{"class":553,"line":1832},[551,19479,19480],{},"        tipoComponente = \"Relé térmico\";\n",[551,19482,19483],{"class":553,"line":1838},[551,19484,15907],{},[551,19486,19487],{"class":553,"line":1844},[551,19488,19264],{},[551,19490,19491],{"class":553,"line":1850},[551,19492,19493],{},"        tipoComponente = \"Relé de sobrecarga\";\n",[551,19495,19496],{"class":553,"line":1855},[551,19497,15907],{},[551,19499,19500],{"class":553,"line":1861},[551,19501,19288],{},[551,19503,19504],{"class":553,"line":1867},[551,19505,19293],{},[551,19507,19508],{"class":553,"line":1873},[551,19509,19510],{},"        tipoComponente = \"Disyuntor motor\";\n",[551,19512,19513],{"class":553,"line":1878},[551,19514,15907],{},[551,19516,19517],{"class":553,"line":1883},[551,19518,19346],{},[551,19520,19521],{"class":553,"line":1888},[551,19522,19523],{},"        tipoComponente = \"Interruptor automático caja moldeada\";\n",[551,19525,19526],{"class":553,"line":4615},[551,19527,15907],{},[551,19529,19530],{"class":553,"line":4620},[551,19531,15926],{},[551,19533,19534],{"class":553,"line":4626},[551,19535,19536],{},"        tipoComponente = \"Componente no identificado\";\n",[551,19538,19539],{"class":553,"line":4631},[551,19540,15907],{},[551,19542,19543],{"class":553,"line":4636},[551,19544,1193],{},[43,19546],{},[331,19548,19550],{"id":19549},"paso-4-obtener-especificaciones-según-código-completo","Paso 4: Obtener especificaciones según código completo",[543,19552,19554],{"className":545,"code":19553,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 3: ESPECIFICACIONES POR CÓDIGO\n\u002F\u002F ========================================\n\nswitch (codigoArticulo)\n{\n    \u002F\u002F Contactores Siemens 3RT20\n    case \"3RT2026-1BB40\":\n        descripcionCorta = \"Contactor 3P 25A AC3\";\n        descripcionLarga = \"Contactor tripolar, corriente nominal 25A en AC3, \" +\n                          \"bobina 24V DC, 1NA+1NC auxiliar\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 25A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 24V DC\\n\" +\n            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n            \"- Poder de corte: 18.5kW @ 400V\\n\" +\n            \"- Categoría: AC3 (motores)\";\n        break;\n\n    case \"3RT2036-1BB40\":\n        descripcionCorta = \"Contactor 3P 40A AC3\";\n        descripcionLarga = \"Contactor tripolar, corriente nominal 40A en AC3, \" +\n                          \"bobina 24V DC, 1NA+1NC auxiliar\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 40A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 24V DC\\n\" +\n            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n            \"- Poder de corte: 22kW @ 400V\\n\" +\n            \"- Categoría: AC3 (motores)\";\n        break;\n\n    case \"3RT2046-1BB40\":\n        descripcionCorta = \"Contactor 3P 65A AC3\";\n        descripcionLarga = \"Contactor tripolar, corriente nominal 65A en AC3, \" +\n                          \"bobina 24V DC, 1NA+1NC auxiliar\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 65A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 24V DC\\n\" +\n            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n            \"- Poder de corte: 37kW @ 400V\\n\" +\n            \"- Categoría: AC3 (motores)\";\n        break;\n\n    \u002F\u002F Guardamotores Siemens 3RV20\n    case \"3RV2011-1JA10\":\n        descripcionCorta = \"Guardamotor 3.5-5A\";\n        descripcionLarga = \"Guardamotor ajustable, rango 3.5-5A, \" +\n                          \"disparo magnético 65A\";\n        especificacionesTecnicas =\n            \"- Rango ajuste: 3.5-5A\\n\" +\n            \"- Disparo magnético: 65A\\n\" +\n            \"- Poder de corte: 100kA @ 400V\\n\" +\n            \"- Clase disparo: Clase 10\\n\" +\n            \"- Contactos auxiliares: 1NA+1NC\";\n        break;\n\n    case \"3RV2021-4BA10\":\n        descripcionCorta = \"Guardamotor 18-25A\";\n        descripcionLarga = \"Guardamotor ajustable, rango 18-25A, \" +\n                          \"disparo magnético 325A\";\n        especificacionesTecnicas =\n            \"- Rango ajuste: 18-25A\\n\" +\n            \"- Disparo magnético: 325A\\n\" +\n            \"- Poder de corte: 100kA @ 400V\\n\" +\n            \"- Clase disparo: Clase 10\\n\" +\n            \"- Contactos auxiliares: 1NA+1NC\";\n        break;\n\n    \u002F\u002F Contactores Schneider LC1D\n    case \"LC1D09BD\":\n        descripcionCorta = \"Contactor 3P 9A AC3\";\n        descripcionLarga = \"Contactor TeSys D, corriente nominal 9A en AC3, \" +\n                          \"bobina 24V DC\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 9A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 24V DC\\n\" +\n            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n            \"- Poder de corte: 4kW @ 400V\\n\" +\n            \"- Serie: TeSys D\";\n        break;\n\n    case \"LC1D18BD\":\n        descripcionCorta = \"Contactor 3P 18A AC3\";\n        descripcionLarga = \"Contactor TeSys D, corriente nominal 18A en AC3, \" +\n                          \"bobina 24V DC\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 18A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 24V DC\\n\" +\n            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n            \"- Poder de corte: 7.5kW @ 400V\\n\" +\n            \"- Serie: TeSys D\";\n        break;\n\n    \u002F\u002F Contactores ABB\n    case \"AF09-30-10-13\":\n        descripcionCorta = \"Contactor 3P 9A AC3\";\n        descripcionLarga = \"Contactor AF, corriente nominal 9A en AC3, \" +\n                          \"bobina 100-250V AC\u002FDC\";\n        especificacionesTecnicas =\n            \"- Corriente nominal: 9A (AC3)\\n\" +\n            \"- Polos principales: 3\\n\" +\n            \"- Bobina: 100-250V AC\u002FDC\\n\" +\n            \"- Contactos auxiliares: 1NA\\n\" +\n            \"- Poder de corte: 4kW @ 400V\\n\" +\n            \"- Serie: AF\";\n        break;\n\n    \u002F\u002F Caso default\n    default:\n        descripcionCorta = \"Código no encontrado en base de datos\";\n        descripcionLarga = string.Format(\n            \"El código '{0}' no está registrado en el configurador. \" +\n            \"Consulte catálogo del fabricante.\",\n            codigoArticulo\n        );\n        especificacionesTecnicas = \"No disponible\";\n        break;\n}\n",[54,19555,19556,19560,19565,19569,19573,19577,19581,19586,19591,19596,19601,19606,19611,19616,19621,19626,19631,19636,19641,19645,19649,19654,19659,19664,19668,19672,19677,19681,19685,19689,19694,19698,19702,19706,19711,19716,19721,19725,19729,19734,19738,19742,19746,19751,19755,19759,19763,19768,19773,19778,19783,19788,19792,19797,19802,19807,19812,19817,19821,19825,19830,19835,19840,19845,19849,19854,19859,19863,19867,19871,19875,19879,19884,19889,19894,19899,19904,19908,19913,19917,19921,19925,19930,19935,19939,19943,19948,19953,19958,19962,19966,19971,19975,19979,19983,19988,19992,19996,20000,20005,20010,20014,20019,20024,20028,20032,20036,20041,20046,20050,20055,20059,20063,20068,20072,20077,20082,20087,20092,20097,20101,20106,20110],{"__ignoreMap":228},[551,19557,19558],{"class":553,"line":554},[551,19559,8157],{},[551,19561,19562],{"class":553,"line":229},[551,19563,19564],{},"\u002F\u002F PASO 3: ESPECIFICACIONES POR CÓDIGO\n",[551,19566,19567],{"class":553,"line":670},[551,19568,8157],{},[551,19570,19571],{"class":553,"line":1136},[551,19572,1139],{"emptyLinePlaceholder":238},[551,19574,19575],{"class":553,"line":1142},[551,19576,18459],{},[551,19578,19579],{"class":553,"line":1148},[551,19580,1151],{},[551,19582,19583],{"class":553,"line":1154},[551,19584,19585],{},"    \u002F\u002F Contactores Siemens 3RT20\n",[551,19587,19588],{"class":553,"line":1160},[551,19589,19590],{},"    case \"3RT2026-1BB40\":\n",[551,19592,19593],{"class":553,"line":1166},[551,19594,19595],{},"        descripcionCorta = \"Contactor 3P 25A AC3\";\n",[551,19597,19598],{"class":553,"line":1172},[551,19599,19600],{},"        descripcionLarga = \"Contactor tripolar, corriente nominal 25A en AC3, \" +\n",[551,19602,19603],{"class":553,"line":1178},[551,19604,19605],{},"                          \"bobina 24V DC, 1NA+1NC auxiliar\";\n",[551,19607,19608],{"class":553,"line":1184},[551,19609,19610],{},"        especificacionesTecnicas =\n",[551,19612,19613],{"class":553,"line":1190},[551,19614,19615],{},"            \"- Corriente nominal: 25A (AC3)\\n\" +\n",[551,19617,19618],{"class":553,"line":1472},[551,19619,19620],{},"            \"- Polos principales: 3\\n\" +\n",[551,19622,19623],{"class":553,"line":1477},[551,19624,19625],{},"            \"- Bobina: 24V DC\\n\" +\n",[551,19627,19628],{"class":553,"line":1797},[551,19629,19630],{},"            \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n",[551,19632,19633],{"class":553,"line":1802},[551,19634,19635],{},"            \"- Poder de corte: 18.5kW @ 400V\\n\" +\n",[551,19637,19638],{"class":553,"line":1808},[551,19639,19640],{},"            \"- Categoría: AC3 (motores)\";\n",[551,19642,19643],{"class":553,"line":1814},[551,19644,15907],{},[551,19646,19647],{"class":553,"line":1820},[551,19648,1139],{"emptyLinePlaceholder":238},[551,19650,19651],{"class":553,"line":1826},[551,19652,19653],{},"    case \"3RT2036-1BB40\":\n",[551,19655,19656],{"class":553,"line":1832},[551,19657,19658],{},"        descripcionCorta = \"Contactor 3P 40A AC3\";\n",[551,19660,19661],{"class":553,"line":1838},[551,19662,19663],{},"        descripcionLarga = \"Contactor tripolar, corriente nominal 40A en AC3, \" +\n",[551,19665,19666],{"class":553,"line":1844},[551,19667,19605],{},[551,19669,19670],{"class":553,"line":1850},[551,19671,19610],{},[551,19673,19674],{"class":553,"line":1855},[551,19675,19676],{},"            \"- Corriente nominal: 40A (AC3)\\n\" +\n",[551,19678,19679],{"class":553,"line":1861},[551,19680,19620],{},[551,19682,19683],{"class":553,"line":1867},[551,19684,19625],{},[551,19686,19687],{"class":553,"line":1873},[551,19688,19630],{},[551,19690,19691],{"class":553,"line":1878},[551,19692,19693],{},"            \"- Poder de corte: 22kW @ 400V\\n\" +\n",[551,19695,19696],{"class":553,"line":1883},[551,19697,19640],{},[551,19699,19700],{"class":553,"line":1888},[551,19701,15907],{},[551,19703,19704],{"class":553,"line":4615},[551,19705,1139],{"emptyLinePlaceholder":238},[551,19707,19708],{"class":553,"line":4620},[551,19709,19710],{},"    case \"3RT2046-1BB40\":\n",[551,19712,19713],{"class":553,"line":4626},[551,19714,19715],{},"        descripcionCorta = \"Contactor 3P 65A AC3\";\n",[551,19717,19718],{"class":553,"line":4631},[551,19719,19720],{},"        descripcionLarga = \"Contactor tripolar, corriente nominal 65A en AC3, \" +\n",[551,19722,19723],{"class":553,"line":4636},[551,19724,19605],{},[551,19726,19727],{"class":553,"line":4641},[551,19728,19610],{},[551,19730,19731],{"class":553,"line":4647},[551,19732,19733],{},"            \"- Corriente nominal: 65A (AC3)\\n\" +\n",[551,19735,19736],{"class":553,"line":4653},[551,19737,19620],{},[551,19739,19740],{"class":553,"line":4659},[551,19741,19625],{},[551,19743,19744],{"class":553,"line":4665},[551,19745,19630],{},[551,19747,19748],{"class":553,"line":4671},[551,19749,19750],{},"            \"- Poder de corte: 37kW @ 400V\\n\" +\n",[551,19752,19753],{"class":553,"line":4677},[551,19754,19640],{},[551,19756,19757],{"class":553,"line":4683},[551,19758,15907],{},[551,19760,19761],{"class":553,"line":4689},[551,19762,1139],{"emptyLinePlaceholder":238},[551,19764,19765],{"class":553,"line":4695},[551,19766,19767],{},"    \u002F\u002F Guardamotores Siemens 3RV20\n",[551,19769,19770],{"class":553,"line":4701},[551,19771,19772],{},"    case \"3RV2011-1JA10\":\n",[551,19774,19775],{"class":553,"line":4707},[551,19776,19777],{},"        descripcionCorta = \"Guardamotor 3.5-5A\";\n",[551,19779,19780],{"class":553,"line":4713},[551,19781,19782],{},"        descripcionLarga = \"Guardamotor ajustable, rango 3.5-5A, \" +\n",[551,19784,19785],{"class":553,"line":4719},[551,19786,19787],{},"                          \"disparo magnético 65A\";\n",[551,19789,19790],{"class":553,"line":4725},[551,19791,19610],{},[551,19793,19794],{"class":553,"line":4731},[551,19795,19796],{},"            \"- Rango ajuste: 3.5-5A\\n\" +\n",[551,19798,19799],{"class":553,"line":4737},[551,19800,19801],{},"            \"- Disparo magnético: 65A\\n\" +\n",[551,19803,19804],{"class":553,"line":4743},[551,19805,19806],{},"            \"- Poder de corte: 100kA @ 400V\\n\" +\n",[551,19808,19809],{"class":553,"line":4749},[551,19810,19811],{},"            \"- Clase disparo: Clase 10\\n\" +\n",[551,19813,19814],{"class":553,"line":4755},[551,19815,19816],{},"            \"- Contactos auxiliares: 1NA+1NC\";\n",[551,19818,19819],{"class":553,"line":4761},[551,19820,15907],{},[551,19822,19823],{"class":553,"line":4766},[551,19824,1139],{"emptyLinePlaceholder":238},[551,19826,19827],{"class":553,"line":4771},[551,19828,19829],{},"    case \"3RV2021-4BA10\":\n",[551,19831,19832],{"class":553,"line":4777},[551,19833,19834],{},"        descripcionCorta = \"Guardamotor 18-25A\";\n",[551,19836,19837],{"class":553,"line":4782},[551,19838,19839],{},"        descripcionLarga = \"Guardamotor ajustable, rango 18-25A, \" +\n",[551,19841,19842],{"class":553,"line":4787},[551,19843,19844],{},"                          \"disparo magnético 325A\";\n",[551,19846,19847],{"class":553,"line":4793},[551,19848,19610],{},[551,19850,19851],{"class":553,"line":4799},[551,19852,19853],{},"            \"- Rango ajuste: 18-25A\\n\" +\n",[551,19855,19856],{"class":553,"line":4805},[551,19857,19858],{},"            \"- Disparo magnético: 325A\\n\" +\n",[551,19860,19861],{"class":553,"line":4811},[551,19862,19806],{},[551,19864,19865],{"class":553,"line":4817},[551,19866,19811],{},[551,19868,19869],{"class":553,"line":4822},[551,19870,19816],{},[551,19872,19873],{"class":553,"line":4827},[551,19874,15907],{},[551,19876,19877],{"class":553,"line":9183},[551,19878,1139],{"emptyLinePlaceholder":238},[551,19880,19881],{"class":553,"line":9188},[551,19882,19883],{},"    \u002F\u002F Contactores Schneider LC1D\n",[551,19885,19886],{"class":553,"line":9193},[551,19887,19888],{},"    case \"LC1D09BD\":\n",[551,19890,19891],{"class":553,"line":9198},[551,19892,19893],{},"        descripcionCorta = \"Contactor 3P 9A AC3\";\n",[551,19895,19896],{"class":553,"line":9204},[551,19897,19898],{},"        descripcionLarga = \"Contactor TeSys D, corriente nominal 9A en AC3, \" +\n",[551,19900,19901],{"class":553,"line":9209},[551,19902,19903],{},"                          \"bobina 24V DC\";\n",[551,19905,19906],{"class":553,"line":9214},[551,19907,19610],{},[551,19909,19910],{"class":553,"line":9219},[551,19911,19912],{},"            \"- Corriente nominal: 9A (AC3)\\n\" +\n",[551,19914,19915],{"class":553,"line":9224},[551,19916,19620],{},[551,19918,19919],{"class":553,"line":9230},[551,19920,19625],{},[551,19922,19923],{"class":553,"line":9236},[551,19924,19630],{},[551,19926,19927],{"class":553,"line":9242},[551,19928,19929],{},"            \"- Poder de corte: 4kW @ 400V\\n\" +\n",[551,19931,19932],{"class":553,"line":9247},[551,19933,19934],{},"            \"- Serie: TeSys D\";\n",[551,19936,19937],{"class":553,"line":9253},[551,19938,15907],{},[551,19940,19941],{"class":553,"line":9258},[551,19942,1139],{"emptyLinePlaceholder":238},[551,19944,19945],{"class":553,"line":9264},[551,19946,19947],{},"    case \"LC1D18BD\":\n",[551,19949,19950],{"class":553,"line":9270},[551,19951,19952],{},"        descripcionCorta = \"Contactor 3P 18A AC3\";\n",[551,19954,19955],{"class":553,"line":9275},[551,19956,19957],{},"        descripcionLarga = \"Contactor TeSys D, corriente nominal 18A en AC3, \" +\n",[551,19959,19960],{"class":553,"line":9281},[551,19961,19903],{},[551,19963,19964],{"class":553,"line":9287},[551,19965,19610],{},[551,19967,19968],{"class":553,"line":9292},[551,19969,19970],{},"            \"- Corriente nominal: 18A (AC3)\\n\" +\n",[551,19972,19973],{"class":553,"line":9297},[551,19974,19620],{},[551,19976,19977],{"class":553,"line":9302},[551,19978,19625],{},[551,19980,19981],{"class":553,"line":9308},[551,19982,19630],{},[551,19984,19985],{"class":553,"line":9313},[551,19986,19987],{},"            \"- Poder de corte: 7.5kW @ 400V\\n\" +\n",[551,19989,19990],{"class":553,"line":9318},[551,19991,19934],{},[551,19993,19994],{"class":553,"line":9323},[551,19995,15907],{},[551,19997,19998],{"class":553,"line":9328},[551,19999,1139],{"emptyLinePlaceholder":238},[551,20001,20002],{"class":553,"line":9334},[551,20003,20004],{},"    \u002F\u002F Contactores ABB\n",[551,20006,20007],{"class":553,"line":9339},[551,20008,20009],{},"    case \"AF09-30-10-13\":\n",[551,20011,20012],{"class":553,"line":9344},[551,20013,19893],{},[551,20015,20016],{"class":553,"line":9350},[551,20017,20018],{},"        descripcionLarga = \"Contactor AF, corriente nominal 9A en AC3, \" +\n",[551,20020,20021],{"class":553,"line":9355},[551,20022,20023],{},"                          \"bobina 100-250V AC\u002FDC\";\n",[551,20025,20026],{"class":553,"line":9361},[551,20027,19610],{},[551,20029,20030],{"class":553,"line":9367},[551,20031,19912],{},[551,20033,20034],{"class":553,"line":9372},[551,20035,19620],{},[551,20037,20038],{"class":553,"line":9378},[551,20039,20040],{},"            \"- Bobina: 100-250V AC\u002FDC\\n\" +\n",[551,20042,20043],{"class":553,"line":9384},[551,20044,20045],{},"            \"- Contactos auxiliares: 1NA\\n\" +\n",[551,20047,20048],{"class":553,"line":9389},[551,20049,19929],{},[551,20051,20052],{"class":553,"line":9394},[551,20053,20054],{},"            \"- Serie: AF\";\n",[551,20056,20057],{"class":553,"line":9399},[551,20058,15907],{},[551,20060,20061],{"class":553,"line":9405},[551,20062,1139],{"emptyLinePlaceholder":238},[551,20064,20065],{"class":553,"line":9410},[551,20066,20067],{},"    \u002F\u002F Caso default\n",[551,20069,20070],{"class":553,"line":9415},[551,20071,15926],{},[551,20073,20074],{"class":553,"line":9420},[551,20075,20076],{},"        descripcionCorta = \"Código no encontrado en base de datos\";\n",[551,20078,20079],{"class":553,"line":9425},[551,20080,20081],{},"        descripcionLarga = string.Format(\n",[551,20083,20084],{"class":553,"line":9431},[551,20085,20086],{},"            \"El código '{0}' no está registrado en el configurador. \" +\n",[551,20088,20089],{"class":553,"line":9436},[551,20090,20091],{},"            \"Consulte catálogo del fabricante.\",\n",[551,20093,20094],{"class":553,"line":9441},[551,20095,20096],{},"            codigoArticulo\n",[551,20098,20099],{"class":553,"line":9447},[551,20100,4758],{},[551,20102,20103],{"class":553,"line":9452},[551,20104,20105],{},"        especificacionesTecnicas = \"No disponible\";\n",[551,20107,20108],{"class":553,"line":9458},[551,20109,15907],{},[551,20111,20112],{"class":553,"line":9464},[551,20113,1193],{},[13,20115,20116,20118],{},[16,20117,4153],{},"\nCreamos una base de datos de componentes usando switch. Cada código de artículo tiene sus especificaciones completas.",[43,20120],{},[331,20122,20124],{"id":20123},"paso-5-generar-código-de-designación-eplan","Paso 5: Generar código de designación EPLAN",[543,20126,20128],{"className":545,"code":20127,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PASO 4: GENERAR DESIGNACIÓN EPLAN\n\u002F\u002F ========================================\n\nstring prefijoDesignacion;\n\nswitch (tipoComponente)\n{\n    case \"Contactor\":\n        prefijoDesignacion = \"K\";\n        break;\n    case \"Guardamotor\":\n        prefijoDesignacion = \"Q\";\n        break;\n    case \"Relé térmico\":\n    case \"Relé de sobrecarga\":\n        prefijoDesignacion = \"F\";\n        break;\n    case \"Disyuntor motor\":\n        prefijoDesignacion = \"Q\";\n        break;\n    case \"Interruptor automático caja moldeada\":\n        prefijoDesignacion = \"Q\";\n        break;\n    default:\n        prefijoDesignacion = \"?\";\n        break;\n}\n\nstring designacionSugerida = prefijoDesignacion + \"1\";  \u002F\u002F Ejemplo: K1, Q1, F1\n",[54,20129,20130,20134,20139,20143,20147,20152,20156,20161,20165,20170,20175,20179,20184,20189,20193,20198,20203,20208,20212,20217,20221,20225,20230,20234,20238,20242,20247,20251,20255,20259],{"__ignoreMap":228},[551,20131,20132],{"class":553,"line":554},[551,20133,8157],{},[551,20135,20136],{"class":553,"line":229},[551,20137,20138],{},"\u002F\u002F PASO 4: GENERAR DESIGNACIÓN EPLAN\n",[551,20140,20141],{"class":553,"line":670},[551,20142,8157],{},[551,20144,20145],{"class":553,"line":1136},[551,20146,1139],{"emptyLinePlaceholder":238},[551,20148,20149],{"class":553,"line":1142},[551,20150,20151],{},"string prefijoDesignacion;\n",[551,20153,20154],{"class":553,"line":1148},[551,20155,1139],{"emptyLinePlaceholder":238},[551,20157,20158],{"class":553,"line":1154},[551,20159,20160],{},"switch (tipoComponente)\n",[551,20162,20163],{"class":553,"line":1160},[551,20164,1151],{},[551,20166,20167],{"class":553,"line":1166},[551,20168,20169],{},"    case \"Contactor\":\n",[551,20171,20172],{"class":553,"line":1172},[551,20173,20174],{},"        prefijoDesignacion = \"K\";\n",[551,20176,20177],{"class":553,"line":1178},[551,20178,15907],{},[551,20180,20181],{"class":553,"line":1184},[551,20182,20183],{},"    case \"Guardamotor\":\n",[551,20185,20186],{"class":553,"line":1190},[551,20187,20188],{},"        prefijoDesignacion = \"Q\";\n",[551,20190,20191],{"class":553,"line":1472},[551,20192,15907],{},[551,20194,20195],{"class":553,"line":1477},[551,20196,20197],{},"    case \"Relé térmico\":\n",[551,20199,20200],{"class":553,"line":1797},[551,20201,20202],{},"    case \"Relé de sobrecarga\":\n",[551,20204,20205],{"class":553,"line":1802},[551,20206,20207],{},"        prefijoDesignacion = \"F\";\n",[551,20209,20210],{"class":553,"line":1808},[551,20211,15907],{},[551,20213,20214],{"class":553,"line":1814},[551,20215,20216],{},"    case \"Disyuntor motor\":\n",[551,20218,20219],{"class":553,"line":1820},[551,20220,20188],{},[551,20222,20223],{"class":553,"line":1826},[551,20224,15907],{},[551,20226,20227],{"class":553,"line":1832},[551,20228,20229],{},"    case \"Interruptor automático caja moldeada\":\n",[551,20231,20232],{"class":553,"line":1838},[551,20233,20188],{},[551,20235,20236],{"class":553,"line":1844},[551,20237,15907],{},[551,20239,20240],{"class":553,"line":1850},[551,20241,15926],{},[551,20243,20244],{"class":553,"line":1855},[551,20245,20246],{},"        prefijoDesignacion = \"?\";\n",[551,20248,20249],{"class":553,"line":1861},[551,20250,15907],{},[551,20252,20253],{"class":553,"line":1867},[551,20254,1193],{},[551,20256,20257],{"class":553,"line":1873},[551,20258,1139],{"emptyLinePlaceholder":238},[551,20260,20261],{"class":553,"line":1878},[551,20262,20263],{},"string designacionSugerida = prefijoDesignacion + \"1\";  \u002F\u002F Ejemplo: K1, Q1, F1\n",[43,20265],{},[331,20267,20269],{"id":20268},"paso-6-construir-reporte-final","Paso 6: Construir reporte final",[543,20271,20273],{"className":545,"code":20272,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F CONSTRUCCIÓN DEL REPORTE\n\u002F\u002F ========================================\n\nstring separador = new string('=', 50);\n\nstring reporte = string.Format(\n    \"{0}\\n\" +\n    \"CONFIGURADOR DE COMPONENTES ELÉCTRICOS\\n\" +\n    \"{0}\\n\\n\" +\n    \"CÓDIGO DE ARTÍCULO: {1}\\n\\n\" +\n    \"IDENTIFICACIÓN:\\n\" +\n    \"- Fabricante: {2}\\n\" +\n    \"- Tipo: {3}\\n\" +\n    \"- Designación sugerida: {4}\\n\\n\" +\n    \"DESCRIPCIÓN:\\n\" +\n    \"{5}\\n\\n\" +\n    \"ESPECIFICACIONES TÉCNICAS:\\n\" +\n    \"{6}\\n\\n\" +\n    \"{0}\",\n    separador,\n    codigoArticulo,\n    fabricante,\n    tipoComponente,\n    designacionSugerida,\n    descripcionLarga,\n    especificacionesTecnicas\n);\n\n\u002F\u002F ========================================\n\u002F\u002F MOSTRAR REPORTE\n\u002F\u002F ========================================\n\nMessageBoxIcon icono = (fabricante == \"Fabricante no identificado\")\n    ? MessageBoxIcon.Warning\n    : MessageBoxIcon.Information;\n\nMessageBox.Show(reporte, \"Configurador de Componentes\", MessageBoxButtons.OK, icono);\n",[54,20274,20275,20279,20283,20287,20291,20296,20300,20304,20309,20314,20319,20324,20329,20334,20339,20344,20349,20354,20359,20364,20369,20374,20379,20384,20389,20394,20399,20404,20408,20412,20416,20420,20424,20428,20433,20438,20443,20447],{"__ignoreMap":228},[551,20276,20277],{"class":553,"line":554},[551,20278,8157],{},[551,20280,20281],{"class":553,"line":229},[551,20282,8695],{},[551,20284,20285],{"class":553,"line":670},[551,20286,8157],{},[551,20288,20289],{"class":553,"line":1136},[551,20290,1139],{"emptyLinePlaceholder":238},[551,20292,20293],{"class":553,"line":1142},[551,20294,20295],{},"string separador = new string('=', 50);\n",[551,20297,20298],{"class":553,"line":1148},[551,20299,1139],{"emptyLinePlaceholder":238},[551,20301,20302],{"class":553,"line":1154},[551,20303,8708],{},[551,20305,20306],{"class":553,"line":1160},[551,20307,20308],{},"    \"{0}\\n\" +\n",[551,20310,20311],{"class":553,"line":1166},[551,20312,20313],{},"    \"CONFIGURADOR DE COMPONENTES ELÉCTRICOS\\n\" +\n",[551,20315,20316],{"class":553,"line":1172},[551,20317,20318],{},"    \"{0}\\n\\n\" +\n",[551,20320,20321],{"class":553,"line":1178},[551,20322,20323],{},"    \"CÓDIGO DE ARTÍCULO: {1}\\n\\n\" +\n",[551,20325,20326],{"class":553,"line":1184},[551,20327,20328],{},"    \"IDENTIFICACIÓN:\\n\" +\n",[551,20330,20331],{"class":553,"line":1190},[551,20332,20333],{},"    \"- Fabricante: {2}\\n\" +\n",[551,20335,20336],{"class":553,"line":1472},[551,20337,20338],{},"    \"- Tipo: {3}\\n\" +\n",[551,20340,20341],{"class":553,"line":1477},[551,20342,20343],{},"    \"- Designación sugerida: {4}\\n\\n\" +\n",[551,20345,20346],{"class":553,"line":1797},[551,20347,20348],{},"    \"DESCRIPCIÓN:\\n\" +\n",[551,20350,20351],{"class":553,"line":1802},[551,20352,20353],{},"    \"{5}\\n\\n\" +\n",[551,20355,20356],{"class":553,"line":1808},[551,20357,20358],{},"    \"ESPECIFICACIONES TÉCNICAS:\\n\" +\n",[551,20360,20361],{"class":553,"line":1814},[551,20362,20363],{},"    \"{6}\\n\\n\" +\n",[551,20365,20366],{"class":553,"line":1820},[551,20367,20368],{},"    \"{0}\",\n",[551,20370,20371],{"class":553,"line":1826},[551,20372,20373],{},"    separador,\n",[551,20375,20376],{"class":553,"line":1832},[551,20377,20378],{},"    codigoArticulo,\n",[551,20380,20381],{"class":553,"line":1838},[551,20382,20383],{},"    fabricante,\n",[551,20385,20386],{"class":553,"line":1844},[551,20387,20388],{},"    tipoComponente,\n",[551,20390,20391],{"class":553,"line":1850},[551,20392,20393],{},"    designacionSugerida,\n",[551,20395,20396],{"class":553,"line":1855},[551,20397,20398],{},"    descripcionLarga,\n",[551,20400,20401],{"class":553,"line":1861},[551,20402,20403],{},"    especificacionesTecnicas\n",[551,20405,20406],{"class":553,"line":1867},[551,20407,3967],{},[551,20409,20410],{"class":553,"line":1873},[551,20411,1139],{"emptyLinePlaceholder":238},[551,20413,20414],{"class":553,"line":1878},[551,20415,8157],{},[551,20417,20418],{"class":553,"line":1883},[551,20419,8843],{},[551,20421,20422],{"class":553,"line":1888},[551,20423,8157],{},[551,20425,20426],{"class":553,"line":4615},[551,20427,1139],{"emptyLinePlaceholder":238},[551,20429,20430],{"class":553,"line":4620},[551,20431,20432],{},"MessageBoxIcon icono = (fabricante == \"Fabricante no identificado\")\n",[551,20434,20435],{"class":553,"line":4626},[551,20436,20437],{},"    ? MessageBoxIcon.Warning\n",[551,20439,20440],{"class":553,"line":4631},[551,20441,20442],{},"    : MessageBoxIcon.Information;\n",[551,20444,20445],{"class":553,"line":4636},[551,20446,1139],{"emptyLinePlaceholder":238},[551,20448,20449],{"class":553,"line":4641},[551,20450,20451],{},"MessageBox.Show(reporte, \"Configurador de Componentes\", MessageBoxButtons.OK, icono);\n",[43,20453],{},[331,20455,4465],{"id":4464},[543,20457,20459],{"className":545,"code":20458,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class ConfiguradorComponentes\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F CÓDIGO DE ARTÍCULO A CONSULTAR\n        \u002F\u002F ========================================\n\n        string codigoArticulo = \"3RT2026-1BB40\";\n\n        \u002F\u002F Variables para almacenar información\n        string tipoComponente;\n        string fabricante;\n        string descripcionCorta;\n        string descripcionLarga;\n        string especificacionesTecnicas;\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 1: IDENTIFICAR FABRICANTE\n        \u002F\u002F ========================================\n\n        string prefijo = codigoArticulo.Substring(0, 3);\n\n        switch (prefijo)\n        {\n            case \"3RT\":\n            case \"3RV\":\n            case \"3RA\":\n            case \"3RU\":\n                fabricante = \"Siemens\";\n                break;\n            case \"LC1\":\n            case \"LR2\":\n            case \"GV2\":\n            case \"GV3\":\n                fabricante = \"Schneider Electric\";\n                break;\n            case \"AF0\":\n            case \"AF1\":\n            case \"AF2\":\n            case \"AX0\":\n                fabricante = \"ABB\";\n                break;\n            case \"DIL\":\n            case \"PKZ\":\n            case \"NZM\":\n                fabricante = \"Eaton \u002F Moeller\";\n                break;\n            default:\n                fabricante = \"Fabricante no identificado\";\n                break;\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 2: IDENTIFICAR TIPO DE COMPONENTE\n        \u002F\u002F ========================================\n\n        switch (prefijo)\n        {\n            case \"3RT\":\n            case \"LC1\":\n            case \"AF0\":\n            case \"AF1\":\n            case \"AF2\":\n            case \"DIL\":\n                tipoComponente = \"Contactor\";\n                break;\n            case \"3RV\":\n            case \"PKZ\":\n                tipoComponente = \"Guardamotor\";\n                break;\n            case \"3RA\":\n            case \"LR2\":\n            case \"AX0\":\n                tipoComponente = \"Relé térmico\";\n                break;\n            case \"3RU\":\n                tipoComponente = \"Relé de sobrecarga\";\n                break;\n            case \"GV2\":\n            case \"GV3\":\n                tipoComponente = \"Disyuntor motor\";\n                break;\n            case \"NZM\":\n                tipoComponente = \"Interruptor automático caja moldeada\";\n                break;\n            default:\n                tipoComponente = \"Componente no identificado\";\n                break;\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 3: ESPECIFICACIONES POR CÓDIGO\n        \u002F\u002F ========================================\n\n        switch (codigoArticulo)\n        {\n            \u002F\u002F Contactores Siemens 3RT20\n            case \"3RT2026-1BB40\":\n                descripcionCorta = \"Contactor 3P 25A AC3\";\n                descripcionLarga = \"Contactor tripolar, corriente nominal 25A en AC3, \" +\n                                  \"bobina 24V DC, 1NA+1NC auxiliar\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 25A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 24V DC\\n\" +\n                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n                    \"- Poder de corte: 18.5kW @ 400V\\n\" +\n                    \"- Categoría: AC3 (motores)\";\n                break;\n\n            case \"3RT2036-1BB40\":\n                descripcionCorta = \"Contactor 3P 40A AC3\";\n                descripcionLarga = \"Contactor tripolar, corriente nominal 40A en AC3, \" +\n                                  \"bobina 24V DC, 1NA+1NC auxiliar\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 40A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 24V DC\\n\" +\n                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n                    \"- Poder de corte: 22kW @ 400V\\n\" +\n                    \"- Categoría: AC3 (motores)\";\n                break;\n\n            case \"3RT2046-1BB40\":\n                descripcionCorta = \"Contactor 3P 65A AC3\";\n                descripcionLarga = \"Contactor tripolar, corriente nominal 65A en AC3, \" +\n                                  \"bobina 24V DC, 1NA+1NC auxiliar\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 65A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 24V DC\\n\" +\n                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n                    \"- Poder de corte: 37kW @ 400V\\n\" +\n                    \"- Categoría: AC3 (motores)\";\n                break;\n\n            \u002F\u002F Guardamotores Siemens 3RV20\n            case \"3RV2011-1JA10\":\n                descripcionCorta = \"Guardamotor 3.5-5A\";\n                descripcionLarga = \"Guardamotor ajustable, rango 3.5-5A, \" +\n                                  \"disparo magnético 65A\";\n                especificacionesTecnicas =\n                    \"- Rango ajuste: 3.5-5A\\n\" +\n                    \"- Disparo magnético: 65A\\n\" +\n                    \"- Poder de corte: 100kA @ 400V\\n\" +\n                    \"- Clase disparo: Clase 10\\n\" +\n                    \"- Contactos auxiliares: 1NA+1NC\";\n                break;\n\n            case \"3RV2021-4BA10\":\n                descripcionCorta = \"Guardamotor 18-25A\";\n                descripcionLarga = \"Guardamotor ajustable, rango 18-25A, \" +\n                                  \"disparo magnético 325A\";\n                especificacionesTecnicas =\n                    \"- Rango ajuste: 18-25A\\n\" +\n                    \"- Disparo magnético: 325A\\n\" +\n                    \"- Poder de corte: 100kA @ 400V\\n\" +\n                    \"- Clase disparo: Clase 10\\n\" +\n                    \"- Contactos auxiliares: 1NA+1NC\";\n                break;\n\n            \u002F\u002F Contactores Schneider LC1D\n            case \"LC1D09BD\":\n                descripcionCorta = \"Contactor 3P 9A AC3\";\n                descripcionLarga = \"Contactor TeSys D, corriente nominal 9A en AC3, \" +\n                                  \"bobina 24V DC\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 9A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 24V DC\\n\" +\n                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n                    \"- Poder de corte: 4kW @ 400V\\n\" +\n                    \"- Serie: TeSys D\";\n                break;\n\n            case \"LC1D18BD\":\n                descripcionCorta = \"Contactor 3P 18A AC3\";\n                descripcionLarga = \"Contactor TeSys D, corriente nominal 18A en AC3, \" +\n                                  \"bobina 24V DC\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 18A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 24V DC\\n\" +\n                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n                    \"- Poder de corte: 7.5kW @ 400V\\n\" +\n                    \"- Serie: TeSys D\";\n                break;\n\n            \u002F\u002F Contactores ABB\n            case \"AF09-30-10-13\":\n                descripcionCorta = \"Contactor 3P 9A AC3\";\n                descripcionLarga = \"Contactor AF, corriente nominal 9A en AC3, \" +\n                                  \"bobina 100-250V AC\u002FDC\";\n                especificacionesTecnicas =\n                    \"- Corriente nominal: 9A (AC3)\\n\" +\n                    \"- Polos principales: 3\\n\" +\n                    \"- Bobina: 100-250V AC\u002FDC\\n\" +\n                    \"- Contactos auxiliares: 1NA\\n\" +\n                    \"- Poder de corte: 4kW @ 400V\\n\" +\n                    \"- Serie: AF\";\n                break;\n\n            \u002F\u002F Caso default\n            default:\n                descripcionCorta = \"Código no encontrado en base de datos\";\n                descripcionLarga = string.Format(\n                    \"El código '{0}' no está registrado en el configurador. \" +\n                    \"Consulte catálogo del fabricante.\",\n                    codigoArticulo\n                );\n                especificacionesTecnicas = \"No disponible\";\n                break;\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PASO 4: GENERAR DESIGNACIÓN EPLAN\n        \u002F\u002F ========================================\n\n        string prefijoDesignacion;\n\n        switch (tipoComponente)\n        {\n            case \"Contactor\":\n                prefijoDesignacion = \"K\";\n                break;\n            case \"Guardamotor\":\n                prefijoDesignacion = \"Q\";\n                break;\n            case \"Relé térmico\":\n            case \"Relé de sobrecarga\":\n                prefijoDesignacion = \"F\";\n                break;\n            case \"Disyuntor motor\":\n                prefijoDesignacion = \"Q\";\n                break;\n            case \"Interruptor automático caja moldeada\":\n                prefijoDesignacion = \"Q\";\n                break;\n            default:\n                prefijoDesignacion = \"?\";\n                break;\n        }\n\n        string designacionSugerida = prefijoDesignacion + \"1\";\n\n        \u002F\u002F ========================================\n        \u002F\u002F CONSTRUCCIÓN DEL REPORTE\n        \u002F\u002F ========================================\n\n        string separador = new string('=', 50);\n\n        string reporte = string.Format(\n            \"{0}\\n\" +\n            \"CONFIGURADOR DE COMPONENTES ELÉCTRICOS\\n\" +\n            \"{0}\\n\\n\" +\n            \"CÓDIGO DE ARTÍCULO: {1}\\n\\n\" +\n            \"IDENTIFICACIÓN:\\n\" +\n            \"- Fabricante: {2}\\n\" +\n            \"- Tipo: {3}\\n\" +\n            \"- Designación sugerida: {4}\\n\\n\" +\n            \"DESCRIPCIÓN:\\n\" +\n            \"{5}\\n\\n\" +\n            \"ESPECIFICACIONES TÉCNICAS:\\n\" +\n            \"{6}\\n\\n\" +\n            \"{0}\",\n            separador,\n            codigoArticulo,\n            fabricante,\n            tipoComponente,\n            designacionSugerida,\n            descripcionLarga,\n            especificacionesTecnicas\n        );\n\n        \u002F\u002F ========================================\n        \u002F\u002F MOSTRAR REPORTE\n        \u002F\u002F ========================================\n\n        MessageBoxIcon icono = (fabricante == \"Fabricante no identificado\")\n            ? MessageBoxIcon.Warning\n            : MessageBoxIcon.Information;\n\n        MessageBox.Show(reporte, \"Configurador de Componentes\", MessageBoxButtons.OK, icono);\n    }\n}\n",[54,20460,20461,20465,20469,20473,20477,20481,20485,20489,20493,20497,20501,20505,20509,20513,20517,20521,20525,20529,20533,20537,20541,20545,20549,20553,20558,20562,20566,20571,20575,20580,20584,20589,20594,20599,20604,20609,20614,20619,20624,20629,20634,20639,20643,20648,20653,20658,20663,20668,20672,20677,20682,20687,20692,20696,20701,20706,20710,20714,20718,20722,20727,20731,20735,20739,20743,20747,20751,20755,20759,20763,20767,20772,20776,20780,20784,20789,20793,20797,20801,20805,20810,20814,20818,20823,20827,20831,20835,20840,20844,20848,20853,20857,20861,20866,20870,20874,20878,20882,20887,20891,20895,20900,20904,20909,20914,20919,20924,20929,20934,20939,20944,20949,20954,20959,20964,20968,20972,20977,20982,20987,20991,20995,21000,21004,21008,21012,21017,21021,21025,21029,21034,21039,21044,21048,21052,21057,21061,21065,21069,21074,21078,21082,21086,21091,21096,21101,21106,21111,21115,21120,21125,21130,21135,21140,21144,21148,21153,21158,21163,21168,21172,21177,21182,21186,21190,21194,21198,21202,21207,21212,21217,21222,21227,21231,21236,21240,21244,21248,21253,21258,21262,21266,21271,21276,21281,21285,21289,21294,21298,21302,21306,21311,21315,21319,21323,21328,21333,21337,21342,21347,21351,21355,21359,21364,21369,21373,21378,21382,21386,21391,21395,21400,21405,21410,21415,21420,21425,21430,21434,21438,21442,21446,21451,21455,21459,21464,21468,21473,21477,21482,21487,21491,21496,21501,21505,21510,21515,21520,21524,21529,21533,21537,21542,21546,21550,21554,21559,21563,21567,21571,21576,21580,21584,21588,21592,21596,21601,21605,21609,21614,21619,21624,21629,21634,21639,21644,21649,21654,21659,21664,21669,21674,21679,21684,21689,21694,21699,21704,21709,21713,21717,21721,21725,21729,21733,21738,21743,21748,21753,21759,21764],{"__ignoreMap":228},[551,20462,20463],{"class":553,"line":554},[551,20464,1123],{},[551,20466,20467],{"class":553,"line":229},[551,20468,1128],{},[551,20470,20471],{"class":553,"line":670},[551,20472,1133],{},[551,20474,20475],{"class":553,"line":1136},[551,20476,1139],{"emptyLinePlaceholder":238},[551,20478,20479],{"class":553,"line":1142},[551,20480,19118],{},[551,20482,20483],{"class":553,"line":1148},[551,20484,1151],{},[551,20486,20487],{"class":553,"line":1154},[551,20488,1157],{},[551,20490,20491],{"class":553,"line":1160},[551,20492,1163],{},[551,20494,20495],{"class":553,"line":1166},[551,20496,1169],{},[551,20498,20499],{"class":553,"line":1172},[551,20500,4511],{},[551,20502,20503],{"class":553,"line":1178},[551,20504,19143],{},[551,20506,20507],{"class":553,"line":1184},[551,20508,4511],{},[551,20510,20511],{"class":553,"line":1190},[551,20512,1139],{"emptyLinePlaceholder":238},[551,20514,20515],{"class":553,"line":1472},[551,20516,19156],{},[551,20518,20519],{"class":553,"line":1477},[551,20520,1139],{"emptyLinePlaceholder":238},[551,20522,20523],{"class":553,"line":1797},[551,20524,19165],{},[551,20526,20527],{"class":553,"line":1802},[551,20528,19170],{},[551,20530,20531],{"class":553,"line":1808},[551,20532,19175],{},[551,20534,20535],{"class":553,"line":1814},[551,20536,19180],{},[551,20538,20539],{"class":553,"line":1820},[551,20540,19185],{},[551,20542,20543],{"class":553,"line":1826},[551,20544,19190],{},[551,20546,20547],{"class":553,"line":1832},[551,20548,1139],{"emptyLinePlaceholder":238},[551,20550,20551],{"class":553,"line":1838},[551,20552,4511],{},[551,20554,20555],{"class":553,"line":1844},[551,20556,20557],{},"        \u002F\u002F PASO 1: IDENTIFICAR FABRICANTE\n",[551,20559,20560],{"class":553,"line":1850},[551,20561,4511],{},[551,20563,20564],{"class":553,"line":1855},[551,20565,1139],{"emptyLinePlaceholder":238},[551,20567,20568],{"class":553,"line":1861},[551,20569,20570],{},"        string prefijo = codigoArticulo.Substring(0, 3);\n",[551,20572,20573],{"class":553,"line":1867},[551,20574,1139],{"emptyLinePlaceholder":238},[551,20576,20577],{"class":553,"line":1873},[551,20578,20579],{},"        switch (prefijo)\n",[551,20581,20582],{"class":553,"line":1878},[551,20583,9062],{},[551,20585,20586],{"class":553,"line":1883},[551,20587,20588],{},"            case \"3RT\":\n",[551,20590,20591],{"class":553,"line":1888},[551,20592,20593],{},"            case \"3RV\":\n",[551,20595,20596],{"class":553,"line":4615},[551,20597,20598],{},"            case \"3RA\":\n",[551,20600,20601],{"class":553,"line":4620},[551,20602,20603],{},"            case \"3RU\":\n",[551,20605,20606],{"class":553,"line":4626},[551,20607,20608],{},"                fabricante = \"Siemens\";\n",[551,20610,20611],{"class":553,"line":4631},[551,20612,20613],{},"                break;\n",[551,20615,20616],{"class":553,"line":4636},[551,20617,20618],{},"            case \"LC1\":\n",[551,20620,20621],{"class":553,"line":4641},[551,20622,20623],{},"            case \"LR2\":\n",[551,20625,20626],{"class":553,"line":4647},[551,20627,20628],{},"            case \"GV2\":\n",[551,20630,20631],{"class":553,"line":4653},[551,20632,20633],{},"            case \"GV3\":\n",[551,20635,20636],{"class":553,"line":4659},[551,20637,20638],{},"                fabricante = \"Schneider Electric\";\n",[551,20640,20641],{"class":553,"line":4665},[551,20642,20613],{},[551,20644,20645],{"class":553,"line":4671},[551,20646,20647],{},"            case \"AF0\":\n",[551,20649,20650],{"class":553,"line":4677},[551,20651,20652],{},"            case \"AF1\":\n",[551,20654,20655],{"class":553,"line":4683},[551,20656,20657],{},"            case \"AF2\":\n",[551,20659,20660],{"class":553,"line":4689},[551,20661,20662],{},"            case \"AX0\":\n",[551,20664,20665],{"class":553,"line":4695},[551,20666,20667],{},"                fabricante = \"ABB\";\n",[551,20669,20670],{"class":553,"line":4701},[551,20671,20613],{},[551,20673,20674],{"class":553,"line":4707},[551,20675,20676],{},"            case \"DIL\":\n",[551,20678,20679],{"class":553,"line":4713},[551,20680,20681],{},"            case \"PKZ\":\n",[551,20683,20684],{"class":553,"line":4719},[551,20685,20686],{},"            case \"NZM\":\n",[551,20688,20689],{"class":553,"line":4725},[551,20690,20691],{},"                fabricante = \"Eaton \u002F Moeller\";\n",[551,20693,20694],{"class":553,"line":4731},[551,20695,20613],{},[551,20697,20698],{"class":553,"line":4737},[551,20699,20700],{},"            default:\n",[551,20702,20703],{"class":553,"line":4743},[551,20704,20705],{},"                fabricante = \"Fabricante no identificado\";\n",[551,20707,20708],{"class":553,"line":4749},[551,20709,20613],{},[551,20711,20712],{"class":553,"line":4755},[551,20713,9077],{},[551,20715,20716],{"class":553,"line":4761},[551,20717,1139],{"emptyLinePlaceholder":238},[551,20719,20720],{"class":553,"line":4766},[551,20721,4511],{},[551,20723,20724],{"class":553,"line":4771},[551,20725,20726],{},"        \u002F\u002F PASO 2: IDENTIFICAR TIPO DE COMPONENTE\n",[551,20728,20729],{"class":553,"line":4777},[551,20730,4511],{},[551,20732,20733],{"class":553,"line":4782},[551,20734,1139],{"emptyLinePlaceholder":238},[551,20736,20737],{"class":553,"line":4787},[551,20738,20579],{},[551,20740,20741],{"class":553,"line":4793},[551,20742,9062],{},[551,20744,20745],{"class":553,"line":4799},[551,20746,20588],{},[551,20748,20749],{"class":553,"line":4805},[551,20750,20618],{},[551,20752,20753],{"class":553,"line":4811},[551,20754,20647],{},[551,20756,20757],{"class":553,"line":4817},[551,20758,20652],{},[551,20760,20761],{"class":553,"line":4822},[551,20762,20657],{},[551,20764,20765],{"class":553,"line":4827},[551,20766,20676],{},[551,20768,20769],{"class":553,"line":9183},[551,20770,20771],{},"                tipoComponente = \"Contactor\";\n",[551,20773,20774],{"class":553,"line":9188},[551,20775,20613],{},[551,20777,20778],{"class":553,"line":9193},[551,20779,20593],{},[551,20781,20782],{"class":553,"line":9198},[551,20783,20681],{},[551,20785,20786],{"class":553,"line":9204},[551,20787,20788],{},"                tipoComponente = \"Guardamotor\";\n",[551,20790,20791],{"class":553,"line":9209},[551,20792,20613],{},[551,20794,20795],{"class":553,"line":9214},[551,20796,20598],{},[551,20798,20799],{"class":553,"line":9219},[551,20800,20623],{},[551,20802,20803],{"class":553,"line":9224},[551,20804,20662],{},[551,20806,20807],{"class":553,"line":9230},[551,20808,20809],{},"                tipoComponente = \"Relé térmico\";\n",[551,20811,20812],{"class":553,"line":9236},[551,20813,20613],{},[551,20815,20816],{"class":553,"line":9242},[551,20817,20603],{},[551,20819,20820],{"class":553,"line":9247},[551,20821,20822],{},"                tipoComponente = \"Relé de sobrecarga\";\n",[551,20824,20825],{"class":553,"line":9253},[551,20826,20613],{},[551,20828,20829],{"class":553,"line":9258},[551,20830,20628],{},[551,20832,20833],{"class":553,"line":9264},[551,20834,20633],{},[551,20836,20837],{"class":553,"line":9270},[551,20838,20839],{},"                tipoComponente = \"Disyuntor motor\";\n",[551,20841,20842],{"class":553,"line":9275},[551,20843,20613],{},[551,20845,20846],{"class":553,"line":9281},[551,20847,20686],{},[551,20849,20850],{"class":553,"line":9287},[551,20851,20852],{},"                tipoComponente = \"Interruptor automático caja moldeada\";\n",[551,20854,20855],{"class":553,"line":9292},[551,20856,20613],{},[551,20858,20859],{"class":553,"line":9297},[551,20860,20700],{},[551,20862,20863],{"class":553,"line":9302},[551,20864,20865],{},"                tipoComponente = \"Componente no identificado\";\n",[551,20867,20868],{"class":553,"line":9308},[551,20869,20613],{},[551,20871,20872],{"class":553,"line":9313},[551,20873,9077],{},[551,20875,20876],{"class":553,"line":9318},[551,20877,1139],{"emptyLinePlaceholder":238},[551,20879,20880],{"class":553,"line":9323},[551,20881,4511],{},[551,20883,20884],{"class":553,"line":9328},[551,20885,20886],{},"        \u002F\u002F PASO 3: ESPECIFICACIONES POR CÓDIGO\n",[551,20888,20889],{"class":553,"line":9334},[551,20890,4511],{},[551,20892,20893],{"class":553,"line":9339},[551,20894,1139],{"emptyLinePlaceholder":238},[551,20896,20897],{"class":553,"line":9344},[551,20898,20899],{},"        switch (codigoArticulo)\n",[551,20901,20902],{"class":553,"line":9350},[551,20903,9062],{},[551,20905,20906],{"class":553,"line":9355},[551,20907,20908],{},"            \u002F\u002F Contactores Siemens 3RT20\n",[551,20910,20911],{"class":553,"line":9361},[551,20912,20913],{},"            case \"3RT2026-1BB40\":\n",[551,20915,20916],{"class":553,"line":9367},[551,20917,20918],{},"                descripcionCorta = \"Contactor 3P 25A AC3\";\n",[551,20920,20921],{"class":553,"line":9372},[551,20922,20923],{},"                descripcionLarga = \"Contactor tripolar, corriente nominal 25A en AC3, \" +\n",[551,20925,20926],{"class":553,"line":9378},[551,20927,20928],{},"                                  \"bobina 24V DC, 1NA+1NC auxiliar\";\n",[551,20930,20931],{"class":553,"line":9384},[551,20932,20933],{},"                especificacionesTecnicas =\n",[551,20935,20936],{"class":553,"line":9389},[551,20937,20938],{},"                    \"- Corriente nominal: 25A (AC3)\\n\" +\n",[551,20940,20941],{"class":553,"line":9394},[551,20942,20943],{},"                    \"- Polos principales: 3\\n\" +\n",[551,20945,20946],{"class":553,"line":9399},[551,20947,20948],{},"                    \"- Bobina: 24V DC\\n\" +\n",[551,20950,20951],{"class":553,"line":9405},[551,20952,20953],{},"                    \"- Contactos auxiliares: 1NA + 1NC\\n\" +\n",[551,20955,20956],{"class":553,"line":9410},[551,20957,20958],{},"                    \"- Poder de corte: 18.5kW @ 400V\\n\" +\n",[551,20960,20961],{"class":553,"line":9415},[551,20962,20963],{},"                    \"- Categoría: AC3 (motores)\";\n",[551,20965,20966],{"class":553,"line":9420},[551,20967,20613],{},[551,20969,20970],{"class":553,"line":9425},[551,20971,1139],{"emptyLinePlaceholder":238},[551,20973,20974],{"class":553,"line":9431},[551,20975,20976],{},"            case \"3RT2036-1BB40\":\n",[551,20978,20979],{"class":553,"line":9436},[551,20980,20981],{},"                descripcionCorta = \"Contactor 3P 40A AC3\";\n",[551,20983,20984],{"class":553,"line":9441},[551,20985,20986],{},"                descripcionLarga = \"Contactor tripolar, corriente nominal 40A en AC3, \" +\n",[551,20988,20989],{"class":553,"line":9447},[551,20990,20928],{},[551,20992,20993],{"class":553,"line":9452},[551,20994,20933],{},[551,20996,20997],{"class":553,"line":9458},[551,20998,20999],{},"                    \"- Corriente nominal: 40A (AC3)\\n\" +\n",[551,21001,21002],{"class":553,"line":9464},[551,21003,20943],{},[551,21005,21006],{"class":553,"line":9469},[551,21007,20948],{},[551,21009,21010],{"class":553,"line":9475},[551,21011,20953],{},[551,21013,21014],{"class":553,"line":9481},[551,21015,21016],{},"                    \"- Poder de corte: 22kW @ 400V\\n\" +\n",[551,21018,21019],{"class":553,"line":9487},[551,21020,20963],{},[551,21022,21023],{"class":553,"line":9492},[551,21024,20613],{},[551,21026,21027],{"class":553,"line":9497},[551,21028,1139],{"emptyLinePlaceholder":238},[551,21030,21031],{"class":553,"line":9502},[551,21032,21033],{},"            case \"3RT2046-1BB40\":\n",[551,21035,21036],{"class":553,"line":9508},[551,21037,21038],{},"                descripcionCorta = \"Contactor 3P 65A AC3\";\n",[551,21040,21041],{"class":553,"line":9514},[551,21042,21043],{},"                descripcionLarga = \"Contactor tripolar, corriente nominal 65A en AC3, \" +\n",[551,21045,21046],{"class":553,"line":9519},[551,21047,20928],{},[551,21049,21050],{"class":553,"line":9524},[551,21051,20933],{},[551,21053,21054],{"class":553,"line":9529},[551,21055,21056],{},"                    \"- Corriente nominal: 65A (AC3)\\n\" +\n",[551,21058,21059],{"class":553,"line":9535},[551,21060,20943],{},[551,21062,21063],{"class":553,"line":9540},[551,21064,20948],{},[551,21066,21067],{"class":553,"line":9545},[551,21068,20953],{},[551,21070,21071],{"class":553,"line":9551},[551,21072,21073],{},"                    \"- Poder de corte: 37kW @ 400V\\n\" +\n",[551,21075,21076],{"class":553,"line":9557},[551,21077,20963],{},[551,21079,21080],{"class":553,"line":9562},[551,21081,20613],{},[551,21083,21084],{"class":553,"line":9568},[551,21085,1139],{"emptyLinePlaceholder":238},[551,21087,21088],{"class":553,"line":9573},[551,21089,21090],{},"            \u002F\u002F Guardamotores Siemens 3RV20\n",[551,21092,21093],{"class":553,"line":9578},[551,21094,21095],{},"            case \"3RV2011-1JA10\":\n",[551,21097,21098],{"class":553,"line":9584},[551,21099,21100],{},"                descripcionCorta = \"Guardamotor 3.5-5A\";\n",[551,21102,21103],{"class":553,"line":9589},[551,21104,21105],{},"                descripcionLarga = \"Guardamotor ajustable, rango 3.5-5A, \" +\n",[551,21107,21108],{"class":553,"line":9594},[551,21109,21110],{},"                                  \"disparo magnético 65A\";\n",[551,21112,21113],{"class":553,"line":9600},[551,21114,20933],{},[551,21116,21117],{"class":553,"line":9606},[551,21118,21119],{},"                    \"- Rango ajuste: 3.5-5A\\n\" +\n",[551,21121,21122],{"class":553,"line":9611},[551,21123,21124],{},"                    \"- Disparo magnético: 65A\\n\" +\n",[551,21126,21127],{"class":553,"line":9617},[551,21128,21129],{},"                    \"- Poder de corte: 100kA @ 400V\\n\" +\n",[551,21131,21132],{"class":553,"line":9623},[551,21133,21134],{},"                    \"- Clase disparo: Clase 10\\n\" +\n",[551,21136,21137],{"class":553,"line":9629},[551,21138,21139],{},"                    \"- Contactos auxiliares: 1NA+1NC\";\n",[551,21141,21142],{"class":553,"line":9635},[551,21143,20613],{},[551,21145,21146],{"class":553,"line":9641},[551,21147,1139],{"emptyLinePlaceholder":238},[551,21149,21150],{"class":553,"line":9647},[551,21151,21152],{},"            case \"3RV2021-4BA10\":\n",[551,21154,21155],{"class":553,"line":9653},[551,21156,21157],{},"                descripcionCorta = \"Guardamotor 18-25A\";\n",[551,21159,21160],{"class":553,"line":9659},[551,21161,21162],{},"                descripcionLarga = \"Guardamotor ajustable, rango 18-25A, \" +\n",[551,21164,21165],{"class":553,"line":9665},[551,21166,21167],{},"                                  \"disparo magnético 325A\";\n",[551,21169,21170],{"class":553,"line":9671},[551,21171,20933],{},[551,21173,21174],{"class":553,"line":9677},[551,21175,21176],{},"                    \"- Rango ajuste: 18-25A\\n\" +\n",[551,21178,21179],{"class":553,"line":9682},[551,21180,21181],{},"                    \"- Disparo magnético: 325A\\n\" +\n",[551,21183,21184],{"class":553,"line":9688},[551,21185,21129],{},[551,21187,21188],{"class":553,"line":9694},[551,21189,21134],{},[551,21191,21192],{"class":553,"line":9700},[551,21193,21139],{},[551,21195,21196],{"class":553,"line":9706},[551,21197,20613],{},[551,21199,21200],{"class":553,"line":9712},[551,21201,1139],{"emptyLinePlaceholder":238},[551,21203,21204],{"class":553,"line":9718},[551,21205,21206],{},"            \u002F\u002F Contactores Schneider LC1D\n",[551,21208,21209],{"class":553,"line":9724},[551,21210,21211],{},"            case \"LC1D09BD\":\n",[551,21213,21214],{"class":553,"line":9730},[551,21215,21216],{},"                descripcionCorta = \"Contactor 3P 9A AC3\";\n",[551,21218,21219],{"class":553,"line":9736},[551,21220,21221],{},"                descripcionLarga = \"Contactor TeSys D, corriente nominal 9A en AC3, \" +\n",[551,21223,21224],{"class":553,"line":9742},[551,21225,21226],{},"                                  \"bobina 24V DC\";\n",[551,21228,21229],{"class":553,"line":9747},[551,21230,20933],{},[551,21232,21233],{"class":553,"line":9752},[551,21234,21235],{},"                    \"- Corriente nominal: 9A (AC3)\\n\" +\n",[551,21237,21238],{"class":553,"line":9757},[551,21239,20943],{},[551,21241,21242],{"class":553,"line":9763},[551,21243,20948],{},[551,21245,21246],{"class":553,"line":9768},[551,21247,20953],{},[551,21249,21250],{"class":553,"line":9773},[551,21251,21252],{},"                    \"- Poder de corte: 4kW @ 400V\\n\" +\n",[551,21254,21255],{"class":553,"line":9779},[551,21256,21257],{},"                    \"- Serie: TeSys D\";\n",[551,21259,21260],{"class":553,"line":9784},[551,21261,20613],{},[551,21263,21264],{"class":553,"line":9790},[551,21265,1139],{"emptyLinePlaceholder":238},[551,21267,21268],{"class":553,"line":9795},[551,21269,21270],{},"            case \"LC1D18BD\":\n",[551,21272,21273],{"class":553,"line":15107},[551,21274,21275],{},"                descripcionCorta = \"Contactor 3P 18A AC3\";\n",[551,21277,21278],{"class":553,"line":15113},[551,21279,21280],{},"                descripcionLarga = \"Contactor TeSys D, corriente nominal 18A en AC3, \" +\n",[551,21282,21283],{"class":553,"line":15119},[551,21284,21226],{},[551,21286,21287],{"class":553,"line":15124},[551,21288,20933],{},[551,21290,21291],{"class":553,"line":15130},[551,21292,21293],{},"                    \"- Corriente nominal: 18A (AC3)\\n\" +\n",[551,21295,21296],{"class":553,"line":15135},[551,21297,20943],{},[551,21299,21300],{"class":553,"line":15140},[551,21301,20948],{},[551,21303,21304],{"class":553,"line":15146},[551,21305,20953],{},[551,21307,21308],{"class":553,"line":15151},[551,21309,21310],{},"                    \"- Poder de corte: 7.5kW @ 400V\\n\" +\n",[551,21312,21313],{"class":553,"line":15156},[551,21314,21257],{},[551,21316,21317],{"class":553,"line":15161},[551,21318,20613],{},[551,21320,21321],{"class":553,"line":15167},[551,21322,1139],{"emptyLinePlaceholder":238},[551,21324,21325],{"class":553,"line":15172},[551,21326,21327],{},"            \u002F\u002F Contactores ABB\n",[551,21329,21330],{"class":553,"line":15177},[551,21331,21332],{},"            case \"AF09-30-10-13\":\n",[551,21334,21335],{"class":553,"line":15182},[551,21336,21216],{},[551,21338,21339],{"class":553,"line":15188},[551,21340,21341],{},"                descripcionLarga = \"Contactor AF, corriente nominal 9A en AC3, \" +\n",[551,21343,21344],{"class":553,"line":15193},[551,21345,21346],{},"                                  \"bobina 100-250V AC\u002FDC\";\n",[551,21348,21349],{"class":553,"line":15198},[551,21350,20933],{},[551,21352,21353],{"class":553,"line":15204},[551,21354,21235],{},[551,21356,21357],{"class":553,"line":15209},[551,21358,20943],{},[551,21360,21361],{"class":553,"line":15214},[551,21362,21363],{},"                    \"- Bobina: 100-250V AC\u002FDC\\n\" +\n",[551,21365,21366],{"class":553,"line":15220},[551,21367,21368],{},"                    \"- Contactos auxiliares: 1NA\\n\" +\n",[551,21370,21371],{"class":553,"line":15225},[551,21372,21252],{},[551,21374,21375],{"class":553,"line":15230},[551,21376,21377],{},"                    \"- Serie: AF\";\n",[551,21379,21380],{"class":553,"line":15235},[551,21381,20613],{},[551,21383,21384],{"class":553,"line":15241},[551,21385,1139],{"emptyLinePlaceholder":238},[551,21387,21388],{"class":553,"line":15246},[551,21389,21390],{},"            \u002F\u002F Caso default\n",[551,21392,21393],{"class":553,"line":15252},[551,21394,20700],{},[551,21396,21397],{"class":553,"line":15257},[551,21398,21399],{},"                descripcionCorta = \"Código no encontrado en base de datos\";\n",[551,21401,21402],{"class":553,"line":15263},[551,21403,21404],{},"                descripcionLarga = string.Format(\n",[551,21406,21407],{"class":553,"line":15268},[551,21408,21409],{},"                    \"El código '{0}' no está registrado en el configurador. \" +\n",[551,21411,21412],{"class":553,"line":15274},[551,21413,21414],{},"                    \"Consulte catálogo del fabricante.\",\n",[551,21416,21417],{"class":553,"line":15279},[551,21418,21419],{},"                    codigoArticulo\n",[551,21421,21422],{"class":553,"line":15284},[551,21423,21424],{},"                );\n",[551,21426,21427],{"class":553,"line":15289},[551,21428,21429],{},"                especificacionesTecnicas = \"No disponible\";\n",[551,21431,21432],{"class":553,"line":15295},[551,21433,20613],{},[551,21435,21436],{"class":553,"line":15301},[551,21437,9077],{},[551,21439,21440],{"class":553,"line":15306},[551,21441,1139],{"emptyLinePlaceholder":238},[551,21443,21444],{"class":553,"line":15312},[551,21445,4511],{},[551,21447,21448],{"class":553,"line":15317},[551,21449,21450],{},"        \u002F\u002F PASO 4: GENERAR DESIGNACIÓN EPLAN\n",[551,21452,21453],{"class":553,"line":15322},[551,21454,4511],{},[551,21456,21457],{"class":553,"line":15327},[551,21458,1139],{"emptyLinePlaceholder":238},[551,21460,21461],{"class":553,"line":15333},[551,21462,21463],{},"        string prefijoDesignacion;\n",[551,21465,21466],{"class":553,"line":15338},[551,21467,1139],{"emptyLinePlaceholder":238},[551,21469,21470],{"class":553,"line":15343},[551,21471,21472],{},"        switch (tipoComponente)\n",[551,21474,21475],{"class":553,"line":15348},[551,21476,9062],{},[551,21478,21479],{"class":553,"line":15354},[551,21480,21481],{},"            case \"Contactor\":\n",[551,21483,21484],{"class":553,"line":15359},[551,21485,21486],{},"                prefijoDesignacion = \"K\";\n",[551,21488,21489],{"class":553,"line":15364},[551,21490,20613],{},[551,21492,21493],{"class":553,"line":15369},[551,21494,21495],{},"            case \"Guardamotor\":\n",[551,21497,21498],{"class":553,"line":15374},[551,21499,21500],{},"                prefijoDesignacion = \"Q\";\n",[551,21502,21503],{"class":553,"line":15379},[551,21504,20613],{},[551,21506,21507],{"class":553,"line":15384},[551,21508,21509],{},"            case \"Relé térmico\":\n",[551,21511,21512],{"class":553,"line":15389},[551,21513,21514],{},"            case \"Relé de sobrecarga\":\n",[551,21516,21517],{"class":553,"line":15395},[551,21518,21519],{},"                prefijoDesignacion = \"F\";\n",[551,21521,21522],{"class":553,"line":15401},[551,21523,20613],{},[551,21525,21526],{"class":553,"line":15407},[551,21527,21528],{},"            case \"Disyuntor motor\":\n",[551,21530,21531],{"class":553,"line":15413},[551,21532,21500],{},[551,21534,21535],{"class":553,"line":15419},[551,21536,20613],{},[551,21538,21539],{"class":553,"line":15425},[551,21540,21541],{},"            case \"Interruptor automático caja moldeada\":\n",[551,21543,21544],{"class":553,"line":15431},[551,21545,21500],{},[551,21547,21548],{"class":553,"line":15437},[551,21549,20613],{},[551,21551,21552],{"class":553,"line":15443},[551,21553,20700],{},[551,21555,21556],{"class":553,"line":15449},[551,21557,21558],{},"                prefijoDesignacion = \"?\";\n",[551,21560,21561],{"class":553,"line":15455},[551,21562,20613],{},[551,21564,21565],{"class":553,"line":15461},[551,21566,9077],{},[551,21568,21569],{"class":553,"line":15467},[551,21570,1139],{"emptyLinePlaceholder":238},[551,21572,21573],{"class":553,"line":15473},[551,21574,21575],{},"        string designacionSugerida = prefijoDesignacion + \"1\";\n",[551,21577,21578],{"class":553,"line":15479},[551,21579,1139],{"emptyLinePlaceholder":238},[551,21581,21582],{"class":553,"line":15485},[551,21583,4511],{},[551,21585,21586],{"class":553,"line":15491},[551,21587,9581],{},[551,21589,21590],{"class":553,"line":15497},[551,21591,4511],{},[551,21593,21594],{"class":553,"line":15503},[551,21595,1139],{"emptyLinePlaceholder":238},[551,21597,21598],{"class":553,"line":15509},[551,21599,21600],{},"        string separador = new string('=', 50);\n",[551,21602,21603],{"class":553,"line":15515},[551,21604,1139],{"emptyLinePlaceholder":238},[551,21606,21607],{"class":553,"line":15520},[551,21608,9597],{},[551,21610,21611],{"class":553,"line":15526},[551,21612,21613],{},"            \"{0}\\n\" +\n",[551,21615,21616],{"class":553,"line":15532},[551,21617,21618],{},"            \"CONFIGURADOR DE COMPONENTES ELÉCTRICOS\\n\" +\n",[551,21620,21621],{"class":553,"line":15537},[551,21622,21623],{},"            \"{0}\\n\\n\" +\n",[551,21625,21626],{"class":553,"line":15543},[551,21627,21628],{},"            \"CÓDIGO DE ARTÍCULO: {1}\\n\\n\" +\n",[551,21630,21631],{"class":553,"line":15549},[551,21632,21633],{},"            \"IDENTIFICACIÓN:\\n\" +\n",[551,21635,21636],{"class":553,"line":15555},[551,21637,21638],{},"            \"- Fabricante: {2}\\n\" +\n",[551,21640,21641],{"class":553,"line":15561},[551,21642,21643],{},"            \"- Tipo: {3}\\n\" +\n",[551,21645,21646],{"class":553,"line":15567},[551,21647,21648],{},"            \"- Designación sugerida: {4}\\n\\n\" +\n",[551,21650,21651],{"class":553,"line":15573},[551,21652,21653],{},"            \"DESCRIPCIÓN:\\n\" +\n",[551,21655,21656],{"class":553,"line":15578},[551,21657,21658],{},"            \"{5}\\n\\n\" +\n",[551,21660,21661],{"class":553,"line":15584},[551,21662,21663],{},"            \"ESPECIFICACIONES TÉCNICAS:\\n\" +\n",[551,21665,21666],{"class":553,"line":15590},[551,21667,21668],{},"            \"{6}\\n\\n\" +\n",[551,21670,21671],{"class":553,"line":15596},[551,21672,21673],{},"            \"{0}\",\n",[551,21675,21676],{"class":553,"line":15602},[551,21677,21678],{},"            separador,\n",[551,21680,21681],{"class":553,"line":15608},[551,21682,21683],{},"            codigoArticulo,\n",[551,21685,21686],{"class":553,"line":15614},[551,21687,21688],{},"            fabricante,\n",[551,21690,21691],{"class":553,"line":15620},[551,21692,21693],{},"            tipoComponente,\n",[551,21695,21696],{"class":553,"line":15626},[551,21697,21698],{},"            designacionSugerida,\n",[551,21700,21701],{"class":553,"line":15632},[551,21702,21703],{},"            descripcionLarga,\n",[551,21705,21706],{"class":553,"line":15637},[551,21707,21708],{},"            especificacionesTecnicas\n",[551,21710,21711],{"class":553,"line":15642},[551,21712,4758],{},[551,21714,21715],{"class":553,"line":15647},[551,21716,1139],{"emptyLinePlaceholder":238},[551,21718,21719],{"class":553,"line":15652},[551,21720,4511],{},[551,21722,21723],{"class":553,"line":15657},[551,21724,9760],{},[551,21726,21727],{"class":553,"line":15662},[551,21728,4511],{},[551,21730,21731],{"class":553,"line":15668},[551,21732,1139],{"emptyLinePlaceholder":238},[551,21734,21735],{"class":553,"line":15673},[551,21736,21737],{},"        MessageBoxIcon icono = (fabricante == \"Fabricante no identificado\")\n",[551,21739,21740],{"class":553,"line":15679},[551,21741,21742],{},"            ? MessageBoxIcon.Warning\n",[551,21744,21745],{"class":553,"line":15684},[551,21746,21747],{},"            : MessageBoxIcon.Information;\n",[551,21749,21751],{"class":553,"line":21750},288,[551,21752,1139],{"emptyLinePlaceholder":238},[551,21754,21756],{"class":553,"line":21755},289,[551,21757,21758],{},"        MessageBox.Show(reporte, \"Configurador de Componentes\", MessageBoxButtons.OK, icono);\n",[551,21760,21762],{"class":553,"line":21761},290,[551,21763,1187],{},[551,21765,21767],{"class":553,"line":21766},291,[551,21768,1193],{},[13,21770,21771,416],{},[16,21772,21773],{},"Ejercicios",[126,21775,21776,21783,21786,21789],{},[88,21777,21778,21779,21782],{},"Cambia ",[54,21780,21781],{},"codigoArticulo"," a \"3RV2011-1JA10\" (guardamotor)",[88,21784,21785],{},"Prueba con \"LC1D18BD\" (Schneider)",[88,21787,21788],{},"Prueba con \"XXXX\" (código no existente)",[88,21790,21791],{},"Agrega más componentes al switch",[43,21793],{},[46,21795,4852],{"id":4851},[331,21797,21799],{"id":21798},"fall-through-y-goto-case","Fall-through y goto case",[13,21801,21802,21803,21806,21807,21810],{},"En algunos lenguajes, si olvidas ",[54,21804,21805],{},"break",", el código \"cae\" al siguiente caso (fall-through). En C#, esto es ",[16,21808,21809],{},"error de compilación"," para evitar bugs.",[13,21812,21813,21814,21817,21818,416],{},"Pero puedes hacerlo ",[16,21815,21816],{},"explícitamente"," con ",[54,21819,21820],{},"goto case",[543,21822,21824],{"className":545,"code":21823,"language":547,"meta":228,"style":228},"switch (codigo)\n{\n    case \"A\":\n        MessageBox.Show(\"Procesando A\");\n        goto case \"B\";  \u002F\u002F Continúa explícitamente en B\n    case \"B\":\n        MessageBox.Show(\"Procesando B\");\n        break;\n}\n",[54,21825,21826,21831,21835,21839,21844,21849,21853,21858,21862],{"__ignoreMap":228},[551,21827,21828],{"class":553,"line":554},[551,21829,21830],{},"switch (codigo)\n",[551,21832,21833],{"class":553,"line":229},[551,21834,1151],{},[551,21836,21837],{"class":553,"line":670},[551,21838,17330],{},[551,21840,21841],{"class":553,"line":1136},[551,21842,21843],{},"        MessageBox.Show(\"Procesando A\");\n",[551,21845,21846],{"class":553,"line":1142},[551,21847,21848],{},"        goto case \"B\";  \u002F\u002F Continúa explícitamente en B\n",[551,21850,21851],{"class":553,"line":1148},[551,21852,17345],{},[551,21854,21855],{"class":553,"line":1154},[551,21856,21857],{},"        MessageBox.Show(\"Procesando B\");\n",[551,21859,21860],{"class":553,"line":1160},[551,21861,15907],{},[551,21863,21864],{"class":553,"line":1166},[551,21865,1193],{},[13,21867,21868,21870],{},[16,21869,9893],{}," (raro):",[543,21872,21874],{"className":545,"code":21873,"language":547,"meta":228,"style":228},"string tipoInstalacion = \"Industrial\";\nstring requisitosSeguirdad = \"\";\n\nswitch (tipoInstalacion)\n{\n    case \"Industrial\":\n        requisitosSeguirdad += \"- Señalización de emergencia\\n\";\n        goto case \"Comercial\";\n    case \"Comercial\":\n        requisitosSeguirdad += \"- Iluminación de emergencia\\n\";\n        goto case \"Residencial\";\n    case \"Residencial\":\n        requisitosSeguirdad += \"- Protección diferencial 30mA\\n\";\n        break;\n}\n\u002F\u002F Industrial tiene los 3 requisitos\n",[54,21875,21876,21881,21886,21890,21895,21899,21904,21909,21914,21919,21924,21929,21934,21939,21943,21947],{"__ignoreMap":228},[551,21877,21878],{"class":553,"line":554},[551,21879,21880],{},"string tipoInstalacion = \"Industrial\";\n",[551,21882,21883],{"class":553,"line":229},[551,21884,21885],{},"string requisitosSeguirdad = \"\";\n",[551,21887,21888],{"class":553,"line":670},[551,21889,1139],{"emptyLinePlaceholder":238},[551,21891,21892],{"class":553,"line":1136},[551,21893,21894],{},"switch (tipoInstalacion)\n",[551,21896,21897],{"class":553,"line":1142},[551,21898,1151],{},[551,21900,21901],{"class":553,"line":1148},[551,21902,21903],{},"    case \"Industrial\":\n",[551,21905,21906],{"class":553,"line":1154},[551,21907,21908],{},"        requisitosSeguirdad += \"- Señalización de emergencia\\n\";\n",[551,21910,21911],{"class":553,"line":1160},[551,21912,21913],{},"        goto case \"Comercial\";\n",[551,21915,21916],{"class":553,"line":1166},[551,21917,21918],{},"    case \"Comercial\":\n",[551,21920,21921],{"class":553,"line":1172},[551,21922,21923],{},"        requisitosSeguirdad += \"- Iluminación de emergencia\\n\";\n",[551,21925,21926],{"class":553,"line":1178},[551,21927,21928],{},"        goto case \"Residencial\";\n",[551,21930,21931],{"class":553,"line":1184},[551,21932,21933],{},"    case \"Residencial\":\n",[551,21935,21936],{"class":553,"line":1190},[551,21937,21938],{},"        requisitosSeguirdad += \"- Protección diferencial 30mA\\n\";\n",[551,21940,21941],{"class":553,"line":1472},[551,21942,15907],{},[551,21944,21945],{"class":553,"line":1477},[551,21946,1193],{},[551,21948,21949],{"class":553,"line":1797},[551,21950,21951],{},"\u002F\u002F Industrial tiene los 3 requisitos\n",[13,21953,21954,41],{},[16,21955,21956],{},"Pero generalmente es mejor usar funciones o lógica clara",[331,21958,21960],{"id":21959},"enums-con-switch","Enums con switch",[13,21962,21963,21964,21967],{},"Los ",[54,21965,21966],{},"enum"," (enumeraciones) funcionan perfectamente con switch:",[543,21969,21971],{"className":545,"code":21970,"language":547,"meta":228,"style":228},"enum TipoProteccion\n{\n    TipoB,\n    TipoC,\n    TipoD\n}\n\nTipoProteccion tipo = TipoProteccion.TipoD;\n\nswitch (tipo)\n{\n    case TipoProteccion.TipoB:\n        MessageBox.Show(\"Para iluminación\");\n        break;\n    case TipoProteccion.TipoC:\n        MessageBox.Show(\"Para uso general\");\n        break;\n    case TipoProteccion.TipoD:\n        MessageBox.Show(\"Para motores\");\n        break;\n}\n",[54,21972,21973,21978,21982,21987,21992,21997,22001,22005,22010,22014,22018,22022,22027,22032,22036,22041,22046,22050,22055,22060,22064],{"__ignoreMap":228},[551,21974,21975],{"class":553,"line":554},[551,21976,21977],{},"enum TipoProteccion\n",[551,21979,21980],{"class":553,"line":229},[551,21981,1151],{},[551,21983,21984],{"class":553,"line":670},[551,21985,21986],{},"    TipoB,\n",[551,21988,21989],{"class":553,"line":1136},[551,21990,21991],{},"    TipoC,\n",[551,21993,21994],{"class":553,"line":1142},[551,21995,21996],{},"    TipoD\n",[551,21998,21999],{"class":553,"line":1148},[551,22000,1193],{},[551,22002,22003],{"class":553,"line":1154},[551,22004,1139],{"emptyLinePlaceholder":238},[551,22006,22007],{"class":553,"line":1160},[551,22008,22009],{},"TipoProteccion tipo = TipoProteccion.TipoD;\n",[551,22011,22012],{"class":553,"line":1166},[551,22013,1139],{"emptyLinePlaceholder":238},[551,22015,22016],{"class":553,"line":1172},[551,22017,17321],{},[551,22019,22020],{"class":553,"line":1178},[551,22021,1151],{},[551,22023,22024],{"class":553,"line":1184},[551,22025,22026],{},"    case TipoProteccion.TipoB:\n",[551,22028,22029],{"class":553,"line":1190},[551,22030,22031],{},"        MessageBox.Show(\"Para iluminación\");\n",[551,22033,22034],{"class":553,"line":1472},[551,22035,15907],{},[551,22037,22038],{"class":553,"line":1477},[551,22039,22040],{},"    case TipoProteccion.TipoC:\n",[551,22042,22043],{"class":553,"line":1797},[551,22044,22045],{},"        MessageBox.Show(\"Para uso general\");\n",[551,22047,22048],{"class":553,"line":1802},[551,22049,15907],{},[551,22051,22052],{"class":553,"line":1808},[551,22053,22054],{},"    case TipoProteccion.TipoD:\n",[551,22056,22057],{"class":553,"line":1814},[551,22058,22059],{},"        MessageBox.Show(\"Para motores\");\n",[551,22061,22062],{"class":553,"line":1820},[551,22063,15907],{},[551,22065,22066],{"class":553,"line":1826},[551,22067,1193],{},[13,22069,22070],{},"Lo veremos en detalle en capítulos posteriores.",[331,22072,22074],{"id":22073},"pattern-matching-c-70","Pattern matching (C# 7.0+)",[13,22076,22077],{},"Switch moderno permite patrones más complejos:",[543,22079,22081],{"className":545,"code":22080,"language":547,"meta":228,"style":228},"object obj = 25;\n\nswitch (obj)\n{\n    case int i when i \u003C 16:\n        MessageBox.Show(\"Entero menor a 16\");\n        break;\n    case int i when i >= 16:\n        MessageBox.Show(\"Entero mayor o igual a 16\");\n        break;\n    case string s:\n        MessageBox.Show(\"Es un string\");\n        break;\n    default:\n        MessageBox.Show(\"Otro tipo\");\n        break;\n}\n",[54,22082,22083,22088,22092,22097,22101,22106,22111,22115,22120,22125,22129,22134,22139,22143,22147,22152,22156],{"__ignoreMap":228},[551,22084,22085],{"class":553,"line":554},[551,22086,22087],{},"object obj = 25;\n",[551,22089,22090],{"class":553,"line":229},[551,22091,1139],{"emptyLinePlaceholder":238},[551,22093,22094],{"class":553,"line":670},[551,22095,22096],{},"switch (obj)\n",[551,22098,22099],{"class":553,"line":1136},[551,22100,1151],{},[551,22102,22103],{"class":553,"line":1142},[551,22104,22105],{},"    case int i when i \u003C 16:\n",[551,22107,22108],{"class":553,"line":1148},[551,22109,22110],{},"        MessageBox.Show(\"Entero menor a 16\");\n",[551,22112,22113],{"class":553,"line":1154},[551,22114,15907],{},[551,22116,22117],{"class":553,"line":1160},[551,22118,22119],{},"    case int i when i >= 16:\n",[551,22121,22122],{"class":553,"line":1166},[551,22123,22124],{},"        MessageBox.Show(\"Entero mayor o igual a 16\");\n",[551,22126,22127],{"class":553,"line":1172},[551,22128,15907],{},[551,22130,22131],{"class":553,"line":1178},[551,22132,22133],{},"    case string s:\n",[551,22135,22136],{"class":553,"line":1184},[551,22137,22138],{},"        MessageBox.Show(\"Es un string\");\n",[551,22140,22141],{"class":553,"line":1190},[551,22142,15907],{},[551,22144,22145],{"class":553,"line":1472},[551,22146,15926],{},[551,22148,22149],{"class":553,"line":1477},[551,22150,22151],{},"        MessageBox.Show(\"Otro tipo\");\n",[551,22153,22154],{"class":553,"line":1797},[551,22155,15907],{},[551,22157,22158],{"class":553,"line":1802},[551,22159,1193],{},[331,22161,5121],{"id":5120},[13,22163,22164],{},[16,22165,22166],{},"1. Siempre incluye default",[13,22168,22169,22170,22172],{},"Aunque creas que cubriste todos los casos, siempre incluye ",[54,22171,18156],{}," para casos inesperados.",[13,22174,22175],{},[16,22176,22177],{},"2. Ordena los casos lógicamente",[543,22179,22181],{"className":545,"code":22180,"language":547,"meta":228,"style":228},"\u002F\u002F Bien: orden lógico (de menor a mayor)\nswitch (corriente)\n{\n    case 10:\n        \u002F\u002F ...\n    case 16:\n        \u002F\u002F ...\n    case 20:\n        \u002F\u002F ...\n    case 25:\n        \u002F\u002F ...\n}\n",[54,22182,22183,22188,22192,22196,22200,22205,22209,22213,22217,22221,22225,22229],{"__ignoreMap":228},[551,22184,22185],{"class":553,"line":554},[551,22186,22187],{},"\u002F\u002F Bien: orden lógico (de menor a mayor)\n",[551,22189,22190],{"class":553,"line":229},[551,22191,18346],{},[551,22193,22194],{"class":553,"line":670},[551,22195,1151],{},[551,22197,22198],{"class":553,"line":1136},[551,22199,17464],{},[551,22201,22202],{"class":553,"line":1142},[551,22203,22204],{},"        \u002F\u002F ...\n",[551,22206,22207],{"class":553,"line":1148},[551,22208,17478],{},[551,22210,22211],{"class":553,"line":1154},[551,22212,22204],{},[551,22214,22215],{"class":553,"line":1160},[551,22216,17492],{},[551,22218,22219],{"class":553,"line":1166},[551,22220,22204],{},[551,22222,22223],{"class":553,"line":1172},[551,22224,17506],{},[551,22226,22227],{"class":553,"line":1178},[551,22228,22204],{},[551,22230,22231],{"class":553,"line":1184},[551,22232,1193],{},[13,22234,22235],{},[16,22236,22237],{},"3. Usa constantes para valores repetidos",[543,22239,22241],{"className":545,"code":22240,"language":547,"meta":228,"style":228},"const string TIPO_MOTOR = \"Motor\";\nconst string TIPO_ILUMINACION = \"Iluminacion\";\n\nswitch (tipoCarga)\n{\n    case TIPO_MOTOR:\n        \u002F\u002F ...\n    case TIPO_ILUMINACION:\n        \u002F\u002F ...\n}\n",[54,22242,22243,22247,22252,22256,22260,22264,22269,22273,22278,22282],{"__ignoreMap":228},[551,22244,22245],{"class":553,"line":554},[551,22246,17374],{},[551,22248,22249],{"class":553,"line":229},[551,22250,22251],{},"const string TIPO_ILUMINACION = \"Iluminacion\";\n",[551,22253,22254],{"class":553,"line":670},[551,22255,1139],{"emptyLinePlaceholder":238},[551,22257,22258],{"class":553,"line":1136},[551,22259,15888],{},[551,22261,22262],{"class":553,"line":1142},[551,22263,1151],{},[551,22265,22266],{"class":553,"line":1148},[551,22267,22268],{},"    case TIPO_MOTOR:\n",[551,22270,22271],{"class":553,"line":1154},[551,22272,22204],{},[551,22274,22275],{"class":553,"line":1160},[551,22276,22277],{},"    case TIPO_ILUMINACION:\n",[551,22279,22280],{"class":553,"line":1166},[551,22281,22204],{},[551,22283,22284],{"class":553,"line":1172},[551,22285,1193],{},[13,22287,22288],{},[16,22289,22290],{},"4. No abuses del switch para lógica compleja",[13,22292,22293],{},"Si cada caso tiene 20 líneas de código, considera usar funciones:",[543,22295,22297],{"className":545,"code":22296,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: casos con mucho código\nswitch (tipo)\n{\n    case \"A\":\n        \u002F\u002F 20 líneas de código...\n        break;\n    case \"B\":\n        \u002F\u002F 20 líneas de código...\n        break;\n}\n\n\u002F\u002F Mejor: delegar a funciones\nswitch (tipo)\n{\n    case \"A\":\n        ProcesarTipoA();\n        break;\n    case \"B\":\n        ProcesarTipoB();\n        break;\n}\n",[54,22298,22299,22304,22308,22312,22316,22321,22325,22329,22333,22337,22341,22345,22350,22354,22358,22362,22367,22371,22375,22380,22384],{"__ignoreMap":228},[551,22300,22301],{"class":553,"line":554},[551,22302,22303],{},"\u002F\u002F Mal: casos con mucho código\n",[551,22305,22306],{"class":553,"line":229},[551,22307,17321],{},[551,22309,22310],{"class":553,"line":670},[551,22311,1151],{},[551,22313,22314],{"class":553,"line":1136},[551,22315,17330],{},[551,22317,22318],{"class":553,"line":1142},[551,22319,22320],{},"        \u002F\u002F 20 líneas de código...\n",[551,22322,22323],{"class":553,"line":1148},[551,22324,15907],{},[551,22326,22327],{"class":553,"line":1154},[551,22328,17345],{},[551,22330,22331],{"class":553,"line":1160},[551,22332,22320],{},[551,22334,22335],{"class":553,"line":1166},[551,22336,15907],{},[551,22338,22339],{"class":553,"line":1172},[551,22340,1193],{},[551,22342,22343],{"class":553,"line":1178},[551,22344,1139],{"emptyLinePlaceholder":238},[551,22346,22347],{"class":553,"line":1184},[551,22348,22349],{},"\u002F\u002F Mejor: delegar a funciones\n",[551,22351,22352],{"class":553,"line":1190},[551,22353,17321],{},[551,22355,22356],{"class":553,"line":1472},[551,22357,1151],{},[551,22359,22360],{"class":553,"line":1477},[551,22361,17330],{},[551,22363,22364],{"class":553,"line":1797},[551,22365,22366],{},"        ProcesarTipoA();\n",[551,22368,22369],{"class":553,"line":1802},[551,22370,15907],{},[551,22372,22373],{"class":553,"line":1808},[551,22374,17345],{},[551,22376,22377],{"class":553,"line":1814},[551,22378,22379],{},"        ProcesarTipoB();\n",[551,22381,22382],{"class":553,"line":1820},[551,22383,15907],{},[551,22385,22386],{"class":553,"line":1826},[551,22387,1193],{},[331,22389,5309],{"id":5308},[367,22391,22393],{"id":22392},"error-1-olvidar-break","Error 1: Olvidar break",[543,22395,22397],{"className":545,"code":22396,"language":547,"meta":228,"style":228},"switch (tipo)\n{\n    case \"A\":\n        MessageBox.Show(\"A\");\n        \u002F\u002F Sin break - ERROR de compilación\n    case \"B\":\n        MessageBox.Show(\"B\");\n        break;\n}\n",[54,22398,22399,22403,22407,22411,22416,22421,22425,22430,22434],{"__ignoreMap":228},[551,22400,22401],{"class":553,"line":554},[551,22402,17321],{},[551,22404,22405],{"class":553,"line":229},[551,22406,1151],{},[551,22408,22409],{"class":553,"line":670},[551,22410,17330],{},[551,22412,22413],{"class":553,"line":1136},[551,22414,22415],{},"        MessageBox.Show(\"A\");\n",[551,22417,22418],{"class":553,"line":1142},[551,22419,22420],{},"        \u002F\u002F Sin break - ERROR de compilación\n",[551,22422,22423],{"class":553,"line":1148},[551,22424,17345],{},[551,22426,22427],{"class":553,"line":1154},[551,22428,22429],{},"        MessageBox.Show(\"B\");\n",[551,22431,22432],{"class":553,"line":1160},[551,22433,15907],{},[551,22435,22436],{"class":553,"line":1166},[551,22437,1193],{},[13,22439,22440,22442,22443,4000,22445,4000,22448,2854,22451,41],{},[16,22441,1983],{},": Siempre pon ",[54,22444,21805],{},[54,22446,22447],{},"return",[54,22449,22450],{},"goto",[54,22452,22453],{},"throw",[43,22455],{},[367,22457,22459],{"id":22458},"error-2-usar-variables-no-constantes-en-case","Error 2: Usar variables no constantes en case",[543,22461,22463],{"className":545,"code":22462,"language":547,"meta":228,"style":228},"int limite = 16;\n\nswitch (corriente)\n{\n    case limite:  \u002F\u002F ERROR: debe ser constante\n        break;\n}\n",[54,22464,22465,22469,22473,22477,22481,22486,22490],{"__ignoreMap":228},[551,22466,22467],{"class":553,"line":554},[551,22468,17379],{},[551,22470,22471],{"class":553,"line":229},[551,22472,1139],{"emptyLinePlaceholder":238},[551,22474,22475],{"class":553,"line":670},[551,22476,18346],{},[551,22478,22479],{"class":553,"line":1136},[551,22480,1151],{},[551,22482,22483],{"class":553,"line":1142},[551,22484,22485],{},"    case limite:  \u002F\u002F ERROR: debe ser constante\n",[551,22487,22488],{"class":553,"line":1148},[551,22489,15907],{},[551,22491,22492],{"class":553,"line":1154},[551,22493,1193],{},[13,22495,22496,1068,22498,22500],{},[16,22497,1983],{},[54,22499,5077],{}," o literal:",[543,22502,22504],{"className":545,"code":22503,"language":547,"meta":228,"style":228},"const int LIMITE = 16;\n\nswitch (corriente)\n{\n    case LIMITE:  \u002F\u002F OK\n        break;\n}\n",[54,22505,22506,22511,22515,22519,22523,22528,22532],{"__ignoreMap":228},[551,22507,22508],{"class":553,"line":554},[551,22509,22510],{},"const int LIMITE = 16;\n",[551,22512,22513],{"class":553,"line":229},[551,22514,1139],{"emptyLinePlaceholder":238},[551,22516,22517],{"class":553,"line":670},[551,22518,18346],{},[551,22520,22521],{"class":553,"line":1136},[551,22522,1151],{},[551,22524,22525],{"class":553,"line":1142},[551,22526,22527],{},"    case LIMITE:  \u002F\u002F OK\n",[551,22529,22530],{"class":553,"line":1148},[551,22531,15907],{},[551,22533,22534],{"class":553,"line":1154},[551,22535,1193],{},[43,22537],{},[367,22539,22541],{"id":22540},"error-3-usar-tipos-no-soportados","Error 3: Usar tipos no soportados",[543,22543,22545],{"className":545,"code":22544,"language":547,"meta":228,"style":228},"double voltaje = 230.5;\n\nswitch (voltaje)  \u002F\u002F ERROR: double no soportado\n{\n    case 230.0:\n        break;\n}\n",[54,22546,22547,22551,22555,22560,22564,22569,22573],{"__ignoreMap":228},[551,22548,22549],{"class":553,"line":554},[551,22550,2698],{},[551,22552,22553],{"class":553,"line":229},[551,22554,1139],{"emptyLinePlaceholder":238},[551,22556,22557],{"class":553,"line":670},[551,22558,22559],{},"switch (voltaje)  \u002F\u002F ERROR: double no soportado\n",[551,22561,22562],{"class":553,"line":1136},[551,22563,1151],{},[551,22565,22566],{"class":553,"line":1142},[551,22567,22568],{},"    case 230.0:\n",[551,22570,22571],{"class":553,"line":1148},[551,22572,15907],{},[551,22574,22575],{"class":553,"line":1154},[551,22576,1193],{},[13,22578,22579,1068,22581,22583],{},[16,22580,1983],{},[54,22582,18766],{}," para double\u002Ffloat.",[43,22585],{},[46,22587,5452],{"id":5451},[331,22589,22591],{"id":22590},"desafío-1-convertidor-de-grados-de-protección-ip-a-texto","Desafío 1: Convertidor de grados de protección IP a texto",[13,22593,22594,5465],{},[16,22595,5464],{},[13,22597,22598],{},"Crea un script que convierta códigos IP (20, 44, 54, 65, 67, 68) a descripciones completas incluyendo:",[126,22600,22601,22604,22607],{},[88,22602,22603],{},"Protección contra sólidos",[88,22605,22606],{},"Protección contra líquidos",[88,22608,22609],{},"Aplicaciones típicas",[5487,22611,22612,22614],{},[5490,22613,5492],{},[13,22615,22616],{},"Usa switch con el código IP completo y asigna descripciones detalladas a cada caso.",[43,22618],{},[331,22620,22622],{"id":22621},"desafío-2-decodificador-de-designaciones-iec","Desafío 2: Decodificador de designaciones IEC",[13,22624,22625,16488],{},[16,22626,5464],{},[13,22628,22629],{},"Crea un script que identifique el tipo de componente por su letra de designación IEC:",[126,22631,22632,22635,22638,22641,22644,22647],{},[88,22633,22634],{},"K = Contactor, relé",[88,22636,22637],{},"Q = Interruptor, seccionador",[88,22639,22640],{},"F = Protección",[88,22642,22643],{},"M = Motor",[88,22645,22646],{},"T = Transformador",[88,22648,22649],{},"etc.",[13,22651,22652],{},"Y genere una descripción del propósito típico.",[43,22654],{},[331,22656,22658],{"id":22657},"desafío-3-configurador-de-curvas-de-magnetotérmicos-extendido","Desafío 3: Configurador de curvas de magnetotérmicos extendido",[13,22660,22661,10447],{},[16,22662,5464],{},[13,22664,22665],{},"Crea un script completo que:",[85,22667,22668,22671,22674,22677],{},[88,22669,22670],{},"Reciba: tipo de carga, corriente nominal, voltaje, número de polos",[88,22672,22673],{},"Determine: curva de disparo (B\u002FC\u002FD\u002FK\u002FZ), corriente nominal, número de polos",[88,22675,22676],{},"Genere: código de artículo automático en formato estándar",[88,22678,22679],{},"Calcule: poder de corte necesario según instalación",[43,22681],{},[46,22683,22685],{"id":22684},"resumen","Resumen",[13,22687,22688],{},"En este capítulo aprendiste:",[126,22690,22691,22697,22703,22709,22715,22721],{},[88,22692,22693,22696],{},[16,22694,22695],{},"Estructura switch",": Comparar una variable contra múltiples valores constantes",[88,22698,22699,22702],{},[16,22700,22701],{},"Casos múltiples",": Varios case ejecutando el mismo código",[88,22704,22705,22708],{},[16,22706,22707],{},"Caso default",": Manejar valores no esperados",[88,22710,22711,22714],{},[16,22712,22713],{},"Cuándo usar switch vs if\u002Felse",": Criterios de decisión",[88,22716,22717,22720],{},[16,22718,22719],{},"Switch expressions",": Sintaxis moderna más compacta (C# 8.0+)",[88,22722,22723,22726],{},[16,22724,22725],{},"Proyecto construido",": Configurador de componentes eléctricos con base de datos",[13,22728,22729,416],{},[16,22730,22731],{},"Conceptos clave",[126,22733,22734,22737,22740,22743,22746],{},[88,22735,22736],{},"Switch es ideal para comparar una variable contra muchos valores específicos",[88,22738,22739],{},"Cada case debe terminar con break (o return\u002Fgoto\u002Fthrow)",[88,22741,22742],{},"El default es opcional pero muy recomendable",[88,22744,22745],{},"Solo funciona con int, string, char, enum, bool (no double\u002Ffloat)",[88,22747,22748],{},"Para rangos o condiciones complejas, usa if\u002Felse if",[43,22750],{},[46,22752,10523],{"id":10522},[126,22754,22755,22762,22768],{},[88,22756,16557,22757],{},[955,22758,22761],{"href":22759,"rel":22760},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Fstatements\u002Fselection-statements#the-switch-statement",[959],"Documentación de C# - switch",[88,22763,16557,22764],{},[955,22765,22719],{"href":22766,"rel":22767},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Foperators\u002Fswitch-expression",[959],[88,22769],{},[43,22771],{},[46,22773,5728],{"id":5727},[331,22775,22777],{"id":22776},"p-puedo-usar-switch-con-double-o-float","P: ¿Puedo usar switch con double o float?",[13,22779,22780,22782],{},[16,22781,5737],{}," No. Switch solo funciona con int, string, char, enum, bool. Para double\u002Ffloat usa if\u002Felse if.",[331,22784,22786],{"id":22785},"p-qué-pasa-si-olvido-el-break","P: ¿Qué pasa si olvido el break?",[13,22788,22789,22791],{},[16,22790,5737],{}," Error de compilación. C# obliga a terminar cada case con break, return, goto o throw.",[331,22793,22795],{"id":22794},"p-cuándo-usar-switch-expression-vs-switch-tradicional","P: ¿Cuándo usar switch expression vs switch tradicional?",[13,22797,22798,22800],{},[16,22799,5737],{}," Usa switch expression para asignaciones simples de una línea. Usa switch tradicional cuando cada caso necesita múltiples líneas de código.",[331,22802,22804],{"id":22803},"p-puedo-tener-un-case-vacío","P: ¿Puedo tener un case vacío?",[13,22806,22807,22809],{},[16,22808,5737],{}," Sí, para agrupar casos:",[543,22811,22813],{"className":545,"code":22812,"language":547,"meta":228,"style":228},"case \"A\":\ncase \"B\":\n    \u002F\u002F Código para ambos\n    break;\n",[54,22814,22815,22820,22825,22830],{"__ignoreMap":228},[551,22816,22817],{"class":553,"line":554},[551,22818,22819],{},"case \"A\":\n",[551,22821,22822],{"class":553,"line":229},[551,22823,22824],{},"case \"B\":\n",[551,22826,22827],{"class":553,"line":670},[551,22828,22829],{},"    \u002F\u002F Código para ambos\n",[551,22831,22832],{"class":553,"line":1136},[551,22833,22834],{},"    break;\n",[331,22836,22838],{"id":22837},"p-el-orden-de-los-cases-importa","P: ¿El orden de los cases importa?",[13,22840,22841,22843],{},[16,22842,5737],{}," No afecta la funcionalidad, pero ordénalos lógicamente para legibilidad.",[43,22845],{},[46,22847,10615],{"id":10614},[13,22849,10618],{},[126,22851,22853,22859,22865,22871,22877,22883,22889,22895,22901,22907],{"className":22852},[275],[88,22854,22856,22858],{"className":22855},[279],[281,22857],{"disabled":238,"type":283}," Entender la sintaxis básica de switch",[88,22860,22862,22864],{"className":22861},[279],[281,22863],{"disabled":238,"type":283}," Saber cuándo usar switch vs if\u002Felse if",[88,22866,22868,22870],{"className":22867},[279],[281,22869],{"disabled":238,"type":283}," Poder agrupar múltiples cases",[88,22872,22874,22876],{"className":22873},[279],[281,22875],{"disabled":238,"type":283}," Siempre incluir break en cada case",[88,22878,22880,22882],{"className":22879},[279],[281,22881],{"disabled":238,"type":283}," Usar default para casos no previstos",[88,22884,22886,22888],{"className":22885},[279],[281,22887],{"disabled":238,"type":283}," Conocer las limitaciones de switch (tipos soportados)",[88,22890,22892,22894],{"className":22891},[279],[281,22893],{"disabled":238,"type":283}," Haber ejecutado exitosamente el configurador de componentes",[88,22896,22898,22900],{"className":22897},[279],[281,22899],{"disabled":238,"type":283}," Poder agregar nuevos componentes al switch",[88,22902,22904,22906],{"className":22903},[279],[281,22905],{"disabled":238,"type":283}," (Opcional) Conocer switch expressions",[88,22908,22910,10669],{"className":22909},[279],[281,22911],{"disabled":238,"type":283},[43,22913],{},[13,22915,22916,10676,22918,22920,22921,93,22923],{},[31,22917,657],{},[31,22919,10679],{},": 40-50 minutos\n",[31,22922,10683],{},[54,22924,22925],{},"code\u002Fcap-06\u002F",[660,22927,662],{},{"title":228,"searchDepth":229,"depth":229,"links":22929},[22930,22931,22932,22933,22943,22952,22959,22964,22965,22966,22973],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":22934},[22935,22936,22937,22938,22939,22940,22941,22942],{"id":16880,"depth":670,"text":16881},{"id":16998,"depth":670,"text":16999},{"id":17179,"depth":670,"text":17180},{"id":17427,"depth":670,"text":17428},{"id":17826,"depth":670,"text":17827},{"id":18149,"depth":670,"text":18150},{"id":18434,"depth":670,"text":18435},{"id":18834,"depth":670,"text":18835},{"id":4024,"depth":229,"text":4025,"children":22944},[22945,22946,22947,22948,22949,22950,22951],{"id":4031,"depth":670,"text":4032},{"id":19203,"depth":670,"text":19204},{"id":19382,"depth":670,"text":19383},{"id":19549,"depth":670,"text":19550},{"id":20123,"depth":670,"text":20124},{"id":20268,"depth":670,"text":20269},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":22953},[22954,22955,22956,22957,22958],{"id":21798,"depth":670,"text":21799},{"id":21959,"depth":670,"text":21960},{"id":22073,"depth":670,"text":22074},{"id":5120,"depth":670,"text":5121},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":5452,"children":22960},[22961,22962,22963],{"id":22590,"depth":670,"text":22591},{"id":22621,"depth":670,"text":22622},{"id":22657,"depth":670,"text":22658},{"id":22684,"depth":229,"text":22685},{"id":10522,"depth":229,"text":10523},{"id":5727,"depth":229,"text":5728,"children":22967},[22968,22969,22970,22971,22972],{"id":22776,"depth":670,"text":22777},{"id":22785,"depth":670,"text":22786},{"id":22794,"depth":670,"text":22795},{"id":22803,"depth":670,"text":22804},{"id":22837,"depth":670,"text":22838},{"id":10614,"depth":229,"text":10615},"Domina switch y el control de flujo en C# para escribir scripts EPLAN más claros y automatizar EPLAN Electric P8 con menos código.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-06-control-flujo-switch",{"title":16762,"description":22974},"guia\u002Ffundamentos\u002Fcap-06-control-flujo-switch","DII-queFJxJ2XqHdYVGre9k6fW6RqXkZWTISmai3KFc",{"id":22981,"title":22982,"body":22983,"description":29302,"extension":236,"meta":29303,"navigation":238,"path":29304,"seo":29305,"stem":29306,"tagline":242,"__hash__":29307},"guia\u002Fguia\u002Ffundamentos\u002Fcap-07-bucles-loops.md","Capítulo 7: Bucles (loops) en C#",{"type":7,"value":22984,"toc":29257},[22985,22996,22998,23000,23002,23068,23070,23072,23074,23088,23090,23092,23097,23099,23113,23118,23120,23122,23126,23129,23143,23148,23197,23202,23244,23247,23249,23253,23264,23268,23291,23296,23324,23329,23359,23363,23403,23408,23414,23418,23423,23464,23469,23535,23540,23590,23594,23599,23627,23632,23660,23665,23707,23709,23713,23723,23727,23750,23754,23786,23790,23795,23827,23833,23864,23869,23881,23885,23890,23997,24002,24053,24058,24156,24158,24162,24171,24175,24198,24202,24243,24247,24252,24274,24280,24335,24339,24344,24405,24410,24504,24509,24618,24622,24628,24667,24672,24706,24708,24712,24721,24725,24749,24754,24759,24794,24799,24835,24839,24845,24969,24974,25061,25063,25067,25071,25116,25121,25189,25193,25238,25243,25320,25324,25395,25397,25401,25410,25414,25479,25485,25489,25494,25586,25591,25777,25782,25902,25906,25912,25960,25966,25968,25970,25975,25977,26096,26098,26102,26309,26316,26318,26322,26537,26544,26546,26550,26747,26754,26756,26760,26973,26978,26980,26984,27228,27239,27241,27245,27395,27397,27399,28349,28351,28353,28357,28363,28369,28424,28434,28438,28441,28486,28492,28496,28502,28543,28548,28591,28593,28598,28678,28683,28760,28765,28823,28825,28829,28892,28894,28898,28962,28964,28968,29038,29040,29042,29046,29050,29053,29060,29062,29066,29070,29084,29086,29090,29094,29097,29108,29111,29113,29115,29126,29128,29130,29134,29144,29148,29158,29162,29167,29171,29176,29180,29185,29187,29189,29191,29241,29243,29255],[10,22986,22987],{},[13,22988,22989,19,22991,19,22994,262],{},[16,22990,256],{},[16,22992,22993],{},"Sección 2: Programación desde cero",[16,22995,25],{},[43,22997],{},[46,22999,268],{"id":267},[13,23001,702],{},[126,23003,23005,23014,23023,23032,23041,23050,23059],{"className":23004},[275],[88,23006,23008,73,23010,23013],{"className":23007},[279],[281,23009],{"disabled":238,"type":283},[16,23011,23012],{},"Usar bucles for"," para repetir código un número específico de veces",[88,23015,23017,73,23019,23022],{"className":23016},[279],[281,23018],{"disabled":238,"type":283},[16,23020,23021],{},"Usar foreach"," para iterar colecciones de datos",[88,23024,23026,73,23028,23031],{"className":23025},[279],[281,23027],{"disabled":238,"type":283},[16,23029,23030],{},"Usar while"," para repetir mientras se cumpla una condición",[88,23033,23035,73,23037,23040],{"className":23034},[279],[281,23036],{"disabled":238,"type":283},[16,23038,23039],{},"Usar do-while"," cuando necesitas ejecutar al menos una vez",[88,23042,23044,73,23046,23049],{"className":23043},[279],[281,23045],{"disabled":238,"type":283},[16,23047,23048],{},"Controlar bucles"," con break y continue",[88,23051,23053,73,23055,23058],{"className":23052},[279],[281,23054],{"disabled":238,"type":283},[16,23056,23057],{},"Anidar bucles"," para procesar estructuras complejas",[88,23060,23062,73,23064,23067],{"className":23061},[279],[281,23063],{"disabled":238,"type":283},[16,23065,23066],{},"Construir procesadores"," automáticos de listas de componentes",[43,23069],{},[46,23071,320],{"id":319},[13,23073,726],{},[126,23075,23076,23079,23082,23085],{},[88,23077,23078],{},"Haber completado el Capítulo 6",[88,23080,23081],{},"Entender estructuras if\u002Felse y switch",[88,23083,23084],{},"Conocer variables y operadores",[88,23086,23087],{},"Saber usar operadores de comparación",[43,23089],{},[46,23091,740],{"id":739},[13,23093,23094],{},[16,23095,23096],{},"Procesador Automático de Componentes Eléctricos",[13,23098,5969],{},[126,23100,23101,23104,23107,23110],{},[88,23102,23103],{},"Procesa listas de componentes automáticamente",[88,23105,23106],{},"Calcula resistencias en serie y paralelo",[88,23108,23109],{},"Genera reportes de múltiples circuitos",[88,23111,23112],{},"Valida datos de forma masiva",[13,23114,23115,23117],{},[16,23116,753],{},": 50-60 minutos",[43,23119],{},[46,23121,329],{"id":328},[331,23123,23125],{"id":23124},"_1-introducción-el-problema-de-las-tareas-repetitivas","1. Introducción: El problema de las tareas repetitivas",[13,23127,23128],{},"Imagina que necesitas:",[126,23130,23131,23134,23137,23140],{},[88,23132,23133],{},"Verificar 50 componentes en una lista",[88,23135,23136],{},"Calcular la resistencia total de 20 resistencias en serie",[88,23138,23139],{},"Generar 15 reportes con el mismo formato",[88,23141,23142],{},"Procesar 100 cables para verificar secciones",[13,23144,23145,416],{},[16,23146,23147],{},"Sin bucles",[543,23149,23151],{"className":545,"code":23150,"language":547,"meta":228,"style":228},"double resistencia1 = 100.0;\ndouble resistencia2 = 220.0;\ndouble resistencia3 = 330.0;\ndouble resistencia4 = 470.0;\ndouble resistencia5 = 560.0;\n\u002F\u002F ... repetir 15 veces más\n\ndouble total = resistencia1 + resistencia2 + resistencia3 + resistencia4 + resistencia5;\n\u002F\u002F Tedioso, propenso a errores, difícil de mantener\n",[54,23152,23153,23158,23163,23168,23173,23178,23183,23187,23192],{"__ignoreMap":228},[551,23154,23155],{"class":553,"line":554},[551,23156,23157],{},"double resistencia1 = 100.0;\n",[551,23159,23160],{"class":553,"line":229},[551,23161,23162],{},"double resistencia2 = 220.0;\n",[551,23164,23165],{"class":553,"line":670},[551,23166,23167],{},"double resistencia3 = 330.0;\n",[551,23169,23170],{"class":553,"line":1136},[551,23171,23172],{},"double resistencia4 = 470.0;\n",[551,23174,23175],{"class":553,"line":1142},[551,23176,23177],{},"double resistencia5 = 560.0;\n",[551,23179,23180],{"class":553,"line":1148},[551,23181,23182],{},"\u002F\u002F ... repetir 15 veces más\n",[551,23184,23185],{"class":553,"line":1154},[551,23186,1139],{"emptyLinePlaceholder":238},[551,23188,23189],{"class":553,"line":1160},[551,23190,23191],{},"double total = resistencia1 + resistencia2 + resistencia3 + resistencia4 + resistencia5;\n",[551,23193,23194],{"class":553,"line":1166},[551,23195,23196],{},"\u002F\u002F Tedioso, propenso a errores, difícil de mantener\n",[13,23198,23199,416],{},[16,23200,23201],{},"Con bucles",[543,23203,23205],{"className":545,"code":23204,"language":547,"meta":228,"style":228},"double[] resistencias = {100, 220, 330, 470, 560, 680, 820, 1000};\ndouble total = 0;\n\nfor (int i = 0; i \u003C resistencias.Length; i++)\n{\n    total += resistencias[i];\n}\n\u002F\u002F Limpio, escalable, fácil de mantener\n",[54,23206,23207,23212,23217,23221,23226,23230,23235,23239],{"__ignoreMap":228},[551,23208,23209],{"class":553,"line":554},[551,23210,23211],{},"double[] resistencias = {100, 220, 330, 470, 560, 680, 820, 1000};\n",[551,23213,23214],{"class":553,"line":229},[551,23215,23216],{},"double total = 0;\n",[551,23218,23219],{"class":553,"line":670},[551,23220,1139],{"emptyLinePlaceholder":238},[551,23222,23223],{"class":553,"line":1136},[551,23224,23225],{},"for (int i = 0; i \u003C resistencias.Length; i++)\n",[551,23227,23228],{"class":553,"line":1142},[551,23229,1151],{},[551,23231,23232],{"class":553,"line":1148},[551,23233,23234],{},"    total += resistencias[i];\n",[551,23236,23237],{"class":553,"line":1154},[551,23238,1193],{},[551,23240,23241],{"class":553,"line":1160},[551,23242,23243],{},"\u002F\u002F Limpio, escalable, fácil de mantener\n",[13,23245,23246],{},"Los bucles son la base de la automatización.",[43,23248],{},[331,23250,23252],{"id":23251},"_2-bucle-for-contador-conocido","2. Bucle for - Contador conocido",[13,23254,23255,23256,23259,23260,23263],{},"El bucle ",[54,23257,23258],{},"for"," se usa cuando ",[16,23261,23262],{},"sabes cuántas veces"," quieres repetir algo.",[367,23265,23267],{"id":23266},"_21-sintaxis-básica","2.1 Sintaxis básica",[543,23269,23271],{"className":545,"code":23270,"language":547,"meta":228,"style":228},"for (inicialización; condición; incremento)\n{\n    \u002F\u002F Código que se repite\n}\n",[54,23272,23273,23278,23282,23287],{"__ignoreMap":228},[551,23274,23275],{"class":553,"line":554},[551,23276,23277],{},"for (inicialización; condición; incremento)\n",[551,23279,23280],{"class":553,"line":229},[551,23281,1151],{},[551,23283,23284],{"class":553,"line":670},[551,23285,23286],{},"    \u002F\u002F Código que se repite\n",[551,23288,23289],{"class":553,"line":1136},[551,23290,1193],{},[13,23292,23293,416],{},[16,23294,23295],{},"Ejemplo simple",[543,23297,23299],{"className":545,"code":23298,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 5; i++)\n{\n    MessageBox.Show(\"Iteración número: \" + i);\n}\n\u002F\u002F Muestra: 0, 1, 2, 3, 4\n",[54,23300,23301,23306,23310,23315,23319],{"__ignoreMap":228},[551,23302,23303],{"class":553,"line":554},[551,23304,23305],{},"for (int i = 0; i \u003C 5; i++)\n",[551,23307,23308],{"class":553,"line":229},[551,23309,1151],{},[551,23311,23312],{"class":553,"line":670},[551,23313,23314],{},"    MessageBox.Show(\"Iteración número: \" + i);\n",[551,23316,23317],{"class":553,"line":1136},[551,23318,1193],{},[551,23320,23321],{"class":553,"line":1142},[551,23322,23323],{},"\u002F\u002F Muestra: 0, 1, 2, 3, 4\n",[13,23325,23326,416],{},[16,23327,23328],{},"Anatomía",[543,23330,23332],{"className":545,"code":23331,"language":547,"meta":228,"style":228},"for (int i = 0;   i \u003C 5;   i++)\n     ↑            ↑         ↑\n     |            |         └─ Incremento: ejecuta después de cada iteración\n     |            └─────────── Condición: evalúa antes de cada iteración\n     └──────────────────────── Inicialización: ejecuta una sola vez al inicio\n",[54,23333,23334,23339,23344,23349,23354],{"__ignoreMap":228},[551,23335,23336],{"class":553,"line":554},[551,23337,23338],{},"for (int i = 0;   i \u003C 5;   i++)\n",[551,23340,23341],{"class":553,"line":229},[551,23342,23343],{},"     ↑            ↑         ↑\n",[551,23345,23346],{"class":553,"line":670},[551,23347,23348],{},"     |            |         └─ Incremento: ejecuta después de cada iteración\n",[551,23350,23351],{"class":553,"line":1136},[551,23352,23353],{},"     |            └─────────── Condición: evalúa antes de cada iteración\n",[551,23355,23356],{"class":553,"line":1142},[551,23357,23358],{},"     └──────────────────────── Inicialización: ejecuta una sola vez al inicio\n",[367,23360,23362],{"id":23361},"_22-cómo-funciona","2.2 Cómo funciona",[85,23364,23365,23374,23383,23390,23398],{},[88,23366,23367,93,23370,23373],{},[16,23368,23369],{},"Inicialización",[54,23371,23372],{},"int i = 0"," - Crea variable contador",[88,23375,23376,93,23379,23382],{},[16,23377,23378],{},"Condición",[54,23380,23381],{},"i \u003C 5"," - ¿Continuar? Si es true, ejecuta el bloque",[88,23384,23385,23387,23388],{},[16,23386,110],{},": Ejecuta el código dentro de ",[54,23389,11003],{},[88,23391,23392,93,23395,23397],{},[16,23393,23394],{},"Incremento",[54,23396,10579],{}," - Aumenta el contador",[88,23399,23400],{},[16,23401,23402],{},"Vuelve al paso 2",[13,23404,23405,416],{},[16,23406,23407],{},"Flujo visual",[543,23409,23412],{"className":23410,"code":23411,"language":847},[845],"i=0 → ¿i\u003C5? Sí → Ejecuta → i++ → i=1\ni=1 → ¿i\u003C5? Sí → Ejecuta → i++ → i=2\ni=2 → ¿i\u003C5? Sí → Ejecuta → i++ → i=3\ni=3 → ¿i\u003C5? Sí → Ejecuta → i++ → i=4\ni=4 → ¿i\u003C5? Sí → Ejecuta → i++ → i=5\ni=5 → ¿i\u003C5? No → Termina\n",[54,23413,23411],{"__ignoreMap":228},[367,23415,23417],{"id":23416},"_23-ejemplos-prácticos","2.3 Ejemplos prácticos",[13,23419,23420],{},[16,23421,23422],{},"Ejemplo 1: Generar secuencia de páginas",[543,23424,23426],{"className":545,"code":23425,"language":547,"meta":228,"style":228},"string paginas = \"Páginas del proyecto:\\n\";\n\nfor (int numeroPagina = 1; numeroPagina \u003C= 10; numeroPagina++)\n{\n    paginas += \"Página \" + numeroPagina + \"\\n\";\n}\n\nMessageBox.Show(paginas);\n",[54,23427,23428,23433,23437,23442,23446,23451,23455,23459],{"__ignoreMap":228},[551,23429,23430],{"class":553,"line":554},[551,23431,23432],{},"string paginas = \"Páginas del proyecto:\\n\";\n",[551,23434,23435],{"class":553,"line":229},[551,23436,1139],{"emptyLinePlaceholder":238},[551,23438,23439],{"class":553,"line":670},[551,23440,23441],{},"for (int numeroPagina = 1; numeroPagina \u003C= 10; numeroPagina++)\n",[551,23443,23444],{"class":553,"line":1136},[551,23445,1151],{},[551,23447,23448],{"class":553,"line":1142},[551,23449,23450],{},"    paginas += \"Página \" + numeroPagina + \"\\n\";\n",[551,23452,23453],{"class":553,"line":1148},[551,23454,1193],{},[551,23456,23457],{"class":553,"line":1154},[551,23458,1139],{"emptyLinePlaceholder":238},[551,23460,23461],{"class":553,"line":1160},[551,23462,23463],{},"MessageBox.Show(paginas);\n",[13,23465,23466],{},[16,23467,23468],{},"Ejemplo 2: Calcular potencias de 2",[543,23470,23472],{"className":545,"code":23471,"language":547,"meta":228,"style":228},"string resultado = \"Potencias de 2:\\n\";\n\nfor (int exponente = 0; exponente \u003C= 10; exponente++)\n{\n    double potencia = Math.Pow(2, exponente);\n    resultado += string.Format(\"2^{0} = {1}\\n\", exponente, potencia);\n}\n\nMessageBox.Show(resultado);\n\u002F\u002F 2^0 = 1\n\u002F\u002F 2^1 = 2\n\u002F\u002F 2^2 = 4\n\u002F\u002F ...\n",[54,23473,23474,23479,23483,23488,23492,23497,23502,23506,23510,23515,23520,23525,23530],{"__ignoreMap":228},[551,23475,23476],{"class":553,"line":554},[551,23477,23478],{},"string resultado = \"Potencias de 2:\\n\";\n",[551,23480,23481],{"class":553,"line":229},[551,23482,1139],{"emptyLinePlaceholder":238},[551,23484,23485],{"class":553,"line":670},[551,23486,23487],{},"for (int exponente = 0; exponente \u003C= 10; exponente++)\n",[551,23489,23490],{"class":553,"line":1136},[551,23491,1151],{},[551,23493,23494],{"class":553,"line":1142},[551,23495,23496],{},"    double potencia = Math.Pow(2, exponente);\n",[551,23498,23499],{"class":553,"line":1148},[551,23500,23501],{},"    resultado += string.Format(\"2^{0} = {1}\\n\", exponente, potencia);\n",[551,23503,23504],{"class":553,"line":1154},[551,23505,1193],{},[551,23507,23508],{"class":553,"line":1160},[551,23509,1139],{"emptyLinePlaceholder":238},[551,23511,23512],{"class":553,"line":1166},[551,23513,23514],{},"MessageBox.Show(resultado);\n",[551,23516,23517],{"class":553,"line":1172},[551,23518,23519],{},"\u002F\u002F 2^0 = 1\n",[551,23521,23522],{"class":553,"line":1178},[551,23523,23524],{},"\u002F\u002F 2^1 = 2\n",[551,23526,23527],{"class":553,"line":1184},[551,23528,23529],{},"\u002F\u002F 2^2 = 4\n",[551,23531,23532],{"class":553,"line":1190},[551,23533,23534],{},"\u002F\u002F ...\n",[13,23536,23537],{},[16,23538,23539],{},"Ejemplo 3: Sumar resistencias en serie",[543,23541,23543],{"className":545,"code":23542,"language":547,"meta":228,"style":228},"double[] resistencias = {100, 220, 330, 470, 560};\ndouble resistenciaTotal = 0;\n\nfor (int i = 0; i \u003C resistencias.Length; i++)\n{\n    resistenciaTotal += resistencias[i];\n}\n\nMessageBox.Show(string.Format(\"Resistencia total en serie: {0:F2} Ω\", resistenciaTotal));\n\u002F\u002F Resistencia total en serie: 1680.00 Ω\n",[54,23544,23545,23550,23555,23559,23563,23567,23572,23576,23580,23585],{"__ignoreMap":228},[551,23546,23547],{"class":553,"line":554},[551,23548,23549],{},"double[] resistencias = {100, 220, 330, 470, 560};\n",[551,23551,23552],{"class":553,"line":229},[551,23553,23554],{},"double resistenciaTotal = 0;\n",[551,23556,23557],{"class":553,"line":670},[551,23558,1139],{"emptyLinePlaceholder":238},[551,23560,23561],{"class":553,"line":1136},[551,23562,23225],{},[551,23564,23565],{"class":553,"line":1142},[551,23566,1151],{},[551,23568,23569],{"class":553,"line":1148},[551,23570,23571],{},"    resistenciaTotal += resistencias[i];\n",[551,23573,23574],{"class":553,"line":1154},[551,23575,1193],{},[551,23577,23578],{"class":553,"line":1160},[551,23579,1139],{"emptyLinePlaceholder":238},[551,23581,23582],{"class":553,"line":1166},[551,23583,23584],{},"MessageBox.Show(string.Format(\"Resistencia total en serie: {0:F2} Ω\", resistenciaTotal));\n",[551,23586,23587],{"class":553,"line":1172},[551,23588,23589],{},"\u002F\u002F Resistencia total en serie: 1680.00 Ω\n",[367,23591,23593],{"id":23592},"_24-variaciones-del-for","2.4 Variaciones del for",[13,23595,23596,416],{},[16,23597,23598],{},"Contar hacia atrás",[543,23600,23602],{"className":545,"code":23601,"language":547,"meta":228,"style":228},"for (int i = 10; i >= 1; i--)\n{\n    MessageBox.Show(\"Cuenta atrás: \" + i);\n}\n\u002F\u002F 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n",[54,23603,23604,23609,23613,23618,23622],{"__ignoreMap":228},[551,23605,23606],{"class":553,"line":554},[551,23607,23608],{},"for (int i = 10; i >= 1; i--)\n",[551,23610,23611],{"class":553,"line":229},[551,23612,1151],{},[551,23614,23615],{"class":553,"line":670},[551,23616,23617],{},"    MessageBox.Show(\"Cuenta atrás: \" + i);\n",[551,23619,23620],{"class":553,"line":1136},[551,23621,1193],{},[551,23623,23624],{"class":553,"line":1142},[551,23625,23626],{},"\u002F\u002F 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n",[13,23628,23629,416],{},[16,23630,23631],{},"Incremento de 2 en 2",[543,23633,23635],{"className":545,"code":23634,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C= 10; i += 2)\n{\n    MessageBox.Show(\"Número par: \" + i);\n}\n\u002F\u002F 0, 2, 4, 6, 8, 10\n",[54,23636,23637,23642,23646,23651,23655],{"__ignoreMap":228},[551,23638,23639],{"class":553,"line":554},[551,23640,23641],{},"for (int i = 0; i \u003C= 10; i += 2)\n",[551,23643,23644],{"class":553,"line":229},[551,23645,1151],{},[551,23647,23648],{"class":553,"line":670},[551,23649,23650],{},"    MessageBox.Show(\"Número par: \" + i);\n",[551,23652,23653],{"class":553,"line":1136},[551,23654,1193],{},[551,23656,23657],{"class":553,"line":1142},[551,23658,23659],{},"\u002F\u002F 0, 2, 4, 6, 8, 10\n",[13,23661,23662,23664],{},[16,23663,18806],{}," (poco común):",[543,23666,23668],{"className":545,"code":23667,"language":547,"meta":228,"style":228},"for (int i = 0, j = 10; i \u003C j; i++, j--)\n{\n    MessageBox.Show(string.Format(\"i={0}, j={1}\", i, j));\n}\n\u002F\u002F i=0, j=10\n\u002F\u002F i=1, j=9\n\u002F\u002F i=2, j=8\n\u002F\u002F ...\n",[54,23669,23670,23675,23679,23684,23688,23693,23698,23703],{"__ignoreMap":228},[551,23671,23672],{"class":553,"line":554},[551,23673,23674],{},"for (int i = 0, j = 10; i \u003C j; i++, j--)\n",[551,23676,23677],{"class":553,"line":229},[551,23678,1151],{},[551,23680,23681],{"class":553,"line":670},[551,23682,23683],{},"    MessageBox.Show(string.Format(\"i={0}, j={1}\", i, j));\n",[551,23685,23686],{"class":553,"line":1136},[551,23687,1193],{},[551,23689,23690],{"class":553,"line":1142},[551,23691,23692],{},"\u002F\u002F i=0, j=10\n",[551,23694,23695],{"class":553,"line":1148},[551,23696,23697],{},"\u002F\u002F i=1, j=9\n",[551,23699,23700],{"class":553,"line":1154},[551,23701,23702],{},"\u002F\u002F i=2, j=8\n",[551,23704,23705],{"class":553,"line":1160},[551,23706,23534],{},[43,23708],{},[331,23710,23712],{"id":23711},"_3-bucle-foreach-iterar-colecciones","3. Bucle foreach - Iterar colecciones",[13,23714,23255,23715,23718,23719,23722],{},[54,23716,23717],{},"foreach"," se usa para ",[16,23720,23721],{},"recorrer colecciones"," (arrays, listas) sin necesidad de índices.",[367,23724,23726],{"id":23725},"_31-sintaxis-básica","3.1 Sintaxis básica",[543,23728,23730],{"className":545,"code":23729,"language":547,"meta":228,"style":228},"foreach (tipo variable in coleccion)\n{\n    \u002F\u002F Código que se ejecuta para cada elemento\n}\n",[54,23731,23732,23737,23741,23746],{"__ignoreMap":228},[551,23733,23734],{"class":553,"line":554},[551,23735,23736],{},"foreach (tipo variable in coleccion)\n",[551,23738,23739],{"class":553,"line":229},[551,23740,1151],{},[551,23742,23743],{"class":553,"line":670},[551,23744,23745],{},"    \u002F\u002F Código que se ejecuta para cada elemento\n",[551,23747,23748],{"class":553,"line":1136},[551,23749,1193],{},[13,23751,23752,416],{},[16,23753,23295],{},[543,23755,23757],{"className":545,"code":23756,"language":547,"meta":228,"style":228},"string[] fabricantes = {\"Siemens\", \"Schneider\", \"ABB\", \"Eaton\"};\n\nforeach (string fabricante in fabricantes)\n{\n    MessageBox.Show(\"Fabricante: \" + fabricante);\n}\n",[54,23758,23759,23764,23768,23773,23777,23782],{"__ignoreMap":228},[551,23760,23761],{"class":553,"line":554},[551,23762,23763],{},"string[] fabricantes = {\"Siemens\", \"Schneider\", \"ABB\", \"Eaton\"};\n",[551,23765,23766],{"class":553,"line":229},[551,23767,1139],{"emptyLinePlaceholder":238},[551,23769,23770],{"class":553,"line":670},[551,23771,23772],{},"foreach (string fabricante in fabricantes)\n",[551,23774,23775],{"class":553,"line":1136},[551,23776,1151],{},[551,23778,23779],{"class":553,"line":1142},[551,23780,23781],{},"    MessageBox.Show(\"Fabricante: \" + fabricante);\n",[551,23783,23784],{"class":553,"line":1148},[551,23785,1193],{},[367,23787,23789],{"id":23788},"_32-for-vs-foreach","3.2 for vs foreach",[13,23791,23792,416],{},[16,23793,23794],{},"Con for",[543,23796,23798],{"className":545,"code":23797,"language":547,"meta":228,"style":228},"string[] componentes = {\"Contactor\", \"Relé\", \"Guardamotor\"};\n\nfor (int i = 0; i \u003C componentes.Length; i++)\n{\n    MessageBox.Show(componentes[i]);\n}\n",[54,23799,23800,23805,23809,23814,23818,23823],{"__ignoreMap":228},[551,23801,23802],{"class":553,"line":554},[551,23803,23804],{},"string[] componentes = {\"Contactor\", \"Relé\", \"Guardamotor\"};\n",[551,23806,23807],{"class":553,"line":229},[551,23808,1139],{"emptyLinePlaceholder":238},[551,23810,23811],{"class":553,"line":670},[551,23812,23813],{},"for (int i = 0; i \u003C componentes.Length; i++)\n",[551,23815,23816],{"class":553,"line":1136},[551,23817,1151],{},[551,23819,23820],{"class":553,"line":1142},[551,23821,23822],{},"    MessageBox.Show(componentes[i]);\n",[551,23824,23825],{"class":553,"line":1148},[551,23826,1193],{},[13,23828,23829,23832],{},[16,23830,23831],{},"Con foreach"," (más simple):",[543,23834,23836],{"className":545,"code":23835,"language":547,"meta":228,"style":228},"string[] componentes = {\"Contactor\", \"Relé\", \"Guardamotor\"};\n\nforeach (string componente in componentes)\n{\n    MessageBox.Show(componente);\n}\n",[54,23837,23838,23842,23846,23851,23855,23860],{"__ignoreMap":228},[551,23839,23840],{"class":553,"line":554},[551,23841,23804],{},[551,23843,23844],{"class":553,"line":229},[551,23845,1139],{"emptyLinePlaceholder":238},[551,23847,23848],{"class":553,"line":670},[551,23849,23850],{},"foreach (string componente in componentes)\n",[551,23852,23853],{"class":553,"line":1136},[551,23854,1151],{},[551,23856,23857],{"class":553,"line":1142},[551,23858,23859],{},"    MessageBox.Show(componente);\n",[551,23861,23862],{"class":553,"line":1148},[551,23863,1193],{},[13,23865,23866,416],{},[16,23867,23868],{},"Cuándo usar cada uno",[126,23870,23871,23876],{},[88,23872,23873,23875],{},[16,23874,23717],{},": Cuando solo necesitas recorrer todos los elementos",[88,23877,23878,23880],{},[16,23879,23258],{},": Cuando necesitas el índice, o quieres saltar elementos, o modificar el array",[367,23882,23884],{"id":23883},"_33-ejemplos-prácticos","3.3 Ejemplos prácticos",[13,23886,23887],{},[16,23888,23889],{},"Ejemplo 1: Validar voltajes",[543,23891,23893],{"className":545,"code":23892,"language":547,"meta":228,"style":228},"double[] voltajesMedidos = {228.5, 232.1, 229.8, 235.2, 226.4};\nint voltajesOK = 0;\nint voltajesFuera = 0;\n\nforeach (double voltaje in voltajesMedidos)\n{\n    if (voltaje >= 207 && voltaje \u003C= 253)\n    {\n        voltajesOK++;\n    }\n    else\n    {\n        voltajesFuera++;\n    }\n}\n\nstring mensaje = string.Format(\n    \"Voltajes dentro de rango: {0}\\nVoltajes fuera de rango: {1}\",\n    voltajesOK,\n    voltajesFuera\n);\n\nMessageBox.Show(mensaje);\n",[54,23894,23895,23900,23905,23910,23914,23919,23923,23928,23932,23937,23941,23945,23949,23954,23958,23962,23966,23970,23975,23980,23985,23989,23993],{"__ignoreMap":228},[551,23896,23897],{"class":553,"line":554},[551,23898,23899],{},"double[] voltajesMedidos = {228.5, 232.1, 229.8, 235.2, 226.4};\n",[551,23901,23902],{"class":553,"line":229},[551,23903,23904],{},"int voltajesOK = 0;\n",[551,23906,23907],{"class":553,"line":670},[551,23908,23909],{},"int voltajesFuera = 0;\n",[551,23911,23912],{"class":553,"line":1136},[551,23913,1139],{"emptyLinePlaceholder":238},[551,23915,23916],{"class":553,"line":1142},[551,23917,23918],{},"foreach (double voltaje in voltajesMedidos)\n",[551,23920,23921],{"class":553,"line":1148},[551,23922,1151],{},[551,23924,23925],{"class":553,"line":1154},[551,23926,23927],{},"    if (voltaje >= 207 && voltaje \u003C= 253)\n",[551,23929,23930],{"class":553,"line":1160},[551,23931,1169],{},[551,23933,23934],{"class":553,"line":1166},[551,23935,23936],{},"        voltajesOK++;\n",[551,23938,23939],{"class":553,"line":1172},[551,23940,1187],{},[551,23942,23943],{"class":553,"line":1178},[551,23944,12046],{},[551,23946,23947],{"class":553,"line":1184},[551,23948,1169],{},[551,23950,23951],{"class":553,"line":1190},[551,23952,23953],{},"        voltajesFuera++;\n",[551,23955,23956],{"class":553,"line":1472},[551,23957,1187],{},[551,23959,23960],{"class":553,"line":1477},[551,23961,1193],{},[551,23963,23964],{"class":553,"line":1797},[551,23965,1139],{"emptyLinePlaceholder":238},[551,23967,23968],{"class":553,"line":1802},[551,23969,3942],{},[551,23971,23972],{"class":553,"line":1808},[551,23973,23974],{},"    \"Voltajes dentro de rango: {0}\\nVoltajes fuera de rango: {1}\",\n",[551,23976,23977],{"class":553,"line":1814},[551,23978,23979],{},"    voltajesOK,\n",[551,23981,23982],{"class":553,"line":1820},[551,23983,23984],{},"    voltajesFuera\n",[551,23986,23987],{"class":553,"line":1826},[551,23988,3967],{},[551,23990,23991],{"class":553,"line":1832},[551,23992,1139],{"emptyLinePlaceholder":238},[551,23994,23995],{"class":553,"line":1838},[551,23996,11901],{},[13,23998,23999],{},[16,24000,24001],{},"Ejemplo 2: Calcular corriente total",[543,24003,24005],{"className":545,"code":24004,"language":547,"meta":228,"style":228},"double[] corrientesCircuitos = {15.5, 8.2, 12.7, 20.3, 6.8};\ndouble corrienteTotal = 0;\n\nforeach (double corriente in corrientesCircuitos)\n{\n    corrienteTotal += corriente;\n}\n\nMessageBox.Show(string.Format(\"Corriente total: {0:F2} A\", corrienteTotal));\n\u002F\u002F Corriente total: 63.50 A\n",[54,24006,24007,24012,24017,24021,24026,24030,24035,24039,24043,24048],{"__ignoreMap":228},[551,24008,24009],{"class":553,"line":554},[551,24010,24011],{},"double[] corrientesCircuitos = {15.5, 8.2, 12.7, 20.3, 6.8};\n",[551,24013,24014],{"class":553,"line":229},[551,24015,24016],{},"double corrienteTotal = 0;\n",[551,24018,24019],{"class":553,"line":670},[551,24020,1139],{"emptyLinePlaceholder":238},[551,24022,24023],{"class":553,"line":1136},[551,24024,24025],{},"foreach (double corriente in corrientesCircuitos)\n",[551,24027,24028],{"class":553,"line":1142},[551,24029,1151],{},[551,24031,24032],{"class":553,"line":1148},[551,24033,24034],{},"    corrienteTotal += corriente;\n",[551,24036,24037],{"class":553,"line":1154},[551,24038,1193],{},[551,24040,24041],{"class":553,"line":1160},[551,24042,1139],{"emptyLinePlaceholder":238},[551,24044,24045],{"class":553,"line":1166},[551,24046,24047],{},"MessageBox.Show(string.Format(\"Corriente total: {0:F2} A\", corrienteTotal));\n",[551,24049,24050],{"class":553,"line":1172},[551,24051,24052],{},"\u002F\u002F Corriente total: 63.50 A\n",[13,24054,24055],{},[16,24056,24057],{},"Ejemplo 3: Buscar componente específico",[543,24059,24061],{"className":545,"code":24060,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"K2\", \"Q2\"};\nstring buscado = \"F1\";\nbool encontrado = false;\n\nforeach (string componente in componentes)\n{\n    if (componente == buscado)\n    {\n        encontrado = true;\n        break;  \u002F\u002F Sal del bucle cuando lo encuentres\n    }\n}\n\nif (encontrado)\n{\n    MessageBox.Show(buscado + \" encontrado en la lista\");\n}\nelse\n{\n    MessageBox.Show(buscado + \" NO encontrado\");\n}\n",[54,24062,24063,24068,24073,24078,24082,24086,24090,24095,24099,24104,24109,24113,24117,24121,24126,24130,24135,24139,24143,24147,24152],{"__ignoreMap":228},[551,24064,24065],{"class":553,"line":554},[551,24066,24067],{},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"K2\", \"Q2\"};\n",[551,24069,24070],{"class":553,"line":229},[551,24071,24072],{},"string buscado = \"F1\";\n",[551,24074,24075],{"class":553,"line":670},[551,24076,24077],{},"bool encontrado = false;\n",[551,24079,24080],{"class":553,"line":1136},[551,24081,1139],{"emptyLinePlaceholder":238},[551,24083,24084],{"class":553,"line":1142},[551,24085,23850],{},[551,24087,24088],{"class":553,"line":1148},[551,24089,1151],{},[551,24091,24092],{"class":553,"line":1154},[551,24093,24094],{},"    if (componente == buscado)\n",[551,24096,24097],{"class":553,"line":1160},[551,24098,1169],{},[551,24100,24101],{"class":553,"line":1166},[551,24102,24103],{},"        encontrado = true;\n",[551,24105,24106],{"class":553,"line":1172},[551,24107,24108],{},"        break;  \u002F\u002F Sal del bucle cuando lo encuentres\n",[551,24110,24111],{"class":553,"line":1178},[551,24112,1187],{},[551,24114,24115],{"class":553,"line":1184},[551,24116,1193],{},[551,24118,24119],{"class":553,"line":1190},[551,24120,1139],{"emptyLinePlaceholder":238},[551,24122,24123],{"class":553,"line":1472},[551,24124,24125],{},"if (encontrado)\n",[551,24127,24128],{"class":553,"line":1477},[551,24129,1151],{},[551,24131,24132],{"class":553,"line":1797},[551,24133,24134],{},"    MessageBox.Show(buscado + \" encontrado en la lista\");\n",[551,24136,24137],{"class":553,"line":1802},[551,24138,1193],{},[551,24140,24141],{"class":553,"line":1808},[551,24142,3704],{},[551,24144,24145],{"class":553,"line":1814},[551,24146,1151],{},[551,24148,24149],{"class":553,"line":1820},[551,24150,24151],{},"    MessageBox.Show(buscado + \" NO encontrado\");\n",[551,24153,24154],{"class":553,"line":1826},[551,24155,1193],{},[43,24157],{},[331,24159,24161],{"id":24160},"_4-bucle-while-mientras-se-cumpla-una-condición","4. Bucle while - Mientras se cumpla una condición",[13,24163,23255,24164,23259,24167,24170],{},[54,24165,24166],{},"while",[16,24168,24169],{},"no sabes cuántas iteraciones"," necesitarás, pero tienes una condición de parada.",[367,24172,24174],{"id":24173},"_41-sintaxis-básica","4.1 Sintaxis básica",[543,24176,24178],{"className":545,"code":24177,"language":547,"meta":228,"style":228},"while (condicion)\n{\n    \u002F\u002F Código que se repite mientras condicion sea true\n}\n",[54,24179,24180,24185,24189,24194],{"__ignoreMap":228},[551,24181,24182],{"class":553,"line":554},[551,24183,24184],{},"while (condicion)\n",[551,24186,24187],{"class":553,"line":229},[551,24188,1151],{},[551,24190,24191],{"class":553,"line":670},[551,24192,24193],{},"    \u002F\u002F Código que se repite mientras condicion sea true\n",[551,24195,24196],{"class":553,"line":1136},[551,24197,1193],{},[13,24199,24200,416],{},[16,24201,23295],{},[543,24203,24205],{"className":545,"code":24204,"language":547,"meta":228,"style":228},"int contador = 0;\n\nwhile (contador \u003C 5)\n{\n    MessageBox.Show(\"Contador: \" + contador);\n    contador++;\n}\n\u002F\u002F 0, 1, 2, 3, 4\n",[54,24206,24207,24211,24215,24220,24224,24229,24234,24238],{"__ignoreMap":228},[551,24208,24209],{"class":553,"line":554},[551,24210,5158],{},[551,24212,24213],{"class":553,"line":229},[551,24214,1139],{"emptyLinePlaceholder":238},[551,24216,24217],{"class":553,"line":670},[551,24218,24219],{},"while (contador \u003C 5)\n",[551,24221,24222],{"class":553,"line":1136},[551,24223,1151],{},[551,24225,24226],{"class":553,"line":1142},[551,24227,24228],{},"    MessageBox.Show(\"Contador: \" + contador);\n",[551,24230,24231],{"class":553,"line":1148},[551,24232,24233],{},"    contador++;\n",[551,24235,24236],{"class":553,"line":1154},[551,24237,1193],{},[551,24239,24240],{"class":553,"line":1160},[551,24241,24242],{},"\u002F\u002F 0, 1, 2, 3, 4\n",[367,24244,24246],{"id":24245},"_42-diferencia-con-for","4.2 Diferencia con for",[13,24248,24249,24251],{},[16,24250,23794],{}," (sabes las iteraciones):",[543,24253,24255],{"className":545,"code":24254,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 5; i++)\n{\n    MessageBox.Show(\"i: \" + i);\n}\n",[54,24256,24257,24261,24265,24270],{"__ignoreMap":228},[551,24258,24259],{"class":553,"line":554},[551,24260,23305],{},[551,24262,24263],{"class":553,"line":229},[551,24264,1151],{},[551,24266,24267],{"class":553,"line":670},[551,24268,24269],{},"    MessageBox.Show(\"i: \" + i);\n",[551,24271,24272],{"class":553,"line":1136},[551,24273,1193],{},[13,24275,24276,24279],{},[16,24277,24278],{},"Con while"," (condición dinámica):",[543,24281,24283],{"className":545,"code":24282,"language":547,"meta":228,"style":228},"double voltaje = 230.0;\nint iteraciones = 0;\n\nwhile (voltaje >= 207.0 && voltaje \u003C= 253.0)\n{\n    MessageBox.Show(string.Format(\"Voltaje OK: {0:F1}V\", voltaje));\n    voltaje -= 5.0;  \u002F\u002F Simular caída de voltaje\n    iteraciones++;\n\n    if (iteraciones > 10) break;  \u002F\u002F Seguridad para evitar bucle infinito\n}\n",[54,24284,24285,24289,24294,24298,24303,24307,24312,24317,24322,24326,24331],{"__ignoreMap":228},[551,24286,24287],{"class":553,"line":554},[551,24288,2454],{},[551,24290,24291],{"class":553,"line":229},[551,24292,24293],{},"int iteraciones = 0;\n",[551,24295,24296],{"class":553,"line":670},[551,24297,1139],{"emptyLinePlaceholder":238},[551,24299,24300],{"class":553,"line":1136},[551,24301,24302],{},"while (voltaje >= 207.0 && voltaje \u003C= 253.0)\n",[551,24304,24305],{"class":553,"line":1142},[551,24306,1151],{},[551,24308,24309],{"class":553,"line":1148},[551,24310,24311],{},"    MessageBox.Show(string.Format(\"Voltaje OK: {0:F1}V\", voltaje));\n",[551,24313,24314],{"class":553,"line":1154},[551,24315,24316],{},"    voltaje -= 5.0;  \u002F\u002F Simular caída de voltaje\n",[551,24318,24319],{"class":553,"line":1160},[551,24320,24321],{},"    iteraciones++;\n",[551,24323,24324],{"class":553,"line":1166},[551,24325,1139],{"emptyLinePlaceholder":238},[551,24327,24328],{"class":553,"line":1172},[551,24329,24330],{},"    if (iteraciones > 10) break;  \u002F\u002F Seguridad para evitar bucle infinito\n",[551,24332,24333],{"class":553,"line":1178},[551,24334,1193],{},[367,24336,24338],{"id":24337},"_43-ejemplos-prácticos","4.3 Ejemplos prácticos",[13,24340,24341],{},[16,24342,24343],{},"Ejemplo 1: Dividir corriente hasta alcanzar límite",[543,24345,24347],{"className":545,"code":24346,"language":547,"meta":228,"style":228},"double corrienteTotal = 100.0;  \u002F\u002F A\ndouble corrientePorCircuito = 16.0;  \u002F\u002F A\nint numeroCir cuitos = 0;\n\nwhile (corrienteTotal > 0)\n{\n    corrienteTotal -= corrientePorCircuito;\n    numeroCir cuitos++;\n}\n\nMessageBox.Show(string.Format(\"Se necesitan {0} circuitos de 16A\", numeroCir cuitos));\n\u002F\u002F Se necesitan 7 circuitos de 16A\n",[54,24348,24349,24354,24359,24364,24368,24373,24377,24382,24387,24391,24395,24400],{"__ignoreMap":228},[551,24350,24351],{"class":553,"line":554},[551,24352,24353],{},"double corrienteTotal = 100.0;  \u002F\u002F A\n",[551,24355,24356],{"class":553,"line":229},[551,24357,24358],{},"double corrientePorCircuito = 16.0;  \u002F\u002F A\n",[551,24360,24361],{"class":553,"line":670},[551,24362,24363],{},"int numeroCir cuitos = 0;\n",[551,24365,24366],{"class":553,"line":1136},[551,24367,1139],{"emptyLinePlaceholder":238},[551,24369,24370],{"class":553,"line":1142},[551,24371,24372],{},"while (corrienteTotal > 0)\n",[551,24374,24375],{"class":553,"line":1148},[551,24376,1151],{},[551,24378,24379],{"class":553,"line":1154},[551,24380,24381],{},"    corrienteTotal -= corrientePorCircuito;\n",[551,24383,24384],{"class":553,"line":1160},[551,24385,24386],{},"    numeroCir cuitos++;\n",[551,24388,24389],{"class":553,"line":1166},[551,24390,1193],{},[551,24392,24393],{"class":553,"line":1172},[551,24394,1139],{"emptyLinePlaceholder":238},[551,24396,24397],{"class":553,"line":1178},[551,24398,24399],{},"MessageBox.Show(string.Format(\"Se necesitan {0} circuitos de 16A\", numeroCir cuitos));\n",[551,24401,24402],{"class":553,"line":1184},[551,24403,24404],{},"\u002F\u002F Se necesitan 7 circuitos de 16A\n",[13,24406,24407],{},[16,24408,24409],{},"Ejemplo 2: Encontrar sección de cable adecuada",[543,24411,24413],{"className":545,"code":24412,"language":547,"meta":228,"style":228},"double corrienteCircuito = 28.5;  \u002F\u002F A\ndouble[] seccionesDisponibles = {1.5, 2.5, 4.0, 6.0, 10.0, 16.0};\ndouble[] corrientesAdmisibles = {15.0, 21.0, 27.0, 36.0, 50.0, 68.0};\n\nint indice = 0;\nwhile (indice \u003C seccionesDisponibles.Length)\n{\n    if (corrientesAdmisibles[indice] >= corrienteCircuito)\n    {\n        MessageBox.Show(string.Format(\n            \"Para {0}A, usar cable de {1}mm² (admite {2}A)\",\n            corrienteCircuito,\n            seccionesDisponibles[indice],\n            corrientesAdmisibles[indice]\n        ));\n        break;\n    }\n    indice++;\n}\n",[54,24414,24415,24420,24425,24430,24434,24439,24444,24448,24453,24457,24462,24467,24472,24477,24482,24487,24491,24495,24500],{"__ignoreMap":228},[551,24416,24417],{"class":553,"line":554},[551,24418,24419],{},"double corrienteCircuito = 28.5;  \u002F\u002F A\n",[551,24421,24422],{"class":553,"line":229},[551,24423,24424],{},"double[] seccionesDisponibles = {1.5, 2.5, 4.0, 6.0, 10.0, 16.0};\n",[551,24426,24427],{"class":553,"line":670},[551,24428,24429],{},"double[] corrientesAdmisibles = {15.0, 21.0, 27.0, 36.0, 50.0, 68.0};\n",[551,24431,24432],{"class":553,"line":1136},[551,24433,1139],{"emptyLinePlaceholder":238},[551,24435,24436],{"class":553,"line":1142},[551,24437,24438],{},"int indice = 0;\n",[551,24440,24441],{"class":553,"line":1148},[551,24442,24443],{},"while (indice \u003C seccionesDisponibles.Length)\n",[551,24445,24446],{"class":553,"line":1154},[551,24447,1151],{},[551,24449,24450],{"class":553,"line":1160},[551,24451,24452],{},"    if (corrientesAdmisibles[indice] >= corrienteCircuito)\n",[551,24454,24455],{"class":553,"line":1166},[551,24456,1169],{},[551,24458,24459],{"class":553,"line":1172},[551,24460,24461],{},"        MessageBox.Show(string.Format(\n",[551,24463,24464],{"class":553,"line":1178},[551,24465,24466],{},"            \"Para {0}A, usar cable de {1}mm² (admite {2}A)\",\n",[551,24468,24469],{"class":553,"line":1184},[551,24470,24471],{},"            corrienteCircuito,\n",[551,24473,24474],{"class":553,"line":1190},[551,24475,24476],{},"            seccionesDisponibles[indice],\n",[551,24478,24479],{"class":553,"line":1472},[551,24480,24481],{},"            corrientesAdmisibles[indice]\n",[551,24483,24484],{"class":553,"line":1477},[551,24485,24486],{},"        ));\n",[551,24488,24489],{"class":553,"line":1797},[551,24490,15907],{},[551,24492,24493],{"class":553,"line":1802},[551,24494,1187],{},[551,24496,24497],{"class":553,"line":1808},[551,24498,24499],{},"    indice++;\n",[551,24501,24502],{"class":553,"line":1814},[551,24503,1193],{},[13,24505,24506],{},[16,24507,24508],{},"Ejemplo 3: Validación de entrada",[543,24510,24512],{"className":545,"code":24511,"language":547,"meta":228,"style":228},"bool entradaValida = false;\nint intentos = 0;\ndouble voltaje = 150.0;  \u002F\u002F Simulación de entrada de usuario\n\nwhile (!entradaValida && intentos \u003C 3)\n{\n    if (voltaje >= 207.0 && voltaje \u003C= 253.0)\n    {\n        entradaValida = true;\n        MessageBox.Show(\"Voltaje aceptado: \" + voltaje + \"V\");\n    }\n    else\n    {\n        MessageBox.Show(\"Voltaje fuera de rango. Intento \" + (intentos + 1));\n        voltaje += 50.0;  \u002F\u002F Simulación de corrección\n        intentos++;\n    }\n}\n\nif (!entradaValida)\n{\n    MessageBox.Show(\"Máximo de intentos alcanzado\");\n}\n",[54,24513,24514,24519,24524,24529,24533,24538,24542,24547,24551,24556,24561,24565,24569,24573,24578,24583,24588,24592,24596,24600,24605,24609,24614],{"__ignoreMap":228},[551,24515,24516],{"class":553,"line":554},[551,24517,24518],{},"bool entradaValida = false;\n",[551,24520,24521],{"class":553,"line":229},[551,24522,24523],{},"int intentos = 0;\n",[551,24525,24526],{"class":553,"line":670},[551,24527,24528],{},"double voltaje = 150.0;  \u002F\u002F Simulación de entrada de usuario\n",[551,24530,24531],{"class":553,"line":1136},[551,24532,1139],{"emptyLinePlaceholder":238},[551,24534,24535],{"class":553,"line":1142},[551,24536,24537],{},"while (!entradaValida && intentos \u003C 3)\n",[551,24539,24540],{"class":553,"line":1148},[551,24541,1151],{},[551,24543,24544],{"class":553,"line":1154},[551,24545,24546],{},"    if (voltaje >= 207.0 && voltaje \u003C= 253.0)\n",[551,24548,24549],{"class":553,"line":1160},[551,24550,1169],{},[551,24552,24553],{"class":553,"line":1166},[551,24554,24555],{},"        entradaValida = true;\n",[551,24557,24558],{"class":553,"line":1172},[551,24559,24560],{},"        MessageBox.Show(\"Voltaje aceptado: \" + voltaje + \"V\");\n",[551,24562,24563],{"class":553,"line":1178},[551,24564,1187],{},[551,24566,24567],{"class":553,"line":1184},[551,24568,12046],{},[551,24570,24571],{"class":553,"line":1190},[551,24572,1169],{},[551,24574,24575],{"class":553,"line":1472},[551,24576,24577],{},"        MessageBox.Show(\"Voltaje fuera de rango. Intento \" + (intentos + 1));\n",[551,24579,24580],{"class":553,"line":1477},[551,24581,24582],{},"        voltaje += 50.0;  \u002F\u002F Simulación de corrección\n",[551,24584,24585],{"class":553,"line":1797},[551,24586,24587],{},"        intentos++;\n",[551,24589,24590],{"class":553,"line":1802},[551,24591,1187],{},[551,24593,24594],{"class":553,"line":1808},[551,24595,1193],{},[551,24597,24598],{"class":553,"line":1814},[551,24599,1139],{"emptyLinePlaceholder":238},[551,24601,24602],{"class":553,"line":1820},[551,24603,24604],{},"if (!entradaValida)\n",[551,24606,24607],{"class":553,"line":1826},[551,24608,1151],{},[551,24610,24611],{"class":553,"line":1832},[551,24612,24613],{},"    MessageBox.Show(\"Máximo de intentos alcanzado\");\n",[551,24615,24616],{"class":553,"line":1838},[551,24617,1193],{},[367,24619,24621],{"id":24620},"_44-cuidado-con-bucles-infinitos","4.4 Cuidado con bucles infinitos",[13,24623,24624,24627],{},[16,24625,24626],{},"Bucle infinito"," (NUNCA termina):",[543,24629,24631],{"className":545,"code":24630,"language":547,"meta":228,"style":228},"int contador = 0;\n\nwhile (contador \u003C 5)\n{\n    MessageBox.Show(\"Contador: \" + contador);\n    \u002F\u002F ¡Olvidaste incrementar contador!\n    \u002F\u002F Este bucle NUNCA termina\n}\n",[54,24632,24633,24637,24641,24645,24649,24653,24658,24663],{"__ignoreMap":228},[551,24634,24635],{"class":553,"line":554},[551,24636,5158],{},[551,24638,24639],{"class":553,"line":229},[551,24640,1139],{"emptyLinePlaceholder":238},[551,24642,24643],{"class":553,"line":670},[551,24644,24219],{},[551,24646,24647],{"class":553,"line":1136},[551,24648,1151],{},[551,24650,24651],{"class":553,"line":1142},[551,24652,24228],{},[551,24654,24655],{"class":553,"line":1148},[551,24656,24657],{},"    \u002F\u002F ¡Olvidaste incrementar contador!\n",[551,24659,24660],{"class":553,"line":1154},[551,24661,24662],{},"    \u002F\u002F Este bucle NUNCA termina\n",[551,24664,24665],{"class":553,"line":1160},[551,24666,1193],{},[13,24668,24669,24671],{},[16,24670,1983],{},": Siempre asegúrate de que la condición pueda ser false:",[543,24673,24675],{"className":545,"code":24674,"language":547,"meta":228,"style":228},"int contador = 0;\n\nwhile (contador \u003C 5)\n{\n    MessageBox.Show(\"Contador: \" + contador);\n    contador++;  \u002F\u002F ← Esto hace que eventualmente contador >= 5\n}\n",[54,24676,24677,24681,24685,24689,24693,24697,24702],{"__ignoreMap":228},[551,24678,24679],{"class":553,"line":554},[551,24680,5158],{},[551,24682,24683],{"class":553,"line":229},[551,24684,1139],{"emptyLinePlaceholder":238},[551,24686,24687],{"class":553,"line":670},[551,24688,24219],{},[551,24690,24691],{"class":553,"line":1136},[551,24692,1151],{},[551,24694,24695],{"class":553,"line":1142},[551,24696,24228],{},[551,24698,24699],{"class":553,"line":1148},[551,24700,24701],{},"    contador++;  \u002F\u002F ← Esto hace que eventualmente contador >= 5\n",[551,24703,24704],{"class":553,"line":1154},[551,24705,1193],{},[43,24707],{},[331,24709,24711],{"id":24710},"_5-bucle-do-while-ejecutar-al-menos-una-vez","5. Bucle do-while - Ejecutar al menos una vez",[13,24713,23255,24714,73,24717,24720],{},[54,24715,24716],{},"do-while",[16,24718,24719],{},"siempre ejecuta al menos una iteración",", luego verifica la condición.",[367,24722,24724],{"id":24723},"_51-sintaxis-básica","5.1 Sintaxis básica",[543,24726,24728],{"className":545,"code":24727,"language":547,"meta":228,"style":228},"do\n{\n    \u002F\u002F Código que se ejecuta AL MENOS una vez\n} while (condicion);\n",[54,24729,24730,24735,24739,24744],{"__ignoreMap":228},[551,24731,24732],{"class":553,"line":554},[551,24733,24734],{},"do\n",[551,24736,24737],{"class":553,"line":229},[551,24738,1151],{},[551,24740,24741],{"class":553,"line":670},[551,24742,24743],{},"    \u002F\u002F Código que se ejecuta AL MENOS una vez\n",[551,24745,24746],{"class":553,"line":1136},[551,24747,24748],{},"} while (condicion);\n",[13,24750,24751,416],{},[16,24752,24753],{},"Diferencia clave con while",[13,24755,24756,24758],{},[16,24757,24166],{},": Verifica primero, luego ejecuta",[543,24760,24762],{"className":545,"code":24761,"language":547,"meta":228,"style":228},"int contador = 10;\n\nwhile (contador \u003C 5)\n{\n    MessageBox.Show(\"Nunca se ejecuta\");\n}\n\u002F\u002F No muestra nada porque 10 \u003C 5 es false desde el inicio\n",[54,24763,24764,24768,24772,24776,24780,24785,24789],{"__ignoreMap":228},[551,24765,24766],{"class":553,"line":554},[551,24767,6222],{},[551,24769,24770],{"class":553,"line":229},[551,24771,1139],{"emptyLinePlaceholder":238},[551,24773,24774],{"class":553,"line":670},[551,24775,24219],{},[551,24777,24778],{"class":553,"line":1136},[551,24779,1151],{},[551,24781,24782],{"class":553,"line":1142},[551,24783,24784],{},"    MessageBox.Show(\"Nunca se ejecuta\");\n",[551,24786,24787],{"class":553,"line":1148},[551,24788,1193],{},[551,24790,24791],{"class":553,"line":1154},[551,24792,24793],{},"\u002F\u002F No muestra nada porque 10 \u003C 5 es false desde el inicio\n",[13,24795,24796,24798],{},[16,24797,24716],{},": Ejecuta primero, luego verifica",[543,24800,24802],{"className":545,"code":24801,"language":547,"meta":228,"style":228},"int contador = 10;\n\ndo\n{\n    MessageBox.Show(\"Se ejecuta una vez: \" + contador);\n} while (contador \u003C 5);\n\u002F\u002F Muestra \"Se ejecuta una vez: 10\" aunque la condición sea false\n",[54,24803,24804,24808,24812,24816,24820,24825,24830],{"__ignoreMap":228},[551,24805,24806],{"class":553,"line":554},[551,24807,6222],{},[551,24809,24810],{"class":553,"line":229},[551,24811,1139],{"emptyLinePlaceholder":238},[551,24813,24814],{"class":553,"line":670},[551,24815,24734],{},[551,24817,24818],{"class":553,"line":1136},[551,24819,1151],{},[551,24821,24822],{"class":553,"line":1142},[551,24823,24824],{},"    MessageBox.Show(\"Se ejecuta una vez: \" + contador);\n",[551,24826,24827],{"class":553,"line":1148},[551,24828,24829],{},"} while (contador \u003C 5);\n",[551,24831,24832],{"class":553,"line":1154},[551,24833,24834],{},"\u002F\u002F Muestra \"Se ejecuta una vez: 10\" aunque la condición sea false\n",[367,24836,24838],{"id":24837},"_52-ejemplos-prácticos","5.2 Ejemplos prácticos",[13,24840,24841,24844],{},[16,24842,24843],{},"Ejemplo 1: Menú de opciones"," (se debe mostrar al menos una vez)",[543,24846,24848],{"className":545,"code":24847,"language":547,"meta":228,"style":228},"int opcion;\n\ndo\n{\n    string menu = \"MENÚ:\\n1. Validar proyecto\\n2. Exportar PDF\\n3. Salir\\n\\nElija opción:\";\n    opcion = 2;  \u002F\u002F Simulación (en realidad vendría de usuario)\n\n    switch (opcion)\n    {\n        case 1:\n            MessageBox.Show(\"Validando proyecto...\");\n            break;\n        case 2:\n            MessageBox.Show(\"Exportando PDF...\");\n            break;\n        case 3:\n            MessageBox.Show(\"Saliendo...\");\n            break;\n        default:\n            MessageBox.Show(\"Opción no válida\");\n            break;\n    }\n\n    opcion = 3;  \u002F\u002F Simulación de salir\n\n} while (opcion != 3);\n",[54,24849,24850,24855,24859,24863,24867,24872,24877,24881,24886,24890,24895,24900,24905,24910,24915,24919,24924,24929,24933,24938,24943,24947,24951,24955,24960,24964],{"__ignoreMap":228},[551,24851,24852],{"class":553,"line":554},[551,24853,24854],{},"int opcion;\n",[551,24856,24857],{"class":553,"line":229},[551,24858,1139],{"emptyLinePlaceholder":238},[551,24860,24861],{"class":553,"line":670},[551,24862,24734],{},[551,24864,24865],{"class":553,"line":1136},[551,24866,1151],{},[551,24868,24869],{"class":553,"line":1142},[551,24870,24871],{},"    string menu = \"MENÚ:\\n1. Validar proyecto\\n2. Exportar PDF\\n3. Salir\\n\\nElija opción:\";\n",[551,24873,24874],{"class":553,"line":1148},[551,24875,24876],{},"    opcion = 2;  \u002F\u002F Simulación (en realidad vendría de usuario)\n",[551,24878,24879],{"class":553,"line":1154},[551,24880,1139],{"emptyLinePlaceholder":238},[551,24882,24883],{"class":553,"line":1160},[551,24884,24885],{},"    switch (opcion)\n",[551,24887,24888],{"class":553,"line":1166},[551,24889,1169],{},[551,24891,24892],{"class":553,"line":1172},[551,24893,24894],{},"        case 1:\n",[551,24896,24897],{"class":553,"line":1178},[551,24898,24899],{},"            MessageBox.Show(\"Validando proyecto...\");\n",[551,24901,24902],{"class":553,"line":1184},[551,24903,24904],{},"            break;\n",[551,24906,24907],{"class":553,"line":1190},[551,24908,24909],{},"        case 2:\n",[551,24911,24912],{"class":553,"line":1472},[551,24913,24914],{},"            MessageBox.Show(\"Exportando PDF...\");\n",[551,24916,24917],{"class":553,"line":1477},[551,24918,24904],{},[551,24920,24921],{"class":553,"line":1797},[551,24922,24923],{},"        case 3:\n",[551,24925,24926],{"class":553,"line":1802},[551,24927,24928],{},"            MessageBox.Show(\"Saliendo...\");\n",[551,24930,24931],{"class":553,"line":1808},[551,24932,24904],{},[551,24934,24935],{"class":553,"line":1814},[551,24936,24937],{},"        default:\n",[551,24939,24940],{"class":553,"line":1820},[551,24941,24942],{},"            MessageBox.Show(\"Opción no válida\");\n",[551,24944,24945],{"class":553,"line":1826},[551,24946,24904],{},[551,24948,24949],{"class":553,"line":1832},[551,24950,1187],{},[551,24952,24953],{"class":553,"line":1838},[551,24954,1139],{"emptyLinePlaceholder":238},[551,24956,24957],{"class":553,"line":1844},[551,24958,24959],{},"    opcion = 3;  \u002F\u002F Simulación de salir\n",[551,24961,24962],{"class":553,"line":1850},[551,24963,1139],{"emptyLinePlaceholder":238},[551,24965,24966],{"class":553,"line":1855},[551,24967,24968],{},"} while (opcion != 3);\n",[13,24970,24971],{},[16,24972,24973],{},"Ejemplo 2: Validar y reintentar",[543,24975,24977],{"className":545,"code":24976,"language":547,"meta":228,"style":228},"double voltaje;\nbool esValido;\n\ndo\n{\n    voltaje = 195.0;  \u002F\u002F Simulación de entrada\n    esValido = (voltaje >= 207.0 && voltaje \u003C= 253.0);\n\n    if (!esValido)\n    {\n        MessageBox.Show(string.Format(\"Voltaje {0}V fuera de rango. Reintentando...\", voltaje));\n        voltaje = 230.0;  \u002F\u002F Simulación de corrección\n        esValido = true;  \u002F\u002F Para salir del ejemplo\n    }\n\n} while (!esValido);\n\nMessageBox.Show(string.Format(\"Voltaje válido: {0}V\", voltaje));\n",[54,24978,24979,24984,24989,24993,24997,25001,25006,25011,25015,25020,25024,25029,25034,25039,25043,25047,25052,25056],{"__ignoreMap":228},[551,24980,24981],{"class":553,"line":554},[551,24982,24983],{},"double voltaje;\n",[551,24985,24986],{"class":553,"line":229},[551,24987,24988],{},"bool esValido;\n",[551,24990,24991],{"class":553,"line":670},[551,24992,1139],{"emptyLinePlaceholder":238},[551,24994,24995],{"class":553,"line":1136},[551,24996,24734],{},[551,24998,24999],{"class":553,"line":1142},[551,25000,1151],{},[551,25002,25003],{"class":553,"line":1148},[551,25004,25005],{},"    voltaje = 195.0;  \u002F\u002F Simulación de entrada\n",[551,25007,25008],{"class":553,"line":1154},[551,25009,25010],{},"    esValido = (voltaje >= 207.0 && voltaje \u003C= 253.0);\n",[551,25012,25013],{"class":553,"line":1160},[551,25014,1139],{"emptyLinePlaceholder":238},[551,25016,25017],{"class":553,"line":1166},[551,25018,25019],{},"    if (!esValido)\n",[551,25021,25022],{"class":553,"line":1172},[551,25023,1169],{},[551,25025,25026],{"class":553,"line":1178},[551,25027,25028],{},"        MessageBox.Show(string.Format(\"Voltaje {0}V fuera de rango. Reintentando...\", voltaje));\n",[551,25030,25031],{"class":553,"line":1184},[551,25032,25033],{},"        voltaje = 230.0;  \u002F\u002F Simulación de corrección\n",[551,25035,25036],{"class":553,"line":1190},[551,25037,25038],{},"        esValido = true;  \u002F\u002F Para salir del ejemplo\n",[551,25040,25041],{"class":553,"line":1472},[551,25042,1187],{},[551,25044,25045],{"class":553,"line":1477},[551,25046,1139],{"emptyLinePlaceholder":238},[551,25048,25049],{"class":553,"line":1797},[551,25050,25051],{},"} while (!esValido);\n",[551,25053,25054],{"class":553,"line":1802},[551,25055,1139],{"emptyLinePlaceholder":238},[551,25057,25058],{"class":553,"line":1808},[551,25059,25060],{},"MessageBox.Show(string.Format(\"Voltaje válido: {0}V\", voltaje));\n",[43,25062],{},[331,25064,25066],{"id":25065},"_6-break-y-continue-control-de-flujo-en-bucles","6. break y continue - Control de flujo en bucles",[367,25068,25070],{"id":25069},"_61-break-salir-del-bucle-inmediatamente","6.1 break - Salir del bucle inmediatamente",[543,25072,25074],{"className":545,"code":25073,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 10; i++)\n{\n    if (i == 5)\n    {\n        break;  \u002F\u002F Sale del bucle cuando i=5\n    }\n    MessageBox.Show(\"i: \" + i);\n}\n\u002F\u002F Muestra: 0, 1, 2, 3, 4 (se detiene en 5)\n",[54,25075,25076,25081,25085,25090,25094,25099,25103,25107,25111],{"__ignoreMap":228},[551,25077,25078],{"class":553,"line":554},[551,25079,25080],{},"for (int i = 0; i \u003C 10; i++)\n",[551,25082,25083],{"class":553,"line":229},[551,25084,1151],{},[551,25086,25087],{"class":553,"line":670},[551,25088,25089],{},"    if (i == 5)\n",[551,25091,25092],{"class":553,"line":1136},[551,25093,1169],{},[551,25095,25096],{"class":553,"line":1142},[551,25097,25098],{},"        break;  \u002F\u002F Sale del bucle cuando i=5\n",[551,25100,25101],{"class":553,"line":1148},[551,25102,1187],{},[551,25104,25105],{"class":553,"line":1154},[551,25106,24269],{},[551,25108,25109],{"class":553,"line":1160},[551,25110,1193],{},[551,25112,25113],{"class":553,"line":1166},[551,25114,25115],{},"\u002F\u002F Muestra: 0, 1, 2, 3, 4 (se detiene en 5)\n",[13,25117,25118],{},[16,25119,25120],{},"Ejemplo práctico: Buscar primer componente defectuoso",[543,25122,25124],{"className":545,"code":25123,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1-OK\", \"Q1-OK\", \"F1-FALLO\", \"K2-OK\", \"Q2-OK\"};\nstring primerDefectuoso = \"\";\n\nforeach (string componente in componentes)\n{\n    if (componente.Contains(\"FALLO\"))\n    {\n        primerDefectuoso = componente;\n        break;  \u002F\u002F No necesitamos seguir buscando\n    }\n}\n\nMessageBox.Show(\"Primer defectuoso: \" + primerDefectuoso);\n\u002F\u002F Primer defectuoso: F1-FALLO\n",[54,25125,25126,25131,25136,25140,25144,25148,25153,25157,25162,25167,25171,25175,25179,25184],{"__ignoreMap":228},[551,25127,25128],{"class":553,"line":554},[551,25129,25130],{},"string[] componentes = {\"K1-OK\", \"Q1-OK\", \"F1-FALLO\", \"K2-OK\", \"Q2-OK\"};\n",[551,25132,25133],{"class":553,"line":229},[551,25134,25135],{},"string primerDefectuoso = \"\";\n",[551,25137,25138],{"class":553,"line":670},[551,25139,1139],{"emptyLinePlaceholder":238},[551,25141,25142],{"class":553,"line":1136},[551,25143,23850],{},[551,25145,25146],{"class":553,"line":1142},[551,25147,1151],{},[551,25149,25150],{"class":553,"line":1148},[551,25151,25152],{},"    if (componente.Contains(\"FALLO\"))\n",[551,25154,25155],{"class":553,"line":1154},[551,25156,1169],{},[551,25158,25159],{"class":553,"line":1160},[551,25160,25161],{},"        primerDefectuoso = componente;\n",[551,25163,25164],{"class":553,"line":1166},[551,25165,25166],{},"        break;  \u002F\u002F No necesitamos seguir buscando\n",[551,25168,25169],{"class":553,"line":1172},[551,25170,1187],{},[551,25172,25173],{"class":553,"line":1178},[551,25174,1193],{},[551,25176,25177],{"class":553,"line":1184},[551,25178,1139],{"emptyLinePlaceholder":238},[551,25180,25181],{"class":553,"line":1190},[551,25182,25183],{},"MessageBox.Show(\"Primer defectuoso: \" + primerDefectuoso);\n",[551,25185,25186],{"class":553,"line":1472},[551,25187,25188],{},"\u002F\u002F Primer defectuoso: F1-FALLO\n",[367,25190,25192],{"id":25191},"_62-continue-saltar-a-la-siguiente-iteración","6.2 continue - Saltar a la siguiente iteración",[543,25194,25196],{"className":545,"code":25195,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 10; i++)\n{\n    if (i % 2 == 0)\n    {\n        continue;  \u002F\u002F Salta los números pares\n    }\n    MessageBox.Show(\"Impar: \" + i);\n}\n\u002F\u002F Muestra: 1, 3, 5, 7, 9\n",[54,25197,25198,25202,25206,25211,25215,25220,25224,25229,25233],{"__ignoreMap":228},[551,25199,25200],{"class":553,"line":554},[551,25201,25080],{},[551,25203,25204],{"class":553,"line":229},[551,25205,1151],{},[551,25207,25208],{"class":553,"line":670},[551,25209,25210],{},"    if (i % 2 == 0)\n",[551,25212,25213],{"class":553,"line":1136},[551,25214,1169],{},[551,25216,25217],{"class":553,"line":1142},[551,25218,25219],{},"        continue;  \u002F\u002F Salta los números pares\n",[551,25221,25222],{"class":553,"line":1148},[551,25223,1187],{},[551,25225,25226],{"class":553,"line":1154},[551,25227,25228],{},"    MessageBox.Show(\"Impar: \" + i);\n",[551,25230,25231],{"class":553,"line":1160},[551,25232,1193],{},[551,25234,25235],{"class":553,"line":1166},[551,25236,25237],{},"\u002F\u002F Muestra: 1, 3, 5, 7, 9\n",[13,25239,25240],{},[16,25241,25242],{},"Ejemplo práctico: Procesar solo componentes válidos",[543,25244,25246],{"className":545,"code":25245,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1\", \"\", \"Q1\", \"INVALIDO\", \"F1\", \"\", \"K2\"};\nstring componentesValidos = \"Componentes válidos:\\n\";\n\nforeach (string componente in componentes)\n{\n    \u002F\u002F Saltar vacíos o inválidos\n    if (componente == \"\" || componente == \"INVALIDO\")\n    {\n        continue;\n    }\n\n    componentesValidos += componente + \"\\n\";\n}\n\nMessageBox.Show(componentesValidos);\n\u002F\u002F K1, Q1, F1, K2\n",[54,25247,25248,25253,25258,25262,25266,25270,25275,25280,25284,25289,25293,25297,25302,25306,25310,25315],{"__ignoreMap":228},[551,25249,25250],{"class":553,"line":554},[551,25251,25252],{},"string[] componentes = {\"K1\", \"\", \"Q1\", \"INVALIDO\", \"F1\", \"\", \"K2\"};\n",[551,25254,25255],{"class":553,"line":229},[551,25256,25257],{},"string componentesValidos = \"Componentes válidos:\\n\";\n",[551,25259,25260],{"class":553,"line":670},[551,25261,1139],{"emptyLinePlaceholder":238},[551,25263,25264],{"class":553,"line":1136},[551,25265,23850],{},[551,25267,25268],{"class":553,"line":1142},[551,25269,1151],{},[551,25271,25272],{"class":553,"line":1148},[551,25273,25274],{},"    \u002F\u002F Saltar vacíos o inválidos\n",[551,25276,25277],{"class":553,"line":1154},[551,25278,25279],{},"    if (componente == \"\" || componente == \"INVALIDO\")\n",[551,25281,25282],{"class":553,"line":1160},[551,25283,1169],{},[551,25285,25286],{"class":553,"line":1166},[551,25287,25288],{},"        continue;\n",[551,25290,25291],{"class":553,"line":1172},[551,25292,1187],{},[551,25294,25295],{"class":553,"line":1178},[551,25296,1139],{"emptyLinePlaceholder":238},[551,25298,25299],{"class":553,"line":1184},[551,25300,25301],{},"    componentesValidos += componente + \"\\n\";\n",[551,25303,25304],{"class":553,"line":1190},[551,25305,1193],{},[551,25307,25308],{"class":553,"line":1472},[551,25309,1139],{"emptyLinePlaceholder":238},[551,25311,25312],{"class":553,"line":1477},[551,25313,25314],{},"MessageBox.Show(componentesValidos);\n",[551,25316,25317],{"class":553,"line":1797},[551,25318,25319],{},"\u002F\u002F K1, Q1, F1, K2\n",[367,25321,25323],{"id":25322},"_63-diferencia-entre-break-y-continue","6.3 Diferencia entre break y continue",[543,25325,25327],{"className":545,"code":25326,"language":547,"meta":228,"style":228},"\u002F\u002F break: SALE del bucle completamente\nfor (int i = 0; i \u003C 5; i++)\n{\n    if (i == 2) break;\n    MessageBox.Show(\"i: \" + i);\n}\n\u002F\u002F Muestra: 0, 1 (termina)\n\n\u002F\u002F continue: SALTA a la siguiente iteración\nfor (int i = 0; i \u003C 5; i++)\n{\n    if (i == 2) continue;\n    MessageBox.Show(\"i: \" + i);\n}\n\u002F\u002F Muestra: 0, 1, 3, 4 (salta el 2, pero continúa)\n",[54,25328,25329,25334,25338,25342,25347,25351,25355,25360,25364,25369,25373,25377,25382,25386,25390],{"__ignoreMap":228},[551,25330,25331],{"class":553,"line":554},[551,25332,25333],{},"\u002F\u002F break: SALE del bucle completamente\n",[551,25335,25336],{"class":553,"line":229},[551,25337,23305],{},[551,25339,25340],{"class":553,"line":670},[551,25341,1151],{},[551,25343,25344],{"class":553,"line":1136},[551,25345,25346],{},"    if (i == 2) break;\n",[551,25348,25349],{"class":553,"line":1142},[551,25350,24269],{},[551,25352,25353],{"class":553,"line":1148},[551,25354,1193],{},[551,25356,25357],{"class":553,"line":1154},[551,25358,25359],{},"\u002F\u002F Muestra: 0, 1 (termina)\n",[551,25361,25362],{"class":553,"line":1160},[551,25363,1139],{"emptyLinePlaceholder":238},[551,25365,25366],{"class":553,"line":1166},[551,25367,25368],{},"\u002F\u002F continue: SALTA a la siguiente iteración\n",[551,25370,25371],{"class":553,"line":1172},[551,25372,23305],{},[551,25374,25375],{"class":553,"line":1178},[551,25376,1151],{},[551,25378,25379],{"class":553,"line":1184},[551,25380,25381],{},"    if (i == 2) continue;\n",[551,25383,25384],{"class":553,"line":1190},[551,25385,24269],{},[551,25387,25388],{"class":553,"line":1472},[551,25389,1193],{},[551,25391,25392],{"class":553,"line":1477},[551,25393,25394],{},"\u002F\u002F Muestra: 0, 1, 3, 4 (salta el 2, pero continúa)\n",[43,25396],{},[331,25398,25400],{"id":25399},"_7-bucles-anidados-bucles-dentro-de-bucles","7. Bucles anidados - Bucles dentro de bucles",[13,25402,25403,25404,2854,25407,41],{},"Puedes colocar un bucle dentro de otro para procesar ",[16,25405,25406],{},"estructuras bidimensionales",[16,25408,25409],{},"combinaciones",[367,25411,25413],{"id":25412},"_71-sintaxis-básica","7.1 Sintaxis básica",[543,25415,25417],{"className":545,"code":25416,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 3; i++)\n{\n    for (int j = 0; j \u003C 3; j++)\n    {\n        MessageBox.Show(string.Format(\"i={0}, j={1}\", i, j));\n    }\n}\n\u002F\u002F i=0, j=0\n\u002F\u002F i=0, j=1\n\u002F\u002F i=0, j=2\n\u002F\u002F i=1, j=0\n\u002F\u002F i=1, j=1\n\u002F\u002F ...\n",[54,25418,25419,25424,25428,25433,25437,25442,25446,25450,25455,25460,25465,25470,25475],{"__ignoreMap":228},[551,25420,25421],{"class":553,"line":554},[551,25422,25423],{},"for (int i = 0; i \u003C 3; i++)\n",[551,25425,25426],{"class":553,"line":229},[551,25427,1151],{},[551,25429,25430],{"class":553,"line":670},[551,25431,25432],{},"    for (int j = 0; j \u003C 3; j++)\n",[551,25434,25435],{"class":553,"line":1136},[551,25436,1169],{},[551,25438,25439],{"class":553,"line":1142},[551,25440,25441],{},"        MessageBox.Show(string.Format(\"i={0}, j={1}\", i, j));\n",[551,25443,25444],{"class":553,"line":1148},[551,25445,1187],{},[551,25447,25448],{"class":553,"line":1154},[551,25449,1193],{},[551,25451,25452],{"class":553,"line":1160},[551,25453,25454],{},"\u002F\u002F i=0, j=0\n",[551,25456,25457],{"class":553,"line":1166},[551,25458,25459],{},"\u002F\u002F i=0, j=1\n",[551,25461,25462],{"class":553,"line":1172},[551,25463,25464],{},"\u002F\u002F i=0, j=2\n",[551,25466,25467],{"class":553,"line":1178},[551,25468,25469],{},"\u002F\u002F i=1, j=0\n",[551,25471,25472],{"class":553,"line":1184},[551,25473,25474],{},"\u002F\u002F i=1, j=1\n",[551,25476,25477],{"class":553,"line":1190},[551,25478,23534],{},[13,25480,25481,25484],{},[16,25482,25483],{},"Iteraciones totales",": 3 × 3 = 9",[367,25486,25488],{"id":25487},"_72-ejemplos-prácticos","7.2 Ejemplos prácticos",[13,25490,25491],{},[16,25492,25493],{},"Ejemplo 1: Procesar múltiples proyectos con múltiples idiomas",[543,25495,25497],{"className":545,"code":25496,"language":547,"meta":228,"style":228},"string[] proyectos = {\"Proyecto_A\", \"Proyecto_B\", \"Proyecto_C\"};\nstring[] idiomas = {\"ES\", \"EN\", \"FR\"};\n\nstring reporte = \"Exportaciones a realizar:\\n\";\n\nforeach (string proyecto in proyectos)\n{\n    foreach (string idioma in idiomas)\n    {\n        reporte += string.Format(\"- {0} en {1}\\n\", proyecto, idioma);\n    }\n}\n\nMessageBox.Show(reporte);\n\u002F\u002F Proyecto_A en ES\n\u002F\u002F Proyecto_A en EN\n\u002F\u002F Proyecto_A en FR\n\u002F\u002F Proyecto_B en ES\n\u002F\u002F ...\n",[54,25498,25499,25504,25509,25513,25518,25522,25527,25531,25536,25540,25545,25549,25553,25557,25562,25567,25572,25577,25582],{"__ignoreMap":228},[551,25500,25501],{"class":553,"line":554},[551,25502,25503],{},"string[] proyectos = {\"Proyecto_A\", \"Proyecto_B\", \"Proyecto_C\"};\n",[551,25505,25506],{"class":553,"line":229},[551,25507,25508],{},"string[] idiomas = {\"ES\", \"EN\", \"FR\"};\n",[551,25510,25511],{"class":553,"line":670},[551,25512,1139],{"emptyLinePlaceholder":238},[551,25514,25515],{"class":553,"line":1136},[551,25516,25517],{},"string reporte = \"Exportaciones a realizar:\\n\";\n",[551,25519,25520],{"class":553,"line":1142},[551,25521,1139],{"emptyLinePlaceholder":238},[551,25523,25524],{"class":553,"line":1148},[551,25525,25526],{},"foreach (string proyecto in proyectos)\n",[551,25528,25529],{"class":553,"line":1154},[551,25530,1151],{},[551,25532,25533],{"class":553,"line":1160},[551,25534,25535],{},"    foreach (string idioma in idiomas)\n",[551,25537,25538],{"class":553,"line":1166},[551,25539,1169],{},[551,25541,25542],{"class":553,"line":1172},[551,25543,25544],{},"        reporte += string.Format(\"- {0} en {1}\\n\", proyecto, idioma);\n",[551,25546,25547],{"class":553,"line":1178},[551,25548,1187],{},[551,25550,25551],{"class":553,"line":1184},[551,25552,1193],{},[551,25554,25555],{"class":553,"line":1190},[551,25556,1139],{"emptyLinePlaceholder":238},[551,25558,25559],{"class":553,"line":1472},[551,25560,25561],{},"MessageBox.Show(reporte);\n",[551,25563,25564],{"class":553,"line":1477},[551,25565,25566],{},"\u002F\u002F Proyecto_A en ES\n",[551,25568,25569],{"class":553,"line":1797},[551,25570,25571],{},"\u002F\u002F Proyecto_A en EN\n",[551,25573,25574],{"class":553,"line":1802},[551,25575,25576],{},"\u002F\u002F Proyecto_A en FR\n",[551,25578,25579],{"class":553,"line":1808},[551,25580,25581],{},"\u002F\u002F Proyecto_B en ES\n",[551,25583,25584],{"class":553,"line":1814},[551,25585,23534],{},[13,25587,25588],{},[16,25589,25590],{},"Ejemplo 2: Calcular resistencias en matriz (serie + paralelo)",[543,25592,25594],{"className":545,"code":25593,"language":547,"meta":228,"style":228},"\u002F\u002F 3 ramas en paralelo, cada una con 4 resistencias en serie\ndouble[][] resistencias = new double[][]\n{\n    new double[] {100, 220, 330, 470},  \u002F\u002F Rama 1\n    new double[] {150, 270, 390, 510},  \u002F\u002F Rama 2\n    new double[] {180, 300, 420, 560}   \u002F\u002F Rama 3\n};\n\nstring reporte = \"CÁLCULO DE RESISTENCIAS:\\n\\n\";\n\n\u002F\u002F Calcular resistencia de cada rama (serie)\ndouble[] resistenciasPorRama = new double[resistencias.Length];\n\nfor (int rama = 0; rama \u003C resistencias.Length; rama++)\n{\n    double resistenciaRama = 0;\n\n    for (int r = 0; r \u003C resistencias[rama].Length; r++)\n    {\n        resistenciaRama += resistencias[rama][r];\n    }\n\n    resistenciasPorRama[rama] = resistenciaRama;\n    reporte += string.Format(\"Rama {0}: {1:F2} Ω\\n\", rama + 1, resistenciaRama);\n}\n\n\u002F\u002F Calcular resistencia total en paralelo\n\u002F\u002F 1\u002FRtotal = 1\u002FR1 + 1\u002FR2 + 1\u002FR3\ndouble sumaInversos = 0;\n\nfor (int i = 0; i \u003C resistenciasPorRama.Length; i++)\n{\n    sumaInversos += 1.0 \u002F resistenciasPorRama[i];\n}\n\ndouble resistenciaTotal = 1.0 \u002F sumaInversos;\n\nreporte += string.Format(\"\\nResistencia total (paralelo): {0:F2} Ω\", resistenciaTotal);\n\nMessageBox.Show(reporte);\n",[54,25595,25596,25601,25606,25610,25615,25620,25625,25629,25633,25638,25642,25647,25652,25656,25661,25665,25670,25674,25679,25683,25688,25692,25696,25701,25706,25710,25714,25719,25724,25729,25733,25738,25742,25747,25751,25755,25760,25764,25769,25773],{"__ignoreMap":228},[551,25597,25598],{"class":553,"line":554},[551,25599,25600],{},"\u002F\u002F 3 ramas en paralelo, cada una con 4 resistencias en serie\n",[551,25602,25603],{"class":553,"line":229},[551,25604,25605],{},"double[][] resistencias = new double[][]\n",[551,25607,25608],{"class":553,"line":670},[551,25609,1151],{},[551,25611,25612],{"class":553,"line":1136},[551,25613,25614],{},"    new double[] {100, 220, 330, 470},  \u002F\u002F Rama 1\n",[551,25616,25617],{"class":553,"line":1142},[551,25618,25619],{},"    new double[] {150, 270, 390, 510},  \u002F\u002F Rama 2\n",[551,25621,25622],{"class":553,"line":1148},[551,25623,25624],{},"    new double[] {180, 300, 420, 560}   \u002F\u002F Rama 3\n",[551,25626,25627],{"class":553,"line":1154},[551,25628,18964],{},[551,25630,25631],{"class":553,"line":1160},[551,25632,1139],{"emptyLinePlaceholder":238},[551,25634,25635],{"class":553,"line":1166},[551,25636,25637],{},"string reporte = \"CÁLCULO DE RESISTENCIAS:\\n\\n\";\n",[551,25639,25640],{"class":553,"line":1172},[551,25641,1139],{"emptyLinePlaceholder":238},[551,25643,25644],{"class":553,"line":1178},[551,25645,25646],{},"\u002F\u002F Calcular resistencia de cada rama (serie)\n",[551,25648,25649],{"class":553,"line":1184},[551,25650,25651],{},"double[] resistenciasPorRama = new double[resistencias.Length];\n",[551,25653,25654],{"class":553,"line":1190},[551,25655,1139],{"emptyLinePlaceholder":238},[551,25657,25658],{"class":553,"line":1472},[551,25659,25660],{},"for (int rama = 0; rama \u003C resistencias.Length; rama++)\n",[551,25662,25663],{"class":553,"line":1477},[551,25664,1151],{},[551,25666,25667],{"class":553,"line":1797},[551,25668,25669],{},"    double resistenciaRama = 0;\n",[551,25671,25672],{"class":553,"line":1802},[551,25673,1139],{"emptyLinePlaceholder":238},[551,25675,25676],{"class":553,"line":1808},[551,25677,25678],{},"    for (int r = 0; r \u003C resistencias[rama].Length; r++)\n",[551,25680,25681],{"class":553,"line":1814},[551,25682,1169],{},[551,25684,25685],{"class":553,"line":1820},[551,25686,25687],{},"        resistenciaRama += resistencias[rama][r];\n",[551,25689,25690],{"class":553,"line":1826},[551,25691,1187],{},[551,25693,25694],{"class":553,"line":1832},[551,25695,1139],{"emptyLinePlaceholder":238},[551,25697,25698],{"class":553,"line":1838},[551,25699,25700],{},"    resistenciasPorRama[rama] = resistenciaRama;\n",[551,25702,25703],{"class":553,"line":1844},[551,25704,25705],{},"    reporte += string.Format(\"Rama {0}: {1:F2} Ω\\n\", rama + 1, resistenciaRama);\n",[551,25707,25708],{"class":553,"line":1850},[551,25709,1193],{},[551,25711,25712],{"class":553,"line":1855},[551,25713,1139],{"emptyLinePlaceholder":238},[551,25715,25716],{"class":553,"line":1861},[551,25717,25718],{},"\u002F\u002F Calcular resistencia total en paralelo\n",[551,25720,25721],{"class":553,"line":1867},[551,25722,25723],{},"\u002F\u002F 1\u002FRtotal = 1\u002FR1 + 1\u002FR2 + 1\u002FR3\n",[551,25725,25726],{"class":553,"line":1873},[551,25727,25728],{},"double sumaInversos = 0;\n",[551,25730,25731],{"class":553,"line":1878},[551,25732,1139],{"emptyLinePlaceholder":238},[551,25734,25735],{"class":553,"line":1883},[551,25736,25737],{},"for (int i = 0; i \u003C resistenciasPorRama.Length; i++)\n",[551,25739,25740],{"class":553,"line":1888},[551,25741,1151],{},[551,25743,25744],{"class":553,"line":4615},[551,25745,25746],{},"    sumaInversos += 1.0 \u002F resistenciasPorRama[i];\n",[551,25748,25749],{"class":553,"line":4620},[551,25750,1193],{},[551,25752,25753],{"class":553,"line":4626},[551,25754,1139],{"emptyLinePlaceholder":238},[551,25756,25757],{"class":553,"line":4631},[551,25758,25759],{},"double resistenciaTotal = 1.0 \u002F sumaInversos;\n",[551,25761,25762],{"class":553,"line":4636},[551,25763,1139],{"emptyLinePlaceholder":238},[551,25765,25766],{"class":553,"line":4641},[551,25767,25768],{},"reporte += string.Format(\"\\nResistencia total (paralelo): {0:F2} Ω\", resistenciaTotal);\n",[551,25770,25771],{"class":553,"line":4647},[551,25772,1139],{"emptyLinePlaceholder":238},[551,25774,25775],{"class":553,"line":4653},[551,25776,25561],{},[13,25778,25779],{},[16,25780,25781],{},"Ejemplo 3: Generar tabla de multiplicar",[543,25783,25785],{"className":545,"code":25784,"language":547,"meta":228,"style":228},"string tabla = \"TABLA DE VALORES DE CABLES:\\n\\n\";\ntabla += \"Sección(mm²) | 10A | 16A | 20A | 25A\\n\";\ntabla += \"--------------------------------------\\n\";\n\ndouble[] secciones = {1.5, 2.5, 4.0, 6.0};\ndouble[] corrientes = {10, 16, 20, 25};\n\nforeach (double seccion in secciones)\n{\n    tabla += string.Format(\"{0,12} |\", seccion);\n\n    foreach (double corriente in corrientes)\n    {\n        \u002F\u002F Caída de tensión simplificada: ΔV = 2 × L × I × ρ \u002F S\n        double longitud = 50.0;  \u002F\u002F m\n        double resistividad = 0.018;\n        double caidaTension = (2 * longitud * corriente * resistividad) \u002F seccion;\n\n        tabla += string.Format(\" {0:F1}V |\", caidaTension);\n    }\n\n    tabla += \"\\n\";\n}\n\nMessageBox.Show(tabla);\n",[54,25786,25787,25792,25797,25802,25806,25811,25816,25820,25825,25829,25834,25838,25843,25847,25852,25857,25862,25867,25871,25876,25880,25884,25889,25893,25897],{"__ignoreMap":228},[551,25788,25789],{"class":553,"line":554},[551,25790,25791],{},"string tabla = \"TABLA DE VALORES DE CABLES:\\n\\n\";\n",[551,25793,25794],{"class":553,"line":229},[551,25795,25796],{},"tabla += \"Sección(mm²) | 10A | 16A | 20A | 25A\\n\";\n",[551,25798,25799],{"class":553,"line":670},[551,25800,25801],{},"tabla += \"--------------------------------------\\n\";\n",[551,25803,25804],{"class":553,"line":1136},[551,25805,1139],{"emptyLinePlaceholder":238},[551,25807,25808],{"class":553,"line":1142},[551,25809,25810],{},"double[] secciones = {1.5, 2.5, 4.0, 6.0};\n",[551,25812,25813],{"class":553,"line":1148},[551,25814,25815],{},"double[] corrientes = {10, 16, 20, 25};\n",[551,25817,25818],{"class":553,"line":1154},[551,25819,1139],{"emptyLinePlaceholder":238},[551,25821,25822],{"class":553,"line":1160},[551,25823,25824],{},"foreach (double seccion in secciones)\n",[551,25826,25827],{"class":553,"line":1166},[551,25828,1151],{},[551,25830,25831],{"class":553,"line":1172},[551,25832,25833],{},"    tabla += string.Format(\"{0,12} |\", seccion);\n",[551,25835,25836],{"class":553,"line":1178},[551,25837,1139],{"emptyLinePlaceholder":238},[551,25839,25840],{"class":553,"line":1184},[551,25841,25842],{},"    foreach (double corriente in corrientes)\n",[551,25844,25845],{"class":553,"line":1190},[551,25846,1169],{},[551,25848,25849],{"class":553,"line":1472},[551,25850,25851],{},"        \u002F\u002F Caída de tensión simplificada: ΔV = 2 × L × I × ρ \u002F S\n",[551,25853,25854],{"class":553,"line":1477},[551,25855,25856],{},"        double longitud = 50.0;  \u002F\u002F m\n",[551,25858,25859],{"class":553,"line":1797},[551,25860,25861],{},"        double resistividad = 0.018;\n",[551,25863,25864],{"class":553,"line":1802},[551,25865,25866],{},"        double caidaTension = (2 * longitud * corriente * resistividad) \u002F seccion;\n",[551,25868,25869],{"class":553,"line":1808},[551,25870,1139],{"emptyLinePlaceholder":238},[551,25872,25873],{"class":553,"line":1814},[551,25874,25875],{},"        tabla += string.Format(\" {0:F1}V |\", caidaTension);\n",[551,25877,25878],{"class":553,"line":1820},[551,25879,1187],{},[551,25881,25882],{"class":553,"line":1826},[551,25883,1139],{"emptyLinePlaceholder":238},[551,25885,25886],{"class":553,"line":1832},[551,25887,25888],{},"    tabla += \"\\n\";\n",[551,25890,25891],{"class":553,"line":1838},[551,25892,1193],{},[551,25894,25895],{"class":553,"line":1844},[551,25896,1139],{"emptyLinePlaceholder":238},[551,25898,25899],{"class":553,"line":1850},[551,25900,25901],{},"MessageBox.Show(tabla);\n",[367,25903,25905],{"id":25904},"_73-cuidado-con-la-complejidad","7.3 Cuidado con la complejidad",[13,25907,25908,25911],{},[16,25909,25910],{},"3 bucles anidados",": 10 × 10 × 10 = 1,000 iteraciones",[543,25913,25915],{"className":545,"code":25914,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 10; i++)\n{\n    for (int j = 0; j \u003C 10; j++)\n    {\n        for (int k = 0; k \u003C 10; k++)\n        {\n            \u002F\u002F 1000 iteraciones\n        }\n    }\n}\n",[54,25916,25917,25921,25925,25930,25934,25939,25943,25948,25952,25956],{"__ignoreMap":228},[551,25918,25919],{"class":553,"line":554},[551,25920,25080],{},[551,25922,25923],{"class":553,"line":229},[551,25924,1151],{},[551,25926,25927],{"class":553,"line":670},[551,25928,25929],{},"    for (int j = 0; j \u003C 10; j++)\n",[551,25931,25932],{"class":553,"line":1136},[551,25933,1169],{},[551,25935,25936],{"class":553,"line":1142},[551,25937,25938],{},"        for (int k = 0; k \u003C 10; k++)\n",[551,25940,25941],{"class":553,"line":1148},[551,25942,9062],{},[551,25944,25945],{"class":553,"line":1154},[551,25946,25947],{},"            \u002F\u002F 1000 iteraciones\n",[551,25949,25950],{"class":553,"line":1160},[551,25951,9077],{},[551,25953,25954],{"class":553,"line":1166},[551,25955,1187],{},[551,25957,25958],{"class":553,"line":1172},[551,25959,1193],{},[13,25961,25962,25965],{},[16,25963,25964],{},"Regla general",": Evita más de 2-3 niveles de anidación para mantener el código legible.",[43,25967],{},[46,25969,4025],{"id":4024},[13,25971,7975,25972,25974],{},[16,25973,23096],{}," que use todos los tipos de bucles.",[331,25976,7982],{"id":7981},[543,25978,25980],{"className":545,"code":25979,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class ProcesadorComponentes\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DE ENTRADA\n        \u002F\u002F ========================================\n\n        \u002F\u002F Lista de componentes a procesar\n        string[] componentesID = {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\", \"F2\", \"M1\", \"M2\"};\n\n        \u002F\u002F Corrientes por componente (en orden)\n        double[] corrientes = {25.0, 40.0, 16.0, 20.0, 10.0, 16.0, 7.5, 11.0};\n\n        \u002F\u002F Resistencias para cálculo (Ohmios)\n        double[] resistenciasSerie = {100, 220, 330, 470, 560};\n\n        \u002F\u002F Voltajes medidos en diferentes puntos\n        double[] voltajesMedidos = {232.5, 228.3, 235.1, 226.8, 230.2, 233.7};\n    }\n}\n",[54,25981,25982,25986,25990,25994,25998,26003,26007,26011,26015,26019,26023,26028,26032,26036,26041,26046,26050,26055,26060,26064,26069,26074,26078,26083,26088,26092],{"__ignoreMap":228},[551,25983,25984],{"class":553,"line":554},[551,25985,1123],{},[551,25987,25988],{"class":553,"line":229},[551,25989,1128],{},[551,25991,25992],{"class":553,"line":670},[551,25993,1133],{},[551,25995,25996],{"class":553,"line":1136},[551,25997,1139],{"emptyLinePlaceholder":238},[551,25999,26000],{"class":553,"line":1142},[551,26001,26002],{},"public class ProcesadorComponentes\n",[551,26004,26005],{"class":553,"line":1148},[551,26006,1151],{},[551,26008,26009],{"class":553,"line":1154},[551,26010,1157],{},[551,26012,26013],{"class":553,"line":1160},[551,26014,1163],{},[551,26016,26017],{"class":553,"line":1166},[551,26018,1169],{},[551,26020,26021],{"class":553,"line":1172},[551,26022,4511],{},[551,26024,26025],{"class":553,"line":1178},[551,26026,26027],{},"        \u002F\u002F DATOS DE ENTRADA\n",[551,26029,26030],{"class":553,"line":1184},[551,26031,4511],{},[551,26033,26034],{"class":553,"line":1190},[551,26035,1139],{"emptyLinePlaceholder":238},[551,26037,26038],{"class":553,"line":1472},[551,26039,26040],{},"        \u002F\u002F Lista de componentes a procesar\n",[551,26042,26043],{"class":553,"line":1477},[551,26044,26045],{},"        string[] componentesID = {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\", \"F2\", \"M1\", \"M2\"};\n",[551,26047,26048],{"class":553,"line":1797},[551,26049,1139],{"emptyLinePlaceholder":238},[551,26051,26052],{"class":553,"line":1802},[551,26053,26054],{},"        \u002F\u002F Corrientes por componente (en orden)\n",[551,26056,26057],{"class":553,"line":1808},[551,26058,26059],{},"        double[] corrientes = {25.0, 40.0, 16.0, 20.0, 10.0, 16.0, 7.5, 11.0};\n",[551,26061,26062],{"class":553,"line":1814},[551,26063,1139],{"emptyLinePlaceholder":238},[551,26065,26066],{"class":553,"line":1820},[551,26067,26068],{},"        \u002F\u002F Resistencias para cálculo (Ohmios)\n",[551,26070,26071],{"class":553,"line":1826},[551,26072,26073],{},"        double[] resistenciasSerie = {100, 220, 330, 470, 560};\n",[551,26075,26076],{"class":553,"line":1832},[551,26077,1139],{"emptyLinePlaceholder":238},[551,26079,26080],{"class":553,"line":1838},[551,26081,26082],{},"        \u002F\u002F Voltajes medidos en diferentes puntos\n",[551,26084,26085],{"class":553,"line":1844},[551,26086,26087],{},"        double[] voltajesMedidos = {232.5, 228.3, 235.1, 226.8, 230.2, 233.7};\n",[551,26089,26090],{"class":553,"line":1850},[551,26091,1187],{},[551,26093,26094],{"class":553,"line":1855},[551,26095,1193],{},[43,26097],{},[331,26099,26101],{"id":26100},"paso-2-procesar-componentes-con-for","Paso 2: Procesar componentes con for",[543,26103,26105],{"className":545,"code":26104,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PROCESAMIENTO 1: VALIDAR COMPONENTES\n\u002F\u002F ========================================\n\nstring reporteComponentes = \"=== VALIDACIÓN DE COMPONENTES ===\\n\\n\";\nint componentesOK = 0;\nint componentesAdvertencia = 0;\n\nfor (int i = 0; i \u003C componentesID.Length; i++)\n{\n    string id = componentesID[i];\n    double corriente = corrientes[i];\n\n    \u002F\u002F Clasificar según corriente\n    string clasificacion;\n    if (corriente \u003C 16.0)\n    {\n        clasificacion = \"Baja corriente\";\n        componentesOK++;\n    }\n    else if (corriente \u003C= 32.0)\n    {\n        clasificacion = \"Corriente media\";\n        componentesOK++;\n    }\n    else\n    {\n        clasificacion = \"ALTA CORRIENTE - Verificar\";\n        componentesAdvertencia++;\n    }\n\n    reporteComponentes += string.Format(\n        \"{0}: {1:F1}A - {2}\\n\",\n        id,\n        corriente,\n        clasificacion\n    );\n}\n\nreporteComponentes += string.Format(\n    \"\\nResumen: {0} OK, {1} con advertencia\\n\",\n    componentesOK,\n    componentesAdvertencia\n);\n",[54,26106,26107,26111,26116,26120,26124,26129,26134,26139,26143,26148,26152,26157,26162,26166,26171,26176,26181,26185,26190,26195,26199,26204,26208,26213,26217,26221,26225,26229,26234,26239,26243,26247,26252,26257,26262,26267,26272,26277,26281,26285,26290,26295,26300,26305],{"__ignoreMap":228},[551,26108,26109],{"class":553,"line":554},[551,26110,8157],{},[551,26112,26113],{"class":553,"line":229},[551,26114,26115],{},"\u002F\u002F PROCESAMIENTO 1: VALIDAR COMPONENTES\n",[551,26117,26118],{"class":553,"line":670},[551,26119,8157],{},[551,26121,26122],{"class":553,"line":1136},[551,26123,1139],{"emptyLinePlaceholder":238},[551,26125,26126],{"class":553,"line":1142},[551,26127,26128],{},"string reporteComponentes = \"=== VALIDACIÓN DE COMPONENTES ===\\n\\n\";\n",[551,26130,26131],{"class":553,"line":1148},[551,26132,26133],{},"int componentesOK = 0;\n",[551,26135,26136],{"class":553,"line":1154},[551,26137,26138],{},"int componentesAdvertencia = 0;\n",[551,26140,26141],{"class":553,"line":1160},[551,26142,1139],{"emptyLinePlaceholder":238},[551,26144,26145],{"class":553,"line":1166},[551,26146,26147],{},"for (int i = 0; i \u003C componentesID.Length; i++)\n",[551,26149,26150],{"class":553,"line":1172},[551,26151,1151],{},[551,26153,26154],{"class":553,"line":1178},[551,26155,26156],{},"    string id = componentesID[i];\n",[551,26158,26159],{"class":553,"line":1184},[551,26160,26161],{},"    double corriente = corrientes[i];\n",[551,26163,26164],{"class":553,"line":1190},[551,26165,1139],{"emptyLinePlaceholder":238},[551,26167,26168],{"class":553,"line":1472},[551,26169,26170],{},"    \u002F\u002F Clasificar según corriente\n",[551,26172,26173],{"class":553,"line":1477},[551,26174,26175],{},"    string clasificacion;\n",[551,26177,26178],{"class":553,"line":1797},[551,26179,26180],{},"    if (corriente \u003C 16.0)\n",[551,26182,26183],{"class":553,"line":1802},[551,26184,1169],{},[551,26186,26187],{"class":553,"line":1808},[551,26188,26189],{},"        clasificacion = \"Baja corriente\";\n",[551,26191,26192],{"class":553,"line":1814},[551,26193,26194],{},"        componentesOK++;\n",[551,26196,26197],{"class":553,"line":1820},[551,26198,1187],{},[551,26200,26201],{"class":553,"line":1826},[551,26202,26203],{},"    else if (corriente \u003C= 32.0)\n",[551,26205,26206],{"class":553,"line":1832},[551,26207,1169],{},[551,26209,26210],{"class":553,"line":1838},[551,26211,26212],{},"        clasificacion = \"Corriente media\";\n",[551,26214,26215],{"class":553,"line":1844},[551,26216,26194],{},[551,26218,26219],{"class":553,"line":1850},[551,26220,1187],{},[551,26222,26223],{"class":553,"line":1855},[551,26224,12046],{},[551,26226,26227],{"class":553,"line":1861},[551,26228,1169],{},[551,26230,26231],{"class":553,"line":1867},[551,26232,26233],{},"        clasificacion = \"ALTA CORRIENTE - Verificar\";\n",[551,26235,26236],{"class":553,"line":1873},[551,26237,26238],{},"        componentesAdvertencia++;\n",[551,26240,26241],{"class":553,"line":1878},[551,26242,1187],{},[551,26244,26245],{"class":553,"line":1883},[551,26246,1139],{"emptyLinePlaceholder":238},[551,26248,26249],{"class":553,"line":1888},[551,26250,26251],{},"    reporteComponentes += string.Format(\n",[551,26253,26254],{"class":553,"line":4615},[551,26255,26256],{},"        \"{0}: {1:F1}A - {2}\\n\",\n",[551,26258,26259],{"class":553,"line":4620},[551,26260,26261],{},"        id,\n",[551,26263,26264],{"class":553,"line":4626},[551,26265,26266],{},"        corriente,\n",[551,26268,26269],{"class":553,"line":4631},[551,26270,26271],{},"        clasificacion\n",[551,26273,26274],{"class":553,"line":4636},[551,26275,26276],{},"    );\n",[551,26278,26279],{"class":553,"line":4641},[551,26280,1193],{},[551,26282,26283],{"class":553,"line":4647},[551,26284,1139],{"emptyLinePlaceholder":238},[551,26286,26287],{"class":553,"line":4653},[551,26288,26289],{},"reporteComponentes += string.Format(\n",[551,26291,26292],{"class":553,"line":4659},[551,26293,26294],{},"    \"\\nResumen: {0} OK, {1} con advertencia\\n\",\n",[551,26296,26297],{"class":553,"line":4665},[551,26298,26299],{},"    componentesOK,\n",[551,26301,26302],{"class":553,"line":4671},[551,26303,26304],{},"    componentesAdvertencia\n",[551,26306,26307],{"class":553,"line":4677},[551,26308,3967],{},[13,26310,26311,4390,26313,26315],{},[16,26312,4153],{},[54,26314,23258],{}," con índice para acceder simultáneamente a dos arrays paralelos (IDs y corrientes).",[43,26317],{},[331,26319,26321],{"id":26320},"paso-3-calcular-resistencias-con-foreach","Paso 3: Calcular resistencias con foreach",[543,26323,26325],{"className":545,"code":26324,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PROCESAMIENTO 2: CALCULAR RESISTENCIAS\n\u002F\u002F ========================================\n\nstring reporteResistencias = \"\\n=== CÁLCULO DE RESISTENCIAS ===\\n\\n\";\n\n\u002F\u002F Resistencias en serie (sumar todas)\ndouble resistenciaTotalSerie = 0;\n\nforeach (double resistencia in resistenciasSerie)\n{\n    resistenciaTotalSerie += resistencia;\n}\n\nreporteResistencias += string.Format(\n    \"Resistencia total en serie: {0:F2} Ω\\n\",\n    resistenciaTotalSerie\n);\n\n\u002F\u002F Resistencias en paralelo (fórmula: 1\u002FRtotal = 1\u002FR1 + 1\u002FR2 + ...)\ndouble sumaInversos = 0;\n\nforeach (double resistencia in resistenciasSerie)\n{\n    sumaInversos += 1.0 \u002F resistencia;\n}\n\ndouble resistenciaTotalParalelo = 1.0 \u002F sumaInversos;\n\nreporteResistencias += string.Format(\n    \"Resistencia total en paralelo: {0:F2} Ω\\n\",\n    resistenciaTotalParalelo\n);\n\n\u002F\u002F Mostrar detalle de cada resistencia\nreporteResistencias += \"\\nDetalle:\\n\";\nint numeroResistencia = 1;\n\nforeach (double resistencia in resistenciasSerie)\n{\n    reporteResistencias += string.Format(\n        \"R{0}: {1} Ω\\n\",\n        numeroResistencia,\n        resistencia\n    );\n    numeroResistencia++;\n}\n",[54,26326,26327,26331,26336,26340,26344,26349,26353,26358,26363,26367,26372,26376,26381,26385,26389,26394,26399,26404,26408,26412,26417,26421,26425,26429,26433,26438,26442,26446,26451,26455,26459,26464,26469,26473,26477,26482,26487,26492,26496,26500,26504,26509,26514,26519,26524,26528,26533],{"__ignoreMap":228},[551,26328,26329],{"class":553,"line":554},[551,26330,8157],{},[551,26332,26333],{"class":553,"line":229},[551,26334,26335],{},"\u002F\u002F PROCESAMIENTO 2: CALCULAR RESISTENCIAS\n",[551,26337,26338],{"class":553,"line":670},[551,26339,8157],{},[551,26341,26342],{"class":553,"line":1136},[551,26343,1139],{"emptyLinePlaceholder":238},[551,26345,26346],{"class":553,"line":1142},[551,26347,26348],{},"string reporteResistencias = \"\\n=== CÁLCULO DE RESISTENCIAS ===\\n\\n\";\n",[551,26350,26351],{"class":553,"line":1148},[551,26352,1139],{"emptyLinePlaceholder":238},[551,26354,26355],{"class":553,"line":1154},[551,26356,26357],{},"\u002F\u002F Resistencias en serie (sumar todas)\n",[551,26359,26360],{"class":553,"line":1160},[551,26361,26362],{},"double resistenciaTotalSerie = 0;\n",[551,26364,26365],{"class":553,"line":1166},[551,26366,1139],{"emptyLinePlaceholder":238},[551,26368,26369],{"class":553,"line":1172},[551,26370,26371],{},"foreach (double resistencia in resistenciasSerie)\n",[551,26373,26374],{"class":553,"line":1178},[551,26375,1151],{},[551,26377,26378],{"class":553,"line":1184},[551,26379,26380],{},"    resistenciaTotalSerie += resistencia;\n",[551,26382,26383],{"class":553,"line":1190},[551,26384,1193],{},[551,26386,26387],{"class":553,"line":1472},[551,26388,1139],{"emptyLinePlaceholder":238},[551,26390,26391],{"class":553,"line":1477},[551,26392,26393],{},"reporteResistencias += string.Format(\n",[551,26395,26396],{"class":553,"line":1797},[551,26397,26398],{},"    \"Resistencia total en serie: {0:F2} Ω\\n\",\n",[551,26400,26401],{"class":553,"line":1802},[551,26402,26403],{},"    resistenciaTotalSerie\n",[551,26405,26406],{"class":553,"line":1808},[551,26407,3967],{},[551,26409,26410],{"class":553,"line":1814},[551,26411,1139],{"emptyLinePlaceholder":238},[551,26413,26414],{"class":553,"line":1820},[551,26415,26416],{},"\u002F\u002F Resistencias en paralelo (fórmula: 1\u002FRtotal = 1\u002FR1 + 1\u002FR2 + ...)\n",[551,26418,26419],{"class":553,"line":1826},[551,26420,25728],{},[551,26422,26423],{"class":553,"line":1832},[551,26424,1139],{"emptyLinePlaceholder":238},[551,26426,26427],{"class":553,"line":1838},[551,26428,26371],{},[551,26430,26431],{"class":553,"line":1844},[551,26432,1151],{},[551,26434,26435],{"class":553,"line":1850},[551,26436,26437],{},"    sumaInversos += 1.0 \u002F resistencia;\n",[551,26439,26440],{"class":553,"line":1855},[551,26441,1193],{},[551,26443,26444],{"class":553,"line":1861},[551,26445,1139],{"emptyLinePlaceholder":238},[551,26447,26448],{"class":553,"line":1867},[551,26449,26450],{},"double resistenciaTotalParalelo = 1.0 \u002F sumaInversos;\n",[551,26452,26453],{"class":553,"line":1873},[551,26454,1139],{"emptyLinePlaceholder":238},[551,26456,26457],{"class":553,"line":1878},[551,26458,26393],{},[551,26460,26461],{"class":553,"line":1883},[551,26462,26463],{},"    \"Resistencia total en paralelo: {0:F2} Ω\\n\",\n",[551,26465,26466],{"class":553,"line":1888},[551,26467,26468],{},"    resistenciaTotalParalelo\n",[551,26470,26471],{"class":553,"line":4615},[551,26472,3967],{},[551,26474,26475],{"class":553,"line":4620},[551,26476,1139],{"emptyLinePlaceholder":238},[551,26478,26479],{"class":553,"line":4626},[551,26480,26481],{},"\u002F\u002F Mostrar detalle de cada resistencia\n",[551,26483,26484],{"class":553,"line":4631},[551,26485,26486],{},"reporteResistencias += \"\\nDetalle:\\n\";\n",[551,26488,26489],{"class":553,"line":4636},[551,26490,26491],{},"int numeroResistencia = 1;\n",[551,26493,26494],{"class":553,"line":4641},[551,26495,1139],{"emptyLinePlaceholder":238},[551,26497,26498],{"class":553,"line":4647},[551,26499,26371],{},[551,26501,26502],{"class":553,"line":4653},[551,26503,1151],{},[551,26505,26506],{"class":553,"line":4659},[551,26507,26508],{},"    reporteResistencias += string.Format(\n",[551,26510,26511],{"class":553,"line":4665},[551,26512,26513],{},"        \"R{0}: {1} Ω\\n\",\n",[551,26515,26516],{"class":553,"line":4671},[551,26517,26518],{},"        numeroResistencia,\n",[551,26520,26521],{"class":553,"line":4677},[551,26522,26523],{},"        resistencia\n",[551,26525,26526],{"class":553,"line":4683},[551,26527,26276],{},[551,26529,26530],{"class":553,"line":4689},[551,26531,26532],{},"    numeroResistencia++;\n",[551,26534,26535],{"class":553,"line":4695},[551,26536,1193],{},[13,26538,26539,4390,26541,26543],{},[16,26540,4153],{},[54,26542,23717],{}," para recorrer arrays sin necesidad de índices, ideal para sumas y cálculos acumulativos.",[43,26545],{},[331,26547,26549],{"id":26548},"paso-4-validar-voltajes-con-while","Paso 4: Validar voltajes con while",[543,26551,26553],{"className":545,"code":26552,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PROCESAMIENTO 3: VALIDAR VOLTAJES\n\u002F\u002F ========================================\n\nstring reporteVoltajes = \"\\n=== VALIDACIÓN DE VOLTAJES ===\\n\\n\";\n\ndouble voltajeMinimo = 207.0;  \u002F\u002F 230V - 10%\ndouble voltajeMaximo = 253.0;  \u002F\u002F 230V + 10%\nint voltajesCorrectos = 0;\nint voltajesIncorrectos = 0;\nint indice = 0;\n\nwhile (indice \u003C voltajesMedidos.Length)\n{\n    double voltaje = voltajesMedidos[indice];\n\n    if (voltaje >= voltajeMinimo && voltaje \u003C= voltajeMaximo)\n    {\n        reporteVoltajes += string.Format(\n            \"Punto {0}: {1:F1}V - OK\\n\",\n            indice + 1,\n            voltaje\n        );\n        voltajesCorrectos++;\n    }\n    else\n    {\n        reporteVoltajes += string.Format(\n            \"Punto {0}: {1:F1}V - FUERA DE RANGO\\n\",\n            indice + 1,\n            voltaje\n        );\n        voltajesIncorrectos++;\n    }\n\n    indice++;\n}\n\nreporteVoltajes += string.Format(\n    \"\\nTotal: {0} correctos, {1} fuera de rango\\n\",\n    voltajesCorrectos,\n    voltajesIncorrectos\n);\n",[54,26554,26555,26559,26564,26568,26572,26577,26581,26586,26591,26596,26601,26605,26609,26614,26618,26623,26627,26632,26636,26641,26646,26651,26656,26660,26665,26669,26673,26677,26681,26686,26690,26694,26698,26703,26707,26711,26715,26719,26723,26728,26733,26738,26743],{"__ignoreMap":228},[551,26556,26557],{"class":553,"line":554},[551,26558,8157],{},[551,26560,26561],{"class":553,"line":229},[551,26562,26563],{},"\u002F\u002F PROCESAMIENTO 3: VALIDAR VOLTAJES\n",[551,26565,26566],{"class":553,"line":670},[551,26567,8157],{},[551,26569,26570],{"class":553,"line":1136},[551,26571,1139],{"emptyLinePlaceholder":238},[551,26573,26574],{"class":553,"line":1142},[551,26575,26576],{},"string reporteVoltajes = \"\\n=== VALIDACIÓN DE VOLTAJES ===\\n\\n\";\n",[551,26578,26579],{"class":553,"line":1148},[551,26580,1139],{"emptyLinePlaceholder":238},[551,26582,26583],{"class":553,"line":1154},[551,26584,26585],{},"double voltajeMinimo = 207.0;  \u002F\u002F 230V - 10%\n",[551,26587,26588],{"class":553,"line":1160},[551,26589,26590],{},"double voltajeMaximo = 253.0;  \u002F\u002F 230V + 10%\n",[551,26592,26593],{"class":553,"line":1166},[551,26594,26595],{},"int voltajesCorrectos = 0;\n",[551,26597,26598],{"class":553,"line":1172},[551,26599,26600],{},"int voltajesIncorrectos = 0;\n",[551,26602,26603],{"class":553,"line":1178},[551,26604,24438],{},[551,26606,26607],{"class":553,"line":1184},[551,26608,1139],{"emptyLinePlaceholder":238},[551,26610,26611],{"class":553,"line":1190},[551,26612,26613],{},"while (indice \u003C voltajesMedidos.Length)\n",[551,26615,26616],{"class":553,"line":1472},[551,26617,1151],{},[551,26619,26620],{"class":553,"line":1477},[551,26621,26622],{},"    double voltaje = voltajesMedidos[indice];\n",[551,26624,26625],{"class":553,"line":1797},[551,26626,1139],{"emptyLinePlaceholder":238},[551,26628,26629],{"class":553,"line":1802},[551,26630,26631],{},"    if (voltaje >= voltajeMinimo && voltaje \u003C= voltajeMaximo)\n",[551,26633,26634],{"class":553,"line":1808},[551,26635,1169],{},[551,26637,26638],{"class":553,"line":1814},[551,26639,26640],{},"        reporteVoltajes += string.Format(\n",[551,26642,26643],{"class":553,"line":1820},[551,26644,26645],{},"            \"Punto {0}: {1:F1}V - OK\\n\",\n",[551,26647,26648],{"class":553,"line":1826},[551,26649,26650],{},"            indice + 1,\n",[551,26652,26653],{"class":553,"line":1832},[551,26654,26655],{},"            voltaje\n",[551,26657,26658],{"class":553,"line":1838},[551,26659,4758],{},[551,26661,26662],{"class":553,"line":1844},[551,26663,26664],{},"        voltajesCorrectos++;\n",[551,26666,26667],{"class":553,"line":1850},[551,26668,1187],{},[551,26670,26671],{"class":553,"line":1855},[551,26672,12046],{},[551,26674,26675],{"class":553,"line":1861},[551,26676,1169],{},[551,26678,26679],{"class":553,"line":1867},[551,26680,26640],{},[551,26682,26683],{"class":553,"line":1873},[551,26684,26685],{},"            \"Punto {0}: {1:F1}V - FUERA DE RANGO\\n\",\n",[551,26687,26688],{"class":553,"line":1878},[551,26689,26650],{},[551,26691,26692],{"class":553,"line":1883},[551,26693,26655],{},[551,26695,26696],{"class":553,"line":1888},[551,26697,4758],{},[551,26699,26700],{"class":553,"line":4615},[551,26701,26702],{},"        voltajesIncorrectos++;\n",[551,26704,26705],{"class":553,"line":4620},[551,26706,1187],{},[551,26708,26709],{"class":553,"line":4626},[551,26710,1139],{"emptyLinePlaceholder":238},[551,26712,26713],{"class":553,"line":4631},[551,26714,24499],{},[551,26716,26717],{"class":553,"line":4636},[551,26718,1193],{},[551,26720,26721],{"class":553,"line":4641},[551,26722,1139],{"emptyLinePlaceholder":238},[551,26724,26725],{"class":553,"line":4647},[551,26726,26727],{},"reporteVoltajes += string.Format(\n",[551,26729,26730],{"class":553,"line":4653},[551,26731,26732],{},"    \"\\nTotal: {0} correctos, {1} fuera de rango\\n\",\n",[551,26734,26735],{"class":553,"line":4659},[551,26736,26737],{},"    voltajesCorrectos,\n",[551,26739,26740],{"class":553,"line":4665},[551,26741,26742],{},"    voltajesIncorrectos\n",[551,26744,26745],{"class":553,"line":4671},[551,26746,3967],{},[13,26748,26749,4390,26751,26753],{},[16,26750,4153],{},[54,26752,24166],{}," con control manual del índice, útil cuando necesitas lógica más compleja dentro del bucle.",[43,26755],{},[331,26757,26759],{"id":26758},"paso-5-calcular-corriente-total-por-tipo-con-bucles-anidados","Paso 5: Calcular corriente total por tipo con bucles anidados",[543,26761,26763],{"className":545,"code":26762,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PROCESAMIENTO 4: ANÁLISIS POR TIPO\n\u002F\u002F ========================================\n\nstring reporteTipos = \"\\n=== ANÁLISIS POR TIPO DE COMPONENTE ===\\n\\n\";\n\n\u002F\u002F Tipos de componentes a buscar\nstring[] tiposComponentes = {\"K\", \"Q\", \"F\", \"M\"};\nstring[] nombresDescriptivos = {\"Contactores\", \"Guardamotores\", \"Relés térmicos\", \"Motores\"};\n\n\u002F\u002F Bucle externo: cada tipo de componente\nfor (int t = 0; t \u003C tiposComponentes.Length; t++)\n{\n    string tipo = tiposComponentes[t];\n    string nombre = nombresDescriptivos[t];\n    double corrienteTotal = 0;\n    int cantidad = 0;\n\n    \u002F\u002F Bucle interno: cada componente en la lista\n    for (int i = 0; i \u003C componentesID.Length; i++)\n    {\n        \u002F\u002F Verificar si el componente es de este tipo\n        if (componentesID[i].StartsWith(tipo))\n        {\n            corrienteTotal += corrientes[i];\n            cantidad++;\n        }\n    }\n\n    if (cantidad > 0)\n    {\n        double corrientePromedio = corrienteTotal \u002F cantidad;\n\n        reporteTipos += string.Format(\n            \"{0}:\\n\" +\n            \"  Cantidad: {1}\\n\" +\n            \"  Corriente total: {2:F1}A\\n\" +\n            \"  Corriente promedio: {3:F1}A\\n\\n\",\n            nombre,\n            cantidad,\n            corrienteTotal,\n            corrientePromedio\n        );\n    }\n}\n",[54,26764,26765,26769,26774,26778,26782,26787,26791,26796,26801,26806,26810,26815,26820,26824,26829,26834,26839,26844,26848,26853,26858,26862,26867,26872,26876,26881,26886,26890,26894,26898,26903,26907,26912,26916,26921,26926,26931,26936,26941,26946,26951,26956,26961,26965,26969],{"__ignoreMap":228},[551,26766,26767],{"class":553,"line":554},[551,26768,8157],{},[551,26770,26771],{"class":553,"line":229},[551,26772,26773],{},"\u002F\u002F PROCESAMIENTO 4: ANÁLISIS POR TIPO\n",[551,26775,26776],{"class":553,"line":670},[551,26777,8157],{},[551,26779,26780],{"class":553,"line":1136},[551,26781,1139],{"emptyLinePlaceholder":238},[551,26783,26784],{"class":553,"line":1142},[551,26785,26786],{},"string reporteTipos = \"\\n=== ANÁLISIS POR TIPO DE COMPONENTE ===\\n\\n\";\n",[551,26788,26789],{"class":553,"line":1148},[551,26790,1139],{"emptyLinePlaceholder":238},[551,26792,26793],{"class":553,"line":1154},[551,26794,26795],{},"\u002F\u002F Tipos de componentes a buscar\n",[551,26797,26798],{"class":553,"line":1160},[551,26799,26800],{},"string[] tiposComponentes = {\"K\", \"Q\", \"F\", \"M\"};\n",[551,26802,26803],{"class":553,"line":1166},[551,26804,26805],{},"string[] nombresDescriptivos = {\"Contactores\", \"Guardamotores\", \"Relés térmicos\", \"Motores\"};\n",[551,26807,26808],{"class":553,"line":1172},[551,26809,1139],{"emptyLinePlaceholder":238},[551,26811,26812],{"class":553,"line":1178},[551,26813,26814],{},"\u002F\u002F Bucle externo: cada tipo de componente\n",[551,26816,26817],{"class":553,"line":1184},[551,26818,26819],{},"for (int t = 0; t \u003C tiposComponentes.Length; t++)\n",[551,26821,26822],{"class":553,"line":1190},[551,26823,1151],{},[551,26825,26826],{"class":553,"line":1472},[551,26827,26828],{},"    string tipo = tiposComponentes[t];\n",[551,26830,26831],{"class":553,"line":1477},[551,26832,26833],{},"    string nombre = nombresDescriptivos[t];\n",[551,26835,26836],{"class":553,"line":1797},[551,26837,26838],{},"    double corrienteTotal = 0;\n",[551,26840,26841],{"class":553,"line":1802},[551,26842,26843],{},"    int cantidad = 0;\n",[551,26845,26846],{"class":553,"line":1808},[551,26847,1139],{"emptyLinePlaceholder":238},[551,26849,26850],{"class":553,"line":1814},[551,26851,26852],{},"    \u002F\u002F Bucle interno: cada componente en la lista\n",[551,26854,26855],{"class":553,"line":1820},[551,26856,26857],{},"    for (int i = 0; i \u003C componentesID.Length; i++)\n",[551,26859,26860],{"class":553,"line":1826},[551,26861,1169],{},[551,26863,26864],{"class":553,"line":1832},[551,26865,26866],{},"        \u002F\u002F Verificar si el componente es de este tipo\n",[551,26868,26869],{"class":553,"line":1838},[551,26870,26871],{},"        if (componentesID[i].StartsWith(tipo))\n",[551,26873,26874],{"class":553,"line":1844},[551,26875,9062],{},[551,26877,26878],{"class":553,"line":1850},[551,26879,26880],{},"            corrienteTotal += corrientes[i];\n",[551,26882,26883],{"class":553,"line":1855},[551,26884,26885],{},"            cantidad++;\n",[551,26887,26888],{"class":553,"line":1861},[551,26889,9077],{},[551,26891,26892],{"class":553,"line":1867},[551,26893,1187],{},[551,26895,26896],{"class":553,"line":1873},[551,26897,1139],{"emptyLinePlaceholder":238},[551,26899,26900],{"class":553,"line":1878},[551,26901,26902],{},"    if (cantidad > 0)\n",[551,26904,26905],{"class":553,"line":1883},[551,26906,1169],{},[551,26908,26909],{"class":553,"line":1888},[551,26910,26911],{},"        double corrientePromedio = corrienteTotal \u002F cantidad;\n",[551,26913,26914],{"class":553,"line":4615},[551,26915,1139],{"emptyLinePlaceholder":238},[551,26917,26918],{"class":553,"line":4620},[551,26919,26920],{},"        reporteTipos += string.Format(\n",[551,26922,26923],{"class":553,"line":4626},[551,26924,26925],{},"            \"{0}:\\n\" +\n",[551,26927,26928],{"class":553,"line":4631},[551,26929,26930],{},"            \"  Cantidad: {1}\\n\" +\n",[551,26932,26933],{"class":553,"line":4636},[551,26934,26935],{},"            \"  Corriente total: {2:F1}A\\n\" +\n",[551,26937,26938],{"class":553,"line":4641},[551,26939,26940],{},"            \"  Corriente promedio: {3:F1}A\\n\\n\",\n",[551,26942,26943],{"class":553,"line":4647},[551,26944,26945],{},"            nombre,\n",[551,26947,26948],{"class":553,"line":4653},[551,26949,26950],{},"            cantidad,\n",[551,26952,26953],{"class":553,"line":4659},[551,26954,26955],{},"            corrienteTotal,\n",[551,26957,26958],{"class":553,"line":4665},[551,26959,26960],{},"            corrientePromedio\n",[551,26962,26963],{"class":553,"line":4671},[551,26964,4758],{},[551,26966,26967],{"class":553,"line":4677},[551,26968,1187],{},[551,26970,26971],{"class":553,"line":4683},[551,26972,1193],{},[13,26974,26975,26977],{},[16,26976,4153],{},"\nUsamos bucles anidados para agrupar componentes por tipo y calcular estadísticas.",[43,26979],{},[331,26981,26983],{"id":26982},"paso-6-buscar-componentes-problemáticos-con-break","Paso 6: Buscar componentes problemáticos con break",[543,26985,26987],{"className":545,"code":26986,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F PROCESAMIENTO 5: DETECTAR PROBLEMAS\n\u002F\u002F ========================================\n\nstring reporteProblemas = \"\\n=== DETECCIÓN DE PROBLEMAS ===\\n\\n\";\n\n\u002F\u002F Buscar primer componente con corriente excesiva\nstring primerProblematico = \"\";\ndouble corrienteProblematica = 0;\ndouble limite = 35.0;  \u002F\u002F A\n\nfor (int i = 0; i \u003C componentesID.Length; i++)\n{\n    if (corrientes[i] > limite)\n    {\n        primerProblematico = componentesID[i];\n        corrienteProblematica = corrientes[i];\n        break;  \u002F\u002F Encontramos el primero, no necesitamos seguir\n    }\n}\n\nif (primerProblematico != \"\")\n{\n    reporteProblemas += string.Format(\n        \"ADVERTENCIA: Componente {0} con corriente excesiva: {1:F1}A (límite: {2}A)\\n\",\n        primerProblematico,\n        corrienteProblematica,\n        limite\n    );\n}\nelse\n{\n    reporteProblemas += \"Todos los componentes dentro de límites normales.\\n\";\n}\n\n\u002F\u002F Contar componentes válidos (saltando los problemáticos con continue)\nint componentesValidos = 0;\n\nforeach (double corriente in corrientes)\n{\n    if (corriente > limite)\n    {\n        continue;  \u002F\u002F Saltar este componente\n    }\n\n    componentesValidos++;\n}\n\nreporteProblemas += string.Format(\n    \"Componentes válidos: {0} de {1}\\n\",\n    componentesValidos,\n    corrientes.Length\n);\n",[54,26988,26989,26993,26998,27002,27006,27011,27015,27020,27025,27030,27035,27039,27043,27047,27052,27056,27061,27066,27071,27075,27079,27083,27088,27092,27097,27102,27107,27112,27117,27121,27125,27129,27133,27138,27142,27146,27151,27156,27160,27165,27169,27174,27178,27183,27187,27191,27196,27200,27204,27209,27214,27219,27224],{"__ignoreMap":228},[551,26990,26991],{"class":553,"line":554},[551,26992,8157],{},[551,26994,26995],{"class":553,"line":229},[551,26996,26997],{},"\u002F\u002F PROCESAMIENTO 5: DETECTAR PROBLEMAS\n",[551,26999,27000],{"class":553,"line":670},[551,27001,8157],{},[551,27003,27004],{"class":553,"line":1136},[551,27005,1139],{"emptyLinePlaceholder":238},[551,27007,27008],{"class":553,"line":1142},[551,27009,27010],{},"string reporteProblemas = \"\\n=== DETECCIÓN DE PROBLEMAS ===\\n\\n\";\n",[551,27012,27013],{"class":553,"line":1148},[551,27014,1139],{"emptyLinePlaceholder":238},[551,27016,27017],{"class":553,"line":1154},[551,27018,27019],{},"\u002F\u002F Buscar primer componente con corriente excesiva\n",[551,27021,27022],{"class":553,"line":1160},[551,27023,27024],{},"string primerProblematico = \"\";\n",[551,27026,27027],{"class":553,"line":1166},[551,27028,27029],{},"double corrienteProblematica = 0;\n",[551,27031,27032],{"class":553,"line":1172},[551,27033,27034],{},"double limite = 35.0;  \u002F\u002F A\n",[551,27036,27037],{"class":553,"line":1178},[551,27038,1139],{"emptyLinePlaceholder":238},[551,27040,27041],{"class":553,"line":1184},[551,27042,26147],{},[551,27044,27045],{"class":553,"line":1190},[551,27046,1151],{},[551,27048,27049],{"class":553,"line":1472},[551,27050,27051],{},"    if (corrientes[i] > limite)\n",[551,27053,27054],{"class":553,"line":1477},[551,27055,1169],{},[551,27057,27058],{"class":553,"line":1797},[551,27059,27060],{},"        primerProblematico = componentesID[i];\n",[551,27062,27063],{"class":553,"line":1802},[551,27064,27065],{},"        corrienteProblematica = corrientes[i];\n",[551,27067,27068],{"class":553,"line":1808},[551,27069,27070],{},"        break;  \u002F\u002F Encontramos el primero, no necesitamos seguir\n",[551,27072,27073],{"class":553,"line":1814},[551,27074,1187],{},[551,27076,27077],{"class":553,"line":1820},[551,27078,1193],{},[551,27080,27081],{"class":553,"line":1826},[551,27082,1139],{"emptyLinePlaceholder":238},[551,27084,27085],{"class":553,"line":1832},[551,27086,27087],{},"if (primerProblematico != \"\")\n",[551,27089,27090],{"class":553,"line":1838},[551,27091,1151],{},[551,27093,27094],{"class":553,"line":1844},[551,27095,27096],{},"    reporteProblemas += string.Format(\n",[551,27098,27099],{"class":553,"line":1850},[551,27100,27101],{},"        \"ADVERTENCIA: Componente {0} con corriente excesiva: {1:F1}A (límite: {2}A)\\n\",\n",[551,27103,27104],{"class":553,"line":1855},[551,27105,27106],{},"        primerProblematico,\n",[551,27108,27109],{"class":553,"line":1861},[551,27110,27111],{},"        corrienteProblematica,\n",[551,27113,27114],{"class":553,"line":1867},[551,27115,27116],{},"        limite\n",[551,27118,27119],{"class":553,"line":1873},[551,27120,26276],{},[551,27122,27123],{"class":553,"line":1878},[551,27124,1193],{},[551,27126,27127],{"class":553,"line":1883},[551,27128,3704],{},[551,27130,27131],{"class":553,"line":1888},[551,27132,1151],{},[551,27134,27135],{"class":553,"line":4615},[551,27136,27137],{},"    reporteProblemas += \"Todos los componentes dentro de límites normales.\\n\";\n",[551,27139,27140],{"class":553,"line":4620},[551,27141,1193],{},[551,27143,27144],{"class":553,"line":4626},[551,27145,1139],{"emptyLinePlaceholder":238},[551,27147,27148],{"class":553,"line":4631},[551,27149,27150],{},"\u002F\u002F Contar componentes válidos (saltando los problemáticos con continue)\n",[551,27152,27153],{"class":553,"line":4636},[551,27154,27155],{},"int componentesValidos = 0;\n",[551,27157,27158],{"class":553,"line":4641},[551,27159,1139],{"emptyLinePlaceholder":238},[551,27161,27162],{"class":553,"line":4647},[551,27163,27164],{},"foreach (double corriente in corrientes)\n",[551,27166,27167],{"class":553,"line":4653},[551,27168,1151],{},[551,27170,27171],{"class":553,"line":4659},[551,27172,27173],{},"    if (corriente > limite)\n",[551,27175,27176],{"class":553,"line":4665},[551,27177,1169],{},[551,27179,27180],{"class":553,"line":4671},[551,27181,27182],{},"        continue;  \u002F\u002F Saltar este componente\n",[551,27184,27185],{"class":553,"line":4677},[551,27186,1187],{},[551,27188,27189],{"class":553,"line":4683},[551,27190,1139],{"emptyLinePlaceholder":238},[551,27192,27193],{"class":553,"line":4689},[551,27194,27195],{},"    componentesValidos++;\n",[551,27197,27198],{"class":553,"line":4695},[551,27199,1193],{},[551,27201,27202],{"class":553,"line":4701},[551,27203,1139],{"emptyLinePlaceholder":238},[551,27205,27206],{"class":553,"line":4707},[551,27207,27208],{},"reporteProblemas += string.Format(\n",[551,27210,27211],{"class":553,"line":4713},[551,27212,27213],{},"    \"Componentes válidos: {0} de {1}\\n\",\n",[551,27215,27216],{"class":553,"line":4719},[551,27217,27218],{},"    componentesValidos,\n",[551,27220,27221],{"class":553,"line":4725},[551,27222,27223],{},"    corrientes.Length\n",[551,27225,27226],{"class":553,"line":4731},[551,27227,3967],{},[13,27229,27230,4390,27232,27234,27235,27238],{},[16,27231,4153],{},[54,27233,21805],{}," para detener búsqueda cuando encontramos el primer problema, y ",[54,27236,27237],{},"continue"," para saltar elementos en el conteo.",[43,27240],{},[331,27242,27244],{"id":27243},"paso-7-construcción-del-reporte-final","Paso 7: Construcción del reporte final",[543,27246,27248],{"className":545,"code":27247,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F REPORTE FINAL\n\u002F\u002F ========================================\n\nstring separador = new string('=', 60);\n\nstring reporteFinal = string.Format(\n    \"{0}\\n\" +\n    \"PROCESADOR AUTOMÁTICO DE COMPONENTES ELÉCTRICOS\\n\" +\n    \"{0}\\n\\n\" +\n    \"{1}\\n\" +\n    \"{2}\\n\" +\n    \"{3}\\n\" +\n    \"{4}\\n\" +\n    \"{5}\\n\\n\" +\n    \"{0}\\n\" +\n    \"Procesamiento completado con {6} componentes\\n\" +\n    \"{0}\",\n    separador,\n    reporteComponentes,\n    reporteResistencias,\n    reporteVoltajes,\n    reporteTipos,\n    reporteProblemas,\n    componentesID.Length\n);\n\n\u002F\u002F ========================================\n\u002F\u002F MOSTRAR RESULTADO\n\u002F\u002F ========================================\n\nMessageBox.Show(reporteFinal, \"Procesador de Componentes\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[54,27249,27250,27254,27259,27263,27267,27272,27276,27281,27285,27290,27294,27299,27304,27309,27314,27318,27322,27327,27331,27335,27340,27345,27350,27355,27360,27365,27369,27373,27377,27382,27386,27390],{"__ignoreMap":228},[551,27251,27252],{"class":553,"line":554},[551,27253,8157],{},[551,27255,27256],{"class":553,"line":229},[551,27257,27258],{},"\u002F\u002F REPORTE FINAL\n",[551,27260,27261],{"class":553,"line":670},[551,27262,8157],{},[551,27264,27265],{"class":553,"line":1136},[551,27266,1139],{"emptyLinePlaceholder":238},[551,27268,27269],{"class":553,"line":1142},[551,27270,27271],{},"string separador = new string('=', 60);\n",[551,27273,27274],{"class":553,"line":1148},[551,27275,1139],{"emptyLinePlaceholder":238},[551,27277,27278],{"class":553,"line":1154},[551,27279,27280],{},"string reporteFinal = string.Format(\n",[551,27282,27283],{"class":553,"line":1160},[551,27284,20308],{},[551,27286,27287],{"class":553,"line":1166},[551,27288,27289],{},"    \"PROCESADOR AUTOMÁTICO DE COMPONENTES ELÉCTRICOS\\n\" +\n",[551,27291,27292],{"class":553,"line":1172},[551,27293,20318],{},[551,27295,27296],{"class":553,"line":1178},[551,27297,27298],{},"    \"{1}\\n\" +\n",[551,27300,27301],{"class":553,"line":1184},[551,27302,27303],{},"    \"{2}\\n\" +\n",[551,27305,27306],{"class":553,"line":1190},[551,27307,27308],{},"    \"{3}\\n\" +\n",[551,27310,27311],{"class":553,"line":1472},[551,27312,27313],{},"    \"{4}\\n\" +\n",[551,27315,27316],{"class":553,"line":1477},[551,27317,20353],{},[551,27319,27320],{"class":553,"line":1797},[551,27321,20308],{},[551,27323,27324],{"class":553,"line":1802},[551,27325,27326],{},"    \"Procesamiento completado con {6} componentes\\n\" +\n",[551,27328,27329],{"class":553,"line":1808},[551,27330,20368],{},[551,27332,27333],{"class":553,"line":1814},[551,27334,20373],{},[551,27336,27337],{"class":553,"line":1820},[551,27338,27339],{},"    reporteComponentes,\n",[551,27341,27342],{"class":553,"line":1826},[551,27343,27344],{},"    reporteResistencias,\n",[551,27346,27347],{"class":553,"line":1832},[551,27348,27349],{},"    reporteVoltajes,\n",[551,27351,27352],{"class":553,"line":1838},[551,27353,27354],{},"    reporteTipos,\n",[551,27356,27357],{"class":553,"line":1844},[551,27358,27359],{},"    reporteProblemas,\n",[551,27361,27362],{"class":553,"line":1850},[551,27363,27364],{},"    componentesID.Length\n",[551,27366,27367],{"class":553,"line":1855},[551,27368,3967],{},[551,27370,27371],{"class":553,"line":1861},[551,27372,1139],{"emptyLinePlaceholder":238},[551,27374,27375],{"class":553,"line":1867},[551,27376,8157],{},[551,27378,27379],{"class":553,"line":1873},[551,27380,27381],{},"\u002F\u002F MOSTRAR RESULTADO\n",[551,27383,27384],{"class":553,"line":1878},[551,27385,8157],{},[551,27387,27388],{"class":553,"line":1883},[551,27389,1139],{"emptyLinePlaceholder":238},[551,27391,27392],{"class":553,"line":1888},[551,27393,27394],{},"MessageBox.Show(reporteFinal, \"Procesador de Componentes\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[43,27396],{},[331,27398,4465],{"id":4464},[543,27400,27402],{"className":545,"code":27401,"language":547,"meta":228,"style":228},"\nusing System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class ProcesadorComponentes\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F ========================================\n        \u002F\u002F DATOS DE ENTRADA\n        \u002F\u002F ========================================\n\n        string[] componentesID = {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\", \"F2\", \"M1\", \"M2\"};\n        double[] corrientes = {25.0, 40.0, 16.0, 20.0, 10.0, 16.0, 7.5, 11.0};\n        double[] resistenciasSerie = {100, 220, 330, 470, 560};\n        double[] voltajesMedidos = {232.5, 228.3, 235.1, 226.8, 230.2, 233.7};\n\n        \u002F\u002F ========================================\n        \u002F\u002F PROCESAMIENTO 1: VALIDAR COMPONENTES (FOR)\n        \u002F\u002F ========================================\n\n        string reporteComponentes = \"=== VALIDACIÓN DE COMPONENTES ===\\n\\n\";\n        int componentesOK = 0;\n        int componentesAdvertencia = 0;\n\n        for (int i = 0; i \u003C componentesID.Length; i++)\n        {\n            string id = componentesID[i];\n            double corriente = corrientes[i];\n\n            string clasificacion;\n            if (corriente \u003C 16.0)\n            {\n                clasificacion = \"Baja corriente\";\n                componentesOK++;\n            }\n            else if (corriente \u003C= 32.0)\n            {\n                clasificacion = \"Corriente media\";\n                componentesOK++;\n            }\n            else\n            {\n                clasificacion = \"ALTA CORRIENTE - Verificar\";\n                componentesAdvertencia++;\n            }\n\n            reporteComponentes += string.Format(\"{0}: {1:F1}A - {2}\\n\", id, corriente, clasificacion);\n        }\n\n        reporteComponentes += string.Format(\"\\nResumen: {0} OK, {1} con advertencia\\n\", componentesOK, componentesAdvertencia);\n\n        \u002F\u002F ========================================\n        \u002F\u002F PROCESAMIENTO 2: CALCULAR RESISTENCIAS (FOREACH)\n        \u002F\u002F ========================================\n\n        string reporteResistencias = \"\\n=== CÁLCULO DE RESISTENCIAS ===\\n\\n\";\n\n        double resistenciaTotalSerie = 0;\n        foreach (double resistencia in resistenciasSerie)\n        {\n            resistenciaTotalSerie += resistencia;\n        }\n\n        reporteResistencias += string.Format(\"Resistencia total en serie: {0:F2} Ω\\n\", resistenciaTotalSerie);\n\n        double sumaInversos = 0;\n        foreach (double resistencia in resistenciasSerie)\n        {\n            sumaInversos += 1.0 \u002F resistencia;\n        }\n\n        double resistenciaTotalParalelo = 1.0 \u002F sumaInversos;\n        reporteResistencias += string.Format(\"Resistencia total en paralelo: {0:F2} Ω\\n\", resistenciaTotalParalelo);\n\n        reporteResistencias += \"\\nDetalle:\\n\";\n        int numeroResistencia = 1;\n        foreach (double resistencia in resistenciasSerie)\n        {\n            reporteResistencias += string.Format(\"R{0}: {1} Ω\\n\", numeroResistencia, resistencia);\n            numeroResistencia++;\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PROCESAMIENTO 3: VALIDAR VOLTAJES (WHILE)\n        \u002F\u002F ========================================\n\n        string reporteVoltajes = \"\\n=== VALIDACIÓN DE VOLTAJES ===\\n\\n\";\n\n        double voltajeMinimo = 207.0;\n        double voltajeMaximo = 253.0;\n        int voltajesCorrectos = 0;\n        int voltajesIncorrectos = 0;\n        int indice = 0;\n\n        while (indice \u003C voltajesMedidos.Length)\n        {\n            double voltaje = voltajesMedidos[indice];\n\n            if (voltaje >= voltajeMinimo && voltaje \u003C= voltajeMaximo)\n            {\n                reporteVoltajes += string.Format(\"Punto {0}: {1:F1}V - OK\\n\", indice + 1, voltaje);\n                voltajesCorrectos++;\n            }\n            else\n            {\n                reporteVoltajes += string.Format(\"Punto {0}: {1:F1}V - FUERA DE RANGO\\n\", indice + 1, voltaje);\n                voltajesIncorrectos++;\n            }\n\n            indice++;\n        }\n\n        reporteVoltajes += string.Format(\"\\nTotal: {0} correctos, {1} fuera de rango\\n\", voltajesCorrectos, voltajesIncorrectos);\n\n        \u002F\u002F ========================================\n        \u002F\u002F PROCESAMIENTO 4: ANÁLISIS POR TIPO (BUCLES ANIDADOS)\n        \u002F\u002F ========================================\n\n        string reporteTipos = \"\\n=== ANÁLISIS POR TIPO DE COMPONENTE ===\\n\\n\";\n\n        string[] tiposComponentes = {\"K\", \"Q\", \"F\", \"M\"};\n        string[] nombresDescriptivos = {\"Contactores\", \"Guardamotores\", \"Relés térmicos\", \"Motores\"};\n\n        for (int t = 0; t \u003C tiposComponentes.Length; t++)\n        {\n            string tipo = tiposComponentes[t];\n            string nombre = nombresDescriptivos[t];\n            double corrienteTotal = 0;\n            int cantidad = 0;\n\n            for (int i = 0; i \u003C componentesID.Length; i++)\n            {\n                if (componentesID[i].StartsWith(tipo))\n                {\n                    corrienteTotal += corrientes[i];\n                    cantidad++;\n                }\n            }\n\n            if (cantidad > 0)\n            {\n                double corrientePromedio = corrienteTotal \u002F cantidad;\n                reporteTipos += string.Format(\"{0}:\\n  Cantidad: {1}\\n  Corriente total: {2:F1}A\\n  Corriente promedio: {3:F1}A\\n\\n\",\n                    nombre, cantidad, corrienteTotal, corrientePromedio);\n            }\n        }\n\n        \u002F\u002F ========================================\n        \u002F\u002F PROCESAMIENTO 5: DETECTAR PROBLEMAS (BREAK\u002FCONTINUE)\n        \u002F\u002F ========================================\n\n        string reporteProblemas = \"\\n=== DETECCIÓN DE PROBLEMAS ===\\n\\n\";\n\n        string primerProblematico = \"\";\n        double corrienteProblematica = 0;\n        double limite = 35.0;\n\n        for (int i = 0; i \u003C componentesID.Length; i++)\n        {\n            if (corrientes[i] > limite)\n            {\n                primerProblematico = componentesID[i];\n                corrienteProblematica = corrientes[i];\n                break;\n            }\n        }\n\n        if (primerProblematico != \"\")\n        {\n            reporteProblemas += string.Format(\"ADVERTENCIA: Componente {0} con corriente excesiva: {1:F1}A (límite: {2}A)\\n\",\n                primerProblematico, corrienteProblematica, limite);\n        }\n        else\n        {\n            reporteProblemas += \"Todos los componentes dentro de límites normales.\\n\";\n        }\n\n        int componentesValidos = 0;\n        foreach (double corriente in corrientes)\n        {\n            if (corriente > limite)\n            {\n                continue;\n            }\n            componentesValidos++;\n        }\n\n        reporteProblemas += string.Format(\"Componentes válidos: {0} de {1}\\n\", componentesValidos, corrientes.Length);\n\n        \u002F\u002F ========================================\n        \u002F\u002F REPORTE FINAL\n        \u002F\u002F ========================================\n\n        string separador = new string('=', 60);\n\n        string reporteFinal = string.Format(\n            \"{0}\\n\" +\n            \"PROCESADOR AUTOMÁTICO DE COMPONENTES ELÉCTRICOS\\n\" +\n            \"{0}\\n\\n\" +\n            \"{1}\\n{2}\\n{3}\\n{4}\\n{5}\\n\\n\" +\n            \"{0}\\n\" +\n            \"Procesamiento completado con {6} componentes\\n\" +\n            \"{0}\",\n            separador, reporteComponentes, reporteResistencias, reporteVoltajes,\n            reporteTipos, reporteProblemas, componentesID.Length\n        );\n\n        MessageBox.Show(reporteFinal, \"Procesador de Componentes\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n    }\n}\n",[54,27403,27404,27408,27412,27416,27420,27424,27428,27432,27436,27440,27444,27448,27452,27456,27460,27464,27468,27472,27476,27480,27484,27489,27493,27497,27502,27507,27512,27516,27521,27525,27530,27535,27539,27544,27549,27553,27558,27563,27567,27572,27576,27581,27585,27589,27593,27597,27602,27607,27611,27615,27620,27624,27628,27633,27637,27641,27646,27650,27654,27659,27663,27668,27673,27677,27682,27686,27690,27695,27699,27704,27708,27712,27717,27721,27725,27730,27735,27739,27744,27749,27753,27757,27762,27767,27771,27775,27779,27784,27788,27792,27797,27801,27806,27811,27816,27821,27826,27830,27835,27839,27844,27848,27853,27857,27862,27867,27871,27875,27879,27884,27889,27893,27897,27902,27906,27910,27915,27919,27923,27928,27932,27936,27941,27945,27950,27955,27959,27964,27968,27973,27978,27983,27988,27992,27997,28001,28006,28011,28016,28021,28026,28030,28034,28039,28043,28048,28053,28058,28062,28066,28070,28074,28079,28083,28087,28092,28096,28101,28106,28111,28115,28119,28123,28128,28132,28137,28142,28146,28150,28154,28158,28163,28167,28172,28177,28181,28185,28189,28194,28198,28202,28207,28212,28216,28221,28225,28230,28234,28239,28243,28247,28252,28256,28260,28265,28269,28273,28278,28282,28287,28291,28296,28300,28305,28309,28314,28318,28323,28328,28332,28336,28341,28345],{"__ignoreMap":228},[551,27405,27406],{"class":553,"line":554},[551,27407,1139],{"emptyLinePlaceholder":238},[551,27409,27410],{"class":553,"line":229},[551,27411,1123],{},[551,27413,27414],{"class":553,"line":670},[551,27415,1128],{},[551,27417,27418],{"class":553,"line":1136},[551,27419,1133],{},[551,27421,27422],{"class":553,"line":1142},[551,27423,1139],{"emptyLinePlaceholder":238},[551,27425,27426],{"class":553,"line":1148},[551,27427,26002],{},[551,27429,27430],{"class":553,"line":1154},[551,27431,1151],{},[551,27433,27434],{"class":553,"line":1160},[551,27435,1157],{},[551,27437,27438],{"class":553,"line":1166},[551,27439,1163],{},[551,27441,27442],{"class":553,"line":1172},[551,27443,1169],{},[551,27445,27446],{"class":553,"line":1178},[551,27447,4511],{},[551,27449,27450],{"class":553,"line":1184},[551,27451,26027],{},[551,27453,27454],{"class":553,"line":1190},[551,27455,4511],{},[551,27457,27458],{"class":553,"line":1472},[551,27459,1139],{"emptyLinePlaceholder":238},[551,27461,27462],{"class":553,"line":1477},[551,27463,26045],{},[551,27465,27466],{"class":553,"line":1797},[551,27467,26059],{},[551,27469,27470],{"class":553,"line":1802},[551,27471,26073],{},[551,27473,27474],{"class":553,"line":1808},[551,27475,26087],{},[551,27477,27478],{"class":553,"line":1814},[551,27479,1139],{"emptyLinePlaceholder":238},[551,27481,27482],{"class":553,"line":1820},[551,27483,4511],{},[551,27485,27486],{"class":553,"line":1826},[551,27487,27488],{},"        \u002F\u002F PROCESAMIENTO 1: VALIDAR COMPONENTES (FOR)\n",[551,27490,27491],{"class":553,"line":1832},[551,27492,4511],{},[551,27494,27495],{"class":553,"line":1838},[551,27496,1139],{"emptyLinePlaceholder":238},[551,27498,27499],{"class":553,"line":1844},[551,27500,27501],{},"        string reporteComponentes = \"=== VALIDACIÓN DE COMPONENTES ===\\n\\n\";\n",[551,27503,27504],{"class":553,"line":1850},[551,27505,27506],{},"        int componentesOK = 0;\n",[551,27508,27509],{"class":553,"line":1855},[551,27510,27511],{},"        int componentesAdvertencia = 0;\n",[551,27513,27514],{"class":553,"line":1861},[551,27515,1139],{"emptyLinePlaceholder":238},[551,27517,27518],{"class":553,"line":1867},[551,27519,27520],{},"        for (int i = 0; i \u003C componentesID.Length; i++)\n",[551,27522,27523],{"class":553,"line":1873},[551,27524,9062],{},[551,27526,27527],{"class":553,"line":1878},[551,27528,27529],{},"            string id = componentesID[i];\n",[551,27531,27532],{"class":553,"line":1883},[551,27533,27534],{},"            double corriente = corrientes[i];\n",[551,27536,27537],{"class":553,"line":1888},[551,27538,1139],{"emptyLinePlaceholder":238},[551,27540,27541],{"class":553,"line":4615},[551,27542,27543],{},"            string clasificacion;\n",[551,27545,27546],{"class":553,"line":4620},[551,27547,27548],{},"            if (corriente \u003C 16.0)\n",[551,27550,27551],{"class":553,"line":4626},[551,27552,12301],{},[551,27554,27555],{"class":553,"line":4631},[551,27556,27557],{},"                clasificacion = \"Baja corriente\";\n",[551,27559,27560],{"class":553,"line":4636},[551,27561,27562],{},"                componentesOK++;\n",[551,27564,27565],{"class":553,"line":4641},[551,27566,12311],{},[551,27568,27569],{"class":553,"line":4647},[551,27570,27571],{},"            else if (corriente \u003C= 32.0)\n",[551,27573,27574],{"class":553,"line":4653},[551,27575,12301],{},[551,27577,27578],{"class":553,"line":4659},[551,27579,27580],{},"                clasificacion = \"Corriente media\";\n",[551,27582,27583],{"class":553,"line":4665},[551,27584,27562],{},[551,27586,27587],{"class":553,"line":4671},[551,27588,12311],{},[551,27590,27591],{"class":553,"line":4677},[551,27592,15260],{},[551,27594,27595],{"class":553,"line":4683},[551,27596,12301],{},[551,27598,27599],{"class":553,"line":4689},[551,27600,27601],{},"                clasificacion = \"ALTA CORRIENTE - Verificar\";\n",[551,27603,27604],{"class":553,"line":4695},[551,27605,27606],{},"                componentesAdvertencia++;\n",[551,27608,27609],{"class":553,"line":4701},[551,27610,12311],{},[551,27612,27613],{"class":553,"line":4707},[551,27614,1139],{"emptyLinePlaceholder":238},[551,27616,27617],{"class":553,"line":4713},[551,27618,27619],{},"            reporteComponentes += string.Format(\"{0}: {1:F1}A - {2}\\n\", id, corriente, clasificacion);\n",[551,27621,27622],{"class":553,"line":4719},[551,27623,9077],{},[551,27625,27626],{"class":553,"line":4725},[551,27627,1139],{"emptyLinePlaceholder":238},[551,27629,27630],{"class":553,"line":4731},[551,27631,27632],{},"        reporteComponentes += string.Format(\"\\nResumen: {0} OK, {1} con advertencia\\n\", componentesOK, componentesAdvertencia);\n",[551,27634,27635],{"class":553,"line":4737},[551,27636,1139],{"emptyLinePlaceholder":238},[551,27638,27639],{"class":553,"line":4743},[551,27640,4511],{},[551,27642,27643],{"class":553,"line":4749},[551,27644,27645],{},"        \u002F\u002F PROCESAMIENTO 2: CALCULAR RESISTENCIAS (FOREACH)\n",[551,27647,27648],{"class":553,"line":4755},[551,27649,4511],{},[551,27651,27652],{"class":553,"line":4761},[551,27653,1139],{"emptyLinePlaceholder":238},[551,27655,27656],{"class":553,"line":4766},[551,27657,27658],{},"        string reporteResistencias = \"\\n=== CÁLCULO DE RESISTENCIAS ===\\n\\n\";\n",[551,27660,27661],{"class":553,"line":4771},[551,27662,1139],{"emptyLinePlaceholder":238},[551,27664,27665],{"class":553,"line":4777},[551,27666,27667],{},"        double resistenciaTotalSerie = 0;\n",[551,27669,27670],{"class":553,"line":4782},[551,27671,27672],{},"        foreach (double resistencia in resistenciasSerie)\n",[551,27674,27675],{"class":553,"line":4787},[551,27676,9062],{},[551,27678,27679],{"class":553,"line":4793},[551,27680,27681],{},"            resistenciaTotalSerie += resistencia;\n",[551,27683,27684],{"class":553,"line":4799},[551,27685,9077],{},[551,27687,27688],{"class":553,"line":4805},[551,27689,1139],{"emptyLinePlaceholder":238},[551,27691,27692],{"class":553,"line":4811},[551,27693,27694],{},"        reporteResistencias += string.Format(\"Resistencia total en serie: {0:F2} Ω\\n\", resistenciaTotalSerie);\n",[551,27696,27697],{"class":553,"line":4817},[551,27698,1139],{"emptyLinePlaceholder":238},[551,27700,27701],{"class":553,"line":4822},[551,27702,27703],{},"        double sumaInversos = 0;\n",[551,27705,27706],{"class":553,"line":4827},[551,27707,27672],{},[551,27709,27710],{"class":553,"line":9183},[551,27711,9062],{},[551,27713,27714],{"class":553,"line":9188},[551,27715,27716],{},"            sumaInversos += 1.0 \u002F resistencia;\n",[551,27718,27719],{"class":553,"line":9193},[551,27720,9077],{},[551,27722,27723],{"class":553,"line":9198},[551,27724,1139],{"emptyLinePlaceholder":238},[551,27726,27727],{"class":553,"line":9204},[551,27728,27729],{},"        double resistenciaTotalParalelo = 1.0 \u002F sumaInversos;\n",[551,27731,27732],{"class":553,"line":9209},[551,27733,27734],{},"        reporteResistencias += string.Format(\"Resistencia total en paralelo: {0:F2} Ω\\n\", resistenciaTotalParalelo);\n",[551,27736,27737],{"class":553,"line":9214},[551,27738,1139],{"emptyLinePlaceholder":238},[551,27740,27741],{"class":553,"line":9219},[551,27742,27743],{},"        reporteResistencias += \"\\nDetalle:\\n\";\n",[551,27745,27746],{"class":553,"line":9224},[551,27747,27748],{},"        int numeroResistencia = 1;\n",[551,27750,27751],{"class":553,"line":9230},[551,27752,27672],{},[551,27754,27755],{"class":553,"line":9236},[551,27756,9062],{},[551,27758,27759],{"class":553,"line":9242},[551,27760,27761],{},"            reporteResistencias += string.Format(\"R{0}: {1} Ω\\n\", numeroResistencia, resistencia);\n",[551,27763,27764],{"class":553,"line":9247},[551,27765,27766],{},"            numeroResistencia++;\n",[551,27768,27769],{"class":553,"line":9253},[551,27770,9077],{},[551,27772,27773],{"class":553,"line":9258},[551,27774,1139],{"emptyLinePlaceholder":238},[551,27776,27777],{"class":553,"line":9264},[551,27778,4511],{},[551,27780,27781],{"class":553,"line":9270},[551,27782,27783],{},"        \u002F\u002F PROCESAMIENTO 3: VALIDAR VOLTAJES (WHILE)\n",[551,27785,27786],{"class":553,"line":9275},[551,27787,4511],{},[551,27789,27790],{"class":553,"line":9281},[551,27791,1139],{"emptyLinePlaceholder":238},[551,27793,27794],{"class":553,"line":9287},[551,27795,27796],{},"        string reporteVoltajes = \"\\n=== VALIDACIÓN DE VOLTAJES ===\\n\\n\";\n",[551,27798,27799],{"class":553,"line":9292},[551,27800,1139],{"emptyLinePlaceholder":238},[551,27802,27803],{"class":553,"line":9297},[551,27804,27805],{},"        double voltajeMinimo = 207.0;\n",[551,27807,27808],{"class":553,"line":9302},[551,27809,27810],{},"        double voltajeMaximo = 253.0;\n",[551,27812,27813],{"class":553,"line":9308},[551,27814,27815],{},"        int voltajesCorrectos = 0;\n",[551,27817,27818],{"class":553,"line":9313},[551,27819,27820],{},"        int voltajesIncorrectos = 0;\n",[551,27822,27823],{"class":553,"line":9318},[551,27824,27825],{},"        int indice = 0;\n",[551,27827,27828],{"class":553,"line":9323},[551,27829,1139],{"emptyLinePlaceholder":238},[551,27831,27832],{"class":553,"line":9328},[551,27833,27834],{},"        while (indice \u003C voltajesMedidos.Length)\n",[551,27836,27837],{"class":553,"line":9334},[551,27838,9062],{},[551,27840,27841],{"class":553,"line":9339},[551,27842,27843],{},"            double voltaje = voltajesMedidos[indice];\n",[551,27845,27846],{"class":553,"line":9344},[551,27847,1139],{"emptyLinePlaceholder":238},[551,27849,27850],{"class":553,"line":9350},[551,27851,27852],{},"            if (voltaje >= voltajeMinimo && voltaje \u003C= voltajeMaximo)\n",[551,27854,27855],{"class":553,"line":9355},[551,27856,12301],{},[551,27858,27859],{"class":553,"line":9361},[551,27860,27861],{},"                reporteVoltajes += string.Format(\"Punto {0}: {1:F1}V - OK\\n\", indice + 1, voltaje);\n",[551,27863,27864],{"class":553,"line":9367},[551,27865,27866],{},"                voltajesCorrectos++;\n",[551,27868,27869],{"class":553,"line":9372},[551,27870,12311],{},[551,27872,27873],{"class":553,"line":9378},[551,27874,15260],{},[551,27876,27877],{"class":553,"line":9384},[551,27878,12301],{},[551,27880,27881],{"class":553,"line":9389},[551,27882,27883],{},"                reporteVoltajes += string.Format(\"Punto {0}: {1:F1}V - FUERA DE RANGO\\n\", indice + 1, voltaje);\n",[551,27885,27886],{"class":553,"line":9394},[551,27887,27888],{},"                voltajesIncorrectos++;\n",[551,27890,27891],{"class":553,"line":9399},[551,27892,12311],{},[551,27894,27895],{"class":553,"line":9405},[551,27896,1139],{"emptyLinePlaceholder":238},[551,27898,27899],{"class":553,"line":9410},[551,27900,27901],{},"            indice++;\n",[551,27903,27904],{"class":553,"line":9415},[551,27905,9077],{},[551,27907,27908],{"class":553,"line":9420},[551,27909,1139],{"emptyLinePlaceholder":238},[551,27911,27912],{"class":553,"line":9425},[551,27913,27914],{},"        reporteVoltajes += string.Format(\"\\nTotal: {0} correctos, {1} fuera de rango\\n\", voltajesCorrectos, voltajesIncorrectos);\n",[551,27916,27917],{"class":553,"line":9431},[551,27918,1139],{"emptyLinePlaceholder":238},[551,27920,27921],{"class":553,"line":9436},[551,27922,4511],{},[551,27924,27925],{"class":553,"line":9441},[551,27926,27927],{},"        \u002F\u002F PROCESAMIENTO 4: ANÁLISIS POR TIPO (BUCLES ANIDADOS)\n",[551,27929,27930],{"class":553,"line":9447},[551,27931,4511],{},[551,27933,27934],{"class":553,"line":9452},[551,27935,1139],{"emptyLinePlaceholder":238},[551,27937,27938],{"class":553,"line":9458},[551,27939,27940],{},"        string reporteTipos = \"\\n=== ANÁLISIS POR TIPO DE COMPONENTE ===\\n\\n\";\n",[551,27942,27943],{"class":553,"line":9464},[551,27944,1139],{"emptyLinePlaceholder":238},[551,27946,27947],{"class":553,"line":9469},[551,27948,27949],{},"        string[] tiposComponentes = {\"K\", \"Q\", \"F\", \"M\"};\n",[551,27951,27952],{"class":553,"line":9475},[551,27953,27954],{},"        string[] nombresDescriptivos = {\"Contactores\", \"Guardamotores\", \"Relés térmicos\", \"Motores\"};\n",[551,27956,27957],{"class":553,"line":9481},[551,27958,1139],{"emptyLinePlaceholder":238},[551,27960,27961],{"class":553,"line":9487},[551,27962,27963],{},"        for (int t = 0; t \u003C tiposComponentes.Length; t++)\n",[551,27965,27966],{"class":553,"line":9492},[551,27967,9062],{},[551,27969,27970],{"class":553,"line":9497},[551,27971,27972],{},"            string tipo = tiposComponentes[t];\n",[551,27974,27975],{"class":553,"line":9502},[551,27976,27977],{},"            string nombre = nombresDescriptivos[t];\n",[551,27979,27980],{"class":553,"line":9508},[551,27981,27982],{},"            double corrienteTotal = 0;\n",[551,27984,27985],{"class":553,"line":9514},[551,27986,27987],{},"            int cantidad = 0;\n",[551,27989,27990],{"class":553,"line":9519},[551,27991,1139],{"emptyLinePlaceholder":238},[551,27993,27994],{"class":553,"line":9524},[551,27995,27996],{},"            for (int i = 0; i \u003C componentesID.Length; i++)\n",[551,27998,27999],{"class":553,"line":9529},[551,28000,12301],{},[551,28002,28003],{"class":553,"line":9535},[551,28004,28005],{},"                if (componentesID[i].StartsWith(tipo))\n",[551,28007,28008],{"class":553,"line":9540},[551,28009,28010],{},"                {\n",[551,28012,28013],{"class":553,"line":9545},[551,28014,28015],{},"                    corrienteTotal += corrientes[i];\n",[551,28017,28018],{"class":553,"line":9551},[551,28019,28020],{},"                    cantidad++;\n",[551,28022,28023],{"class":553,"line":9557},[551,28024,28025],{},"                }\n",[551,28027,28028],{"class":553,"line":9562},[551,28029,12311],{},[551,28031,28032],{"class":553,"line":9568},[551,28033,1139],{"emptyLinePlaceholder":238},[551,28035,28036],{"class":553,"line":9573},[551,28037,28038],{},"            if (cantidad > 0)\n",[551,28040,28041],{"class":553,"line":9578},[551,28042,12301],{},[551,28044,28045],{"class":553,"line":9584},[551,28046,28047],{},"                double corrientePromedio = corrienteTotal \u002F cantidad;\n",[551,28049,28050],{"class":553,"line":9589},[551,28051,28052],{},"                reporteTipos += string.Format(\"{0}:\\n  Cantidad: {1}\\n  Corriente total: {2:F1}A\\n  Corriente promedio: {3:F1}A\\n\\n\",\n",[551,28054,28055],{"class":553,"line":9594},[551,28056,28057],{},"                    nombre, cantidad, corrienteTotal, corrientePromedio);\n",[551,28059,28060],{"class":553,"line":9600},[551,28061,12311],{},[551,28063,28064],{"class":553,"line":9606},[551,28065,9077],{},[551,28067,28068],{"class":553,"line":9611},[551,28069,1139],{"emptyLinePlaceholder":238},[551,28071,28072],{"class":553,"line":9617},[551,28073,4511],{},[551,28075,28076],{"class":553,"line":9623},[551,28077,28078],{},"        \u002F\u002F PROCESAMIENTO 5: DETECTAR PROBLEMAS (BREAK\u002FCONTINUE)\n",[551,28080,28081],{"class":553,"line":9629},[551,28082,4511],{},[551,28084,28085],{"class":553,"line":9635},[551,28086,1139],{"emptyLinePlaceholder":238},[551,28088,28089],{"class":553,"line":9641},[551,28090,28091],{},"        string reporteProblemas = \"\\n=== DETECCIÓN DE PROBLEMAS ===\\n\\n\";\n",[551,28093,28094],{"class":553,"line":9647},[551,28095,1139],{"emptyLinePlaceholder":238},[551,28097,28098],{"class":553,"line":9653},[551,28099,28100],{},"        string primerProblematico = \"\";\n",[551,28102,28103],{"class":553,"line":9659},[551,28104,28105],{},"        double corrienteProblematica = 0;\n",[551,28107,28108],{"class":553,"line":9665},[551,28109,28110],{},"        double limite = 35.0;\n",[551,28112,28113],{"class":553,"line":9671},[551,28114,1139],{"emptyLinePlaceholder":238},[551,28116,28117],{"class":553,"line":9677},[551,28118,27520],{},[551,28120,28121],{"class":553,"line":9682},[551,28122,9062],{},[551,28124,28125],{"class":553,"line":9688},[551,28126,28127],{},"            if (corrientes[i] > limite)\n",[551,28129,28130],{"class":553,"line":9694},[551,28131,12301],{},[551,28133,28134],{"class":553,"line":9700},[551,28135,28136],{},"                primerProblematico = componentesID[i];\n",[551,28138,28139],{"class":553,"line":9706},[551,28140,28141],{},"                corrienteProblematica = corrientes[i];\n",[551,28143,28144],{"class":553,"line":9712},[551,28145,20613],{},[551,28147,28148],{"class":553,"line":9718},[551,28149,12311],{},[551,28151,28152],{"class":553,"line":9724},[551,28153,9077],{},[551,28155,28156],{"class":553,"line":9730},[551,28157,1139],{"emptyLinePlaceholder":238},[551,28159,28160],{"class":553,"line":9736},[551,28161,28162],{},"        if (primerProblematico != \"\")\n",[551,28164,28165],{"class":553,"line":9742},[551,28166,9062],{},[551,28168,28169],{"class":553,"line":9747},[551,28170,28171],{},"            reporteProblemas += string.Format(\"ADVERTENCIA: Componente {0} con corriente excesiva: {1:F1}A (límite: {2}A)\\n\",\n",[551,28173,28174],{"class":553,"line":9752},[551,28175,28176],{},"                primerProblematico, corrienteProblematica, limite);\n",[551,28178,28179],{"class":553,"line":9757},[551,28180,9077],{},[551,28182,28183],{"class":553,"line":9763},[551,28184,9082],{},[551,28186,28187],{"class":553,"line":9768},[551,28188,9062],{},[551,28190,28191],{"class":553,"line":9773},[551,28192,28193],{},"            reporteProblemas += \"Todos los componentes dentro de límites normales.\\n\";\n",[551,28195,28196],{"class":553,"line":9779},[551,28197,9077],{},[551,28199,28200],{"class":553,"line":9784},[551,28201,1139],{"emptyLinePlaceholder":238},[551,28203,28204],{"class":553,"line":9790},[551,28205,28206],{},"        int componentesValidos = 0;\n",[551,28208,28209],{"class":553,"line":9795},[551,28210,28211],{},"        foreach (double corriente in corrientes)\n",[551,28213,28214],{"class":553,"line":15107},[551,28215,9062],{},[551,28217,28218],{"class":553,"line":15113},[551,28219,28220],{},"            if (corriente > limite)\n",[551,28222,28223],{"class":553,"line":15119},[551,28224,12301],{},[551,28226,28227],{"class":553,"line":15124},[551,28228,28229],{},"                continue;\n",[551,28231,28232],{"class":553,"line":15130},[551,28233,12311],{},[551,28235,28236],{"class":553,"line":15135},[551,28237,28238],{},"            componentesValidos++;\n",[551,28240,28241],{"class":553,"line":15140},[551,28242,9077],{},[551,28244,28245],{"class":553,"line":15146},[551,28246,1139],{"emptyLinePlaceholder":238},[551,28248,28249],{"class":553,"line":15151},[551,28250,28251],{},"        reporteProblemas += string.Format(\"Componentes válidos: {0} de {1}\\n\", componentesValidos, corrientes.Length);\n",[551,28253,28254],{"class":553,"line":15156},[551,28255,1139],{"emptyLinePlaceholder":238},[551,28257,28258],{"class":553,"line":15161},[551,28259,4511],{},[551,28261,28262],{"class":553,"line":15167},[551,28263,28264],{},"        \u002F\u002F REPORTE FINAL\n",[551,28266,28267],{"class":553,"line":15172},[551,28268,4511],{},[551,28270,28271],{"class":553,"line":15177},[551,28272,1139],{"emptyLinePlaceholder":238},[551,28274,28275],{"class":553,"line":15182},[551,28276,28277],{},"        string separador = new string('=', 60);\n",[551,28279,28280],{"class":553,"line":15188},[551,28281,1139],{"emptyLinePlaceholder":238},[551,28283,28284],{"class":553,"line":15193},[551,28285,28286],{},"        string reporteFinal = string.Format(\n",[551,28288,28289],{"class":553,"line":15198},[551,28290,21613],{},[551,28292,28293],{"class":553,"line":15204},[551,28294,28295],{},"            \"PROCESADOR AUTOMÁTICO DE COMPONENTES ELÉCTRICOS\\n\" +\n",[551,28297,28298],{"class":553,"line":15209},[551,28299,21623],{},[551,28301,28302],{"class":553,"line":15214},[551,28303,28304],{},"            \"{1}\\n{2}\\n{3}\\n{4}\\n{5}\\n\\n\" +\n",[551,28306,28307],{"class":553,"line":15220},[551,28308,21613],{},[551,28310,28311],{"class":553,"line":15225},[551,28312,28313],{},"            \"Procesamiento completado con {6} componentes\\n\" +\n",[551,28315,28316],{"class":553,"line":15230},[551,28317,21673],{},[551,28319,28320],{"class":553,"line":15235},[551,28321,28322],{},"            separador, reporteComponentes, reporteResistencias, reporteVoltajes,\n",[551,28324,28325],{"class":553,"line":15241},[551,28326,28327],{},"            reporteTipos, reporteProblemas, componentesID.Length\n",[551,28329,28330],{"class":553,"line":15246},[551,28331,4758],{},[551,28333,28334],{"class":553,"line":15252},[551,28335,1139],{"emptyLinePlaceholder":238},[551,28337,28338],{"class":553,"line":15257},[551,28339,28340],{},"        MessageBox.Show(reporteFinal, \"Procesador de Componentes\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[551,28342,28343],{"class":553,"line":15263},[551,28344,1187],{},[551,28346,28347],{"class":553,"line":15268},[551,28348,1193],{},[43,28350],{},[46,28352,4852],{"id":4851},[331,28354,28356],{"id":28355},"rendimiento-de-bucles","Rendimiento de bucles",[13,28358,28359,28362],{},[16,28360,28361],{},"for vs foreach"," - ¿Cuál es más rápido?",[13,28364,28365,28366,28368],{},"Para arrays simples, ",[54,28367,23258],{}," es ligeramente más rápido, pero la diferencia es despreciable en la mayoría de casos.",[543,28370,28372],{"className":545,"code":28371,"language":547,"meta":228,"style":228},"\u002F\u002F for: acceso directo por índice\nfor (int i = 0; i \u003C array.Length; i++)\n{\n    var item = array[i];\n}\n\n\u002F\u002F foreach: usa enumerador interno\nforeach (var item in array)\n{\n    \u002F\u002F Ligeramente más lento, pero más legible\n}\n",[54,28373,28374,28379,28384,28388,28393,28397,28401,28406,28411,28415,28420],{"__ignoreMap":228},[551,28375,28376],{"class":553,"line":554},[551,28377,28378],{},"\u002F\u002F for: acceso directo por índice\n",[551,28380,28381],{"class":553,"line":229},[551,28382,28383],{},"for (int i = 0; i \u003C array.Length; i++)\n",[551,28385,28386],{"class":553,"line":670},[551,28387,1151],{},[551,28389,28390],{"class":553,"line":1136},[551,28391,28392],{},"    var item = array[i];\n",[551,28394,28395],{"class":553,"line":1142},[551,28396,1193],{},[551,28398,28399],{"class":553,"line":1148},[551,28400,1139],{"emptyLinePlaceholder":238},[551,28402,28403],{"class":553,"line":1154},[551,28404,28405],{},"\u002F\u002F foreach: usa enumerador interno\n",[551,28407,28408],{"class":553,"line":1160},[551,28409,28410],{},"foreach (var item in array)\n",[551,28412,28413],{"class":553,"line":1166},[551,28414,1151],{},[551,28416,28417],{"class":553,"line":1172},[551,28418,28419],{},"    \u002F\u002F Ligeramente más lento, pero más legible\n",[551,28421,28422],{"class":553,"line":1178},[551,28423,1193],{},[13,28425,28426,1068,28428,28430,28431,28433],{},[16,28427,1067],{},[54,28429,23717],{}," por defecto (más legible). Usa ",[54,28432,23258],{}," solo cuando necesites el índice o performance crítica.",[331,28435,28437],{"id":28436},"bucles-infinitos-útiles","Bucles infinitos útiles",[13,28439,28440],{},"En algunos casos, bucles infinitos son intencionales:",[543,28442,28444],{"className":545,"code":28443,"language":547,"meta":228,"style":228},"while (true)\n{\n    \u002F\u002F Procesar algo...\n\n    if (condicionSalida)\n    {\n        break;  \u002F\u002F Salida controlada\n    }\n}\n",[54,28445,28446,28451,28455,28460,28464,28469,28473,28478,28482],{"__ignoreMap":228},[551,28447,28448],{"class":553,"line":554},[551,28449,28450],{},"while (true)\n",[551,28452,28453],{"class":553,"line":229},[551,28454,1151],{},[551,28456,28457],{"class":553,"line":670},[551,28458,28459],{},"    \u002F\u002F Procesar algo...\n",[551,28461,28462],{"class":553,"line":1136},[551,28463,1139],{"emptyLinePlaceholder":238},[551,28465,28466],{"class":553,"line":1142},[551,28467,28468],{},"    if (condicionSalida)\n",[551,28470,28471],{"class":553,"line":1148},[551,28472,1169],{},[551,28474,28475],{"class":553,"line":1154},[551,28476,28477],{},"        break;  \u002F\u002F Salida controlada\n",[551,28479,28480],{"class":553,"line":1160},[551,28481,1187],{},[551,28483,28484],{"class":553,"line":1166},[551,28485,1193],{},[13,28487,28488,28491],{},[16,28489,28490],{},"Uso en EPLAN",": Monitorear estado hasta que usuario cancele.",[331,28493,28495],{"id":28494},"optimización-de-bucles-anidados","Optimización de bucles anidados",[13,28497,28498,28501],{},[16,28499,28500],{},"Malo"," (ineficiente):",[543,28503,28505],{"className":545,"code":28504,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C 1000; i++)\n{\n    for (int j = 0; j \u003C 1000; j++)\n    {\n        \u002F\u002F 1,000,000 iteraciones\n        string resultado = ExpensiveOperation();\n    }\n}\n",[54,28506,28507,28512,28516,28521,28525,28530,28535,28539],{"__ignoreMap":228},[551,28508,28509],{"class":553,"line":554},[551,28510,28511],{},"for (int i = 0; i \u003C 1000; i++)\n",[551,28513,28514],{"class":553,"line":229},[551,28515,1151],{},[551,28517,28518],{"class":553,"line":670},[551,28519,28520],{},"    for (int j = 0; j \u003C 1000; j++)\n",[551,28522,28523],{"class":553,"line":1136},[551,28524,1169],{},[551,28526,28527],{"class":553,"line":1142},[551,28528,28529],{},"        \u002F\u002F 1,000,000 iteraciones\n",[551,28531,28532],{"class":553,"line":1148},[551,28533,28534],{},"        string resultado = ExpensiveOperation();\n",[551,28536,28537],{"class":553,"line":1154},[551,28538,1187],{},[551,28540,28541],{"class":553,"line":1160},[551,28542,1193],{},[13,28544,28545,28547],{},[16,28546,12328],{}," (optimizado):",[543,28549,28551],{"className":545,"code":28550,"language":547,"meta":228,"style":228},"string resultado = ExpensiveOperation();  \u002F\u002F Solo una vez\n\nfor (int i = 0; i \u003C 1000; i++)\n{\n    for (int j = 0; j \u003C 1000; j++)\n    {\n        \u002F\u002F Usar resultado pre-calculado\n    }\n}\n",[54,28552,28553,28558,28562,28566,28570,28574,28578,28583,28587],{"__ignoreMap":228},[551,28554,28555],{"class":553,"line":554},[551,28556,28557],{},"string resultado = ExpensiveOperation();  \u002F\u002F Solo una vez\n",[551,28559,28560],{"class":553,"line":229},[551,28561,1139],{"emptyLinePlaceholder":238},[551,28563,28564],{"class":553,"line":670},[551,28565,28511],{},[551,28567,28568],{"class":553,"line":1136},[551,28569,1151],{},[551,28571,28572],{"class":553,"line":1142},[551,28573,28520],{},[551,28575,28576],{"class":553,"line":1148},[551,28577,1169],{},[551,28579,28580],{"class":553,"line":1154},[551,28581,28582],{},"        \u002F\u002F Usar resultado pre-calculado\n",[551,28584,28585],{"class":553,"line":1160},[551,28586,1187],{},[551,28588,28589],{"class":553,"line":1166},[551,28590,1193],{},[331,28592,5121],{"id":5120},[13,28594,28595],{},[16,28596,28597],{},"1. Nombres descriptivos para variables de bucle",[543,28599,28601],{"className":545,"code":28600,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\nfor (int i = 0; i \u003C c.Length; i++)\n{\n    \u002F\u002F ¿Qué es i? ¿Qué es c?\n}\n\n\u002F\u002F Bien\nfor (int indiceComponente = 0; indiceComponente \u003C componentes.Length; indiceComponente++)\n{\n    \u002F\u002F Claro y legible\n}\n\n\u002F\u002F Aceptable para bucles simples\nfor (int i = 0; i \u003C items.Length; i++)\n{\n    \u002F\u002F 'i' es estándar para índices\n}\n",[54,28602,28603,28607,28612,28616,28621,28625,28629,28633,28638,28642,28647,28651,28655,28660,28665,28669,28674],{"__ignoreMap":228},[551,28604,28605],{"class":553,"line":554},[551,28606,2142],{},[551,28608,28609],{"class":553,"line":229},[551,28610,28611],{},"for (int i = 0; i \u003C c.Length; i++)\n",[551,28613,28614],{"class":553,"line":670},[551,28615,1151],{},[551,28617,28618],{"class":553,"line":1136},[551,28619,28620],{},"    \u002F\u002F ¿Qué es i? ¿Qué es c?\n",[551,28622,28623],{"class":553,"line":1142},[551,28624,1193],{},[551,28626,28627],{"class":553,"line":1148},[551,28628,1139],{"emptyLinePlaceholder":238},[551,28630,28631],{"class":553,"line":1154},[551,28632,2156],{},[551,28634,28635],{"class":553,"line":1160},[551,28636,28637],{},"for (int indiceComponente = 0; indiceComponente \u003C componentes.Length; indiceComponente++)\n",[551,28639,28640],{"class":553,"line":1166},[551,28641,1151],{},[551,28643,28644],{"class":553,"line":1172},[551,28645,28646],{},"    \u002F\u002F Claro y legible\n",[551,28648,28649],{"class":553,"line":1178},[551,28650,1193],{},[551,28652,28653],{"class":553,"line":1184},[551,28654,1139],{"emptyLinePlaceholder":238},[551,28656,28657],{"class":553,"line":1190},[551,28658,28659],{},"\u002F\u002F Aceptable para bucles simples\n",[551,28661,28662],{"class":553,"line":1472},[551,28663,28664],{},"for (int i = 0; i \u003C items.Length; i++)\n",[551,28666,28667],{"class":553,"line":1477},[551,28668,1151],{},[551,28670,28671],{"class":553,"line":1797},[551,28672,28673],{},"    \u002F\u002F 'i' es estándar para índices\n",[551,28675,28676],{"class":553,"line":1802},[551,28677,1193],{},[13,28679,28680],{},[16,28681,28682],{},"2. Evita modificar contador dentro del bucle",[543,28684,28686],{"className":545,"code":28685,"language":547,"meta":228,"style":228},"\u002F\u002F Mal (confuso)\nfor (int i = 0; i \u003C 10; i++)\n{\n    if (condicion)\n    {\n        i += 2;  \u002F\u002F Modificar el contador puede causar bugs\n    }\n}\n\n\u002F\u002F Bien\nfor (int i = 0; i \u003C 10; i++)\n{\n    if (condicion)\n    {\n        continue;  \u002F\u002F Saltar iteraciones específicas\n    }\n}\n",[54,28687,28688,28693,28697,28701,28706,28710,28715,28719,28723,28727,28731,28735,28739,28743,28747,28752,28756],{"__ignoreMap":228},[551,28689,28690],{"class":553,"line":554},[551,28691,28692],{},"\u002F\u002F Mal (confuso)\n",[551,28694,28695],{"class":553,"line":229},[551,28696,25080],{},[551,28698,28699],{"class":553,"line":670},[551,28700,1151],{},[551,28702,28703],{"class":553,"line":1136},[551,28704,28705],{},"    if (condicion)\n",[551,28707,28708],{"class":553,"line":1142},[551,28709,1169],{},[551,28711,28712],{"class":553,"line":1148},[551,28713,28714],{},"        i += 2;  \u002F\u002F Modificar el contador puede causar bugs\n",[551,28716,28717],{"class":553,"line":1154},[551,28718,1187],{},[551,28720,28721],{"class":553,"line":1160},[551,28722,1193],{},[551,28724,28725],{"class":553,"line":1166},[551,28726,1139],{"emptyLinePlaceholder":238},[551,28728,28729],{"class":553,"line":1172},[551,28730,2156],{},[551,28732,28733],{"class":553,"line":1178},[551,28734,25080],{},[551,28736,28737],{"class":553,"line":1184},[551,28738,1151],{},[551,28740,28741],{"class":553,"line":1190},[551,28742,28705],{},[551,28744,28745],{"class":553,"line":1472},[551,28746,1169],{},[551,28748,28749],{"class":553,"line":1477},[551,28750,28751],{},"        continue;  \u002F\u002F Saltar iteraciones específicas\n",[551,28753,28754],{"class":553,"line":1797},[551,28755,1187],{},[551,28757,28758],{"class":553,"line":1802},[551,28759,1193],{},[13,28761,28762],{},[16,28763,28764],{},"3. Caché la longitud si es costosa",[543,28766,28768],{"className":545,"code":28767,"language":547,"meta":228,"style":228},"\u002F\u002F Ineficiente (calcula Length en cada iteración si es costoso)\nfor (int i = 0; i \u003C MetodoComplejo().Length; i++)\n{\n    \u002F\u002F ...\n}\n\n\u002F\u002F Eficiente\nint longitud = MetodoComplejo().Length;\nfor (int i = 0; i \u003C longitud; i++)\n{\n    \u002F\u002F ...\n}\n",[54,28769,28770,28775,28780,28784,28788,28792,28796,28801,28806,28811,28815,28819],{"__ignoreMap":228},[551,28771,28772],{"class":553,"line":554},[551,28773,28774],{},"\u002F\u002F Ineficiente (calcula Length en cada iteración si es costoso)\n",[551,28776,28777],{"class":553,"line":229},[551,28778,28779],{},"for (int i = 0; i \u003C MetodoComplejo().Length; i++)\n",[551,28781,28782],{"class":553,"line":670},[551,28783,1151],{},[551,28785,28786],{"class":553,"line":1136},[551,28787,16123],{},[551,28789,28790],{"class":553,"line":1142},[551,28791,1193],{},[551,28793,28794],{"class":553,"line":1148},[551,28795,1139],{"emptyLinePlaceholder":238},[551,28797,28798],{"class":553,"line":1154},[551,28799,28800],{},"\u002F\u002F Eficiente\n",[551,28802,28803],{"class":553,"line":1160},[551,28804,28805],{},"int longitud = MetodoComplejo().Length;\n",[551,28807,28808],{"class":553,"line":1166},[551,28809,28810],{},"for (int i = 0; i \u003C longitud; i++)\n",[551,28812,28813],{"class":553,"line":1172},[551,28814,1151],{},[551,28816,28817],{"class":553,"line":1178},[551,28818,16123],{},[551,28820,28821],{"class":553,"line":1184},[551,28822,1193],{},[331,28824,5309],{"id":5308},[367,28826,28828],{"id":28827},"error-1-off-by-one-uno-de-másmenos","Error 1: Off-by-one (uno de más\u002Fmenos)",[543,28830,28832],{"className":545,"code":28831,"language":547,"meta":228,"style":228},"int[] numeros = {10, 20, 30, 40, 50};\n\n\u002F\u002F Mal: va de 0 a 5 (¡índice 5 no existe!)\nfor (int i = 0; i \u003C= numeros.Length; i++)  \u002F\u002F ERROR\n{\n    MessageBox.Show(numeros[i].ToString());\n}\n\n\u002F\u002F Bien: va de 0 a 4\nfor (int i = 0; i \u003C numeros.Length; i++)\n{\n    MessageBox.Show(numeros[i].ToString());\n}\n",[54,28833,28834,28839,28843,28848,28853,28857,28862,28866,28870,28875,28880,28884,28888],{"__ignoreMap":228},[551,28835,28836],{"class":553,"line":554},[551,28837,28838],{},"int[] numeros = {10, 20, 30, 40, 50};\n",[551,28840,28841],{"class":553,"line":229},[551,28842,1139],{"emptyLinePlaceholder":238},[551,28844,28845],{"class":553,"line":670},[551,28846,28847],{},"\u002F\u002F Mal: va de 0 a 5 (¡índice 5 no existe!)\n",[551,28849,28850],{"class":553,"line":1136},[551,28851,28852],{},"for (int i = 0; i \u003C= numeros.Length; i++)  \u002F\u002F ERROR\n",[551,28854,28855],{"class":553,"line":1142},[551,28856,1151],{},[551,28858,28859],{"class":553,"line":1148},[551,28860,28861],{},"    MessageBox.Show(numeros[i].ToString());\n",[551,28863,28864],{"class":553,"line":1154},[551,28865,1193],{},[551,28867,28868],{"class":553,"line":1160},[551,28869,1139],{"emptyLinePlaceholder":238},[551,28871,28872],{"class":553,"line":1166},[551,28873,28874],{},"\u002F\u002F Bien: va de 0 a 4\n",[551,28876,28877],{"class":553,"line":1172},[551,28878,28879],{},"for (int i = 0; i \u003C numeros.Length; i++)\n",[551,28881,28882],{"class":553,"line":1178},[551,28883,1151],{},[551,28885,28886],{"class":553,"line":1184},[551,28887,28861],{},[551,28889,28890],{"class":553,"line":1190},[551,28891,1193],{},[43,28893],{},[367,28895,28897],{"id":28896},"error-2-modificar-colección-durante-foreach","Error 2: Modificar colección durante foreach",[543,28899,28901],{"className":545,"code":28900,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring>{\"K1\", \"Q1\", \"F1\"};\n\n\u002F\u002F ERROR: No puedes modificar la colección durante foreach\nforeach (string comp in componentes)\n{\n    componentes.Remove(comp);  \u002F\u002F ERROR en tiempo de ejecución\n}\n\n\u002F\u002F Solución: Usa for hacia atrás\nfor (int i = componentes.Count - 1; i >= 0; i--)\n{\n    componentes.RemoveAt(i);  \u002F\u002F OK\n}\n",[54,28902,28903,28908,28912,28917,28922,28926,28931,28935,28939,28944,28949,28953,28958],{"__ignoreMap":228},[551,28904,28905],{"class":553,"line":554},[551,28906,28907],{},"List\u003Cstring> componentes = new List\u003Cstring>{\"K1\", \"Q1\", \"F1\"};\n",[551,28909,28910],{"class":553,"line":229},[551,28911,1139],{"emptyLinePlaceholder":238},[551,28913,28914],{"class":553,"line":670},[551,28915,28916],{},"\u002F\u002F ERROR: No puedes modificar la colección durante foreach\n",[551,28918,28919],{"class":553,"line":1136},[551,28920,28921],{},"foreach (string comp in componentes)\n",[551,28923,28924],{"class":553,"line":1142},[551,28925,1151],{},[551,28927,28928],{"class":553,"line":1148},[551,28929,28930],{},"    componentes.Remove(comp);  \u002F\u002F ERROR en tiempo de ejecución\n",[551,28932,28933],{"class":553,"line":1154},[551,28934,1193],{},[551,28936,28937],{"class":553,"line":1160},[551,28938,1139],{"emptyLinePlaceholder":238},[551,28940,28941],{"class":553,"line":1166},[551,28942,28943],{},"\u002F\u002F Solución: Usa for hacia atrás\n",[551,28945,28946],{"class":553,"line":1172},[551,28947,28948],{},"for (int i = componentes.Count - 1; i >= 0; i--)\n",[551,28950,28951],{"class":553,"line":1178},[551,28952,1151],{},[551,28954,28955],{"class":553,"line":1184},[551,28956,28957],{},"    componentes.RemoveAt(i);  \u002F\u002F OK\n",[551,28959,28960],{"class":553,"line":1190},[551,28961,1193],{},[43,28963],{},[367,28965,28967],{"id":28966},"error-3-bucle-infinito-accidental","Error 3: Bucle infinito accidental",[543,28969,28971],{"className":545,"code":28970,"language":547,"meta":228,"style":228},"int contador = 0;\n\n\u002F\u002F Bucle infinito (nunca termina)\nwhile (contador \u003C 10)\n{\n    MessageBox.Show(\"Contador: \" + contador);\n    \u002F\u002F ¡Olvidaste incrementar!\n}\n\n\u002F\u002F Correcto\nwhile (contador \u003C 10)\n{\n    MessageBox.Show(\"Contador: \" + contador);\n    contador++;  \u002F\u002F ← Esencial\n}\n",[54,28972,28973,28977,28981,28986,28991,28995,28999,29004,29008,29012,29017,29021,29025,29029,29034],{"__ignoreMap":228},[551,28974,28975],{"class":553,"line":554},[551,28976,5158],{},[551,28978,28979],{"class":553,"line":229},[551,28980,1139],{"emptyLinePlaceholder":238},[551,28982,28983],{"class":553,"line":670},[551,28984,28985],{},"\u002F\u002F Bucle infinito (nunca termina)\n",[551,28987,28988],{"class":553,"line":1136},[551,28989,28990],{},"while (contador \u003C 10)\n",[551,28992,28993],{"class":553,"line":1142},[551,28994,1151],{},[551,28996,28997],{"class":553,"line":1148},[551,28998,24228],{},[551,29000,29001],{"class":553,"line":1154},[551,29002,29003],{},"    \u002F\u002F ¡Olvidaste incrementar!\n",[551,29005,29006],{"class":553,"line":1160},[551,29007,1193],{},[551,29009,29010],{"class":553,"line":1166},[551,29011,1139],{"emptyLinePlaceholder":238},[551,29013,29014],{"class":553,"line":1172},[551,29015,29016],{},"\u002F\u002F Correcto\n",[551,29018,29019],{"class":553,"line":1178},[551,29020,28990],{},[551,29022,29023],{"class":553,"line":1184},[551,29024,1151],{},[551,29026,29027],{"class":553,"line":1190},[551,29028,24228],{},[551,29030,29031],{"class":553,"line":1472},[551,29032,29033],{},"    contador++;  \u002F\u002F ← Esencial\n",[551,29035,29036],{"class":553,"line":1477},[551,29037,1193],{},[43,29039],{},[46,29041,5452],{"id":5451},[331,29043,29045],{"id":29044},"desafío-1-generador-de-secuencia-fibonacci","Desafío 1: Generador de secuencia Fibonacci",[13,29047,29048,16488],{},[16,29049,5464],{},[13,29051,29052],{},"Genera los primeros 10 números de la secuencia Fibonacci (1, 1, 2, 3, 5, 8, 13, 21, 34, 55) usando un bucle for.",[5487,29054,29055,29057],{},[5490,29056,5492],{},[13,29058,29059],{},"Necesitas dos variables para almacenar los dos números anteriores, y en cada iteración calculas el siguiente sumando los dos anteriores.",[43,29061],{},[331,29063,29065],{"id":29064},"desafío-2-calculadora-de-costos-por-tipo-de-componente","Desafío 2: Calculadora de costos por tipo de componente",[13,29067,29068,16488],{},[16,29069,5464],{},[13,29071,29072,29073,4000,29076,29079,29080,29083],{},"Tienes arrays de: ",[54,29074,29075],{},"componentesID",[54,29077,29078],{},"tiposComponente"," (K, Q, F, M), ",[54,29081,29082],{},"precios",". Calcula el costo total por cada tipo de componente usando bucles anidados.",[43,29085],{},[331,29087,29089],{"id":29088},"desafío-3-validador-de-proyecto-con-múltiples-criterios","Desafío 3: Validador de proyecto con múltiples criterios",[13,29091,29092,10447],{},[16,29093,5464],{},[13,29095,29096],{},"Crea un script que procese una lista de páginas del proyecto y valide:",[126,29098,29099,29102,29105],{},[88,29100,29101],{},"Páginas numeradas correctamente (secuencia 1, 2, 3...)",[88,29103,29104],{},"Páginas sin nombre (error)",[88,29106,29107],{},"Páginas duplicadas",[13,29109,29110],{},"Usa diferentes tipos de bucles según convenga y genera reporte detallado.",[43,29112],{},[46,29114,10523],{"id":10522},[126,29116,29117,29124],{},[88,29118,29119],{},[955,29120,29123],{"href":29121,"rel":29122},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Fstatements\u002Fiteration-statements",[959],"Documentación de C# - Bucles",[88,29125],{},[43,29127],{},[46,29129,5728],{"id":5727},[331,29131,29133],{"id":29132},"p-cuándo-usar-for-y-cuándo-foreach","P: ¿Cuándo usar for y cuándo foreach?",[13,29135,29136,5755,29138,29140,29141,29143],{},[16,29137,5737],{},[54,29139,23717],{}," cuando solo necesites recorrer todos los elementos (más simple y legible). Usa ",[54,29142,23258],{}," cuando necesites el índice, quieras saltar elementos, o modificar el array.",[331,29145,29147],{"id":29146},"p-puedo-usar-break-en-un-bucle-anidado-para-salir-de-ambos","P: ¿Puedo usar break en un bucle anidado para salir de ambos?",[13,29149,29150,29152,29153,29155,29156,41],{},[16,29151,5737],{}," No, ",[54,29154,21805],{}," solo sale del bucle más interno. Para salir de ambos, usa una variable bandera o una función con ",[54,29157,22447],{},[331,29159,29161],{"id":29160},"p-qué-pasa-si-el-array-está-vacío-en-un-foreach","P: ¿Qué pasa si el array está vacío en un foreach?",[13,29163,29164,29166],{},[16,29165,5737],{}," El bucle simplemente no ejecuta ninguna iteración (no da error).",[331,29168,29170],{"id":29169},"p-cuántos-niveles-de-anidación-son-recomendables","P: ¿Cuántos niveles de anidación son recomendables?",[13,29172,29173,29175],{},[16,29174,5737],{}," Máximo 2-3 niveles. Si necesitas más, considera refactorizar usando funciones.",[331,29177,29179],{"id":29178},"p-do-while-se-usa-mucho","P: ¿do-while se usa mucho?",[13,29181,29182,29184],{},[16,29183,5737],{}," No, es el menos común. Se usa principalmente para menús que deben mostrarse al menos una vez, o validaciones que deben ejecutarse mínimo una vez.",[43,29186],{},[46,29188,10615],{"id":10614},[13,29190,10618],{},[126,29192,29194,29200,29206,29212,29218,29224,29230,29236],{"className":29193},[275],[88,29195,29197,29199],{"className":29196},[279],[281,29198],{"disabled":238,"type":283}," Entender la diferencia entre for, foreach, while y do-while",[88,29201,29203,29205],{"className":29202},[279],[281,29204],{"disabled":238,"type":283}," Saber cuándo usar cada tipo de bucle",[88,29207,29209,29211],{"className":29208},[279],[281,29210],{"disabled":238,"type":283}," Poder usar break y continue correctamente",[88,29213,29215,29217],{"className":29214},[279],[281,29216],{"disabled":238,"type":283}," Entender cómo funcionan los bucles anidados",[88,29219,29221,29223],{"className":29220},[279],[281,29222],{"disabled":238,"type":283}," Haber ejecutado exitosamente el procesador de componentes",[88,29225,29227,29229],{"className":29226},[279],[281,29228],{"disabled":238,"type":283}," Poder modificar los arrays de entrada y ver diferentes resultados",[88,29231,29233,29235],{"className":29232},[279],[281,29234],{"disabled":238,"type":283}," Evitar bucles infinitos accidentales",[88,29237,29239,10669],{"className":29238},[279],[281,29240],{"disabled":238,"type":283},[43,29242],{},[13,29244,29245,10676,29247,29249,29250,93,29252],{},[31,29246,657],{},[31,29248,10679],{},": 50-60 minutos\n",[31,29251,10683],{},[54,29253,29254],{},"code\u002Fcap-07\u002F",[660,29256,662],{},{"title":228,"searchDepth":229,"depth":229,"links":29258},[29259,29260,29261,29262,29271,29281,29288,29293,29294,29301],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":29263},[29264,29265,29266,29267,29268,29269,29270],{"id":23124,"depth":670,"text":23125},{"id":23251,"depth":670,"text":23252},{"id":23711,"depth":670,"text":23712},{"id":24160,"depth":670,"text":24161},{"id":24710,"depth":670,"text":24711},{"id":25065,"depth":670,"text":25066},{"id":25399,"depth":670,"text":25400},{"id":4024,"depth":229,"text":4025,"children":29272},[29273,29274,29275,29276,29277,29278,29279,29280],{"id":7981,"depth":670,"text":7982},{"id":26100,"depth":670,"text":26101},{"id":26320,"depth":670,"text":26321},{"id":26548,"depth":670,"text":26549},{"id":26758,"depth":670,"text":26759},{"id":26982,"depth":670,"text":26983},{"id":27243,"depth":670,"text":27244},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":29282},[29283,29284,29285,29286,29287],{"id":28355,"depth":670,"text":28356},{"id":28436,"depth":670,"text":28437},{"id":28494,"depth":670,"text":28495},{"id":5120,"depth":670,"text":5121},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":5452,"children":29289},[29290,29291,29292],{"id":29044,"depth":670,"text":29045},{"id":29064,"depth":670,"text":29065},{"id":29088,"depth":670,"text":29089},{"id":10522,"depth":229,"text":10523},{"id":5727,"depth":229,"text":5728,"children":29295},[29296,29297,29298,29299,29300],{"id":29132,"depth":670,"text":29133},{"id":29146,"depth":670,"text":29147},{"id":29160,"depth":670,"text":29161},{"id":29169,"depth":670,"text":29170},{"id":29178,"depth":670,"text":29179},{"id":10614,"depth":229,"text":10615},"Bucles for, while y foreach en C# para automatizar tareas repetitivas en tus scripts EPLAN y agilizar EPLAN Electric P8.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-07-bucles-loops",{"title":22982,"description":29302},"guia\u002Ffundamentos\u002Fcap-07-bucles-loops","sNcPxQ5U2tTltZpXzXh4dNF-LWxn6ZiuT_Pji9vV3Vo",{"id":29309,"title":29310,"body":29311,"description":33328,"extension":236,"meta":33329,"navigation":238,"path":33330,"seo":33331,"stem":33332,"tagline":242,"__hash__":33333},"guia\u002Fguia\u002Ffundamentos\u002Fcap-08-funciones-metodos.md","Capítulo 8: Funciones y métodos en C#",{"type":7,"value":29312,"toc":33289},[29313,29323,29325,29327,29329,29395,29397,29399,29401,29415,29417,29419,29424,29427,29444,29449,29451,29453,29457,29460,29466,29529,29534,29545,29551,29607,29611,29625,29630,29632,29636,29643,29657,29662,29682,29688,29694,29696,29700,29728,29733,29758,29760,29764,29768,29815,29819,29874,29878,29922,29926,29931,29982,29987,30048,30053,30109,30111,30115,30125,30129,30157,30159,30164,30242,30247,30380,30385,30485,30489,30495,30506,30511,30522,30524,30528,30532,30539,30600,30604,30655,30659,30735,30740,30754,30782,30784,30788,30799,30803,30809,30868,30872,30878,31000,31004,31009,31040,31045,31075,31080,31121,31123,31127,31141,31145,31170,31177,31181,31310,31314,31401,31405,31411,31436,31442,31457,31459,31461,31467,31471,31573,31575,31579,31719,31721,31725,31897,31899,31903,32084,32086,32090,32272,32274,32278,32515,32517,32521,32887,32889,32891,32898,32900,32902,32906,32913,32959,32965,32969,32972,33027,33029,33033,33060,33065,33104,33109,33147,33149,33151,33162,33164,33166,33170,33175,33179,33184,33188,33193,33197,33202,33206,33211,33213,33215,33217,33273,33275,33287],[10,29314,29315],{},[13,29316,29317,19,29319,19,29321,262],{},[16,29318,256],{},[16,29320,22993],{},[16,29322,25],{},[43,29324],{},[46,29326,268],{"id":267},[13,29328,702],{},[126,29330,29332,29341,29350,29359,29368,29377,29386],{"className":29331},[275],[88,29333,29335,73,29337,29340],{"className":29334},[279],[281,29336],{"disabled":238,"type":283},[16,29338,29339],{},"Entender qué es una función"," y por qué son fundamentales",[88,29342,29344,73,29346,29349],{"className":29343},[279],[281,29345],{"disabled":238,"type":283},[16,29347,29348],{},"Crear funciones"," con parámetros y valores de retorno",[88,29351,29353,73,29355,29358],{"className":29352},[279],[281,29354],{"disabled":238,"type":283},[16,29356,29357],{},"Diferenciar void"," de funciones que devuelven valores",[88,29360,29362,73,29364,29367],{"className":29361},[279],[281,29363],{"disabled":238,"type":283},[16,29365,29366],{},"Comprender scope"," de variables (local vs global)",[88,29369,29371,73,29373,29376],{"className":29370},[279],[281,29372],{"disabled":238,"type":283},[16,29374,29375],{},"Sobrecargar funciones"," con diferentes firmas",[88,29378,29380,73,29382,29385],{"className":29379},[279],[281,29381],{"disabled":238,"type":283},[16,29383,29384],{},"Usar parámetros opcionales"," para mayor flexibilidad",[88,29387,29389,73,29391,29394],{"className":29388},[279],[281,29390],{"disabled":238,"type":283},[16,29392,29393],{},"Construir una librería"," de funciones reutilizables para ingeniería eléctrica",[43,29396],{},[46,29398,320],{"id":319},[13,29400,726],{},[126,29402,29403,29406,29409,29412],{},[88,29404,29405],{},"Haber completado el Capítulo 7",[88,29407,29408],{},"Entender bucles (for, foreach, while)",[88,29410,29411],{},"Conocer variables y tipos de datos",[88,29413,29414],{},"Saber usar operadores y expresiones",[43,29416],{},[46,29418,740],{"id":739},[13,29420,29421],{},[16,29422,29423],{},"Librería de Funciones para Cálculos Eléctricos",[13,29425,29426],{},"Al final de este capítulo habrás construido una librería completa con funciones para:",[126,29428,29429,29432,29435,29438,29441],{},[88,29430,29431],{},"Ley de Ohm (V, I, R, P)",[88,29433,29434],{},"Caída de tensión en cables",[88,29436,29437],{},"Potencia trifásica",[88,29439,29440],{},"Conversión de unidades",[88,29442,29443],{},"Dimensionado de cables",[13,29445,29446,29448],{},[16,29447,753],{},": 55-65 minutos",[43,29450],{},[46,29452,329],{"id":328},[331,29454,29456],{"id":29455},"_1-introducción-el-problema-del-código-duplicado","1. Introducción: El problema del código duplicado",[13,29458,29459],{},"Imagina que necesitas calcular la Ley de Ohm en 10 lugares diferentes de tu código:",[13,29461,29462,29465],{},[16,29463,29464],{},"Sin funciones"," (código duplicado):",[543,29467,29469],{"className":545,"code":29468,"language":547,"meta":228,"style":228},"\u002F\u002F Lugar 1\ndouble voltaje1 = 230.0;\ndouble corriente1 = 10.0;\ndouble resistencia1 = voltaje1 \u002F corriente1;\n\n\u002F\u002F Lugar 2\ndouble voltaje2 = 400.0;\ndouble corriente2 = 16.0;\ndouble resistencia2 = voltaje2 \u002F corriente2;\n\n\u002F\u002F Lugar 3... Lugar 4... Lugar 5...\n\u002F\u002F Repetir la misma fórmula 10 veces\n",[54,29470,29471,29476,29481,29486,29491,29495,29500,29505,29510,29515,29519,29524],{"__ignoreMap":228},[551,29472,29473],{"class":553,"line":554},[551,29474,29475],{},"\u002F\u002F Lugar 1\n",[551,29477,29478],{"class":553,"line":229},[551,29479,29480],{},"double voltaje1 = 230.0;\n",[551,29482,29483],{"class":553,"line":670},[551,29484,29485],{},"double corriente1 = 10.0;\n",[551,29487,29488],{"class":553,"line":1136},[551,29489,29490],{},"double resistencia1 = voltaje1 \u002F corriente1;\n",[551,29492,29493],{"class":553,"line":1142},[551,29494,1139],{"emptyLinePlaceholder":238},[551,29496,29497],{"class":553,"line":1148},[551,29498,29499],{},"\u002F\u002F Lugar 2\n",[551,29501,29502],{"class":553,"line":1154},[551,29503,29504],{},"double voltaje2 = 400.0;\n",[551,29506,29507],{"class":553,"line":1160},[551,29508,29509],{},"double corriente2 = 16.0;\n",[551,29511,29512],{"class":553,"line":1166},[551,29513,29514],{},"double resistencia2 = voltaje2 \u002F corriente2;\n",[551,29516,29517],{"class":553,"line":1172},[551,29518,1139],{"emptyLinePlaceholder":238},[551,29520,29521],{"class":553,"line":1178},[551,29522,29523],{},"\u002F\u002F Lugar 3... Lugar 4... Lugar 5...\n",[551,29525,29526],{"class":553,"line":1184},[551,29527,29528],{},"\u002F\u002F Repetir la misma fórmula 10 veces\n",[13,29530,29531,416],{},[16,29532,29533],{},"Problemas",[126,29535,29536,29539,29542],{},[88,29537,29538],{},"Si la fórmula tiene un error, debes corregirla en 10 lugares",[88,29540,29541],{},"Si cambias la lógica, debes actualizar 10 lugares",[88,29543,29544],{},"Código difícil de mantener",[13,29546,29547,29550],{},[16,29548,29549],{},"Con funciones"," (código reutilizable):",[543,29552,29554],{"className":545,"code":29553,"language":547,"meta":228,"style":228},"\u002F\u002F Definir una vez\ndouble CalcularResistencia(double voltaje, double corriente)\n{\n    return voltaje \u002F corriente;\n}\n\n\u002F\u002F Usar muchas veces\ndouble resistencia1 = CalcularResistencia(230, 10);\ndouble resistencia2 = CalcularResistencia(400, 16);\ndouble resistencia3 = CalcularResistencia(230, 25);\n\u002F\u002F ...\n",[54,29555,29556,29561,29566,29570,29575,29579,29583,29588,29593,29598,29603],{"__ignoreMap":228},[551,29557,29558],{"class":553,"line":554},[551,29559,29560],{},"\u002F\u002F Definir una vez\n",[551,29562,29563],{"class":553,"line":229},[551,29564,29565],{},"double CalcularResistencia(double voltaje, double corriente)\n",[551,29567,29568],{"class":553,"line":670},[551,29569,1151],{},[551,29571,29572],{"class":553,"line":1136},[551,29573,29574],{},"    return voltaje \u002F corriente;\n",[551,29576,29577],{"class":553,"line":1142},[551,29578,1193],{},[551,29580,29581],{"class":553,"line":1148},[551,29582,1139],{"emptyLinePlaceholder":238},[551,29584,29585],{"class":553,"line":1154},[551,29586,29587],{},"\u002F\u002F Usar muchas veces\n",[551,29589,29590],{"class":553,"line":1160},[551,29591,29592],{},"double resistencia1 = CalcularResistencia(230, 10);\n",[551,29594,29595],{"class":553,"line":1166},[551,29596,29597],{},"double resistencia2 = CalcularResistencia(400, 16);\n",[551,29599,29600],{"class":553,"line":1172},[551,29601,29602],{},"double resistencia3 = CalcularResistencia(230, 25);\n",[551,29604,29605],{"class":553,"line":1178},[551,29606,23534],{},[13,29608,29609,416],{},[16,29610,931],{},[126,29612,29613,29616,29619,29622],{},[88,29614,29615],{},"Código más limpio y legible",[88,29617,29618],{},"Fácil de mantener (cambias en un solo lugar)",[88,29620,29621],{},"Reutilizable en cualquier parte del código",[88,29623,29624],{},"Reduce errores",[13,29626,29627],{},[16,29628,29629],{},"Las funciones son el pilar de la programación profesional.",[43,29631],{},[331,29633,29635],{"id":29634},"_2-qué-es-una-función","2. ¿Qué es una función?",[13,29637,29638,29639,29642],{},"Una función es un ",[16,29640,29641],{},"bloque de código con nombre"," que:",[85,29644,29645,29648,29651,29654],{},[88,29646,29647],{},"Realiza una tarea específica",[88,29649,29650],{},"Puede recibir datos de entrada (parámetros)",[88,29652,29653],{},"Puede devolver un resultado",[88,29655,29656],{},"Se puede llamar\u002Finvocar múltiples veces",[13,29658,29659,29661],{},[16,29660,1231],{},": Piensa en una función como una máquina:",[126,29663,29664,29670,29676],{},[88,29665,29666,29669],{},[16,29667,29668],{},"Entrada",": Materias primas (parámetros)",[88,29671,29672,29675],{},[16,29673,29674],{},"Proceso",": Transformación (código de la función)",[88,29677,29678,29681],{},[16,29679,29680],{},"Salida",": Producto terminado (valor de retorno)",[13,29683,29684,29687],{},[16,29685,29686],{},"Ejemplo real",": Una calculadora es una función",[543,29689,29692],{"className":29690,"code":29691,"language":847},[845],"Entrada: 5, 3, operación \"+\"\nProceso: Sumar 5 + 3\nSalida: 8\n",[54,29693,29691],{"__ignoreMap":228},[43,29695],{},[331,29697,29699],{"id":29698},"_3-sintaxis-básica-de-una-función","3. Sintaxis básica de una función",[543,29701,29703],{"className":545,"code":29702,"language":547,"meta":228,"style":228},"tipoRetorno NombreFuncion(parametro1, parametro2, ...)\n{\n    \u002F\u002F Código de la función\n    return valor;  \u002F\u002F Si devuelve algo\n}\n",[54,29704,29705,29710,29714,29719,29724],{"__ignoreMap":228},[551,29706,29707],{"class":553,"line":554},[551,29708,29709],{},"tipoRetorno NombreFuncion(parametro1, parametro2, ...)\n",[551,29711,29712],{"class":553,"line":229},[551,29713,1151],{},[551,29715,29716],{"class":553,"line":670},[551,29717,29718],{},"    \u002F\u002F Código de la función\n",[551,29720,29721],{"class":553,"line":1136},[551,29722,29723],{},"    return valor;  \u002F\u002F Si devuelve algo\n",[551,29725,29726],{"class":553,"line":1142},[551,29727,1193],{},[13,29729,29730,416],{},[16,29731,29732],{},"Componentes",[126,29734,29735,29741,29747,29753],{},[88,29736,29737,29740],{},[16,29738,29739],{},"tipoRetorno",": Tipo de dato que devuelve (double, int, string, void)",[88,29742,29743,29746],{},[16,29744,29745],{},"NombreFuncion",": Nombre descriptivo (PascalCase por convención)",[88,29748,29749,29752],{},[16,29750,29751],{},"parámetros",": Datos de entrada (tipo nombre)",[88,29754,29755,29757],{},[16,29756,22447],{},": Devuelve el resultado (opcional si es void)",[43,29759],{},[331,29761,29763],{"id":29762},"_4-funciones-que-devuelven-valores","4. Funciones que devuelven valores",[367,29765,29767],{"id":29766},"_41-función-simple-sin-parámetros","4.1 Función simple sin parámetros",[543,29769,29771],{"className":545,"code":29770,"language":547,"meta":228,"style":228},"double ObtenerVoltajeNominal()\n{\n    return 230.0;\n}\n\n\u002F\u002F Uso\ndouble voltaje = ObtenerVoltajeNominal();\nMessageBox.Show(\"Voltaje: \" + voltaje + \"V\");\n\u002F\u002F Voltaje: 230V\n",[54,29772,29773,29778,29782,29787,29791,29795,29800,29805,29810],{"__ignoreMap":228},[551,29774,29775],{"class":553,"line":554},[551,29776,29777],{},"double ObtenerVoltajeNominal()\n",[551,29779,29780],{"class":553,"line":229},[551,29781,1151],{},[551,29783,29784],{"class":553,"line":670},[551,29785,29786],{},"    return 230.0;\n",[551,29788,29789],{"class":553,"line":1136},[551,29790,1193],{},[551,29792,29793],{"class":553,"line":1142},[551,29794,1139],{"emptyLinePlaceholder":238},[551,29796,29797],{"class":553,"line":1148},[551,29798,29799],{},"\u002F\u002F Uso\n",[551,29801,29802],{"class":553,"line":1154},[551,29803,29804],{},"double voltaje = ObtenerVoltajeNominal();\n",[551,29806,29807],{"class":553,"line":1160},[551,29808,29809],{},"MessageBox.Show(\"Voltaje: \" + voltaje + \"V\");\n",[551,29811,29812],{"class":553,"line":1166},[551,29813,29814],{},"\u002F\u002F Voltaje: 230V\n",[367,29816,29818],{"id":29817},"_42-función-con-un-parámetro","4.2 Función con un parámetro",[543,29820,29822],{"className":545,"code":29821,"language":547,"meta":228,"style":228},"double CalcularPotencia(double corriente)\n{\n    double voltaje = 230.0;\n    double potencia = voltaje * corriente;\n    return potencia;\n}\n\n\u002F\u002F Uso\ndouble potencia = CalcularPotencia(16.0);\nMessageBox.Show(\"Potencia: \" + potencia + \"W\");\n\u002F\u002F Potencia: 3680W\n",[54,29823,29824,29829,29833,29837,29842,29847,29851,29855,29859,29864,29869],{"__ignoreMap":228},[551,29825,29826],{"class":553,"line":554},[551,29827,29828],{},"double CalcularPotencia(double corriente)\n",[551,29830,29831],{"class":553,"line":229},[551,29832,1151],{},[551,29834,29835],{"class":553,"line":670},[551,29836,4186],{},[551,29838,29839],{"class":553,"line":1136},[551,29840,29841],{},"    double potencia = voltaje * corriente;\n",[551,29843,29844],{"class":553,"line":1142},[551,29845,29846],{},"    return potencia;\n",[551,29848,29849],{"class":553,"line":1148},[551,29850,1193],{},[551,29852,29853],{"class":553,"line":1154},[551,29854,1139],{"emptyLinePlaceholder":238},[551,29856,29857],{"class":553,"line":1160},[551,29858,29799],{},[551,29860,29861],{"class":553,"line":1166},[551,29862,29863],{},"double potencia = CalcularPotencia(16.0);\n",[551,29865,29866],{"class":553,"line":1172},[551,29867,29868],{},"MessageBox.Show(\"Potencia: \" + potencia + \"W\");\n",[551,29870,29871],{"class":553,"line":1178},[551,29872,29873],{},"\u002F\u002F Potencia: 3680W\n",[367,29875,29877],{"id":29876},"_43-función-con-múltiples-parámetros","4.3 Función con múltiples parámetros",[543,29879,29881],{"className":545,"code":29880,"language":547,"meta":228,"style":228},"double CalcularResistencia(double voltaje, double corriente)\n{\n    return voltaje \u002F corriente;\n}\n\n\u002F\u002F Uso\ndouble resistencia = CalcularResistencia(230.0, 10.0);\nMessageBox.Show(\"Resistencia: \" + resistencia + \" Ω\");\n\u002F\u002F Resistencia: 23 Ω\n",[54,29882,29883,29887,29891,29895,29899,29903,29907,29912,29917],{"__ignoreMap":228},[551,29884,29885],{"class":553,"line":554},[551,29886,29565],{},[551,29888,29889],{"class":553,"line":229},[551,29890,1151],{},[551,29892,29893],{"class":553,"line":670},[551,29894,29574],{},[551,29896,29897],{"class":553,"line":1136},[551,29898,1193],{},[551,29900,29901],{"class":553,"line":1142},[551,29902,1139],{"emptyLinePlaceholder":238},[551,29904,29905],{"class":553,"line":1148},[551,29906,29799],{},[551,29908,29909],{"class":553,"line":1154},[551,29910,29911],{},"double resistencia = CalcularResistencia(230.0, 10.0);\n",[551,29913,29914],{"class":553,"line":1160},[551,29915,29916],{},"MessageBox.Show(\"Resistencia: \" + resistencia + \" Ω\");\n",[551,29918,29919],{"class":553,"line":1166},[551,29920,29921],{},"\u002F\u002F Resistencia: 23 Ω\n",[367,29923,29925],{"id":29924},"_44-ejemplos-prácticos","4.4 Ejemplos prácticos",[13,29927,29928],{},[16,29929,29930],{},"Ejemplo 1: Ley de Ohm - Calcular voltaje",[543,29932,29934],{"className":545,"code":29933,"language":547,"meta":228,"style":228},"double CalcularVoltaje(double corriente, double resistencia)\n{\n    \u002F\u002F V = I × R\n    return corriente * resistencia;\n}\n\n\u002F\u002F Uso\ndouble voltaje = CalcularVoltaje(10.0, 23.0);\nMessageBox.Show(string.Format(\"Voltaje: {0:F2}V\", voltaje));\n\u002F\u002F Voltaje: 230.00V\n",[54,29935,29936,29941,29945,29950,29955,29959,29963,29967,29972,29977],{"__ignoreMap":228},[551,29937,29938],{"class":553,"line":554},[551,29939,29940],{},"double CalcularVoltaje(double corriente, double resistencia)\n",[551,29942,29943],{"class":553,"line":229},[551,29944,1151],{},[551,29946,29947],{"class":553,"line":670},[551,29948,29949],{},"    \u002F\u002F V = I × R\n",[551,29951,29952],{"class":553,"line":1136},[551,29953,29954],{},"    return corriente * resistencia;\n",[551,29956,29957],{"class":553,"line":1142},[551,29958,1193],{},[551,29960,29961],{"class":553,"line":1148},[551,29962,1139],{"emptyLinePlaceholder":238},[551,29964,29965],{"class":553,"line":1154},[551,29966,29799],{},[551,29968,29969],{"class":553,"line":1160},[551,29970,29971],{},"double voltaje = CalcularVoltaje(10.0, 23.0);\n",[551,29973,29974],{"class":553,"line":1166},[551,29975,29976],{},"MessageBox.Show(string.Format(\"Voltaje: {0:F2}V\", voltaje));\n",[551,29978,29979],{"class":553,"line":1172},[551,29980,29981],{},"\u002F\u002F Voltaje: 230.00V\n",[13,29983,29984],{},[16,29985,29986],{},"Ejemplo 2: Calcular caída de tensión",[543,29988,29990],{"className":545,"code":29989,"language":547,"meta":228,"style":228},"double CalcularCaidaTension(double longitud, double corriente, double seccion)\n{\n    \u002F\u002F ΔV = 2 × L × I × ρ \u002F S\n    \u002F\u002F ρ (resistividad cobre) = 0.018 Ω·mm²\u002Fm\n    double resistividad = 0.018;\n    return (2 * longitud * corriente * resistividad) \u002F seccion;\n}\n\n\u002F\u002F Uso\ndouble caida = CalcularCaidaTension(50.0, 16.0, 2.5);\nMessageBox.Show(string.Format(\"Caída de tensión: {0:F2}V\", caida));\n\u002F\u002F Caída de tensión: 11.52V\n",[54,29991,29992,29997,30001,30006,30011,30016,30021,30025,30029,30033,30038,30043],{"__ignoreMap":228},[551,29993,29994],{"class":553,"line":554},[551,29995,29996],{},"double CalcularCaidaTension(double longitud, double corriente, double seccion)\n",[551,29998,29999],{"class":553,"line":229},[551,30000,1151],{},[551,30002,30003],{"class":553,"line":670},[551,30004,30005],{},"    \u002F\u002F ΔV = 2 × L × I × ρ \u002F S\n",[551,30007,30008],{"class":553,"line":1136},[551,30009,30010],{},"    \u002F\u002F ρ (resistividad cobre) = 0.018 Ω·mm²\u002Fm\n",[551,30012,30013],{"class":553,"line":1142},[551,30014,30015],{},"    double resistividad = 0.018;\n",[551,30017,30018],{"class":553,"line":1148},[551,30019,30020],{},"    return (2 * longitud * corriente * resistividad) \u002F seccion;\n",[551,30022,30023],{"class":553,"line":1154},[551,30024,1193],{},[551,30026,30027],{"class":553,"line":1160},[551,30028,1139],{"emptyLinePlaceholder":238},[551,30030,30031],{"class":553,"line":1166},[551,30032,29799],{},[551,30034,30035],{"class":553,"line":1172},[551,30036,30037],{},"double caida = CalcularCaidaTension(50.0, 16.0, 2.5);\n",[551,30039,30040],{"class":553,"line":1178},[551,30041,30042],{},"MessageBox.Show(string.Format(\"Caída de tensión: {0:F2}V\", caida));\n",[551,30044,30045],{"class":553,"line":1184},[551,30046,30047],{},"\u002F\u002F Caída de tensión: 11.52V\n",[13,30049,30050],{},[16,30051,30052],{},"Ejemplo 3: Convertir kW a HP",[543,30054,30056],{"className":545,"code":30055,"language":547,"meta":228,"style":228},"double ConvertirKWaHP(double potenciaKW)\n{\n    \u002F\u002F 1 kW = 1.341 HP\n    return potenciaKW * 1.341;\n}\n\n\u002F\u002F Uso\ndouble potenciaKW = 7.5;\ndouble potenciaHP = ConvertirKWaHP(potenciaKW);\nMessageBox.Show(string.Format(\"{0}kW = {1:F2}HP\", potenciaKW, potenciaHP));\n\u002F\u002F 7.5kW = 10.06HP\n",[54,30057,30058,30063,30067,30072,30077,30081,30085,30089,30094,30099,30104],{"__ignoreMap":228},[551,30059,30060],{"class":553,"line":554},[551,30061,30062],{},"double ConvertirKWaHP(double potenciaKW)\n",[551,30064,30065],{"class":553,"line":229},[551,30066,1151],{},[551,30068,30069],{"class":553,"line":670},[551,30070,30071],{},"    \u002F\u002F 1 kW = 1.341 HP\n",[551,30073,30074],{"class":553,"line":1136},[551,30075,30076],{},"    return potenciaKW * 1.341;\n",[551,30078,30079],{"class":553,"line":1142},[551,30080,1193],{},[551,30082,30083],{"class":553,"line":1148},[551,30084,1139],{"emptyLinePlaceholder":238},[551,30086,30087],{"class":553,"line":1154},[551,30088,29799],{},[551,30090,30091],{"class":553,"line":1160},[551,30092,30093],{},"double potenciaKW = 7.5;\n",[551,30095,30096],{"class":553,"line":1166},[551,30097,30098],{},"double potenciaHP = ConvertirKWaHP(potenciaKW);\n",[551,30100,30101],{"class":553,"line":1172},[551,30102,30103],{},"MessageBox.Show(string.Format(\"{0}kW = {1:F2}HP\", potenciaKW, potenciaHP));\n",[551,30105,30106],{"class":553,"line":1178},[551,30107,30108],{},"\u002F\u002F 7.5kW = 10.06HP\n",[43,30110],{},[331,30112,30114],{"id":30113},"_5-funciones-void-sin-valor-de-retorno","5. Funciones void - Sin valor de retorno",[13,30116,30117,30118,73,30121,30124],{},"Funciones ",[54,30119,30120],{},"void",[16,30122,30123],{},"no devuelven"," ningún valor. Se usan para realizar acciones.",[367,30126,30128],{"id":30127},"_51-sintaxis","5.1 Sintaxis",[543,30130,30132],{"className":545,"code":30131,"language":547,"meta":228,"style":228},"void NombreFuncion(parametros)\n{\n    \u002F\u002F Código que realiza una acción\n    \u002F\u002F NO usa return (o return sin valor)\n}\n",[54,30133,30134,30139,30143,30148,30153],{"__ignoreMap":228},[551,30135,30136],{"class":553,"line":554},[551,30137,30138],{},"void NombreFuncion(parametros)\n",[551,30140,30141],{"class":553,"line":229},[551,30142,1151],{},[551,30144,30145],{"class":553,"line":670},[551,30146,30147],{},"    \u002F\u002F Código que realiza una acción\n",[551,30149,30150],{"class":553,"line":1136},[551,30151,30152],{},"    \u002F\u002F NO usa return (o return sin valor)\n",[551,30154,30155],{"class":553,"line":1142},[551,30156,1193],{},[367,30158,24838],{"id":24837},[13,30160,30161],{},[16,30162,30163],{},"Ejemplo 1: Mostrar mensaje formateado",[543,30165,30167],{"className":545,"code":30166,"language":547,"meta":228,"style":228},"void MostrarResumen(string componente, double corriente, double potencia)\n{\n    string mensaje = string.Format(\n        \"Componente: {0}\\n\" +\n        \"Corriente: {1:F1}A\\n\" +\n        \"Potencia: {2:F2}W\",\n        componente,\n        corriente,\n        potencia\n    );\n\n    MessageBox.Show(mensaje, \"Resumen\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n}\n\n\u002F\u002F Uso\nMostrarResumen(\"Motor M1\", 18.5, 4255.0);\n",[54,30168,30169,30174,30178,30183,30188,30193,30198,30203,30207,30212,30216,30220,30225,30229,30233,30237],{"__ignoreMap":228},[551,30170,30171],{"class":553,"line":554},[551,30172,30173],{},"void MostrarResumen(string componente, double corriente, double potencia)\n",[551,30175,30176],{"class":553,"line":229},[551,30177,1151],{},[551,30179,30180],{"class":553,"line":670},[551,30181,30182],{},"    string mensaje = string.Format(\n",[551,30184,30185],{"class":553,"line":1136},[551,30186,30187],{},"        \"Componente: {0}\\n\" +\n",[551,30189,30190],{"class":553,"line":1142},[551,30191,30192],{},"        \"Corriente: {1:F1}A\\n\" +\n",[551,30194,30195],{"class":553,"line":1148},[551,30196,30197],{},"        \"Potencia: {2:F2}W\",\n",[551,30199,30200],{"class":553,"line":1154},[551,30201,30202],{},"        componente,\n",[551,30204,30205],{"class":553,"line":1160},[551,30206,26266],{},[551,30208,30209],{"class":553,"line":1166},[551,30210,30211],{},"        potencia\n",[551,30213,30214],{"class":553,"line":1172},[551,30215,26276],{},[551,30217,30218],{"class":553,"line":1178},[551,30219,1139],{"emptyLinePlaceholder":238},[551,30221,30222],{"class":553,"line":1184},[551,30223,30224],{},"    MessageBox.Show(mensaje, \"Resumen\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[551,30226,30227],{"class":553,"line":1190},[551,30228,1193],{},[551,30230,30231],{"class":553,"line":1472},[551,30232,1139],{"emptyLinePlaceholder":238},[551,30234,30235],{"class":553,"line":1477},[551,30236,29799],{},[551,30238,30239],{"class":553,"line":1797},[551,30240,30241],{},"MostrarResumen(\"Motor M1\", 18.5, 4255.0);\n",[13,30243,30244],{},[16,30245,30246],{},"Ejemplo 2: Validar y alertar",[543,30248,30250],{"className":545,"code":30249,"language":547,"meta":228,"style":228},"void ValidarVoltaje(double voltaje)\n{\n    double minimo = 207.0;\n    double maximo = 253.0;\n\n    if (voltaje \u003C minimo || voltaje > maximo)\n    {\n        MessageBox.Show(\n            string.Format(\"ADVERTENCIA: Voltaje {0:F1}V fuera de rango ({1}V - {2}V)\",\n                voltaje, minimo, maximo),\n            \"Voltaje Anormal\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Warning\n        );\n    }\n    else\n    {\n        MessageBox.Show(\n            string.Format(\"Voltaje {0:F1}V - Normal\", voltaje),\n            \"Voltaje OK\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Information\n        );\n    }\n}\n\n\u002F\u002F Uso\nValidarVoltaje(195.0);  \u002F\u002F Muestra advertencia\nValidarVoltaje(230.0);  \u002F\u002F Muestra OK\n",[54,30251,30252,30257,30261,30266,30271,30275,30280,30284,30288,30293,30298,30303,30307,30312,30316,30320,30324,30328,30332,30337,30342,30346,30350,30354,30358,30362,30366,30370,30375],{"__ignoreMap":228},[551,30253,30254],{"class":553,"line":554},[551,30255,30256],{},"void ValidarVoltaje(double voltaje)\n",[551,30258,30259],{"class":553,"line":229},[551,30260,1151],{},[551,30262,30263],{"class":553,"line":670},[551,30264,30265],{},"    double minimo = 207.0;\n",[551,30267,30268],{"class":553,"line":1136},[551,30269,30270],{},"    double maximo = 253.0;\n",[551,30272,30273],{"class":553,"line":1142},[551,30274,1139],{"emptyLinePlaceholder":238},[551,30276,30277],{"class":553,"line":1148},[551,30278,30279],{},"    if (voltaje \u003C minimo || voltaje > maximo)\n",[551,30281,30282],{"class":553,"line":1154},[551,30283,1169],{},[551,30285,30286],{"class":553,"line":1160},[551,30287,4790],{},[551,30289,30290],{"class":553,"line":1166},[551,30291,30292],{},"            string.Format(\"ADVERTENCIA: Voltaje {0:F1}V fuera de rango ({1}V - {2}V)\",\n",[551,30294,30295],{"class":553,"line":1172},[551,30296,30297],{},"                voltaje, minimo, maximo),\n",[551,30299,30300],{"class":553,"line":1178},[551,30301,30302],{},"            \"Voltaje Anormal\",\n",[551,30304,30305],{"class":553,"line":1184},[551,30306,4808],{},[551,30308,30309],{"class":553,"line":1190},[551,30310,30311],{},"            MessageBoxIcon.Warning\n",[551,30313,30314],{"class":553,"line":1472},[551,30315,4758],{},[551,30317,30318],{"class":553,"line":1477},[551,30319,1187],{},[551,30321,30322],{"class":553,"line":1797},[551,30323,12046],{},[551,30325,30326],{"class":553,"line":1802},[551,30327,1169],{},[551,30329,30330],{"class":553,"line":1808},[551,30331,4790],{},[551,30333,30334],{"class":553,"line":1814},[551,30335,30336],{},"            string.Format(\"Voltaje {0:F1}V - Normal\", voltaje),\n",[551,30338,30339],{"class":553,"line":1820},[551,30340,30341],{},"            \"Voltaje OK\",\n",[551,30343,30344],{"class":553,"line":1826},[551,30345,4808],{},[551,30347,30348],{"class":553,"line":1832},[551,30349,4814],{},[551,30351,30352],{"class":553,"line":1838},[551,30353,4758],{},[551,30355,30356],{"class":553,"line":1844},[551,30357,1187],{},[551,30359,30360],{"class":553,"line":1850},[551,30361,1193],{},[551,30363,30364],{"class":553,"line":1855},[551,30365,1139],{"emptyLinePlaceholder":238},[551,30367,30368],{"class":553,"line":1861},[551,30369,29799],{},[551,30371,30372],{"class":553,"line":1867},[551,30373,30374],{},"ValidarVoltaje(195.0);  \u002F\u002F Muestra advertencia\n",[551,30376,30377],{"class":553,"line":1873},[551,30378,30379],{},"ValidarVoltaje(230.0);  \u002F\u002F Muestra OK\n",[13,30381,30382],{},[16,30383,30384],{},"Ejemplo 3: Imprimir tabla",[543,30386,30388],{"className":545,"code":30387,"language":547,"meta":228,"style":228},"void ImprimirTablaCaidas(double seccion)\n{\n    string tabla = string.Format(\"Caídas de tensión para cable {0}mm²\\n\", seccion);\n    tabla += \"====================================\\n\";\n    tabla += \"Longitud | Corriente | Caída\\n\";\n    tabla += \"------------------------------------\\n\";\n\n    double[] longitudes = {10, 25, 50, 75, 100};\n    double corriente = 16.0;\n\n    foreach (double longitud in longitudes)\n    {\n        double caida = CalcularCaidaTension(longitud, corriente, seccion);\n        tabla += string.Format(\"{0,8}m | {1,9}A | {2,5:F2}V\\n\", longitud, corriente, caida);\n    }\n\n    MessageBox.Show(tabla, \"Tabla de Caídas\");\n}\n\n\u002F\u002F Uso\nImprimirTablaCaidas(2.5);\n",[54,30389,30390,30395,30399,30404,30409,30414,30419,30423,30428,30432,30436,30441,30445,30450,30455,30459,30463,30468,30472,30476,30480],{"__ignoreMap":228},[551,30391,30392],{"class":553,"line":554},[551,30393,30394],{},"void ImprimirTablaCaidas(double seccion)\n",[551,30396,30397],{"class":553,"line":229},[551,30398,1151],{},[551,30400,30401],{"class":553,"line":670},[551,30402,30403],{},"    string tabla = string.Format(\"Caídas de tensión para cable {0}mm²\\n\", seccion);\n",[551,30405,30406],{"class":553,"line":1136},[551,30407,30408],{},"    tabla += \"====================================\\n\";\n",[551,30410,30411],{"class":553,"line":1142},[551,30412,30413],{},"    tabla += \"Longitud | Corriente | Caída\\n\";\n",[551,30415,30416],{"class":553,"line":1148},[551,30417,30418],{},"    tabla += \"------------------------------------\\n\";\n",[551,30420,30421],{"class":553,"line":1154},[551,30422,1139],{"emptyLinePlaceholder":238},[551,30424,30425],{"class":553,"line":1160},[551,30426,30427],{},"    double[] longitudes = {10, 25, 50, 75, 100};\n",[551,30429,30430],{"class":553,"line":1166},[551,30431,4191],{},[551,30433,30434],{"class":553,"line":1172},[551,30435,1139],{"emptyLinePlaceholder":238},[551,30437,30438],{"class":553,"line":1178},[551,30439,30440],{},"    foreach (double longitud in longitudes)\n",[551,30442,30443],{"class":553,"line":1184},[551,30444,1169],{},[551,30446,30447],{"class":553,"line":1190},[551,30448,30449],{},"        double caida = CalcularCaidaTension(longitud, corriente, seccion);\n",[551,30451,30452],{"class":553,"line":1472},[551,30453,30454],{},"        tabla += string.Format(\"{0,8}m | {1,9}A | {2,5:F2}V\\n\", longitud, corriente, caida);\n",[551,30456,30457],{"class":553,"line":1477},[551,30458,1187],{},[551,30460,30461],{"class":553,"line":1797},[551,30462,1139],{"emptyLinePlaceholder":238},[551,30464,30465],{"class":553,"line":1802},[551,30466,30467],{},"    MessageBox.Show(tabla, \"Tabla de Caídas\");\n",[551,30469,30470],{"class":553,"line":1808},[551,30471,1193],{},[551,30473,30474],{"class":553,"line":1814},[551,30475,1139],{"emptyLinePlaceholder":238},[551,30477,30478],{"class":553,"line":1820},[551,30479,29799],{},[551,30481,30482],{"class":553,"line":1826},[551,30483,30484],{},"ImprimirTablaCaidas(2.5);\n",[367,30486,30488],{"id":30487},"_53-cuándo-usar-void","5.3 ¿Cuándo usar void?",[13,30490,30491,30494],{},[16,30492,30493],{},"Usa funciones con return"," cuando:",[126,30496,30497,30500,30503],{},[88,30498,30499],{},"Necesitas calcular y devolver un valor",[88,30501,30502],{},"El resultado se usará en otras operaciones",[88,30504,30505],{},"Ejemplo: CalcularResistencia(), ConvertirUnidades()",[13,30507,30508,30494],{},[16,30509,30510],{},"Usa void",[126,30512,30513,30516,30519],{},[88,30514,30515],{},"Solo realizas una acción (mostrar, imprimir, validar)",[88,30517,30518],{},"No necesitas devolver ningún resultado",[88,30520,30521],{},"Ejemplo: MostrarMensaje(), ValidarDatos(), ImprimirReporte()",[43,30523],{},[331,30525,30527],{"id":30526},"_6-parámetros-de-funciones","6. Parámetros de funciones",[367,30529,30531],{"id":30530},"_61-parámetros-por-valor-por-defecto","6.1 Parámetros por valor (por defecto)",[13,30533,30534,30535,30538],{},"Los parámetros se ",[16,30536,30537],{},"copian",". Cambios dentro de la función NO afectan el original.",[543,30540,30542],{"className":545,"code":30541,"language":547,"meta":228,"style":228},"void ModificarValor(int numero)\n{\n    numero = 100;  \u002F\u002F Modifica la copia, no el original\n    MessageBox.Show(\"Dentro de función: \" + numero);\n}\n\n\u002F\u002F Uso\nint valor = 10;\nModificarValor(valor);\nMessageBox.Show(\"Fuera de función: \" + valor);\n\u002F\u002F Dentro de función: 100\n\u002F\u002F Fuera de función: 10 (¡no cambió!)\n",[54,30543,30544,30549,30553,30558,30563,30567,30571,30575,30580,30585,30590,30595],{"__ignoreMap":228},[551,30545,30546],{"class":553,"line":554},[551,30547,30548],{},"void ModificarValor(int numero)\n",[551,30550,30551],{"class":553,"line":229},[551,30552,1151],{},[551,30554,30555],{"class":553,"line":670},[551,30556,30557],{},"    numero = 100;  \u002F\u002F Modifica la copia, no el original\n",[551,30559,30560],{"class":553,"line":1136},[551,30561,30562],{},"    MessageBox.Show(\"Dentro de función: \" + numero);\n",[551,30564,30565],{"class":553,"line":1142},[551,30566,1193],{},[551,30568,30569],{"class":553,"line":1148},[551,30570,1139],{"emptyLinePlaceholder":238},[551,30572,30573],{"class":553,"line":1154},[551,30574,29799],{},[551,30576,30577],{"class":553,"line":1160},[551,30578,30579],{},"int valor = 10;\n",[551,30581,30582],{"class":553,"line":1166},[551,30583,30584],{},"ModificarValor(valor);\n",[551,30586,30587],{"class":553,"line":1172},[551,30588,30589],{},"MessageBox.Show(\"Fuera de función: \" + valor);\n",[551,30591,30592],{"class":553,"line":1178},[551,30593,30594],{},"\u002F\u002F Dentro de función: 100\n",[551,30596,30597],{"class":553,"line":1184},[551,30598,30599],{},"\u002F\u002F Fuera de función: 10 (¡no cambió!)\n",[367,30601,30603],{"id":30602},"_62-múltiples-parámetros-de-diferentes-tipos","6.2 Múltiples parámetros de diferentes tipos",[543,30605,30607],{"className":545,"code":30606,"language":547,"meta":228,"style":228},"string GenerarEtiqueta(string designacion, double corriente, bool esTrifasico, int numeroPolo)\n{\n    string tipo = esTrifasico ? \"3~\" : \"1~\";\n    return string.Format(\"{0} | {1}A | {2} | {3}P\", designacion, corriente, tipo, numeroPolo);\n}\n\n\u002F\u002F Uso\nstring etiqueta = GenerarEtiqueta(\"Q1\", 25.0, true, 3);\nMessageBox.Show(etiqueta);\n\u002F\u002F Q1 | 25A | 3~ | 3P\n",[54,30608,30609,30614,30618,30623,30628,30632,30636,30640,30645,30650],{"__ignoreMap":228},[551,30610,30611],{"class":553,"line":554},[551,30612,30613],{},"string GenerarEtiqueta(string designacion, double corriente, bool esTrifasico, int numeroPolo)\n",[551,30615,30616],{"class":553,"line":229},[551,30617,1151],{},[551,30619,30620],{"class":553,"line":670},[551,30621,30622],{},"    string tipo = esTrifasico ? \"3~\" : \"1~\";\n",[551,30624,30625],{"class":553,"line":1136},[551,30626,30627],{},"    return string.Format(\"{0} | {1}A | {2} | {3}P\", designacion, corriente, tipo, numeroPolo);\n",[551,30629,30630],{"class":553,"line":1142},[551,30631,1193],{},[551,30633,30634],{"class":553,"line":1148},[551,30635,1139],{"emptyLinePlaceholder":238},[551,30637,30638],{"class":553,"line":1154},[551,30639,29799],{},[551,30641,30642],{"class":553,"line":1160},[551,30643,30644],{},"string etiqueta = GenerarEtiqueta(\"Q1\", 25.0, true, 3);\n",[551,30646,30647],{"class":553,"line":1166},[551,30648,30649],{},"MessageBox.Show(etiqueta);\n",[551,30651,30652],{"class":553,"line":1172},[551,30653,30654],{},"\u002F\u002F Q1 | 25A | 3~ | 3P\n",[367,30656,30658],{"id":30657},"_63-parámetros-con-valores-predeterminados-opcionales","6.3 Parámetros con valores predeterminados (opcionales)",[543,30660,30662],{"className":545,"code":30661,"language":547,"meta":228,"style":228},"double CalcularPotenciaTrifasica(double voltaje, double corriente, double factorPotencia = 1.0)\n{\n    \u002F\u002F P = √3 × V × I × cos φ\n    return Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n}\n\n\u002F\u002F Uso sin especificar factor de potencia (usa 1.0 por defecto)\ndouble p1 = CalcularPotenciaTrifasica(400.0, 50.0);\nMessageBox.Show(\"Potencia 1: \" + p1);\n\u002F\u002F Potencia 1: 34641\n\n\u002F\u002F Uso especificando factor de potencia\ndouble p2 = CalcularPotenciaTrifasica(400.0, 50.0, 0.85);\nMessageBox.Show(\"Potencia 2: \" + p2);\n\u002F\u002F Potencia 2: 29445\n",[54,30663,30664,30669,30673,30678,30683,30687,30691,30696,30701,30706,30711,30715,30720,30725,30730],{"__ignoreMap":228},[551,30665,30666],{"class":553,"line":554},[551,30667,30668],{},"double CalcularPotenciaTrifasica(double voltaje, double corriente, double factorPotencia = 1.0)\n",[551,30670,30671],{"class":553,"line":229},[551,30672,1151],{},[551,30674,30675],{"class":553,"line":670},[551,30676,30677],{},"    \u002F\u002F P = √3 × V × I × cos φ\n",[551,30679,30680],{"class":553,"line":1136},[551,30681,30682],{},"    return Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n",[551,30684,30685],{"class":553,"line":1142},[551,30686,1193],{},[551,30688,30689],{"class":553,"line":1148},[551,30690,1139],{"emptyLinePlaceholder":238},[551,30692,30693],{"class":553,"line":1154},[551,30694,30695],{},"\u002F\u002F Uso sin especificar factor de potencia (usa 1.0 por defecto)\n",[551,30697,30698],{"class":553,"line":1160},[551,30699,30700],{},"double p1 = CalcularPotenciaTrifasica(400.0, 50.0);\n",[551,30702,30703],{"class":553,"line":1166},[551,30704,30705],{},"MessageBox.Show(\"Potencia 1: \" + p1);\n",[551,30707,30708],{"class":553,"line":1172},[551,30709,30710],{},"\u002F\u002F Potencia 1: 34641\n",[551,30712,30713],{"class":553,"line":1178},[551,30714,1139],{"emptyLinePlaceholder":238},[551,30716,30717],{"class":553,"line":1184},[551,30718,30719],{},"\u002F\u002F Uso especificando factor de potencia\n",[551,30721,30722],{"class":553,"line":1190},[551,30723,30724],{},"double p2 = CalcularPotenciaTrifasica(400.0, 50.0, 0.85);\n",[551,30726,30727],{"class":553,"line":1472},[551,30728,30729],{},"MessageBox.Show(\"Potencia 2: \" + p2);\n",[551,30731,30732],{"class":553,"line":1477},[551,30733,30734],{},"\u002F\u002F Potencia 2: 29445\n",[13,30736,30737,416],{},[16,30738,30739],{},"Reglas de parámetros opcionales",[126,30741,30742,30749],{},[88,30743,30744,30745,30748],{},"Deben estar al ",[16,30746,30747],{},"final"," de la lista de parámetros",[88,30750,30751,30752],{},"Se especifica valor predeterminado con ",[54,30753,7458],{},[543,30755,30757],{"className":545,"code":30756,"language":547,"meta":228,"style":228},"\u002F\u002F Correcto\ndouble Funcion(double a, double b, double c = 10.0, string d = \"default\")\n\n\u002F\u002F Error: parámetros opcionales deben estar al final\ndouble Funcion(double a, double b = 10.0, double c, string d)  \u002F\u002F  ERROR\n",[54,30758,30759,30763,30768,30772,30777],{"__ignoreMap":228},[551,30760,30761],{"class":553,"line":554},[551,30762,29016],{},[551,30764,30765],{"class":553,"line":229},[551,30766,30767],{},"double Funcion(double a, double b, double c = 10.0, string d = \"default\")\n",[551,30769,30770],{"class":553,"line":670},[551,30771,1139],{"emptyLinePlaceholder":238},[551,30773,30774],{"class":553,"line":1136},[551,30775,30776],{},"\u002F\u002F Error: parámetros opcionales deben estar al final\n",[551,30778,30779],{"class":553,"line":1142},[551,30780,30781],{},"double Funcion(double a, double b = 10.0, double c, string d)  \u002F\u002F  ERROR\n",[43,30783],{},[331,30785,30787],{"id":30786},"_7-scope-de-variables-ámbito","7. Scope de variables (ámbito)",[13,30789,30790,30791,30794,30795,30798],{},"El ",[16,30792,30793],{},"scope"," determina ",[16,30796,30797],{},"dónde"," una variable es visible y accesible.",[367,30800,30802],{"id":30801},"_71-variables-locales-dentro-de-función","7.1 Variables locales (dentro de función)",[13,30804,30805,30806,30808],{},"Variables declaradas ",[16,30807,33],{}," de una función solo existen en esa función.",[543,30810,30812],{"className":545,"code":30811,"language":547,"meta":228,"style":228},"double CalcularPotencia(double voltaje, double corriente)\n{\n    \u002F\u002F 'resultado' es una variable LOCAL\n    double resultado = voltaje * corriente;\n    return resultado;\n}\n\n\u002F\u002F Uso\ndouble potencia = CalcularPotencia(230, 10);\nMessageBox.Show(\"Potencia: \" + potencia);\n\u002F\u002F MessageBox.Show(\"Resultado: \" + resultado);  \u002F\u002F  ERROR: 'resultado' no existe aquí\n",[54,30813,30814,30819,30823,30828,30833,30838,30842,30846,30850,30855,30860],{"__ignoreMap":228},[551,30815,30816],{"class":553,"line":554},[551,30817,30818],{},"double CalcularPotencia(double voltaje, double corriente)\n",[551,30820,30821],{"class":553,"line":229},[551,30822,1151],{},[551,30824,30825],{"class":553,"line":670},[551,30826,30827],{},"    \u002F\u002F 'resultado' es una variable LOCAL\n",[551,30829,30830],{"class":553,"line":1136},[551,30831,30832],{},"    double resultado = voltaje * corriente;\n",[551,30834,30835],{"class":553,"line":1142},[551,30836,30837],{},"    return resultado;\n",[551,30839,30840],{"class":553,"line":1148},[551,30841,1193],{},[551,30843,30844],{"class":553,"line":1154},[551,30845,1139],{"emptyLinePlaceholder":238},[551,30847,30848],{"class":553,"line":1160},[551,30849,29799],{},[551,30851,30852],{"class":553,"line":1166},[551,30853,30854],{},"double potencia = CalcularPotencia(230, 10);\n",[551,30856,30857],{"class":553,"line":1172},[551,30858,30859],{},"MessageBox.Show(\"Potencia: \" + potencia);\n",[551,30861,30862,30865],{"class":553,"line":1178},[551,30863,30864],{},"\u002F\u002F MessageBox.Show(\"Resultado: \" + resultado);",[551,30866,30867],{},"  \u002F\u002F  ERROR: 'resultado' no existe aquí\n",[367,30869,30871],{"id":30870},"_72-variables-globales-nivel-de-clase","7.2 Variables globales (nivel de clase)",[13,30873,30805,30874,30877],{},[16,30875,30876],{},"fuera"," de funciones (a nivel de clase) son accesibles desde todas las funciones.",[543,30879,30881],{"className":545,"code":30880,"language":547,"meta":228,"style":228},"public class CalculadoraElectrica\n{\n    \u002F\u002F Variables globales (campos de la clase)\n    private const double VOLTAJE_NOMINAL = 230.0;\n    private const double RESISTIVIDAD_COBRE = 0.018;\n\n    [Start]\n    public void Ejecutar()\n    {\n        double p1 = CalcularPotencia(10.0);\n        double p2 = CalcularPotencia(16.0);\n        \u002F\u002F Ambas funciones usan VOLTAJE_NOMINAL\n    }\n\n    double CalcularPotencia(double corriente)\n    {\n        \u002F\u002F Puede acceder a VOLTAJE_NOMINAL porque es global\n        return VOLTAJE_NOMINAL * corriente;\n    }\n\n    double CalcularCaidaTension(double longitud, double corriente, double seccion)\n    {\n        \u002F\u002F Puede acceder a RESISTIVIDAD_COBRE porque es global\n        return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F seccion;\n    }\n}\n",[54,30882,30883,30888,30892,30897,30902,30907,30911,30915,30919,30923,30928,30933,30938,30942,30946,30951,30955,30960,30965,30969,30973,30978,30982,30987,30992,30996],{"__ignoreMap":228},[551,30884,30885],{"class":553,"line":554},[551,30886,30887],{},"public class CalculadoraElectrica\n",[551,30889,30890],{"class":553,"line":229},[551,30891,1151],{},[551,30893,30894],{"class":553,"line":670},[551,30895,30896],{},"    \u002F\u002F Variables globales (campos de la clase)\n",[551,30898,30899],{"class":553,"line":1136},[551,30900,30901],{},"    private const double VOLTAJE_NOMINAL = 230.0;\n",[551,30903,30904],{"class":553,"line":1142},[551,30905,30906],{},"    private const double RESISTIVIDAD_COBRE = 0.018;\n",[551,30908,30909],{"class":553,"line":1148},[551,30910,1139],{"emptyLinePlaceholder":238},[551,30912,30913],{"class":553,"line":1154},[551,30914,1157],{},[551,30916,30917],{"class":553,"line":1160},[551,30918,1163],{},[551,30920,30921],{"class":553,"line":1166},[551,30922,1169],{},[551,30924,30925],{"class":553,"line":1172},[551,30926,30927],{},"        double p1 = CalcularPotencia(10.0);\n",[551,30929,30930],{"class":553,"line":1178},[551,30931,30932],{},"        double p2 = CalcularPotencia(16.0);\n",[551,30934,30935],{"class":553,"line":1184},[551,30936,30937],{},"        \u002F\u002F Ambas funciones usan VOLTAJE_NOMINAL\n",[551,30939,30940],{"class":553,"line":1190},[551,30941,1187],{},[551,30943,30944],{"class":553,"line":1472},[551,30945,1139],{"emptyLinePlaceholder":238},[551,30947,30948],{"class":553,"line":1477},[551,30949,30950],{},"    double CalcularPotencia(double corriente)\n",[551,30952,30953],{"class":553,"line":1797},[551,30954,1169],{},[551,30956,30957],{"class":553,"line":1802},[551,30958,30959],{},"        \u002F\u002F Puede acceder a VOLTAJE_NOMINAL porque es global\n",[551,30961,30962],{"class":553,"line":1808},[551,30963,30964],{},"        return VOLTAJE_NOMINAL * corriente;\n",[551,30966,30967],{"class":553,"line":1814},[551,30968,1187],{},[551,30970,30971],{"class":553,"line":1820},[551,30972,1139],{"emptyLinePlaceholder":238},[551,30974,30975],{"class":553,"line":1826},[551,30976,30977],{},"    double CalcularCaidaTension(double longitud, double corriente, double seccion)\n",[551,30979,30980],{"class":553,"line":1832},[551,30981,1169],{},[551,30983,30984],{"class":553,"line":1838},[551,30985,30986],{},"        \u002F\u002F Puede acceder a RESISTIVIDAD_COBRE porque es global\n",[551,30988,30989],{"class":553,"line":1844},[551,30990,30991],{},"        return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F seccion;\n",[551,30993,30994],{"class":553,"line":1850},[551,30995,1187],{},[551,30997,30998],{"class":553,"line":1855},[551,30999,1193],{},[367,31001,31003],{"id":31002},"_73-buenas-prácticas-de-scope","7.3 Buenas prácticas de scope",[13,31005,31006,416],{},[16,31007,31008],{},"Prefiere variables locales",[543,31010,31012],{"className":545,"code":31011,"language":547,"meta":228,"style":228},"\u002F\u002F Bien: variables locales\ndouble CalcularPotencia(double voltaje, double corriente)\n{\n    double resultado = voltaje * corriente;  \u002F\u002F Local, no contamina otros métodos\n    return resultado;\n}\n",[54,31013,31014,31019,31023,31027,31032,31036],{"__ignoreMap":228},[551,31015,31016],{"class":553,"line":554},[551,31017,31018],{},"\u002F\u002F Bien: variables locales\n",[551,31020,31021],{"class":553,"line":229},[551,31022,30818],{},[551,31024,31025],{"class":553,"line":670},[551,31026,1151],{},[551,31028,31029],{"class":553,"line":1136},[551,31030,31031],{},"    double resultado = voltaje * corriente;  \u002F\u002F Local, no contamina otros métodos\n",[551,31033,31034],{"class":553,"line":1142},[551,31035,30837],{},[551,31037,31038],{"class":553,"line":1148},[551,31039,1193],{},[13,31041,31042,416],{},[16,31043,31044],{},"Usa constantes globales para valores fijos",[543,31046,31048],{"className":545,"code":31047,"language":547,"meta":228,"style":228},"\u002F\u002F Bien: constantes globales para valores que no cambian\nprivate const double VOLTAJE_NOMINAL_EU = 230.0;\nprivate const double VOLTAJE_NOMINAL_US = 120.0;\nprivate const double FRECUENCIA_EU = 50.0;\nprivate const double FRECUENCIA_US = 60.0;\n",[54,31049,31050,31055,31060,31065,31070],{"__ignoreMap":228},[551,31051,31052],{"class":553,"line":554},[551,31053,31054],{},"\u002F\u002F Bien: constantes globales para valores que no cambian\n",[551,31056,31057],{"class":553,"line":229},[551,31058,31059],{},"private const double VOLTAJE_NOMINAL_EU = 230.0;\n",[551,31061,31062],{"class":553,"line":670},[551,31063,31064],{},"private const double VOLTAJE_NOMINAL_US = 120.0;\n",[551,31066,31067],{"class":553,"line":1136},[551,31068,31069],{},"private const double FRECUENCIA_EU = 50.0;\n",[551,31071,31072],{"class":553,"line":1142},[551,31073,31074],{},"private const double FRECUENCIA_US = 60.0;\n",[13,31076,31077,416],{},[16,31078,31079],{},"Evita variables globales mutables",[543,31081,31083],{"className":545,"code":31082,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: variable global que cambia\nprivate double voltajeActual = 230.0;  \u002F\u002F ¿Quién la modifica? ¿Cuándo?\n\n\u002F\u002F Mejor: pasar como parámetro\ndouble CalcularPotencia(double voltaje, double corriente)\n{\n    return voltaje * corriente;\n}\n",[54,31084,31085,31090,31095,31099,31104,31108,31112,31117],{"__ignoreMap":228},[551,31086,31087],{"class":553,"line":554},[551,31088,31089],{},"\u002F\u002F Mal: variable global que cambia\n",[551,31091,31092],{"class":553,"line":229},[551,31093,31094],{},"private double voltajeActual = 230.0;  \u002F\u002F ¿Quién la modifica? ¿Cuándo?\n",[551,31096,31097],{"class":553,"line":670},[551,31098,1139],{"emptyLinePlaceholder":238},[551,31100,31101],{"class":553,"line":1136},[551,31102,31103],{},"\u002F\u002F Mejor: pasar como parámetro\n",[551,31105,31106],{"class":553,"line":1142},[551,31107,30818],{},[551,31109,31110],{"class":553,"line":1148},[551,31111,1151],{},[551,31113,31114],{"class":553,"line":1154},[551,31115,31116],{},"    return voltaje * corriente;\n",[551,31118,31119],{"class":553,"line":1160},[551,31120,1193],{},[43,31122],{},[331,31124,31126],{"id":31125},"_8-sobrecarga-de-funciones-overloading","8. Sobrecarga de funciones (Overloading)",[13,31128,31129,31130,31133,31134,31137,31138,41],{},"La ",[16,31131,31132],{},"sobrecarga"," permite tener ",[16,31135,31136],{},"múltiples funciones con el mismo nombre"," pero ",[16,31139,31140],{},"diferentes parámetros",[367,31142,31144],{"id":31143},"_81-sintaxis","8.1 Sintaxis",[543,31146,31148],{"className":545,"code":31147,"language":547,"meta":228,"style":228},"\u002F\u002F Misma función, diferentes firmas\ndouble CalcularPotencia(double corriente)  \u002F\u002F 1 parámetro\ndouble CalcularPotencia(double voltaje, double corriente)  \u002F\u002F 2 parámetros\ndouble CalcularPotencia(double voltaje, double corriente, double factorPotencia)  \u002F\u002F 3 parámetros\n",[54,31149,31150,31155,31160,31165],{"__ignoreMap":228},[551,31151,31152],{"class":553,"line":554},[551,31153,31154],{},"\u002F\u002F Misma función, diferentes firmas\n",[551,31156,31157],{"class":553,"line":229},[551,31158,31159],{},"double CalcularPotencia(double corriente)  \u002F\u002F 1 parámetro\n",[551,31161,31162],{"class":553,"line":670},[551,31163,31164],{},"double CalcularPotencia(double voltaje, double corriente)  \u002F\u002F 2 parámetros\n",[551,31166,31167],{"class":553,"line":1136},[551,31168,31169],{},"double CalcularPotencia(double voltaje, double corriente, double factorPotencia)  \u002F\u002F 3 parámetros\n",[13,31171,31172,31173,31176],{},"C# determina qué versión llamar según los ",[16,31174,31175],{},"argumentos"," que le pases.",[367,31178,31180],{"id":31179},"_82-ejemplo-práctico-calcular-potencia","8.2 Ejemplo práctico: Calcular potencia",[543,31182,31184],{"className":545,"code":31183,"language":547,"meta":228,"style":228},"\u002F\u002F Versión 1: Solo corriente (asume 230V monofásico)\ndouble CalcularPotencia(double corriente)\n{\n    return 230.0 * corriente;\n}\n\n\u002F\u002F Versión 2: Voltaje y corriente\ndouble CalcularPotencia(double voltaje, double corriente)\n{\n    return voltaje * corriente;\n}\n\n\u002F\u002F Versión 3: Voltaje, corriente y factor de potencia\ndouble CalcularPotencia(double voltaje, double corriente, double factorPotencia)\n{\n    return voltaje * corriente * factorPotencia;\n}\n\n\u002F\u002F Versión 4: Trifásico\ndouble CalcularPotenciaTrifasica(double voltaje, double corriente, double factorPotencia)\n{\n    return Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n}\n\n\u002F\u002F Uso: C# elige automáticamente la versión correcta\ndouble p1 = CalcularPotencia(10.0);                  \u002F\u002F Usa versión 1\ndouble p2 = CalcularPotencia(400.0, 10.0);           \u002F\u002F Usa versión 2\ndouble p3 = CalcularPotencia(230.0, 10.0, 0.85);     \u002F\u002F Usa versión 3\n",[54,31185,31186,31191,31195,31199,31204,31208,31212,31217,31221,31225,31229,31233,31237,31242,31247,31251,31256,31260,31264,31269,31274,31278,31282,31286,31290,31295,31300,31305],{"__ignoreMap":228},[551,31187,31188],{"class":553,"line":554},[551,31189,31190],{},"\u002F\u002F Versión 1: Solo corriente (asume 230V monofásico)\n",[551,31192,31193],{"class":553,"line":229},[551,31194,29828],{},[551,31196,31197],{"class":553,"line":670},[551,31198,1151],{},[551,31200,31201],{"class":553,"line":1136},[551,31202,31203],{},"    return 230.0 * corriente;\n",[551,31205,31206],{"class":553,"line":1142},[551,31207,1193],{},[551,31209,31210],{"class":553,"line":1148},[551,31211,1139],{"emptyLinePlaceholder":238},[551,31213,31214],{"class":553,"line":1154},[551,31215,31216],{},"\u002F\u002F Versión 2: Voltaje y corriente\n",[551,31218,31219],{"class":553,"line":1160},[551,31220,30818],{},[551,31222,31223],{"class":553,"line":1166},[551,31224,1151],{},[551,31226,31227],{"class":553,"line":1172},[551,31228,31116],{},[551,31230,31231],{"class":553,"line":1178},[551,31232,1193],{},[551,31234,31235],{"class":553,"line":1184},[551,31236,1139],{"emptyLinePlaceholder":238},[551,31238,31239],{"class":553,"line":1190},[551,31240,31241],{},"\u002F\u002F Versión 3: Voltaje, corriente y factor de potencia\n",[551,31243,31244],{"class":553,"line":1472},[551,31245,31246],{},"double CalcularPotencia(double voltaje, double corriente, double factorPotencia)\n",[551,31248,31249],{"class":553,"line":1477},[551,31250,1151],{},[551,31252,31253],{"class":553,"line":1797},[551,31254,31255],{},"    return voltaje * corriente * factorPotencia;\n",[551,31257,31258],{"class":553,"line":1802},[551,31259,1193],{},[551,31261,31262],{"class":553,"line":1808},[551,31263,1139],{"emptyLinePlaceholder":238},[551,31265,31266],{"class":553,"line":1814},[551,31267,31268],{},"\u002F\u002F Versión 4: Trifásico\n",[551,31270,31271],{"class":553,"line":1820},[551,31272,31273],{},"double CalcularPotenciaTrifasica(double voltaje, double corriente, double factorPotencia)\n",[551,31275,31276],{"class":553,"line":1826},[551,31277,1151],{},[551,31279,31280],{"class":553,"line":1832},[551,31281,30682],{},[551,31283,31284],{"class":553,"line":1838},[551,31285,1193],{},[551,31287,31288],{"class":553,"line":1844},[551,31289,1139],{"emptyLinePlaceholder":238},[551,31291,31292],{"class":553,"line":1850},[551,31293,31294],{},"\u002F\u002F Uso: C# elige automáticamente la versión correcta\n",[551,31296,31297],{"class":553,"line":1855},[551,31298,31299],{},"double p1 = CalcularPotencia(10.0);                  \u002F\u002F Usa versión 1\n",[551,31301,31302],{"class":553,"line":1861},[551,31303,31304],{},"double p2 = CalcularPotencia(400.0, 10.0);           \u002F\u002F Usa versión 2\n",[551,31306,31307],{"class":553,"line":1867},[551,31308,31309],{},"double p3 = CalcularPotencia(230.0, 10.0, 0.85);     \u002F\u002F Usa versión 3\n",[367,31311,31313],{"id":31312},"_83-ejemplo-convertir-resistencia","8.3 Ejemplo: Convertir resistencia",[543,31315,31317],{"className":545,"code":31316,"language":547,"meta":228,"style":228},"\u002F\u002F Versión 1: String a double\ndouble ConvertirResistencia(string texto)\n{\n    return double.Parse(texto);\n}\n\n\u002F\u002F Versión 2: De kΩ a Ω\ndouble ConvertirResistencia(double kiloOhmios, bool esKilo)\n{\n    if (esKilo)\n        return kiloOhmios * 1000.0;\n    else\n        return kiloOhmios;\n}\n\n\u002F\u002F Uso\ndouble r1 = ConvertirResistencia(\"470.5\");         \u002F\u002F Versión 1\ndouble r2 = ConvertirResistencia(4.7, true);       \u002F\u002F Versión 2: 4.7kΩ = 4700Ω\n",[54,31318,31319,31324,31329,31333,31338,31342,31346,31351,31356,31360,31365,31370,31374,31379,31383,31387,31391,31396],{"__ignoreMap":228},[551,31320,31321],{"class":553,"line":554},[551,31322,31323],{},"\u002F\u002F Versión 1: String a double\n",[551,31325,31326],{"class":553,"line":229},[551,31327,31328],{},"double ConvertirResistencia(string texto)\n",[551,31330,31331],{"class":553,"line":670},[551,31332,1151],{},[551,31334,31335],{"class":553,"line":1136},[551,31336,31337],{},"    return double.Parse(texto);\n",[551,31339,31340],{"class":553,"line":1142},[551,31341,1193],{},[551,31343,31344],{"class":553,"line":1148},[551,31345,1139],{"emptyLinePlaceholder":238},[551,31347,31348],{"class":553,"line":1154},[551,31349,31350],{},"\u002F\u002F Versión 2: De kΩ a Ω\n",[551,31352,31353],{"class":553,"line":1160},[551,31354,31355],{},"double ConvertirResistencia(double kiloOhmios, bool esKilo)\n",[551,31357,31358],{"class":553,"line":1166},[551,31359,1151],{},[551,31361,31362],{"class":553,"line":1172},[551,31363,31364],{},"    if (esKilo)\n",[551,31366,31367],{"class":553,"line":1178},[551,31368,31369],{},"        return kiloOhmios * 1000.0;\n",[551,31371,31372],{"class":553,"line":1184},[551,31373,12046],{},[551,31375,31376],{"class":553,"line":1190},[551,31377,31378],{},"        return kiloOhmios;\n",[551,31380,31381],{"class":553,"line":1472},[551,31382,1193],{},[551,31384,31385],{"class":553,"line":1477},[551,31386,1139],{"emptyLinePlaceholder":238},[551,31388,31389],{"class":553,"line":1797},[551,31390,29799],{},[551,31392,31393],{"class":553,"line":1802},[551,31394,31395],{},"double r1 = ConvertirResistencia(\"470.5\");         \u002F\u002F Versión 1\n",[551,31397,31398],{"class":553,"line":1808},[551,31399,31400],{},"double r2 = ConvertirResistencia(4.7, true);       \u002F\u002F Versión 2: 4.7kΩ = 4700Ω\n",[367,31402,31404],{"id":31403},"_84-reglas-de-sobrecarga","8.4 Reglas de sobrecarga",[13,31406,31407,31410],{},[16,31408,31409],{},"Permitido"," (diferentes parámetros):",[543,31412,31414],{"className":545,"code":31413,"language":547,"meta":228,"style":228},"void Funcion(int a)\nvoid Funcion(double a)\nvoid Funcion(int a, int b)\nvoid Funcion(string a)\n",[54,31415,31416,31421,31426,31431],{"__ignoreMap":228},[551,31417,31418],{"class":553,"line":554},[551,31419,31420],{},"void Funcion(int a)\n",[551,31422,31423],{"class":553,"line":229},[551,31424,31425],{},"void Funcion(double a)\n",[551,31427,31428],{"class":553,"line":670},[551,31429,31430],{},"void Funcion(int a, int b)\n",[551,31432,31433],{"class":553,"line":1136},[551,31434,31435],{},"void Funcion(string a)\n",[13,31437,31438,31441],{},[16,31439,31440],{},"NO permitido"," (solo cambia el tipo de retorno):",[543,31443,31445],{"className":545,"code":31444,"language":547,"meta":228,"style":228},"int Funcion(int a)\ndouble Funcion(int a)  \u002F\u002F  ERROR: firma idéntica\n",[54,31446,31447,31452],{"__ignoreMap":228},[551,31448,31449],{"class":553,"line":554},[551,31450,31451],{},"int Funcion(int a)\n",[551,31453,31454],{"class":553,"line":229},[551,31455,31456],{},"double Funcion(int a)  \u002F\u002F  ERROR: firma idéntica\n",[43,31458],{},[46,31460,4025],{"id":4024},[13,31462,31463,31464,31466],{},"Vamos a crear una ",[16,31465,29423],{}," completa y reutilizable.",[331,31468,31470],{"id":31469},"paso-1-estructura-básica-de-la-clase","Paso 1: Estructura básica de la clase",[543,31472,31474],{"className":545,"code":31473,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class BibliotecaElectrica\n{\n    \u002F\u002F ========================================\n    \u002F\u002F CONSTANTES GLOBALES\n    \u002F\u002F ========================================\n\n    private const double VOLTAJE_NOMINAL_MONOFASICO = 230.0;  \u002F\u002F V\n    private const double VOLTAJE_NOMINAL_TRIFASICO = 400.0;   \u002F\u002F V\n    private const double RESISTIVIDAD_COBRE = 0.018;          \u002F\u002F Ω·mm²\u002Fm\n    private const double RESISTIVIDAD_ALUMINIO = 0.028;       \u002F\u002F Ω·mm²\u002Fm\n    private const double CONVERSION_KW_HP = 1.341;            \u002F\u002F 1 kW = 1.341 HP\n\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Aquí probaremos las funciones\n    }\n}\n",[54,31475,31476,31480,31484,31488,31492,31497,31501,31506,31511,31515,31519,31524,31529,31534,31539,31544,31548,31552,31556,31560,31565,31569],{"__ignoreMap":228},[551,31477,31478],{"class":553,"line":554},[551,31479,1123],{},[551,31481,31482],{"class":553,"line":229},[551,31483,1128],{},[551,31485,31486],{"class":553,"line":670},[551,31487,1133],{},[551,31489,31490],{"class":553,"line":1136},[551,31491,1139],{"emptyLinePlaceholder":238},[551,31493,31494],{"class":553,"line":1142},[551,31495,31496],{},"public class BibliotecaElectrica\n",[551,31498,31499],{"class":553,"line":1148},[551,31500,1151],{},[551,31502,31503],{"class":553,"line":1154},[551,31504,31505],{},"    \u002F\u002F ========================================\n",[551,31507,31508],{"class":553,"line":1160},[551,31509,31510],{},"    \u002F\u002F CONSTANTES GLOBALES\n",[551,31512,31513],{"class":553,"line":1166},[551,31514,31505],{},[551,31516,31517],{"class":553,"line":1172},[551,31518,1139],{"emptyLinePlaceholder":238},[551,31520,31521],{"class":553,"line":1178},[551,31522,31523],{},"    private const double VOLTAJE_NOMINAL_MONOFASICO = 230.0;  \u002F\u002F V\n",[551,31525,31526],{"class":553,"line":1184},[551,31527,31528],{},"    private const double VOLTAJE_NOMINAL_TRIFASICO = 400.0;   \u002F\u002F V\n",[551,31530,31531],{"class":553,"line":1190},[551,31532,31533],{},"    private const double RESISTIVIDAD_COBRE = 0.018;          \u002F\u002F Ω·mm²\u002Fm\n",[551,31535,31536],{"class":553,"line":1472},[551,31537,31538],{},"    private const double RESISTIVIDAD_ALUMINIO = 0.028;       \u002F\u002F Ω·mm²\u002Fm\n",[551,31540,31541],{"class":553,"line":1477},[551,31542,31543],{},"    private const double CONVERSION_KW_HP = 1.341;            \u002F\u002F 1 kW = 1.341 HP\n",[551,31545,31546],{"class":553,"line":1797},[551,31547,1139],{"emptyLinePlaceholder":238},[551,31549,31550],{"class":553,"line":1802},[551,31551,1157],{},[551,31553,31554],{"class":553,"line":1808},[551,31555,1163],{},[551,31557,31558],{"class":553,"line":1814},[551,31559,1169],{},[551,31561,31562],{"class":553,"line":1820},[551,31563,31564],{},"        \u002F\u002F Aquí probaremos las funciones\n",[551,31566,31567],{"class":553,"line":1826},[551,31568,1187],{},[551,31570,31571],{"class":553,"line":1832},[551,31572,1193],{},[43,31574],{},[331,31576,31578],{"id":31577},"paso-2-funciones-de-ley-de-ohm","Paso 2: Funciones de Ley de Ohm",[543,31580,31582],{"className":545,"code":31581,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F LEY DE OHM\n\u002F\u002F ========================================\n\n\u002F\u002F Calcular resistencia: R = V \u002F I\ndouble CalcularResistencia(double voltaje, double corriente)\n{\n    if (corriente == 0)\n    {\n        MessageBox.Show(\"Error: Corriente no puede ser cero\");\n        return 0;\n    }\n    return voltaje \u002F corriente;\n}\n\n\u002F\u002F Calcular voltaje: V = I × R\ndouble CalcularVoltaje(double corriente, double resistencia)\n{\n    return corriente * resistencia;\n}\n\n\u002F\u002F Calcular corriente: I = V \u002F R\ndouble CalcularCorriente(double voltaje, double resistencia)\n{\n    if (resistencia == 0)\n    {\n        MessageBox.Show(\"Error: Resistencia no puede ser cero\");\n        return 0;\n    }\n    return voltaje \u002F resistencia;\n}\n",[54,31583,31584,31588,31593,31597,31601,31606,31610,31614,31619,31623,31628,31633,31637,31641,31645,31649,31654,31658,31662,31666,31670,31674,31679,31684,31688,31693,31697,31702,31706,31710,31715],{"__ignoreMap":228},[551,31585,31586],{"class":553,"line":554},[551,31587,8157],{},[551,31589,31590],{"class":553,"line":229},[551,31591,31592],{},"\u002F\u002F LEY DE OHM\n",[551,31594,31595],{"class":553,"line":670},[551,31596,8157],{},[551,31598,31599],{"class":553,"line":1136},[551,31600,1139],{"emptyLinePlaceholder":238},[551,31602,31603],{"class":553,"line":1142},[551,31604,31605],{},"\u002F\u002F Calcular resistencia: R = V \u002F I\n",[551,31607,31608],{"class":553,"line":1148},[551,31609,29565],{},[551,31611,31612],{"class":553,"line":1154},[551,31613,1151],{},[551,31615,31616],{"class":553,"line":1160},[551,31617,31618],{},"    if (corriente == 0)\n",[551,31620,31621],{"class":553,"line":1166},[551,31622,1169],{},[551,31624,31625],{"class":553,"line":1172},[551,31626,31627],{},"        MessageBox.Show(\"Error: Corriente no puede ser cero\");\n",[551,31629,31630],{"class":553,"line":1178},[551,31631,31632],{},"        return 0;\n",[551,31634,31635],{"class":553,"line":1184},[551,31636,1187],{},[551,31638,31639],{"class":553,"line":1190},[551,31640,29574],{},[551,31642,31643],{"class":553,"line":1472},[551,31644,1193],{},[551,31646,31647],{"class":553,"line":1477},[551,31648,1139],{"emptyLinePlaceholder":238},[551,31650,31651],{"class":553,"line":1797},[551,31652,31653],{},"\u002F\u002F Calcular voltaje: V = I × R\n",[551,31655,31656],{"class":553,"line":1802},[551,31657,29940],{},[551,31659,31660],{"class":553,"line":1808},[551,31661,1151],{},[551,31663,31664],{"class":553,"line":1814},[551,31665,29954],{},[551,31667,31668],{"class":553,"line":1820},[551,31669,1193],{},[551,31671,31672],{"class":553,"line":1826},[551,31673,1139],{"emptyLinePlaceholder":238},[551,31675,31676],{"class":553,"line":1832},[551,31677,31678],{},"\u002F\u002F Calcular corriente: I = V \u002F R\n",[551,31680,31681],{"class":553,"line":1838},[551,31682,31683],{},"double CalcularCorriente(double voltaje, double resistencia)\n",[551,31685,31686],{"class":553,"line":1844},[551,31687,1151],{},[551,31689,31690],{"class":553,"line":1850},[551,31691,31692],{},"    if (resistencia == 0)\n",[551,31694,31695],{"class":553,"line":1855},[551,31696,1169],{},[551,31698,31699],{"class":553,"line":1861},[551,31700,31701],{},"        MessageBox.Show(\"Error: Resistencia no puede ser cero\");\n",[551,31703,31704],{"class":553,"line":1867},[551,31705,31632],{},[551,31707,31708],{"class":553,"line":1873},[551,31709,1187],{},[551,31711,31712],{"class":553,"line":1878},[551,31713,31714],{},"    return voltaje \u002F resistencia;\n",[551,31716,31717],{"class":553,"line":1883},[551,31718,1193],{},[43,31720],{},[331,31722,31724],{"id":31723},"paso-3-funciones-de-potencia-sobrecargadas","Paso 3: Funciones de potencia (sobrecargadas)",[543,31726,31728],{"className":545,"code":31727,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F CÁLCULOS DE POTENCIA\n\u002F\u002F ========================================\n\n\u002F\u002F Potencia: P = V × I\ndouble CalcularPotencia(double voltaje, double corriente)\n{\n    return voltaje * corriente;\n}\n\n\u002F\u002F Potencia con factor de potencia: P = V × I × cos φ\ndouble CalcularPotencia(double voltaje, double corriente, double factorPotencia)\n{\n    return voltaje * corriente * factorPotencia;\n}\n\n\u002F\u002F Potencia solo con corriente (asume 230V)\ndouble CalcularPotencia(double corriente)\n{\n    return VOLTAJE_NOMINAL_MONOFASICO * corriente;\n}\n\n\u002F\u002F Potencia trifásica: P = √3 × V × I × cos φ\ndouble CalcularPotenciaTrifasica(double voltaje, double corriente, double factorPotencia)\n{\n    return Math.Sqrt(3) * voltaje * corriente * factorPotencia;\n}\n\n\u002F\u002F Potencia aparente: S = V × I\ndouble CalcularPotenciaAparente(double voltaje, double corriente)\n{\n    return voltaje * corriente;\n}\n\n\u002F\u002F Potencia reactiva: Q = √(S² - P²)\ndouble CalcularPotenciaReactiva(double potenciaAparente, double potenciaActiva)\n{\n    return Math.Sqrt(Math.Pow(potenciaAparente, 2) - Math.Pow(potenciaActiva, 2));\n}\n",[54,31729,31730,31734,31739,31743,31747,31752,31756,31760,31764,31768,31772,31777,31781,31785,31789,31793,31797,31802,31806,31810,31815,31819,31823,31828,31832,31836,31840,31844,31848,31853,31858,31862,31866,31870,31874,31879,31884,31888,31893],{"__ignoreMap":228},[551,31731,31732],{"class":553,"line":554},[551,31733,8157],{},[551,31735,31736],{"class":553,"line":229},[551,31737,31738],{},"\u002F\u002F CÁLCULOS DE POTENCIA\n",[551,31740,31741],{"class":553,"line":670},[551,31742,8157],{},[551,31744,31745],{"class":553,"line":1136},[551,31746,1139],{"emptyLinePlaceholder":238},[551,31748,31749],{"class":553,"line":1142},[551,31750,31751],{},"\u002F\u002F Potencia: P = V × I\n",[551,31753,31754],{"class":553,"line":1148},[551,31755,30818],{},[551,31757,31758],{"class":553,"line":1154},[551,31759,1151],{},[551,31761,31762],{"class":553,"line":1160},[551,31763,31116],{},[551,31765,31766],{"class":553,"line":1166},[551,31767,1193],{},[551,31769,31770],{"class":553,"line":1172},[551,31771,1139],{"emptyLinePlaceholder":238},[551,31773,31774],{"class":553,"line":1178},[551,31775,31776],{},"\u002F\u002F Potencia con factor de potencia: P = V × I × cos φ\n",[551,31778,31779],{"class":553,"line":1184},[551,31780,31246],{},[551,31782,31783],{"class":553,"line":1190},[551,31784,1151],{},[551,31786,31787],{"class":553,"line":1472},[551,31788,31255],{},[551,31790,31791],{"class":553,"line":1477},[551,31792,1193],{},[551,31794,31795],{"class":553,"line":1797},[551,31796,1139],{"emptyLinePlaceholder":238},[551,31798,31799],{"class":553,"line":1802},[551,31800,31801],{},"\u002F\u002F Potencia solo con corriente (asume 230V)\n",[551,31803,31804],{"class":553,"line":1808},[551,31805,29828],{},[551,31807,31808],{"class":553,"line":1814},[551,31809,1151],{},[551,31811,31812],{"class":553,"line":1820},[551,31813,31814],{},"    return VOLTAJE_NOMINAL_MONOFASICO * corriente;\n",[551,31816,31817],{"class":553,"line":1826},[551,31818,1193],{},[551,31820,31821],{"class":553,"line":1832},[551,31822,1139],{"emptyLinePlaceholder":238},[551,31824,31825],{"class":553,"line":1838},[551,31826,31827],{},"\u002F\u002F Potencia trifásica: P = √3 × V × I × cos φ\n",[551,31829,31830],{"class":553,"line":1844},[551,31831,31273],{},[551,31833,31834],{"class":553,"line":1850},[551,31835,1151],{},[551,31837,31838],{"class":553,"line":1855},[551,31839,30682],{},[551,31841,31842],{"class":553,"line":1861},[551,31843,1193],{},[551,31845,31846],{"class":553,"line":1867},[551,31847,1139],{"emptyLinePlaceholder":238},[551,31849,31850],{"class":553,"line":1873},[551,31851,31852],{},"\u002F\u002F Potencia aparente: S = V × I\n",[551,31854,31855],{"class":553,"line":1878},[551,31856,31857],{},"double CalcularPotenciaAparente(double voltaje, double corriente)\n",[551,31859,31860],{"class":553,"line":1883},[551,31861,1151],{},[551,31863,31864],{"class":553,"line":1888},[551,31865,31116],{},[551,31867,31868],{"class":553,"line":4615},[551,31869,1193],{},[551,31871,31872],{"class":553,"line":4620},[551,31873,1139],{"emptyLinePlaceholder":238},[551,31875,31876],{"class":553,"line":4626},[551,31877,31878],{},"\u002F\u002F Potencia reactiva: Q = √(S² - P²)\n",[551,31880,31881],{"class":553,"line":4631},[551,31882,31883],{},"double CalcularPotenciaReactiva(double potenciaAparente, double potenciaActiva)\n",[551,31885,31886],{"class":553,"line":4636},[551,31887,1151],{},[551,31889,31890],{"class":553,"line":4641},[551,31891,31892],{},"    return Math.Sqrt(Math.Pow(potenciaAparente, 2) - Math.Pow(potenciaActiva, 2));\n",[551,31894,31895],{"class":553,"line":4647},[551,31896,1193],{},[43,31898],{},[331,31900,31902],{"id":31901},"paso-4-funciones-de-caída-de-tensión","Paso 4: Funciones de caída de tensión",[543,31904,31906],{"className":545,"code":31905,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F CAÍDA DE TENSIÓN\n\u002F\u002F ========================================\n\n\u002F\u002F Caída de tensión en cable de cobre\ndouble CalcularCaidaTension(double longitud, double corriente, double seccion)\n{\n    \u002F\u002F ΔV = 2 × L × I × ρ \u002F S\n    return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F seccion;\n}\n\n\u002F\u002F Caída de tensión especificando material\ndouble CalcularCaidaTension(double longitud, double corriente, double seccion, string material)\n{\n    double resistividad;\n\n    if (material.ToLower() == \"aluminio\")\n    {\n        resistividad = RESISTIVIDAD_ALUMINIO;\n    }\n    else\n    {\n        resistividad = RESISTIVIDAD_COBRE;\n    }\n\n    return (2 * longitud * corriente * resistividad) \u002F seccion;\n}\n\n\u002F\u002F Porcentaje de caída de tensión\ndouble CalcularPorcentajeCaida(double caidaTension, double voltajeNominal)\n{\n    return (caidaTension \u002F voltajeNominal) * 100.0;\n}\n\n\u002F\u002F Sección mínima para caída máxima\ndouble CalcularSeccionMinima(double longitud, double corriente, double caidaMaxima)\n{\n    \u002F\u002F S = (2 × L × I × ρ) \u002F ΔV\n    return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F caidaMaxima;\n}\n",[54,31907,31908,31912,31917,31921,31925,31930,31934,31938,31942,31947,31951,31955,31960,31965,31969,31974,31978,31983,31987,31992,31996,32000,32004,32009,32013,32017,32021,32025,32029,32034,32039,32043,32048,32052,32056,32061,32066,32070,32075,32080],{"__ignoreMap":228},[551,31909,31910],{"class":553,"line":554},[551,31911,8157],{},[551,31913,31914],{"class":553,"line":229},[551,31915,31916],{},"\u002F\u002F CAÍDA DE TENSIÓN\n",[551,31918,31919],{"class":553,"line":670},[551,31920,8157],{},[551,31922,31923],{"class":553,"line":1136},[551,31924,1139],{"emptyLinePlaceholder":238},[551,31926,31927],{"class":553,"line":1142},[551,31928,31929],{},"\u002F\u002F Caída de tensión en cable de cobre\n",[551,31931,31932],{"class":553,"line":1148},[551,31933,29996],{},[551,31935,31936],{"class":553,"line":1154},[551,31937,1151],{},[551,31939,31940],{"class":553,"line":1160},[551,31941,30005],{},[551,31943,31944],{"class":553,"line":1166},[551,31945,31946],{},"    return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F seccion;\n",[551,31948,31949],{"class":553,"line":1172},[551,31950,1193],{},[551,31952,31953],{"class":553,"line":1178},[551,31954,1139],{"emptyLinePlaceholder":238},[551,31956,31957],{"class":553,"line":1184},[551,31958,31959],{},"\u002F\u002F Caída de tensión especificando material\n",[551,31961,31962],{"class":553,"line":1190},[551,31963,31964],{},"double CalcularCaidaTension(double longitud, double corriente, double seccion, string material)\n",[551,31966,31967],{"class":553,"line":1472},[551,31968,1151],{},[551,31970,31971],{"class":553,"line":1477},[551,31972,31973],{},"    double resistividad;\n",[551,31975,31976],{"class":553,"line":1797},[551,31977,1139],{"emptyLinePlaceholder":238},[551,31979,31980],{"class":553,"line":1802},[551,31981,31982],{},"    if (material.ToLower() == \"aluminio\")\n",[551,31984,31985],{"class":553,"line":1808},[551,31986,1169],{},[551,31988,31989],{"class":553,"line":1814},[551,31990,31991],{},"        resistividad = RESISTIVIDAD_ALUMINIO;\n",[551,31993,31994],{"class":553,"line":1820},[551,31995,1187],{},[551,31997,31998],{"class":553,"line":1826},[551,31999,12046],{},[551,32001,32002],{"class":553,"line":1832},[551,32003,1169],{},[551,32005,32006],{"class":553,"line":1838},[551,32007,32008],{},"        resistividad = RESISTIVIDAD_COBRE;\n",[551,32010,32011],{"class":553,"line":1844},[551,32012,1187],{},[551,32014,32015],{"class":553,"line":1850},[551,32016,1139],{"emptyLinePlaceholder":238},[551,32018,32019],{"class":553,"line":1855},[551,32020,30020],{},[551,32022,32023],{"class":553,"line":1861},[551,32024,1193],{},[551,32026,32027],{"class":553,"line":1867},[551,32028,1139],{"emptyLinePlaceholder":238},[551,32030,32031],{"class":553,"line":1873},[551,32032,32033],{},"\u002F\u002F Porcentaje de caída de tensión\n",[551,32035,32036],{"class":553,"line":1878},[551,32037,32038],{},"double CalcularPorcentajeCaida(double caidaTension, double voltajeNominal)\n",[551,32040,32041],{"class":553,"line":1883},[551,32042,1151],{},[551,32044,32045],{"class":553,"line":1888},[551,32046,32047],{},"    return (caidaTension \u002F voltajeNominal) * 100.0;\n",[551,32049,32050],{"class":553,"line":4615},[551,32051,1193],{},[551,32053,32054],{"class":553,"line":4620},[551,32055,1139],{"emptyLinePlaceholder":238},[551,32057,32058],{"class":553,"line":4626},[551,32059,32060],{},"\u002F\u002F Sección mínima para caída máxima\n",[551,32062,32063],{"class":553,"line":4631},[551,32064,32065],{},"double CalcularSeccionMinima(double longitud, double corriente, double caidaMaxima)\n",[551,32067,32068],{"class":553,"line":4636},[551,32069,1151],{},[551,32071,32072],{"class":553,"line":4641},[551,32073,32074],{},"    \u002F\u002F S = (2 × L × I × ρ) \u002F ΔV\n",[551,32076,32077],{"class":553,"line":4647},[551,32078,32079],{},"    return (2 * longitud * corriente * RESISTIVIDAD_COBRE) \u002F caidaMaxima;\n",[551,32081,32082],{"class":553,"line":4653},[551,32083,1193],{},[43,32085],{},[331,32087,32089],{"id":32088},"paso-5-funciones-de-conversión","Paso 5: Funciones de conversión",[543,32091,32093],{"className":545,"code":32092,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F CONVERSIONES\n\u002F\u002F ========================================\n\n\u002F\u002F kW a HP\ndouble ConvertirKWaHP(double potenciaKW)\n{\n    return potenciaKW * CONVERSION_KW_HP;\n}\n\n\u002F\u002F HP a kW\ndouble ConvertirHPaKW(double potenciaHP)\n{\n    return potenciaHP \u002F CONVERSION_KW_HP;\n}\n\n\u002F\u002F W a kW\ndouble ConvertirWaKW(double potenciaW)\n{\n    return potenciaW \u002F 1000.0;\n}\n\n\u002F\u002F kW a W\ndouble ConvertirKWaW(double potenciaKW)\n{\n    return potenciaKW * 1000.0;\n}\n\n\u002F\u002F mm² a AWG (aproximado)\nint ConvertirMM2aAWG(double seccionMM2)\n{\n    \u002F\u002F Tabla simplificada\n    if (seccionMM2 >= 10.0) return 8;\n    if (seccionMM2 >= 6.0) return 10;\n    if (seccionMM2 >= 4.0) return 12;\n    if (seccionMM2 >= 2.5) return 14;\n    if (seccionMM2 >= 1.5) return 16;\n    return 18;\n}\n",[54,32094,32095,32099,32104,32108,32112,32117,32121,32125,32130,32134,32138,32143,32148,32152,32157,32161,32165,32170,32175,32179,32184,32188,32192,32197,32202,32206,32211,32215,32219,32224,32229,32233,32238,32243,32248,32253,32258,32263,32268],{"__ignoreMap":228},[551,32096,32097],{"class":553,"line":554},[551,32098,8157],{},[551,32100,32101],{"class":553,"line":229},[551,32102,32103],{},"\u002F\u002F CONVERSIONES\n",[551,32105,32106],{"class":553,"line":670},[551,32107,8157],{},[551,32109,32110],{"class":553,"line":1136},[551,32111,1139],{"emptyLinePlaceholder":238},[551,32113,32114],{"class":553,"line":1142},[551,32115,32116],{},"\u002F\u002F kW a HP\n",[551,32118,32119],{"class":553,"line":1148},[551,32120,30062],{},[551,32122,32123],{"class":553,"line":1154},[551,32124,1151],{},[551,32126,32127],{"class":553,"line":1160},[551,32128,32129],{},"    return potenciaKW * CONVERSION_KW_HP;\n",[551,32131,32132],{"class":553,"line":1166},[551,32133,1193],{},[551,32135,32136],{"class":553,"line":1172},[551,32137,1139],{"emptyLinePlaceholder":238},[551,32139,32140],{"class":553,"line":1178},[551,32141,32142],{},"\u002F\u002F HP a kW\n",[551,32144,32145],{"class":553,"line":1184},[551,32146,32147],{},"double ConvertirHPaKW(double potenciaHP)\n",[551,32149,32150],{"class":553,"line":1190},[551,32151,1151],{},[551,32153,32154],{"class":553,"line":1472},[551,32155,32156],{},"    return potenciaHP \u002F CONVERSION_KW_HP;\n",[551,32158,32159],{"class":553,"line":1477},[551,32160,1193],{},[551,32162,32163],{"class":553,"line":1797},[551,32164,1139],{"emptyLinePlaceholder":238},[551,32166,32167],{"class":553,"line":1802},[551,32168,32169],{},"\u002F\u002F W a kW\n",[551,32171,32172],{"class":553,"line":1808},[551,32173,32174],{},"double ConvertirWaKW(double potenciaW)\n",[551,32176,32177],{"class":553,"line":1814},[551,32178,1151],{},[551,32180,32181],{"class":553,"line":1820},[551,32182,32183],{},"    return potenciaW \u002F 1000.0;\n",[551,32185,32186],{"class":553,"line":1826},[551,32187,1193],{},[551,32189,32190],{"class":553,"line":1832},[551,32191,1139],{"emptyLinePlaceholder":238},[551,32193,32194],{"class":553,"line":1838},[551,32195,32196],{},"\u002F\u002F kW a W\n",[551,32198,32199],{"class":553,"line":1844},[551,32200,32201],{},"double ConvertirKWaW(double potenciaKW)\n",[551,32203,32204],{"class":553,"line":1850},[551,32205,1151],{},[551,32207,32208],{"class":553,"line":1855},[551,32209,32210],{},"    return potenciaKW * 1000.0;\n",[551,32212,32213],{"class":553,"line":1861},[551,32214,1193],{},[551,32216,32217],{"class":553,"line":1867},[551,32218,1139],{"emptyLinePlaceholder":238},[551,32220,32221],{"class":553,"line":1873},[551,32222,32223],{},"\u002F\u002F mm² a AWG (aproximado)\n",[551,32225,32226],{"class":553,"line":1878},[551,32227,32228],{},"int ConvertirMM2aAWG(double seccionMM2)\n",[551,32230,32231],{"class":553,"line":1883},[551,32232,1151],{},[551,32234,32235],{"class":553,"line":1888},[551,32236,32237],{},"    \u002F\u002F Tabla simplificada\n",[551,32239,32240],{"class":553,"line":4615},[551,32241,32242],{},"    if (seccionMM2 >= 10.0) return 8;\n",[551,32244,32245],{"class":553,"line":4620},[551,32246,32247],{},"    if (seccionMM2 >= 6.0) return 10;\n",[551,32249,32250],{"class":553,"line":4626},[551,32251,32252],{},"    if (seccionMM2 >= 4.0) return 12;\n",[551,32254,32255],{"class":553,"line":4631},[551,32256,32257],{},"    if (seccionMM2 >= 2.5) return 14;\n",[551,32259,32260],{"class":553,"line":4636},[551,32261,32262],{},"    if (seccionMM2 >= 1.5) return 16;\n",[551,32264,32265],{"class":553,"line":4641},[551,32266,32267],{},"    return 18;\n",[551,32269,32270],{"class":553,"line":4647},[551,32271,1193],{},[43,32273],{},[331,32275,32277],{"id":32276},"paso-6-funciones-de-validación-void","Paso 6: Funciones de validación (void)",[543,32279,32281],{"className":545,"code":32280,"language":547,"meta":228,"style":228},"\u002F\u002F ========================================\n\u002F\u002F VALIDACIONES\n\u002F\u002F ========================================\n\nvoid ValidarVoltaje(double voltaje)\n{\n    double minimo = VOLTAJE_NOMINAL_MONOFASICO * 0.90;  \u002F\u002F -10%\n    double maximo = VOLTAJE_NOMINAL_MONOFASICO * 1.10;  \u002F\u002F +10%\n\n    if (voltaje \u003C minimo || voltaje > maximo)\n    {\n        MessageBox.Show(\n            string.Format(\"ADVERTENCIA: Voltaje {0:F1}V fuera de rango ({1:F1}V - {2:F1}V)\",\n                voltaje, minimo, maximo),\n            \"Voltaje Anormal\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Warning\n        );\n    }\n}\n\nvoid ValidarCaidaTension(double caidaTension, double voltajeNominal)\n{\n    double porcentaje = CalcularPorcentajeCaida(caidaTension, voltajeNominal);\n\n    if (porcentaje > 3.0)\n    {\n        MessageBox.Show(\n            string.Format(\"ADVERTENCIA: Caída de tensión {0:F2}% excede el límite de 3%\",\n                porcentaje),\n            \"Caída Excesiva\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Warning\n        );\n    }\n}\n\nvoid MostrarResumenCircuito(string nombreCircuito, double voltaje, double corriente, double potencia)\n{\n    string mensaje = string.Format(\n        \"CIRCUITO: {0}\\n\\n\" +\n        \"Voltaje: {1:F1}V\\n\" +\n        \"Corriente: {2:F1}A\\n\" +\n        \"Potencia: {3:F2}W ({4:F2}kW)\",\n        nombreCircuito,\n        voltaje,\n        corriente,\n        potencia,\n        ConvertirWaKW(potencia)\n    );\n\n    MessageBox.Show(mensaje, \"Resumen del Circuito\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n}\n",[54,32282,32283,32287,32292,32296,32300,32304,32308,32313,32318,32322,32326,32330,32334,32339,32343,32347,32351,32355,32359,32363,32367,32371,32376,32380,32385,32389,32394,32398,32402,32407,32412,32417,32421,32425,32429,32433,32437,32441,32446,32450,32454,32459,32464,32469,32474,32479,32484,32488,32493,32498,32502,32506,32511],{"__ignoreMap":228},[551,32284,32285],{"class":553,"line":554},[551,32286,8157],{},[551,32288,32289],{"class":553,"line":229},[551,32290,32291],{},"\u002F\u002F VALIDACIONES\n",[551,32293,32294],{"class":553,"line":670},[551,32295,8157],{},[551,32297,32298],{"class":553,"line":1136},[551,32299,1139],{"emptyLinePlaceholder":238},[551,32301,32302],{"class":553,"line":1142},[551,32303,30256],{},[551,32305,32306],{"class":553,"line":1148},[551,32307,1151],{},[551,32309,32310],{"class":553,"line":1154},[551,32311,32312],{},"    double minimo = VOLTAJE_NOMINAL_MONOFASICO * 0.90;  \u002F\u002F -10%\n",[551,32314,32315],{"class":553,"line":1160},[551,32316,32317],{},"    double maximo = VOLTAJE_NOMINAL_MONOFASICO * 1.10;  \u002F\u002F +10%\n",[551,32319,32320],{"class":553,"line":1166},[551,32321,1139],{"emptyLinePlaceholder":238},[551,32323,32324],{"class":553,"line":1172},[551,32325,30279],{},[551,32327,32328],{"class":553,"line":1178},[551,32329,1169],{},[551,32331,32332],{"class":553,"line":1184},[551,32333,4790],{},[551,32335,32336],{"class":553,"line":1190},[551,32337,32338],{},"            string.Format(\"ADVERTENCIA: Voltaje {0:F1}V fuera de rango ({1:F1}V - {2:F1}V)\",\n",[551,32340,32341],{"class":553,"line":1472},[551,32342,30297],{},[551,32344,32345],{"class":553,"line":1477},[551,32346,30302],{},[551,32348,32349],{"class":553,"line":1797},[551,32350,4808],{},[551,32352,32353],{"class":553,"line":1802},[551,32354,30311],{},[551,32356,32357],{"class":553,"line":1808},[551,32358,4758],{},[551,32360,32361],{"class":553,"line":1814},[551,32362,1187],{},[551,32364,32365],{"class":553,"line":1820},[551,32366,1193],{},[551,32368,32369],{"class":553,"line":1826},[551,32370,1139],{"emptyLinePlaceholder":238},[551,32372,32373],{"class":553,"line":1832},[551,32374,32375],{},"void ValidarCaidaTension(double caidaTension, double voltajeNominal)\n",[551,32377,32378],{"class":553,"line":1838},[551,32379,1151],{},[551,32381,32382],{"class":553,"line":1844},[551,32383,32384],{},"    double porcentaje = CalcularPorcentajeCaida(caidaTension, voltajeNominal);\n",[551,32386,32387],{"class":553,"line":1850},[551,32388,1139],{"emptyLinePlaceholder":238},[551,32390,32391],{"class":553,"line":1855},[551,32392,32393],{},"    if (porcentaje > 3.0)\n",[551,32395,32396],{"class":553,"line":1861},[551,32397,1169],{},[551,32399,32400],{"class":553,"line":1867},[551,32401,4790],{},[551,32403,32404],{"class":553,"line":1873},[551,32405,32406],{},"            string.Format(\"ADVERTENCIA: Caída de tensión {0:F2}% excede el límite de 3%\",\n",[551,32408,32409],{"class":553,"line":1878},[551,32410,32411],{},"                porcentaje),\n",[551,32413,32414],{"class":553,"line":1883},[551,32415,32416],{},"            \"Caída Excesiva\",\n",[551,32418,32419],{"class":553,"line":1888},[551,32420,4808],{},[551,32422,32423],{"class":553,"line":4615},[551,32424,30311],{},[551,32426,32427],{"class":553,"line":4620},[551,32428,4758],{},[551,32430,32431],{"class":553,"line":4626},[551,32432,1187],{},[551,32434,32435],{"class":553,"line":4631},[551,32436,1193],{},[551,32438,32439],{"class":553,"line":4636},[551,32440,1139],{"emptyLinePlaceholder":238},[551,32442,32443],{"class":553,"line":4641},[551,32444,32445],{},"void MostrarResumenCircuito(string nombreCircuito, double voltaje, double corriente, double potencia)\n",[551,32447,32448],{"class":553,"line":4647},[551,32449,1151],{},[551,32451,32452],{"class":553,"line":4653},[551,32453,30182],{},[551,32455,32456],{"class":553,"line":4659},[551,32457,32458],{},"        \"CIRCUITO: {0}\\n\\n\" +\n",[551,32460,32461],{"class":553,"line":4665},[551,32462,32463],{},"        \"Voltaje: {1:F1}V\\n\" +\n",[551,32465,32466],{"class":553,"line":4671},[551,32467,32468],{},"        \"Corriente: {2:F1}A\\n\" +\n",[551,32470,32471],{"class":553,"line":4677},[551,32472,32473],{},"        \"Potencia: {3:F2}W ({4:F2}kW)\",\n",[551,32475,32476],{"class":553,"line":4683},[551,32477,32478],{},"        nombreCircuito,\n",[551,32480,32481],{"class":553,"line":4689},[551,32482,32483],{},"        voltaje,\n",[551,32485,32486],{"class":553,"line":4695},[551,32487,26266],{},[551,32489,32490],{"class":553,"line":4701},[551,32491,32492],{},"        potencia,\n",[551,32494,32495],{"class":553,"line":4707},[551,32496,32497],{},"        ConvertirWaKW(potencia)\n",[551,32499,32500],{"class":553,"line":4713},[551,32501,26276],{},[551,32503,32504],{"class":553,"line":4719},[551,32505,1139],{"emptyLinePlaceholder":238},[551,32507,32508],{"class":553,"line":4725},[551,32509,32510],{},"    MessageBox.Show(mensaje, \"Resumen del Circuito\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[551,32512,32513],{"class":553,"line":4731},[551,32514,1193],{},[43,32516],{},[331,32518,32520],{"id":32519},"paso-7-función-de-prueba-que-usa-toda-la-librería","Paso 7: Función de prueba que usa toda la librería",[543,32522,32524],{"className":545,"code":32523,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()\n{\n    string reporte = \"=== BIBLIOTECA ELÉCTRICA - DEMOSTRACIÓN ===\\n\\n\";\n\n    \u002F\u002F ========================================\n    \u002F\u002F PRUEBA 1: LEY DE OHM\n    \u002F\u002F ========================================\n\n    double voltaje = 230.0;\n    double corriente = 16.0;\n    double resistencia = CalcularResistencia(voltaje, corriente);\n\n    reporte += \"LEY DE OHM:\\n\";\n    reporte += string.Format(\"V={0}V, I={1}A → R={2:F2}Ω\\n\\n\", voltaje, corriente, resistencia);\n\n    \u002F\u002F ========================================\n    \u002F\u002F PRUEBA 2: POTENCIA (SOBRECARGA)\n    \u002F\u002F ========================================\n\n    double p1 = CalcularPotencia(corriente);  \u002F\u002F Solo corriente\n    double p2 = CalcularPotencia(voltaje, corriente);  \u002F\u002F V e I\n    double p3 = CalcularPotencia(voltaje, corriente, 0.85);  \u002F\u002F V, I y cos φ\n\n    reporte += \"POTENCIA (FUNCIONES SOBRECARGADAS):\\n\";\n    reporte += string.Format(\"CalcularPotencia({0}A) = {1:F2}W\\n\", corriente, p1);\n    reporte += string.Format(\"CalcularPotencia({0}V, {1}A) = {2:F2}W\\n\", voltaje, corriente, p2);\n    reporte += string.Format(\"CalcularPotencia({0}V, {1}A, 0.85) = {2:F2}W\\n\\n\", voltaje, corriente, p3);\n\n    \u002F\u002F ========================================\n    \u002F\u002F PRUEBA 3: CAÍDA DE TENSIÓN\n    \u002F\u002F ========================================\n\n    double longitud = 50.0;\n    double seccion = 2.5;\n    double caida = CalcularCaidaTension(longitud, corriente, seccion);\n    double porcentajeCaida = CalcularPorcentajeCaida(caida, voltaje);\n\n    reporte += \"CAÍDA DE TENSIÓN:\\n\";\n    reporte += string.Format(\"Cable: {0}mm², {1}m, {2}A\\n\", seccion, longitud, corriente);\n    reporte += string.Format(\"Caída: {0:F2}V ({1:F2}%)\\n\\n\", caida, porcentajeCaida);\n\n    \u002F\u002F ========================================\n    \u002F\u002F PRUEBA 4: CONVERSIONES\n    \u002F\u002F ========================================\n\n    double potenciaKW = 7.5;\n    double potenciaHP = ConvertirKWaHP(potenciaKW);\n\n    reporte += \"CONVERSIONES:\\n\";\n    reporte += string.Format(\"{0}kW = {1:F2}HP\\n\", potenciaKW, potenciaHP);\n    reporte += string.Format(\"{0}mm² ≈ AWG {1}\\n\\n\", seccion, ConvertirMM2aAWG(seccion));\n\n    \u002F\u002F ========================================\n    \u002F\u002F PRUEBA 5: POTENCIA TRIFÁSICA\n    \u002F\u002F ========================================\n\n    double voltajeTrifasico = 400.0;\n    double corrienteTrifasica = 50.0;\n    double fp = 0.85;\n    double potenciaTrifasica = CalcularPotenciaTrifasica(voltajeTrifasico, corrienteTrifasica, fp);\n\n    reporte += \"POTENCIA TRIFÁSICA:\\n\";\n    reporte += string.Format(\"V={0}V, I={1}A, cos φ={2}\\n\", voltajeTrifasico, corrienteTrifasica, fp);\n    reporte += string.Format(\"P={0:F2}W ({1:F2}kW)\\n\\n\", potenciaTrifasica, ConvertirWaKW(potenciaTrifasica));\n\n    \u002F\u002F ========================================\n    \u002F\u002F MOSTRAR REPORTE\n    \u002F\u002F ========================================\n\n    MessageBox.Show(reporte, \"Biblioteca Eléctrica\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n\n    \u002F\u002F ========================================\n    \u002F\u002F VALIDACIONES (VOID)\n    \u002F\u002F ========================================\n\n    ValidarVoltaje(voltaje);\n    ValidarCaidaTension(caida, voltaje);\n    MostrarResumenCircuito(\"Circuito Principal\", voltaje, corriente, p2);\n}\n",[54,32525,32526,32530,32534,32538,32543,32547,32551,32556,32560,32564,32568,32572,32577,32581,32586,32591,32595,32599,32604,32608,32612,32617,32622,32627,32631,32636,32641,32646,32651,32655,32659,32664,32668,32672,32677,32682,32687,32692,32696,32701,32706,32711,32715,32719,32724,32728,32732,32737,32742,32746,32751,32756,32761,32765,32769,32774,32778,32782,32787,32792,32797,32802,32806,32811,32816,32821,32825,32829,32834,32838,32842,32847,32851,32855,32860,32864,32868,32873,32878,32883],{"__ignoreMap":228},[551,32527,32528],{"class":553,"line":554},[551,32529,1310],{},[551,32531,32532],{"class":553,"line":229},[551,32533,1315],{},[551,32535,32536],{"class":553,"line":670},[551,32537,1151],{},[551,32539,32540],{"class":553,"line":1136},[551,32541,32542],{},"    string reporte = \"=== BIBLIOTECA ELÉCTRICA - DEMOSTRACIÓN ===\\n\\n\";\n",[551,32544,32545],{"class":553,"line":1142},[551,32546,1139],{"emptyLinePlaceholder":238},[551,32548,32549],{"class":553,"line":1148},[551,32550,31505],{},[551,32552,32553],{"class":553,"line":1154},[551,32554,32555],{},"    \u002F\u002F PRUEBA 1: LEY DE OHM\n",[551,32557,32558],{"class":553,"line":1160},[551,32559,31505],{},[551,32561,32562],{"class":553,"line":1166},[551,32563,1139],{"emptyLinePlaceholder":238},[551,32565,32566],{"class":553,"line":1172},[551,32567,4186],{},[551,32569,32570],{"class":553,"line":1178},[551,32571,4191],{},[551,32573,32574],{"class":553,"line":1184},[551,32575,32576],{},"    double resistencia = CalcularResistencia(voltaje, corriente);\n",[551,32578,32579],{"class":553,"line":1190},[551,32580,1139],{"emptyLinePlaceholder":238},[551,32582,32583],{"class":553,"line":1472},[551,32584,32585],{},"    reporte += \"LEY DE OHM:\\n\";\n",[551,32587,32588],{"class":553,"line":1477},[551,32589,32590],{},"    reporte += string.Format(\"V={0}V, I={1}A → R={2:F2}Ω\\n\\n\", voltaje, corriente, resistencia);\n",[551,32592,32593],{"class":553,"line":1797},[551,32594,1139],{"emptyLinePlaceholder":238},[551,32596,32597],{"class":553,"line":1802},[551,32598,31505],{},[551,32600,32601],{"class":553,"line":1808},[551,32602,32603],{},"    \u002F\u002F PRUEBA 2: POTENCIA (SOBRECARGA)\n",[551,32605,32606],{"class":553,"line":1814},[551,32607,31505],{},[551,32609,32610],{"class":553,"line":1820},[551,32611,1139],{"emptyLinePlaceholder":238},[551,32613,32614],{"class":553,"line":1826},[551,32615,32616],{},"    double p1 = CalcularPotencia(corriente);  \u002F\u002F Solo corriente\n",[551,32618,32619],{"class":553,"line":1832},[551,32620,32621],{},"    double p2 = CalcularPotencia(voltaje, corriente);  \u002F\u002F V e I\n",[551,32623,32624],{"class":553,"line":1838},[551,32625,32626],{},"    double p3 = CalcularPotencia(voltaje, corriente, 0.85);  \u002F\u002F V, I y cos φ\n",[551,32628,32629],{"class":553,"line":1844},[551,32630,1139],{"emptyLinePlaceholder":238},[551,32632,32633],{"class":553,"line":1850},[551,32634,32635],{},"    reporte += \"POTENCIA (FUNCIONES SOBRECARGADAS):\\n\";\n",[551,32637,32638],{"class":553,"line":1855},[551,32639,32640],{},"    reporte += string.Format(\"CalcularPotencia({0}A) = {1:F2}W\\n\", corriente, p1);\n",[551,32642,32643],{"class":553,"line":1861},[551,32644,32645],{},"    reporte += string.Format(\"CalcularPotencia({0}V, {1}A) = {2:F2}W\\n\", voltaje, corriente, p2);\n",[551,32647,32648],{"class":553,"line":1867},[551,32649,32650],{},"    reporte += string.Format(\"CalcularPotencia({0}V, {1}A, 0.85) = {2:F2}W\\n\\n\", voltaje, corriente, p3);\n",[551,32652,32653],{"class":553,"line":1873},[551,32654,1139],{"emptyLinePlaceholder":238},[551,32656,32657],{"class":553,"line":1878},[551,32658,31505],{},[551,32660,32661],{"class":553,"line":1883},[551,32662,32663],{},"    \u002F\u002F PRUEBA 3: CAÍDA DE TENSIÓN\n",[551,32665,32666],{"class":553,"line":1888},[551,32667,31505],{},[551,32669,32670],{"class":553,"line":4615},[551,32671,1139],{"emptyLinePlaceholder":238},[551,32673,32674],{"class":553,"line":4620},[551,32675,32676],{},"    double longitud = 50.0;\n",[551,32678,32679],{"class":553,"line":4626},[551,32680,32681],{},"    double seccion = 2.5;\n",[551,32683,32684],{"class":553,"line":4631},[551,32685,32686],{},"    double caida = CalcularCaidaTension(longitud, corriente, seccion);\n",[551,32688,32689],{"class":553,"line":4636},[551,32690,32691],{},"    double porcentajeCaida = CalcularPorcentajeCaida(caida, voltaje);\n",[551,32693,32694],{"class":553,"line":4641},[551,32695,1139],{"emptyLinePlaceholder":238},[551,32697,32698],{"class":553,"line":4647},[551,32699,32700],{},"    reporte += \"CAÍDA DE TENSIÓN:\\n\";\n",[551,32702,32703],{"class":553,"line":4653},[551,32704,32705],{},"    reporte += string.Format(\"Cable: {0}mm², {1}m, {2}A\\n\", seccion, longitud, corriente);\n",[551,32707,32708],{"class":553,"line":4659},[551,32709,32710],{},"    reporte += string.Format(\"Caída: {0:F2}V ({1:F2}%)\\n\\n\", caida, porcentajeCaida);\n",[551,32712,32713],{"class":553,"line":4665},[551,32714,1139],{"emptyLinePlaceholder":238},[551,32716,32717],{"class":553,"line":4671},[551,32718,31505],{},[551,32720,32721],{"class":553,"line":4677},[551,32722,32723],{},"    \u002F\u002F PRUEBA 4: CONVERSIONES\n",[551,32725,32726],{"class":553,"line":4683},[551,32727,31505],{},[551,32729,32730],{"class":553,"line":4689},[551,32731,1139],{"emptyLinePlaceholder":238},[551,32733,32734],{"class":553,"line":4695},[551,32735,32736],{},"    double potenciaKW = 7.5;\n",[551,32738,32739],{"class":553,"line":4701},[551,32740,32741],{},"    double potenciaHP = ConvertirKWaHP(potenciaKW);\n",[551,32743,32744],{"class":553,"line":4707},[551,32745,1139],{"emptyLinePlaceholder":238},[551,32747,32748],{"class":553,"line":4713},[551,32749,32750],{},"    reporte += \"CONVERSIONES:\\n\";\n",[551,32752,32753],{"class":553,"line":4719},[551,32754,32755],{},"    reporte += string.Format(\"{0}kW = {1:F2}HP\\n\", potenciaKW, potenciaHP);\n",[551,32757,32758],{"class":553,"line":4725},[551,32759,32760],{},"    reporte += string.Format(\"{0}mm² ≈ AWG {1}\\n\\n\", seccion, ConvertirMM2aAWG(seccion));\n",[551,32762,32763],{"class":553,"line":4731},[551,32764,1139],{"emptyLinePlaceholder":238},[551,32766,32767],{"class":553,"line":4737},[551,32768,31505],{},[551,32770,32771],{"class":553,"line":4743},[551,32772,32773],{},"    \u002F\u002F PRUEBA 5: POTENCIA TRIFÁSICA\n",[551,32775,32776],{"class":553,"line":4749},[551,32777,31505],{},[551,32779,32780],{"class":553,"line":4755},[551,32781,1139],{"emptyLinePlaceholder":238},[551,32783,32784],{"class":553,"line":4761},[551,32785,32786],{},"    double voltajeTrifasico = 400.0;\n",[551,32788,32789],{"class":553,"line":4766},[551,32790,32791],{},"    double corrienteTrifasica = 50.0;\n",[551,32793,32794],{"class":553,"line":4771},[551,32795,32796],{},"    double fp = 0.85;\n",[551,32798,32799],{"class":553,"line":4777},[551,32800,32801],{},"    double potenciaTrifasica = CalcularPotenciaTrifasica(voltajeTrifasico, corrienteTrifasica, fp);\n",[551,32803,32804],{"class":553,"line":4782},[551,32805,1139],{"emptyLinePlaceholder":238},[551,32807,32808],{"class":553,"line":4787},[551,32809,32810],{},"    reporte += \"POTENCIA TRIFÁSICA:\\n\";\n",[551,32812,32813],{"class":553,"line":4793},[551,32814,32815],{},"    reporte += string.Format(\"V={0}V, I={1}A, cos φ={2}\\n\", voltajeTrifasico, corrienteTrifasica, fp);\n",[551,32817,32818],{"class":553,"line":4799},[551,32819,32820],{},"    reporte += string.Format(\"P={0:F2}W ({1:F2}kW)\\n\\n\", potenciaTrifasica, ConvertirWaKW(potenciaTrifasica));\n",[551,32822,32823],{"class":553,"line":4805},[551,32824,1139],{"emptyLinePlaceholder":238},[551,32826,32827],{"class":553,"line":4811},[551,32828,31505],{},[551,32830,32831],{"class":553,"line":4817},[551,32832,32833],{},"    \u002F\u002F MOSTRAR REPORTE\n",[551,32835,32836],{"class":553,"line":4822},[551,32837,31505],{},[551,32839,32840],{"class":553,"line":4827},[551,32841,1139],{"emptyLinePlaceholder":238},[551,32843,32844],{"class":553,"line":9183},[551,32845,32846],{},"    MessageBox.Show(reporte, \"Biblioteca Eléctrica\", MessageBoxButtons.OK, MessageBoxIcon.Information);\n",[551,32848,32849],{"class":553,"line":9188},[551,32850,1139],{"emptyLinePlaceholder":238},[551,32852,32853],{"class":553,"line":9193},[551,32854,31505],{},[551,32856,32857],{"class":553,"line":9198},[551,32858,32859],{},"    \u002F\u002F VALIDACIONES (VOID)\n",[551,32861,32862],{"class":553,"line":9204},[551,32863,31505],{},[551,32865,32866],{"class":553,"line":9209},[551,32867,1139],{"emptyLinePlaceholder":238},[551,32869,32870],{"class":553,"line":9214},[551,32871,32872],{},"    ValidarVoltaje(voltaje);\n",[551,32874,32875],{"class":553,"line":9219},[551,32876,32877],{},"    ValidarCaidaTension(caida, voltaje);\n",[551,32879,32880],{"class":553,"line":9224},[551,32881,32882],{},"    MostrarResumenCircuito(\"Circuito Principal\", voltaje, corriente, p2);\n",[551,32884,32885],{"class":553,"line":9230},[551,32886,1193],{},[43,32888],{},[331,32890,4465],{"id":4464},[13,32892,32893,32894,32897],{},"(El código está completo en el archivo ",[54,32895,32896],{},"BibliotecaElectrica.cs",")",[43,32899],{},[46,32901,4852],{"id":4851},[331,32903,32905],{"id":32904},"recursividad","Recursividad",[13,32907,32908,32909,32912],{},"Una función puede ",[16,32910,32911],{},"llamarse a sí misma"," (recursión):",[543,32914,32916],{"className":545,"code":32915,"language":547,"meta":228,"style":228},"int Factorial(int n)\n{\n    if (n \u003C= 1)\n        return 1;\n    else\n        return n * Factorial(n - 1);  \u002F\u002F Se llama a sí misma\n}\n\n\u002F\u002F Factorial(5) = 5 × 4 × 3 × 2 × 1 = 120\n",[54,32917,32918,32923,32927,32932,32937,32941,32946,32950,32954],{"__ignoreMap":228},[551,32919,32920],{"class":553,"line":554},[551,32921,32922],{},"int Factorial(int n)\n",[551,32924,32925],{"class":553,"line":229},[551,32926,1151],{},[551,32928,32929],{"class":553,"line":670},[551,32930,32931],{},"    if (n \u003C= 1)\n",[551,32933,32934],{"class":553,"line":1136},[551,32935,32936],{},"        return 1;\n",[551,32938,32939],{"class":553,"line":1142},[551,32940,12046],{},[551,32942,32943],{"class":553,"line":1148},[551,32944,32945],{},"        return n * Factorial(n - 1);  \u002F\u002F Se llama a sí misma\n",[551,32947,32948],{"class":553,"line":1154},[551,32949,1193],{},[551,32951,32952],{"class":553,"line":1160},[551,32953,1139],{"emptyLinePlaceholder":238},[551,32955,32956],{"class":553,"line":1166},[551,32957,32958],{},"\u002F\u002F Factorial(5) = 5 × 4 × 3 × 2 × 1 = 120\n",[13,32960,32961,32964],{},[16,32962,32963],{},"Uso en ingeniería",": Cálculos de serie\u002Fparalelo de componentes recursivos.",[331,32966,32968],{"id":32967},"expresiones-lambda-funciones-anónimas","Expresiones lambda (funciones anónimas)",[13,32970,32971],{},"Funciones compactas sin nombre:",[543,32973,32975],{"className":545,"code":32974,"language":547,"meta":228,"style":228},"\u002F\u002F Función normal\ndouble Cuadrado(double x)\n{\n    return x * x;\n}\n\n\u002F\u002F Lambda equivalente\nFunc\u003Cdouble, double> cuadrado = x => x * x;\n\n\u002F\u002F Uso\ndouble resultado = cuadrado(5.0);  \u002F\u002F 25.0\n",[54,32976,32977,32982,32987,32991,32996,33000,33004,33009,33014,33018,33022],{"__ignoreMap":228},[551,32978,32979],{"class":553,"line":554},[551,32980,32981],{},"\u002F\u002F Función normal\n",[551,32983,32984],{"class":553,"line":229},[551,32985,32986],{},"double Cuadrado(double x)\n",[551,32988,32989],{"class":553,"line":670},[551,32990,1151],{},[551,32992,32993],{"class":553,"line":1136},[551,32994,32995],{},"    return x * x;\n",[551,32997,32998],{"class":553,"line":1142},[551,32999,1193],{},[551,33001,33002],{"class":553,"line":1148},[551,33003,1139],{"emptyLinePlaceholder":238},[551,33005,33006],{"class":553,"line":1154},[551,33007,33008],{},"\u002F\u002F Lambda equivalente\n",[551,33010,33011],{"class":553,"line":1160},[551,33012,33013],{},"Func\u003Cdouble, double> cuadrado = x => x * x;\n",[551,33015,33016],{"class":553,"line":1166},[551,33017,1139],{"emptyLinePlaceholder":238},[551,33019,33020],{"class":553,"line":1172},[551,33021,29799],{},[551,33023,33024],{"class":553,"line":1178},[551,33025,33026],{},"double resultado = cuadrado(5.0);  \u002F\u002F 25.0\n",[331,33028,5121],{"id":5120},[13,33030,33031],{},[16,33032,2132],{},[543,33034,33036],{"className":545,"code":33035,"language":547,"meta":228,"style":228},"\u002F\u002F Mal\ndouble Calc(double a, double b)\n\n\u002F\u002F Bien\ndouble CalcularResistenciaParalelo(double resistencia1, double resistencia2)\n",[54,33037,33038,33042,33047,33051,33055],{"__ignoreMap":228},[551,33039,33040],{"class":553,"line":554},[551,33041,2142],{},[551,33043,33044],{"class":553,"line":229},[551,33045,33046],{},"double Calc(double a, double b)\n",[551,33048,33049],{"class":553,"line":670},[551,33050,1139],{"emptyLinePlaceholder":238},[551,33052,33053],{"class":553,"line":1136},[551,33054,2156],{},[551,33056,33057],{"class":553,"line":1142},[551,33058,33059],{},"double CalcularResistenciaParalelo(double resistencia1, double resistencia2)\n",[13,33061,33062],{},[16,33063,33064],{},"2. Una función, una responsabilidad",[543,33066,33068],{"className":545,"code":33067,"language":547,"meta":228,"style":228},"\u002F\u002F Mal: hace demasiadas cosas\nvoid ProcesarYMostrarYGuardar(double valor)\n\n\u002F\u002F Bien: funciones separadas\ndouble Calcular(double valor)\nvoid Mostrar(double resultado)\nvoid Guardar(double resultado)\n",[54,33069,33070,33075,33080,33084,33089,33094,33099],{"__ignoreMap":228},[551,33071,33072],{"class":553,"line":554},[551,33073,33074],{},"\u002F\u002F Mal: hace demasiadas cosas\n",[551,33076,33077],{"class":553,"line":229},[551,33078,33079],{},"void ProcesarYMostrarYGuardar(double valor)\n",[551,33081,33082],{"class":553,"line":670},[551,33083,1139],{"emptyLinePlaceholder":238},[551,33085,33086],{"class":553,"line":1136},[551,33087,33088],{},"\u002F\u002F Bien: funciones separadas\n",[551,33090,33091],{"class":553,"line":1142},[551,33092,33093],{},"double Calcular(double valor)\n",[551,33095,33096],{"class":553,"line":1148},[551,33097,33098],{},"void Mostrar(double resultado)\n",[551,33100,33101],{"class":553,"line":1154},[551,33102,33103],{},"void Guardar(double resultado)\n",[13,33105,33106],{},[16,33107,33108],{},"3. Validar parámetros",[543,33110,33112],{"className":545,"code":33111,"language":547,"meta":228,"style":228},"double CalcularResistencia(double voltaje, double corriente)\n{\n    if (corriente == 0)\n    {\n        throw new ArgumentException(\"Corriente no puede ser cero\");\n    }\n    return voltaje \u002F corriente;\n}\n",[54,33113,33114,33118,33122,33126,33130,33135,33139,33143],{"__ignoreMap":228},[551,33115,33116],{"class":553,"line":554},[551,33117,29565],{},[551,33119,33120],{"class":553,"line":229},[551,33121,1151],{},[551,33123,33124],{"class":553,"line":670},[551,33125,31618],{},[551,33127,33128],{"class":553,"line":1136},[551,33129,1169],{},[551,33131,33132],{"class":553,"line":1142},[551,33133,33134],{},"        throw new ArgumentException(\"Corriente no puede ser cero\");\n",[551,33136,33137],{"class":553,"line":1148},[551,33138,1187],{},[551,33140,33141],{"class":553,"line":1154},[551,33142,29574],{},[551,33144,33145],{"class":553,"line":1160},[551,33146,1193],{},[43,33148],{},[46,33150,10523],{"id":10522},[126,33152,33153,33160],{},[88,33154,33155],{},[955,33156,33159],{"href":33157,"rel":33158},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Fprogramming-guide\u002Fclasses-and-structs\u002Fmethods",[959],"Documentación de C# - Métodos",[88,33161],{},[43,33163],{},[46,33165,5728],{"id":5727},[331,33167,33169],{"id":33168},"p-cuál-es-la-diferencia-entre-función-y-método","P: ¿Cuál es la diferencia entre función y método?",[13,33171,33172,33174],{},[16,33173,5737],{}," En C#, ambos términos se usan indistintamente. Técnicamente, un \"método\" es una función que pertenece a una clase.",[331,33176,33178],{"id":33177},"p-puedo-tener-una-función-dentro-de-otra-función","P: ¿Puedo tener una función dentro de otra función?",[13,33180,33181,33183],{},[16,33182,5737],{}," No en C# estándar. Pero puedes usar funciones locales (características avanzadas) o lambdas.",[331,33185,33187],{"id":33186},"p-cuántos-parámetros-puede-tener-una-función","P: ¿Cuántos parámetros puede tener una función?",[13,33189,33190,33192],{},[16,33191,5737],{}," No hay límite técnico, pero si tienes más de 4-5, considera usar un objeto o estructura para agruparlos.",[331,33194,33196],{"id":33195},"p-qué-pasa-si-olvido-el-return-en-una-función-no-void","P: ¿Qué pasa si olvido el return en una función no-void?",[13,33198,33199,33201],{},[16,33200,5737],{}," Error de compilación. Todas las rutas de código deben devolver un valor.",[331,33203,33205],{"id":33204},"p-puedo-sobrecargar-cambiando-solo-el-tipo-de-retorno","P: ¿Puedo sobrecargar cambiando solo el tipo de retorno?",[13,33207,33208,33210],{},[16,33209,5737],{}," No. La sobrecarga se basa en parámetros (tipo y cantidad), no en el tipo de retorno.",[43,33212],{},[46,33214,10615],{"id":10614},[13,33216,10618],{},[126,33218,33220,33226,33232,33238,33244,33250,33256,33262,33268],{"className":33219},[275],[88,33221,33223,33225],{"className":33222},[279],[281,33224],{"disabled":238,"type":283}," Entender qué es una función y para qué sirve",[88,33227,33229,33231],{"className":33228},[279],[281,33230],{"disabled":238,"type":283}," Poder crear funciones con parámetros y return",[88,33233,33235,33237],{"className":33234},[279],[281,33236],{"disabled":238,"type":283}," Saber cuándo usar void vs funciones con return",[88,33239,33241,33243],{"className":33240},[279],[281,33242],{"disabled":238,"type":283}," Comprender el scope de variables",[88,33245,33247,33249],{"className":33246},[279],[281,33248],{"disabled":238,"type":283}," Poder sobrecargar funciones",[88,33251,33253,33255],{"className":33252},[279],[281,33254],{"disabled":238,"type":283}," Usar parámetros opcionales",[88,33257,33259,33261],{"className":33258},[279],[281,33260],{"disabled":238,"type":283}," Haber ejecutado la biblioteca eléctrica",[88,33263,33265,33267],{"className":33264},[279],[281,33266],{"disabled":238,"type":283}," Poder agregar nuevas funciones a la librería",[88,33269,33271,10669],{"className":33270},[279],[281,33272],{"disabled":238,"type":283},[43,33274],{},[13,33276,33277,10676,33279,33281,33282,93,33284],{},[31,33278,657],{},[31,33280,10679],{},": 55-65 minutos\n",[31,33283,10683],{},[54,33285,33286],{},"code\u002Fcap-08\u002F",[660,33288,662],{},{"title":228,"searchDepth":229,"depth":229,"links":33290},[33291,33292,33293,33294,33304,33314,33319,33320,33327],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":739,"depth":229,"text":740},{"id":328,"depth":229,"text":329,"children":33295},[33296,33297,33298,33299,33300,33301,33302,33303],{"id":29455,"depth":670,"text":29456},{"id":29634,"depth":670,"text":29635},{"id":29698,"depth":670,"text":29699},{"id":29762,"depth":670,"text":29763},{"id":30113,"depth":670,"text":30114},{"id":30526,"depth":670,"text":30527},{"id":30786,"depth":670,"text":30787},{"id":31125,"depth":670,"text":31126},{"id":4024,"depth":229,"text":4025,"children":33305},[33306,33307,33308,33309,33310,33311,33312,33313],{"id":31469,"depth":670,"text":31470},{"id":31577,"depth":670,"text":31578},{"id":31723,"depth":670,"text":31724},{"id":31901,"depth":670,"text":31902},{"id":32088,"depth":670,"text":32089},{"id":32276,"depth":670,"text":32277},{"id":32519,"depth":670,"text":32520},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":4852,"children":33315},[33316,33317,33318],{"id":32904,"depth":670,"text":32905},{"id":32967,"depth":670,"text":32968},{"id":5120,"depth":670,"text":5121},{"id":10522,"depth":229,"text":10523},{"id":5727,"depth":229,"text":5728,"children":33321},[33322,33323,33324,33325,33326],{"id":33168,"depth":670,"text":33169},{"id":33177,"depth":670,"text":33178},{"id":33186,"depth":670,"text":33187},{"id":33195,"depth":670,"text":33196},{"id":33204,"depth":670,"text":33205},{"id":10614,"depth":229,"text":10615},"Organiza tu código con funciones y métodos en C# para crear scripts EPLAN reutilizables y automatizar EPLAN Electric P8 con orden.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-08-funciones-metodos",{"title":29310,"description":33328},"guia\u002Ffundamentos\u002Fcap-08-funciones-metodos","DrrD6AOd9AXdt_dj4O42p_E1BaVhbgATsGQwq81nfSE",{"id":33335,"title":33336,"body":33337,"description":36391,"extension":236,"meta":36392,"navigation":238,"path":36393,"seo":36394,"stem":36395,"tagline":242,"__hash__":36396},"guia\u002Fguia\u002Ffundamentos\u002Fcap-09-colecciones.md","Capítulo 9: Colecciones, listas y arrays en C#",{"type":7,"value":33338,"toc":36354},[33339,33349,33351,33354,33356,33425,33427,33430,33432,33446,33448,33451,33456,33459,33476,33481,33497,33499,33502,33506,33512,33561,33567,33625,33630,33647,33649,33653,33663,33667,33706,33710,33715,33739,33744,33764,33769,33797,33801,33858,33862,33866,33897,33901,33922,33926,34019,34023,34030,34044,34050,34059,34065,34073,34075,34082,34087,34092,34103,34107,34143,34147,34198,34202,34259,34263,34329,34333,34413,34417,34552,34558,34563,34594,34599,34622,34624,34628,34638,34643,34660,34664,34701,34705,34775,34779,34898,34902,34970,34974,34979,35030,35035,35057,35062,35117,35121,35263,35265,35269,35378,35383,35390,35401,35410,35421,35428,35439,35441,35444,35449,35453,35703,35707,35713,35718,35761,35763,35766,35770,35778,35798,35803,35841,35847,35851,35854,35924,35928,35931,36011,36013,36016,36018,36054,36058,36074,36076,36080,36084,36089,36093,36098,36101,36103,36106,36140,36142,36145,36152,36160,36164,36175,36179,36191,36195,36203,36258,36262,36271,36273,36276,36278,36331,36333,36339,36341,36352],[10,33340,33341],{},[13,33342,33343,19,33345,19,33347,262],{},[16,33344,256],{},[16,33346,22993],{},[16,33348,25],{},[43,33350],{},[46,33352,33353],{"id":267},"🎯 Objetivos de aprendizaje",[13,33355,702],{},[126,33357,33359,33368,33377,33389,33398,33407,33416],{"className":33358},[275],[88,33360,33362,73,33364,33367],{"className":33361},[279],[281,33363],{"disabled":238,"type":283},[16,33365,33366],{},"Entender qué es una colección"," y por qué necesitamos más que variables simples",[88,33369,33371,73,33373,33376],{"className":33370},[279],[281,33372],{"disabled":238,"type":283},[16,33374,33375],{},"Trabajar con arrays"," de tamaño fijo",[88,33378,33380,73,33382,33388],{"className":33379},[279],[281,33381],{"disabled":238,"type":283},[16,33383,33384,33385],{},"Usar List",[33386,33387],"t",{}," para colecciones dinámicas que crecen y decrecen",[88,33390,33392,73,33394,33397],{"className":33391},[279],[281,33393],{"disabled":238,"type":283},[16,33395,33396],{},"Manejar Dictionary\u003CK,V>"," para pares clave-valor",[88,33399,33401,73,33403,33406],{"className":33400},[279],[281,33402],{"disabled":238,"type":283},[16,33404,33405],{},"Elegir la colección adecuada"," según el problema",[88,33408,33410,73,33412,33415],{"className":33409},[279],[281,33411],{"disabled":238,"type":283},[16,33413,33414],{},"Recorrer colecciones"," con foreach, for, y acceso directo",[88,33417,33419,73,33421,33424],{"className":33418},[279],[281,33420],{"disabled":238,"type":283},[16,33422,33423],{},"Construir un gestor"," completo de lista de materiales con búsqueda y filtrado",[43,33426],{},[46,33428,33429],{"id":319},"📋 Requisitos previos",[13,33431,726],{},[126,33433,33434,33437,33440,33443],{},[88,33435,33436],{},"✅ Haber completado el Capítulo 8",[88,33438,33439],{},"✅ Entender funciones y métodos",[88,33441,33442],{},"✅ Conocer bucles (for, foreach, while)",[88,33444,33445],{},"✅ Saber trabajar con variables y tipos de datos",[43,33447],{},[46,33449,33450],{"id":739},"🏆 Proyecto del capítulo",[13,33452,33453],{},[16,33454,33455],{},"Gestor Inteligente de Lista de Materiales",[13,33457,33458],{},"Al final de este capítulo habrás construido un sistema completo para:",[126,33460,33461,33464,33467,33470,33473],{},[88,33462,33463],{},"Gestionar componentes eléctricos (agregar, eliminar, buscar)",[88,33465,33466],{},"Buscar por código, tipo, o designación",[88,33468,33469],{},"Calcular estadísticas (total de componentes, corriente total, etc.)",[88,33471,33472],{},"Filtrar por criterios (corriente, voltaje, fabricante)",[88,33474,33475],{},"Generar reportes formateados",[13,33477,33478,33480],{},[16,33479,753],{},": 60-70 minutos",[10,33482,33483],{},[13,33484,33485,33488,33489,33492,33493,33496],{},[16,33486,33487],{},"⚠️ Nota Importante",":\nEn este capítulo, los datos de los componentes (designación, código, etc.) se crearán ",[16,33490,33491],{},"manualmente"," en el código. Esto se hace intencionalmente para centrarnos en el aprendizaje de ",[16,33494,33495],{},"Colecciones"," (Listas y Diccionarios) sin distraernos con la complejidad de leer datos reales de la base de datos de EPLAN, lo cual aprenderemos en capítulos posteriores.",[43,33498],{},[46,33500,33501],{"id":328},"📚 Contenido",[331,33503,33505],{"id":33504},"_1-introducción-el-problema-de-las-variables-individuales","1. Introducción: El problema de las variables individuales",[13,33507,33508,33511],{},[16,33509,33510],{},"Sin colecciones"," (código difícil de mantener):",[543,33513,33515],{"className":545,"code":33514,"language":547,"meta":228,"style":228},"\u002F\u002F Necesitamos almacenar 100 componentes...\nstring componente1 = \"K1\";\nstring componente2 = \"K2\";\nstring componente3 = \"K3\";\n\u002F\u002F ... 97 variables más\nstring componente100 = \"K100\";\n\n\u002F\u002F ¿Cómo buscamos? ¿Cómo agregamos uno nuevo?\n\u002F\u002F Imposible de mantener\n",[54,33516,33517,33522,33527,33532,33537,33542,33547,33551,33556],{"__ignoreMap":228},[551,33518,33519],{"class":553,"line":554},[551,33520,33521],{},"\u002F\u002F Necesitamos almacenar 100 componentes...\n",[551,33523,33524],{"class":553,"line":229},[551,33525,33526],{},"string componente1 = \"K1\";\n",[551,33528,33529],{"class":553,"line":670},[551,33530,33531],{},"string componente2 = \"K2\";\n",[551,33533,33534],{"class":553,"line":1136},[551,33535,33536],{},"string componente3 = \"K3\";\n",[551,33538,33539],{"class":553,"line":1142},[551,33540,33541],{},"\u002F\u002F ... 97 variables más\n",[551,33543,33544],{"class":553,"line":1148},[551,33545,33546],{},"string componente100 = \"K100\";\n",[551,33548,33549],{"class":553,"line":1154},[551,33550,1139],{"emptyLinePlaceholder":238},[551,33552,33553],{"class":553,"line":1160},[551,33554,33555],{},"\u002F\u002F ¿Cómo buscamos? ¿Cómo agregamos uno nuevo?\n",[551,33557,33558],{"class":553,"line":1166},[551,33559,33560],{},"\u002F\u002F Imposible de mantener\n",[13,33562,33563,33566],{},[16,33564,33565],{},"Con colecciones"," (código escalable):",[543,33568,33570],{"className":545,"code":33569,"language":547,"meta":228,"style":228},"\u002F\u002F Array simple de 100 elementos\nstring[] componentes = new string[100];\ncomponentes[0] = \"K1\";\ncomponentes[1] = \"K2\";\n\u002F\u002F ...\n\n\u002F\u002F O mejor: List que crece dinámicamente\nList\u003Cstring> componentes = new List\u003Cstring>();\ncomponentes.Add(\"K1\");\ncomponentes.Add(\"K2\");\n\u002F\u002F Fácil agregar, eliminar, buscar\n",[54,33571,33572,33577,33582,33587,33592,33596,33600,33605,33610,33615,33620],{"__ignoreMap":228},[551,33573,33574],{"class":553,"line":554},[551,33575,33576],{},"\u002F\u002F Array simple de 100 elementos\n",[551,33578,33579],{"class":553,"line":229},[551,33580,33581],{},"string[] componentes = new string[100];\n",[551,33583,33584],{"class":553,"line":670},[551,33585,33586],{},"componentes[0] = \"K1\";\n",[551,33588,33589],{"class":553,"line":1136},[551,33590,33591],{},"componentes[1] = \"K2\";\n",[551,33593,33594],{"class":553,"line":1142},[551,33595,23534],{},[551,33597,33598],{"class":553,"line":1148},[551,33599,1139],{"emptyLinePlaceholder":238},[551,33601,33602],{"class":553,"line":1154},[551,33603,33604],{},"\u002F\u002F O mejor: List que crece dinámicamente\n",[551,33606,33607],{"class":553,"line":1160},[551,33608,33609],{},"List\u003Cstring> componentes = new List\u003Cstring>();\n",[551,33611,33612],{"class":553,"line":1166},[551,33613,33614],{},"componentes.Add(\"K1\");\n",[551,33616,33617],{"class":553,"line":1172},[551,33618,33619],{},"componentes.Add(\"K2\");\n",[551,33621,33622],{"class":553,"line":1178},[551,33623,33624],{},"\u002F\u002F Fácil agregar, eliminar, buscar\n",[13,33626,33627,416],{},[16,33628,33629],{},"Las colecciones nos permiten",[126,33631,33632,33635,33638,33641,33644],{},[88,33633,33634],{},"Almacenar múltiples valores relacionados",[88,33636,33637],{},"Agregar y eliminar elementos dinámicamente",[88,33639,33640],{},"Buscar y filtrar datos eficientemente",[88,33642,33643],{},"Iterar sobre todos los elementos fácilmente",[88,33645,33646],{},"Organizar datos complejos",[43,33648],{},[331,33650,33652],{"id":33651},"_2-arrays-colecciones-de-tamaño-fijo","2. Arrays: Colecciones de tamaño fijo",[13,33654,33655,33656,33659,33660,41],{},"Un ",[16,33657,33658],{},"array"," es una colección de elementos del mismo tipo con ",[16,33661,33662],{},"tamaño fijo",[367,33664,33666],{"id":33665},"_21-declaración-y-creación","2.1 Declaración y creación",[543,33668,33670],{"className":545,"code":33669,"language":547,"meta":228,"style":228},"\u002F\u002F Sintaxis\ntipo[] nombreArray = new tipo[tamaño];\n\n\u002F\u002F Ejemplos\nstring[] componentes = new string[5];\ndouble[] corrientes = new double[10];\nint[] cantidades = new int[20];\n",[54,33671,33672,33677,33682,33686,33691,33696,33701],{"__ignoreMap":228},[551,33673,33674],{"class":553,"line":554},[551,33675,33676],{},"\u002F\u002F Sintaxis\n",[551,33678,33679],{"class":553,"line":229},[551,33680,33681],{},"tipo[] nombreArray = new tipo[tamaño];\n",[551,33683,33684],{"class":553,"line":670},[551,33685,1139],{"emptyLinePlaceholder":238},[551,33687,33688],{"class":553,"line":1136},[551,33689,33690],{},"\u002F\u002F Ejemplos\n",[551,33692,33693],{"class":553,"line":1142},[551,33694,33695],{},"string[] componentes = new string[5];\n",[551,33697,33698],{"class":553,"line":1148},[551,33699,33700],{},"double[] corrientes = new double[10];\n",[551,33702,33703],{"class":553,"line":1154},[551,33704,33705],{},"int[] cantidades = new int[20];\n",[367,33707,33709],{"id":33708},"_22-inicialización","2.2 Inicialización",[13,33711,33712],{},[16,33713,33714],{},"Forma 1: Declarar y luego asignar",[543,33716,33718],{"className":545,"code":33717,"language":547,"meta":228,"style":228},"string[] componentes = new string[3];\ncomponentes[0] = \"K1\";\ncomponentes[1] = \"Q1\";\ncomponentes[2] = \"F1\";\n",[54,33719,33720,33725,33729,33734],{"__ignoreMap":228},[551,33721,33722],{"class":553,"line":554},[551,33723,33724],{},"string[] componentes = new string[3];\n",[551,33726,33727],{"class":553,"line":229},[551,33728,33586],{},[551,33730,33731],{"class":553,"line":670},[551,33732,33733],{},"componentes[1] = \"Q1\";\n",[551,33735,33736],{"class":553,"line":1136},[551,33737,33738],{},"componentes[2] = \"F1\";\n",[13,33740,33741],{},[16,33742,33743],{},"Forma 2: Inicializar directamente",[543,33745,33747],{"className":545,"code":33746,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1\", \"Q1\", \"F1\"};\n\u002F\u002F O más explícito:\nstring[] componentes = new string[] {\"K1\", \"Q1\", \"F1\"};\n",[54,33748,33749,33754,33759],{"__ignoreMap":228},[551,33750,33751],{"class":553,"line":554},[551,33752,33753],{},"string[] componentes = {\"K1\", \"Q1\", \"F1\"};\n",[551,33755,33756],{"class":553,"line":229},[551,33757,33758],{},"\u002F\u002F O más explícito:\n",[551,33760,33761],{"class":553,"line":670},[551,33762,33763],{},"string[] componentes = new string[] {\"K1\", \"Q1\", \"F1\"};\n",[13,33765,33766],{},[16,33767,33768],{},"Forma 3: Con valores calculados",[543,33770,33772],{"className":545,"code":33771,"language":547,"meta":228,"style":228},"double[] voltajes = new double[5];\nfor (int i = 0; i \u003C voltajes.Length; i++)\n{\n    voltajes[i] = 230.0 + i * 10.0;  \u002F\u002F 230, 240, 250, 260, 270\n}\n",[54,33773,33774,33779,33784,33788,33793],{"__ignoreMap":228},[551,33775,33776],{"class":553,"line":554},[551,33777,33778],{},"double[] voltajes = new double[5];\n",[551,33780,33781],{"class":553,"line":229},[551,33782,33783],{},"for (int i = 0; i \u003C voltajes.Length; i++)\n",[551,33785,33786],{"class":553,"line":670},[551,33787,1151],{},[551,33789,33790],{"class":553,"line":1136},[551,33791,33792],{},"    voltajes[i] = 230.0 + i * 10.0;  \u002F\u002F 230, 240, 250, 260, 270\n",[551,33794,33795],{"class":553,"line":1142},[551,33796,1193],{},[367,33798,33800],{"id":33799},"_23-acceso-a-elementos","2.3 Acceso a elementos",[543,33802,33804],{"className":545,"code":33803,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"M1\", \"X1\"};\n\n\u002F\u002F Acceso por índice (comienza en 0)\nstring primero = componentes[0];      \u002F\u002F \"K1\"\nstring ultimo = componentes[4];       \u002F\u002F \"X1\"\n\n\u002F\u002F Modificar elemento\ncomponentes[2] = \"F2\";                \u002F\u002F Cambia \"F1\" por \"F2\"\n\n\u002F\u002F Longitud del array\nint total = componentes.Length;       \u002F\u002F 5\n",[54,33805,33806,33811,33815,33820,33825,33830,33834,33839,33844,33848,33853],{"__ignoreMap":228},[551,33807,33808],{"class":553,"line":554},[551,33809,33810],{},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"M1\", \"X1\"};\n",[551,33812,33813],{"class":553,"line":229},[551,33814,1139],{"emptyLinePlaceholder":238},[551,33816,33817],{"class":553,"line":670},[551,33818,33819],{},"\u002F\u002F Acceso por índice (comienza en 0)\n",[551,33821,33822],{"class":553,"line":1136},[551,33823,33824],{},"string primero = componentes[0];      \u002F\u002F \"K1\"\n",[551,33826,33827],{"class":553,"line":1142},[551,33828,33829],{},"string ultimo = componentes[4];       \u002F\u002F \"X1\"\n",[551,33831,33832],{"class":553,"line":1148},[551,33833,1139],{"emptyLinePlaceholder":238},[551,33835,33836],{"class":553,"line":1154},[551,33837,33838],{},"\u002F\u002F Modificar elemento\n",[551,33840,33841],{"class":553,"line":1160},[551,33842,33843],{},"componentes[2] = \"F2\";                \u002F\u002F Cambia \"F1\" por \"F2\"\n",[551,33845,33846],{"class":553,"line":1166},[551,33847,1139],{"emptyLinePlaceholder":238},[551,33849,33850],{"class":553,"line":1172},[551,33851,33852],{},"\u002F\u002F Longitud del array\n",[551,33854,33855],{"class":553,"line":1178},[551,33856,33857],{},"int total = componentes.Length;       \u002F\u002F 5\n",[367,33859,33861],{"id":33860},"_24-recorrer-arrays","2.4 Recorrer arrays",[13,33863,33864,416],{},[16,33865,23794],{},[543,33867,33869],{"className":545,"code":33868,"language":547,"meta":228,"style":228},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"M1\"};\n\nfor (int i = 0; i \u003C componentes.Length; i++)\n{\n    MessageBox.Show(string.Format(\"[{0}] = {1}\", i, componentes[i]));\n}\n",[54,33870,33871,33876,33880,33884,33888,33893],{"__ignoreMap":228},[551,33872,33873],{"class":553,"line":554},[551,33874,33875],{},"string[] componentes = {\"K1\", \"Q1\", \"F1\", \"M1\"};\n",[551,33877,33878],{"class":553,"line":229},[551,33879,1139],{"emptyLinePlaceholder":238},[551,33881,33882],{"class":553,"line":670},[551,33883,23813],{},[551,33885,33886],{"class":553,"line":1136},[551,33887,1151],{},[551,33889,33890],{"class":553,"line":1142},[551,33891,33892],{},"    MessageBox.Show(string.Format(\"[{0}] = {1}\", i, componentes[i]));\n",[551,33894,33895],{"class":553,"line":1148},[551,33896,1193],{},[13,33898,33899,23832],{},[16,33900,23831],{},[543,33902,33904],{"className":545,"code":33903,"language":547,"meta":228,"style":228},"foreach (string componente in componentes)\n{\n    MessageBox.Show(componente);\n}\n",[54,33905,33906,33910,33914,33918],{"__ignoreMap":228},[551,33907,33908],{"class":553,"line":554},[551,33909,23850],{},[551,33911,33912],{"class":553,"line":229},[551,33913,1151],{},[551,33915,33916],{"class":553,"line":670},[551,33917,23859],{},[551,33919,33920],{"class":553,"line":1136},[551,33921,1193],{},[367,33923,33925],{"id":33924},"_25-ejemplo-práctico-análisis-de-corrientes","2.5 Ejemplo práctico: Análisis de corrientes",[543,33927,33929],{"className":545,"code":33928,"language":547,"meta":228,"style":228},"string[] designaciones = {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\"};\ndouble[] corrientes = {25.0, 40.0, 16.0, 20.0, 10.0};\n\n\u002F\u002F Buscar la corriente máxima\ndouble maxCorriente = corrientes[0];\nstring designacionMax = designaciones[0];\n\nfor (int i = 1; i \u003C corrientes.Length; i++)\n{\n    if (corrientes[i] > maxCorriente)\n    {\n        maxCorriente = corrientes[i];\n        designacionMax = designaciones[i];\n    }\n}\n\nMessageBox.Show(string.Format(\"Corriente máxima: {0}A en {1}\",\n    maxCorriente, designacionMax));\n\u002F\u002F Corriente máxima: 40A en K2\n",[54,33930,33931,33936,33941,33945,33950,33955,33960,33964,33969,33973,33978,33982,33987,33992,33996,34000,34004,34009,34014],{"__ignoreMap":228},[551,33932,33933],{"class":553,"line":554},[551,33934,33935],{},"string[] designaciones = {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\"};\n",[551,33937,33938],{"class":553,"line":229},[551,33939,33940],{},"double[] corrientes = {25.0, 40.0, 16.0, 20.0, 10.0};\n",[551,33942,33943],{"class":553,"line":670},[551,33944,1139],{"emptyLinePlaceholder":238},[551,33946,33947],{"class":553,"line":1136},[551,33948,33949],{},"\u002F\u002F Buscar la corriente máxima\n",[551,33951,33952],{"class":553,"line":1142},[551,33953,33954],{},"double maxCorriente = corrientes[0];\n",[551,33956,33957],{"class":553,"line":1148},[551,33958,33959],{},"string designacionMax = designaciones[0];\n",[551,33961,33962],{"class":553,"line":1154},[551,33963,1139],{"emptyLinePlaceholder":238},[551,33965,33966],{"class":553,"line":1160},[551,33967,33968],{},"for (int i = 1; i \u003C corrientes.Length; i++)\n",[551,33970,33971],{"class":553,"line":1166},[551,33972,1151],{},[551,33974,33975],{"class":553,"line":1172},[551,33976,33977],{},"    if (corrientes[i] > maxCorriente)\n",[551,33979,33980],{"class":553,"line":1178},[551,33981,1169],{},[551,33983,33984],{"class":553,"line":1184},[551,33985,33986],{},"        maxCorriente = corrientes[i];\n",[551,33988,33989],{"class":553,"line":1190},[551,33990,33991],{},"        designacionMax = designaciones[i];\n",[551,33993,33994],{"class":553,"line":1472},[551,33995,1187],{},[551,33997,33998],{"class":553,"line":1477},[551,33999,1193],{},[551,34001,34002],{"class":553,"line":1797},[551,34003,1139],{"emptyLinePlaceholder":238},[551,34005,34006],{"class":553,"line":1802},[551,34007,34008],{},"MessageBox.Show(string.Format(\"Corriente máxima: {0}A en {1}\",\n",[551,34010,34011],{"class":553,"line":1808},[551,34012,34013],{},"    maxCorriente, designacionMax));\n",[551,34015,34016],{"class":553,"line":1814},[551,34017,34018],{},"\u002F\u002F Corriente máxima: 40A en K2\n",[367,34020,34022],{"id":34021},"_26-limitaciones-de-los-arrays","2.6 Limitaciones de los arrays",[13,34024,34025,34026,34029],{},"❌ ",[16,34027,34028],{},"Tamaño fijo",": No se puede cambiar después de crear",[543,34031,34033],{"className":545,"code":34032,"language":547,"meta":228,"style":228},"string[] componentes = new string[5];\n\u002F\u002F No puedes agregar un sexto elemento\n",[54,34034,34035,34039],{"__ignoreMap":228},[551,34036,34037],{"class":553,"line":554},[551,34038,33695],{},[551,34040,34041],{"class":553,"line":229},[551,34042,34043],{},"\u002F\u002F No puedes agregar un sexto elemento\n",[13,34045,34025,34046,34049],{},[16,34047,34048],{},"No se pueden eliminar elementos",": Solo sobrescribir",[543,34051,34053],{"className":545,"code":34052,"language":547,"meta":228,"style":228},"componentes[2] = null;  \u002F\u002F \"Elimina\" pero deja un hueco\n",[54,34054,34055],{"__ignoreMap":228},[551,34056,34057],{"class":553,"line":554},[551,34058,34052],{},[13,34060,34025,34061,34064],{},[16,34062,34063],{},"No hay métodos convenientes"," como Add(), Remove(), Contains()",[13,34066,34067,5006,34069,34072],{},[16,34068,1983],{},[54,34070,34071],{},"List\u003CT>"," para colecciones dinámicas.",[43,34074],{},[331,34076,34078,34079],{"id":34077},"_3-list-colecciones-dinámicas","3. List",[33386,34080,34081],{},": Colecciones dinámicas",[13,34083,34084,34086],{},[54,34085,34071],{}," es una colección dinámica que puede crecer y decrecer automáticamente.",[13,34088,34089,416],{},[16,34090,34091],{},"Ventajas sobre arrays",[126,34093,34094,34097,34100],{},[88,34095,34096],{},"Tamaño dinámico (crece automáticamente)",[88,34098,34099],{},"Métodos convenientes: Add(), Remove(), Insert(), Contains()",[88,34101,34102],{},"Más flexible para la mayoría de casos",[367,34104,34106],{"id":34105},"_31-declaración-y-creación","3.1 Declaración y creación",[543,34108,34110],{"className":545,"code":34109,"language":547,"meta":228,"style":228},"\u002F\u002F Sintaxis\nList\u003Ctipo> nombreLista = new List\u003Ctipo>();\n\n\u002F\u002F Ejemplos\nList\u003Cstring> componentes = new List\u003Cstring>();\nList\u003Cdouble> corrientes = new List\u003Cdouble>();\nList\u003Cint> cantidades = new List\u003Cint>();\n",[54,34111,34112,34116,34121,34125,34129,34133,34138],{"__ignoreMap":228},[551,34113,34114],{"class":553,"line":554},[551,34115,33676],{},[551,34117,34118],{"class":553,"line":229},[551,34119,34120],{},"List\u003Ctipo> nombreLista = new List\u003Ctipo>();\n",[551,34122,34123],{"class":553,"line":670},[551,34124,1139],{"emptyLinePlaceholder":238},[551,34126,34127],{"class":553,"line":1136},[551,34128,33690],{},[551,34130,34131],{"class":553,"line":1142},[551,34132,33609],{},[551,34134,34135],{"class":553,"line":1148},[551,34136,34137],{},"List\u003Cdouble> corrientes = new List\u003Cdouble>();\n",[551,34139,34140],{"class":553,"line":1154},[551,34141,34142],{},"List\u003Cint> cantidades = new List\u003Cint>();\n",[367,34144,34146],{"id":34145},"_32-agregar-elementos","3.2 Agregar elementos",[543,34148,34150],{"className":545,"code":34149,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring>();\n\n\u002F\u002F Add: Agrega al final\ncomponentes.Add(\"K1\");\ncomponentes.Add(\"Q1\");\ncomponentes.Add(\"F1\");\n\n\u002F\u002F Insert: Agrega en posición específica\ncomponentes.Insert(1, \"K2\");  \u002F\u002F Inserta \"K2\" en posición 1\n\u002F\u002F Resultado: [\"K1\", \"K2\", \"Q1\", \"F1\"]\n",[54,34151,34152,34156,34160,34165,34169,34174,34179,34183,34188,34193],{"__ignoreMap":228},[551,34153,34154],{"class":553,"line":554},[551,34155,33609],{},[551,34157,34158],{"class":553,"line":229},[551,34159,1139],{"emptyLinePlaceholder":238},[551,34161,34162],{"class":553,"line":670},[551,34163,34164],{},"\u002F\u002F Add: Agrega al final\n",[551,34166,34167],{"class":553,"line":1136},[551,34168,33614],{},[551,34170,34171],{"class":553,"line":1142},[551,34172,34173],{},"componentes.Add(\"Q1\");\n",[551,34175,34176],{"class":553,"line":1148},[551,34177,34178],{},"componentes.Add(\"F1\");\n",[551,34180,34181],{"class":553,"line":1154},[551,34182,1139],{"emptyLinePlaceholder":238},[551,34184,34185],{"class":553,"line":1160},[551,34186,34187],{},"\u002F\u002F Insert: Agrega en posición específica\n",[551,34189,34190],{"class":553,"line":1166},[551,34191,34192],{},"componentes.Insert(1, \"K2\");  \u002F\u002F Inserta \"K2\" en posición 1\n",[551,34194,34195],{"class":553,"line":1172},[551,34196,34197],{},"\u002F\u002F Resultado: [\"K1\", \"K2\", \"Q1\", \"F1\"]\n",[367,34199,34201],{"id":34200},"_33-acceso-a-elementos","3.3 Acceso a elementos",[543,34203,34205],{"className":545,"code":34204,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"Q1\", \"F1\", \"M1\"};\n\n\u002F\u002F Acceso por índice\nstring primero = componentes[0];          \u002F\u002F \"K1\"\nstring segundo = componentes[1];          \u002F\u002F \"Q1\"\n\n\u002F\u002F Count: número de elementos\nint total = componentes.Count;            \u002F\u002F 4\n\n\u002F\u002F Contains: verificar si existe\nbool existe = componentes.Contains(\"K1\"); \u002F\u002F true\n",[54,34206,34207,34212,34216,34221,34226,34231,34235,34240,34245,34249,34254],{"__ignoreMap":228},[551,34208,34209],{"class":553,"line":554},[551,34210,34211],{},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"Q1\", \"F1\", \"M1\"};\n",[551,34213,34214],{"class":553,"line":229},[551,34215,1139],{"emptyLinePlaceholder":238},[551,34217,34218],{"class":553,"line":670},[551,34219,34220],{},"\u002F\u002F Acceso por índice\n",[551,34222,34223],{"class":553,"line":1136},[551,34224,34225],{},"string primero = componentes[0];          \u002F\u002F \"K1\"\n",[551,34227,34228],{"class":553,"line":1142},[551,34229,34230],{},"string segundo = componentes[1];          \u002F\u002F \"Q1\"\n",[551,34232,34233],{"class":553,"line":1148},[551,34234,1139],{"emptyLinePlaceholder":238},[551,34236,34237],{"class":553,"line":1154},[551,34238,34239],{},"\u002F\u002F Count: número de elementos\n",[551,34241,34242],{"class":553,"line":1160},[551,34243,34244],{},"int total = componentes.Count;            \u002F\u002F 4\n",[551,34246,34247],{"class":553,"line":1166},[551,34248,1139],{"emptyLinePlaceholder":238},[551,34250,34251],{"class":553,"line":1172},[551,34252,34253],{},"\u002F\u002F Contains: verificar si existe\n",[551,34255,34256],{"class":553,"line":1178},[551,34257,34258],{},"bool existe = componentes.Contains(\"K1\"); \u002F\u002F true\n",[367,34260,34262],{"id":34261},"_34-eliminar-elementos","3.4 Eliminar elementos",[543,34264,34266],{"className":545,"code":34265,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"Q1\", \"F1\", \"M1\"};\n\n\u002F\u002F Remove: elimina la primera ocurrencia\ncomponentes.Remove(\"Q1\");\n\u002F\u002F Resultado: [\"K1\", \"F1\", \"M1\"]\n\n\u002F\u002F RemoveAt: elimina por índice\ncomponentes.RemoveAt(0);\n\u002F\u002F Resultado: [\"F1\", \"M1\"]\n\n\u002F\u002F Clear: elimina todos\ncomponentes.Clear();\n\u002F\u002F Resultado: []\n",[54,34267,34268,34272,34276,34281,34286,34291,34295,34300,34305,34310,34314,34319,34324],{"__ignoreMap":228},[551,34269,34270],{"class":553,"line":554},[551,34271,34211],{},[551,34273,34274],{"class":553,"line":229},[551,34275,1139],{"emptyLinePlaceholder":238},[551,34277,34278],{"class":553,"line":670},[551,34279,34280],{},"\u002F\u002F Remove: elimina la primera ocurrencia\n",[551,34282,34283],{"class":553,"line":1136},[551,34284,34285],{},"componentes.Remove(\"Q1\");\n",[551,34287,34288],{"class":553,"line":1142},[551,34289,34290],{},"\u002F\u002F Resultado: [\"K1\", \"F1\", \"M1\"]\n",[551,34292,34293],{"class":553,"line":1148},[551,34294,1139],{"emptyLinePlaceholder":238},[551,34296,34297],{"class":553,"line":1154},[551,34298,34299],{},"\u002F\u002F RemoveAt: elimina por índice\n",[551,34301,34302],{"class":553,"line":1160},[551,34303,34304],{},"componentes.RemoveAt(0);\n",[551,34306,34307],{"class":553,"line":1166},[551,34308,34309],{},"\u002F\u002F Resultado: [\"F1\", \"M1\"]\n",[551,34311,34312],{"class":553,"line":1172},[551,34313,1139],{"emptyLinePlaceholder":238},[551,34315,34316],{"class":553,"line":1178},[551,34317,34318],{},"\u002F\u002F Clear: elimina todos\n",[551,34320,34321],{"class":553,"line":1184},[551,34322,34323],{},"componentes.Clear();\n",[551,34325,34326],{"class":553,"line":1190},[551,34327,34328],{},"\u002F\u002F Resultado: []\n",[367,34330,34332],{"id":34331},"_35-buscar-y-filtrar","3.5 Buscar y filtrar",[543,34334,34336],{"className":545,"code":34335,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\", \"M1\"};\n\n\u002F\u002F IndexOf: encontrar posición\nint indice = componentes.IndexOf(\"Q1\");  \u002F\u002F 2\nif (indice != -1)\n{\n    MessageBox.Show(\"Encontrado en posición: \" + indice);\n}\n\n\u002F\u002F Find: buscar con condición\nstring primerK = componentes.Find(c => c.StartsWith(\"K\"));\nMessageBox.Show(\"Primer contactor: \" + primerK);  \u002F\u002F \"K1\"\n\n\u002F\u002F FindAll: buscar todos que cumplan condición\nList\u003Cstring> contactores = componentes.FindAll(c => c.StartsWith(\"K\"));\n\u002F\u002F Resultado: [\"K1\", \"K2\"]\n",[54,34337,34338,34343,34347,34352,34357,34362,34366,34371,34375,34379,34384,34389,34394,34398,34403,34408],{"__ignoreMap":228},[551,34339,34340],{"class":553,"line":554},[551,34341,34342],{},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"K2\", \"Q1\", \"Q2\", \"F1\", \"M1\"};\n",[551,34344,34345],{"class":553,"line":229},[551,34346,1139],{"emptyLinePlaceholder":238},[551,34348,34349],{"class":553,"line":670},[551,34350,34351],{},"\u002F\u002F IndexOf: encontrar posición\n",[551,34353,34354],{"class":553,"line":1136},[551,34355,34356],{},"int indice = componentes.IndexOf(\"Q1\");  \u002F\u002F 2\n",[551,34358,34359],{"class":553,"line":1142},[551,34360,34361],{},"if (indice != -1)\n",[551,34363,34364],{"class":553,"line":1148},[551,34365,1151],{},[551,34367,34368],{"class":553,"line":1154},[551,34369,34370],{},"    MessageBox.Show(\"Encontrado en posición: \" + indice);\n",[551,34372,34373],{"class":553,"line":1160},[551,34374,1193],{},[551,34376,34377],{"class":553,"line":1166},[551,34378,1139],{"emptyLinePlaceholder":238},[551,34380,34381],{"class":553,"line":1172},[551,34382,34383],{},"\u002F\u002F Find: buscar con condición\n",[551,34385,34386],{"class":553,"line":1178},[551,34387,34388],{},"string primerK = componentes.Find(c => c.StartsWith(\"K\"));\n",[551,34390,34391],{"class":553,"line":1184},[551,34392,34393],{},"MessageBox.Show(\"Primer contactor: \" + primerK);  \u002F\u002F \"K1\"\n",[551,34395,34396],{"class":553,"line":1190},[551,34397,1139],{"emptyLinePlaceholder":238},[551,34399,34400],{"class":553,"line":1472},[551,34401,34402],{},"\u002F\u002F FindAll: buscar todos que cumplan condición\n",[551,34404,34405],{"class":553,"line":1477},[551,34406,34407],{},"List\u003Cstring> contactores = componentes.FindAll(c => c.StartsWith(\"K\"));\n",[551,34409,34410],{"class":553,"line":1797},[551,34411,34412],{},"\u002F\u002F Resultado: [\"K1\", \"K2\"]\n",[367,34414,34416],{"id":34415},"_36-ejemplo-práctico-gestión-de-componentes","3.6 Ejemplo práctico: Gestión de componentes",[543,34418,34420],{"className":545,"code":34419,"language":547,"meta":228,"style":228},"List\u003Cstring> componentes = new List\u003Cstring>();\n\n\u002F\u002F Agregar componentes\ncomponentes.Add(\"K1\");\ncomponentes.Add(\"K2\");\ncomponentes.Add(\"Q1\");\ncomponentes.Add(\"F1\");\n\n\u002F\u002F Mostrar todos\nstring lista = \"Componentes:\\n\";\nforeach (string comp in componentes)\n{\n    lista += \"- \" + comp + \"\\n\";\n}\nMessageBox.Show(lista);\n\n\u002F\u002F Buscar si existe un componente\nif (componentes.Contains(\"Q1\"))\n{\n    MessageBox.Show(\"Guardamotor Q1 encontrado\");\n}\n\n\u002F\u002F Contar contactores\nint numContactores = componentes.FindAll(c => c.StartsWith(\"K\")).Count;\nMessageBox.Show(\"Número de contactores: \" + numContactores);  \u002F\u002F 2\n\n\u002F\u002F Eliminar componente\ncomponentes.Remove(\"F1\");\nMessageBox.Show(\"Componentes después de eliminar F1: \" + componentes.Count);  \u002F\u002F 3\n",[54,34421,34422,34426,34430,34435,34439,34443,34447,34451,34455,34460,34465,34469,34473,34478,34482,34487,34491,34496,34501,34505,34510,34514,34518,34523,34528,34533,34537,34542,34547],{"__ignoreMap":228},[551,34423,34424],{"class":553,"line":554},[551,34425,33609],{},[551,34427,34428],{"class":553,"line":229},[551,34429,1139],{"emptyLinePlaceholder":238},[551,34431,34432],{"class":553,"line":670},[551,34433,34434],{},"\u002F\u002F Agregar componentes\n",[551,34436,34437],{"class":553,"line":1136},[551,34438,33614],{},[551,34440,34441],{"class":553,"line":1142},[551,34442,33619],{},[551,34444,34445],{"class":553,"line":1148},[551,34446,34173],{},[551,34448,34449],{"class":553,"line":1154},[551,34450,34178],{},[551,34452,34453],{"class":553,"line":1160},[551,34454,1139],{"emptyLinePlaceholder":238},[551,34456,34457],{"class":553,"line":1166},[551,34458,34459],{},"\u002F\u002F Mostrar todos\n",[551,34461,34462],{"class":553,"line":1172},[551,34463,34464],{},"string lista = \"Componentes:\\n\";\n",[551,34466,34467],{"class":553,"line":1178},[551,34468,28921],{},[551,34470,34471],{"class":553,"line":1184},[551,34472,1151],{},[551,34474,34475],{"class":553,"line":1190},[551,34476,34477],{},"    lista += \"- \" + comp + \"\\n\";\n",[551,34479,34480],{"class":553,"line":1472},[551,34481,1193],{},[551,34483,34484],{"class":553,"line":1477},[551,34485,34486],{},"MessageBox.Show(lista);\n",[551,34488,34489],{"class":553,"line":1797},[551,34490,1139],{"emptyLinePlaceholder":238},[551,34492,34493],{"class":553,"line":1802},[551,34494,34495],{},"\u002F\u002F Buscar si existe un componente\n",[551,34497,34498],{"class":553,"line":1808},[551,34499,34500],{},"if (componentes.Contains(\"Q1\"))\n",[551,34502,34503],{"class":553,"line":1814},[551,34504,1151],{},[551,34506,34507],{"class":553,"line":1820},[551,34508,34509],{},"    MessageBox.Show(\"Guardamotor Q1 encontrado\");\n",[551,34511,34512],{"class":553,"line":1826},[551,34513,1193],{},[551,34515,34516],{"class":553,"line":1832},[551,34517,1139],{"emptyLinePlaceholder":238},[551,34519,34520],{"class":553,"line":1838},[551,34521,34522],{},"\u002F\u002F Contar contactores\n",[551,34524,34525],{"class":553,"line":1844},[551,34526,34527],{},"int numContactores = componentes.FindAll(c => c.StartsWith(\"K\")).Count;\n",[551,34529,34530],{"class":553,"line":1850},[551,34531,34532],{},"MessageBox.Show(\"Número de contactores: \" + numContactores);  \u002F\u002F 2\n",[551,34534,34535],{"class":553,"line":1855},[551,34536,1139],{"emptyLinePlaceholder":238},[551,34538,34539],{"class":553,"line":1861},[551,34540,34541],{},"\u002F\u002F Eliminar componente\n",[551,34543,34544],{"class":553,"line":1867},[551,34545,34546],{},"componentes.Remove(\"F1\");\n",[551,34548,34549],{"class":553,"line":1873},[551,34550,34551],{},"MessageBox.Show(\"Componentes después de eliminar F1: \" + componentes.Count);  \u002F\u002F 3\n",[367,34553,34555,34556],{"id":34554},"_37-recorrer-list","3.7 Recorrer List",[33386,34557],{},[13,34559,34560,34562],{},[16,34561,23831],{}," (recomendado):",[543,34564,34566],{"className":545,"code":34565,"language":547,"meta":228,"style":228},"List\u003Cdouble> corrientes = new List\u003Cdouble> {10.0, 16.0, 25.0, 32.0};\n\nforeach (double corriente in corrientes)\n{\n    MessageBox.Show(string.Format(\"Corriente: {0}A\", corriente));\n}\n",[54,34567,34568,34573,34577,34581,34585,34590],{"__ignoreMap":228},[551,34569,34570],{"class":553,"line":554},[551,34571,34572],{},"List\u003Cdouble> corrientes = new List\u003Cdouble> {10.0, 16.0, 25.0, 32.0};\n",[551,34574,34575],{"class":553,"line":229},[551,34576,1139],{"emptyLinePlaceholder":238},[551,34578,34579],{"class":553,"line":670},[551,34580,27164],{},[551,34582,34583],{"class":553,"line":1136},[551,34584,1151],{},[551,34586,34587],{"class":553,"line":1142},[551,34588,34589],{},"    MessageBox.Show(string.Format(\"Corriente: {0}A\", corriente));\n",[551,34591,34592],{"class":553,"line":1148},[551,34593,1193],{},[13,34595,34596,34598],{},[16,34597,23794],{}," (cuando necesitas el índice):",[543,34600,34602],{"className":545,"code":34601,"language":547,"meta":228,"style":228},"for (int i = 0; i \u003C corrientes.Count; i++)\n{\n    MessageBox.Show(string.Format(\"[{0}] = {1}A\", i, corrientes[i]));\n}\n",[54,34603,34604,34609,34613,34618],{"__ignoreMap":228},[551,34605,34606],{"class":553,"line":554},[551,34607,34608],{},"for (int i = 0; i \u003C corrientes.Count; i++)\n",[551,34610,34611],{"class":553,"line":229},[551,34612,1151],{},[551,34614,34615],{"class":553,"line":670},[551,34616,34617],{},"    MessageBox.Show(string.Format(\"[{0}] = {1}A\", i, corrientes[i]));\n",[551,34619,34620],{"class":553,"line":1136},[551,34621,1193],{},[43,34623],{},[331,34625,34627],{"id":34626},"_4-dictionarykv-colecciones-clave-valor","4. Dictionary\u003CK,V>: Colecciones clave-valor",[13,34629,34630,34633,34634,34637],{},[54,34631,34632],{},"Dictionary\u003CK,V>"," almacena pares ",[16,34635,34636],{},"clave-valor"," para búsquedas rápidas.",[13,34639,34640,34642],{},[16,34641,1231],{},": Un diccionario de idiomas",[126,34644,34645,34651,34657],{},[88,34646,34647,34650],{},[16,34648,34649],{},"Clave",": Palabra en español",[88,34652,34653,34656],{},[16,34654,34655],{},"Valor",": Traducción en inglés",[88,34658,34659],{},"Búsqueda rápida por clave",[367,34661,34663],{"id":34662},"_41-declaración-y-creación","4.1 Declaración y creación",[543,34665,34667],{"className":545,"code":34666,"language":547,"meta":228,"style":228},"\u002F\u002F Sintaxis\nDictionary\u003CtipoClave, tipoValor> nombreDict = new Dictionary\u003CtipoClave, tipoValor>();\n\n\u002F\u002F Ejemplos\nDictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>();\nDictionary\u003Cstring, string> fabricantes = new Dictionary\u003Cstring, string>();\nDictionary\u003Cint, string> componentes = new Dictionary\u003Cint, string>();\n",[54,34668,34669,34673,34678,34682,34686,34691,34696],{"__ignoreMap":228},[551,34670,34671],{"class":553,"line":554},[551,34672,33676],{},[551,34674,34675],{"class":553,"line":229},[551,34676,34677],{},"Dictionary\u003CtipoClave, tipoValor> nombreDict = new Dictionary\u003CtipoClave, tipoValor>();\n",[551,34679,34680],{"class":553,"line":670},[551,34681,1139],{"emptyLinePlaceholder":238},[551,34683,34684],{"class":553,"line":1136},[551,34685,33690],{},[551,34687,34688],{"class":553,"line":1142},[551,34689,34690],{},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>();\n",[551,34692,34693],{"class":553,"line":1148},[551,34694,34695],{},"Dictionary\u003Cstring, string> fabricantes = new Dictionary\u003Cstring, string>();\n",[551,34697,34698],{"class":553,"line":1154},[551,34699,34700],{},"Dictionary\u003Cint, string> componentes = new Dictionary\u003Cint, string>();\n",[367,34702,34704],{"id":34703},"_42-agregar-elementos","4.2 Agregar elementos",[543,34706,34708],{"className":545,"code":34707,"language":547,"meta":228,"style":228},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>();\n\n\u002F\u002F Add: agregar par clave-valor\ncorrientes.Add(\"K1\", 25.0);\ncorrientes.Add(\"K2\", 40.0);\ncorrientes.Add(\"Q1\", 16.0);\n\n\u002F\u002F O inicialización directa\nDictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>\n{\n    {\"K1\", 25.0},\n    {\"K2\", 40.0},\n    {\"Q1\", 16.0}\n};\n",[54,34709,34710,34714,34718,34723,34728,34733,34738,34742,34747,34752,34756,34761,34766,34771],{"__ignoreMap":228},[551,34711,34712],{"class":553,"line":554},[551,34713,34690],{},[551,34715,34716],{"class":553,"line":229},[551,34717,1139],{"emptyLinePlaceholder":238},[551,34719,34720],{"class":553,"line":670},[551,34721,34722],{},"\u002F\u002F Add: agregar par clave-valor\n",[551,34724,34725],{"class":553,"line":1136},[551,34726,34727],{},"corrientes.Add(\"K1\", 25.0);\n",[551,34729,34730],{"class":553,"line":1142},[551,34731,34732],{},"corrientes.Add(\"K2\", 40.0);\n",[551,34734,34735],{"class":553,"line":1148},[551,34736,34737],{},"corrientes.Add(\"Q1\", 16.0);\n",[551,34739,34740],{"class":553,"line":1154},[551,34741,1139],{"emptyLinePlaceholder":238},[551,34743,34744],{"class":553,"line":1160},[551,34745,34746],{},"\u002F\u002F O inicialización directa\n",[551,34748,34749],{"class":553,"line":1166},[551,34750,34751],{},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>\n",[551,34753,34754],{"class":553,"line":1172},[551,34755,1151],{},[551,34757,34758],{"class":553,"line":1178},[551,34759,34760],{},"    {\"K1\", 25.0},\n",[551,34762,34763],{"class":553,"line":1184},[551,34764,34765],{},"    {\"K2\", 40.0},\n",[551,34767,34768],{"class":553,"line":1190},[551,34769,34770],{},"    {\"Q1\", 16.0}\n",[551,34772,34773],{"class":553,"line":1472},[551,34774,18964],{},[367,34776,34778],{"id":34777},"_43-acceso-a-valores","4.3 Acceso a valores",[543,34780,34782],{"className":545,"code":34781,"language":547,"meta":228,"style":228},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>\n{\n    {\"K1\", 25.0},\n    {\"K2\", 40.0},\n    {\"Q1\", 16.0}\n};\n\n\u002F\u002F Acceso directo por clave\ndouble corrienteK1 = corrientes[\"K1\"];  \u002F\u002F 25.0\n\n\u002F\u002F Verificar si existe una clave\nif (corrientes.ContainsKey(\"K2\"))\n{\n    MessageBox.Show(\"K2 tiene corriente: \" + corrientes[\"K2\"]);\n}\n\n\u002F\u002F TryGetValue: forma segura (no lanza excepción)\ndouble valor;\nif (corrientes.TryGetValue(\"Q1\", out valor))\n{\n    MessageBox.Show(\"Q1: \" + valor + \"A\");\n}\nelse\n{\n    MessageBox.Show(\"Q1 no encontrado\");\n}\n",[54,34783,34784,34788,34792,34796,34800,34804,34808,34812,34817,34822,34826,34831,34836,34840,34845,34849,34853,34858,34863,34868,34872,34877,34881,34885,34889,34894],{"__ignoreMap":228},[551,34785,34786],{"class":553,"line":554},[551,34787,34751],{},[551,34789,34790],{"class":553,"line":229},[551,34791,1151],{},[551,34793,34794],{"class":553,"line":670},[551,34795,34760],{},[551,34797,34798],{"class":553,"line":1136},[551,34799,34765],{},[551,34801,34802],{"class":553,"line":1142},[551,34803,34770],{},[551,34805,34806],{"class":553,"line":1148},[551,34807,18964],{},[551,34809,34810],{"class":553,"line":1154},[551,34811,1139],{"emptyLinePlaceholder":238},[551,34813,34814],{"class":553,"line":1160},[551,34815,34816],{},"\u002F\u002F Acceso directo por clave\n",[551,34818,34819],{"class":553,"line":1166},[551,34820,34821],{},"double corrienteK1 = corrientes[\"K1\"];  \u002F\u002F 25.0\n",[551,34823,34824],{"class":553,"line":1172},[551,34825,1139],{"emptyLinePlaceholder":238},[551,34827,34828],{"class":553,"line":1178},[551,34829,34830],{},"\u002F\u002F Verificar si existe una clave\n",[551,34832,34833],{"class":553,"line":1184},[551,34834,34835],{},"if (corrientes.ContainsKey(\"K2\"))\n",[551,34837,34838],{"class":553,"line":1190},[551,34839,1151],{},[551,34841,34842],{"class":553,"line":1472},[551,34843,34844],{},"    MessageBox.Show(\"K2 tiene corriente: \" + corrientes[\"K2\"]);\n",[551,34846,34847],{"class":553,"line":1477},[551,34848,1193],{},[551,34850,34851],{"class":553,"line":1797},[551,34852,1139],{"emptyLinePlaceholder":238},[551,34854,34855],{"class":553,"line":1802},[551,34856,34857],{},"\u002F\u002F TryGetValue: forma segura (no lanza excepción)\n",[551,34859,34860],{"class":553,"line":1808},[551,34861,34862],{},"double valor;\n",[551,34864,34865],{"class":553,"line":1814},[551,34866,34867],{},"if (corrientes.TryGetValue(\"Q1\", out valor))\n",[551,34869,34870],{"class":553,"line":1820},[551,34871,1151],{},[551,34873,34874],{"class":553,"line":1826},[551,34875,34876],{},"    MessageBox.Show(\"Q1: \" + valor + \"A\");\n",[551,34878,34879],{"class":553,"line":1832},[551,34880,1193],{},[551,34882,34883],{"class":553,"line":1838},[551,34884,3704],{},[551,34886,34887],{"class":553,"line":1844},[551,34888,1151],{},[551,34890,34891],{"class":553,"line":1850},[551,34892,34893],{},"    MessageBox.Show(\"Q1 no encontrado\");\n",[551,34895,34896],{"class":553,"line":1855},[551,34897,1193],{},[367,34899,34901],{"id":34900},"_44-modificar-y-eliminar","4.4 Modificar y eliminar",[543,34903,34905],{"className":545,"code":34904,"language":547,"meta":228,"style":228},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>\n{\n    {\"K1\", 25.0},\n    {\"K2\", 40.0}\n};\n\n\u002F\u002F Modificar valor existente\ncorrientes[\"K1\"] = 32.0;\n\n\u002F\u002F Eliminar entrada\ncorrientes.Remove(\"K2\");\n\n\u002F\u002F Count: número de entradas\nint total = corrientes.Count;  \u002F\u002F 1\n",[54,34906,34907,34911,34915,34919,34924,34928,34932,34937,34942,34946,34951,34956,34960,34965],{"__ignoreMap":228},[551,34908,34909],{"class":553,"line":554},[551,34910,34751],{},[551,34912,34913],{"class":553,"line":229},[551,34914,1151],{},[551,34916,34917],{"class":553,"line":670},[551,34918,34760],{},[551,34920,34921],{"class":553,"line":1136},[551,34922,34923],{},"    {\"K2\", 40.0}\n",[551,34925,34926],{"class":553,"line":1142},[551,34927,18964],{},[551,34929,34930],{"class":553,"line":1148},[551,34931,1139],{"emptyLinePlaceholder":238},[551,34933,34934],{"class":553,"line":1154},[551,34935,34936],{},"\u002F\u002F Modificar valor existente\n",[551,34938,34939],{"class":553,"line":1160},[551,34940,34941],{},"corrientes[\"K1\"] = 32.0;\n",[551,34943,34944],{"class":553,"line":1166},[551,34945,1139],{"emptyLinePlaceholder":238},[551,34947,34948],{"class":553,"line":1172},[551,34949,34950],{},"\u002F\u002F Eliminar entrada\n",[551,34952,34953],{"class":553,"line":1178},[551,34954,34955],{},"corrientes.Remove(\"K2\");\n",[551,34957,34958],{"class":553,"line":1184},[551,34959,1139],{"emptyLinePlaceholder":238},[551,34961,34962],{"class":553,"line":1190},[551,34963,34964],{},"\u002F\u002F Count: número de entradas\n",[551,34966,34967],{"class":553,"line":1472},[551,34968,34969],{},"int total = corrientes.Count;  \u002F\u002F 1\n",[367,34971,34973],{"id":34972},"_45-recorrer-dictionary","4.5 Recorrer Dictionary",[13,34975,34976,416],{},[16,34977,34978],{},"Con foreach (pares clave-valor)",[543,34980,34982],{"className":545,"code":34981,"language":547,"meta":228,"style":228},"Dictionary\u003Cstring, double> corrientes = new Dictionary\u003Cstring, double>\n{\n    {\"K1\", 25.0},\n    {\"K2\", 40.0},\n    {\"Q1\", 16.0}\n};\n\nforeach (KeyValuePair\u003Cstring, double> par in corrientes)\n{\n    MessageBox.Show(string.Format(\"{0}: {1}A\", par.Key, par.Value));\n}\n",[54,34983,34984,34988,34992,34996,35000,35004,35008,35012,35017,35021,35026],{"__ignoreMap":228},[551,34985,34986],{"class":553,"line":554},[551,34987,34751],{},[551,34989,34990],{"class":553,"line":229},[551,34991,1151],{},[551,34993,34994],{"class":553,"line":670},[551,34995,34760],{},[551,34997,34998],{"class":553,"line":1136},[551,34999,34765],{},[551,35001,35002],{"class":553,"line":1142},[551,35003,34770],{},[551,35005,35006],{"class":553,"line":1148},[551,35007,18964],{},[551,35009,35010],{"class":553,"line":1154},[551,35011,1139],{"emptyLinePlaceholder":238},[551,35013,35014],{"class":553,"line":1160},[551,35015,35016],{},"foreach (KeyValuePair\u003Cstring, double> par in corrientes)\n",[551,35018,35019],{"class":553,"line":1166},[551,35020,1151],{},[551,35022,35023],{"class":553,"line":1172},[551,35024,35025],{},"    MessageBox.Show(string.Format(\"{0}: {1}A\", par.Key, par.Value));\n",[551,35027,35028],{"class":553,"line":1178},[551,35029,1193],{},[13,35031,35032,416],{},[16,35033,35034],{},"Forma simplificada con var",[543,35036,35038],{"className":545,"code":35037,"language":547,"meta":228,"style":228},"foreach (var par in corrientes)\n{\n    MessageBox.Show(string.Format(\"{0}: {1}A\", par.Key, par.Value));\n}\n",[54,35039,35040,35045,35049,35053],{"__ignoreMap":228},[551,35041,35042],{"class":553,"line":554},[551,35043,35044],{},"foreach (var par in corrientes)\n",[551,35046,35047],{"class":553,"line":229},[551,35048,1151],{},[551,35050,35051],{"class":553,"line":670},[551,35052,35025],{},[551,35054,35055],{"class":553,"line":1136},[551,35056,1193],{},[13,35058,35059,416],{},[16,35060,35061],{},"Solo claves o solo valores",[543,35063,35065],{"className":545,"code":35064,"language":547,"meta":228,"style":228},"\u002F\u002F Solo claves\nforeach (string clave in corrientes.Keys)\n{\n    MessageBox.Show(clave);\n}\n\n\u002F\u002F Solo valores\nforeach (double valor in corrientes.Values)\n{\n    MessageBox.Show(valor + \"A\");\n}\n",[54,35066,35067,35072,35077,35081,35086,35090,35094,35099,35104,35108,35113],{"__ignoreMap":228},[551,35068,35069],{"class":553,"line":554},[551,35070,35071],{},"\u002F\u002F Solo claves\n",[551,35073,35074],{"class":553,"line":229},[551,35075,35076],{},"foreach (string clave in corrientes.Keys)\n",[551,35078,35079],{"class":553,"line":670},[551,35080,1151],{},[551,35082,35083],{"class":553,"line":1136},[551,35084,35085],{},"    MessageBox.Show(clave);\n",[551,35087,35088],{"class":553,"line":1142},[551,35089,1193],{},[551,35091,35092],{"class":553,"line":1148},[551,35093,1139],{"emptyLinePlaceholder":238},[551,35095,35096],{"class":553,"line":1154},[551,35097,35098],{},"\u002F\u002F Solo valores\n",[551,35100,35101],{"class":553,"line":1160},[551,35102,35103],{},"foreach (double valor in corrientes.Values)\n",[551,35105,35106],{"class":553,"line":1166},[551,35107,1151],{},[551,35109,35110],{"class":553,"line":1172},[551,35111,35112],{},"    MessageBox.Show(valor + \"A\");\n",[551,35114,35115],{"class":553,"line":1178},[551,35116,1193],{},[367,35118,35120],{"id":35119},"_46-ejemplo-práctico-base-de-datos-de-componentes","4.6 Ejemplo práctico: Base de datos de componentes",[543,35122,35124],{"className":545,"code":35123,"language":547,"meta":228,"style":228},"\u002F\u002F Diccionario: Código → Descripción\nDictionary\u003Cstring, string> baseDatos = new Dictionary\u003Cstring, string>\n{\n    {\"3RT2026-1BB40\", \"Contactor 3P 25A AC3\"},\n    {\"3RT2036-1BB40\", \"Contactor 3P 40A AC3\"},\n    {\"3RV2011-1JA10\", \"Guardamotor 3.5-5A\"},\n    {\"LC1D09BD\", \"Contactor TeSys D 9A\"}\n};\n\n\u002F\u002F Buscar componente\nstring codigoBuscar = \"3RT2026-1BB40\";\n\nif (baseDatos.ContainsKey(codigoBuscar))\n{\n    string descripcion = baseDatos[codigoBuscar];\n    MessageBox.Show(string.Format(\"Código: {0}\\nDescripción: {1}\",\n        codigoBuscar, descripcion));\n}\nelse\n{\n    MessageBox.Show(\"Código no encontrado\");\n}\n\n\u002F\u002F Listar todos los componentes\nstring reporte = \"BASE DE DATOS DE COMPONENTES\\n\\n\";\nforeach (var item in baseDatos)\n{\n    reporte += string.Format(\"{0}\\n  → {1}\\n\\n\", item.Key, item.Value);\n}\nMessageBox.Show(reporte);\n",[54,35125,35126,35131,35136,35140,35145,35150,35155,35160,35164,35168,35173,35178,35182,35187,35191,35196,35201,35206,35210,35214,35218,35223,35227,35231,35236,35241,35246,35250,35255,35259],{"__ignoreMap":228},[551,35127,35128],{"class":553,"line":554},[551,35129,35130],{},"\u002F\u002F Diccionario: Código → Descripción\n",[551,35132,35133],{"class":553,"line":229},[551,35134,35135],{},"Dictionary\u003Cstring, string> baseDatos = new Dictionary\u003Cstring, string>\n",[551,35137,35138],{"class":553,"line":670},[551,35139,1151],{},[551,35141,35142],{"class":553,"line":1136},[551,35143,35144],{},"    {\"3RT2026-1BB40\", \"Contactor 3P 25A AC3\"},\n",[551,35146,35147],{"class":553,"line":1142},[551,35148,35149],{},"    {\"3RT2036-1BB40\", \"Contactor 3P 40A AC3\"},\n",[551,35151,35152],{"class":553,"line":1148},[551,35153,35154],{},"    {\"3RV2011-1JA10\", \"Guardamotor 3.5-5A\"},\n",[551,35156,35157],{"class":553,"line":1154},[551,35158,35159],{},"    {\"LC1D09BD\", \"Contactor TeSys D 9A\"}\n",[551,35161,35162],{"class":553,"line":1160},[551,35163,18964],{},[551,35165,35166],{"class":553,"line":1166},[551,35167,1139],{"emptyLinePlaceholder":238},[551,35169,35170],{"class":553,"line":1172},[551,35171,35172],{},"\u002F\u002F Buscar componente\n",[551,35174,35175],{"class":553,"line":1178},[551,35176,35177],{},"string codigoBuscar = \"3RT2026-1BB40\";\n",[551,35179,35180],{"class":553,"line":1184},[551,35181,1139],{"emptyLinePlaceholder":238},[551,35183,35184],{"class":553,"line":1190},[551,35185,35186],{},"if (baseDatos.ContainsKey(codigoBuscar))\n",[551,35188,35189],{"class":553,"line":1472},[551,35190,1151],{},[551,35192,35193],{"class":553,"line":1477},[551,35194,35195],{},"    string descripcion = baseDatos[codigoBuscar];\n",[551,35197,35198],{"class":553,"line":1797},[551,35199,35200],{},"    MessageBox.Show(string.Format(\"Código: {0}\\nDescripción: {1}\",\n",[551,35202,35203],{"class":553,"line":1802},[551,35204,35205],{},"        codigoBuscar, descripcion));\n",[551,35207,35208],{"class":553,"line":1808},[551,35209,1193],{},[551,35211,35212],{"class":553,"line":1814},[551,35213,3704],{},[551,35215,35216],{"class":553,"line":1820},[551,35217,1151],{},[551,35219,35220],{"class":553,"line":1826},[551,35221,35222],{},"    MessageBox.Show(\"Código no encontrado\");\n",[551,35224,35225],{"class":553,"line":1832},[551,35226,1193],{},[551,35228,35229],{"class":553,"line":1838},[551,35230,1139],{"emptyLinePlaceholder":238},[551,35232,35233],{"class":553,"line":1844},[551,35234,35235],{},"\u002F\u002F Listar todos los componentes\n",[551,35237,35238],{"class":553,"line":1850},[551,35239,35240],{},"string reporte = \"BASE DE DATOS DE COMPONENTES\\n\\n\";\n",[551,35242,35243],{"class":553,"line":1855},[551,35244,35245],{},"foreach (var item in baseDatos)\n",[551,35247,35248],{"class":553,"line":1861},[551,35249,1151],{},[551,35251,35252],{"class":553,"line":1867},[551,35253,35254],{},"    reporte += string.Format(\"{0}\\n  → {1}\\n\\n\", item.Key, item.Value);\n",[551,35256,35257],{"class":553,"line":1873},[551,35258,1193],{},[551,35260,35261],{"class":553,"line":1878},[551,35262,25561],{},[43,35264],{},[331,35266,35268],{"id":35267},"_5-comparación-de-colecciones","5. Comparación de colecciones",[6589,35270,35271,35288],{},[6592,35272,35273],{},[6595,35274,35275,35278,35281,35286],{},[6598,35276,35277],{},"Característica",[6598,35279,35280],{},"Array",[6598,35282,35283,35284],{},"List",[33386,35285],{},[6598,35287,34632],{},[6611,35289,35290,35305,35320,35335,35349,35363],{},[6595,35291,35292,35297,35300,35303],{},[6616,35293,35294],{},[16,35295,35296],{},"Tamaño",[6616,35298,35299],{},"Fijo",[6616,35301,35302],{},"Dinámico",[6616,35304,35302],{},[6595,35306,35307,35312,35315,35317],{},[6616,35308,35309],{},[16,35310,35311],{},"Acceso",[6616,35313,35314],{},"Por índice",[6616,35316,35314],{},[6616,35318,35319],{},"Por clave",[6595,35321,35322,35327,35330,35332],{},[6616,35323,35324],{},[16,35325,35326],{},"Búsqueda",[6616,35328,35329],{},"Lenta (O(n))",[6616,35331,35329],{},[6616,35333,35334],{},"Rápida (O(1))",[6595,35336,35337,35342,35344,35347],{},[6616,35338,35339],{},[16,35340,35341],{},"Agregar",[6616,35343,18787],{},[6616,35345,35346],{},"Sí (Add)",[6616,35348,35346],{},[6595,35350,35351,35356,35358,35361],{},[6616,35352,35353],{},[16,35354,35355],{},"Eliminar",[6616,35357,18787],{},[6616,35359,35360],{},"Sí (Remove)",[6616,35362,35360],{},[6595,35364,35365,35369,35372,35375],{},[6616,35366,35367],{},[16,35368,6771],{},[6616,35370,35371],{},"Datos fijos",[6616,35373,35374],{},"Listas dinámicas",[6616,35376,35377],{},"Búsquedas por clave",[13,35379,35380,416],{},[16,35381,35382],{},"Cuándo usar cada una",[13,35384,35385,73,35387,416],{},[16,35386,35280],{},[54,35388,35389],{},"string[]",[126,35391,35392,35395,35398],{},[88,35393,35394],{},"Tamaño conocido y fijo",[88,35396,35397],{},"No necesitas agregar\u002Feliminar",[88,35399,35400],{},"Ejemplo: Días de la semana, meses del año",[13,35402,35403,73,35407,416],{},[16,35404,35283,35405],{},[33386,35406],{},[54,35408,35409],{},"List\u003Cstring>",[126,35411,35412,35415,35418],{},[88,35413,35414],{},"Tamaño variable",[88,35416,35417],{},"Necesitas agregar\u002Feliminar frecuentemente",[88,35419,35420],{},"Ejemplo: Lista de componentes en un proyecto",[13,35422,35423,73,35425,416],{},[16,35424,34632],{},[54,35426,35427],{},"Dictionary\u003Cstring, double>",[126,35429,35430,35433,35436],{},[88,35431,35432],{},"Búsquedas rápidas por clave única",[88,35434,35435],{},"Asociar un valor con otro",[88,35437,35438],{},"Ejemplo: Código de artículo → Descripción",[43,35440],{},[46,35442,35443],{"id":4024},"💻 Manos a la obra: Construyendo el proyecto",[13,35445,7975,35446,35448],{},[16,35447,33455],{}," que combina todas las colecciones.",[331,35450,35452],{"id":35451},"estructura-del-proyecto","Estructura del proyecto",[543,35454,35456],{"className":545,"code":35455,"language":547,"meta":228,"style":228},"using System;\nusing System.Collections.Generic;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class GestorListaMateriales\n{\n    \u002F\u002F ========================================\n    \u002F\u002F ESTRUCTURAS DE DATOS\n    \u002F\u002F ========================================\n\n    \u002F\u002F Lista principal de componentes\n    private List\u003CComponente> componentes;\n\n    \u002F\u002F Diccionario para búsqueda rápida por código\n    private Dictionary\u003Cstring, Componente> indiceCodigo;\n\n    \u002F\u002F Estadísticas\n    private Dictionary\u003Cstring, int> contadorPorTipo;\n\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Código principal\n    }\n}\n\n\u002F\u002F Clase auxiliar para representar un componente\npublic class Componente\n{\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public string Tipo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n    public string Fabricante { get; set; }\n\n    public Componente(string designacion, string codigo, string tipo,\n                     double corriente, double voltaje, string fabricante)\n    {\n        this.Designacion = designacion;\n        this.Codigo = codigo;\n        this.Tipo = tipo;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n        this.Fabricante = fabricante;\n    }\n\n    public override string ToString()\n    {\n        return string.Format(\"{0} - {1} ({2}A, {3}V)\",\n            Designacion, Codigo, Corriente, Voltaje);\n    }\n}\n",[54,35457,35458,35462,35467,35471,35475,35479,35484,35488,35492,35497,35501,35505,35510,35515,35519,35524,35529,35533,35538,35543,35547,35551,35555,35559,35564,35568,35572,35576,35581,35586,35590,35595,35600,35605,35610,35615,35620,35624,35629,35634,35638,35643,35648,35653,35658,35663,35668,35672,35676,35681,35685,35690,35695,35699],{"__ignoreMap":228},[551,35459,35460],{"class":553,"line":554},[551,35461,1123],{},[551,35463,35464],{"class":553,"line":229},[551,35465,35466],{},"using System.Collections.Generic;\n",[551,35468,35469],{"class":553,"line":670},[551,35470,1128],{},[551,35472,35473],{"class":553,"line":1136},[551,35474,1133],{},[551,35476,35477],{"class":553,"line":1142},[551,35478,1139],{"emptyLinePlaceholder":238},[551,35480,35481],{"class":553,"line":1148},[551,35482,35483],{},"public class GestorListaMateriales\n",[551,35485,35486],{"class":553,"line":1154},[551,35487,1151],{},[551,35489,35490],{"class":553,"line":1160},[551,35491,31505],{},[551,35493,35494],{"class":553,"line":1166},[551,35495,35496],{},"    \u002F\u002F ESTRUCTURAS DE DATOS\n",[551,35498,35499],{"class":553,"line":1172},[551,35500,31505],{},[551,35502,35503],{"class":553,"line":1178},[551,35504,1139],{"emptyLinePlaceholder":238},[551,35506,35507],{"class":553,"line":1184},[551,35508,35509],{},"    \u002F\u002F Lista principal de componentes\n",[551,35511,35512],{"class":553,"line":1190},[551,35513,35514],{},"    private List\u003CComponente> componentes;\n",[551,35516,35517],{"class":553,"line":1472},[551,35518,1139],{"emptyLinePlaceholder":238},[551,35520,35521],{"class":553,"line":1477},[551,35522,35523],{},"    \u002F\u002F Diccionario para búsqueda rápida por código\n",[551,35525,35526],{"class":553,"line":1797},[551,35527,35528],{},"    private Dictionary\u003Cstring, Componente> indiceCodigo;\n",[551,35530,35531],{"class":553,"line":1802},[551,35532,1139],{"emptyLinePlaceholder":238},[551,35534,35535],{"class":553,"line":1808},[551,35536,35537],{},"    \u002F\u002F Estadísticas\n",[551,35539,35540],{"class":553,"line":1814},[551,35541,35542],{},"    private Dictionary\u003Cstring, int> contadorPorTipo;\n",[551,35544,35545],{"class":553,"line":1820},[551,35546,1139],{"emptyLinePlaceholder":238},[551,35548,35549],{"class":553,"line":1826},[551,35550,1157],{},[551,35552,35553],{"class":553,"line":1832},[551,35554,1163],{},[551,35556,35557],{"class":553,"line":1838},[551,35558,1169],{},[551,35560,35561],{"class":553,"line":1844},[551,35562,35563],{},"        \u002F\u002F Código principal\n",[551,35565,35566],{"class":553,"line":1850},[551,35567,1187],{},[551,35569,35570],{"class":553,"line":1855},[551,35571,1193],{},[551,35573,35574],{"class":553,"line":1861},[551,35575,1139],{"emptyLinePlaceholder":238},[551,35577,35578],{"class":553,"line":1867},[551,35579,35580],{},"\u002F\u002F Clase auxiliar para representar un componente\n",[551,35582,35583],{"class":553,"line":1873},[551,35584,35585],{},"public class Componente\n",[551,35587,35588],{"class":553,"line":1878},[551,35589,1151],{},[551,35591,35592],{"class":553,"line":1883},[551,35593,35594],{},"    public string Designacion { get; set; }\n",[551,35596,35597],{"class":553,"line":1888},[551,35598,35599],{},"    public string Codigo { get; set; }\n",[551,35601,35602],{"class":553,"line":4615},[551,35603,35604],{},"    public string Tipo { get; set; }\n",[551,35606,35607],{"class":553,"line":4620},[551,35608,35609],{},"    public double Corriente { get; set; }\n",[551,35611,35612],{"class":553,"line":4626},[551,35613,35614],{},"    public double Voltaje { get; set; }\n",[551,35616,35617],{"class":553,"line":4631},[551,35618,35619],{},"    public string Fabricante { get; set; }\n",[551,35621,35622],{"class":553,"line":4636},[551,35623,1139],{"emptyLinePlaceholder":238},[551,35625,35626],{"class":553,"line":4641},[551,35627,35628],{},"    public Componente(string designacion, string codigo, string tipo,\n",[551,35630,35631],{"class":553,"line":4647},[551,35632,35633],{},"                     double corriente, double voltaje, string fabricante)\n",[551,35635,35636],{"class":553,"line":4653},[551,35637,1169],{},[551,35639,35640],{"class":553,"line":4659},[551,35641,35642],{},"        this.Designacion = designacion;\n",[551,35644,35645],{"class":553,"line":4665},[551,35646,35647],{},"        this.Codigo = codigo;\n",[551,35649,35650],{"class":553,"line":4671},[551,35651,35652],{},"        this.Tipo = tipo;\n",[551,35654,35655],{"class":553,"line":4677},[551,35656,35657],{},"        this.Corriente = corriente;\n",[551,35659,35660],{"class":553,"line":4683},[551,35661,35662],{},"        this.Voltaje = voltaje;\n",[551,35664,35665],{"class":553,"line":4689},[551,35666,35667],{},"        this.Fabricante = fabricante;\n",[551,35669,35670],{"class":553,"line":4695},[551,35671,1187],{},[551,35673,35674],{"class":553,"line":4701},[551,35675,1139],{"emptyLinePlaceholder":238},[551,35677,35678],{"class":553,"line":4707},[551,35679,35680],{},"    public override string ToString()\n",[551,35682,35683],{"class":553,"line":4713},[551,35684,1169],{},[551,35686,35687],{"class":553,"line":4719},[551,35688,35689],{},"        return string.Format(\"{0} - {1} ({2}A, {3}V)\",\n",[551,35691,35692],{"class":553,"line":4725},[551,35693,35694],{},"            Designacion, Codigo, Corriente, Voltaje);\n",[551,35696,35697],{"class":553,"line":4731},[551,35698,1187],{},[551,35700,35701],{"class":553,"line":4737},[551,35702,1193],{},[331,35704,35706],{"id":35705},"implementación-completa","Implementación completa",[13,35708,35709,35710,41],{},"El código completo está disponible en ",[54,35711,35712],{},"code\u002Fcap-09\u002FGestorListaMateriales.cs",[13,35714,35715,416],{},[16,35716,35717],{},"Funcionalidades incluidas",[85,35719,35720,35726,35732,35737,35743,35749,35755],{},[88,35721,35722,35725],{},[16,35723,35724],{},"Agregar componentes"," con validación",[88,35727,35728,35731],{},[16,35729,35730],{},"Buscar"," por designación, código, o tipo",[88,35733,35734,35736],{},[16,35735,35355],{}," componentes",[88,35738,35739,35742],{},[16,35740,35741],{},"Filtrar"," por corriente, voltaje, fabricante",[88,35744,35745,35748],{},[16,35746,35747],{},"Estadísticas",": Total, corriente total, por tipo",[88,35750,35751,35754],{},[16,35752,35753],{},"Reportes"," formateados",[88,35756,35757,35760],{},[16,35758,35759],{},"Validaciones"," (duplicados, valores incorrectos)",[43,35762],{},[46,35764,35765],{"id":4851},"🔍 Deep Dive: Entendiendo en profundidad",[331,35767,35769],{"id":35768},"complejidad-de-búsqueda","Complejidad de búsqueda",[13,35771,35772,35777],{},[16,35773,35774,35775],{},"Array y List",[33386,35776],{},": Búsqueda lineal O(n)",[543,35779,35781],{"className":545,"code":35780,"language":547,"meta":228,"style":228},"\u002F\u002F Tiene que revisar todos los elementos\nList\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"K2\", \"Q1\", \"F1\"};\nbool existe = componentes.Contains(\"F1\");  \u002F\u002F O(n) - revisa 4 elementos\n",[54,35782,35783,35788,35793],{"__ignoreMap":228},[551,35784,35785],{"class":553,"line":554},[551,35786,35787],{},"\u002F\u002F Tiene que revisar todos los elementos\n",[551,35789,35790],{"class":553,"line":229},[551,35791,35792],{},"List\u003Cstring> componentes = new List\u003Cstring> {\"K1\", \"K2\", \"Q1\", \"F1\"};\n",[551,35794,35795],{"class":553,"line":670},[551,35796,35797],{},"bool existe = componentes.Contains(\"F1\");  \u002F\u002F O(n) - revisa 4 elementos\n",[13,35799,35800,35802],{},[16,35801,34632],{},": Búsqueda por hash O(1)",[543,35804,35806],{"className":545,"code":35805,"language":547,"meta":228,"style":228},"\u002F\u002F Acceso directo mediante hash\nDictionary\u003Cstring, string> componentes = new Dictionary\u003Cstring, string>\n{\n    {\"K1\", \"Contactor\"},\n    {\"Q1\", \"Guardamotor\"}\n};\nbool existe = componentes.ContainsKey(\"K1\");  \u002F\u002F O(1) - acceso directo\n",[54,35807,35808,35813,35818,35822,35827,35832,35836],{"__ignoreMap":228},[551,35809,35810],{"class":553,"line":554},[551,35811,35812],{},"\u002F\u002F Acceso directo mediante hash\n",[551,35814,35815],{"class":553,"line":229},[551,35816,35817],{},"Dictionary\u003Cstring, string> componentes = new Dictionary\u003Cstring, string>\n",[551,35819,35820],{"class":553,"line":670},[551,35821,1151],{},[551,35823,35824],{"class":553,"line":1136},[551,35825,35826],{},"    {\"K1\", \"Contactor\"},\n",[551,35828,35829],{"class":553,"line":1142},[551,35830,35831],{},"    {\"Q1\", \"Guardamotor\"}\n",[551,35833,35834],{"class":553,"line":1148},[551,35835,18964],{},[551,35837,35838],{"class":553,"line":1154},[551,35839,35840],{},"bool existe = componentes.ContainsKey(\"K1\");  \u002F\u002F O(1) - acceso directo\n",[13,35842,35843,35846],{},[16,35844,35845],{},"Conclusión",": Para búsquedas frecuentes, usa Dictionary.",[331,35848,35850],{"id":35849},"colecciones-anidadas","Colecciones anidadas",[13,35852,35853],{},"Puedes combinar colecciones:",[543,35855,35857],{"className":545,"code":35856,"language":547,"meta":228,"style":228},"\u002F\u002F Dictionary de Lists\nDictionary\u003Cstring, List\u003Cstring>> componentesPorTipo = new Dictionary\u003Cstring, List\u003Cstring>>\n{\n    {\"Contactor\", new List\u003Cstring> {\"K1\", \"K2\", \"K3\"}},\n    {\"Guardamotor\", new List\u003Cstring> {\"Q1\", \"Q2\"}},\n    {\"Motor\", new List\u003Cstring> {\"M1\", \"M2\", \"M3\"}}\n};\n\n\u002F\u002F Acceso\nList\u003Cstring> contactores = componentesPorTipo[\"Contactor\"];\nforeach (string contactor in contactores)\n{\n    MessageBox.Show(contactor);\n}\n",[54,35858,35859,35864,35869,35873,35878,35883,35888,35892,35896,35901,35906,35911,35915,35920],{"__ignoreMap":228},[551,35860,35861],{"class":553,"line":554},[551,35862,35863],{},"\u002F\u002F Dictionary de Lists\n",[551,35865,35866],{"class":553,"line":229},[551,35867,35868],{},"Dictionary\u003Cstring, List\u003Cstring>> componentesPorTipo = new Dictionary\u003Cstring, List\u003Cstring>>\n",[551,35870,35871],{"class":553,"line":670},[551,35872,1151],{},[551,35874,35875],{"class":553,"line":1136},[551,35876,35877],{},"    {\"Contactor\", new List\u003Cstring> {\"K1\", \"K2\", \"K3\"}},\n",[551,35879,35880],{"class":553,"line":1142},[551,35881,35882],{},"    {\"Guardamotor\", new List\u003Cstring> {\"Q1\", \"Q2\"}},\n",[551,35884,35885],{"class":553,"line":1148},[551,35886,35887],{},"    {\"Motor\", new List\u003Cstring> {\"M1\", \"M2\", \"M3\"}}\n",[551,35889,35890],{"class":553,"line":1154},[551,35891,18964],{},[551,35893,35894],{"class":553,"line":1160},[551,35895,1139],{"emptyLinePlaceholder":238},[551,35897,35898],{"class":553,"line":1166},[551,35899,35900],{},"\u002F\u002F Acceso\n",[551,35902,35903],{"class":553,"line":1172},[551,35904,35905],{},"List\u003Cstring> contactores = componentesPorTipo[\"Contactor\"];\n",[551,35907,35908],{"class":553,"line":1178},[551,35909,35910],{},"foreach (string contactor in contactores)\n",[551,35912,35913],{"class":553,"line":1184},[551,35914,1151],{},[551,35916,35917],{"class":553,"line":1190},[551,35918,35919],{},"    MessageBox.Show(contactor);\n",[551,35921,35922],{"class":553,"line":1472},[551,35923,1193],{},[331,35925,35927],{"id":35926},"linq-consultas-avanzadas","LINQ: Consultas avanzadas",[13,35929,35930],{},"LINQ (Language Integrated Query) permite consultas poderosas:",[543,35932,35934],{"className":545,"code":35933,"language":547,"meta":228,"style":228},"List\u003CComponente> componentes = ObtenerComponentes();\n\n\u002F\u002F Filtrar por corriente > 20A\nvar altaCorriente = componentes.Where(c => c.Corriente > 20.0).ToList();\n\n\u002F\u002F Ordenar por corriente\nvar ordenados = componentes.OrderBy(c => c.Corriente).ToList();\n\n\u002F\u002F Obtener solo designaciones\nvar designaciones = componentes.Select(c => c.Designacion).ToList();\n\n\u002F\u002F Suma total de corrientes\ndouble corrienteTotal = componentes.Sum(c => c.Corriente);\n\n\u002F\u002F Corriente promedio\ndouble corrientePromedio = componentes.Average(c => c.Corriente);\n",[54,35935,35936,35941,35945,35950,35955,35959,35964,35969,35973,35978,35983,35987,35992,35997,36001,36006],{"__ignoreMap":228},[551,35937,35938],{"class":553,"line":554},[551,35939,35940],{},"List\u003CComponente> componentes = ObtenerComponentes();\n",[551,35942,35943],{"class":553,"line":229},[551,35944,1139],{"emptyLinePlaceholder":238},[551,35946,35947],{"class":553,"line":670},[551,35948,35949],{},"\u002F\u002F Filtrar por corriente > 20A\n",[551,35951,35952],{"class":553,"line":1136},[551,35953,35954],{},"var altaCorriente = componentes.Where(c => c.Corriente > 20.0).ToList();\n",[551,35956,35957],{"class":553,"line":1142},[551,35958,1139],{"emptyLinePlaceholder":238},[551,35960,35961],{"class":553,"line":1148},[551,35962,35963],{},"\u002F\u002F Ordenar por corriente\n",[551,35965,35966],{"class":553,"line":1154},[551,35967,35968],{},"var ordenados = componentes.OrderBy(c => c.Corriente).ToList();\n",[551,35970,35971],{"class":553,"line":1160},[551,35972,1139],{"emptyLinePlaceholder":238},[551,35974,35975],{"class":553,"line":1166},[551,35976,35977],{},"\u002F\u002F Obtener solo designaciones\n",[551,35979,35980],{"class":553,"line":1172},[551,35981,35982],{},"var designaciones = componentes.Select(c => c.Designacion).ToList();\n",[551,35984,35985],{"class":553,"line":1178},[551,35986,1139],{"emptyLinePlaceholder":238},[551,35988,35989],{"class":553,"line":1184},[551,35990,35991],{},"\u002F\u002F Suma total de corrientes\n",[551,35993,35994],{"class":553,"line":1190},[551,35995,35996],{},"double corrienteTotal = componentes.Sum(c => c.Corriente);\n",[551,35998,35999],{"class":553,"line":1472},[551,36000,1139],{"emptyLinePlaceholder":238},[551,36002,36003],{"class":553,"line":1477},[551,36004,36005],{},"\u002F\u002F Corriente promedio\n",[551,36007,36008],{"class":553,"line":1797},[551,36009,36010],{},"double corrientePromedio = componentes.Average(c => c.Corriente);\n",[43,36012],{},[46,36014,36015],{"id":22684},"📝 Resumen",[13,36017,22688],{},[126,36019,36020,36027,36034,36039,36044,36049],{},[88,36021,36022,36023,36026],{},"✅ ",[16,36024,36025],{},"Arrays",": Colecciones de tamaño fijo, acceso rápido por índice",[88,36028,36022,36029,36033],{},[16,36030,35283,36031],{},[33386,36032],{},": Colecciones dinámicas con Add\u002FRemove\u002FInsert",[88,36035,36022,36036,36038],{},[16,36037,34632],{},": Pares clave-valor para búsquedas rápidas",[88,36040,36022,36041,36043],{},[16,36042,35382],{},": Según necesidades de tamaño y búsqueda",[88,36045,36022,36046,36048],{},[16,36047,33414],{},": foreach, for, acceso directo",[88,36050,36022,36051,36053],{},[16,36052,22725],{},": Gestor completo de lista de materiales",[13,36055,36056,416],{},[16,36057,22731],{},[126,36059,36060,36063,36068,36071],{},[88,36061,36062],{},"Las colecciones permiten manejar múltiples datos relacionados",[88,36064,35283,36065],{},[33386,36066,36067],{}," es la más versátil para la mayoría de casos",[88,36069,36070],{},"Dictionary\u003CK,V> es ideal para búsquedas rápidas",[88,36072,36073],{},"Siempre valida antes de acceder (ContainsKey, TryGetValue)",[43,36075],{},[46,36077,36079],{"id":36078},"conexiones","🔗 Conexiones",[331,36081,36083],{"id":36082},"️-capítulo-anterior","⬅️ Capítulo anterior",[13,36085,36086],{},[16,36087,36088],{},"Capítulo 8: Funciones (Métodos)",[331,36090,36092],{"id":36091},"️-próximo-capítulo","➡️ Próximo capítulo",[13,36094,36095],{},[16,36096,36097],{},"Capítulo 10: Clases y objetos (POO)",[13,36099,36100],{},"En el próximo capítulo aprenderás los fundamentos de Programación Orientada a Objetos (POO): clases, objetos, propiedades, constructores, y métodos. Construirás un sistema completo de gestión de circuitos eléctricos usando principios de POO.",[43,36102],{},[46,36104,36105],{"id":10522},"📚 Recursos adicionales",[126,36107,36108,36115,36124,36131],{},[88,36109,16557,36110],{},[955,36111,36114],{"href":36112,"rel":36113},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Fprogramming-guide\u002Farrays\u002F",[959],"Documentación de C# - Arrays",[88,36116,16557,36117],{},[955,36118,36121,36122],{"href":36119,"rel":36120},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fapi\u002Fsystem.collections.generic.list-1",[959],"Documentación de C# - List",[33386,36123],{},[88,36125,16557,36126],{},[955,36127,36130],{"href":36128,"rel":36129},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fapi\u002Fsystem.collections.generic.dictionary-2",[959],"Documentación de C# - Dictionary\u003CK,V>",[88,36132,36133,36134,93,36137],{},"💻 ",[551,36135,36136],{},"Código completo",[54,36138,36139],{},"code\u002Fcap-09\u002F",[43,36141],{},[46,36143,36144],{"id":5727},"❓ Preguntas frecuentes",[331,36146,36148,36149],{"id":36147},"p-cuándo-debería-usar-un-array-en-lugar-de-list","P: ¿Cuándo debería usar un array en lugar de List",[33386,36150,36151],{},"?",[13,36153,36154,36156,36157],{},[16,36155,5737],{}," Usa arrays solo cuando el tamaño es fijo y conocido de antemano (ej. días de la semana: 7). En la mayoría de casos, List",[33386,36158,36159],{}," es mejor porque es más flexible.",[331,36161,36163],{"id":36162},"p-puedo-usar-objetos-complejos-en-colecciones","P: ¿Puedo usar objetos complejos en colecciones?",[13,36165,36166,36168,36169,4000,36172,7465],{},[16,36167,5737],{}," Sí. Puedes tener ",[54,36170,36171],{},"List\u003CComponente>",[54,36173,36174],{},"Dictionary\u003Cstring, Componente>",[331,36176,36178],{"id":36177},"p-qué-pasa-si-accedo-a-un-índice-fuera-de-rango","P: ¿Qué pasa si accedo a un índice fuera de rango?",[13,36180,36181,36183,36184,36187,36188,41],{},[16,36182,5737],{}," Se lanza una excepción ",[54,36185,36186],{},"IndexOutOfRangeException",". Siempre verifica con ",[54,36189,36190],{},"if (i \u003C lista.Count)",[331,36192,36194],{"id":36193},"p-puedo-modificar-una-lista-mientras-la-recorro-con-foreach","P: ¿Puedo modificar una lista mientras la recorro con foreach?",[13,36196,36197,36199,36200,36202],{},[16,36198,5737],{}," No. Esto causa una excepción. Si necesitas modificar, usa ",[54,36201,23258],{}," en orden inverso o crea una lista temporal.",[543,36204,36206],{"className":545,"code":36205,"language":547,"meta":228,"style":228},"\u002F\u002F Mal - causa excepción\nforeach (var item in lista)\n{\n    lista.Remove(item);  \u002F\u002F ❌ ERROR\n}\n\n\u002F\u002F Bien - usar for inverso\nfor (int i = lista.Count - 1; i >= 0; i--)\n{\n    lista.RemoveAt(i);  \u002F\u002F ✓ OK\n}\n",[54,36207,36208,36213,36218,36222,36227,36231,36235,36240,36245,36249,36254],{"__ignoreMap":228},[551,36209,36210],{"class":553,"line":554},[551,36211,36212],{},"\u002F\u002F Mal - causa excepción\n",[551,36214,36215],{"class":553,"line":229},[551,36216,36217],{},"foreach (var item in lista)\n",[551,36219,36220],{"class":553,"line":670},[551,36221,1151],{},[551,36223,36224],{"class":553,"line":1136},[551,36225,36226],{},"    lista.Remove(item);  \u002F\u002F ❌ ERROR\n",[551,36228,36229],{"class":553,"line":1142},[551,36230,1193],{},[551,36232,36233],{"class":553,"line":1148},[551,36234,1139],{"emptyLinePlaceholder":238},[551,36236,36237],{"class":553,"line":1154},[551,36238,36239],{},"\u002F\u002F Bien - usar for inverso\n",[551,36241,36242],{"class":553,"line":1160},[551,36243,36244],{},"for (int i = lista.Count - 1; i >= 0; i--)\n",[551,36246,36247],{"class":553,"line":1166},[551,36248,1151],{},[551,36250,36251],{"class":553,"line":1172},[551,36252,36253],{},"    lista.RemoveAt(i);  \u002F\u002F ✓ OK\n",[551,36255,36256],{"class":553,"line":1178},[551,36257,1193],{},[331,36259,36261],{"id":36260},"p-dictionary-permite-claves-duplicadas","P: ¿Dictionary permite claves duplicadas?",[13,36263,36264,36266,36267,36270],{},[16,36265,5737],{}," No. Cada clave debe ser única. Si intentas agregar una clave que ya existe, se lanza excepción. Usa ",[54,36268,36269],{},"ContainsKey()"," antes de agregar.",[43,36272],{},[46,36274,36275],{"id":10614},"📋 Checklist de completitud",[13,36277,10618],{},[126,36279,36281,36287,36296,36302,36308,36314,36320,36326],{"className":36280},[275],[88,36282,36284,36286],{"className":36283},[279],[281,36285],{"disabled":238,"type":283}," Entender la diferencia entre Array, List, y Dictionary",[88,36288,36290,36292,36293],{"className":36289},[279],[281,36291],{"disabled":238,"type":283}," Poder crear y manipular List",[33386,36294,36295],{}," (Add, Remove, Contains)",[88,36297,36299,36301],{"className":36298},[279],[281,36300],{"disabled":238,"type":283}," Poder usar Dictionary\u003CK,V> para búsquedas rápidas",[88,36303,36305,36307],{"className":36304},[279],[281,36306],{"disabled":238,"type":283}," Saber recorrer colecciones con foreach y for",[88,36309,36311,36313],{"className":36310},[279],[281,36312],{"disabled":238,"type":283}," Comprender cuándo usar cada tipo de colección",[88,36315,36317,36319],{"className":36316},[279],[281,36318],{"disabled":238,"type":283}," Haber ejecutado el gestor de lista de materiales",[88,36321,36323,36325],{"className":36322},[279],[281,36324],{"disabled":238,"type":283}," Poder agregar nuevas funcionalidades al gestor",[88,36327,36329,10669],{"className":36328},[279],[281,36330],{"disabled":238,"type":283},[43,36332],{},[13,36334,36335,36338],{},[16,36336,36337],{},"¿Listo para aprender Programación Orientada a Objetos? Vamos al Capítulo 10!"," 🚀",[43,36340],{},[13,36342,36343,10676,36345,36347,36348,93,36350],{},[31,36344,657],{},[31,36346,10679],{},": 60-70 minutos\n",[31,36349,10683],{},[54,36351,36139],{},[660,36353,662],{},{"title":228,"searchDepth":229,"depth":229,"links":36355},[36356,36357,36358,36359,36367,36371,36376,36377,36381,36382,36390],{"id":267,"depth":229,"text":33353},{"id":319,"depth":229,"text":33429},{"id":739,"depth":229,"text":33450},{"id":328,"depth":229,"text":33501,"children":36360},[36361,36362,36363,36365,36366],{"id":33504,"depth":670,"text":33505},{"id":33651,"depth":670,"text":33652},{"id":34077,"depth":670,"text":36364},"3. List: Colecciones dinámicas",{"id":34626,"depth":670,"text":34627},{"id":35267,"depth":670,"text":35268},{"id":4024,"depth":229,"text":35443,"children":36368},[36369,36370],{"id":35451,"depth":670,"text":35452},{"id":35705,"depth":670,"text":35706},{"id":4851,"depth":229,"text":35765,"children":36372},[36373,36374,36375],{"id":35768,"depth":670,"text":35769},{"id":35849,"depth":670,"text":35850},{"id":35926,"depth":670,"text":35927},{"id":22684,"depth":229,"text":36015},{"id":36078,"depth":229,"text":36079,"children":36378},[36379,36380],{"id":36082,"depth":670,"text":36083},{"id":36091,"depth":670,"text":36092},{"id":10522,"depth":229,"text":36105},{"id":5727,"depth":229,"text":36144,"children":36383},[36384,36386,36387,36388,36389],{"id":36147,"depth":670,"text":36385},"P: ¿Cuándo debería usar un array en lugar de List?",{"id":36162,"depth":670,"text":36163},{"id":36177,"depth":670,"text":36178},{"id":36193,"depth":670,"text":36194},{"id":36260,"depth":670,"text":36261},{"id":10614,"depth":229,"text":36275},"Colecciones en C#: listas, diccionarios y arrays para manejar datos en tus scripts EPLAN y automatizar EPLAN Electric P8.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-09-colecciones",{"title":33336,"description":36391},"guia\u002Ffundamentos\u002Fcap-09-colecciones","cGrRvXNAK6zqhfxl77K9MGgpS-wQBu_kf1-Ze1fyqRc",{"id":36398,"title":36399,"body":36400,"description":42566,"extension":236,"meta":42567,"navigation":238,"path":42568,"seo":42569,"stem":42570,"tagline":242,"__hash__":42571},"guia\u002Fguia\u002Ffundamentos\u002Fcap-10-clases-objetos-poo.md","Capítulo 10: Clases, objetos y POO en C#",{"type":7,"value":36401,"toc":42516},[36402,36412,36414,36416,36418,36487,36489,36491,36493,36506,36508,36510,36515,36518,36535,36540,36554,36556,36558,36562,36569,36574,36662,36668,36789,36794,36826,36828,36832,36836,36849,36859,36864,36870,36875,36992,36996,37182,37184,37188,37195,37199,37256,37261,37281,37285,37357,37361,37486,37490,37563,37565,37569,37577,37581,37653,37657,37739,37747,37761,37765,37889,37893,37986,37988,37992,37998,38002,38104,38108,38268,38272,38402,38404,38408,38414,38418,38574,38578,38583,38687,38692,38706,38708,38714,38719,38723,38797,38801,38914,38916,38918,38924,38928,39242,39246,39252,39269,39271,39275,39542,39544,39548,40135,40137,40139,41500,41502,41504,41508,41518,41545,41549,41560,41564,41570,41579,41585,41594,41598,41612,41616,41625,41638,41640,41696,41698,41705,41710,41715,41754,41758,41763,41768,41800,41804,41809,41816,41850,41852,41855,41859,41864,41873,41894,42076,42078,42082,42087,42100,42115,42117,42121,42126,42137,42147,42149,42151,42153,42207,42211,42230,42232,42234,42236,42241,42243,42248,42255,42257,42259,42296,42298,42300,42304,42328,42339,42353,42357,42366,42373,42380,42391,42395,42400,42404,42409,42424,42426,42428,42430,42494,42496,42501,42503,42514],[10,36403,36404],{},[13,36405,36406,19,36408,19,36410,262],{},[16,36407,256],{},[16,36409,22993],{},[16,36411,25],{},[43,36413],{},[46,36415,33353],{"id":267},[13,36417,702],{},[126,36419,36421,36430,36439,36448,36460,36469,36478],{"className":36420},[275],[88,36422,36424,73,36426,36429],{"className":36423},[279],[281,36425],{"disabled":238,"type":283},[16,36427,36428],{},"Entender qué es una clase"," y qué es un objeto (plano vs instancia)",[88,36431,36433,73,36435,36438],{"className":36432},[279],[281,36434],{"disabled":238,"type":283},[16,36436,36437],{},"Crear clases propias"," con propiedades y métodos",[88,36440,36442,73,36444,36447],{"className":36441},[279],[281,36443],{"disabled":238,"type":283},[16,36445,36446],{},"Usar constructores"," para inicializar objetos",[88,36449,36451,73,36453,36456,36457],{"className":36450},[279],[281,36452],{"disabled":238,"type":283},[16,36454,36455],{},"Instanciar objetos"," con la palabra clave ",[54,36458,36459],{},"new",[88,36461,36463,73,36465,36468],{"className":36462},[279],[281,36464],{"disabled":238,"type":283},[16,36466,36467],{},"Aplicar encapsulación básica"," con public\u002Fprivate",[88,36470,36472,73,36474,36477],{"className":36471},[279],[281,36473],{"disabled":238,"type":283},[16,36475,36476],{},"Comprender los conceptos de POO"," necesarios para trabajar con EPLAN API",[88,36479,36481,73,36483,36486],{"className":36480},[279],[281,36482],{"disabled":238,"type":283},[16,36484,36485],{},"Construir un sistema completo"," de gestión de componentes eléctricos usando POO",[43,36488],{},[46,36490,33429],{"id":319},[13,36492,726],{},[126,36494,36495,36498,36500,36503],{},[88,36496,36497],{},"✅ Haber completado el Capítulo 9",[88,36499,33439],{},[88,36501,36502],{},"✅ Saber trabajar con colecciones (List, Dictionary)",[88,36504,36505],{},"✅ Conocer tipos de datos básicos (string, int, double, bool)",[43,36507],{},[46,36509,33450],{"id":739},[13,36511,36512],{},[16,36513,36514],{},"Sistema de Gestión de Componentes Eléctricos con POO",[13,36516,36517],{},"Al final de este capítulo habrás construido un sistema orientado a objetos completo para:",[126,36519,36520,36523,36526,36529,36532],{},[88,36521,36522],{},"Modelar componentes eléctricos (Contactor, Guardamotor, Motor)",[88,36524,36525],{},"Crear circuitos con múltiples componentes",[88,36527,36528],{},"Calcular parámetros eléctricos (corriente total, potencia)",[88,36530,36531],{},"Validar compatibilidad de componentes",[88,36533,36534],{},"Generar reportes técnicos",[13,36536,36537,36539],{},[16,36538,753],{},": 70-80 minutos",[10,36541,36542],{},[13,36543,36544,36546,36547,36549,36550,36553],{},[16,36545,33487],{},":\nEn este capítulo, crearemos los objetos (contactores, motores, etc.) ",[16,36548,33491],{}," en el código instanciando las clases. Esto es intencional para comprender los fundamentos de la ",[16,36551,36552],{},"Programación Orientada a Objetos (POO)",". En capítulos posteriores, aprenderemos a crear estos objetos automáticamente a partir de los datos reales de EPLAN.",[43,36555],{},[46,36557,33501],{"id":328},[331,36559,36561],{"id":36560},"_1-introducción-por-qué-necesitamos-poo","1. Introducción: ¿Por qué necesitamos POO?",[13,36563,36564,36565,36568],{},"Hasta ahora has trabajado con variables individuales y colecciones. Pero, ¿cómo representamos un ",[16,36566,36567],{},"componente eléctrico completo"," con todos sus datos y comportamientos?",[13,36570,36571,33511],{},[16,36572,36573],{},"Enfoque sin POO",[543,36575,36577],{"className":545,"code":36576,"language":547,"meta":228,"style":228},"\u002F\u002F Contactor K1\nstring k1_designacion = \"K1\";\nstring k1_codigo = \"3RT2026-1BB40\";\ndouble k1_corriente = 25.0;\ndouble k1_voltaje = 400.0;\nstring k1_fabricante = \"Siemens\";\n\n\u002F\u002F Contactor K2\nstring k2_designacion = \"K2\";\nstring k2_codigo = \"3RT2036-1BB40\";\ndouble k2_corriente = 40.0;\ndouble k2_voltaje = 400.0;\nstring k2_fabricante = \"Siemens\";\n\n\u002F\u002F ¿Y si necesitamos 100 contactores?\n\u002F\u002F ¿Cómo agrupamos los datos de cada componente?\n\u002F\u002F ¿Cómo calculamos la corriente total?\n",[54,36578,36579,36584,36589,36594,36599,36604,36609,36613,36618,36623,36628,36633,36638,36643,36647,36652,36657],{"__ignoreMap":228},[551,36580,36581],{"class":553,"line":554},[551,36582,36583],{},"\u002F\u002F Contactor K1\n",[551,36585,36586],{"class":553,"line":229},[551,36587,36588],{},"string k1_designacion = \"K1\";\n",[551,36590,36591],{"class":553,"line":670},[551,36592,36593],{},"string k1_codigo = \"3RT2026-1BB40\";\n",[551,36595,36596],{"class":553,"line":1136},[551,36597,36598],{},"double k1_corriente = 25.0;\n",[551,36600,36601],{"class":553,"line":1142},[551,36602,36603],{},"double k1_voltaje = 400.0;\n",[551,36605,36606],{"class":553,"line":1148},[551,36607,36608],{},"string k1_fabricante = \"Siemens\";\n",[551,36610,36611],{"class":553,"line":1154},[551,36612,1139],{"emptyLinePlaceholder":238},[551,36614,36615],{"class":553,"line":1160},[551,36616,36617],{},"\u002F\u002F Contactor K2\n",[551,36619,36620],{"class":553,"line":1166},[551,36621,36622],{},"string k2_designacion = \"K2\";\n",[551,36624,36625],{"class":553,"line":1172},[551,36626,36627],{},"string k2_codigo = \"3RT2036-1BB40\";\n",[551,36629,36630],{"class":553,"line":1178},[551,36631,36632],{},"double k2_corriente = 40.0;\n",[551,36634,36635],{"class":553,"line":1184},[551,36636,36637],{},"double k2_voltaje = 400.0;\n",[551,36639,36640],{"class":553,"line":1190},[551,36641,36642],{},"string k2_fabricante = \"Siemens\";\n",[551,36644,36645],{"class":553,"line":1472},[551,36646,1139],{"emptyLinePlaceholder":238},[551,36648,36649],{"class":553,"line":1477},[551,36650,36651],{},"\u002F\u002F ¿Y si necesitamos 100 contactores?\n",[551,36653,36654],{"class":553,"line":1797},[551,36655,36656],{},"\u002F\u002F ¿Cómo agrupamos los datos de cada componente?\n",[551,36658,36659],{"class":553,"line":1802},[551,36660,36661],{},"\u002F\u002F ¿Cómo calculamos la corriente total?\n",[13,36663,36664,36667],{},[16,36665,36666],{},"Enfoque con POO"," (código organizado y escalable):",[543,36669,36671],{"className":545,"code":36670,"language":547,"meta":228,"style":228},"\u002F\u002F Crear clase Contactor\npublic class Contactor\n{\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n    public string Fabricante { get; set; }\n\n    public string ObtenerDescripcion()\n    {\n        return string.Format(\"{0} - {1} ({2}A, {3}V)\",\n            Designacion, Codigo, Corriente, Voltaje);\n    }\n}\n\n\u002F\u002F Crear objetos (instancias)\nContactor k1 = new Contactor();\nk1.Designacion = \"K1\";\nk1.Codigo = \"3RT2026-1BB40\";\nk1.Corriente = 25.0;\nk1.Voltaje = 400.0;\nk1.Fabricante = \"Siemens\";\n\nMessageBox.Show(k1.ObtenerDescripcion());\n\u002F\u002F \"K1 - 3RT2026-1BB40 (25A, 400V)\"\n",[54,36672,36673,36678,36683,36687,36691,36695,36699,36703,36707,36711,36716,36720,36724,36728,36732,36736,36740,36745,36750,36755,36760,36765,36770,36775,36779,36784],{"__ignoreMap":228},[551,36674,36675],{"class":553,"line":554},[551,36676,36677],{},"\u002F\u002F Crear clase Contactor\n",[551,36679,36680],{"class":553,"line":229},[551,36681,36682],{},"public class Contactor\n",[551,36684,36685],{"class":553,"line":670},[551,36686,1151],{},[551,36688,36689],{"class":553,"line":1136},[551,36690,35594],{},[551,36692,36693],{"class":553,"line":1142},[551,36694,35599],{},[551,36696,36697],{"class":553,"line":1148},[551,36698,35609],{},[551,36700,36701],{"class":553,"line":1154},[551,36702,35614],{},[551,36704,36705],{"class":553,"line":1160},[551,36706,35619],{},[551,36708,36709],{"class":553,"line":1166},[551,36710,1139],{"emptyLinePlaceholder":238},[551,36712,36713],{"class":553,"line":1172},[551,36714,36715],{},"    public string ObtenerDescripcion()\n",[551,36717,36718],{"class":553,"line":1178},[551,36719,1169],{},[551,36721,36722],{"class":553,"line":1184},[551,36723,35689],{},[551,36725,36726],{"class":553,"line":1190},[551,36727,35694],{},[551,36729,36730],{"class":553,"line":1472},[551,36731,1187],{},[551,36733,36734],{"class":553,"line":1477},[551,36735,1193],{},[551,36737,36738],{"class":553,"line":1797},[551,36739,1139],{"emptyLinePlaceholder":238},[551,36741,36742],{"class":553,"line":1802},[551,36743,36744],{},"\u002F\u002F Crear objetos (instancias)\n",[551,36746,36747],{"class":553,"line":1808},[551,36748,36749],{},"Contactor k1 = new Contactor();\n",[551,36751,36752],{"class":553,"line":1814},[551,36753,36754],{},"k1.Designacion = \"K1\";\n",[551,36756,36757],{"class":553,"line":1820},[551,36758,36759],{},"k1.Codigo = \"3RT2026-1BB40\";\n",[551,36761,36762],{"class":553,"line":1826},[551,36763,36764],{},"k1.Corriente = 25.0;\n",[551,36766,36767],{"class":553,"line":1832},[551,36768,36769],{},"k1.Voltaje = 400.0;\n",[551,36771,36772],{"class":553,"line":1838},[551,36773,36774],{},"k1.Fabricante = \"Siemens\";\n",[551,36776,36777],{"class":553,"line":1844},[551,36778,1139],{"emptyLinePlaceholder":238},[551,36780,36781],{"class":553,"line":1850},[551,36782,36783],{},"MessageBox.Show(k1.ObtenerDescripcion());\n",[551,36785,36786],{"class":553,"line":1855},[551,36787,36788],{},"\u002F\u002F \"K1 - 3RT2026-1BB40 (25A, 400V)\"\n",[13,36790,36791,416],{},[16,36792,36793],{},"Ventajas de POO",[126,36795,36796,36802,36808,36814,36820],{},[88,36797,36798,36801],{},[16,36799,36800],{},"Organización",": Datos y funciones relacionados juntos",[88,36803,36804,36807],{},[16,36805,36806],{},"Reutilización",": Crea plantillas (clases) y úsalas múltiples veces",[88,36809,36810,36813],{},[16,36811,36812],{},"Mantenibilidad",": Cambios centralizados",[88,36815,36816,36819],{},[16,36817,36818],{},"Escalabilidad",": Fácil agregar nuevas funcionalidades",[88,36821,36822,36825],{},[16,36823,36824],{},"Claridad",": El código se lee como el mundo real",[43,36827],{},[331,36829,36831],{"id":36830},"_2-conceptos-fundamentales","2. Conceptos fundamentales",[367,36833,36835],{"id":36834},"_21-clase-vs-objeto","2.1 Clase vs Objeto",[13,36837,36838,36841,36842,2854,36845,36848],{},[16,36839,36840],{},"Clase",": Es el ",[16,36843,36844],{},"plano",[16,36846,36847],{},"plantilla"," que define cómo será algo.",[13,36850,36851,36854,36855,36858],{},[16,36852,36853],{},"Objeto",": Es una ",[16,36856,36857],{},"instancia concreta"," creada a partir de la clase.",[13,36860,36861,416],{},[16,36862,36863],{},"Analogía con planos arquitectónicos",[543,36865,36868],{"className":36866,"code":36867,"language":847},[845],"Clase Contactor       →  Plano de un contactor (especificación)\n   ↓ instanciar\nObjeto k1             →  Contactor físico instalado en el tablero\nObjeto k2             →  Otro contactor físico del mismo tipo\n",[54,36869,36867],{"__ignoreMap":228},[13,36871,36872,416],{},[16,36873,36874],{},"Ejemplo visual",[543,36876,36878],{"className":545,"code":36877,"language":547,"meta":228,"style":228},"\u002F\u002F CLASE: Plano (definición)\npublic class Contactor\n{\n    \u002F\u002F Propiedades (datos)\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    \u002F\u002F Métodos (comportamientos)\n    public void Activar()\n    {\n        MessageBox.Show(Designacion + \" activado\");\n    }\n}\n\n\u002F\u002F OBJETOS: Instancias concretas\nContactor k1 = new Contactor();  \u002F\u002F Primer contactor\nContactor k2 = new Contactor();  \u002F\u002F Segundo contactor\nContactor k3 = new Contactor();  \u002F\u002F Tercer contactor\n\n\u002F\u002F Cada objeto tiene sus propios valores\nk1.Designacion = \"K1\";\nk1.Corriente = 25.0;\n\nk2.Designacion = \"K2\";\nk2.Corriente = 40.0;\n",[54,36879,36880,36885,36889,36893,36898,36902,36906,36910,36915,36920,36924,36929,36933,36937,36941,36946,36951,36956,36961,36965,36970,36974,36978,36982,36987],{"__ignoreMap":228},[551,36881,36882],{"class":553,"line":554},[551,36883,36884],{},"\u002F\u002F CLASE: Plano (definición)\n",[551,36886,36887],{"class":553,"line":229},[551,36888,36682],{},[551,36890,36891],{"class":553,"line":670},[551,36892,1151],{},[551,36894,36895],{"class":553,"line":1136},[551,36896,36897],{},"    \u002F\u002F Propiedades (datos)\n",[551,36899,36900],{"class":553,"line":1142},[551,36901,35594],{},[551,36903,36904],{"class":553,"line":1148},[551,36905,35609],{},[551,36907,36908],{"class":553,"line":1154},[551,36909,1139],{"emptyLinePlaceholder":238},[551,36911,36912],{"class":553,"line":1160},[551,36913,36914],{},"    \u002F\u002F Métodos (comportamientos)\n",[551,36916,36917],{"class":553,"line":1166},[551,36918,36919],{},"    public void Activar()\n",[551,36921,36922],{"class":553,"line":1172},[551,36923,1169],{},[551,36925,36926],{"class":553,"line":1178},[551,36927,36928],{},"        MessageBox.Show(Designacion + \" activado\");\n",[551,36930,36931],{"class":553,"line":1184},[551,36932,1187],{},[551,36934,36935],{"class":553,"line":1190},[551,36936,1193],{},[551,36938,36939],{"class":553,"line":1472},[551,36940,1139],{"emptyLinePlaceholder":238},[551,36942,36943],{"class":553,"line":1477},[551,36944,36945],{},"\u002F\u002F OBJETOS: Instancias concretas\n",[551,36947,36948],{"class":553,"line":1797},[551,36949,36950],{},"Contactor k1 = new Contactor();  \u002F\u002F Primer contactor\n",[551,36952,36953],{"class":553,"line":1802},[551,36954,36955],{},"Contactor k2 = new Contactor();  \u002F\u002F Segundo contactor\n",[551,36957,36958],{"class":553,"line":1808},[551,36959,36960],{},"Contactor k3 = new Contactor();  \u002F\u002F Tercer contactor\n",[551,36962,36963],{"class":553,"line":1814},[551,36964,1139],{"emptyLinePlaceholder":238},[551,36966,36967],{"class":553,"line":1820},[551,36968,36969],{},"\u002F\u002F Cada objeto tiene sus propios valores\n",[551,36971,36972],{"class":553,"line":1826},[551,36973,36754],{},[551,36975,36976],{"class":553,"line":1832},[551,36977,36764],{},[551,36979,36980],{"class":553,"line":1838},[551,36981,1139],{"emptyLinePlaceholder":238},[551,36983,36984],{"class":553,"line":1844},[551,36985,36986],{},"k2.Designacion = \"K2\";\n",[551,36988,36989],{"class":553,"line":1850},[551,36990,36991],{},"k2.Corriente = 40.0;\n",[367,36993,36995],{"id":36994},"_22-anatomía-de-una-clase","2.2 Anatomía de una clase",[543,36997,36999],{"className":545,"code":36998,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    \u002F\u002F =====================================\n    \u002F\u002F PROPIEDADES (Datos\u002FAtributos)\n    \u002F\u002F =====================================\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n\n    \u002F\u002F Propiedad privada (solo accesible dentro de la clase)\n    private bool estaActivado;\n\n    \u002F\u002F =====================================\n    \u002F\u002F CONSTRUCTOR (Inicialización)\n    \u002F\u002F =====================================\n    public Contactor(string designacion, double corriente)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.estaActivado = false;\n    }\n\n    \u002F\u002F =====================================\n    \u002F\u002F MÉTODOS (Comportamientos\u002FFunciones)\n    \u002F\u002F =====================================\n    public void Activar()\n    {\n        estaActivado = true;\n        MessageBox.Show(Designacion + \" activado\");\n    }\n\n    public double CalcularPotencia(double voltaje)\n    {\n        return Corriente * voltaje;\n    }\n\n    public string ObtenerEstado()\n    {\n        return estaActivado ? \"Activado\" : \"Desactivado\";\n    }\n}\n",[54,37000,37001,37005,37009,37014,37019,37023,37027,37031,37035,37039,37043,37048,37053,37057,37061,37066,37070,37075,37079,37083,37087,37092,37096,37100,37104,37109,37113,37117,37121,37126,37130,37134,37138,37143,37147,37152,37156,37160,37165,37169,37174,37178],{"__ignoreMap":228},[551,37002,37003],{"class":553,"line":554},[551,37004,36682],{},[551,37006,37007],{"class":553,"line":229},[551,37008,1151],{},[551,37010,37011],{"class":553,"line":670},[551,37012,37013],{},"    \u002F\u002F =====================================\n",[551,37015,37016],{"class":553,"line":1136},[551,37017,37018],{},"    \u002F\u002F PROPIEDADES (Datos\u002FAtributos)\n",[551,37020,37021],{"class":553,"line":1142},[551,37022,37013],{},[551,37024,37025],{"class":553,"line":1148},[551,37026,35594],{},[551,37028,37029],{"class":553,"line":1154},[551,37030,35599],{},[551,37032,37033],{"class":553,"line":1160},[551,37034,35609],{},[551,37036,37037],{"class":553,"line":1166},[551,37038,35614],{},[551,37040,37041],{"class":553,"line":1172},[551,37042,1139],{"emptyLinePlaceholder":238},[551,37044,37045],{"class":553,"line":1178},[551,37046,37047],{},"    \u002F\u002F Propiedad privada (solo accesible dentro de la clase)\n",[551,37049,37050],{"class":553,"line":1184},[551,37051,37052],{},"    private bool estaActivado;\n",[551,37054,37055],{"class":553,"line":1190},[551,37056,1139],{"emptyLinePlaceholder":238},[551,37058,37059],{"class":553,"line":1472},[551,37060,37013],{},[551,37062,37063],{"class":553,"line":1477},[551,37064,37065],{},"    \u002F\u002F CONSTRUCTOR (Inicialización)\n",[551,37067,37068],{"class":553,"line":1797},[551,37069,37013],{},[551,37071,37072],{"class":553,"line":1802},[551,37073,37074],{},"    public Contactor(string designacion, double corriente)\n",[551,37076,37077],{"class":553,"line":1808},[551,37078,1169],{},[551,37080,37081],{"class":553,"line":1814},[551,37082,35642],{},[551,37084,37085],{"class":553,"line":1820},[551,37086,35657],{},[551,37088,37089],{"class":553,"line":1826},[551,37090,37091],{},"        this.estaActivado = false;\n",[551,37093,37094],{"class":553,"line":1832},[551,37095,1187],{},[551,37097,37098],{"class":553,"line":1838},[551,37099,1139],{"emptyLinePlaceholder":238},[551,37101,37102],{"class":553,"line":1844},[551,37103,37013],{},[551,37105,37106],{"class":553,"line":1850},[551,37107,37108],{},"    \u002F\u002F MÉTODOS (Comportamientos\u002FFunciones)\n",[551,37110,37111],{"class":553,"line":1855},[551,37112,37013],{},[551,37114,37115],{"class":553,"line":1861},[551,37116,36919],{},[551,37118,37119],{"class":553,"line":1867},[551,37120,1169],{},[551,37122,37123],{"class":553,"line":1873},[551,37124,37125],{},"        estaActivado = true;\n",[551,37127,37128],{"class":553,"line":1878},[551,37129,36928],{},[551,37131,37132],{"class":553,"line":1883},[551,37133,1187],{},[551,37135,37136],{"class":553,"line":1888},[551,37137,1139],{"emptyLinePlaceholder":238},[551,37139,37140],{"class":553,"line":4615},[551,37141,37142],{},"    public double CalcularPotencia(double voltaje)\n",[551,37144,37145],{"class":553,"line":4620},[551,37146,1169],{},[551,37148,37149],{"class":553,"line":4626},[551,37150,37151],{},"        return Corriente * voltaje;\n",[551,37153,37154],{"class":553,"line":4631},[551,37155,1187],{},[551,37157,37158],{"class":553,"line":4636},[551,37159,1139],{"emptyLinePlaceholder":238},[551,37161,37162],{"class":553,"line":4641},[551,37163,37164],{},"    public string ObtenerEstado()\n",[551,37166,37167],{"class":553,"line":4647},[551,37168,1169],{},[551,37170,37171],{"class":553,"line":4653},[551,37172,37173],{},"        return estaActivado ? \"Activado\" : \"Desactivado\";\n",[551,37175,37176],{"class":553,"line":4659},[551,37177,1187],{},[551,37179,37180],{"class":553,"line":4665},[551,37181,1193],{},[43,37183],{},[331,37185,37187],{"id":37186},"_3-propiedades","3. Propiedades",[13,37189,37190,37191,37194],{},"Las ",[16,37192,37193],{},"propiedades"," almacenan los datos de un objeto.",[367,37196,37198],{"id":37197},"_31-propiedades-automáticas-más-común","3.1 Propiedades automáticas (más común)",[543,37200,37202],{"className":545,"code":37201,"language":547,"meta":228,"style":228},"public class Componente\n{\n    \u002F\u002F Sintaxis simplificada\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n    public string Fabricante { get; set; }\n}\n\n\u002F\u002F Uso\nComponente comp = new Componente();\ncomp.Designacion = \"K1\";              \u002F\u002F set\nstring nombre = comp.Designacion;     \u002F\u002F get\n",[54,37203,37204,37208,37212,37217,37221,37225,37229,37233,37237,37241,37246,37251],{"__ignoreMap":228},[551,37205,37206],{"class":553,"line":554},[551,37207,35585],{},[551,37209,37210],{"class":553,"line":229},[551,37211,1151],{},[551,37213,37214],{"class":553,"line":670},[551,37215,37216],{},"    \u002F\u002F Sintaxis simplificada\n",[551,37218,37219],{"class":553,"line":1136},[551,37220,35594],{},[551,37222,37223],{"class":553,"line":1142},[551,37224,35609],{},[551,37226,37227],{"class":553,"line":1148},[551,37228,35619],{},[551,37230,37231],{"class":553,"line":1154},[551,37232,1193],{},[551,37234,37235],{"class":553,"line":1160},[551,37236,1139],{"emptyLinePlaceholder":238},[551,37238,37239],{"class":553,"line":1166},[551,37240,29799],{},[551,37242,37243],{"class":553,"line":1172},[551,37244,37245],{},"Componente comp = new Componente();\n",[551,37247,37248],{"class":553,"line":1178},[551,37249,37250],{},"comp.Designacion = \"K1\";              \u002F\u002F set\n",[551,37252,37253],{"class":553,"line":1184},[551,37254,37255],{},"string nombre = comp.Designacion;     \u002F\u002F get\n",[13,37257,37258,416],{},[16,37259,37260],{},"Explicación",[126,37262,37263,37269,37275],{},[88,37264,37265,37268],{},[54,37266,37267],{},"{ get; set; }"," crea automáticamente getters y setters",[88,37270,37271,37274],{},[54,37272,37273],{},"get",": Permite leer el valor",[88,37276,37277,37280],{},[54,37278,37279],{},"set",": Permite escribir el valor",[367,37282,37284],{"id":37283},"_32-propiedades-de-solo-lectura","3.2 Propiedades de solo lectura",[543,37286,37288],{"className":545,"code":37287,"language":547,"meta":228,"style":228},"public class Componente\n{\n    \u002F\u002F Solo se puede leer, no modificar desde fuera\n    public string Codigo { get; private set; }\n\n    public Componente(string codigo)\n    {\n        this.Codigo = codigo;  \u002F\u002F Solo se asigna en el constructor\n    }\n}\n\n\u002F\u002F Uso\nComponente comp = new Componente(\"3RT2026-1BB40\");\nMessageBox.Show(comp.Codigo);     \u002F\u002F ✓ OK - lectura permitida\ncomp.Codigo = \"otro\";             \u002F\u002F ❌ ERROR - escritura no permitida\n",[54,37289,37290,37294,37298,37303,37308,37312,37317,37321,37326,37330,37334,37338,37342,37347,37352],{"__ignoreMap":228},[551,37291,37292],{"class":553,"line":554},[551,37293,35585],{},[551,37295,37296],{"class":553,"line":229},[551,37297,1151],{},[551,37299,37300],{"class":553,"line":670},[551,37301,37302],{},"    \u002F\u002F Solo se puede leer, no modificar desde fuera\n",[551,37304,37305],{"class":553,"line":1136},[551,37306,37307],{},"    public string Codigo { get; private set; }\n",[551,37309,37310],{"class":553,"line":1142},[551,37311,1139],{"emptyLinePlaceholder":238},[551,37313,37314],{"class":553,"line":1148},[551,37315,37316],{},"    public Componente(string codigo)\n",[551,37318,37319],{"class":553,"line":1154},[551,37320,1169],{},[551,37322,37323],{"class":553,"line":1160},[551,37324,37325],{},"        this.Codigo = codigo;  \u002F\u002F Solo se asigna en el constructor\n",[551,37327,37328],{"class":553,"line":1166},[551,37329,1187],{},[551,37331,37332],{"class":553,"line":1172},[551,37333,1193],{},[551,37335,37336],{"class":553,"line":1178},[551,37337,1139],{"emptyLinePlaceholder":238},[551,37339,37340],{"class":553,"line":1184},[551,37341,29799],{},[551,37343,37344],{"class":553,"line":1190},[551,37345,37346],{},"Componente comp = new Componente(\"3RT2026-1BB40\");\n",[551,37348,37349],{"class":553,"line":1472},[551,37350,37351],{},"MessageBox.Show(comp.Codigo);     \u002F\u002F ✓ OK - lectura permitida\n",[551,37353,37354],{"class":553,"line":1477},[551,37355,37356],{},"comp.Codigo = \"otro\";             \u002F\u002F ❌ ERROR - escritura no permitida\n",[367,37358,37360],{"id":37359},"_33-propiedades-calculadas","3.3 Propiedades calculadas",[543,37362,37364],{"className":545,"code":37363,"language":547,"meta":228,"style":228},"public class Motor\n{\n    public double Potencia { get; set; }       \u002F\u002F kW\n    public double Voltaje { get; set; }        \u002F\u002F V\n    public double FactorPotencia { get; set; } \u002F\u002F cosφ\n\n    \u002F\u002F Propiedad calculada (sin almacenar valor)\n    public double CorrienteNominal\n    {\n        get\n        {\n            \u002F\u002F I = P \u002F (√3 × V × cosφ)\n            return (Potencia * 1000) \u002F (1.732 * Voltaje * FactorPotencia);\n        }\n    }\n}\n\n\u002F\u002F Uso\nMotor m1 = new Motor();\nm1.Potencia = 7.5;         \u002F\u002F kW\nm1.Voltaje = 400.0;        \u002F\u002F V\nm1.FactorPotencia = 0.85;  \u002F\u002F cosφ\n\ndouble corriente = m1.CorrienteNominal;  \u002F\u002F Se calcula automáticamente\nMessageBox.Show(\"Corriente nominal: \" + corriente.ToString(\"F2\") + \"A\");\n\u002F\u002F \"Corriente nominal: 12.77A\"\n",[54,37365,37366,37371,37375,37380,37385,37390,37394,37399,37404,37408,37413,37417,37422,37427,37431,37435,37439,37443,37447,37452,37457,37462,37467,37471,37476,37481],{"__ignoreMap":228},[551,37367,37368],{"class":553,"line":554},[551,37369,37370],{},"public class Motor\n",[551,37372,37373],{"class":553,"line":229},[551,37374,1151],{},[551,37376,37377],{"class":553,"line":670},[551,37378,37379],{},"    public double Potencia { get; set; }       \u002F\u002F kW\n",[551,37381,37382],{"class":553,"line":1136},[551,37383,37384],{},"    public double Voltaje { get; set; }        \u002F\u002F V\n",[551,37386,37387],{"class":553,"line":1142},[551,37388,37389],{},"    public double FactorPotencia { get; set; } \u002F\u002F cosφ\n",[551,37391,37392],{"class":553,"line":1148},[551,37393,1139],{"emptyLinePlaceholder":238},[551,37395,37396],{"class":553,"line":1154},[551,37397,37398],{},"    \u002F\u002F Propiedad calculada (sin almacenar valor)\n",[551,37400,37401],{"class":553,"line":1160},[551,37402,37403],{},"    public double CorrienteNominal\n",[551,37405,37406],{"class":553,"line":1166},[551,37407,1169],{},[551,37409,37410],{"class":553,"line":1172},[551,37411,37412],{},"        get\n",[551,37414,37415],{"class":553,"line":1178},[551,37416,9062],{},[551,37418,37419],{"class":553,"line":1184},[551,37420,37421],{},"            \u002F\u002F I = P \u002F (√3 × V × cosφ)\n",[551,37423,37424],{"class":553,"line":1190},[551,37425,37426],{},"            return (Potencia * 1000) \u002F (1.732 * Voltaje * FactorPotencia);\n",[551,37428,37429],{"class":553,"line":1472},[551,37430,9077],{},[551,37432,37433],{"class":553,"line":1477},[551,37434,1187],{},[551,37436,37437],{"class":553,"line":1797},[551,37438,1193],{},[551,37440,37441],{"class":553,"line":1802},[551,37442,1139],{"emptyLinePlaceholder":238},[551,37444,37445],{"class":553,"line":1808},[551,37446,29799],{},[551,37448,37449],{"class":553,"line":1814},[551,37450,37451],{},"Motor m1 = new Motor();\n",[551,37453,37454],{"class":553,"line":1820},[551,37455,37456],{},"m1.Potencia = 7.5;         \u002F\u002F kW\n",[551,37458,37459],{"class":553,"line":1826},[551,37460,37461],{},"m1.Voltaje = 400.0;        \u002F\u002F V\n",[551,37463,37464],{"class":553,"line":1832},[551,37465,37466],{},"m1.FactorPotencia = 0.85;  \u002F\u002F cosφ\n",[551,37468,37469],{"class":553,"line":1838},[551,37470,1139],{"emptyLinePlaceholder":238},[551,37472,37473],{"class":553,"line":1844},[551,37474,37475],{},"double corriente = m1.CorrienteNominal;  \u002F\u002F Se calcula automáticamente\n",[551,37477,37478],{"class":553,"line":1850},[551,37479,37480],{},"MessageBox.Show(\"Corriente nominal: \" + corriente.ToString(\"F2\") + \"A\");\n",[551,37482,37483],{"class":553,"line":1855},[551,37484,37485],{},"\u002F\u002F \"Corriente nominal: 12.77A\"\n",[367,37487,37489],{"id":37488},"_34-valores-por-defecto","3.4 Valores por defecto",[543,37491,37493],{"className":545,"code":37492,"language":547,"meta":228,"style":228},"public class Guardamotor\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    \u002F\u002F Valores por defecto\n    public string Tipo { get; set; } = \"Guardamotor\";\n    public int Polos { get; set; } = 3;\n    public bool ConAuxiliar { get; set; } = false;\n}\n\n\u002F\u002F Uso\nGuardamotor q1 = new Guardamotor();\nMessageBox.Show(q1.Tipo);      \u002F\u002F \"Guardamotor\"\nMessageBox.Show(q1.Polos.ToString());  \u002F\u002F \"3\"\n",[54,37494,37495,37500,37504,37508,37512,37516,37521,37526,37531,37536,37540,37544,37548,37553,37558],{"__ignoreMap":228},[551,37496,37497],{"class":553,"line":554},[551,37498,37499],{},"public class Guardamotor\n",[551,37501,37502],{"class":553,"line":229},[551,37503,1151],{},[551,37505,37506],{"class":553,"line":670},[551,37507,35594],{},[551,37509,37510],{"class":553,"line":1136},[551,37511,35609],{},[551,37513,37514],{"class":553,"line":1142},[551,37515,1139],{"emptyLinePlaceholder":238},[551,37517,37518],{"class":553,"line":1148},[551,37519,37520],{},"    \u002F\u002F Valores por defecto\n",[551,37522,37523],{"class":553,"line":1154},[551,37524,37525],{},"    public string Tipo { get; set; } = \"Guardamotor\";\n",[551,37527,37528],{"class":553,"line":1160},[551,37529,37530],{},"    public int Polos { get; set; } = 3;\n",[551,37532,37533],{"class":553,"line":1166},[551,37534,37535],{},"    public bool ConAuxiliar { get; set; } = false;\n",[551,37537,37538],{"class":553,"line":1172},[551,37539,1193],{},[551,37541,37542],{"class":553,"line":1178},[551,37543,1139],{"emptyLinePlaceholder":238},[551,37545,37546],{"class":553,"line":1184},[551,37547,29799],{},[551,37549,37550],{"class":553,"line":1190},[551,37551,37552],{},"Guardamotor q1 = new Guardamotor();\n",[551,37554,37555],{"class":553,"line":1472},[551,37556,37557],{},"MessageBox.Show(q1.Tipo);      \u002F\u002F \"Guardamotor\"\n",[551,37559,37560],{"class":553,"line":1477},[551,37561,37562],{},"MessageBox.Show(q1.Polos.ToString());  \u002F\u002F \"3\"\n",[43,37564],{},[331,37566,37568],{"id":37567},"_4-constructores","4. Constructores",[13,37570,30790,37571,37574,37575,41],{},[16,37572,37573],{},"constructor"," es un método especial que se ejecuta al crear un objeto con ",[54,37576,36459],{},[367,37578,37580],{"id":37579},"_41-constructor-sin-parámetros-por-defecto","4.1 Constructor sin parámetros (por defecto)",[543,37582,37584],{"className":545,"code":37583,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    \u002F\u002F Constructor vacío (opcional, se crea automáticamente si no lo defines)\n    public Contactor()\n    {\n        \u002F\u002F Inicialización vacía\n    }\n}\n\n\u002F\u002F Uso\nContactor k1 = new Contactor();\nk1.Designacion = \"K1\";\nk1.Corriente = 25.0;\n",[54,37585,37586,37590,37594,37598,37602,37606,37611,37616,37620,37625,37629,37633,37637,37641,37645,37649],{"__ignoreMap":228},[551,37587,37588],{"class":553,"line":554},[551,37589,36682],{},[551,37591,37592],{"class":553,"line":229},[551,37593,1151],{},[551,37595,37596],{"class":553,"line":670},[551,37597,35594],{},[551,37599,37600],{"class":553,"line":1136},[551,37601,35609],{},[551,37603,37604],{"class":553,"line":1142},[551,37605,1139],{"emptyLinePlaceholder":238},[551,37607,37608],{"class":553,"line":1148},[551,37609,37610],{},"    \u002F\u002F Constructor vacío (opcional, se crea automáticamente si no lo defines)\n",[551,37612,37613],{"class":553,"line":1154},[551,37614,37615],{},"    public Contactor()\n",[551,37617,37618],{"class":553,"line":1160},[551,37619,1169],{},[551,37621,37622],{"class":553,"line":1166},[551,37623,37624],{},"        \u002F\u002F Inicialización vacía\n",[551,37626,37627],{"class":553,"line":1172},[551,37628,1187],{},[551,37630,37631],{"class":553,"line":1178},[551,37632,1193],{},[551,37634,37635],{"class":553,"line":1184},[551,37636,1139],{"emptyLinePlaceholder":238},[551,37638,37639],{"class":553,"line":1190},[551,37640,29799],{},[551,37642,37643],{"class":553,"line":1472},[551,37644,36749],{},[551,37646,37647],{"class":553,"line":1477},[551,37648,36754],{},[551,37650,37651],{"class":553,"line":1797},[551,37652,36764],{},[367,37654,37656],{"id":37655},"_42-constructor-con-parámetros-recomendado","4.2 Constructor con parámetros (recomendado)",[543,37658,37660],{"className":545,"code":37659,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n\n    \u002F\u002F Constructor con parámetros\n    public Contactor(string designacion, double corriente, double voltaje)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n    }\n}\n\n\u002F\u002F Uso (más limpio y seguro)\nContactor k1 = new Contactor(\"K1\", 25.0, 400.0);\nMessageBox.Show(k1.Designacion);  \u002F\u002F \"K1\"\n",[54,37661,37662,37666,37670,37674,37678,37682,37686,37691,37696,37700,37704,37708,37712,37716,37720,37724,37729,37734],{"__ignoreMap":228},[551,37663,37664],{"class":553,"line":554},[551,37665,36682],{},[551,37667,37668],{"class":553,"line":229},[551,37669,1151],{},[551,37671,37672],{"class":553,"line":670},[551,37673,35594],{},[551,37675,37676],{"class":553,"line":1136},[551,37677,35609],{},[551,37679,37680],{"class":553,"line":1142},[551,37681,35614],{},[551,37683,37684],{"class":553,"line":1148},[551,37685,1139],{"emptyLinePlaceholder":238},[551,37687,37688],{"class":553,"line":1154},[551,37689,37690],{},"    \u002F\u002F Constructor con parámetros\n",[551,37692,37693],{"class":553,"line":1160},[551,37694,37695],{},"    public Contactor(string designacion, double corriente, double voltaje)\n",[551,37697,37698],{"class":553,"line":1166},[551,37699,1169],{},[551,37701,37702],{"class":553,"line":1172},[551,37703,35642],{},[551,37705,37706],{"class":553,"line":1178},[551,37707,35657],{},[551,37709,37710],{"class":553,"line":1184},[551,37711,35662],{},[551,37713,37714],{"class":553,"line":1190},[551,37715,1187],{},[551,37717,37718],{"class":553,"line":1472},[551,37719,1193],{},[551,37721,37722],{"class":553,"line":1477},[551,37723,1139],{"emptyLinePlaceholder":238},[551,37725,37726],{"class":553,"line":1797},[551,37727,37728],{},"\u002F\u002F Uso (más limpio y seguro)\n",[551,37730,37731],{"class":553,"line":1802},[551,37732,37733],{},"Contactor k1 = new Contactor(\"K1\", 25.0, 400.0);\n",[551,37735,37736],{"class":553,"line":1808},[551,37737,37738],{},"MessageBox.Show(k1.Designacion);  \u002F\u002F \"K1\"\n",[13,37740,37741,416],{},[16,37742,37743,37744],{},"La palabra clave ",[54,37745,37746],{},"this",[126,37748,37749,37755],{},[88,37750,37751,37754],{},[54,37752,37753],{},"this.Designacion"," se refiere a la propiedad del objeto",[88,37756,37757,37760],{},[54,37758,37759],{},"designacion"," (sin this) se refiere al parámetro del constructor",[367,37762,37764],{"id":37763},"_43-múltiples-constructores-sobrecarga","4.3 Múltiples constructores (sobrecarga)",[543,37766,37768],{"className":545,"code":37767,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n\n    \u002F\u002F Constructor 1: Solo designación y corriente\n    public Contactor(string designacion, double corriente)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.Voltaje = 400.0;  \u002F\u002F Valor por defecto\n    }\n\n    \u002F\u002F Constructor 2: Todos los parámetros\n    public Contactor(string designacion, string codigo, double corriente, double voltaje)\n    {\n        this.Designacion = designacion;\n        this.Codigo = codigo;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n    }\n}\n\n\u002F\u002F Uso de diferentes constructores\nContactor k1 = new Contactor(\"K1\", 25.0);\nContactor k2 = new Contactor(\"K2\", \"3RT2036-1BB40\", 40.0, 400.0);\n",[54,37769,37770,37774,37778,37782,37786,37790,37794,37798,37803,37807,37811,37815,37819,37824,37828,37832,37837,37842,37846,37850,37854,37858,37862,37866,37870,37874,37879,37884],{"__ignoreMap":228},[551,37771,37772],{"class":553,"line":554},[551,37773,36682],{},[551,37775,37776],{"class":553,"line":229},[551,37777,1151],{},[551,37779,37780],{"class":553,"line":670},[551,37781,35594],{},[551,37783,37784],{"class":553,"line":1136},[551,37785,35599],{},[551,37787,37788],{"class":553,"line":1142},[551,37789,35609],{},[551,37791,37792],{"class":553,"line":1148},[551,37793,35614],{},[551,37795,37796],{"class":553,"line":1154},[551,37797,1139],{"emptyLinePlaceholder":238},[551,37799,37800],{"class":553,"line":1160},[551,37801,37802],{},"    \u002F\u002F Constructor 1: Solo designación y corriente\n",[551,37804,37805],{"class":553,"line":1166},[551,37806,37074],{},[551,37808,37809],{"class":553,"line":1172},[551,37810,1169],{},[551,37812,37813],{"class":553,"line":1178},[551,37814,35642],{},[551,37816,37817],{"class":553,"line":1184},[551,37818,35657],{},[551,37820,37821],{"class":553,"line":1190},[551,37822,37823],{},"        this.Voltaje = 400.0;  \u002F\u002F Valor por defecto\n",[551,37825,37826],{"class":553,"line":1472},[551,37827,1187],{},[551,37829,37830],{"class":553,"line":1477},[551,37831,1139],{"emptyLinePlaceholder":238},[551,37833,37834],{"class":553,"line":1797},[551,37835,37836],{},"    \u002F\u002F Constructor 2: Todos los parámetros\n",[551,37838,37839],{"class":553,"line":1802},[551,37840,37841],{},"    public Contactor(string designacion, string codigo, double corriente, double voltaje)\n",[551,37843,37844],{"class":553,"line":1808},[551,37845,1169],{},[551,37847,37848],{"class":553,"line":1814},[551,37849,35642],{},[551,37851,37852],{"class":553,"line":1820},[551,37853,35647],{},[551,37855,37856],{"class":553,"line":1826},[551,37857,35657],{},[551,37859,37860],{"class":553,"line":1832},[551,37861,35662],{},[551,37863,37864],{"class":553,"line":1838},[551,37865,1187],{},[551,37867,37868],{"class":553,"line":1844},[551,37869,1193],{},[551,37871,37872],{"class":553,"line":1850},[551,37873,1139],{"emptyLinePlaceholder":238},[551,37875,37876],{"class":553,"line":1855},[551,37877,37878],{},"\u002F\u002F Uso de diferentes constructores\n",[551,37880,37881],{"class":553,"line":1861},[551,37882,37883],{},"Contactor k1 = new Contactor(\"K1\", 25.0);\n",[551,37885,37886],{"class":553,"line":1867},[551,37887,37888],{},"Contactor k2 = new Contactor(\"K2\", \"3RT2036-1BB40\", 40.0, 400.0);\n",[367,37890,37892],{"id":37891},"_44-llamar-a-otro-constructor-this","4.4 Llamar a otro constructor (this)",[543,37894,37896],{"className":545,"code":37895,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n\n    \u002F\u002F Constructor principal\n    public Contactor(string designacion, double corriente, double voltaje)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n    }\n\n    \u002F\u002F Constructor simplificado que llama al principal\n    public Contactor(string designacion, double corriente)\n        : this(designacion, corriente, 400.0)  \u002F\u002F Llama al constructor principal\n    {\n        \u002F\u002F Voltaje = 400V por defecto\n    }\n}\n",[54,37897,37898,37902,37906,37910,37914,37918,37922,37927,37931,37935,37939,37943,37947,37951,37955,37960,37964,37969,37973,37978,37982],{"__ignoreMap":228},[551,37899,37900],{"class":553,"line":554},[551,37901,36682],{},[551,37903,37904],{"class":553,"line":229},[551,37905,1151],{},[551,37907,37908],{"class":553,"line":670},[551,37909,35594],{},[551,37911,37912],{"class":553,"line":1136},[551,37913,35609],{},[551,37915,37916],{"class":553,"line":1142},[551,37917,35614],{},[551,37919,37920],{"class":553,"line":1148},[551,37921,1139],{"emptyLinePlaceholder":238},[551,37923,37924],{"class":553,"line":1154},[551,37925,37926],{},"    \u002F\u002F Constructor principal\n",[551,37928,37929],{"class":553,"line":1160},[551,37930,37695],{},[551,37932,37933],{"class":553,"line":1166},[551,37934,1169],{},[551,37936,37937],{"class":553,"line":1172},[551,37938,35642],{},[551,37940,37941],{"class":553,"line":1178},[551,37942,35657],{},[551,37944,37945],{"class":553,"line":1184},[551,37946,35662],{},[551,37948,37949],{"class":553,"line":1190},[551,37950,1187],{},[551,37952,37953],{"class":553,"line":1472},[551,37954,1139],{"emptyLinePlaceholder":238},[551,37956,37957],{"class":553,"line":1477},[551,37958,37959],{},"    \u002F\u002F Constructor simplificado que llama al principal\n",[551,37961,37962],{"class":553,"line":1797},[551,37963,37074],{},[551,37965,37966],{"class":553,"line":1802},[551,37967,37968],{},"        : this(designacion, corriente, 400.0)  \u002F\u002F Llama al constructor principal\n",[551,37970,37971],{"class":553,"line":1808},[551,37972,1169],{},[551,37974,37975],{"class":553,"line":1814},[551,37976,37977],{},"        \u002F\u002F Voltaje = 400V por defecto\n",[551,37979,37980],{"class":553,"line":1820},[551,37981,1187],{},[551,37983,37984],{"class":553,"line":1826},[551,37985,1193],{},[43,37987],{},[331,37989,37991],{"id":37990},"_5-métodos","5. Métodos",[13,37993,21963,37994,37997],{},[16,37995,37996],{},"métodos"," son las funciones que definen el comportamiento de un objeto.",[367,37999,38001],{"id":38000},"_51-métodos-sin-retorno-void","5.1 Métodos sin retorno (void)",[543,38003,38005],{"className":545,"code":38004,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    private bool estaActivado;\n\n    public void Activar()\n    {\n        estaActivado = true;\n        MessageBox.Show(Designacion + \" activado\");\n    }\n\n    public void Desactivar()\n    {\n        estaActivado = false;\n        MessageBox.Show(Designacion + \" desactivado\");\n    }\n}\n\n\u002F\u002F Uso\nContactor k1 = new Contactor();\nk1.Designacion = \"K1\";\nk1.Activar();      \u002F\u002F Muestra mensaje\nk1.Desactivar();   \u002F\u002F Muestra mensaje\n",[54,38006,38007,38011,38015,38019,38023,38027,38031,38035,38039,38043,38047,38051,38056,38060,38065,38070,38074,38078,38082,38086,38090,38094,38099],{"__ignoreMap":228},[551,38008,38009],{"class":553,"line":554},[551,38010,36682],{},[551,38012,38013],{"class":553,"line":229},[551,38014,1151],{},[551,38016,38017],{"class":553,"line":670},[551,38018,35594],{},[551,38020,38021],{"class":553,"line":1136},[551,38022,37052],{},[551,38024,38025],{"class":553,"line":1142},[551,38026,1139],{"emptyLinePlaceholder":238},[551,38028,38029],{"class":553,"line":1148},[551,38030,36919],{},[551,38032,38033],{"class":553,"line":1154},[551,38034,1169],{},[551,38036,38037],{"class":553,"line":1160},[551,38038,37125],{},[551,38040,38041],{"class":553,"line":1166},[551,38042,36928],{},[551,38044,38045],{"class":553,"line":1172},[551,38046,1187],{},[551,38048,38049],{"class":553,"line":1178},[551,38050,1139],{"emptyLinePlaceholder":238},[551,38052,38053],{"class":553,"line":1184},[551,38054,38055],{},"    public void Desactivar()\n",[551,38057,38058],{"class":553,"line":1190},[551,38059,1169],{},[551,38061,38062],{"class":553,"line":1472},[551,38063,38064],{},"        estaActivado = false;\n",[551,38066,38067],{"class":553,"line":1477},[551,38068,38069],{},"        MessageBox.Show(Designacion + \" desactivado\");\n",[551,38071,38072],{"class":553,"line":1797},[551,38073,1187],{},[551,38075,38076],{"class":553,"line":1802},[551,38077,1193],{},[551,38079,38080],{"class":553,"line":1808},[551,38081,1139],{"emptyLinePlaceholder":238},[551,38083,38084],{"class":553,"line":1814},[551,38085,29799],{},[551,38087,38088],{"class":553,"line":1820},[551,38089,36749],{},[551,38091,38092],{"class":553,"line":1826},[551,38093,36754],{},[551,38095,38096],{"class":553,"line":1832},[551,38097,38098],{},"k1.Activar();      \u002F\u002F Muestra mensaje\n",[551,38100,38101],{"class":553,"line":1838},[551,38102,38103],{},"k1.Desactivar();   \u002F\u002F Muestra mensaje\n",[367,38105,38107],{"id":38106},"_52-métodos-con-retorno","5.2 Métodos con retorno",[543,38109,38111],{"className":545,"code":38110,"language":547,"meta":228,"style":228},"public class Motor\n{\n    public double Potencia { get; set; }  \u002F\u002F kW\n    public double Voltaje { get; set; }   \u002F\u002F V\n\n    \u002F\u002F Método que retorna un valor\n    public double CalcularCorriente(double factorPotencia)\n    {\n        \u002F\u002F I = P \u002F (√3 × V × cosφ)\n        double corriente = (Potencia * 1000) \u002F (1.732 * Voltaje * factorPotencia);\n        return corriente;\n    }\n\n    public string ObtenerClasificacion()\n    {\n        if (Potencia \u003C 1.0)\n            return \"Motor pequeño\";\n        else if (Potencia \u003C 10.0)\n            return \"Motor mediano\";\n        else\n            return \"Motor grande\";\n    }\n}\n\n\u002F\u002F Uso\nMotor m1 = new Motor();\nm1.Potencia = 7.5;\nm1.Voltaje = 400.0;\n\ndouble corriente = m1.CalcularCorriente(0.85);\nMessageBox.Show(\"Corriente: \" + corriente.ToString(\"F2\") + \"A\");\n\nstring clasificacion = m1.ObtenerClasificacion();\nMessageBox.Show(\"Clasificación: \" + clasificacion);  \u002F\u002F \"Motor mediano\"\n",[54,38112,38113,38117,38121,38126,38131,38135,38140,38145,38149,38154,38159,38164,38168,38172,38177,38181,38186,38191,38196,38201,38205,38210,38214,38218,38222,38226,38230,38235,38240,38244,38249,38254,38258,38263],{"__ignoreMap":228},[551,38114,38115],{"class":553,"line":554},[551,38116,37370],{},[551,38118,38119],{"class":553,"line":229},[551,38120,1151],{},[551,38122,38123],{"class":553,"line":670},[551,38124,38125],{},"    public double Potencia { get; set; }  \u002F\u002F kW\n",[551,38127,38128],{"class":553,"line":1136},[551,38129,38130],{},"    public double Voltaje { get; set; }   \u002F\u002F V\n",[551,38132,38133],{"class":553,"line":1142},[551,38134,1139],{"emptyLinePlaceholder":238},[551,38136,38137],{"class":553,"line":1148},[551,38138,38139],{},"    \u002F\u002F Método que retorna un valor\n",[551,38141,38142],{"class":553,"line":1154},[551,38143,38144],{},"    public double CalcularCorriente(double factorPotencia)\n",[551,38146,38147],{"class":553,"line":1160},[551,38148,1169],{},[551,38150,38151],{"class":553,"line":1166},[551,38152,38153],{},"        \u002F\u002F I = P \u002F (√3 × V × cosφ)\n",[551,38155,38156],{"class":553,"line":1172},[551,38157,38158],{},"        double corriente = (Potencia * 1000) \u002F (1.732 * Voltaje * factorPotencia);\n",[551,38160,38161],{"class":553,"line":1178},[551,38162,38163],{},"        return corriente;\n",[551,38165,38166],{"class":553,"line":1184},[551,38167,1187],{},[551,38169,38170],{"class":553,"line":1190},[551,38171,1139],{"emptyLinePlaceholder":238},[551,38173,38174],{"class":553,"line":1472},[551,38175,38176],{},"    public string ObtenerClasificacion()\n",[551,38178,38179],{"class":553,"line":1477},[551,38180,1169],{},[551,38182,38183],{"class":553,"line":1797},[551,38184,38185],{},"        if (Potencia \u003C 1.0)\n",[551,38187,38188],{"class":553,"line":1802},[551,38189,38190],{},"            return \"Motor pequeño\";\n",[551,38192,38193],{"class":553,"line":1808},[551,38194,38195],{},"        else if (Potencia \u003C 10.0)\n",[551,38197,38198],{"class":553,"line":1814},[551,38199,38200],{},"            return \"Motor mediano\";\n",[551,38202,38203],{"class":553,"line":1820},[551,38204,9082],{},[551,38206,38207],{"class":553,"line":1826},[551,38208,38209],{},"            return \"Motor grande\";\n",[551,38211,38212],{"class":553,"line":1832},[551,38213,1187],{},[551,38215,38216],{"class":553,"line":1838},[551,38217,1193],{},[551,38219,38220],{"class":553,"line":1844},[551,38221,1139],{"emptyLinePlaceholder":238},[551,38223,38224],{"class":553,"line":1850},[551,38225,29799],{},[551,38227,38228],{"class":553,"line":1855},[551,38229,37451],{},[551,38231,38232],{"class":553,"line":1861},[551,38233,38234],{},"m1.Potencia = 7.5;\n",[551,38236,38237],{"class":553,"line":1867},[551,38238,38239],{},"m1.Voltaje = 400.0;\n",[551,38241,38242],{"class":553,"line":1873},[551,38243,1139],{"emptyLinePlaceholder":238},[551,38245,38246],{"class":553,"line":1878},[551,38247,38248],{},"double corriente = m1.CalcularCorriente(0.85);\n",[551,38250,38251],{"class":553,"line":1883},[551,38252,38253],{},"MessageBox.Show(\"Corriente: \" + corriente.ToString(\"F2\") + \"A\");\n",[551,38255,38256],{"class":553,"line":1888},[551,38257,1139],{"emptyLinePlaceholder":238},[551,38259,38260],{"class":553,"line":4615},[551,38261,38262],{},"string clasificacion = m1.ObtenerClasificacion();\n",[551,38264,38265],{"class":553,"line":4620},[551,38266,38267],{},"MessageBox.Show(\"Clasificación: \" + clasificacion);  \u002F\u002F \"Motor mediano\"\n",[367,38269,38271],{"id":38270},"_53-métodos-con-parámetros-opcionales","5.3 Métodos con parámetros opcionales",[543,38273,38275],{"className":545,"code":38274,"language":547,"meta":228,"style":228},"public class Componente\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    \u002F\u002F Parámetros opcionales con valores por defecto\n    public string GenerarEtiqueta(bool incluirCorriente = true, string prefijo = \"\")\n    {\n        string etiqueta = prefijo + Designacion;\n\n        if (incluirCorriente)\n        {\n            etiqueta += \" (\" + Corriente + \"A)\";\n        }\n\n        return etiqueta;\n    }\n}\n\n\u002F\u002F Uso\nComponente c = new Componente();\nc.Designacion = \"K1\";\nc.Corriente = 25.0;\n\nMessageBox.Show(c.GenerarEtiqueta());                    \u002F\u002F \"K1 (25A)\"\nMessageBox.Show(c.GenerarEtiqueta(false));               \u002F\u002F \"K1\"\nMessageBox.Show(c.GenerarEtiqueta(true, \"CONT-\"));       \u002F\u002F \"CONT-K1 (25A)\"\nMessageBox.Show(c.GenerarEtiqueta(prefijo: \"CONT-\"));    \u002F\u002F \"CONT-K1 (25A)\"\n",[54,38276,38277,38281,38285,38289,38293,38297,38302,38307,38311,38316,38320,38325,38329,38334,38338,38342,38347,38351,38355,38359,38363,38368,38373,38378,38382,38387,38392,38397],{"__ignoreMap":228},[551,38278,38279],{"class":553,"line":554},[551,38280,35585],{},[551,38282,38283],{"class":553,"line":229},[551,38284,1151],{},[551,38286,38287],{"class":553,"line":670},[551,38288,35594],{},[551,38290,38291],{"class":553,"line":1136},[551,38292,35609],{},[551,38294,38295],{"class":553,"line":1142},[551,38296,1139],{"emptyLinePlaceholder":238},[551,38298,38299],{"class":553,"line":1148},[551,38300,38301],{},"    \u002F\u002F Parámetros opcionales con valores por defecto\n",[551,38303,38304],{"class":553,"line":1154},[551,38305,38306],{},"    public string GenerarEtiqueta(bool incluirCorriente = true, string prefijo = \"\")\n",[551,38308,38309],{"class":553,"line":1160},[551,38310,1169],{},[551,38312,38313],{"class":553,"line":1166},[551,38314,38315],{},"        string etiqueta = prefijo + Designacion;\n",[551,38317,38318],{"class":553,"line":1172},[551,38319,1139],{"emptyLinePlaceholder":238},[551,38321,38322],{"class":553,"line":1178},[551,38323,38324],{},"        if (incluirCorriente)\n",[551,38326,38327],{"class":553,"line":1184},[551,38328,9062],{},[551,38330,38331],{"class":553,"line":1190},[551,38332,38333],{},"            etiqueta += \" (\" + Corriente + \"A)\";\n",[551,38335,38336],{"class":553,"line":1472},[551,38337,9077],{},[551,38339,38340],{"class":553,"line":1477},[551,38341,1139],{"emptyLinePlaceholder":238},[551,38343,38344],{"class":553,"line":1797},[551,38345,38346],{},"        return etiqueta;\n",[551,38348,38349],{"class":553,"line":1802},[551,38350,1187],{},[551,38352,38353],{"class":553,"line":1808},[551,38354,1193],{},[551,38356,38357],{"class":553,"line":1814},[551,38358,1139],{"emptyLinePlaceholder":238},[551,38360,38361],{"class":553,"line":1820},[551,38362,29799],{},[551,38364,38365],{"class":553,"line":1826},[551,38366,38367],{},"Componente c = new Componente();\n",[551,38369,38370],{"class":553,"line":1832},[551,38371,38372],{},"c.Designacion = \"K1\";\n",[551,38374,38375],{"class":553,"line":1838},[551,38376,38377],{},"c.Corriente = 25.0;\n",[551,38379,38380],{"class":553,"line":1844},[551,38381,1139],{"emptyLinePlaceholder":238},[551,38383,38384],{"class":553,"line":1850},[551,38385,38386],{},"MessageBox.Show(c.GenerarEtiqueta());                    \u002F\u002F \"K1 (25A)\"\n",[551,38388,38389],{"class":553,"line":1855},[551,38390,38391],{},"MessageBox.Show(c.GenerarEtiqueta(false));               \u002F\u002F \"K1\"\n",[551,38393,38394],{"class":553,"line":1861},[551,38395,38396],{},"MessageBox.Show(c.GenerarEtiqueta(true, \"CONT-\"));       \u002F\u002F \"CONT-K1 (25A)\"\n",[551,38398,38399],{"class":553,"line":1867},[551,38400,38401],{},"MessageBox.Show(c.GenerarEtiqueta(prefijo: \"CONT-\"));    \u002F\u002F \"CONT-K1 (25A)\"\n",[43,38403],{},[331,38405,38407],{"id":38406},"_6-encapsulación-public-vs-private","6. Encapsulación: public vs private",[13,38409,31129,38410,38413],{},[16,38411,38412],{},"encapsulación"," es el principio de ocultar detalles internos y exponer solo lo necesario.",[367,38415,38417],{"id":38416},"_61-modificadores-de-acceso","6.1 Modificadores de acceso",[543,38419,38421],{"className":545,"code":38420,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    \u002F\u002F PUBLIC: Accesible desde fuera de la clase\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    \u002F\u002F PRIVATE: Solo accesible dentro de la clase\n    private bool estaActivado;\n    private int contadorActivaciones;\n\n    public void Activar()\n    {\n        estaActivado = true;              \u002F\u002F ✓ OK - acceso interno\n        contadorActivaciones++;           \u002F\u002F ✓ OK - acceso interno\n        MessageBox.Show(Designacion + \" activado\");\n    }\n\n    public int ObtenerContadorActivaciones()\n    {\n        return contadorActivaciones;      \u002F\u002F ✓ OK - retornar valor privado\n    }\n}\n\n\u002F\u002F Uso\nContactor k1 = new Contactor();\nk1.Designacion = \"K1\";           \u002F\u002F ✓ OK - public\nk1.Activar();                    \u002F\u002F ✓ OK - public\n\nint contador = k1.ObtenerContadorActivaciones();  \u002F\u002F ✓ OK - método public\nMessageBox.Show(\"Activaciones: \" + contador);\n\n\u002F\u002F k1.estaActivado = true;       \u002F\u002F ❌ ERROR - private no accesible\n\u002F\u002F k1.contadorActivaciones++;    \u002F\u002F ❌ ERROR - private no accesible\n",[54,38422,38423,38427,38431,38436,38440,38444,38448,38453,38457,38462,38466,38470,38474,38479,38484,38488,38492,38496,38501,38505,38510,38514,38518,38522,38526,38530,38535,38540,38544,38549,38554,38558,38566],{"__ignoreMap":228},[551,38424,38425],{"class":553,"line":554},[551,38426,36682],{},[551,38428,38429],{"class":553,"line":229},[551,38430,1151],{},[551,38432,38433],{"class":553,"line":670},[551,38434,38435],{},"    \u002F\u002F PUBLIC: Accesible desde fuera de la clase\n",[551,38437,38438],{"class":553,"line":1136},[551,38439,35594],{},[551,38441,38442],{"class":553,"line":1142},[551,38443,35609],{},[551,38445,38446],{"class":553,"line":1148},[551,38447,1139],{"emptyLinePlaceholder":238},[551,38449,38450],{"class":553,"line":1154},[551,38451,38452],{},"    \u002F\u002F PRIVATE: Solo accesible dentro de la clase\n",[551,38454,38455],{"class":553,"line":1160},[551,38456,37052],{},[551,38458,38459],{"class":553,"line":1166},[551,38460,38461],{},"    private int contadorActivaciones;\n",[551,38463,38464],{"class":553,"line":1172},[551,38465,1139],{"emptyLinePlaceholder":238},[551,38467,38468],{"class":553,"line":1178},[551,38469,36919],{},[551,38471,38472],{"class":553,"line":1184},[551,38473,1169],{},[551,38475,38476],{"class":553,"line":1190},[551,38477,38478],{},"        estaActivado = true;              \u002F\u002F ✓ OK - acceso interno\n",[551,38480,38481],{"class":553,"line":1472},[551,38482,38483],{},"        contadorActivaciones++;           \u002F\u002F ✓ OK - acceso interno\n",[551,38485,38486],{"class":553,"line":1477},[551,38487,36928],{},[551,38489,38490],{"class":553,"line":1797},[551,38491,1187],{},[551,38493,38494],{"class":553,"line":1802},[551,38495,1139],{"emptyLinePlaceholder":238},[551,38497,38498],{"class":553,"line":1808},[551,38499,38500],{},"    public int ObtenerContadorActivaciones()\n",[551,38502,38503],{"class":553,"line":1814},[551,38504,1169],{},[551,38506,38507],{"class":553,"line":1820},[551,38508,38509],{},"        return contadorActivaciones;      \u002F\u002F ✓ OK - retornar valor privado\n",[551,38511,38512],{"class":553,"line":1826},[551,38513,1187],{},[551,38515,38516],{"class":553,"line":1832},[551,38517,1193],{},[551,38519,38520],{"class":553,"line":1838},[551,38521,1139],{"emptyLinePlaceholder":238},[551,38523,38524],{"class":553,"line":1844},[551,38525,29799],{},[551,38527,38528],{"class":553,"line":1850},[551,38529,36749],{},[551,38531,38532],{"class":553,"line":1855},[551,38533,38534],{},"k1.Designacion = \"K1\";           \u002F\u002F ✓ OK - public\n",[551,38536,38537],{"class":553,"line":1861},[551,38538,38539],{},"k1.Activar();                    \u002F\u002F ✓ OK - public\n",[551,38541,38542],{"class":553,"line":1867},[551,38543,1139],{"emptyLinePlaceholder":238},[551,38545,38546],{"class":553,"line":1873},[551,38547,38548],{},"int contador = k1.ObtenerContadorActivaciones();  \u002F\u002F ✓ OK - método public\n",[551,38550,38551],{"class":553,"line":1878},[551,38552,38553],{},"MessageBox.Show(\"Activaciones: \" + contador);\n",[551,38555,38556],{"class":553,"line":1883},[551,38557,1139],{"emptyLinePlaceholder":238},[551,38559,38560,38563],{"class":553,"line":1888},[551,38561,38562],{},"\u002F\u002F k1.estaActivado = true;",[551,38564,38565],{},"       \u002F\u002F ❌ ERROR - private no accesible\n",[551,38567,38568,38571],{"class":553,"line":4615},[551,38569,38570],{},"\u002F\u002F k1.contadorActivaciones++;",[551,38572,38573],{},"    \u002F\u002F ❌ ERROR - private no accesible\n",[367,38575,38577],{"id":38576},"_62-por-qué-usar-private","6.2 ¿Por qué usar private?",[13,38579,38580,416],{},[16,38581,38582],{},"Ventajas de la encapsulación",[543,38584,38586],{"className":545,"code":38585,"language":547,"meta":228,"style":228},"public class Motor\n{\n    public double Potencia { get; set; }     \u002F\u002F kW\n\n    \u002F\u002F Corriente es privada y se calcula automáticamente\n    private double corrienteNominal;\n\n    \u002F\u002F Método público para establecer potencia y calcular corriente\n    public void EstablecerPotencia(double potencia, double voltaje, double fp)\n    {\n        this.Potencia = potencia;\n\n        \u002F\u002F Cálculo interno (encapsulado)\n        this.corrienteNominal = (potencia * 1000) \u002F (1.732 * voltaje * fp);\n    }\n\n    \u002F\u002F Método público para obtener corriente\n    public double ObtenerCorriente()\n    {\n        return corrienteNominal;\n    }\n}\n",[54,38587,38588,38592,38596,38601,38605,38610,38615,38619,38624,38629,38633,38638,38642,38647,38652,38656,38660,38665,38670,38674,38679,38683],{"__ignoreMap":228},[551,38589,38590],{"class":553,"line":554},[551,38591,37370],{},[551,38593,38594],{"class":553,"line":229},[551,38595,1151],{},[551,38597,38598],{"class":553,"line":670},[551,38599,38600],{},"    public double Potencia { get; set; }     \u002F\u002F kW\n",[551,38602,38603],{"class":553,"line":1136},[551,38604,1139],{"emptyLinePlaceholder":238},[551,38606,38607],{"class":553,"line":1142},[551,38608,38609],{},"    \u002F\u002F Corriente es privada y se calcula automáticamente\n",[551,38611,38612],{"class":553,"line":1148},[551,38613,38614],{},"    private double corrienteNominal;\n",[551,38616,38617],{"class":553,"line":1154},[551,38618,1139],{"emptyLinePlaceholder":238},[551,38620,38621],{"class":553,"line":1160},[551,38622,38623],{},"    \u002F\u002F Método público para establecer potencia y calcular corriente\n",[551,38625,38626],{"class":553,"line":1166},[551,38627,38628],{},"    public void EstablecerPotencia(double potencia, double voltaje, double fp)\n",[551,38630,38631],{"class":553,"line":1172},[551,38632,1169],{},[551,38634,38635],{"class":553,"line":1178},[551,38636,38637],{},"        this.Potencia = potencia;\n",[551,38639,38640],{"class":553,"line":1184},[551,38641,1139],{"emptyLinePlaceholder":238},[551,38643,38644],{"class":553,"line":1190},[551,38645,38646],{},"        \u002F\u002F Cálculo interno (encapsulado)\n",[551,38648,38649],{"class":553,"line":1472},[551,38650,38651],{},"        this.corrienteNominal = (potencia * 1000) \u002F (1.732 * voltaje * fp);\n",[551,38653,38654],{"class":553,"line":1477},[551,38655,1187],{},[551,38657,38658],{"class":553,"line":1797},[551,38659,1139],{"emptyLinePlaceholder":238},[551,38661,38662],{"class":553,"line":1802},[551,38663,38664],{},"    \u002F\u002F Método público para obtener corriente\n",[551,38666,38667],{"class":553,"line":1808},[551,38668,38669],{},"    public double ObtenerCorriente()\n",[551,38671,38672],{"class":553,"line":1814},[551,38673,1169],{},[551,38675,38676],{"class":553,"line":1820},[551,38677,38678],{},"        return corrienteNominal;\n",[551,38680,38681],{"class":553,"line":1826},[551,38682,1187],{},[551,38684,38685],{"class":553,"line":1832},[551,38686,1193],{},[13,38688,38689,416],{},[16,38690,38691],{},"Beneficios",[126,38693,38694,38697,38700,38703],{},[88,38695,38696],{},"✅ Protege datos sensibles",[88,38698,38699],{},"✅ Evita modificaciones incorrectas",[88,38701,38702],{},"✅ Centraliza lógica de validación",[88,38704,38705],{},"✅ Permite cambiar implementación interna sin afectar código externo",[43,38707],{},[331,38709,38711,38712],{"id":38710},"_7-la-palabra-clave-this","7. La palabra clave ",[54,38713,37746],{},[13,38715,38716,38718],{},[54,38717,37746],{}," se refiere al objeto actual.",[367,38720,38722],{"id":38721},"_71-distinguir-entre-parámetros-y-propiedades","7.1 Distinguir entre parámetros y propiedades",[543,38724,38726],{"className":545,"code":38725,"language":547,"meta":228,"style":228},"public class Contactor\n{\n    public string Designacion { get; set; }\n    public double Corriente { get; set; }\n\n    public Contactor(string Designacion, double Corriente)\n    {\n        \u002F\u002F Sin this: ambigüedad\n        \u002F\u002F Designacion = Designacion;  \u002F\u002F ¿Cuál es cuál?\n\n        \u002F\u002F Con this: claridad\n        this.Designacion = Designacion;  \u002F\u002F this.Designacion = propiedad\n        this.Corriente = Corriente;      \u002F\u002F Corriente = parámetro\n    }\n}\n",[54,38727,38728,38732,38736,38740,38744,38748,38753,38757,38762,38770,38774,38779,38784,38789,38793],{"__ignoreMap":228},[551,38729,38730],{"class":553,"line":554},[551,38731,36682],{},[551,38733,38734],{"class":553,"line":229},[551,38735,1151],{},[551,38737,38738],{"class":553,"line":670},[551,38739,35594],{},[551,38741,38742],{"class":553,"line":1136},[551,38743,35609],{},[551,38745,38746],{"class":553,"line":1142},[551,38747,1139],{"emptyLinePlaceholder":238},[551,38749,38750],{"class":553,"line":1148},[551,38751,38752],{},"    public Contactor(string Designacion, double Corriente)\n",[551,38754,38755],{"class":553,"line":1154},[551,38756,1169],{},[551,38758,38759],{"class":553,"line":1160},[551,38760,38761],{},"        \u002F\u002F Sin this: ambigüedad\n",[551,38763,38764,38767],{"class":553,"line":1166},[551,38765,38766],{},"        \u002F\u002F Designacion = Designacion;",[551,38768,38769],{},"  \u002F\u002F ¿Cuál es cuál?\n",[551,38771,38772],{"class":553,"line":1172},[551,38773,1139],{"emptyLinePlaceholder":238},[551,38775,38776],{"class":553,"line":1178},[551,38777,38778],{},"        \u002F\u002F Con this: claridad\n",[551,38780,38781],{"class":553,"line":1184},[551,38782,38783],{},"        this.Designacion = Designacion;  \u002F\u002F this.Designacion = propiedad\n",[551,38785,38786],{"class":553,"line":1190},[551,38787,38788],{},"        this.Corriente = Corriente;      \u002F\u002F Corriente = parámetro\n",[551,38790,38791],{"class":553,"line":1472},[551,38792,1187],{},[551,38794,38795],{"class":553,"line":1477},[551,38796,1193],{},[367,38798,38800],{"id":38799},"_72-pasar-el-objeto-actual-a-otro-método","7.2 Pasar el objeto actual a otro método",[543,38802,38804],{"className":545,"code":38803,"language":547,"meta":228,"style":228},"public class Circuito\n{\n    private List\u003CContactor> contactores;\n\n    public void AgregarContactor(Contactor contactor)\n    {\n        contactores.Add(contactor);\n    }\n}\n\npublic class Contactor\n{\n    public string Designacion { get; set; }\n\n    public void RegistrarEnCircuito(Circuito circuito)\n    {\n        circuito.AgregarContactor(this);  \u002F\u002F Pasar el objeto actual\n    }\n}\n\n\u002F\u002F Uso\nCircuito circuito1 = new Circuito();\nContactor k1 = new Contactor();\nk1.Designacion = \"K1\";\nk1.RegistrarEnCircuito(circuito1);  \u002F\u002F k1 se agrega a sí mismo al circuito\n",[54,38805,38806,38811,38815,38820,38824,38829,38833,38838,38842,38846,38850,38854,38858,38862,38866,38871,38875,38880,38884,38888,38892,38896,38901,38905,38909],{"__ignoreMap":228},[551,38807,38808],{"class":553,"line":554},[551,38809,38810],{},"public class Circuito\n",[551,38812,38813],{"class":553,"line":229},[551,38814,1151],{},[551,38816,38817],{"class":553,"line":670},[551,38818,38819],{},"    private List\u003CContactor> contactores;\n",[551,38821,38822],{"class":553,"line":1136},[551,38823,1139],{"emptyLinePlaceholder":238},[551,38825,38826],{"class":553,"line":1142},[551,38827,38828],{},"    public void AgregarContactor(Contactor contactor)\n",[551,38830,38831],{"class":553,"line":1148},[551,38832,1169],{},[551,38834,38835],{"class":553,"line":1154},[551,38836,38837],{},"        contactores.Add(contactor);\n",[551,38839,38840],{"class":553,"line":1160},[551,38841,1187],{},[551,38843,38844],{"class":553,"line":1166},[551,38845,1193],{},[551,38847,38848],{"class":553,"line":1172},[551,38849,1139],{"emptyLinePlaceholder":238},[551,38851,38852],{"class":553,"line":1178},[551,38853,36682],{},[551,38855,38856],{"class":553,"line":1184},[551,38857,1151],{},[551,38859,38860],{"class":553,"line":1190},[551,38861,35594],{},[551,38863,38864],{"class":553,"line":1472},[551,38865,1139],{"emptyLinePlaceholder":238},[551,38867,38868],{"class":553,"line":1477},[551,38869,38870],{},"    public void RegistrarEnCircuito(Circuito circuito)\n",[551,38872,38873],{"class":553,"line":1797},[551,38874,1169],{},[551,38876,38877],{"class":553,"line":1802},[551,38878,38879],{},"        circuito.AgregarContactor(this);  \u002F\u002F Pasar el objeto actual\n",[551,38881,38882],{"class":553,"line":1808},[551,38883,1187],{},[551,38885,38886],{"class":553,"line":1814},[551,38887,1193],{},[551,38889,38890],{"class":553,"line":1820},[551,38891,1139],{"emptyLinePlaceholder":238},[551,38893,38894],{"class":553,"line":1826},[551,38895,29799],{},[551,38897,38898],{"class":553,"line":1832},[551,38899,38900],{},"Circuito circuito1 = new Circuito();\n",[551,38902,38903],{"class":553,"line":1838},[551,38904,36749],{},[551,38906,38907],{"class":553,"line":1844},[551,38908,36754],{},[551,38910,38911],{"class":553,"line":1850},[551,38912,38913],{},"k1.RegistrarEnCircuito(circuito1);  \u002F\u002F k1 se agrega a sí mismo al circuito\n",[43,38915],{},[46,38917,35443],{"id":4024},[13,38919,7975,38920,38923],{},[16,38921,38922],{},"Sistema de Gestión de Componentes Eléctricos"," completo usando POO.",[331,38925,38927],{"id":38926},"paso-1-clase-base-componenteelectrico","Paso 1: Clase base ComponenteElectrico",[543,38929,38931],{"className":545,"code":38930,"language":547,"meta":228,"style":228},"public class ComponenteElectrico\n{\n    \u002F\u002F ========================================\n    \u002F\u002F PROPIEDADES\n    \u002F\u002F ========================================\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public string Tipo { get; set; }\n    public double Corriente { get; set; }      \u002F\u002F A\n    public double Voltaje { get; set; }        \u002F\u002F V\n    public string Fabricante { get; set; }\n\n    \u002F\u002F Propiedad calculada\n    public double Potencia\n    {\n        get\n        {\n            return Corriente * Voltaje;  \u002F\u002F P = I × V (aproximado)\n        }\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F CONSTRUCTOR\n    \u002F\u002F ========================================\n    public ComponenteElectrico(string designacion, string codigo, string tipo,\n                               double corriente, double voltaje, string fabricante)\n    {\n        this.Designacion = designacion;\n        this.Codigo = codigo;\n        this.Tipo = tipo;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n        this.Fabricante = fabricante;\n    }\n\n    \u002F\u002F Constructor simplificado\n    public ComponenteElectrico(string designacion, double corriente)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.Voltaje = 400.0;  \u002F\u002F Por defecto\n        this.Tipo = \"Genérico\";\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F MÉTODOS\n    \u002F\u002F ========================================\n    public string ObtenerDescripcionCompleta()\n    {\n        return string.Format(\"{0} [{1}]\\n  Código: {2}\\n  Corriente: {3}A\\n  Voltaje: {4}V\\n  Potencia: {5:F2}W\\n  Fabricante: {6}\",\n            Designacion, Tipo, Codigo ?? \"N\u002FA\", Corriente, Voltaje, Potencia, Fabricante ?? \"N\u002FA\");\n    }\n\n    public string ObtenerDescripcionCorta()\n    {\n        return string.Format(\"{0} - {1} ({2}A, {3}V)\",\n            Designacion, Tipo, Corriente, Voltaje);\n    }\n\n    public bool EsCompatibleConVoltaje(double voltajeRequerido)\n    {\n        \u002F\u002F Tolerancia del 10%\n        double tolerancia = voltajeRequerido * 0.10;\n        return Math.Abs(Voltaje - voltajeRequerido) \u003C= tolerancia;\n    }\n\n    public void MostrarInformacion()\n    {\n        MessageBox.Show(ObtenerDescripcionCompleta(), \"Información del Componente\");\n    }\n}\n",[54,38932,38933,38938,38942,38946,38951,38955,38959,38963,38967,38972,38976,38980,38984,38989,38994,38998,39002,39006,39011,39015,39019,39023,39027,39032,39036,39041,39046,39050,39054,39058,39062,39066,39070,39074,39078,39082,39087,39092,39096,39100,39104,39109,39114,39118,39122,39126,39131,39135,39140,39144,39149,39154,39158,39162,39167,39171,39175,39180,39184,39188,39193,39197,39202,39207,39212,39216,39220,39225,39229,39234,39238],{"__ignoreMap":228},[551,38934,38935],{"class":553,"line":554},[551,38936,38937],{},"public class ComponenteElectrico\n",[551,38939,38940],{"class":553,"line":229},[551,38941,1151],{},[551,38943,38944],{"class":553,"line":670},[551,38945,31505],{},[551,38947,38948],{"class":553,"line":1136},[551,38949,38950],{},"    \u002F\u002F PROPIEDADES\n",[551,38952,38953],{"class":553,"line":1142},[551,38954,31505],{},[551,38956,38957],{"class":553,"line":1148},[551,38958,35594],{},[551,38960,38961],{"class":553,"line":1154},[551,38962,35599],{},[551,38964,38965],{"class":553,"line":1160},[551,38966,35604],{},[551,38968,38969],{"class":553,"line":1166},[551,38970,38971],{},"    public double Corriente { get; set; }      \u002F\u002F A\n",[551,38973,38974],{"class":553,"line":1172},[551,38975,37384],{},[551,38977,38978],{"class":553,"line":1178},[551,38979,35619],{},[551,38981,38982],{"class":553,"line":1184},[551,38983,1139],{"emptyLinePlaceholder":238},[551,38985,38986],{"class":553,"line":1190},[551,38987,38988],{},"    \u002F\u002F Propiedad calculada\n",[551,38990,38991],{"class":553,"line":1472},[551,38992,38993],{},"    public double Potencia\n",[551,38995,38996],{"class":553,"line":1477},[551,38997,1169],{},[551,38999,39000],{"class":553,"line":1797},[551,39001,37412],{},[551,39003,39004],{"class":553,"line":1802},[551,39005,9062],{},[551,39007,39008],{"class":553,"line":1808},[551,39009,39010],{},"            return Corriente * Voltaje;  \u002F\u002F P = I × V (aproximado)\n",[551,39012,39013],{"class":553,"line":1814},[551,39014,9077],{},[551,39016,39017],{"class":553,"line":1820},[551,39018,1187],{},[551,39020,39021],{"class":553,"line":1826},[551,39022,1139],{"emptyLinePlaceholder":238},[551,39024,39025],{"class":553,"line":1832},[551,39026,31505],{},[551,39028,39029],{"class":553,"line":1838},[551,39030,39031],{},"    \u002F\u002F CONSTRUCTOR\n",[551,39033,39034],{"class":553,"line":1844},[551,39035,31505],{},[551,39037,39038],{"class":553,"line":1850},[551,39039,39040],{},"    public ComponenteElectrico(string designacion, string codigo, string tipo,\n",[551,39042,39043],{"class":553,"line":1855},[551,39044,39045],{},"                               double corriente, double voltaje, string fabricante)\n",[551,39047,39048],{"class":553,"line":1861},[551,39049,1169],{},[551,39051,39052],{"class":553,"line":1867},[551,39053,35642],{},[551,39055,39056],{"class":553,"line":1873},[551,39057,35647],{},[551,39059,39060],{"class":553,"line":1878},[551,39061,35652],{},[551,39063,39064],{"class":553,"line":1883},[551,39065,35657],{},[551,39067,39068],{"class":553,"line":1888},[551,39069,35662],{},[551,39071,39072],{"class":553,"line":4615},[551,39073,35667],{},[551,39075,39076],{"class":553,"line":4620},[551,39077,1187],{},[551,39079,39080],{"class":553,"line":4626},[551,39081,1139],{"emptyLinePlaceholder":238},[551,39083,39084],{"class":553,"line":4631},[551,39085,39086],{},"    \u002F\u002F Constructor simplificado\n",[551,39088,39089],{"class":553,"line":4636},[551,39090,39091],{},"    public ComponenteElectrico(string designacion, double corriente)\n",[551,39093,39094],{"class":553,"line":4641},[551,39095,1169],{},[551,39097,39098],{"class":553,"line":4647},[551,39099,35642],{},[551,39101,39102],{"class":553,"line":4653},[551,39103,35657],{},[551,39105,39106],{"class":553,"line":4659},[551,39107,39108],{},"        this.Voltaje = 400.0;  \u002F\u002F Por defecto\n",[551,39110,39111],{"class":553,"line":4665},[551,39112,39113],{},"        this.Tipo = \"Genérico\";\n",[551,39115,39116],{"class":553,"line":4671},[551,39117,1187],{},[551,39119,39120],{"class":553,"line":4677},[551,39121,1139],{"emptyLinePlaceholder":238},[551,39123,39124],{"class":553,"line":4683},[551,39125,31505],{},[551,39127,39128],{"class":553,"line":4689},[551,39129,39130],{},"    \u002F\u002F MÉTODOS\n",[551,39132,39133],{"class":553,"line":4695},[551,39134,31505],{},[551,39136,39137],{"class":553,"line":4701},[551,39138,39139],{},"    public string ObtenerDescripcionCompleta()\n",[551,39141,39142],{"class":553,"line":4707},[551,39143,1169],{},[551,39145,39146],{"class":553,"line":4713},[551,39147,39148],{},"        return string.Format(\"{0} [{1}]\\n  Código: {2}\\n  Corriente: {3}A\\n  Voltaje: {4}V\\n  Potencia: {5:F2}W\\n  Fabricante: {6}\",\n",[551,39150,39151],{"class":553,"line":4719},[551,39152,39153],{},"            Designacion, Tipo, Codigo ?? \"N\u002FA\", Corriente, Voltaje, Potencia, Fabricante ?? \"N\u002FA\");\n",[551,39155,39156],{"class":553,"line":4725},[551,39157,1187],{},[551,39159,39160],{"class":553,"line":4731},[551,39161,1139],{"emptyLinePlaceholder":238},[551,39163,39164],{"class":553,"line":4737},[551,39165,39166],{},"    public string ObtenerDescripcionCorta()\n",[551,39168,39169],{"class":553,"line":4743},[551,39170,1169],{},[551,39172,39173],{"class":553,"line":4749},[551,39174,35689],{},[551,39176,39177],{"class":553,"line":4755},[551,39178,39179],{},"            Designacion, Tipo, Corriente, Voltaje);\n",[551,39181,39182],{"class":553,"line":4761},[551,39183,1187],{},[551,39185,39186],{"class":553,"line":4766},[551,39187,1139],{"emptyLinePlaceholder":238},[551,39189,39190],{"class":553,"line":4771},[551,39191,39192],{},"    public bool EsCompatibleConVoltaje(double voltajeRequerido)\n",[551,39194,39195],{"class":553,"line":4777},[551,39196,1169],{},[551,39198,39199],{"class":553,"line":4782},[551,39200,39201],{},"        \u002F\u002F Tolerancia del 10%\n",[551,39203,39204],{"class":553,"line":4787},[551,39205,39206],{},"        double tolerancia = voltajeRequerido * 0.10;\n",[551,39208,39209],{"class":553,"line":4793},[551,39210,39211],{},"        return Math.Abs(Voltaje - voltajeRequerido) \u003C= tolerancia;\n",[551,39213,39214],{"class":553,"line":4799},[551,39215,1187],{},[551,39217,39218],{"class":553,"line":4805},[551,39219,1139],{"emptyLinePlaceholder":238},[551,39221,39222],{"class":553,"line":4811},[551,39223,39224],{},"    public void MostrarInformacion()\n",[551,39226,39227],{"class":553,"line":4817},[551,39228,1169],{},[551,39230,39231],{"class":553,"line":4822},[551,39232,39233],{},"        MessageBox.Show(ObtenerDescripcionCompleta(), \"Información del Componente\");\n",[551,39235,39236],{"class":553,"line":4827},[551,39237,1187],{},[551,39239,39240],{"class":553,"line":9183},[551,39241,1193],{},[13,39243,39244],{},[16,39245,4153],{},[13,39247,39248,39249,29642],{},"Creamos una clase base ",[54,39250,39251],{},"ComponenteElectrico",[126,39253,39254,39257,39260,39263,39266],{},[88,39255,39256],{},"Almacena datos eléctricos básicos (corriente, voltaje, código)",[88,39258,39259],{},"Calcula potencia automáticamente",[88,39261,39262],{},"Tiene dos constructores (completo y simplificado)",[88,39264,39265],{},"Provee métodos para obtener descripciones formateadas",[88,39267,39268],{},"Valida compatibilidad de voltaje",[43,39270],{},[331,39272,39274],{"id":39273},"paso-2-clase-contactor-especializada","Paso 2: Clase Contactor (especializada)",[543,39276,39278],{"className":545,"code":39277,"language":547,"meta":228,"style":228},"public class Contactor : ComponenteElectrico\n{\n    \u002F\u002F ========================================\n    \u002F\u002F PROPIEDADES ESPECÍFICAS\n    \u002F\u002F ========================================\n    public int Polos { get; set; }\n    public string CategoriaUso { get; set; }  \u002F\u002F AC1, AC3, AC4\n    private bool estaActivado;\n    private int contadorActivaciones;\n\n    \u002F\u002F ========================================\n    \u002F\u002F CONSTRUCTOR\n    \u002F\u002F ========================================\n    public Contactor(string designacion, string codigo, double corrienteAC3,\n                     double voltaje, int polos, string fabricante)\n        : base(designacion, codigo, \"Contactor\", corrienteAC3, voltaje, fabricante)\n    {\n        this.Polos = polos;\n        this.CategoriaUso = \"AC3\";\n        this.estaActivado = false;\n        this.contadorActivaciones = 0;\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F MÉTODOS ESPECÍFICOS\n    \u002F\u002F ========================================\n    public void Activar()\n    {\n        if (!estaActivado)\n        {\n            estaActivado = true;\n            contadorActivaciones++;\n            MessageBox.Show(string.Format(\"Contactor {0} ACTIVADO\\nActivaciones totales: {1}\",\n                Designacion, contadorActivaciones));\n        }\n        else\n        {\n            MessageBox.Show(Designacion + \" ya está activado\");\n        }\n    }\n\n    public void Desactivar()\n    {\n        if (estaActivado)\n        {\n            estaActivado = false;\n            MessageBox.Show(Designacion + \" desactivado\");\n        }\n    }\n\n    public string ObtenerEstado()\n    {\n        return estaActivado ? \"ACTIVADO\" : \"DESACTIVADO\";\n    }\n\n    public int ObtenerContadorActivaciones()\n    {\n        return contadorActivaciones;\n    }\n}\n",[54,39279,39280,39285,39289,39293,39298,39302,39307,39312,39316,39320,39324,39328,39332,39336,39341,39346,39351,39355,39360,39365,39369,39374,39378,39382,39386,39391,39395,39399,39403,39408,39412,39417,39422,39427,39432,39436,39440,39444,39449,39453,39457,39461,39465,39469,39474,39478,39483,39488,39492,39496,39500,39504,39508,39513,39517,39521,39525,39529,39534,39538],{"__ignoreMap":228},[551,39281,39282],{"class":553,"line":554},[551,39283,39284],{},"public class Contactor : ComponenteElectrico\n",[551,39286,39287],{"class":553,"line":229},[551,39288,1151],{},[551,39290,39291],{"class":553,"line":670},[551,39292,31505],{},[551,39294,39295],{"class":553,"line":1136},[551,39296,39297],{},"    \u002F\u002F PROPIEDADES ESPECÍFICAS\n",[551,39299,39300],{"class":553,"line":1142},[551,39301,31505],{},[551,39303,39304],{"class":553,"line":1148},[551,39305,39306],{},"    public int Polos { get; set; }\n",[551,39308,39309],{"class":553,"line":1154},[551,39310,39311],{},"    public string CategoriaUso { get; set; }  \u002F\u002F AC1, AC3, AC4\n",[551,39313,39314],{"class":553,"line":1160},[551,39315,37052],{},[551,39317,39318],{"class":553,"line":1166},[551,39319,38461],{},[551,39321,39322],{"class":553,"line":1172},[551,39323,1139],{"emptyLinePlaceholder":238},[551,39325,39326],{"class":553,"line":1178},[551,39327,31505],{},[551,39329,39330],{"class":553,"line":1184},[551,39331,39031],{},[551,39333,39334],{"class":553,"line":1190},[551,39335,31505],{},[551,39337,39338],{"class":553,"line":1472},[551,39339,39340],{},"    public Contactor(string designacion, string codigo, double corrienteAC3,\n",[551,39342,39343],{"class":553,"line":1477},[551,39344,39345],{},"                     double voltaje, int polos, string fabricante)\n",[551,39347,39348],{"class":553,"line":1797},[551,39349,39350],{},"        : base(designacion, codigo, \"Contactor\", corrienteAC3, voltaje, fabricante)\n",[551,39352,39353],{"class":553,"line":1802},[551,39354,1169],{},[551,39356,39357],{"class":553,"line":1808},[551,39358,39359],{},"        this.Polos = polos;\n",[551,39361,39362],{"class":553,"line":1814},[551,39363,39364],{},"        this.CategoriaUso = \"AC3\";\n",[551,39366,39367],{"class":553,"line":1820},[551,39368,37091],{},[551,39370,39371],{"class":553,"line":1826},[551,39372,39373],{},"        this.contadorActivaciones = 0;\n",[551,39375,39376],{"class":553,"line":1832},[551,39377,1187],{},[551,39379,39380],{"class":553,"line":1838},[551,39381,1139],{"emptyLinePlaceholder":238},[551,39383,39384],{"class":553,"line":1844},[551,39385,31505],{},[551,39387,39388],{"class":553,"line":1850},[551,39389,39390],{},"    \u002F\u002F MÉTODOS ESPECÍFICOS\n",[551,39392,39393],{"class":553,"line":1855},[551,39394,31505],{},[551,39396,39397],{"class":553,"line":1861},[551,39398,36919],{},[551,39400,39401],{"class":553,"line":1867},[551,39402,1169],{},[551,39404,39405],{"class":553,"line":1873},[551,39406,39407],{},"        if (!estaActivado)\n",[551,39409,39410],{"class":553,"line":1878},[551,39411,9062],{},[551,39413,39414],{"class":553,"line":1883},[551,39415,39416],{},"            estaActivado = true;\n",[551,39418,39419],{"class":553,"line":1888},[551,39420,39421],{},"            contadorActivaciones++;\n",[551,39423,39424],{"class":553,"line":4615},[551,39425,39426],{},"            MessageBox.Show(string.Format(\"Contactor {0} ACTIVADO\\nActivaciones totales: {1}\",\n",[551,39428,39429],{"class":553,"line":4620},[551,39430,39431],{},"                Designacion, contadorActivaciones));\n",[551,39433,39434],{"class":553,"line":4626},[551,39435,9077],{},[551,39437,39438],{"class":553,"line":4631},[551,39439,9082],{},[551,39441,39442],{"class":553,"line":4636},[551,39443,9062],{},[551,39445,39446],{"class":553,"line":4641},[551,39447,39448],{},"            MessageBox.Show(Designacion + \" ya está activado\");\n",[551,39450,39451],{"class":553,"line":4647},[551,39452,9077],{},[551,39454,39455],{"class":553,"line":4653},[551,39456,1187],{},[551,39458,39459],{"class":553,"line":4659},[551,39460,1139],{"emptyLinePlaceholder":238},[551,39462,39463],{"class":553,"line":4665},[551,39464,38055],{},[551,39466,39467],{"class":553,"line":4671},[551,39468,1169],{},[551,39470,39471],{"class":553,"line":4677},[551,39472,39473],{},"        if (estaActivado)\n",[551,39475,39476],{"class":553,"line":4683},[551,39477,9062],{},[551,39479,39480],{"class":553,"line":4689},[551,39481,39482],{},"            estaActivado = false;\n",[551,39484,39485],{"class":553,"line":4695},[551,39486,39487],{},"            MessageBox.Show(Designacion + \" desactivado\");\n",[551,39489,39490],{"class":553,"line":4701},[551,39491,9077],{},[551,39493,39494],{"class":553,"line":4707},[551,39495,1187],{},[551,39497,39498],{"class":553,"line":4713},[551,39499,1139],{"emptyLinePlaceholder":238},[551,39501,39502],{"class":553,"line":4719},[551,39503,37164],{},[551,39505,39506],{"class":553,"line":4725},[551,39507,1169],{},[551,39509,39510],{"class":553,"line":4731},[551,39511,39512],{},"        return estaActivado ? \"ACTIVADO\" : \"DESACTIVADO\";\n",[551,39514,39515],{"class":553,"line":4737},[551,39516,1187],{},[551,39518,39519],{"class":553,"line":4743},[551,39520,1139],{"emptyLinePlaceholder":238},[551,39522,39523],{"class":553,"line":4749},[551,39524,38500],{},[551,39526,39527],{"class":553,"line":4755},[551,39528,1169],{},[551,39530,39531],{"class":553,"line":4761},[551,39532,39533],{},"        return contadorActivaciones;\n",[551,39535,39536],{"class":553,"line":4766},[551,39537,1187],{},[551,39539,39540],{"class":553,"line":4771},[551,39541,1193],{},[43,39543],{},[331,39545,39547],{"id":39546},"paso-3-clase-circuito-contenedor","Paso 3: Clase Circuito (contenedor)",[543,39549,39551],{"className":545,"code":39550,"language":547,"meta":228,"style":228},"public class Circuito\n{\n    \u002F\u002F ========================================\n    \u002F\u002F PROPIEDADES\n    \u002F\u002F ========================================\n    public string Nombre { get; set; }\n    public double VoltajeNominal { get; set; }\n    private List\u003CComponenteElectrico> componentes;\n\n    \u002F\u002F ========================================\n    \u002F\u002F CONSTRUCTOR\n    \u002F\u002F ========================================\n    public Circuito(string nombre, double voltajeNominal)\n    {\n        this.Nombre = nombre;\n        this.VoltajeNominal = voltajeNominal;\n        this.componentes = new List\u003CComponenteElectrico>();\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F MÉTODOS DE GESTIÓN\n    \u002F\u002F ========================================\n    public bool AgregarComponente(ComponenteElectrico componente)\n    {\n        \u002F\u002F Validar compatibilidad de voltaje\n        if (!componente.EsCompatibleConVoltaje(VoltajeNominal))\n        {\n            MessageBox.Show(string.Format(\"Error: {0} no es compatible con {1}V\\n(Voltaje del componente: {2}V)\",\n                componente.Designacion, VoltajeNominal, componente.Voltaje),\n                \"Voltaje incompatible\");\n            return false;\n        }\n\n        componentes.Add(componente);\n        MessageBox.Show(string.Format(\"{0} agregado al circuito {1}\",\n            componente.Designacion, Nombre));\n        return true;\n    }\n\n    public void EliminarComponente(string designacion)\n    {\n        ComponenteElectrico comp = componentes.Find(c => c.Designacion == designacion);\n\n        if (comp != null)\n        {\n            componentes.Remove(comp);\n            MessageBox.Show(designacion + \" eliminado del circuito\");\n        }\n        else\n        {\n            MessageBox.Show(designacion + \" no encontrado\");\n        }\n    }\n\n    public ComponenteElectrico BuscarComponente(string designacion)\n    {\n        return componentes.Find(c => c.Designacion == designacion);\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F MÉTODOS DE CÁLCULO\n    \u002F\u002F ========================================\n    public double CalcularCorrienteTotal()\n    {\n        double total = 0;\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            total += comp.Corriente;\n        }\n        return total;\n    }\n\n    public double CalcularPotenciaTotal()\n    {\n        double total = 0;\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            total += comp.Potencia;\n        }\n        return total;\n    }\n\n    public int ObtenerCantidadComponentes()\n    {\n        return componentes.Count;\n    }\n\n    \u002F\u002F ========================================\n    \u002F\u002F MÉTODOS DE REPORTE\n    \u002F\u002F ========================================\n    public void MostrarResumen()\n    {\n        string reporte = \"=======================================\\n\";\n        reporte += string.Format(\"CIRCUITO: {0}\\n\", Nombre);\n        reporte += string.Format(\"Voltaje nominal: {0}V\\n\", VoltajeNominal);\n        reporte += \"=======================================\\n\\n\";\n        reporte += string.Format(\"Componentes: {0}\\n\", componentes.Count);\n        reporte += string.Format(\"Corriente total: {0:F2}A\\n\", CalcularCorrienteTotal());\n        reporte += string.Format(\"Potencia total: {0:F2}W\\n\\n\", CalcularPotenciaTotal());\n\n        reporte += \"LISTA DE COMPONENTES:\\n\";\n        reporte += \"---------------------------------------\\n\";\n\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            reporte += comp.ObtenerDescripcionCorta() + \"\\n\";\n        }\n\n        MessageBox.Show(reporte, \"Resumen del Circuito\");\n    }\n\n    public void MostrarDetalleCompleto()\n    {\n        string reporte = string.Format(\"CIRCUITO: {0} ({1}V)\\n\\n\", Nombre, VoltajeNominal);\n\n        if (componentes.Count == 0)\n        {\n            reporte += \"No hay componentes en este circuito.\";\n        }\n        else\n        {\n            foreach (ComponenteElectrico comp in componentes)\n            {\n                reporte += comp.ObtenerDescripcionCompleta();\n                reporte += \"\\n\\n---------------------------------------\\n\\n\";\n            }\n        }\n\n        MessageBox.Show(reporte, \"Detalle Completo del Circuito\");\n    }\n}\n",[54,39552,39553,39557,39561,39565,39569,39573,39578,39583,39588,39592,39596,39600,39604,39609,39613,39618,39623,39628,39632,39636,39640,39645,39649,39654,39658,39663,39668,39672,39677,39682,39687,39692,39696,39700,39705,39710,39715,39720,39724,39728,39733,39737,39742,39746,39751,39755,39760,39765,39769,39773,39777,39782,39786,39790,39794,39799,39803,39808,39812,39816,39820,39825,39829,39834,39838,39843,39848,39852,39857,39861,39866,39870,39874,39879,39883,39887,39891,39895,39900,39904,39908,39912,39916,39921,39925,39930,39934,39938,39942,39947,39951,39956,39960,39965,39970,39975,39980,39985,39990,39995,39999,40004,40009,40013,40017,40021,40026,40030,40034,40039,40043,40047,40052,40056,40061,40065,40070,40074,40079,40083,40087,40091,40096,40100,40105,40110,40114,40118,40122,40127,40131],{"__ignoreMap":228},[551,39554,39555],{"class":553,"line":554},[551,39556,38810],{},[551,39558,39559],{"class":553,"line":229},[551,39560,1151],{},[551,39562,39563],{"class":553,"line":670},[551,39564,31505],{},[551,39566,39567],{"class":553,"line":1136},[551,39568,38950],{},[551,39570,39571],{"class":553,"line":1142},[551,39572,31505],{},[551,39574,39575],{"class":553,"line":1148},[551,39576,39577],{},"    public string Nombre { get; set; }\n",[551,39579,39580],{"class":553,"line":1154},[551,39581,39582],{},"    public double VoltajeNominal { get; set; }\n",[551,39584,39585],{"class":553,"line":1160},[551,39586,39587],{},"    private List\u003CComponenteElectrico> componentes;\n",[551,39589,39590],{"class":553,"line":1166},[551,39591,1139],{"emptyLinePlaceholder":238},[551,39593,39594],{"class":553,"line":1172},[551,39595,31505],{},[551,39597,39598],{"class":553,"line":1178},[551,39599,39031],{},[551,39601,39602],{"class":553,"line":1184},[551,39603,31505],{},[551,39605,39606],{"class":553,"line":1190},[551,39607,39608],{},"    public Circuito(string nombre, double voltajeNominal)\n",[551,39610,39611],{"class":553,"line":1472},[551,39612,1169],{},[551,39614,39615],{"class":553,"line":1477},[551,39616,39617],{},"        this.Nombre = nombre;\n",[551,39619,39620],{"class":553,"line":1797},[551,39621,39622],{},"        this.VoltajeNominal = voltajeNominal;\n",[551,39624,39625],{"class":553,"line":1802},[551,39626,39627],{},"        this.componentes = new List\u003CComponenteElectrico>();\n",[551,39629,39630],{"class":553,"line":1808},[551,39631,1187],{},[551,39633,39634],{"class":553,"line":1814},[551,39635,1139],{"emptyLinePlaceholder":238},[551,39637,39638],{"class":553,"line":1820},[551,39639,31505],{},[551,39641,39642],{"class":553,"line":1826},[551,39643,39644],{},"    \u002F\u002F MÉTODOS DE GESTIÓN\n",[551,39646,39647],{"class":553,"line":1832},[551,39648,31505],{},[551,39650,39651],{"class":553,"line":1838},[551,39652,39653],{},"    public bool AgregarComponente(ComponenteElectrico componente)\n",[551,39655,39656],{"class":553,"line":1844},[551,39657,1169],{},[551,39659,39660],{"class":553,"line":1850},[551,39661,39662],{},"        \u002F\u002F Validar compatibilidad de voltaje\n",[551,39664,39665],{"class":553,"line":1855},[551,39666,39667],{},"        if (!componente.EsCompatibleConVoltaje(VoltajeNominal))\n",[551,39669,39670],{"class":553,"line":1861},[551,39671,9062],{},[551,39673,39674],{"class":553,"line":1867},[551,39675,39676],{},"            MessageBox.Show(string.Format(\"Error: {0} no es compatible con {1}V\\n(Voltaje del componente: {2}V)\",\n",[551,39678,39679],{"class":553,"line":1873},[551,39680,39681],{},"                componente.Designacion, VoltajeNominal, componente.Voltaje),\n",[551,39683,39684],{"class":553,"line":1878},[551,39685,39686],{},"                \"Voltaje incompatible\");\n",[551,39688,39689],{"class":553,"line":1883},[551,39690,39691],{},"            return false;\n",[551,39693,39694],{"class":553,"line":1888},[551,39695,9077],{},[551,39697,39698],{"class":553,"line":4615},[551,39699,1139],{"emptyLinePlaceholder":238},[551,39701,39702],{"class":553,"line":4620},[551,39703,39704],{},"        componentes.Add(componente);\n",[551,39706,39707],{"class":553,"line":4626},[551,39708,39709],{},"        MessageBox.Show(string.Format(\"{0} agregado al circuito {1}\",\n",[551,39711,39712],{"class":553,"line":4631},[551,39713,39714],{},"            componente.Designacion, Nombre));\n",[551,39716,39717],{"class":553,"line":4636},[551,39718,39719],{},"        return true;\n",[551,39721,39722],{"class":553,"line":4641},[551,39723,1187],{},[551,39725,39726],{"class":553,"line":4647},[551,39727,1139],{"emptyLinePlaceholder":238},[551,39729,39730],{"class":553,"line":4653},[551,39731,39732],{},"    public void EliminarComponente(string designacion)\n",[551,39734,39735],{"class":553,"line":4659},[551,39736,1169],{},[551,39738,39739],{"class":553,"line":4665},[551,39740,39741],{},"        ComponenteElectrico comp = componentes.Find(c => c.Designacion == designacion);\n",[551,39743,39744],{"class":553,"line":4671},[551,39745,1139],{"emptyLinePlaceholder":238},[551,39747,39748],{"class":553,"line":4677},[551,39749,39750],{},"        if (comp != null)\n",[551,39752,39753],{"class":553,"line":4683},[551,39754,9062],{},[551,39756,39757],{"class":553,"line":4689},[551,39758,39759],{},"            componentes.Remove(comp);\n",[551,39761,39762],{"class":553,"line":4695},[551,39763,39764],{},"            MessageBox.Show(designacion + \" eliminado del circuito\");\n",[551,39766,39767],{"class":553,"line":4701},[551,39768,9077],{},[551,39770,39771],{"class":553,"line":4707},[551,39772,9082],{},[551,39774,39775],{"class":553,"line":4713},[551,39776,9062],{},[551,39778,39779],{"class":553,"line":4719},[551,39780,39781],{},"            MessageBox.Show(designacion + \" no encontrado\");\n",[551,39783,39784],{"class":553,"line":4725},[551,39785,9077],{},[551,39787,39788],{"class":553,"line":4731},[551,39789,1187],{},[551,39791,39792],{"class":553,"line":4737},[551,39793,1139],{"emptyLinePlaceholder":238},[551,39795,39796],{"class":553,"line":4743},[551,39797,39798],{},"    public ComponenteElectrico BuscarComponente(string designacion)\n",[551,39800,39801],{"class":553,"line":4749},[551,39802,1169],{},[551,39804,39805],{"class":553,"line":4755},[551,39806,39807],{},"        return componentes.Find(c => c.Designacion == designacion);\n",[551,39809,39810],{"class":553,"line":4761},[551,39811,1187],{},[551,39813,39814],{"class":553,"line":4766},[551,39815,1139],{"emptyLinePlaceholder":238},[551,39817,39818],{"class":553,"line":4771},[551,39819,31505],{},[551,39821,39822],{"class":553,"line":4777},[551,39823,39824],{},"    \u002F\u002F MÉTODOS DE CÁLCULO\n",[551,39826,39827],{"class":553,"line":4782},[551,39828,31505],{},[551,39830,39831],{"class":553,"line":4787},[551,39832,39833],{},"    public double CalcularCorrienteTotal()\n",[551,39835,39836],{"class":553,"line":4793},[551,39837,1169],{},[551,39839,39840],{"class":553,"line":4799},[551,39841,39842],{},"        double total = 0;\n",[551,39844,39845],{"class":553,"line":4805},[551,39846,39847],{},"        foreach (ComponenteElectrico comp in componentes)\n",[551,39849,39850],{"class":553,"line":4811},[551,39851,9062],{},[551,39853,39854],{"class":553,"line":4817},[551,39855,39856],{},"            total += comp.Corriente;\n",[551,39858,39859],{"class":553,"line":4822},[551,39860,9077],{},[551,39862,39863],{"class":553,"line":4827},[551,39864,39865],{},"        return total;\n",[551,39867,39868],{"class":553,"line":9183},[551,39869,1187],{},[551,39871,39872],{"class":553,"line":9188},[551,39873,1139],{"emptyLinePlaceholder":238},[551,39875,39876],{"class":553,"line":9193},[551,39877,39878],{},"    public double CalcularPotenciaTotal()\n",[551,39880,39881],{"class":553,"line":9198},[551,39882,1169],{},[551,39884,39885],{"class":553,"line":9204},[551,39886,39842],{},[551,39888,39889],{"class":553,"line":9209},[551,39890,39847],{},[551,39892,39893],{"class":553,"line":9214},[551,39894,9062],{},[551,39896,39897],{"class":553,"line":9219},[551,39898,39899],{},"            total += comp.Potencia;\n",[551,39901,39902],{"class":553,"line":9224},[551,39903,9077],{},[551,39905,39906],{"class":553,"line":9230},[551,39907,39865],{},[551,39909,39910],{"class":553,"line":9236},[551,39911,1187],{},[551,39913,39914],{"class":553,"line":9242},[551,39915,1139],{"emptyLinePlaceholder":238},[551,39917,39918],{"class":553,"line":9247},[551,39919,39920],{},"    public int ObtenerCantidadComponentes()\n",[551,39922,39923],{"class":553,"line":9253},[551,39924,1169],{},[551,39926,39927],{"class":553,"line":9258},[551,39928,39929],{},"        return componentes.Count;\n",[551,39931,39932],{"class":553,"line":9264},[551,39933,1187],{},[551,39935,39936],{"class":553,"line":9270},[551,39937,1139],{"emptyLinePlaceholder":238},[551,39939,39940],{"class":553,"line":9275},[551,39941,31505],{},[551,39943,39944],{"class":553,"line":9281},[551,39945,39946],{},"    \u002F\u002F MÉTODOS DE REPORTE\n",[551,39948,39949],{"class":553,"line":9287},[551,39950,31505],{},[551,39952,39953],{"class":553,"line":9292},[551,39954,39955],{},"    public void MostrarResumen()\n",[551,39957,39958],{"class":553,"line":9297},[551,39959,1169],{},[551,39961,39962],{"class":553,"line":9302},[551,39963,39964],{},"        string reporte = \"=======================================\\n\";\n",[551,39966,39967],{"class":553,"line":9308},[551,39968,39969],{},"        reporte += string.Format(\"CIRCUITO: {0}\\n\", Nombre);\n",[551,39971,39972],{"class":553,"line":9313},[551,39973,39974],{},"        reporte += string.Format(\"Voltaje nominal: {0}V\\n\", VoltajeNominal);\n",[551,39976,39977],{"class":553,"line":9318},[551,39978,39979],{},"        reporte += \"=======================================\\n\\n\";\n",[551,39981,39982],{"class":553,"line":9323},[551,39983,39984],{},"        reporte += string.Format(\"Componentes: {0}\\n\", componentes.Count);\n",[551,39986,39987],{"class":553,"line":9328},[551,39988,39989],{},"        reporte += string.Format(\"Corriente total: {0:F2}A\\n\", CalcularCorrienteTotal());\n",[551,39991,39992],{"class":553,"line":9334},[551,39993,39994],{},"        reporte += string.Format(\"Potencia total: {0:F2}W\\n\\n\", CalcularPotenciaTotal());\n",[551,39996,39997],{"class":553,"line":9339},[551,39998,1139],{"emptyLinePlaceholder":238},[551,40000,40001],{"class":553,"line":9344},[551,40002,40003],{},"        reporte += \"LISTA DE COMPONENTES:\\n\";\n",[551,40005,40006],{"class":553,"line":9350},[551,40007,40008],{},"        reporte += \"---------------------------------------\\n\";\n",[551,40010,40011],{"class":553,"line":9355},[551,40012,1139],{"emptyLinePlaceholder":238},[551,40014,40015],{"class":553,"line":9361},[551,40016,39847],{},[551,40018,40019],{"class":553,"line":9367},[551,40020,9062],{},[551,40022,40023],{"class":553,"line":9372},[551,40024,40025],{},"            reporte += comp.ObtenerDescripcionCorta() + \"\\n\";\n",[551,40027,40028],{"class":553,"line":9378},[551,40029,9077],{},[551,40031,40032],{"class":553,"line":9384},[551,40033,1139],{"emptyLinePlaceholder":238},[551,40035,40036],{"class":553,"line":9389},[551,40037,40038],{},"        MessageBox.Show(reporte, \"Resumen del Circuito\");\n",[551,40040,40041],{"class":553,"line":9394},[551,40042,1187],{},[551,40044,40045],{"class":553,"line":9399},[551,40046,1139],{"emptyLinePlaceholder":238},[551,40048,40049],{"class":553,"line":9405},[551,40050,40051],{},"    public void MostrarDetalleCompleto()\n",[551,40053,40054],{"class":553,"line":9410},[551,40055,1169],{},[551,40057,40058],{"class":553,"line":9415},[551,40059,40060],{},"        string reporte = string.Format(\"CIRCUITO: {0} ({1}V)\\n\\n\", Nombre, VoltajeNominal);\n",[551,40062,40063],{"class":553,"line":9420},[551,40064,1139],{"emptyLinePlaceholder":238},[551,40066,40067],{"class":553,"line":9425},[551,40068,40069],{},"        if (componentes.Count == 0)\n",[551,40071,40072],{"class":553,"line":9431},[551,40073,9062],{},[551,40075,40076],{"class":553,"line":9436},[551,40077,40078],{},"            reporte += \"No hay componentes en este circuito.\";\n",[551,40080,40081],{"class":553,"line":9441},[551,40082,9077],{},[551,40084,40085],{"class":553,"line":9447},[551,40086,9082],{},[551,40088,40089],{"class":553,"line":9452},[551,40090,9062],{},[551,40092,40093],{"class":553,"line":9458},[551,40094,40095],{},"            foreach (ComponenteElectrico comp in componentes)\n",[551,40097,40098],{"class":553,"line":9464},[551,40099,12301],{},[551,40101,40102],{"class":553,"line":9469},[551,40103,40104],{},"                reporte += comp.ObtenerDescripcionCompleta();\n",[551,40106,40107],{"class":553,"line":9475},[551,40108,40109],{},"                reporte += \"\\n\\n---------------------------------------\\n\\n\";\n",[551,40111,40112],{"class":553,"line":9481},[551,40113,12311],{},[551,40115,40116],{"class":553,"line":9487},[551,40117,9077],{},[551,40119,40120],{"class":553,"line":9492},[551,40121,1139],{"emptyLinePlaceholder":238},[551,40123,40124],{"class":553,"line":9497},[551,40125,40126],{},"        MessageBox.Show(reporte, \"Detalle Completo del Circuito\");\n",[551,40128,40129],{"class":553,"line":9502},[551,40130,1187],{},[551,40132,40133],{"class":553,"line":9508},[551,40134,1193],{},[43,40136],{},[331,40138,4465],{"id":4464},[543,40140,40142],{"className":545,"code":40141,"language":547,"meta":228,"style":228},"\u002F\u002F\n\u002F\u002F Proyecto: Sistema de Gestión de Componentes Eléctricos con POO\n\u002F\u002F Capítulo: 10\n\u002F\u002F Descripción: Sistema completo para gestionar componentes eléctricos usando\n\u002F\u002F              programación orientada a objetos (clases, propiedades, métodos,\n\u002F\u002F              constructores, encapsulación)\n\u002F\u002F Autor: C.D. López\n\u002F\u002F Fecha: Enero 2025\n\u002F\u002F\n\nusing System;\nusing System.Collections.Generic;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\n\u002F\u002F ========================================\n\u002F\u002F CLASE BASE: ComponenteElectrico\n\u002F\u002F ========================================\npublic class ComponenteElectrico\n{\n    \u002F\u002F Propiedades\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public string Tipo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n    public string Fabricante { get; set; }\n\n    \u002F\u002F Propiedad calculada\n    public double Potencia\n    {\n        get { return Corriente * Voltaje; }\n    }\n\n    \u002F\u002F Constructores\n    public ComponenteElectrico(string designacion, string codigo, string tipo,\n                               double corriente, double voltaje, string fabricante)\n    {\n        this.Designacion = designacion;\n        this.Codigo = codigo;\n        this.Tipo = tipo;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n        this.Fabricante = fabricante;\n    }\n\n    public ComponenteElectrico(string designacion, double corriente)\n    {\n        this.Designacion = designacion;\n        this.Corriente = corriente;\n        this.Voltaje = 400.0;\n        this.Tipo = \"Genérico\";\n    }\n\n    \u002F\u002F Métodos\n    public string ObtenerDescripcionCompleta()\n    {\n        return string.Format(\"{0} [{1}]\\n  Código: {2}\\n  Corriente: {3}A\\n  Voltaje: {4}V\\n  Potencia: {5:F2}W\\n  Fabricante: {6}\",\n            Designacion, Tipo, Codigo ?? \"N\u002FA\", Corriente, Voltaje, Potencia, Fabricante ?? \"N\u002FA\");\n    }\n\n    public string ObtenerDescripcionCorta()\n    {\n        return string.Format(\"{0} - {1} ({2}A, {3}V)\",\n            Designacion, Tipo, Corriente, Voltaje);\n    }\n\n    public bool EsCompatibleConVoltaje(double voltajeRequerido)\n    {\n        double tolerancia = voltajeRequerido * 0.10;\n        return Math.Abs(Voltaje - voltajeRequerido) \u003C= tolerancia;\n    }\n\n    public void MostrarInformacion()\n    {\n        MessageBox.Show(ObtenerDescripcionCompleta(), \"Información del Componente\");\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F CLASE ESPECIALIZADA: Contactor\n\u002F\u002F ========================================\npublic class Contactor : ComponenteElectrico\n{\n    public int Polos { get; set; }\n    public string CategoriaUso { get; set; }\n    private bool estaActivado;\n    private int contadorActivaciones;\n\n    public Contactor(string designacion, string codigo, double corrienteAC3,\n                     double voltaje, int polos, string fabricante)\n        : base(designacion, codigo, \"Contactor\", corrienteAC3, voltaje, fabricante)\n    {\n        this.Polos = polos;\n        this.CategoriaUso = \"AC3\";\n        this.estaActivado = false;\n        this.contadorActivaciones = 0;\n    }\n\n    public void Activar()\n    {\n        if (!estaActivado)\n        {\n            estaActivado = true;\n            contadorActivaciones++;\n            MessageBox.Show(string.Format(\"Contactor {0} ACTIVADO\\nActivaciones totales: {1}\",\n                Designacion, contadorActivaciones));\n        }\n        else\n        {\n            MessageBox.Show(Designacion + \" ya está activado\");\n        }\n    }\n\n    public void Desactivar()\n    {\n        if (estaActivado)\n        {\n            estaActivado = false;\n            MessageBox.Show(Designacion + \" desactivado\");\n        }\n    }\n\n    public string ObtenerEstado()\n    {\n        return estaActivado ? \"ACTIVADO\" : \"DESACTIVADO\";\n    }\n\n    public int ObtenerContadorActivaciones()\n    {\n        return contadorActivaciones;\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F CLASE CONTENEDOR: Circuito\n\u002F\u002F ========================================\npublic class Circuito\n{\n    public string Nombre { get; set; }\n    public double VoltajeNominal { get; set; }\n    private List\u003CComponenteElectrico> componentes;\n\n    public Circuito(string nombre, double voltajeNominal)\n    {\n        this.Nombre = nombre;\n        this.VoltajeNominal = voltajeNominal;\n        this.componentes = new List\u003CComponenteElectrico>();\n    }\n\n    public bool AgregarComponente(ComponenteElectrico componente)\n    {\n        if (!componente.EsCompatibleConVoltaje(VoltajeNominal))\n        {\n            MessageBox.Show(string.Format(\"Error: {0} no es compatible con {1}V\\n(Voltaje del componente: {2}V)\",\n                componente.Designacion, VoltajeNominal, componente.Voltaje),\n                \"Voltaje incompatible\");\n            return false;\n        }\n\n        componentes.Add(componente);\n        MessageBox.Show(string.Format(\"{0} agregado al circuito {1}\",\n            componente.Designacion, Nombre));\n        return true;\n    }\n\n    public void EliminarComponente(string designacion)\n    {\n        ComponenteElectrico comp = componentes.Find(c => c.Designacion == designacion);\n\n        if (comp != null)\n        {\n            componentes.Remove(comp);\n            MessageBox.Show(designacion + \" eliminado del circuito\");\n        }\n        else\n        {\n            MessageBox.Show(designacion + \" no encontrado\");\n        }\n    }\n\n    public ComponenteElectrico BuscarComponente(string designacion)\n    {\n        return componentes.Find(c => c.Designacion == designacion);\n    }\n\n    public double CalcularCorrienteTotal()\n    {\n        double total = 0;\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            total += comp.Corriente;\n        }\n        return total;\n    }\n\n    public double CalcularPotenciaTotal()\n    {\n        double total = 0;\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            total += comp.Potencia;\n        }\n        return total;\n    }\n\n    public int ObtenerCantidadComponentes()\n    {\n        return componentes.Count;\n    }\n\n    public void MostrarResumen()\n    {\n        string reporte = \"=======================================\\n\";\n        reporte += string.Format(\"CIRCUITO: {0}\\n\", Nombre);\n        reporte += string.Format(\"Voltaje nominal: {0}V\\n\", VoltajeNominal);\n        reporte += \"=======================================\\n\\n\";\n        reporte += string.Format(\"Componentes: {0}\\n\", componentes.Count);\n        reporte += string.Format(\"Corriente total: {0:F2}A\\n\", CalcularCorrienteTotal());\n        reporte += string.Format(\"Potencia total: {0:F2}W\\n\\n\", CalcularPotenciaTotal());\n\n        reporte += \"LISTA DE COMPONENTES:\\n\";\n        reporte += \"---------------------------------------\\n\";\n\n        foreach (ComponenteElectrico comp in componentes)\n        {\n            reporte += comp.ObtenerDescripcionCorta() + \"\\n\";\n        }\n\n        MessageBox.Show(reporte, \"Resumen del Circuito\");\n    }\n\n    public void MostrarDetalleCompleto()\n    {\n        string reporte = string.Format(\"CIRCUITO: {0} ({1}V)\\n\\n\", Nombre, VoltajeNominal);\n\n        if (componentes.Count == 0)\n        {\n            reporte += \"No hay componentes en este circuito.\";\n        }\n        else\n        {\n            foreach (ComponenteElectrico comp in componentes)\n            {\n                reporte += comp.ObtenerDescripcionCompleta();\n                reporte += \"\\n\\n---------------------------------------\\n\\n\";\n            }\n        }\n\n        MessageBox.Show(reporte, \"Detalle Completo del Circuito\");\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F SCRIPT PRINCIPAL DE DEMOSTRACIÓN\n\u002F\u002F ========================================\npublic class GestionComponentesPOO\n{\n    [Start]\n    public void Ejecutar()\n    {\n        try\n        {\n            \u002F\u002F Crear circuito\n            Circuito circuitoPrincipal = new Circuito(\"Circuito Motor Principal\", 400.0);\n\n            \u002F\u002F Crear componentes\n            Contactor k1 = new Contactor(\"K1\", \"3RT2026-1BB40\", 25.0, 400.0, 3, \"Siemens\");\n            Contactor k2 = new Contactor(\"K2\", \"3RT2036-1BB40\", 40.0, 400.0, 3, \"Siemens\");\n\n            ComponenteElectrico q1 = new ComponenteElectrico(\"Q1\", \"3RV2011-1JA10\", \"Guardamotor\",\n                                                             4.5, 400.0, \"Siemens\");\n\n            ComponenteElectrico m1 = new ComponenteElectrico(\"M1\", 15.0);  \u002F\u002F Constructor simple\n            m1.Tipo = \"Motor\";\n            m1.Fabricante = \"WEG\";\n\n            \u002F\u002F Agregar componentes al circuito\n            circuitoPrincipal.AgregarComponente(k1);\n            circuitoPrincipal.AgregarComponente(k2);\n            circuitoPrincipal.AgregarComponente(q1);\n            circuitoPrincipal.AgregarComponente(m1);\n\n            \u002F\u002F Mostrar resumen\n            circuitoPrincipal.MostrarResumen();\n\n            \u002F\u002F Activar contactores\n            k1.Activar();\n            k1.Activar();  \u002F\u002F Intento de activar de nuevo\n            k2.Activar();\n\n            \u002F\u002F Buscar y mostrar componente específico\n            ComponenteElectrico componenteBuscado = circuitoPrincipal.BuscarComponente(\"Q1\");\n            if (componenteBuscado != null)\n            {\n                componenteBuscado.MostrarInformacion();\n            }\n\n            \u002F\u002F Mostrar detalle completo\n            circuitoPrincipal.MostrarDetalleCompleto();\n\n            \u002F\u002F Intentar agregar componente incompatible (220V en circuito 400V)\n            ComponenteElectrico x1 = new ComponenteElectrico(\"X1\", \"XYZ-123\", \"Relé\",\n                                                             2.0, 220.0, \"Generic\");\n            circuitoPrincipal.AgregarComponente(x1);  \u002F\u002F Debería fallar\n\n            \u002F\u002F Mostrar contadores de activaciones\n            MessageBox.Show(string.Format(\"K1 activado {0} veces\\nK2 activado {1} veces\",\n                k1.ObtenerContadorActivaciones(),\n                k2.ObtenerContadorActivaciones()));\n\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message, \"Error en la ejecución\");\n        }\n    }\n}\n",[54,40143,40144,40149,40154,40159,40164,40169,40174,40179,40184,40188,40192,40196,40200,40204,40208,40212,40216,40221,40225,40229,40233,40238,40242,40246,40250,40254,40258,40262,40266,40270,40274,40278,40283,40287,40291,40296,40300,40304,40308,40312,40316,40320,40324,40328,40332,40336,40340,40344,40348,40352,40356,40361,40365,40369,40373,40378,40382,40386,40390,40394,40398,40402,40406,40410,40414,40418,40422,40426,40430,40434,40438,40442,40446,40450,40454,40458,40462,40466,40470,40474,40478,40483,40487,40491,40495,40499,40504,40508,40512,40516,40520,40524,40528,40532,40536,40540,40544,40548,40552,40556,40560,40564,40568,40572,40576,40580,40584,40588,40592,40596,40600,40604,40608,40612,40616,40620,40624,40628,40632,40636,40640,40644,40648,40652,40656,40660,40664,40668,40672,40676,40680,40684,40688,40692,40696,40700,40705,40709,40713,40717,40721,40725,40729,40733,40737,40741,40745,40749,40753,40757,40761,40765,40769,40773,40777,40781,40785,40789,40793,40797,40801,40805,40809,40813,40817,40821,40825,40829,40833,40837,40841,40845,40849,40853,40857,40861,40865,40869,40873,40877,40881,40885,40889,40893,40897,40901,40905,40909,40913,40917,40921,40925,40929,40933,40937,40941,40945,40949,40953,40957,40961,40965,40969,40973,40977,40981,40985,40989,40993,40997,41001,41005,41009,41013,41017,41021,41025,41029,41033,41037,41041,41045,41049,41053,41057,41061,41065,41069,41073,41077,41081,41085,41089,41093,41097,41101,41105,41109,41113,41117,41121,41125,41129,41133,41137,41141,41145,41149,41153,41157,41161,41165,41169,41173,41177,41182,41186,41191,41195,41199,41203,41207,41212,41216,41221,41226,41230,41235,41240,41245,41249,41254,41259,41263,41268,41273,41278,41282,41287,41292,41297,41302,41307,41311,41316,41321,41325,41330,41335,41340,41345,41349,41355,41361,41367,41372,41378,41383,41388,41394,41400,41405,41411,41417,41423,41429,41434,41440,41446,41452,41458,41463,41468,41474,41479,41485,41490,41495],{"__ignoreMap":228},[551,40145,40146],{"class":553,"line":554},[551,40147,40148],{},"\u002F\u002F\n",[551,40150,40151],{"class":553,"line":229},[551,40152,40153],{},"\u002F\u002F Proyecto: Sistema de Gestión de Componentes Eléctricos con POO\n",[551,40155,40156],{"class":553,"line":670},[551,40157,40158],{},"\u002F\u002F Capítulo: 10\n",[551,40160,40161],{"class":553,"line":1136},[551,40162,40163],{},"\u002F\u002F Descripción: Sistema completo para gestionar componentes eléctricos usando\n",[551,40165,40166],{"class":553,"line":1142},[551,40167,40168],{},"\u002F\u002F              programación orientada a objetos (clases, propiedades, métodos,\n",[551,40170,40171],{"class":553,"line":1148},[551,40172,40173],{},"\u002F\u002F              constructores, encapsulación)\n",[551,40175,40176],{"class":553,"line":1154},[551,40177,40178],{},"\u002F\u002F Autor: C.D. López\n",[551,40180,40181],{"class":553,"line":1160},[551,40182,40183],{},"\u002F\u002F Fecha: Enero 2025\n",[551,40185,40186],{"class":553,"line":1166},[551,40187,40148],{},[551,40189,40190],{"class":553,"line":1172},[551,40191,1139],{"emptyLinePlaceholder":238},[551,40193,40194],{"class":553,"line":1178},[551,40195,1123],{},[551,40197,40198],{"class":553,"line":1184},[551,40199,35466],{},[551,40201,40202],{"class":553,"line":1190},[551,40203,1128],{},[551,40205,40206],{"class":553,"line":1472},[551,40207,1133],{},[551,40209,40210],{"class":553,"line":1477},[551,40211,1139],{"emptyLinePlaceholder":238},[551,40213,40214],{"class":553,"line":1797},[551,40215,8157],{},[551,40217,40218],{"class":553,"line":1802},[551,40219,40220],{},"\u002F\u002F CLASE BASE: ComponenteElectrico\n",[551,40222,40223],{"class":553,"line":1808},[551,40224,8157],{},[551,40226,40227],{"class":553,"line":1814},[551,40228,38937],{},[551,40230,40231],{"class":553,"line":1820},[551,40232,1151],{},[551,40234,40235],{"class":553,"line":1826},[551,40236,40237],{},"    \u002F\u002F Propiedades\n",[551,40239,40240],{"class":553,"line":1832},[551,40241,35594],{},[551,40243,40244],{"class":553,"line":1838},[551,40245,35599],{},[551,40247,40248],{"class":553,"line":1844},[551,40249,35604],{},[551,40251,40252],{"class":553,"line":1850},[551,40253,35609],{},[551,40255,40256],{"class":553,"line":1855},[551,40257,35614],{},[551,40259,40260],{"class":553,"line":1861},[551,40261,35619],{},[551,40263,40264],{"class":553,"line":1867},[551,40265,1139],{"emptyLinePlaceholder":238},[551,40267,40268],{"class":553,"line":1873},[551,40269,38988],{},[551,40271,40272],{"class":553,"line":1878},[551,40273,38993],{},[551,40275,40276],{"class":553,"line":1883},[551,40277,1169],{},[551,40279,40280],{"class":553,"line":1888},[551,40281,40282],{},"        get { return Corriente * Voltaje; }\n",[551,40284,40285],{"class":553,"line":4615},[551,40286,1187],{},[551,40288,40289],{"class":553,"line":4620},[551,40290,1139],{"emptyLinePlaceholder":238},[551,40292,40293],{"class":553,"line":4626},[551,40294,40295],{},"    \u002F\u002F Constructores\n",[551,40297,40298],{"class":553,"line":4631},[551,40299,39040],{},[551,40301,40302],{"class":553,"line":4636},[551,40303,39045],{},[551,40305,40306],{"class":553,"line":4641},[551,40307,1169],{},[551,40309,40310],{"class":553,"line":4647},[551,40311,35642],{},[551,40313,40314],{"class":553,"line":4653},[551,40315,35647],{},[551,40317,40318],{"class":553,"line":4659},[551,40319,35652],{},[551,40321,40322],{"class":553,"line":4665},[551,40323,35657],{},[551,40325,40326],{"class":553,"line":4671},[551,40327,35662],{},[551,40329,40330],{"class":553,"line":4677},[551,40331,35667],{},[551,40333,40334],{"class":553,"line":4683},[551,40335,1187],{},[551,40337,40338],{"class":553,"line":4689},[551,40339,1139],{"emptyLinePlaceholder":238},[551,40341,40342],{"class":553,"line":4695},[551,40343,39091],{},[551,40345,40346],{"class":553,"line":4701},[551,40347,1169],{},[551,40349,40350],{"class":553,"line":4707},[551,40351,35642],{},[551,40353,40354],{"class":553,"line":4713},[551,40355,35657],{},[551,40357,40358],{"class":553,"line":4719},[551,40359,40360],{},"        this.Voltaje = 400.0;\n",[551,40362,40363],{"class":553,"line":4725},[551,40364,39113],{},[551,40366,40367],{"class":553,"line":4731},[551,40368,1187],{},[551,40370,40371],{"class":553,"line":4737},[551,40372,1139],{"emptyLinePlaceholder":238},[551,40374,40375],{"class":553,"line":4743},[551,40376,40377],{},"    \u002F\u002F Métodos\n",[551,40379,40380],{"class":553,"line":4749},[551,40381,39139],{},[551,40383,40384],{"class":553,"line":4755},[551,40385,1169],{},[551,40387,40388],{"class":553,"line":4761},[551,40389,39148],{},[551,40391,40392],{"class":553,"line":4766},[551,40393,39153],{},[551,40395,40396],{"class":553,"line":4771},[551,40397,1187],{},[551,40399,40400],{"class":553,"line":4777},[551,40401,1139],{"emptyLinePlaceholder":238},[551,40403,40404],{"class":553,"line":4782},[551,40405,39166],{},[551,40407,40408],{"class":553,"line":4787},[551,40409,1169],{},[551,40411,40412],{"class":553,"line":4793},[551,40413,35689],{},[551,40415,40416],{"class":553,"line":4799},[551,40417,39179],{},[551,40419,40420],{"class":553,"line":4805},[551,40421,1187],{},[551,40423,40424],{"class":553,"line":4811},[551,40425,1139],{"emptyLinePlaceholder":238},[551,40427,40428],{"class":553,"line":4817},[551,40429,39192],{},[551,40431,40432],{"class":553,"line":4822},[551,40433,1169],{},[551,40435,40436],{"class":553,"line":4827},[551,40437,39206],{},[551,40439,40440],{"class":553,"line":9183},[551,40441,39211],{},[551,40443,40444],{"class":553,"line":9188},[551,40445,1187],{},[551,40447,40448],{"class":553,"line":9193},[551,40449,1139],{"emptyLinePlaceholder":238},[551,40451,40452],{"class":553,"line":9198},[551,40453,39224],{},[551,40455,40456],{"class":553,"line":9204},[551,40457,1169],{},[551,40459,40460],{"class":553,"line":9209},[551,40461,39233],{},[551,40463,40464],{"class":553,"line":9214},[551,40465,1187],{},[551,40467,40468],{"class":553,"line":9219},[551,40469,1193],{},[551,40471,40472],{"class":553,"line":9224},[551,40473,1139],{"emptyLinePlaceholder":238},[551,40475,40476],{"class":553,"line":9230},[551,40477,8157],{},[551,40479,40480],{"class":553,"line":9236},[551,40481,40482],{},"\u002F\u002F CLASE ESPECIALIZADA: Contactor\n",[551,40484,40485],{"class":553,"line":9242},[551,40486,8157],{},[551,40488,40489],{"class":553,"line":9247},[551,40490,39284],{},[551,40492,40493],{"class":553,"line":9253},[551,40494,1151],{},[551,40496,40497],{"class":553,"line":9258},[551,40498,39306],{},[551,40500,40501],{"class":553,"line":9264},[551,40502,40503],{},"    public string CategoriaUso { get; set; }\n",[551,40505,40506],{"class":553,"line":9270},[551,40507,37052],{},[551,40509,40510],{"class":553,"line":9275},[551,40511,38461],{},[551,40513,40514],{"class":553,"line":9281},[551,40515,1139],{"emptyLinePlaceholder":238},[551,40517,40518],{"class":553,"line":9287},[551,40519,39340],{},[551,40521,40522],{"class":553,"line":9292},[551,40523,39345],{},[551,40525,40526],{"class":553,"line":9297},[551,40527,39350],{},[551,40529,40530],{"class":553,"line":9302},[551,40531,1169],{},[551,40533,40534],{"class":553,"line":9308},[551,40535,39359],{},[551,40537,40538],{"class":553,"line":9313},[551,40539,39364],{},[551,40541,40542],{"class":553,"line":9318},[551,40543,37091],{},[551,40545,40546],{"class":553,"line":9323},[551,40547,39373],{},[551,40549,40550],{"class":553,"line":9328},[551,40551,1187],{},[551,40553,40554],{"class":553,"line":9334},[551,40555,1139],{"emptyLinePlaceholder":238},[551,40557,40558],{"class":553,"line":9339},[551,40559,36919],{},[551,40561,40562],{"class":553,"line":9344},[551,40563,1169],{},[551,40565,40566],{"class":553,"line":9350},[551,40567,39407],{},[551,40569,40570],{"class":553,"line":9355},[551,40571,9062],{},[551,40573,40574],{"class":553,"line":9361},[551,40575,39416],{},[551,40577,40578],{"class":553,"line":9367},[551,40579,39421],{},[551,40581,40582],{"class":553,"line":9372},[551,40583,39426],{},[551,40585,40586],{"class":553,"line":9378},[551,40587,39431],{},[551,40589,40590],{"class":553,"line":9384},[551,40591,9077],{},[551,40593,40594],{"class":553,"line":9389},[551,40595,9082],{},[551,40597,40598],{"class":553,"line":9394},[551,40599,9062],{},[551,40601,40602],{"class":553,"line":9399},[551,40603,39448],{},[551,40605,40606],{"class":553,"line":9405},[551,40607,9077],{},[551,40609,40610],{"class":553,"line":9410},[551,40611,1187],{},[551,40613,40614],{"class":553,"line":9415},[551,40615,1139],{"emptyLinePlaceholder":238},[551,40617,40618],{"class":553,"line":9420},[551,40619,38055],{},[551,40621,40622],{"class":553,"line":9425},[551,40623,1169],{},[551,40625,40626],{"class":553,"line":9431},[551,40627,39473],{},[551,40629,40630],{"class":553,"line":9436},[551,40631,9062],{},[551,40633,40634],{"class":553,"line":9441},[551,40635,39482],{},[551,40637,40638],{"class":553,"line":9447},[551,40639,39487],{},[551,40641,40642],{"class":553,"line":9452},[551,40643,9077],{},[551,40645,40646],{"class":553,"line":9458},[551,40647,1187],{},[551,40649,40650],{"class":553,"line":9464},[551,40651,1139],{"emptyLinePlaceholder":238},[551,40653,40654],{"class":553,"line":9469},[551,40655,37164],{},[551,40657,40658],{"class":553,"line":9475},[551,40659,1169],{},[551,40661,40662],{"class":553,"line":9481},[551,40663,39512],{},[551,40665,40666],{"class":553,"line":9487},[551,40667,1187],{},[551,40669,40670],{"class":553,"line":9492},[551,40671,1139],{"emptyLinePlaceholder":238},[551,40673,40674],{"class":553,"line":9497},[551,40675,38500],{},[551,40677,40678],{"class":553,"line":9502},[551,40679,1169],{},[551,40681,40682],{"class":553,"line":9508},[551,40683,39533],{},[551,40685,40686],{"class":553,"line":9514},[551,40687,1187],{},[551,40689,40690],{"class":553,"line":9519},[551,40691,1193],{},[551,40693,40694],{"class":553,"line":9524},[551,40695,1139],{"emptyLinePlaceholder":238},[551,40697,40698],{"class":553,"line":9529},[551,40699,8157],{},[551,40701,40702],{"class":553,"line":9535},[551,40703,40704],{},"\u002F\u002F CLASE CONTENEDOR: Circuito\n",[551,40706,40707],{"class":553,"line":9540},[551,40708,8157],{},[551,40710,40711],{"class":553,"line":9545},[551,40712,38810],{},[551,40714,40715],{"class":553,"line":9551},[551,40716,1151],{},[551,40718,40719],{"class":553,"line":9557},[551,40720,39577],{},[551,40722,40723],{"class":553,"line":9562},[551,40724,39582],{},[551,40726,40727],{"class":553,"line":9568},[551,40728,39587],{},[551,40730,40731],{"class":553,"line":9573},[551,40732,1139],{"emptyLinePlaceholder":238},[551,40734,40735],{"class":553,"line":9578},[551,40736,39608],{},[551,40738,40739],{"class":553,"line":9584},[551,40740,1169],{},[551,40742,40743],{"class":553,"line":9589},[551,40744,39617],{},[551,40746,40747],{"class":553,"line":9594},[551,40748,39622],{},[551,40750,40751],{"class":553,"line":9600},[551,40752,39627],{},[551,40754,40755],{"class":553,"line":9606},[551,40756,1187],{},[551,40758,40759],{"class":553,"line":9611},[551,40760,1139],{"emptyLinePlaceholder":238},[551,40762,40763],{"class":553,"line":9617},[551,40764,39653],{},[551,40766,40767],{"class":553,"line":9623},[551,40768,1169],{},[551,40770,40771],{"class":553,"line":9629},[551,40772,39667],{},[551,40774,40775],{"class":553,"line":9635},[551,40776,9062],{},[551,40778,40779],{"class":553,"line":9641},[551,40780,39676],{},[551,40782,40783],{"class":553,"line":9647},[551,40784,39681],{},[551,40786,40787],{"class":553,"line":9653},[551,40788,39686],{},[551,40790,40791],{"class":553,"line":9659},[551,40792,39691],{},[551,40794,40795],{"class":553,"line":9665},[551,40796,9077],{},[551,40798,40799],{"class":553,"line":9671},[551,40800,1139],{"emptyLinePlaceholder":238},[551,40802,40803],{"class":553,"line":9677},[551,40804,39704],{},[551,40806,40807],{"class":553,"line":9682},[551,40808,39709],{},[551,40810,40811],{"class":553,"line":9688},[551,40812,39714],{},[551,40814,40815],{"class":553,"line":9694},[551,40816,39719],{},[551,40818,40819],{"class":553,"line":9700},[551,40820,1187],{},[551,40822,40823],{"class":553,"line":9706},[551,40824,1139],{"emptyLinePlaceholder":238},[551,40826,40827],{"class":553,"line":9712},[551,40828,39732],{},[551,40830,40831],{"class":553,"line":9718},[551,40832,1169],{},[551,40834,40835],{"class":553,"line":9724},[551,40836,39741],{},[551,40838,40839],{"class":553,"line":9730},[551,40840,1139],{"emptyLinePlaceholder":238},[551,40842,40843],{"class":553,"line":9736},[551,40844,39750],{},[551,40846,40847],{"class":553,"line":9742},[551,40848,9062],{},[551,40850,40851],{"class":553,"line":9747},[551,40852,39759],{},[551,40854,40855],{"class":553,"line":9752},[551,40856,39764],{},[551,40858,40859],{"class":553,"line":9757},[551,40860,9077],{},[551,40862,40863],{"class":553,"line":9763},[551,40864,9082],{},[551,40866,40867],{"class":553,"line":9768},[551,40868,9062],{},[551,40870,40871],{"class":553,"line":9773},[551,40872,39781],{},[551,40874,40875],{"class":553,"line":9779},[551,40876,9077],{},[551,40878,40879],{"class":553,"line":9784},[551,40880,1187],{},[551,40882,40883],{"class":553,"line":9790},[551,40884,1139],{"emptyLinePlaceholder":238},[551,40886,40887],{"class":553,"line":9795},[551,40888,39798],{},[551,40890,40891],{"class":553,"line":15107},[551,40892,1169],{},[551,40894,40895],{"class":553,"line":15113},[551,40896,39807],{},[551,40898,40899],{"class":553,"line":15119},[551,40900,1187],{},[551,40902,40903],{"class":553,"line":15124},[551,40904,1139],{"emptyLinePlaceholder":238},[551,40906,40907],{"class":553,"line":15130},[551,40908,39833],{},[551,40910,40911],{"class":553,"line":15135},[551,40912,1169],{},[551,40914,40915],{"class":553,"line":15140},[551,40916,39842],{},[551,40918,40919],{"class":553,"line":15146},[551,40920,39847],{},[551,40922,40923],{"class":553,"line":15151},[551,40924,9062],{},[551,40926,40927],{"class":553,"line":15156},[551,40928,39856],{},[551,40930,40931],{"class":553,"line":15161},[551,40932,9077],{},[551,40934,40935],{"class":553,"line":15167},[551,40936,39865],{},[551,40938,40939],{"class":553,"line":15172},[551,40940,1187],{},[551,40942,40943],{"class":553,"line":15177},[551,40944,1139],{"emptyLinePlaceholder":238},[551,40946,40947],{"class":553,"line":15182},[551,40948,39878],{},[551,40950,40951],{"class":553,"line":15188},[551,40952,1169],{},[551,40954,40955],{"class":553,"line":15193},[551,40956,39842],{},[551,40958,40959],{"class":553,"line":15198},[551,40960,39847],{},[551,40962,40963],{"class":553,"line":15204},[551,40964,9062],{},[551,40966,40967],{"class":553,"line":15209},[551,40968,39899],{},[551,40970,40971],{"class":553,"line":15214},[551,40972,9077],{},[551,40974,40975],{"class":553,"line":15220},[551,40976,39865],{},[551,40978,40979],{"class":553,"line":15225},[551,40980,1187],{},[551,40982,40983],{"class":553,"line":15230},[551,40984,1139],{"emptyLinePlaceholder":238},[551,40986,40987],{"class":553,"line":15235},[551,40988,39920],{},[551,40990,40991],{"class":553,"line":15241},[551,40992,1169],{},[551,40994,40995],{"class":553,"line":15246},[551,40996,39929],{},[551,40998,40999],{"class":553,"line":15252},[551,41000,1187],{},[551,41002,41003],{"class":553,"line":15257},[551,41004,1139],{"emptyLinePlaceholder":238},[551,41006,41007],{"class":553,"line":15263},[551,41008,39955],{},[551,41010,41011],{"class":553,"line":15268},[551,41012,1169],{},[551,41014,41015],{"class":553,"line":15274},[551,41016,39964],{},[551,41018,41019],{"class":553,"line":15279},[551,41020,39969],{},[551,41022,41023],{"class":553,"line":15284},[551,41024,39974],{},[551,41026,41027],{"class":553,"line":15289},[551,41028,39979],{},[551,41030,41031],{"class":553,"line":15295},[551,41032,39984],{},[551,41034,41035],{"class":553,"line":15301},[551,41036,39989],{},[551,41038,41039],{"class":553,"line":15306},[551,41040,39994],{},[551,41042,41043],{"class":553,"line":15312},[551,41044,1139],{"emptyLinePlaceholder":238},[551,41046,41047],{"class":553,"line":15317},[551,41048,40003],{},[551,41050,41051],{"class":553,"line":15322},[551,41052,40008],{},[551,41054,41055],{"class":553,"line":15327},[551,41056,1139],{"emptyLinePlaceholder":238},[551,41058,41059],{"class":553,"line":15333},[551,41060,39847],{},[551,41062,41063],{"class":553,"line":15338},[551,41064,9062],{},[551,41066,41067],{"class":553,"line":15343},[551,41068,40025],{},[551,41070,41071],{"class":553,"line":15348},[551,41072,9077],{},[551,41074,41075],{"class":553,"line":15354},[551,41076,1139],{"emptyLinePlaceholder":238},[551,41078,41079],{"class":553,"line":15359},[551,41080,40038],{},[551,41082,41083],{"class":553,"line":15364},[551,41084,1187],{},[551,41086,41087],{"class":553,"line":15369},[551,41088,1139],{"emptyLinePlaceholder":238},[551,41090,41091],{"class":553,"line":15374},[551,41092,40051],{},[551,41094,41095],{"class":553,"line":15379},[551,41096,1169],{},[551,41098,41099],{"class":553,"line":15384},[551,41100,40060],{},[551,41102,41103],{"class":553,"line":15389},[551,41104,1139],{"emptyLinePlaceholder":238},[551,41106,41107],{"class":553,"line":15395},[551,41108,40069],{},[551,41110,41111],{"class":553,"line":15401},[551,41112,9062],{},[551,41114,41115],{"class":553,"line":15407},[551,41116,40078],{},[551,41118,41119],{"class":553,"line":15413},[551,41120,9077],{},[551,41122,41123],{"class":553,"line":15419},[551,41124,9082],{},[551,41126,41127],{"class":553,"line":15425},[551,41128,9062],{},[551,41130,41131],{"class":553,"line":15431},[551,41132,40095],{},[551,41134,41135],{"class":553,"line":15437},[551,41136,12301],{},[551,41138,41139],{"class":553,"line":15443},[551,41140,40104],{},[551,41142,41143],{"class":553,"line":15449},[551,41144,40109],{},[551,41146,41147],{"class":553,"line":15455},[551,41148,12311],{},[551,41150,41151],{"class":553,"line":15461},[551,41152,9077],{},[551,41154,41155],{"class":553,"line":15467},[551,41156,1139],{"emptyLinePlaceholder":238},[551,41158,41159],{"class":553,"line":15473},[551,41160,40126],{},[551,41162,41163],{"class":553,"line":15479},[551,41164,1187],{},[551,41166,41167],{"class":553,"line":15485},[551,41168,1193],{},[551,41170,41171],{"class":553,"line":15491},[551,41172,1139],{"emptyLinePlaceholder":238},[551,41174,41175],{"class":553,"line":15497},[551,41176,8157],{},[551,41178,41179],{"class":553,"line":15503},[551,41180,41181],{},"\u002F\u002F SCRIPT PRINCIPAL DE DEMOSTRACIÓN\n",[551,41183,41184],{"class":553,"line":15509},[551,41185,8157],{},[551,41187,41188],{"class":553,"line":15515},[551,41189,41190],{},"public class GestionComponentesPOO\n",[551,41192,41193],{"class":553,"line":15520},[551,41194,1151],{},[551,41196,41197],{"class":553,"line":15526},[551,41198,1157],{},[551,41200,41201],{"class":553,"line":15532},[551,41202,1163],{},[551,41204,41205],{"class":553,"line":15537},[551,41206,1169],{},[551,41208,41209],{"class":553,"line":15543},[551,41210,41211],{},"        try\n",[551,41213,41214],{"class":553,"line":15549},[551,41215,9062],{},[551,41217,41218],{"class":553,"line":15555},[551,41219,41220],{},"            \u002F\u002F Crear circuito\n",[551,41222,41223],{"class":553,"line":15561},[551,41224,41225],{},"            Circuito circuitoPrincipal = new Circuito(\"Circuito Motor Principal\", 400.0);\n",[551,41227,41228],{"class":553,"line":15567},[551,41229,1139],{"emptyLinePlaceholder":238},[551,41231,41232],{"class":553,"line":15573},[551,41233,41234],{},"            \u002F\u002F Crear componentes\n",[551,41236,41237],{"class":553,"line":15578},[551,41238,41239],{},"            Contactor k1 = new Contactor(\"K1\", \"3RT2026-1BB40\", 25.0, 400.0, 3, \"Siemens\");\n",[551,41241,41242],{"class":553,"line":15584},[551,41243,41244],{},"            Contactor k2 = new Contactor(\"K2\", \"3RT2036-1BB40\", 40.0, 400.0, 3, \"Siemens\");\n",[551,41246,41247],{"class":553,"line":15590},[551,41248,1139],{"emptyLinePlaceholder":238},[551,41250,41251],{"class":553,"line":15596},[551,41252,41253],{},"            ComponenteElectrico q1 = new ComponenteElectrico(\"Q1\", \"3RV2011-1JA10\", \"Guardamotor\",\n",[551,41255,41256],{"class":553,"line":15602},[551,41257,41258],{},"                                                             4.5, 400.0, \"Siemens\");\n",[551,41260,41261],{"class":553,"line":15608},[551,41262,1139],{"emptyLinePlaceholder":238},[551,41264,41265],{"class":553,"line":15614},[551,41266,41267],{},"            ComponenteElectrico m1 = new ComponenteElectrico(\"M1\", 15.0);  \u002F\u002F Constructor simple\n",[551,41269,41270],{"class":553,"line":15620},[551,41271,41272],{},"            m1.Tipo = \"Motor\";\n",[551,41274,41275],{"class":553,"line":15626},[551,41276,41277],{},"            m1.Fabricante = \"WEG\";\n",[551,41279,41280],{"class":553,"line":15632},[551,41281,1139],{"emptyLinePlaceholder":238},[551,41283,41284],{"class":553,"line":15637},[551,41285,41286],{},"            \u002F\u002F Agregar componentes al circuito\n",[551,41288,41289],{"class":553,"line":15642},[551,41290,41291],{},"            circuitoPrincipal.AgregarComponente(k1);\n",[551,41293,41294],{"class":553,"line":15647},[551,41295,41296],{},"            circuitoPrincipal.AgregarComponente(k2);\n",[551,41298,41299],{"class":553,"line":15652},[551,41300,41301],{},"            circuitoPrincipal.AgregarComponente(q1);\n",[551,41303,41304],{"class":553,"line":15657},[551,41305,41306],{},"            circuitoPrincipal.AgregarComponente(m1);\n",[551,41308,41309],{"class":553,"line":15662},[551,41310,1139],{"emptyLinePlaceholder":238},[551,41312,41313],{"class":553,"line":15668},[551,41314,41315],{},"            \u002F\u002F Mostrar resumen\n",[551,41317,41318],{"class":553,"line":15673},[551,41319,41320],{},"            circuitoPrincipal.MostrarResumen();\n",[551,41322,41323],{"class":553,"line":15679},[551,41324,1139],{"emptyLinePlaceholder":238},[551,41326,41327],{"class":553,"line":15684},[551,41328,41329],{},"            \u002F\u002F Activar contactores\n",[551,41331,41332],{"class":553,"line":21750},[551,41333,41334],{},"            k1.Activar();\n",[551,41336,41337],{"class":553,"line":21755},[551,41338,41339],{},"            k1.Activar();  \u002F\u002F Intento de activar de nuevo\n",[551,41341,41342],{"class":553,"line":21761},[551,41343,41344],{},"            k2.Activar();\n",[551,41346,41347],{"class":553,"line":21766},[551,41348,1139],{"emptyLinePlaceholder":238},[551,41350,41352],{"class":553,"line":41351},292,[551,41353,41354],{},"            \u002F\u002F Buscar y mostrar componente específico\n",[551,41356,41358],{"class":553,"line":41357},293,[551,41359,41360],{},"            ComponenteElectrico componenteBuscado = circuitoPrincipal.BuscarComponente(\"Q1\");\n",[551,41362,41364],{"class":553,"line":41363},294,[551,41365,41366],{},"            if (componenteBuscado != null)\n",[551,41368,41370],{"class":553,"line":41369},295,[551,41371,12301],{},[551,41373,41375],{"class":553,"line":41374},296,[551,41376,41377],{},"                componenteBuscado.MostrarInformacion();\n",[551,41379,41381],{"class":553,"line":41380},297,[551,41382,12311],{},[551,41384,41386],{"class":553,"line":41385},298,[551,41387,1139],{"emptyLinePlaceholder":238},[551,41389,41391],{"class":553,"line":41390},299,[551,41392,41393],{},"            \u002F\u002F Mostrar detalle completo\n",[551,41395,41397],{"class":553,"line":41396},300,[551,41398,41399],{},"            circuitoPrincipal.MostrarDetalleCompleto();\n",[551,41401,41403],{"class":553,"line":41402},301,[551,41404,1139],{"emptyLinePlaceholder":238},[551,41406,41408],{"class":553,"line":41407},302,[551,41409,41410],{},"            \u002F\u002F Intentar agregar componente incompatible (220V en circuito 400V)\n",[551,41412,41414],{"class":553,"line":41413},303,[551,41415,41416],{},"            ComponenteElectrico x1 = new ComponenteElectrico(\"X1\", \"XYZ-123\", \"Relé\",\n",[551,41418,41420],{"class":553,"line":41419},304,[551,41421,41422],{},"                                                             2.0, 220.0, \"Generic\");\n",[551,41424,41426],{"class":553,"line":41425},305,[551,41427,41428],{},"            circuitoPrincipal.AgregarComponente(x1);  \u002F\u002F Debería fallar\n",[551,41430,41432],{"class":553,"line":41431},306,[551,41433,1139],{"emptyLinePlaceholder":238},[551,41435,41437],{"class":553,"line":41436},307,[551,41438,41439],{},"            \u002F\u002F Mostrar contadores de activaciones\n",[551,41441,41443],{"class":553,"line":41442},308,[551,41444,41445],{},"            MessageBox.Show(string.Format(\"K1 activado {0} veces\\nK2 activado {1} veces\",\n",[551,41447,41449],{"class":553,"line":41448},309,[551,41450,41451],{},"                k1.ObtenerContadorActivaciones(),\n",[551,41453,41455],{"class":553,"line":41454},310,[551,41456,41457],{},"                k2.ObtenerContadorActivaciones()));\n",[551,41459,41461],{"class":553,"line":41460},311,[551,41462,1139],{"emptyLinePlaceholder":238},[551,41464,41466],{"class":553,"line":41465},312,[551,41467,9077],{},[551,41469,41471],{"class":553,"line":41470},313,[551,41472,41473],{},"        catch (Exception ex)\n",[551,41475,41477],{"class":553,"line":41476},314,[551,41478,9062],{},[551,41480,41482],{"class":553,"line":41481},315,[551,41483,41484],{},"            MessageBox.Show(\"Error: \" + ex.Message, \"Error en la ejecución\");\n",[551,41486,41488],{"class":553,"line":41487},316,[551,41489,9077],{},[551,41491,41493],{"class":553,"line":41492},317,[551,41494,1187],{},[551,41496,41498],{"class":553,"line":41497},318,[551,41499,1193],{},[43,41501],{},[46,41503,35765],{"id":4851},[331,41505,41507],{"id":41506},"herencia-adelanto","Herencia (adelanto)",[13,41509,41510,41511,41514,41515,41],{},"En el código usamos ",[16,41512,41513],{},"herencia"," cuando ",[54,41516,41517],{},"Contactor : ComponenteElectrico",[543,41519,41521],{"className":545,"code":41520,"language":547,"meta":228,"style":228},"public class Contactor : ComponenteElectrico\n{\n    \u002F\u002F Hereda todas las propiedades y métodos de ComponenteElectrico\n    \u002F\u002F Puede agregar propiedades y métodos específicos\n}\n",[54,41522,41523,41527,41531,41536,41541],{"__ignoreMap":228},[551,41524,41525],{"class":553,"line":554},[551,41526,39284],{},[551,41528,41529],{"class":553,"line":229},[551,41530,1151],{},[551,41532,41533],{"class":553,"line":670},[551,41534,41535],{},"    \u002F\u002F Hereda todas las propiedades y métodos de ComponenteElectrico\n",[551,41537,41538],{"class":553,"line":1136},[551,41539,41540],{},"    \u002F\u002F Puede agregar propiedades y métodos específicos\n",[551,41542,41543],{"class":553,"line":1142},[551,41544,1193],{},[13,41546,41547,416],{},[16,41548,38691],{},[126,41550,41551,41554,41557],{},[88,41552,41553],{},"✅ Reutilización de código",[88,41555,41556],{},"✅ Jerarquía lógica (especialización)",[88,41558,41559],{},"✅ Polimorfismo (veremos en capítulos avanzados)",[331,41561,41563],{"id":41562},"propiedades-vs-campos","Propiedades vs Campos",[13,41565,41566,41569],{},[16,41567,41568],{},"Campo"," (field):",[543,41571,41573],{"className":545,"code":41572,"language":547,"meta":228,"style":228},"private bool estaActivado;  \u002F\u002F Almacenamiento directo\n",[54,41574,41575],{"__ignoreMap":228},[551,41576,41577],{"class":553,"line":554},[551,41578,41572],{},[13,41580,41581,41584],{},[16,41582,41583],{},"Propiedad"," (property):",[543,41586,41588],{"className":545,"code":41587,"language":547,"meta":228,"style":228},"public string Designacion { get; set; }  \u002F\u002F Con getters\u002Fsetters automáticos\n",[54,41589,41590],{"__ignoreMap":228},[551,41591,41592],{"class":553,"line":554},[551,41593,41587],{},[13,41595,41596,416],{},[16,41597,23868],{},[126,41599,41600,41606],{},[88,41601,41602,41605],{},[16,41603,41604],{},"Propiedades públicas",": Para datos que se acceden desde fuera",[88,41607,41608,41611],{},[16,41609,41610],{},"Campos privados",": Para datos internos que no se exponen",[331,41613,41615],{"id":41614},"el-operador","El operador ??",[543,41617,41619],{"className":545,"code":41618,"language":547,"meta":228,"style":228},"Codigo ?? \"N\u002FA\"\n",[54,41620,41621],{"__ignoreMap":228},[551,41622,41623],{"class":553,"line":554},[551,41624,41618],{},[13,41626,41627,41628,9848,41631,41633,41634,41637],{},"Significa: \"Si ",[54,41629,41630],{},"Codigo",[54,41632,10011],{},", usa ",[54,41635,41636],{},"\"N\u002FA\""," en su lugar\".",[331,41639,5121],{"id":5120},[126,41641,41642,41654,41665,41670,41675,41680,41686,41691],{},[88,41643,36022,41644,41647,41648,4000,41651,32897],{},[16,41645,41646],{},"Hacer",": Nombrar clases con sustantivos (",[54,41649,41650],{},"Contactor",[54,41652,41653],{},"Motor",[88,41655,36022,41656,41658,41659,4000,41662,32897],{},[16,41657,41646],{},": Nombrar métodos con verbos (",[54,41660,41661],{},"Activar()",[54,41663,41664],{},"Calcular()",[88,41666,36022,41667,41669],{},[16,41668,41646],{},": Usar constructores para inicializar objetos correctamente",[88,41671,36022,41672,41674],{},[16,41673,41646],{},": Encapsular (private) datos internos",[88,41676,36022,41677,41679],{},[16,41678,41646],{},": Validar datos en constructores y métodos públicos",[88,41681,34025,41682,41685],{},[16,41683,41684],{},"Evitar",": Exponer todos los campos como public",[88,41687,34025,41688,41690],{},[16,41689,41684],{},": Constructores sin validación",[88,41692,34025,41693,41695],{},[16,41694,41684],{},": Métodos que hacen demasiadas cosas (responsabilidad única)",[331,41697,5309],{"id":5308},[367,41699,41701,41702,41704],{"id":41700},"error-1-olvidar-new-al-crear-objetos","Error 1: Olvidar ",[54,41703,36459],{}," al crear objetos",[13,41706,41707,41709],{},[16,41708,5318],{},": Error \"Use of unassigned variable\"",[13,41711,41712,41714],{},[16,41713,1977],{},": No instanciar el objeto",[543,41716,41718],{"className":545,"code":41717,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL\nContactor k1;\nk1.Designacion = \"K1\";  \u002F\u002F ERROR: k1 no está inicializado\n\n\u002F\u002F ✓ BIEN\nContactor k1 = new Contactor(\"K1\", \"3RT2026\", 25.0, 400.0, 3, \"Siemens\");\nk1.Designacion = \"K1\";  \u002F\u002F OK\n",[54,41719,41720,41725,41730,41735,41739,41744,41749],{"__ignoreMap":228},[551,41721,41722],{"class":553,"line":554},[551,41723,41724],{},"\u002F\u002F ❌ MAL\n",[551,41726,41727],{"class":553,"line":229},[551,41728,41729],{},"Contactor k1;\n",[551,41731,41732],{"class":553,"line":670},[551,41733,41734],{},"k1.Designacion = \"K1\";  \u002F\u002F ERROR: k1 no está inicializado\n",[551,41736,41737],{"class":553,"line":1136},[551,41738,1139],{"emptyLinePlaceholder":238},[551,41740,41741],{"class":553,"line":1142},[551,41742,41743],{},"\u002F\u002F ✓ BIEN\n",[551,41745,41746],{"class":553,"line":1148},[551,41747,41748],{},"Contactor k1 = new Contactor(\"K1\", \"3RT2026\", 25.0, 400.0, 3, \"Siemens\");\n",[551,41750,41751],{"class":553,"line":1154},[551,41752,41753],{},"k1.Designacion = \"K1\";  \u002F\u002F OK\n",[367,41755,41757],{"id":41756},"error-2-confundir-clase-con-objeto","Error 2: Confundir clase con objeto",[13,41759,41760,41762],{},[16,41761,5318],{},": Error \"An object reference is required...\"",[13,41764,41765,41767],{},[16,41766,1977],{},": Intentar llamar métodos de instancia en la clase",[543,41769,41771],{"className":545,"code":41770,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL\nContactor.Activar();  \u002F\u002F ERROR: Contactor es la clase, no un objeto\n\n\u002F\u002F ✓ BIEN\nContactor k1 = new Contactor(...);\nk1.Activar();  \u002F\u002F OK: k1 es un objeto\n",[54,41772,41773,41777,41782,41786,41790,41795],{"__ignoreMap":228},[551,41774,41775],{"class":553,"line":554},[551,41776,41724],{},[551,41778,41779],{"class":553,"line":229},[551,41780,41781],{},"Contactor.Activar();  \u002F\u002F ERROR: Contactor es la clase, no un objeto\n",[551,41783,41784],{"class":553,"line":670},[551,41785,1139],{"emptyLinePlaceholder":238},[551,41787,41788],{"class":553,"line":1136},[551,41789,41743],{},[551,41791,41792],{"class":553,"line":1142},[551,41793,41794],{},"Contactor k1 = new Contactor(...);\n",[551,41796,41797],{"class":553,"line":1148},[551,41798,41799],{},"k1.Activar();  \u002F\u002F OK: k1 es un objeto\n",[367,41801,41803],{"id":41802},"error-3-nullreferenceexception","Error 3: NullReferenceException",[13,41805,41806,41808],{},[16,41807,5318],{},": Error \"Object reference not set to an instance of an object\"",[13,41810,41811,41813,41814],{},[16,41812,1977],{},": Usar un objeto que es ",[54,41815,10011],{},[543,41817,41819],{"className":545,"code":41818,"language":547,"meta":228,"style":228},"Circuito circuito = null;\ncircuito.AgregarComponente(k1);  \u002F\u002F ❌ ERROR: circuito es null\n\n\u002F\u002F Solución: Siempre inicializar\nCircuito circuito = new Circuito(\"Principal\", 400.0);\ncircuito.AgregarComponente(k1);  \u002F\u002F ✓ OK\n",[54,41820,41821,41826,41831,41835,41840,41845],{"__ignoreMap":228},[551,41822,41823],{"class":553,"line":554},[551,41824,41825],{},"Circuito circuito = null;\n",[551,41827,41828],{"class":553,"line":229},[551,41829,41830],{},"circuito.AgregarComponente(k1);  \u002F\u002F ❌ ERROR: circuito es null\n",[551,41832,41833],{"class":553,"line":670},[551,41834,1139],{"emptyLinePlaceholder":238},[551,41836,41837],{"class":553,"line":1136},[551,41838,41839],{},"\u002F\u002F Solución: Siempre inicializar\n",[551,41841,41842],{"class":553,"line":1142},[551,41843,41844],{},"Circuito circuito = new Circuito(\"Principal\", 400.0);\n",[551,41846,41847],{"class":553,"line":1148},[551,41848,41849],{},"circuito.AgregarComponente(k1);  \u002F\u002F ✓ OK\n",[43,41851],{},[46,41853,41854],{"id":5451},"⚡ Desafíos (Opcional)",[331,41856,41858],{"id":41857},"desafío-1-clase-motor-con-cálculo-de-corriente","Desafío 1: Clase Motor con cálculo de corriente",[13,41860,41861,41863],{},[16,41862,5464],{},": ⭐☆☆",[13,41865,41866,41867,41869,41870,41872],{},"Crea una clase ",[54,41868,41653],{}," que herede de ",[54,41871,39251],{}," y que calcule automáticamente la corriente nominal basada en potencia, voltaje y factor de potencia.",[5487,41874,41875,41878,41884],{},[5490,41876,41877],{},"💡 Pista",[13,41879,41880,41881],{},"Usa la fórmula: ",[54,41882,41883],{},"I = P \u002F (√3 × V × cosφ)",[13,41885,41886,41887,41890,41891,41],{},"Crea una propiedad ",[54,41888,41889],{},"FactorPotencia"," y un método ",[54,41892,41893],{},"CalcularCorriente()",[5487,41895,41896,41899],{},[5490,41897,41898],{},"✅ Solución",[543,41900,41902],{"className":545,"code":41901,"language":547,"meta":228,"style":228},"public class Motor : ComponenteElectrico\n{\n    public double PotenciaKW { get; set; }\n    public double FactorPotencia { get; set; }\n    public int Polos { get; set; }\n    public double Rpm { get; set; }\n\n    public Motor(string designacion, double potenciaKW, double voltaje,\n                 double factorPotencia, int polos, string fabricante)\n        : base(designacion, \"\", \"Motor\", 0, voltaje, fabricante)\n    {\n        this.PotenciaKW = potenciaKW;\n        this.FactorPotencia = factorPotencia;\n        this.Polos = polos;\n\n        \u002F\u002F Calcular corriente automáticamente\n        this.Corriente = CalcularCorrienteNominal();\n\n        \u002F\u002F Calcular RPM aproximadas (frecuencia 50Hz)\n        this.Rpm = (120 * 50) \u002F polos;\n    }\n\n    private double CalcularCorrienteNominal()\n    {\n        \u002F\u002F I = P \u002F (√3 × V × cosφ)\n        return (PotenciaKW * 1000) \u002F (1.732 * Voltaje * FactorPotencia);\n    }\n\n    public string ObtenerDatosMotor()\n    {\n        return string.Format(\"{0}\\nPotencia: {1}kW\\nRPM: {2}\\nFactor de potencia: {3}\\nCorriente nominal: {4:F2}A\",\n            Designacion, PotenciaKW, Rpm, FactorPotencia, Corriente);\n    }\n}\n\n\u002F\u002F Uso\nMotor m1 = new Motor(\"M1\", 7.5, 400.0, 0.85, 4, \"WEG\");\nMessageBox.Show(m1.ObtenerDatosMotor());\n",[54,41903,41904,41909,41913,41918,41923,41927,41932,41936,41941,41946,41951,41955,41960,41965,41969,41973,41978,41983,41987,41992,41997,42001,42005,42010,42014,42018,42023,42027,42031,42036,42040,42045,42050,42054,42058,42062,42066,42071],{"__ignoreMap":228},[551,41905,41906],{"class":553,"line":554},[551,41907,41908],{},"public class Motor : ComponenteElectrico\n",[551,41910,41911],{"class":553,"line":229},[551,41912,1151],{},[551,41914,41915],{"class":553,"line":670},[551,41916,41917],{},"    public double PotenciaKW { get; set; }\n",[551,41919,41920],{"class":553,"line":1136},[551,41921,41922],{},"    public double FactorPotencia { get; set; }\n",[551,41924,41925],{"class":553,"line":1142},[551,41926,39306],{},[551,41928,41929],{"class":553,"line":1148},[551,41930,41931],{},"    public double Rpm { get; set; }\n",[551,41933,41934],{"class":553,"line":1154},[551,41935,1139],{"emptyLinePlaceholder":238},[551,41937,41938],{"class":553,"line":1160},[551,41939,41940],{},"    public Motor(string designacion, double potenciaKW, double voltaje,\n",[551,41942,41943],{"class":553,"line":1166},[551,41944,41945],{},"                 double factorPotencia, int polos, string fabricante)\n",[551,41947,41948],{"class":553,"line":1172},[551,41949,41950],{},"        : base(designacion, \"\", \"Motor\", 0, voltaje, fabricante)\n",[551,41952,41953],{"class":553,"line":1178},[551,41954,1169],{},[551,41956,41957],{"class":553,"line":1184},[551,41958,41959],{},"        this.PotenciaKW = potenciaKW;\n",[551,41961,41962],{"class":553,"line":1190},[551,41963,41964],{},"        this.FactorPotencia = factorPotencia;\n",[551,41966,41967],{"class":553,"line":1472},[551,41968,39359],{},[551,41970,41971],{"class":553,"line":1477},[551,41972,1139],{"emptyLinePlaceholder":238},[551,41974,41975],{"class":553,"line":1797},[551,41976,41977],{},"        \u002F\u002F Calcular corriente automáticamente\n",[551,41979,41980],{"class":553,"line":1802},[551,41981,41982],{},"        this.Corriente = CalcularCorrienteNominal();\n",[551,41984,41985],{"class":553,"line":1808},[551,41986,1139],{"emptyLinePlaceholder":238},[551,41988,41989],{"class":553,"line":1814},[551,41990,41991],{},"        \u002F\u002F Calcular RPM aproximadas (frecuencia 50Hz)\n",[551,41993,41994],{"class":553,"line":1820},[551,41995,41996],{},"        this.Rpm = (120 * 50) \u002F polos;\n",[551,41998,41999],{"class":553,"line":1826},[551,42000,1187],{},[551,42002,42003],{"class":553,"line":1832},[551,42004,1139],{"emptyLinePlaceholder":238},[551,42006,42007],{"class":553,"line":1838},[551,42008,42009],{},"    private double CalcularCorrienteNominal()\n",[551,42011,42012],{"class":553,"line":1844},[551,42013,1169],{},[551,42015,42016],{"class":553,"line":1850},[551,42017,38153],{},[551,42019,42020],{"class":553,"line":1855},[551,42021,42022],{},"        return (PotenciaKW * 1000) \u002F (1.732 * Voltaje * FactorPotencia);\n",[551,42024,42025],{"class":553,"line":1861},[551,42026,1187],{},[551,42028,42029],{"class":553,"line":1867},[551,42030,1139],{"emptyLinePlaceholder":238},[551,42032,42033],{"class":553,"line":1873},[551,42034,42035],{},"    public string ObtenerDatosMotor()\n",[551,42037,42038],{"class":553,"line":1878},[551,42039,1169],{},[551,42041,42042],{"class":553,"line":1883},[551,42043,42044],{},"        return string.Format(\"{0}\\nPotencia: {1}kW\\nRPM: {2}\\nFactor de potencia: {3}\\nCorriente nominal: {4:F2}A\",\n",[551,42046,42047],{"class":553,"line":1888},[551,42048,42049],{},"            Designacion, PotenciaKW, Rpm, FactorPotencia, Corriente);\n",[551,42051,42052],{"class":553,"line":4615},[551,42053,1187],{},[551,42055,42056],{"class":553,"line":4620},[551,42057,1193],{},[551,42059,42060],{"class":553,"line":4626},[551,42061,1139],{"emptyLinePlaceholder":238},[551,42063,42064],{"class":553,"line":4631},[551,42065,29799],{},[551,42067,42068],{"class":553,"line":4636},[551,42069,42070],{},"Motor m1 = new Motor(\"M1\", 7.5, 400.0, 0.85, 4, \"WEG\");\n",[551,42072,42073],{"class":553,"line":4641},[551,42074,42075],{},"MessageBox.Show(m1.ObtenerDatosMotor());\n",[43,42077],{},[331,42079,42081],{"id":42080},"desafío-2-clase-guardamotor-con-rango-de-regulación","Desafío 2: Clase Guardamotor con rango de regulación",[13,42083,42084,42086],{},[16,42085,5464],{},": ⭐⭐☆",[13,42088,41866,42089,42092,42093,4842,42096,42099],{},[54,42090,42091],{},"Guardamotor"," con propiedades ",[54,42094,42095],{},"CorrienteMin",[54,42097,42098],{},"CorrienteMax"," (rango de regulación). Agrega un método que valide si una corriente dada está dentro del rango.",[5487,42101,42102,42104],{},[5490,42103,41877],{},[13,42105,42106,42107,4842,42109,42111,42112,41],{},"Usa propiedades ",[54,42108,42095],{},[54,42110,42098],{},", y crea método ",[54,42113,42114],{},"EsValidaParaMotor(double corrienteMotor)",[43,42116],{},[331,42118,42120],{"id":42119},"desafío-3-exportar-circuito-a-texto","Desafío 3: Exportar circuito a texto",[13,42122,42123,42125],{},[16,42124,5464],{},": ⭐⭐⭐",[13,42127,42128,42129,42132,42133,42136],{},"Agrega un método a la clase ",[54,42130,42131],{},"Circuito"," que exporte toda la información del circuito a un archivo de texto (",[54,42134,42135],{},".txt",") con formato profesional.",[5487,42138,42139,42141],{},[5490,42140,41877],{},[13,42142,10479,42143,42146],{},[54,42144,42145],{},"System.IO.File.WriteAllText()"," y construye un string con formato tabular.",[43,42148],{},[46,42150,36015],{"id":22684},[13,42152,22688],{},[126,42154,42155,42161,42167,42173,42181,42187,42193,42202],{},[88,42156,36022,42157,42160],{},[16,42158,42159],{},"Qué es POO",": Programación orientada a objetos como forma de organizar código",[88,42162,36022,42163,42166],{},[16,42164,42165],{},"Clase vs Objeto",": Plano (clase) vs instancia concreta (objeto)",[88,42168,36022,42169,42172],{},[16,42170,42171],{},"Propiedades",": Almacenar datos del objeto (public\u002Fprivate, calculadas)",[88,42174,36022,42175,42178,42179],{},[16,42176,42177],{},"Constructores",": Inicializar objetos correctamente con ",[54,42180,36459],{},[88,42182,36022,42183,42186],{},[16,42184,42185],{},"Métodos",": Definir comportamientos del objeto",[88,42188,36022,42189,42192],{},[16,42190,42191],{},"Encapsulación",": Ocultar detalles internos (public\u002Fprivate)",[88,42194,36022,42195,42198,42199],{},[16,42196,42197],{},"Herencia básica",": Reutilizar código con ",[54,42200,42201],{},"class Hijo : Padre",[88,42203,36022,42204,42206],{},[16,42205,22725],{},": Sistema completo de gestión de componentes eléctricos",[13,42208,42209,416],{},[16,42210,22731],{},[126,42212,42213,42216,42221,42224,42227],{},[88,42214,42215],{},"Las clases son plantillas, los objetos son instancias",[88,42217,42218,42220],{},[54,42219,36459],{}," crea un nuevo objeto a partir de la clase",[88,42222,42223],{},"Las propiedades almacenan datos, los métodos definen comportamientos",[88,42225,42226],{},"La encapsulación protege datos internos (private) y expone interfaz pública (public)",[88,42228,42229],{},"POO te prepara para trabajar con EPLAN API (que usa POO intensivamente)",[43,42231],{},[46,42233,36079],{"id":36078},[331,42235,36083],{"id":36082},[13,42237,42238],{},[16,42239,42240],{},"Capítulo 9: Colecciones de datos",[331,42242,36092],{"id":36091},[13,42244,42245],{},[16,42246,42247],{},"Capítulo 11: Manejo de errores",[13,42249,42250,42251,42254],{},"En el próximo capítulo aprenderás a manejar errores y excepciones de forma robusta usando ",[54,42252,42253],{},"try-catch-finally",". Construirás validadores que no fallan ante datos incorrectos y aprenderás logging profesional.",[43,42256],{},[46,42258,36105],{"id":10522},[126,42260,42261,42268,42275,42282,42289],{},[88,42262,16557,42263],{},[955,42264,42267],{"href":42265,"rel":42266},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Ffundamentals\u002Ftypes\u002Fclasses",[959],"Documentación de C# - Clases",[88,42269,16557,42270],{},[955,42271,42274],{"href":42272,"rel":42273},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Fprogramming-guide\u002Fclasses-and-structs\u002Fproperties",[959],"Documentación de C# - Propiedades",[88,42276,16557,42277],{},[955,42278,42281],{"href":42279,"rel":42280},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Fprogramming-guide\u002Fclasses-and-structs\u002Fconstructors",[959],"Documentación de C# - Constructores",[88,42283,16557,42284],{},[955,42285,42288],{"href":42286,"rel":42287},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Ffundamentals\u002Fobject-oriented\u002F",[959],"Documentación de C# - Encapsulación",[88,42290,36133,42291,93,42293],{},[551,42292,36136],{},[54,42294,42295],{},"code\u002Fcap-10\u002F",[43,42297],{},[46,42299,36144],{"id":5727},[331,42301,42303],{"id":42302},"p-cuál-es-la-diferencia-entre-una-clase-y-un-objeto","P: ¿Cuál es la diferencia entre una clase y un objeto?",[13,42305,42306,42308,42309,42312,42313,42316,42317,42320,42321,42323,42324,42327],{},[16,42307,5737],{}," Una ",[16,42310,42311],{},"clase"," es el plano o plantilla (ej. ",[54,42314,42315],{},"class Contactor","). Un ",[16,42318,42319],{},"objeto"," es una instancia concreta creada con ",[54,42322,36459],{}," (ej. ",[54,42325,42326],{},"Contactor k1 = new Contactor(...)","). Puedes crear muchos objetos a partir de una sola clase.",[331,42329,42331,42332,42335,42336,36151],{"id":42330},"p-cuándo-debo-usar-public-y-cuándo-private","P: ¿Cuándo debo usar ",[54,42333,42334],{},"public"," y cuándo ",[54,42337,42338],{},"private",[13,42340,42341,5755,42343,42347,42348,42352],{},[16,42342,5737],{},[16,42344,42345],{},[54,42346,42334],{}," para propiedades y métodos que necesitan ser accesibles desde fuera de la clase. Usa ",[16,42349,42350],{},[54,42351,42338],{}," para datos internos que no deben ser modificados directamente. Regla general: expón solo lo necesario.",[331,42354,42356],{"id":42355},"p-puedo-tener-múltiples-constructores-en-una-clase","P: ¿Puedo tener múltiples constructores en una clase?",[13,42358,42359,42361,42362,42365],{},[16,42360,5737],{}," Sí, se llama ",[16,42363,42364],{},"sobrecarga de constructores",". Cada constructor debe tener diferente número o tipo de parámetros.",[331,42367,42369,42370,42372],{"id":42368},"p-qué-es-this-y-cuándo-debo-usarlo","P: ¿Qué es ",[54,42371,37746],{}," y cuándo debo usarlo?",[13,42374,42375,73,42377,42379],{},[16,42376,5737],{},[54,42378,37746],{}," se refiere al objeto actual. Úsalo para:",[85,42381,42382,42385,42388],{},[88,42383,42384],{},"Distinguir entre parámetros y propiedades con el mismo nombre",[88,42386,42387],{},"Llamar a otro constructor desde un constructor",[88,42389,42390],{},"Pasar el objeto actual a otro método",[331,42392,42394],{"id":42393},"p-necesito-entender-poo-avanzado-para-trabajar-con-eplan-api","P: ¿Necesito entender POO avanzado para trabajar con EPLAN API?",[13,42396,42397,42399],{},[16,42398,5737],{}," No. Con lo aprendido en este capítulo (clases, objetos, propiedades, métodos, constructores) es suficiente para usar EPLAN API. Los conceptos avanzados (interfaces, polimorfismo, clases abstractas) son opcionales.",[331,42401,42403],{"id":42402},"p-qué-es-la-herencia-y-cómo-funciona","P: ¿Qué es la herencia y cómo funciona?",[13,42405,42406,42408],{},[16,42407,5737],{}," La herencia permite crear una clase nueva (hijo) basada en una clase existente (padre). La clase hijo hereda todas las propiedades y métodos del padre, y puede agregar los suyos propios o sobrescribirlos.",[543,42410,42412],{"className":545,"code":42411,"language":547,"meta":228,"style":228},"public class ComponenteElectrico { ... }  \u002F\u002F Padre\npublic class Contactor : ComponenteElectrico { ... }  \u002F\u002F Hijo hereda de padre\n",[54,42413,42414,42419],{"__ignoreMap":228},[551,42415,42416],{"class":553,"line":554},[551,42417,42418],{},"public class ComponenteElectrico { ... }  \u002F\u002F Padre\n",[551,42420,42421],{"class":553,"line":229},[551,42422,42423],{},"public class Contactor : ComponenteElectrico { ... }  \u002F\u002F Hijo hereda de padre\n",[43,42425],{},[46,42427,36275],{"id":10614},[13,42429,10618],{},[126,42431,42433,42439,42445,42451,42463,42471,42477,42483,42489],{"className":42432},[275],[88,42434,42436,42438],{"className":42435},[279],[281,42437],{"disabled":238,"type":283}," Entender la diferencia entre clase y objeto",[88,42440,42442,42444],{"className":42441},[279],[281,42443],{"disabled":238,"type":283}," Poder crear clases con propiedades y métodos",[88,42446,42448,42450],{"className":42447},[279],[281,42449],{"disabled":238,"type":283}," Saber usar constructores para inicializar objetos",[88,42452,42454,42456,42457,42459,42460,42462],{"className":42453},[279],[281,42455],{"disabled":238,"type":283}," Entender ",[54,42458,42334],{}," vs ",[54,42461,42338],{}," (encapsulación)",[88,42464,42466,42468,42469],{"className":42465},[279],[281,42467],{"disabled":238,"type":283}," Poder instanciar objetos con ",[54,42470,36459],{},[88,42472,42474,42476],{"className":42473},[279],[281,42475],{"disabled":238,"type":283}," Comprender qué es la herencia básica",[88,42478,42480,42482],{"className":42479},[279],[281,42481],{"disabled":238,"type":283}," Haber ejecutado el sistema de gestión de componentes",[88,42484,42486,42488],{"className":42485},[279],[281,42487],{"disabled":238,"type":283}," Poder agregar nuevas clases (Motor, Guardamotor)",[88,42490,42492,10669],{"className":42491},[279],[281,42493],{"disabled":238,"type":283},[43,42495],{},[13,42497,42498,36338],{},[16,42499,42500],{},"¿Listo para aprender manejo robusto de errores? ¡Vamos al Capítulo 11!",[43,42502],{},[13,42504,42505,10676,42507,42509,42510,93,42512],{},[31,42506,657],{},[31,42508,10679],{},": 70-80 minutos\n",[31,42511,10683],{},[54,42513,42295],{},[660,42515,662],{},{"title":228,"searchDepth":229,"depth":229,"links":42517},[42518,42519,42520,42521,42531,42537,42544,42549,42550,42554,42555,42565],{"id":267,"depth":229,"text":33353},{"id":319,"depth":229,"text":33429},{"id":739,"depth":229,"text":33450},{"id":328,"depth":229,"text":33501,"children":42522},[42523,42524,42525,42526,42527,42528,42529],{"id":36560,"depth":670,"text":36561},{"id":36830,"depth":670,"text":36831},{"id":37186,"depth":670,"text":37187},{"id":37567,"depth":670,"text":37568},{"id":37990,"depth":670,"text":37991},{"id":38406,"depth":670,"text":38407},{"id":38710,"depth":670,"text":42530},"7. La palabra clave this",{"id":4024,"depth":229,"text":35443,"children":42532},[42533,42534,42535,42536],{"id":38926,"depth":670,"text":38927},{"id":39273,"depth":670,"text":39274},{"id":39546,"depth":670,"text":39547},{"id":4464,"depth":670,"text":4465},{"id":4851,"depth":229,"text":35765,"children":42538},[42539,42540,42541,42542,42543],{"id":41506,"depth":670,"text":41507},{"id":41562,"depth":670,"text":41563},{"id":41614,"depth":670,"text":41615},{"id":5120,"depth":670,"text":5121},{"id":5308,"depth":670,"text":5309},{"id":5451,"depth":229,"text":41854,"children":42545},[42546,42547,42548],{"id":41857,"depth":670,"text":41858},{"id":42080,"depth":670,"text":42081},{"id":42119,"depth":670,"text":42120},{"id":22684,"depth":229,"text":36015},{"id":36078,"depth":229,"text":36079,"children":42551},[42552,42553],{"id":36082,"depth":670,"text":36083},{"id":36091,"depth":670,"text":36092},{"id":10522,"depth":229,"text":36105},{"id":5727,"depth":229,"text":36144,"children":42556},[42557,42558,42560,42561,42563,42564],{"id":42302,"depth":670,"text":42303},{"id":42330,"depth":670,"text":42559},"P: ¿Cuándo debo usar public y cuándo private?",{"id":42355,"depth":670,"text":42356},{"id":42368,"depth":670,"text":42562},"P: ¿Qué es this y cuándo debo usarlo?",{"id":42393,"depth":670,"text":42394},{"id":42402,"depth":670,"text":42403},{"id":10614,"depth":229,"text":36275},"Aprende programación orientada a objetos (POO) en C#: clases y objetos para estructurar scripts EPLAN y automatizar EPLAN Electric P8.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-10-clases-objetos-poo",{"title":36399,"description":42566},"guia\u002Ffundamentos\u002Fcap-10-clases-objetos-poo","Wl4iQ3_ji3FUIEm7nud_mOvhzRA4QL_B4EErTOXeqzk",{"id":42573,"title":42574,"body":42575,"description":49580,"extension":236,"meta":49581,"navigation":238,"path":49582,"seo":49583,"stem":49584,"tagline":242,"__hash__":49585},"guia\u002Fguia\u002Ffundamentos\u002Fcap-11-manejo-errores.md","Capítulo 11: Manejo de errores en C# (try\u002Fcatch)",{"type":7,"value":42576,"toc":49540},[42577,42587,42589,42591,42593,42669,42671,42673,42675,42691,42693,42695,42700,42703,42723,42727,42729,42731,42735,42739,42745,42846,42852,43089,43094,43111,43113,43117,43124,43128,43256,43260,43263,43319,43321,43325,43329,43384,43388,43408,43412,43500,43512,43556,43560,43658,43666,43680,43684,43760,43762,43766,43770,43880,43884,43947,43951,44144,44146,44150,44154,44223,44227,44325,44330,44352,44356,44512,44514,44518,44522,44817,44822,44828,44832,45135,45137,45141,45145,45217,45223,45227,45349,45353,45468,45472,45590,45594,45685,45687,45689,45695,45699,48837,48841,48847,48853,48855,48857,48861,48866,48877,48882,48893,48897,48902,49022,49026,49110,49118,49129,49131,49133,49135,49183,49187,49211,49213,49215,49217,49221,49223,49228,49231,49233,49235,49272,49274,49276,49280,49289,49298,49302,49320,49328,49332,49352,49356,49367,49371,49379,49419,49426,49439,49441,49443,49445,49510,49512,49518,49521,49526,49528,49538],[10,42578,42579],{},[13,42580,42581,19,42583,19,42585,262],{},[16,42582,256],{},[16,42584,22993],{},[16,42586,25],{},[43,42588],{},[46,42590,33353],{"id":267},[13,42592,702],{},[126,42594,42596,42605,42614,42623,42633,42642,42651,42660],{"className":42595},[275],[88,42597,42599,73,42601,42604],{"className":42598},[279],[281,42600],{"disabled":238,"type":283},[16,42602,42603],{},"Entender qué son las excepciones"," y por qué ocurren",[88,42606,42608,73,42610,42613],{"className":42607},[279],[281,42609],{"disabled":238,"type":283},[16,42611,42612],{},"Usar try-catch-finally"," para manejar errores de forma controlada",[88,42615,42617,73,42619,42622],{"className":42616},[279],[281,42618],{"disabled":238,"type":283},[16,42620,42621],{},"Identificar tipos comunes de excepciones"," en C#",[88,42624,42626,73,42628,21817,42631],{"className":42625},[279],[281,42627],{"disabled":238,"type":283},[16,42629,42630],{},"Lanzar excepciones propias",[54,42632,22453],{},[88,42634,42636,73,42638,42641],{"className":42635},[279],[281,42637],{"disabled":238,"type":283},[16,42639,42640],{},"Implementar logging"," para rastrear errores",[88,42643,42645,73,42647,42650],{"className":42644},[279],[281,42646],{"disabled":238,"type":283},[16,42648,42649],{},"Validar datos"," antes de procesarlos",[88,42652,42654,73,42656,42659],{"className":42653},[279],[281,42655],{"disabled":238,"type":283},[16,42657,42658],{},"Construir un validador robusto"," que nunca falla inesperadamente",[88,42661,42663,73,42665,42668],{"className":42662},[279],[281,42664],{"disabled":238,"type":283},[16,42666,42667],{},"Aplicar mejores prácticas"," de manejo de errores en scripts de automatización",[43,42670],{},[46,42672,33429],{"id":319},[13,42674,726],{},[126,42676,42677,42680,42683,42685,42688],{},[88,42678,42679],{},"✅ Haber completado el Capítulo 10",[88,42681,42682],{},"✅ Entender clases y objetos básicos",[88,42684,36502],{},[88,42686,42687],{},"✅ Conocer funciones y métodos",[88,42689,42690],{},"✅ Comprender control de flujo (if\u002Felse, loops)",[43,42692],{},[46,42694,33450],{"id":739},[13,42696,42697],{},[16,42698,42699],{},"Validador Robusto de Archivos y Datos EPLAN",[13,42701,42702],{},"Al final de este capítulo habrás construido un sistema completo que:",[126,42704,42705,42708,42711,42714,42717,42720],{},[88,42706,42707],{},"Valida archivos antes de procesarlos (existencia, extensión, permisos)",[88,42709,42710],{},"Procesa listas de componentes con validación de datos",[88,42712,42713],{},"Maneja errores de forma elegante sin interrumpir la ejecución",[88,42715,42716],{},"Genera logs detallados de errores y advertencias",[88,42718,42719],{},"Implementa validaciones personalizadas con excepciones",[88,42721,42722],{},"Crea reportes de validación profesionales",[13,42724,42725,36539],{},[16,42726,753],{},[43,42728],{},[46,42730,33501],{"id":328},[331,42732,42734],{"id":42733},"_1-introducción-el-problema-de-los-errores","1. Introducción: El problema de los errores",[367,42736,42738],{"id":42737},"_11-qué-puede-salir-mal","1.1 ¿Qué puede salir mal?",[13,42740,42741,42744],{},[16,42742,42743],{},"Sin manejo de errores"," (código frágil):",[543,42746,42748],{"className":545,"code":42747,"language":547,"meta":228,"style":228},"public void ProcesarArchivo()\n{\n    string archivo = @\"C:\\datos\\componentes.txt\";\n\n    \u002F\u002F ❌ ¿Y si el archivo no existe?\n    string contenido = System.IO.File.ReadAllText(archivo);\n\n    \u002F\u002F ❌ ¿Y si el contenido está vacío?\n    string[] lineas = contenido.Split('\\n');\n\n    \u002F\u002F ❌ ¿Y si una línea está mal formateada?\n    foreach (string linea in lineas)\n    {\n        string[] partes = linea.Split(',');\n        double corriente = double.Parse(partes[2]);  \u002F\u002F ❌ ¿Y si no es un número?\n    }\n\n    MessageBox.Show(\"Procesamiento completado\");\n}\n\n\u002F\u002F Resultado: Script se cae con excepción no controlada\n",[54,42749,42750,42755,42759,42764,42768,42773,42778,42782,42787,42792,42796,42801,42806,42810,42815,42820,42824,42828,42833,42837,42841],{"__ignoreMap":228},[551,42751,42752],{"class":553,"line":554},[551,42753,42754],{},"public void ProcesarArchivo()\n",[551,42756,42757],{"class":553,"line":229},[551,42758,1151],{},[551,42760,42761],{"class":553,"line":670},[551,42762,42763],{},"    string archivo = @\"C:\\datos\\componentes.txt\";\n",[551,42765,42766],{"class":553,"line":1136},[551,42767,1139],{"emptyLinePlaceholder":238},[551,42769,42770],{"class":553,"line":1142},[551,42771,42772],{},"    \u002F\u002F ❌ ¿Y si el archivo no existe?\n",[551,42774,42775],{"class":553,"line":1148},[551,42776,42777],{},"    string contenido = System.IO.File.ReadAllText(archivo);\n",[551,42779,42780],{"class":553,"line":1154},[551,42781,1139],{"emptyLinePlaceholder":238},[551,42783,42784],{"class":553,"line":1160},[551,42785,42786],{},"    \u002F\u002F ❌ ¿Y si el contenido está vacío?\n",[551,42788,42789],{"class":553,"line":1166},[551,42790,42791],{},"    string[] lineas = contenido.Split('\\n');\n",[551,42793,42794],{"class":553,"line":1172},[551,42795,1139],{"emptyLinePlaceholder":238},[551,42797,42798],{"class":553,"line":1178},[551,42799,42800],{},"    \u002F\u002F ❌ ¿Y si una línea está mal formateada?\n",[551,42802,42803],{"class":553,"line":1184},[551,42804,42805],{},"    foreach (string linea in lineas)\n",[551,42807,42808],{"class":553,"line":1190},[551,42809,1169],{},[551,42811,42812],{"class":553,"line":1472},[551,42813,42814],{},"        string[] partes = linea.Split(',');\n",[551,42816,42817],{"class":553,"line":1477},[551,42818,42819],{},"        double corriente = double.Parse(partes[2]);  \u002F\u002F ❌ ¿Y si no es un número?\n",[551,42821,42822],{"class":553,"line":1797},[551,42823,1187],{},[551,42825,42826],{"class":553,"line":1802},[551,42827,1139],{"emptyLinePlaceholder":238},[551,42829,42830],{"class":553,"line":1808},[551,42831,42832],{},"    MessageBox.Show(\"Procesamiento completado\");\n",[551,42834,42835],{"class":553,"line":1814},[551,42836,1193],{},[551,42838,42839],{"class":553,"line":1820},[551,42840,1139],{"emptyLinePlaceholder":238},[551,42842,42843],{"class":553,"line":1826},[551,42844,42845],{},"\u002F\u002F Resultado: Script se cae con excepción no controlada\n",[13,42847,42848,42851],{},[16,42849,42850],{},"Con manejo de errores"," (código robusto):",[543,42853,42855],{"className":545,"code":42854,"language":547,"meta":228,"style":228},"public void ProcesarArchivo()\n{\n    try\n    {\n        string archivo = @\"C:\\datos\\componentes.txt\";\n\n        \u002F\u002F Validar que existe\n        if (!System.IO.File.Exists(archivo))\n        {\n            MessageBox.Show(\"Error: El archivo no existe\", \"Error\");\n            return;\n        }\n\n        string contenido = System.IO.File.ReadAllText(archivo);\n\n        \u002F\u002F Validar contenido\n        if (string.IsNullOrEmpty(contenido))\n        {\n            MessageBox.Show(\"Error: El archivo está vacío\", \"Error\");\n            return;\n        }\n\n        string[] lineas = contenido.Split('\\n');\n\n        foreach (string linea in lineas)\n        {\n            try\n            {\n                string[] partes = linea.Split(',');\n\n                double corriente;\n                if (!double.TryParse(partes[2], out corriente))\n                {\n                    MessageBox.Show(string.Format(\"Advertencia: Línea inválida: {0}\", linea));\n                    continue;  \u002F\u002F Salta esta línea, pero continúa con las demás\n                }\n\n                \u002F\u002F Procesar corriente...\n            }\n            catch (Exception ex)\n            {\n                MessageBox.Show(string.Format(\"Error en línea: {0}\\n{1}\", linea, ex.Message));\n            }\n        }\n\n        MessageBox.Show(\"Procesamiento completado con éxito\");\n    }\n    catch (Exception ex)\n    {\n        MessageBox.Show(string.Format(\"Error general: {0}\", ex.Message), \"Error crítico\");\n    }\n}\n",[54,42856,42857,42861,42865,42870,42874,42879,42883,42888,42893,42897,42902,42907,42911,42915,42920,42924,42929,42934,42938,42943,42947,42951,42955,42960,42964,42969,42973,42978,42982,42987,42991,42996,43001,43005,43010,43015,43019,43023,43028,43032,43037,43041,43046,43050,43054,43058,43063,43067,43072,43076,43081,43085],{"__ignoreMap":228},[551,42858,42859],{"class":553,"line":554},[551,42860,42754],{},[551,42862,42863],{"class":553,"line":229},[551,42864,1151],{},[551,42866,42867],{"class":553,"line":670},[551,42868,42869],{},"    try\n",[551,42871,42872],{"class":553,"line":1136},[551,42873,1169],{},[551,42875,42876],{"class":553,"line":1142},[551,42877,42878],{},"        string archivo = @\"C:\\datos\\componentes.txt\";\n",[551,42880,42881],{"class":553,"line":1148},[551,42882,1139],{"emptyLinePlaceholder":238},[551,42884,42885],{"class":553,"line":1154},[551,42886,42887],{},"        \u002F\u002F Validar que existe\n",[551,42889,42890],{"class":553,"line":1160},[551,42891,42892],{},"        if (!System.IO.File.Exists(archivo))\n",[551,42894,42895],{"class":553,"line":1166},[551,42896,9062],{},[551,42898,42899],{"class":553,"line":1172},[551,42900,42901],{},"            MessageBox.Show(\"Error: El archivo no existe\", \"Error\");\n",[551,42903,42904],{"class":553,"line":1178},[551,42905,42906],{},"            return;\n",[551,42908,42909],{"class":553,"line":1184},[551,42910,9077],{},[551,42912,42913],{"class":553,"line":1190},[551,42914,1139],{"emptyLinePlaceholder":238},[551,42916,42917],{"class":553,"line":1472},[551,42918,42919],{},"        string contenido = System.IO.File.ReadAllText(archivo);\n",[551,42921,42922],{"class":553,"line":1477},[551,42923,1139],{"emptyLinePlaceholder":238},[551,42925,42926],{"class":553,"line":1797},[551,42927,42928],{},"        \u002F\u002F Validar contenido\n",[551,42930,42931],{"class":553,"line":1802},[551,42932,42933],{},"        if (string.IsNullOrEmpty(contenido))\n",[551,42935,42936],{"class":553,"line":1808},[551,42937,9062],{},[551,42939,42940],{"class":553,"line":1814},[551,42941,42942],{},"            MessageBox.Show(\"Error: El archivo está vacío\", \"Error\");\n",[551,42944,42945],{"class":553,"line":1820},[551,42946,42906],{},[551,42948,42949],{"class":553,"line":1826},[551,42950,9077],{},[551,42952,42953],{"class":553,"line":1832},[551,42954,1139],{"emptyLinePlaceholder":238},[551,42956,42957],{"class":553,"line":1838},[551,42958,42959],{},"        string[] lineas = contenido.Split('\\n');\n",[551,42961,42962],{"class":553,"line":1844},[551,42963,1139],{"emptyLinePlaceholder":238},[551,42965,42966],{"class":553,"line":1850},[551,42967,42968],{},"        foreach (string linea in lineas)\n",[551,42970,42971],{"class":553,"line":1855},[551,42972,9062],{},[551,42974,42975],{"class":553,"line":1861},[551,42976,42977],{},"            try\n",[551,42979,42980],{"class":553,"line":1867},[551,42981,12301],{},[551,42983,42984],{"class":553,"line":1873},[551,42985,42986],{},"                string[] partes = linea.Split(',');\n",[551,42988,42989],{"class":553,"line":1878},[551,42990,1139],{"emptyLinePlaceholder":238},[551,42992,42993],{"class":553,"line":1883},[551,42994,42995],{},"                double corriente;\n",[551,42997,42998],{"class":553,"line":1888},[551,42999,43000],{},"                if (!double.TryParse(partes[2], out corriente))\n",[551,43002,43003],{"class":553,"line":4615},[551,43004,28010],{},[551,43006,43007],{"class":553,"line":4620},[551,43008,43009],{},"                    MessageBox.Show(string.Format(\"Advertencia: Línea inválida: {0}\", linea));\n",[551,43011,43012],{"class":553,"line":4626},[551,43013,43014],{},"                    continue;  \u002F\u002F Salta esta línea, pero continúa con las demás\n",[551,43016,43017],{"class":553,"line":4631},[551,43018,28025],{},[551,43020,43021],{"class":553,"line":4636},[551,43022,1139],{"emptyLinePlaceholder":238},[551,43024,43025],{"class":553,"line":4641},[551,43026,43027],{},"                \u002F\u002F Procesar corriente...\n",[551,43029,43030],{"class":553,"line":4647},[551,43031,12311],{},[551,43033,43034],{"class":553,"line":4653},[551,43035,43036],{},"            catch (Exception ex)\n",[551,43038,43039],{"class":553,"line":4659},[551,43040,12301],{},[551,43042,43043],{"class":553,"line":4665},[551,43044,43045],{},"                MessageBox.Show(string.Format(\"Error en línea: {0}\\n{1}\", linea, ex.Message));\n",[551,43047,43048],{"class":553,"line":4671},[551,43049,12311],{},[551,43051,43052],{"class":553,"line":4677},[551,43053,9077],{},[551,43055,43056],{"class":553,"line":4683},[551,43057,1139],{"emptyLinePlaceholder":238},[551,43059,43060],{"class":553,"line":4689},[551,43061,43062],{},"        MessageBox.Show(\"Procesamiento completado con éxito\");\n",[551,43064,43065],{"class":553,"line":4695},[551,43066,1187],{},[551,43068,43069],{"class":553,"line":4701},[551,43070,43071],{},"    catch (Exception ex)\n",[551,43073,43074],{"class":553,"line":4707},[551,43075,1169],{},[551,43077,43078],{"class":553,"line":4713},[551,43079,43080],{},"        MessageBox.Show(string.Format(\"Error general: {0}\", ex.Message), \"Error crítico\");\n",[551,43082,43083],{"class":553,"line":4719},[551,43084,1187],{},[551,43086,43087],{"class":553,"line":4725},[551,43088,1193],{},[13,43090,43091,416],{},[16,43092,43093],{},"Ventajas del manejo de errores",[126,43095,43096,43099,43102,43105,43108],{},[88,43097,43098],{},"✅ El script no se cae inesperadamente",[88,43100,43101],{},"✅ Mensajes informativos para el usuario",[88,43103,43104],{},"✅ Posibilidad de recuperación o alternativas",[88,43106,43107],{},"✅ Registro de errores para debugging",[88,43109,43110],{},"✅ Experiencia profesional del usuario",[43,43112],{},[331,43114,43116],{"id":43115},"_2-excepciones-qué-son","2. Excepciones: ¿Qué son?",[13,43118,43119,43120,43123],{},"Una ",[16,43121,43122],{},"excepción"," es un evento anormal que ocurre durante la ejecución de un programa.",[367,43125,43127],{"id":43126},"_21-tipos-comunes-de-excepciones","2.1 Tipos comunes de excepciones",[6589,43129,43130,43141],{},[6592,43131,43132],{},[6595,43133,43134,43137,43139],{},[6598,43135,43136],{},"Excepción",[6598,43138,1977],{},[6598,43140,6606],{},[6611,43142,43143,43156,43169,43184,43199,43217,43230,43243],{},[6595,43144,43145,43150,43153],{},[6616,43146,43147],{},[54,43148,43149],{},"FileNotFoundException",[6616,43151,43152],{},"Archivo no existe",[6616,43154,43155],{},"Abrir archivo inexistente",[6595,43157,43158,43163,43166],{},[6616,43159,43160],{},[54,43161,43162],{},"DirectoryNotFoundException",[6616,43164,43165],{},"Carpeta no existe",[6616,43167,43168],{},"Acceder a ruta inexistente",[6595,43170,43171,43176,43179],{},[6616,43172,43173],{},[54,43174,43175],{},"FormatException",[6616,43177,43178],{},"Conversión de tipo fallida",[6616,43180,43181],{},[54,43182,43183],{},"int.Parse(\"abc\")",[6595,43185,43186,43190,43193],{},[6616,43187,43188],{},[54,43189,36186],{},[6616,43191,43192],{},"Índice fuera de límites",[6616,43194,43195,43198],{},[54,43196,43197],{},"array[10]"," en array de 5",[6595,43200,43201,43206,43211],{},[6616,43202,43203],{},[54,43204,43205],{},"NullReferenceException",[6616,43207,43208,43209],{},"Objeto es ",[54,43210,10011],{},[6616,43212,43213,43216],{},[54,43214,43215],{},"objeto.Metodo()"," cuando objeto es null",[6595,43218,43219,43224,43227],{},[6616,43220,43221],{},[54,43222,43223],{},"ArgumentException",[6616,43225,43226],{},"Argumento inválido",[6616,43228,43229],{},"Pasar valor incorrecto a método",[6595,43231,43232,43237,43240],{},[6616,43233,43234],{},[54,43235,43236],{},"InvalidOperationException",[6616,43238,43239],{},"Operación inválida",[6616,43241,43242],{},"Operación en estado incorrecto",[6595,43244,43245,43250,43253],{},[6616,43246,43247],{},[54,43248,43249],{},"UnauthorizedAccessException",[6616,43251,43252],{},"Sin permisos",[6616,43254,43255],{},"Acceder a archivo protegido",[367,43257,43259],{"id":43258},"_22-anatomía-de-una-excepción","2.2 Anatomía de una excepción",[13,43261,43262],{},"Cuando ocurre una excepción, contiene información útil:",[543,43264,43266],{"className":545,"code":43265,"language":547,"meta":228,"style":228},"try\n{\n    int resultado = int.Parse(\"abc\");  \u002F\u002F Causa FormatException\n}\ncatch (FormatException ex)\n{\n    \u002F\u002F Propiedades útiles:\n    MessageBox.Show(ex.Message);        \u002F\u002F Descripción del error\n    MessageBox.Show(ex.StackTrace);     \u002F\u002F Pila de llamadas\n    MessageBox.Show(ex.Source);         \u002F\u002F Fuente del error\n}\n",[54,43267,43268,43273,43277,43282,43286,43291,43295,43300,43305,43310,43315],{"__ignoreMap":228},[551,43269,43270],{"class":553,"line":554},[551,43271,43272],{},"try\n",[551,43274,43275],{"class":553,"line":229},[551,43276,1151],{},[551,43278,43279],{"class":553,"line":670},[551,43280,43281],{},"    int resultado = int.Parse(\"abc\");  \u002F\u002F Causa FormatException\n",[551,43283,43284],{"class":553,"line":1136},[551,43285,1193],{},[551,43287,43288],{"class":553,"line":1142},[551,43289,43290],{},"catch (FormatException ex)\n",[551,43292,43293],{"class":553,"line":1148},[551,43294,1151],{},[551,43296,43297],{"class":553,"line":1154},[551,43298,43299],{},"    \u002F\u002F Propiedades útiles:\n",[551,43301,43302],{"class":553,"line":1160},[551,43303,43304],{},"    MessageBox.Show(ex.Message);        \u002F\u002F Descripción del error\n",[551,43306,43307],{"class":553,"line":1166},[551,43308,43309],{},"    MessageBox.Show(ex.StackTrace);     \u002F\u002F Pila de llamadas\n",[551,43311,43312],{"class":553,"line":1172},[551,43313,43314],{},"    MessageBox.Show(ex.Source);         \u002F\u002F Fuente del error\n",[551,43316,43317],{"class":553,"line":1178},[551,43318,1193],{},[43,43320],{},[331,43322,43324],{"id":43323},"_3-try-catch-finally-la-estructura-fundamental","3. Try-Catch-Finally: La estructura fundamental",[367,43326,43328],{"id":43327},"_31-try-catch-básico","3.1 Try-Catch básico",[543,43330,43332],{"className":545,"code":43331,"language":547,"meta":228,"style":228},"try\n{\n    \u002F\u002F Código que puede fallar\n    int numero = int.Parse(\"123\");\n    MessageBox.Show(\"Número: \" + numero);\n}\ncatch (Exception ex)\n{\n    \u002F\u002F Código que se ejecuta si hay error\n    MessageBox.Show(\"Error: \" + ex.Message);\n}\n",[54,43333,43334,43338,43342,43347,43352,43357,43361,43366,43370,43375,43380],{"__ignoreMap":228},[551,43335,43336],{"class":553,"line":554},[551,43337,43272],{},[551,43339,43340],{"class":553,"line":229},[551,43341,1151],{},[551,43343,43344],{"class":553,"line":670},[551,43345,43346],{},"    \u002F\u002F Código que puede fallar\n",[551,43348,43349],{"class":553,"line":1136},[551,43350,43351],{},"    int numero = int.Parse(\"123\");\n",[551,43353,43354],{"class":553,"line":1142},[551,43355,43356],{},"    MessageBox.Show(\"Número: \" + numero);\n",[551,43358,43359],{"class":553,"line":1148},[551,43360,1193],{},[551,43362,43363],{"class":553,"line":1154},[551,43364,43365],{},"catch (Exception ex)\n",[551,43367,43368],{"class":553,"line":1160},[551,43369,1151],{},[551,43371,43372],{"class":553,"line":1166},[551,43373,43374],{},"    \u002F\u002F Código que se ejecuta si hay error\n",[551,43376,43377],{"class":553,"line":1172},[551,43378,43379],{},"    MessageBox.Show(\"Error: \" + ex.Message);\n",[551,43381,43382],{"class":553,"line":1178},[551,43383,1193],{},[13,43385,43386,416],{},[16,43387,10986],{},[85,43389,43390,43396,43402],{},[88,43391,43392,43393],{},"Se ejecuta el bloque ",[54,43394,43395],{},"try",[88,43397,43398,43399],{},"Si no hay error, se salta el ",[54,43400,43401],{},"catch",[88,43403,43404,43405,43407],{},"Si hay error, se ejecuta el ",[54,43406,43401],{}," inmediatamente",[367,43409,43411],{"id":43410},"_32-múltiples-catch-específicos-primero","3.2 Múltiples catch (específicos primero)",[543,43413,43415],{"className":545,"code":43414,"language":547,"meta":228,"style":228},"try\n{\n    string texto = System.IO.File.ReadAllText(@\"C:\\datos\\archivo.txt\");\n    int numero = int.Parse(texto);\n    MessageBox.Show(\"Número: \" + numero);\n}\ncatch (FileNotFoundException ex)\n{\n    MessageBox.Show(\"El archivo no existe: \" + ex.Message);\n}\ncatch (FormatException ex)\n{\n    MessageBox.Show(\"El contenido no es un número válido: \" + ex.Message);\n}\ncatch (Exception ex)\n{\n    \u002F\u002F Captura cualquier otra excepción\n    MessageBox.Show(\"Error inesperado: \" + ex.Message);\n}\n",[54,43416,43417,43421,43425,43430,43435,43439,43443,43448,43452,43457,43461,43465,43469,43474,43478,43482,43486,43491,43496],{"__ignoreMap":228},[551,43418,43419],{"class":553,"line":554},[551,43420,43272],{},[551,43422,43423],{"class":553,"line":229},[551,43424,1151],{},[551,43426,43427],{"class":553,"line":670},[551,43428,43429],{},"    string texto = System.IO.File.ReadAllText(@\"C:\\datos\\archivo.txt\");\n",[551,43431,43432],{"class":553,"line":1136},[551,43433,43434],{},"    int numero = int.Parse(texto);\n",[551,43436,43437],{"class":553,"line":1142},[551,43438,43356],{},[551,43440,43441],{"class":553,"line":1148},[551,43442,1193],{},[551,43444,43445],{"class":553,"line":1154},[551,43446,43447],{},"catch (FileNotFoundException ex)\n",[551,43449,43450],{"class":553,"line":1160},[551,43451,1151],{},[551,43453,43454],{"class":553,"line":1166},[551,43455,43456],{},"    MessageBox.Show(\"El archivo no existe: \" + ex.Message);\n",[551,43458,43459],{"class":553,"line":1172},[551,43460,1193],{},[551,43462,43463],{"class":553,"line":1178},[551,43464,43290],{},[551,43466,43467],{"class":553,"line":1184},[551,43468,1151],{},[551,43470,43471],{"class":553,"line":1190},[551,43472,43473],{},"    MessageBox.Show(\"El contenido no es un número válido: \" + ex.Message);\n",[551,43475,43476],{"class":553,"line":1472},[551,43477,1193],{},[551,43479,43480],{"class":553,"line":1477},[551,43481,43365],{},[551,43483,43484],{"class":553,"line":1797},[551,43485,1151],{},[551,43487,43488],{"class":553,"line":1802},[551,43489,43490],{},"    \u002F\u002F Captura cualquier otra excepción\n",[551,43492,43493],{"class":553,"line":1808},[551,43494,43495],{},"    MessageBox.Show(\"Error inesperado: \" + ex.Message);\n",[551,43497,43498],{"class":553,"line":1814},[551,43499,1193],{},[13,43501,43502,43504,43505,43507,43508,43511],{},[16,43503,1395],{},": Los ",[54,43506,43401],{}," más específicos deben ir ",[16,43509,43510],{},"antes"," que los genéricos.",[543,43513,43515],{"className":545,"code":43514,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL - Nunca se ejecutarán los catch específicos\ncatch (Exception ex) { }\ncatch (FileNotFoundException ex) { }  \u002F\u002F Nunca se ejecuta\n\n\u002F\u002F ✓ BIEN - Específicos primero\ncatch (FileNotFoundException ex) { }\ncatch (FormatException ex) { }\ncatch (Exception ex) { }  \u002F\u002F Captura el resto\n",[54,43516,43517,43522,43527,43532,43536,43541,43546,43551],{"__ignoreMap":228},[551,43518,43519],{"class":553,"line":554},[551,43520,43521],{},"\u002F\u002F ❌ MAL - Nunca se ejecutarán los catch específicos\n",[551,43523,43524],{"class":553,"line":229},[551,43525,43526],{},"catch (Exception ex) { }\n",[551,43528,43529],{"class":553,"line":670},[551,43530,43531],{},"catch (FileNotFoundException ex) { }  \u002F\u002F Nunca se ejecuta\n",[551,43533,43534],{"class":553,"line":1136},[551,43535,1139],{"emptyLinePlaceholder":238},[551,43537,43538],{"class":553,"line":1142},[551,43539,43540],{},"\u002F\u002F ✓ BIEN - Específicos primero\n",[551,43542,43543],{"class":553,"line":1148},[551,43544,43545],{},"catch (FileNotFoundException ex) { }\n",[551,43547,43548],{"class":553,"line":1154},[551,43549,43550],{},"catch (FormatException ex) { }\n",[551,43552,43553],{"class":553,"line":1160},[551,43554,43555],{},"catch (Exception ex) { }  \u002F\u002F Captura el resto\n",[367,43557,43559],{"id":43558},"_33-finally-código-que-siempre-se-ejecuta","3.3 Finally: Código que siempre se ejecuta",[543,43561,43563],{"className":545,"code":43562,"language":547,"meta":228,"style":228},"System.IO.StreamReader reader = null;\n\ntry\n{\n    reader = new System.IO.StreamReader(@\"C:\\datos\\archivo.txt\");\n    string contenido = reader.ReadToEnd();\n    MessageBox.Show(contenido);\n}\ncatch (Exception ex)\n{\n    MessageBox.Show(\"Error: \" + ex.Message);\n}\nfinally\n{\n    \u002F\u002F Se ejecuta SIEMPRE (haya o no error)\n    if (reader != null)\n    {\n        reader.Close();  \u002F\u002F Liberar recursos\n        MessageBox.Show(\"Archivo cerrado\");\n    }\n}\n",[54,43564,43565,43570,43574,43578,43582,43587,43592,43597,43601,43605,43609,43613,43617,43622,43626,43631,43636,43640,43645,43650,43654],{"__ignoreMap":228},[551,43566,43567],{"class":553,"line":554},[551,43568,43569],{},"System.IO.StreamReader reader = null;\n",[551,43571,43572],{"class":553,"line":229},[551,43573,1139],{"emptyLinePlaceholder":238},[551,43575,43576],{"class":553,"line":670},[551,43577,43272],{},[551,43579,43580],{"class":553,"line":1136},[551,43581,1151],{},[551,43583,43584],{"class":553,"line":1142},[551,43585,43586],{},"    reader = new System.IO.StreamReader(@\"C:\\datos\\archivo.txt\");\n",[551,43588,43589],{"class":553,"line":1148},[551,43590,43591],{},"    string contenido = reader.ReadToEnd();\n",[551,43593,43594],{"class":553,"line":1154},[551,43595,43596],{},"    MessageBox.Show(contenido);\n",[551,43598,43599],{"class":553,"line":1160},[551,43600,1193],{},[551,43602,43603],{"class":553,"line":1166},[551,43604,43365],{},[551,43606,43607],{"class":553,"line":1172},[551,43608,1151],{},[551,43610,43611],{"class":553,"line":1178},[551,43612,43379],{},[551,43614,43615],{"class":553,"line":1184},[551,43616,1193],{},[551,43618,43619],{"class":553,"line":1190},[551,43620,43621],{},"finally\n",[551,43623,43624],{"class":553,"line":1472},[551,43625,1151],{},[551,43627,43628],{"class":553,"line":1477},[551,43629,43630],{},"    \u002F\u002F Se ejecuta SIEMPRE (haya o no error)\n",[551,43632,43633],{"class":553,"line":1797},[551,43634,43635],{},"    if (reader != null)\n",[551,43637,43638],{"class":553,"line":1802},[551,43639,1169],{},[551,43641,43642],{"class":553,"line":1808},[551,43643,43644],{},"        reader.Close();  \u002F\u002F Liberar recursos\n",[551,43646,43647],{"class":553,"line":1814},[551,43648,43649],{},"        MessageBox.Show(\"Archivo cerrado\");\n",[551,43651,43652],{"class":553,"line":1820},[551,43653,1187],{},[551,43655,43656],{"class":553,"line":1826},[551,43657,1193],{},[13,43659,43660,416],{},[16,43661,43662,43663],{},"Usos típicos de ",[54,43664,43665],{},"finally",[126,43667,43668,43671,43674,43677],{},[88,43669,43670],{},"Cerrar archivos",[88,43672,43673],{},"Liberar conexiones de base de datos",[88,43675,43676],{},"Limpiar recursos temporales",[88,43678,43679],{},"Restaurar estados",[367,43681,43683],{"id":43682},"_34-try-finally-sin-catch","3.4 Try-Finally (sin catch)",[543,43685,43687],{"className":545,"code":43686,"language":547,"meta":228,"style":228},"System.IO.StreamWriter writer = null;\n\ntry\n{\n    writer = new System.IO.StreamWriter(@\"C:\\datos\\log.txt\", true);\n    writer.WriteLine(\"Inicio del proceso\");\n    \u002F\u002F Código que puede fallar...\n}\nfinally\n{\n    \u002F\u002F Siempre se cierra el archivo\n    if (writer != null)\n    {\n        writer.Close();\n    }\n}\n",[54,43688,43689,43694,43698,43702,43706,43711,43716,43721,43725,43729,43733,43738,43743,43747,43752,43756],{"__ignoreMap":228},[551,43690,43691],{"class":553,"line":554},[551,43692,43693],{},"System.IO.StreamWriter writer = null;\n",[551,43695,43696],{"class":553,"line":229},[551,43697,1139],{"emptyLinePlaceholder":238},[551,43699,43700],{"class":553,"line":670},[551,43701,43272],{},[551,43703,43704],{"class":553,"line":1136},[551,43705,1151],{},[551,43707,43708],{"class":553,"line":1142},[551,43709,43710],{},"    writer = new System.IO.StreamWriter(@\"C:\\datos\\log.txt\", true);\n",[551,43712,43713],{"class":553,"line":1148},[551,43714,43715],{},"    writer.WriteLine(\"Inicio del proceso\");\n",[551,43717,43718],{"class":553,"line":1154},[551,43719,43720],{},"    \u002F\u002F Código que puede fallar...\n",[551,43722,43723],{"class":553,"line":1160},[551,43724,1193],{},[551,43726,43727],{"class":553,"line":1166},[551,43728,43621],{},[551,43730,43731],{"class":553,"line":1172},[551,43732,1151],{},[551,43734,43735],{"class":553,"line":1178},[551,43736,43737],{},"    \u002F\u002F Siempre se cierra el archivo\n",[551,43739,43740],{"class":553,"line":1184},[551,43741,43742],{},"    if (writer != null)\n",[551,43744,43745],{"class":553,"line":1190},[551,43746,1169],{},[551,43748,43749],{"class":553,"line":1472},[551,43750,43751],{},"        writer.Close();\n",[551,43753,43754],{"class":553,"line":1477},[551,43755,1187],{},[551,43757,43758],{"class":553,"line":1797},[551,43759,1193],{},[43,43761],{},[331,43763,43765],{"id":43764},"_4-lanzar-excepciones-throw","4. Lanzar excepciones: throw",[367,43767,43769],{"id":43768},"_41-throw-básico","4.1 Throw básico",[543,43771,43773],{"className":545,"code":43772,"language":547,"meta":228,"style":228},"public void ValidarCorriente(double corriente)\n{\n    if (corriente \u003C= 0)\n    {\n        throw new ArgumentException(\"La corriente debe ser mayor que cero\");\n    }\n\n    if (corriente > 1000)\n    {\n        throw new ArgumentException(\"La corriente excede el límite de 1000A\");\n    }\n\n    MessageBox.Show(\"Corriente válida: \" + corriente + \"A\");\n}\n\n\u002F\u002F Uso\ntry\n{\n    ValidarCorriente(-5.0);  \u002F\u002F Lanza excepción\n}\ncatch (ArgumentException ex)\n{\n    MessageBox.Show(\"Error de validación: \" + ex.Message);\n}\n",[54,43774,43775,43780,43784,43789,43793,43798,43802,43806,43811,43815,43820,43824,43828,43833,43837,43841,43845,43849,43853,43858,43862,43867,43871,43876],{"__ignoreMap":228},[551,43776,43777],{"class":553,"line":554},[551,43778,43779],{},"public void ValidarCorriente(double corriente)\n",[551,43781,43782],{"class":553,"line":229},[551,43783,1151],{},[551,43785,43786],{"class":553,"line":670},[551,43787,43788],{},"    if (corriente \u003C= 0)\n",[551,43790,43791],{"class":553,"line":1136},[551,43792,1169],{},[551,43794,43795],{"class":553,"line":1142},[551,43796,43797],{},"        throw new ArgumentException(\"La corriente debe ser mayor que cero\");\n",[551,43799,43800],{"class":553,"line":1148},[551,43801,1187],{},[551,43803,43804],{"class":553,"line":1154},[551,43805,1139],{"emptyLinePlaceholder":238},[551,43807,43808],{"class":553,"line":1160},[551,43809,43810],{},"    if (corriente > 1000)\n",[551,43812,43813],{"class":553,"line":1166},[551,43814,1169],{},[551,43816,43817],{"class":553,"line":1172},[551,43818,43819],{},"        throw new ArgumentException(\"La corriente excede el límite de 1000A\");\n",[551,43821,43822],{"class":553,"line":1178},[551,43823,1187],{},[551,43825,43826],{"class":553,"line":1184},[551,43827,1139],{"emptyLinePlaceholder":238},[551,43829,43830],{"class":553,"line":1190},[551,43831,43832],{},"    MessageBox.Show(\"Corriente válida: \" + corriente + \"A\");\n",[551,43834,43835],{"class":553,"line":1472},[551,43836,1193],{},[551,43838,43839],{"class":553,"line":1477},[551,43840,1139],{"emptyLinePlaceholder":238},[551,43842,43843],{"class":553,"line":1797},[551,43844,29799],{},[551,43846,43847],{"class":553,"line":1802},[551,43848,43272],{},[551,43850,43851],{"class":553,"line":1808},[551,43852,1151],{},[551,43854,43855],{"class":553,"line":1814},[551,43856,43857],{},"    ValidarCorriente(-5.0);  \u002F\u002F Lanza excepción\n",[551,43859,43860],{"class":553,"line":1820},[551,43861,1193],{},[551,43863,43864],{"class":553,"line":1826},[551,43865,43866],{},"catch (ArgumentException ex)\n",[551,43868,43869],{"class":553,"line":1832},[551,43870,1151],{},[551,43872,43873],{"class":553,"line":1838},[551,43874,43875],{},"    MessageBox.Show(\"Error de validación: \" + ex.Message);\n",[551,43877,43878],{"class":553,"line":1844},[551,43879,1193],{},[367,43881,43883],{"id":43882},"_42-re-lanzar-excepciones","4.2 Re-lanzar excepciones",[543,43885,43887],{"className":545,"code":43886,"language":547,"meta":228,"style":228},"try\n{\n    \u002F\u002F Código que falla\n    int resultado = int.Parse(\"abc\");\n}\ncatch (FormatException ex)\n{\n    \u002F\u002F Registrar error\n    MessageBox.Show(\"Registrando error en log...\");\n\n    \u002F\u002F Re-lanzar la misma excepción\n    throw;  \u002F\u002F Sin \"ex\" para mantener stack trace original\n}\n",[54,43888,43889,43893,43897,43902,43907,43911,43915,43919,43924,43929,43933,43938,43943],{"__ignoreMap":228},[551,43890,43891],{"class":553,"line":554},[551,43892,43272],{},[551,43894,43895],{"class":553,"line":229},[551,43896,1151],{},[551,43898,43899],{"class":553,"line":670},[551,43900,43901],{},"    \u002F\u002F Código que falla\n",[551,43903,43904],{"class":553,"line":1136},[551,43905,43906],{},"    int resultado = int.Parse(\"abc\");\n",[551,43908,43909],{"class":553,"line":1142},[551,43910,1193],{},[551,43912,43913],{"class":553,"line":1148},[551,43914,43290],{},[551,43916,43917],{"class":553,"line":1154},[551,43918,1151],{},[551,43920,43921],{"class":553,"line":1160},[551,43922,43923],{},"    \u002F\u002F Registrar error\n",[551,43925,43926],{"class":553,"line":1166},[551,43927,43928],{},"    MessageBox.Show(\"Registrando error en log...\");\n",[551,43930,43931],{"class":553,"line":1172},[551,43932,1139],{"emptyLinePlaceholder":238},[551,43934,43935],{"class":553,"line":1178},[551,43936,43937],{},"    \u002F\u002F Re-lanzar la misma excepción\n",[551,43939,43940],{"class":553,"line":1184},[551,43941,43942],{},"    throw;  \u002F\u002F Sin \"ex\" para mantener stack trace original\n",[551,43944,43945],{"class":553,"line":1190},[551,43946,1193],{},[367,43948,43950],{"id":43949},"_43-excepciones-personalizadas","4.3 Excepciones personalizadas",[543,43952,43954],{"className":545,"code":43953,"language":547,"meta":228,"style":228},"\u002F\u002F Definir excepción personalizada\npublic class ComponenteInvalidoException : Exception\n{\n    public string Designacion { get; set; }\n\n    public ComponenteInvalidoException(string designacion, string mensaje)\n        : base(mensaje)\n    {\n        this.Designacion = designacion;\n    }\n}\n\n\u002F\u002F Uso\npublic void ValidarComponente(string designacion, double corriente)\n{\n    if (string.IsNullOrEmpty(designacion))\n    {\n        throw new ComponenteInvalidoException(\"\", \"La designación no puede estar vacía\");\n    }\n\n    if (!designacion.StartsWith(\"K\") && !designacion.StartsWith(\"Q\"))\n    {\n        throw new ComponenteInvalidoException(designacion,\n            \"La designación debe comenzar con K o Q\");\n    }\n\n    if (corriente \u003C= 0)\n    {\n        throw new ComponenteInvalidoException(designacion,\n            string.Format(\"Corriente inválida para {0}: {1}A\", designacion, corriente));\n    }\n}\n\n\u002F\u002F Captura\ntry\n{\n    ValidarComponente(\"X1\", 25.0);\n}\ncatch (ComponenteInvalidoException ex)\n{\n    MessageBox.Show(string.Format(\"Componente inválido: {0}\\nError: {1}\",\n        ex.Designacion, ex.Message));\n}\n",[54,43955,43956,43961,43966,43970,43974,43978,43983,43988,43992,43996,44000,44004,44008,44012,44017,44021,44026,44030,44035,44039,44043,44048,44052,44057,44062,44066,44070,44074,44078,44082,44087,44091,44095,44099,44104,44108,44112,44117,44121,44126,44130,44135,44140],{"__ignoreMap":228},[551,43957,43958],{"class":553,"line":554},[551,43959,43960],{},"\u002F\u002F Definir excepción personalizada\n",[551,43962,43963],{"class":553,"line":229},[551,43964,43965],{},"public class ComponenteInvalidoException : Exception\n",[551,43967,43968],{"class":553,"line":670},[551,43969,1151],{},[551,43971,43972],{"class":553,"line":1136},[551,43973,35594],{},[551,43975,43976],{"class":553,"line":1142},[551,43977,1139],{"emptyLinePlaceholder":238},[551,43979,43980],{"class":553,"line":1148},[551,43981,43982],{},"    public ComponenteInvalidoException(string designacion, string mensaje)\n",[551,43984,43985],{"class":553,"line":1154},[551,43986,43987],{},"        : base(mensaje)\n",[551,43989,43990],{"class":553,"line":1160},[551,43991,1169],{},[551,43993,43994],{"class":553,"line":1166},[551,43995,35642],{},[551,43997,43998],{"class":553,"line":1172},[551,43999,1187],{},[551,44001,44002],{"class":553,"line":1178},[551,44003,1193],{},[551,44005,44006],{"class":553,"line":1184},[551,44007,1139],{"emptyLinePlaceholder":238},[551,44009,44010],{"class":553,"line":1190},[551,44011,29799],{},[551,44013,44014],{"class":553,"line":1472},[551,44015,44016],{},"public void ValidarComponente(string designacion, double corriente)\n",[551,44018,44019],{"class":553,"line":1477},[551,44020,1151],{},[551,44022,44023],{"class":553,"line":1797},[551,44024,44025],{},"    if (string.IsNullOrEmpty(designacion))\n",[551,44027,44028],{"class":553,"line":1802},[551,44029,1169],{},[551,44031,44032],{"class":553,"line":1808},[551,44033,44034],{},"        throw new ComponenteInvalidoException(\"\", \"La designación no puede estar vacía\");\n",[551,44036,44037],{"class":553,"line":1814},[551,44038,1187],{},[551,44040,44041],{"class":553,"line":1820},[551,44042,1139],{"emptyLinePlaceholder":238},[551,44044,44045],{"class":553,"line":1826},[551,44046,44047],{},"    if (!designacion.StartsWith(\"K\") && !designacion.StartsWith(\"Q\"))\n",[551,44049,44050],{"class":553,"line":1832},[551,44051,1169],{},[551,44053,44054],{"class":553,"line":1838},[551,44055,44056],{},"        throw new ComponenteInvalidoException(designacion,\n",[551,44058,44059],{"class":553,"line":1844},[551,44060,44061],{},"            \"La designación debe comenzar con K o Q\");\n",[551,44063,44064],{"class":553,"line":1850},[551,44065,1187],{},[551,44067,44068],{"class":553,"line":1855},[551,44069,1139],{"emptyLinePlaceholder":238},[551,44071,44072],{"class":553,"line":1861},[551,44073,43788],{},[551,44075,44076],{"class":553,"line":1867},[551,44077,1169],{},[551,44079,44080],{"class":553,"line":1873},[551,44081,44056],{},[551,44083,44084],{"class":553,"line":1878},[551,44085,44086],{},"            string.Format(\"Corriente inválida para {0}: {1}A\", designacion, corriente));\n",[551,44088,44089],{"class":553,"line":1883},[551,44090,1187],{},[551,44092,44093],{"class":553,"line":1888},[551,44094,1193],{},[551,44096,44097],{"class":553,"line":4615},[551,44098,1139],{"emptyLinePlaceholder":238},[551,44100,44101],{"class":553,"line":4620},[551,44102,44103],{},"\u002F\u002F Captura\n",[551,44105,44106],{"class":553,"line":4626},[551,44107,43272],{},[551,44109,44110],{"class":553,"line":4631},[551,44111,1151],{},[551,44113,44114],{"class":553,"line":4636},[551,44115,44116],{},"    ValidarComponente(\"X1\", 25.0);\n",[551,44118,44119],{"class":553,"line":4641},[551,44120,1193],{},[551,44122,44123],{"class":553,"line":4647},[551,44124,44125],{},"catch (ComponenteInvalidoException ex)\n",[551,44127,44128],{"class":553,"line":4653},[551,44129,1151],{},[551,44131,44132],{"class":553,"line":4659},[551,44133,44134],{},"    MessageBox.Show(string.Format(\"Componente inválido: {0}\\nError: {1}\",\n",[551,44136,44137],{"class":553,"line":4665},[551,44138,44139],{},"        ex.Designacion, ex.Message));\n",[551,44141,44142],{"class":553,"line":4671},[551,44143,1193],{},[43,44145],{},[331,44147,44149],{"id":44148},"_5-validación-de-datos","5. Validación de datos",[367,44151,44153],{"id":44152},"_51-validación-defensiva","5.1 Validación defensiva",[543,44155,44157],{"className":545,"code":44156,"language":547,"meta":228,"style":228},"public double CalcularPotencia(double corriente, double voltaje)\n{\n    \u002F\u002F Validar parámetros\n    if (corriente \u003C 0)\n        throw new ArgumentException(\"La corriente no puede ser negativa\", \"corriente\");\n\n    if (voltaje \u003C 0)\n        throw new ArgumentException(\"El voltaje no puede ser negativo\", \"voltaje\");\n\n    if (corriente == 0 || voltaje == 0)\n        return 0;\n\n    return corriente * voltaje;\n}\n",[54,44158,44159,44164,44168,44173,44178,44183,44187,44192,44197,44201,44206,44210,44214,44219],{"__ignoreMap":228},[551,44160,44161],{"class":553,"line":554},[551,44162,44163],{},"public double CalcularPotencia(double corriente, double voltaje)\n",[551,44165,44166],{"class":553,"line":229},[551,44167,1151],{},[551,44169,44170],{"class":553,"line":670},[551,44171,44172],{},"    \u002F\u002F Validar parámetros\n",[551,44174,44175],{"class":553,"line":1136},[551,44176,44177],{},"    if (corriente \u003C 0)\n",[551,44179,44180],{"class":553,"line":1142},[551,44181,44182],{},"        throw new ArgumentException(\"La corriente no puede ser negativa\", \"corriente\");\n",[551,44184,44185],{"class":553,"line":1148},[551,44186,1139],{"emptyLinePlaceholder":238},[551,44188,44189],{"class":553,"line":1154},[551,44190,44191],{},"    if (voltaje \u003C 0)\n",[551,44193,44194],{"class":553,"line":1160},[551,44195,44196],{},"        throw new ArgumentException(\"El voltaje no puede ser negativo\", \"voltaje\");\n",[551,44198,44199],{"class":553,"line":1166},[551,44200,1139],{"emptyLinePlaceholder":238},[551,44202,44203],{"class":553,"line":1172},[551,44204,44205],{},"    if (corriente == 0 || voltaje == 0)\n",[551,44207,44208],{"class":553,"line":1178},[551,44209,31632],{},[551,44211,44212],{"class":553,"line":1184},[551,44213,1139],{"emptyLinePlaceholder":238},[551,44215,44216],{"class":553,"line":1190},[551,44217,44218],{},"    return corriente * voltaje;\n",[551,44220,44221],{"class":553,"line":1472},[551,44222,1193],{},[367,44224,44226],{"id":44225},"_52-tryparse-validación-sin-excepciones","5.2 TryParse: Validación sin excepciones",[543,44228,44230],{"className":545,"code":44229,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL - Usar excepciones para control de flujo\ntry\n{\n    int numero = int.Parse(texto);\n}\ncatch (FormatException)\n{\n    numero = 0;  \u002F\u002F Valor por defecto\n}\n\n\u002F\u002F ✓ BIEN - Usar TryParse\nint numero;\nif (int.TryParse(texto, out numero))\n{\n    MessageBox.Show(\"Número válido: \" + numero);\n}\nelse\n{\n    MessageBox.Show(\"Texto inválido, usando 0\");\n    numero = 0;\n}\n",[54,44231,44232,44237,44241,44245,44249,44253,44258,44262,44267,44271,44275,44280,44285,44290,44294,44299,44303,44307,44311,44316,44321],{"__ignoreMap":228},[551,44233,44234],{"class":553,"line":554},[551,44235,44236],{},"\u002F\u002F ❌ MAL - Usar excepciones para control de flujo\n",[551,44238,44239],{"class":553,"line":229},[551,44240,43272],{},[551,44242,44243],{"class":553,"line":670},[551,44244,1151],{},[551,44246,44247],{"class":553,"line":1136},[551,44248,43434],{},[551,44250,44251],{"class":553,"line":1142},[551,44252,1193],{},[551,44254,44255],{"class":553,"line":1148},[551,44256,44257],{},"catch (FormatException)\n",[551,44259,44260],{"class":553,"line":1154},[551,44261,1151],{},[551,44263,44264],{"class":553,"line":1160},[551,44265,44266],{},"    numero = 0;  \u002F\u002F Valor por defecto\n",[551,44268,44269],{"class":553,"line":1166},[551,44270,1193],{},[551,44272,44273],{"class":553,"line":1172},[551,44274,1139],{"emptyLinePlaceholder":238},[551,44276,44277],{"class":553,"line":1178},[551,44278,44279],{},"\u002F\u002F ✓ BIEN - Usar TryParse\n",[551,44281,44282],{"class":553,"line":1184},[551,44283,44284],{},"int numero;\n",[551,44286,44287],{"class":553,"line":1190},[551,44288,44289],{},"if (int.TryParse(texto, out numero))\n",[551,44291,44292],{"class":553,"line":1472},[551,44293,1151],{},[551,44295,44296],{"class":553,"line":1477},[551,44297,44298],{},"    MessageBox.Show(\"Número válido: \" + numero);\n",[551,44300,44301],{"class":553,"line":1797},[551,44302,1193],{},[551,44304,44305],{"class":553,"line":1802},[551,44306,3704],{},[551,44308,44309],{"class":553,"line":1808},[551,44310,1151],{},[551,44312,44313],{"class":553,"line":1814},[551,44314,44315],{},"    MessageBox.Show(\"Texto inválido, usando 0\");\n",[551,44317,44318],{"class":553,"line":1820},[551,44319,44320],{},"    numero = 0;\n",[551,44322,44323],{"class":553,"line":1826},[551,44324,1193],{},[13,44326,44327,416],{},[16,44328,44329],{},"TryParse está disponible para",[126,44331,44332,44337,44342,44347],{},[88,44333,44334],{},[54,44335,44336],{},"int.TryParse()",[88,44338,44339],{},[54,44340,44341],{},"double.TryParse()",[88,44343,44344],{},[54,44345,44346],{},"bool.TryParse()",[88,44348,44349],{},[54,44350,44351],{},"DateTime.TryParse()",[367,44353,44355],{"id":44354},"_53-validación-con-retorno-booleano","5.3 Validación con retorno booleano",[543,44357,44359],{"className":545,"code":44358,"language":547,"meta":228,"style":228},"public bool ValidarComponente(string designacion, double corriente, out string mensajeError)\n{\n    mensajeError = \"\";\n\n    if (string.IsNullOrEmpty(designacion))\n    {\n        mensajeError = \"La designación no puede estar vacía\";\n        return false;\n    }\n\n    if (corriente \u003C= 0)\n    {\n        mensajeError = \"La corriente debe ser mayor que cero\";\n        return false;\n    }\n\n    if (corriente > 1000)\n    {\n        mensajeError = \"La corriente no puede exceder 1000A\";\n        return false;\n    }\n\n    return true;  \u002F\u002F Validación exitosa\n}\n\n\u002F\u002F Uso\nstring error;\nif (ValidarComponente(\"K1\", 25.0, out error))\n{\n    MessageBox.Show(\"Componente válido\");\n}\nelse\n{\n    MessageBox.Show(\"Error: \" + error);\n}\n",[54,44360,44361,44366,44370,44375,44379,44383,44387,44392,44397,44401,44405,44409,44413,44418,44422,44426,44430,44434,44438,44443,44447,44451,44455,44460,44464,44468,44472,44477,44482,44486,44491,44495,44499,44503,44508],{"__ignoreMap":228},[551,44362,44363],{"class":553,"line":554},[551,44364,44365],{},"public bool ValidarComponente(string designacion, double corriente, out string mensajeError)\n",[551,44367,44368],{"class":553,"line":229},[551,44369,1151],{},[551,44371,44372],{"class":553,"line":670},[551,44373,44374],{},"    mensajeError = \"\";\n",[551,44376,44377],{"class":553,"line":1136},[551,44378,1139],{"emptyLinePlaceholder":238},[551,44380,44381],{"class":553,"line":1142},[551,44382,44025],{},[551,44384,44385],{"class":553,"line":1148},[551,44386,1169],{},[551,44388,44389],{"class":553,"line":1154},[551,44390,44391],{},"        mensajeError = \"La designación no puede estar vacía\";\n",[551,44393,44394],{"class":553,"line":1160},[551,44395,44396],{},"        return false;\n",[551,44398,44399],{"class":553,"line":1166},[551,44400,1187],{},[551,44402,44403],{"class":553,"line":1172},[551,44404,1139],{"emptyLinePlaceholder":238},[551,44406,44407],{"class":553,"line":1178},[551,44408,43788],{},[551,44410,44411],{"class":553,"line":1184},[551,44412,1169],{},[551,44414,44415],{"class":553,"line":1190},[551,44416,44417],{},"        mensajeError = \"La corriente debe ser mayor que cero\";\n",[551,44419,44420],{"class":553,"line":1472},[551,44421,44396],{},[551,44423,44424],{"class":553,"line":1477},[551,44425,1187],{},[551,44427,44428],{"class":553,"line":1797},[551,44429,1139],{"emptyLinePlaceholder":238},[551,44431,44432],{"class":553,"line":1802},[551,44433,43810],{},[551,44435,44436],{"class":553,"line":1808},[551,44437,1169],{},[551,44439,44440],{"class":553,"line":1814},[551,44441,44442],{},"        mensajeError = \"La corriente no puede exceder 1000A\";\n",[551,44444,44445],{"class":553,"line":1820},[551,44446,44396],{},[551,44448,44449],{"class":553,"line":1826},[551,44450,1187],{},[551,44452,44453],{"class":553,"line":1832},[551,44454,1139],{"emptyLinePlaceholder":238},[551,44456,44457],{"class":553,"line":1838},[551,44458,44459],{},"    return true;  \u002F\u002F Validación exitosa\n",[551,44461,44462],{"class":553,"line":1844},[551,44463,1193],{},[551,44465,44466],{"class":553,"line":1850},[551,44467,1139],{"emptyLinePlaceholder":238},[551,44469,44470],{"class":553,"line":1855},[551,44471,29799],{},[551,44473,44474],{"class":553,"line":1861},[551,44475,44476],{},"string error;\n",[551,44478,44479],{"class":553,"line":1867},[551,44480,44481],{},"if (ValidarComponente(\"K1\", 25.0, out error))\n",[551,44483,44484],{"class":553,"line":1873},[551,44485,1151],{},[551,44487,44488],{"class":553,"line":1878},[551,44489,44490],{},"    MessageBox.Show(\"Componente válido\");\n",[551,44492,44493],{"class":553,"line":1883},[551,44494,1193],{},[551,44496,44497],{"class":553,"line":1888},[551,44498,3704],{},[551,44500,44501],{"class":553,"line":4615},[551,44502,1151],{},[551,44504,44505],{"class":553,"line":4620},[551,44506,44507],{},"    MessageBox.Show(\"Error: \" + error);\n",[551,44509,44510],{"class":553,"line":4626},[551,44511,1193],{},[43,44513],{},[331,44515,44517],{"id":44516},"_6-logging-de-errores","6. Logging de errores",[367,44519,44521],{"id":44520},"_61-logger-simple-a-archivo","6.1 Logger simple a archivo",[543,44523,44525],{"className":545,"code":44524,"language":547,"meta":228,"style":228},"public class Logger\n{\n    private string archivoLog;\n\n    public Logger(string ruta)\n    {\n        this.archivoLog = ruta;\n    }\n\n    public void Info(string mensaje)\n    {\n        EscribirLog(\"INFO\", mensaje);\n    }\n\n    public void Warning(string mensaje)\n    {\n        EscribirLog(\"WARNING\", mensaje);\n    }\n\n    public void Error(string mensaje, Exception ex = null)\n    {\n        string mensajeCompleto = mensaje;\n\n        if (ex != null)\n        {\n            mensajeCompleto += \"\\n  Excepción: \" + ex.Message;\n            mensajeCompleto += \"\\n  Stack Trace: \" + ex.StackTrace;\n        }\n\n        EscribirLog(\"ERROR\", mensajeCompleto);\n    }\n\n    private void EscribirLog(string nivel, string mensaje)\n    {\n        try\n        {\n            string timestamp = DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");\n            string lineaLog = string.Format(\"[{0}] [{1}] {2}\", timestamp, nivel, mensaje);\n\n            \u002F\u002F Agregar al archivo (append)\n            System.IO.File.AppendAllText(archivoLog, lineaLog + \"\\n\");\n        }\n        catch\n        {\n            \u002F\u002F Si falla el log, no hacer nada (evitar loop infinito)\n        }\n    }\n}\n\n\u002F\u002F Uso\nLogger log = new Logger(@\"C:\\logs\\proceso.log\");\n\nlog.Info(\"Iniciando procesamiento de componentes\");\n\ntry\n{\n    \u002F\u002F Código que puede fallar\n    int resultado = int.Parse(\"abc\");\n}\ncatch (FormatException ex)\n{\n    log.Error(\"Error al convertir texto a número\", ex);\n    MessageBox.Show(\"Error en el procesamiento. Ver log para detalles.\");\n}\n\nlog.Info(\"Procesamiento completado\");\n",[54,44526,44527,44532,44536,44541,44545,44550,44554,44559,44563,44567,44572,44576,44581,44585,44589,44594,44598,44603,44607,44611,44616,44620,44625,44629,44634,44638,44643,44648,44652,44656,44661,44665,44669,44674,44678,44682,44686,44691,44696,44700,44705,44710,44714,44719,44723,44728,44732,44736,44740,44744,44748,44753,44757,44762,44766,44770,44774,44778,44782,44786,44790,44794,44799,44804,44808,44812],{"__ignoreMap":228},[551,44528,44529],{"class":553,"line":554},[551,44530,44531],{},"public class Logger\n",[551,44533,44534],{"class":553,"line":229},[551,44535,1151],{},[551,44537,44538],{"class":553,"line":670},[551,44539,44540],{},"    private string archivoLog;\n",[551,44542,44543],{"class":553,"line":1136},[551,44544,1139],{"emptyLinePlaceholder":238},[551,44546,44547],{"class":553,"line":1142},[551,44548,44549],{},"    public Logger(string ruta)\n",[551,44551,44552],{"class":553,"line":1148},[551,44553,1169],{},[551,44555,44556],{"class":553,"line":1154},[551,44557,44558],{},"        this.archivoLog = ruta;\n",[551,44560,44561],{"class":553,"line":1160},[551,44562,1187],{},[551,44564,44565],{"class":553,"line":1166},[551,44566,1139],{"emptyLinePlaceholder":238},[551,44568,44569],{"class":553,"line":1172},[551,44570,44571],{},"    public void Info(string mensaje)\n",[551,44573,44574],{"class":553,"line":1178},[551,44575,1169],{},[551,44577,44578],{"class":553,"line":1184},[551,44579,44580],{},"        EscribirLog(\"INFO\", mensaje);\n",[551,44582,44583],{"class":553,"line":1190},[551,44584,1187],{},[551,44586,44587],{"class":553,"line":1472},[551,44588,1139],{"emptyLinePlaceholder":238},[551,44590,44591],{"class":553,"line":1477},[551,44592,44593],{},"    public void Warning(string mensaje)\n",[551,44595,44596],{"class":553,"line":1797},[551,44597,1169],{},[551,44599,44600],{"class":553,"line":1802},[551,44601,44602],{},"        EscribirLog(\"WARNING\", mensaje);\n",[551,44604,44605],{"class":553,"line":1808},[551,44606,1187],{},[551,44608,44609],{"class":553,"line":1814},[551,44610,1139],{"emptyLinePlaceholder":238},[551,44612,44613],{"class":553,"line":1820},[551,44614,44615],{},"    public void Error(string mensaje, Exception ex = null)\n",[551,44617,44618],{"class":553,"line":1826},[551,44619,1169],{},[551,44621,44622],{"class":553,"line":1832},[551,44623,44624],{},"        string mensajeCompleto = mensaje;\n",[551,44626,44627],{"class":553,"line":1838},[551,44628,1139],{"emptyLinePlaceholder":238},[551,44630,44631],{"class":553,"line":1844},[551,44632,44633],{},"        if (ex != null)\n",[551,44635,44636],{"class":553,"line":1850},[551,44637,9062],{},[551,44639,44640],{"class":553,"line":1855},[551,44641,44642],{},"            mensajeCompleto += \"\\n  Excepción: \" + ex.Message;\n",[551,44644,44645],{"class":553,"line":1861},[551,44646,44647],{},"            mensajeCompleto += \"\\n  Stack Trace: \" + ex.StackTrace;\n",[551,44649,44650],{"class":553,"line":1867},[551,44651,9077],{},[551,44653,44654],{"class":553,"line":1873},[551,44655,1139],{"emptyLinePlaceholder":238},[551,44657,44658],{"class":553,"line":1878},[551,44659,44660],{},"        EscribirLog(\"ERROR\", mensajeCompleto);\n",[551,44662,44663],{"class":553,"line":1883},[551,44664,1187],{},[551,44666,44667],{"class":553,"line":1888},[551,44668,1139],{"emptyLinePlaceholder":238},[551,44670,44671],{"class":553,"line":4615},[551,44672,44673],{},"    private void EscribirLog(string nivel, string mensaje)\n",[551,44675,44676],{"class":553,"line":4620},[551,44677,1169],{},[551,44679,44680],{"class":553,"line":4626},[551,44681,41211],{},[551,44683,44684],{"class":553,"line":4631},[551,44685,9062],{},[551,44687,44688],{"class":553,"line":4636},[551,44689,44690],{},"            string timestamp = DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");\n",[551,44692,44693],{"class":553,"line":4641},[551,44694,44695],{},"            string lineaLog = string.Format(\"[{0}] [{1}] {2}\", timestamp, nivel, mensaje);\n",[551,44697,44698],{"class":553,"line":4647},[551,44699,1139],{"emptyLinePlaceholder":238},[551,44701,44702],{"class":553,"line":4653},[551,44703,44704],{},"            \u002F\u002F Agregar al archivo (append)\n",[551,44706,44707],{"class":553,"line":4659},[551,44708,44709],{},"            System.IO.File.AppendAllText(archivoLog, lineaLog + \"\\n\");\n",[551,44711,44712],{"class":553,"line":4665},[551,44713,9077],{},[551,44715,44716],{"class":553,"line":4671},[551,44717,44718],{},"        catch\n",[551,44720,44721],{"class":553,"line":4677},[551,44722,9062],{},[551,44724,44725],{"class":553,"line":4683},[551,44726,44727],{},"            \u002F\u002F Si falla el log, no hacer nada (evitar loop infinito)\n",[551,44729,44730],{"class":553,"line":4689},[551,44731,9077],{},[551,44733,44734],{"class":553,"line":4695},[551,44735,1187],{},[551,44737,44738],{"class":553,"line":4701},[551,44739,1193],{},[551,44741,44742],{"class":553,"line":4707},[551,44743,1139],{"emptyLinePlaceholder":238},[551,44745,44746],{"class":553,"line":4713},[551,44747,29799],{},[551,44749,44750],{"class":553,"line":4719},[551,44751,44752],{},"Logger log = new Logger(@\"C:\\logs\\proceso.log\");\n",[551,44754,44755],{"class":553,"line":4725},[551,44756,1139],{"emptyLinePlaceholder":238},[551,44758,44759],{"class":553,"line":4731},[551,44760,44761],{},"log.Info(\"Iniciando procesamiento de componentes\");\n",[551,44763,44764],{"class":553,"line":4737},[551,44765,1139],{"emptyLinePlaceholder":238},[551,44767,44768],{"class":553,"line":4743},[551,44769,43272],{},[551,44771,44772],{"class":553,"line":4749},[551,44773,1151],{},[551,44775,44776],{"class":553,"line":4755},[551,44777,43346],{},[551,44779,44780],{"class":553,"line":4761},[551,44781,43906],{},[551,44783,44784],{"class":553,"line":4766},[551,44785,1193],{},[551,44787,44788],{"class":553,"line":4771},[551,44789,43290],{},[551,44791,44792],{"class":553,"line":4777},[551,44793,1151],{},[551,44795,44796],{"class":553,"line":4782},[551,44797,44798],{},"    log.Error(\"Error al convertir texto a número\", ex);\n",[551,44800,44801],{"class":553,"line":4787},[551,44802,44803],{},"    MessageBox.Show(\"Error en el procesamiento. Ver log para detalles.\");\n",[551,44805,44806],{"class":553,"line":4793},[551,44807,1193],{},[551,44809,44810],{"class":553,"line":4799},[551,44811,1139],{"emptyLinePlaceholder":238},[551,44813,44814],{"class":553,"line":4805},[551,44815,44816],{},"log.Info(\"Procesamiento completado\");\n",[13,44818,44819,416],{},[16,44820,44821],{},"Ejemplo de archivo log generado",[543,44823,44826],{"className":44824,"code":44825,"language":847},[845],"[2025-01-15 10:30:45] [INFO] Iniciando procesamiento de componentes\n[2025-01-15 10:30:45] [ERROR] Error al convertir texto a número\n  Excepción: Input string was not in a correct format.\n  Stack Trace:    at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)\n[2025-01-15 10:30:46] [INFO] Procesamiento completado\n",[54,44827,44825],{"__ignoreMap":228},[367,44829,44831],{"id":44830},"_62-logger-con-niveles","6.2 Logger con niveles",[543,44833,44835],{"className":545,"code":44834,"language":547,"meta":228,"style":228},"public enum NivelLog\n{\n    Debug = 0,\n    Info = 1,\n    Warning = 2,\n    Error = 3\n}\n\npublic class LoggerAvanzado\n{\n    private string archivoLog;\n    private NivelLog nivelMinimo;\n\n    public LoggerAvanzado(string ruta, NivelLog nivelMinimo = NivelLog.Info)\n    {\n        this.archivoLog = ruta;\n        this.nivelMinimo = nivelMinimo;\n    }\n\n    public void Debug(string mensaje)\n    {\n        Log(NivelLog.Debug, mensaje);\n    }\n\n    public void Info(string mensaje)\n    {\n        Log(NivelLog.Info, mensaje);\n    }\n\n    public void Warning(string mensaje)\n    {\n        Log(NivelLog.Warning, mensaje);\n    }\n\n    public void Error(string mensaje, Exception ex = null)\n    {\n        string mensajeCompleto = mensaje;\n        if (ex != null)\n            mensajeCompleto += \"\\n  \" + ex.ToString();\n\n        Log(NivelLog.Error, mensajeCompleto);\n    }\n\n    private void Log(NivelLog nivel, string mensaje)\n    {\n        \u002F\u002F Solo registrar si el nivel es suficiente\n        if (nivel \u003C nivelMinimo)\n            return;\n\n        try\n        {\n            string timestamp = DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");\n            string lineaLog = string.Format(\"[{0}] [{1}] {2}\",\n                timestamp, nivel.ToString().ToUpper(), mensaje);\n\n            System.IO.File.AppendAllText(archivoLog, lineaLog + \"\\n\");\n        }\n        catch { }\n    }\n}\n\n\u002F\u002F Uso\nLoggerAvanzado log = new LoggerAvanzado(@\"C:\\logs\\app.log\", NivelLog.Info);\n\nlog.Debug(\"Detalle interno\");     \u002F\u002F No se registra (nivel muy bajo)\nlog.Info(\"Inicio del proceso\");   \u002F\u002F Se registra\nlog.Warning(\"Archivo no óptimo\"); \u002F\u002F Se registra\nlog.Error(\"Fallo crítico\", ex);   \u002F\u002F Se registra\n",[54,44836,44837,44842,44846,44851,44856,44861,44866,44870,44874,44879,44883,44887,44892,44896,44901,44905,44909,44914,44918,44922,44927,44931,44936,44940,44944,44948,44952,44957,44961,44965,44969,44973,44978,44982,44986,44990,44994,44998,45002,45007,45011,45016,45020,45024,45029,45033,45038,45043,45047,45051,45055,45059,45063,45068,45073,45077,45081,45085,45090,45094,45098,45102,45106,45111,45115,45120,45125,45130],{"__ignoreMap":228},[551,44838,44839],{"class":553,"line":554},[551,44840,44841],{},"public enum NivelLog\n",[551,44843,44844],{"class":553,"line":229},[551,44845,1151],{},[551,44847,44848],{"class":553,"line":670},[551,44849,44850],{},"    Debug = 0,\n",[551,44852,44853],{"class":553,"line":1136},[551,44854,44855],{},"    Info = 1,\n",[551,44857,44858],{"class":553,"line":1142},[551,44859,44860],{},"    Warning = 2,\n",[551,44862,44863],{"class":553,"line":1148},[551,44864,44865],{},"    Error = 3\n",[551,44867,44868],{"class":553,"line":1154},[551,44869,1193],{},[551,44871,44872],{"class":553,"line":1160},[551,44873,1139],{"emptyLinePlaceholder":238},[551,44875,44876],{"class":553,"line":1166},[551,44877,44878],{},"public class LoggerAvanzado\n",[551,44880,44881],{"class":553,"line":1172},[551,44882,1151],{},[551,44884,44885],{"class":553,"line":1178},[551,44886,44540],{},[551,44888,44889],{"class":553,"line":1184},[551,44890,44891],{},"    private NivelLog nivelMinimo;\n",[551,44893,44894],{"class":553,"line":1190},[551,44895,1139],{"emptyLinePlaceholder":238},[551,44897,44898],{"class":553,"line":1472},[551,44899,44900],{},"    public LoggerAvanzado(string ruta, NivelLog nivelMinimo = NivelLog.Info)\n",[551,44902,44903],{"class":553,"line":1477},[551,44904,1169],{},[551,44906,44907],{"class":553,"line":1797},[551,44908,44558],{},[551,44910,44911],{"class":553,"line":1802},[551,44912,44913],{},"        this.nivelMinimo = nivelMinimo;\n",[551,44915,44916],{"class":553,"line":1808},[551,44917,1187],{},[551,44919,44920],{"class":553,"line":1814},[551,44921,1139],{"emptyLinePlaceholder":238},[551,44923,44924],{"class":553,"line":1820},[551,44925,44926],{},"    public void Debug(string mensaje)\n",[551,44928,44929],{"class":553,"line":1826},[551,44930,1169],{},[551,44932,44933],{"class":553,"line":1832},[551,44934,44935],{},"        Log(NivelLog.Debug, mensaje);\n",[551,44937,44938],{"class":553,"line":1838},[551,44939,1187],{},[551,44941,44942],{"class":553,"line":1844},[551,44943,1139],{"emptyLinePlaceholder":238},[551,44945,44946],{"class":553,"line":1850},[551,44947,44571],{},[551,44949,44950],{"class":553,"line":1855},[551,44951,1169],{},[551,44953,44954],{"class":553,"line":1861},[551,44955,44956],{},"        Log(NivelLog.Info, mensaje);\n",[551,44958,44959],{"class":553,"line":1867},[551,44960,1187],{},[551,44962,44963],{"class":553,"line":1873},[551,44964,1139],{"emptyLinePlaceholder":238},[551,44966,44967],{"class":553,"line":1878},[551,44968,44593],{},[551,44970,44971],{"class":553,"line":1883},[551,44972,1169],{},[551,44974,44975],{"class":553,"line":1888},[551,44976,44977],{},"        Log(NivelLog.Warning, mensaje);\n",[551,44979,44980],{"class":553,"line":4615},[551,44981,1187],{},[551,44983,44984],{"class":553,"line":4620},[551,44985,1139],{"emptyLinePlaceholder":238},[551,44987,44988],{"class":553,"line":4626},[551,44989,44615],{},[551,44991,44992],{"class":553,"line":4631},[551,44993,1169],{},[551,44995,44996],{"class":553,"line":4636},[551,44997,44624],{},[551,44999,45000],{"class":553,"line":4641},[551,45001,44633],{},[551,45003,45004],{"class":553,"line":4647},[551,45005,45006],{},"            mensajeCompleto += \"\\n  \" + ex.ToString();\n",[551,45008,45009],{"class":553,"line":4653},[551,45010,1139],{"emptyLinePlaceholder":238},[551,45012,45013],{"class":553,"line":4659},[551,45014,45015],{},"        Log(NivelLog.Error, mensajeCompleto);\n",[551,45017,45018],{"class":553,"line":4665},[551,45019,1187],{},[551,45021,45022],{"class":553,"line":4671},[551,45023,1139],{"emptyLinePlaceholder":238},[551,45025,45026],{"class":553,"line":4677},[551,45027,45028],{},"    private void Log(NivelLog nivel, string mensaje)\n",[551,45030,45031],{"class":553,"line":4683},[551,45032,1169],{},[551,45034,45035],{"class":553,"line":4689},[551,45036,45037],{},"        \u002F\u002F Solo registrar si el nivel es suficiente\n",[551,45039,45040],{"class":553,"line":4695},[551,45041,45042],{},"        if (nivel \u003C nivelMinimo)\n",[551,45044,45045],{"class":553,"line":4701},[551,45046,42906],{},[551,45048,45049],{"class":553,"line":4707},[551,45050,1139],{"emptyLinePlaceholder":238},[551,45052,45053],{"class":553,"line":4713},[551,45054,41211],{},[551,45056,45057],{"class":553,"line":4719},[551,45058,9062],{},[551,45060,45061],{"class":553,"line":4725},[551,45062,44690],{},[551,45064,45065],{"class":553,"line":4731},[551,45066,45067],{},"            string lineaLog = string.Format(\"[{0}] [{1}] {2}\",\n",[551,45069,45070],{"class":553,"line":4737},[551,45071,45072],{},"                timestamp, nivel.ToString().ToUpper(), mensaje);\n",[551,45074,45075],{"class":553,"line":4743},[551,45076,1139],{"emptyLinePlaceholder":238},[551,45078,45079],{"class":553,"line":4749},[551,45080,44709],{},[551,45082,45083],{"class":553,"line":4755},[551,45084,9077],{},[551,45086,45087],{"class":553,"line":4761},[551,45088,45089],{},"        catch { }\n",[551,45091,45092],{"class":553,"line":4766},[551,45093,1187],{},[551,45095,45096],{"class":553,"line":4771},[551,45097,1193],{},[551,45099,45100],{"class":553,"line":4777},[551,45101,1139],{"emptyLinePlaceholder":238},[551,45103,45104],{"class":553,"line":4782},[551,45105,29799],{},[551,45107,45108],{"class":553,"line":4787},[551,45109,45110],{},"LoggerAvanzado log = new LoggerAvanzado(@\"C:\\logs\\app.log\", NivelLog.Info);\n",[551,45112,45113],{"class":553,"line":4793},[551,45114,1139],{"emptyLinePlaceholder":238},[551,45116,45117],{"class":553,"line":4799},[551,45118,45119],{},"log.Debug(\"Detalle interno\");     \u002F\u002F No se registra (nivel muy bajo)\n",[551,45121,45122],{"class":553,"line":4805},[551,45123,45124],{},"log.Info(\"Inicio del proceso\");   \u002F\u002F Se registra\n",[551,45126,45127],{"class":553,"line":4811},[551,45128,45129],{},"log.Warning(\"Archivo no óptimo\"); \u002F\u002F Se registra\n",[551,45131,45132],{"class":553,"line":4817},[551,45133,45134],{},"log.Error(\"Fallo crítico\", ex);   \u002F\u002F Se registra\n",[43,45136],{},[331,45138,45140],{"id":45139},"_7-mejores-prácticas","7. Mejores prácticas",[367,45142,45144],{"id":45143},"_71-no-uses-excepciones-para-control-de-flujo","7.1 No uses excepciones para control de flujo",[543,45146,45148],{"className":545,"code":45147,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL\ntry\n{\n    int numero = int.Parse(input);\n}\ncatch (FormatException)\n{\n    numero = 0;  \u002F\u002F Usar excepción como if\n}\n\n\u002F\u002F ✓ BIEN\nint numero;\nif (!int.TryParse(input, out numero))\n{\n    numero = 0;\n}\n",[54,45149,45150,45154,45158,45162,45167,45171,45175,45179,45184,45188,45192,45196,45200,45205,45209,45213],{"__ignoreMap":228},[551,45151,45152],{"class":553,"line":554},[551,45153,41724],{},[551,45155,45156],{"class":553,"line":229},[551,45157,43272],{},[551,45159,45160],{"class":553,"line":670},[551,45161,1151],{},[551,45163,45164],{"class":553,"line":1136},[551,45165,45166],{},"    int numero = int.Parse(input);\n",[551,45168,45169],{"class":553,"line":1142},[551,45170,1193],{},[551,45172,45173],{"class":553,"line":1148},[551,45174,44257],{},[551,45176,45177],{"class":553,"line":1154},[551,45178,1151],{},[551,45180,45181],{"class":553,"line":1160},[551,45182,45183],{},"    numero = 0;  \u002F\u002F Usar excepción como if\n",[551,45185,45186],{"class":553,"line":1166},[551,45187,1193],{},[551,45189,45190],{"class":553,"line":1172},[551,45191,1139],{"emptyLinePlaceholder":238},[551,45193,45194],{"class":553,"line":1178},[551,45195,41743],{},[551,45197,45198],{"class":553,"line":1184},[551,45199,44284],{},[551,45201,45202],{"class":553,"line":1190},[551,45203,45204],{},"if (!int.TryParse(input, out numero))\n",[551,45206,45207],{"class":553,"line":1472},[551,45208,1151],{},[551,45210,45211],{"class":553,"line":1477},[551,45212,44320],{},[551,45214,45215],{"class":553,"line":1797},[551,45216,1193],{},[13,45218,45219,45222],{},[16,45220,45221],{},"Razón",": Las excepciones son costosas en rendimiento. Úsalas solo para casos excepcionales.",[367,45224,45226],{"id":45225},"_72-captura-excepciones-específicas","7.2 Captura excepciones específicas",[543,45228,45230],{"className":545,"code":45229,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL - Captura demasiado amplia\ntry\n{\n    \u002F\u002F ...\n}\ncatch (Exception ex)  \u002F\u002F Captura TODO (incluso bugs del sistema)\n{\n    MessageBox.Show(\"Error\");\n}\n\n\u002F\u002F ✓ BIEN - Específico\ntry\n{\n    \u002F\u002F ...\n}\ncatch (FileNotFoundException ex)\n{\n    MessageBox.Show(\"Archivo no encontrado\");\n}\ncatch (UnauthorizedAccessException ex)\n{\n    MessageBox.Show(\"Sin permisos de acceso\");\n}\ncatch (IOException ex)\n{\n    MessageBox.Show(\"Error de E\u002FS: \" + ex.Message);\n}\n",[54,45231,45232,45237,45241,45245,45249,45253,45258,45262,45267,45271,45275,45280,45284,45288,45292,45296,45300,45304,45309,45313,45318,45322,45327,45331,45336,45340,45345],{"__ignoreMap":228},[551,45233,45234],{"class":553,"line":554},[551,45235,45236],{},"\u002F\u002F ❌ MAL - Captura demasiado amplia\n",[551,45238,45239],{"class":553,"line":229},[551,45240,43272],{},[551,45242,45243],{"class":553,"line":670},[551,45244,1151],{},[551,45246,45247],{"class":553,"line":1136},[551,45248,16123],{},[551,45250,45251],{"class":553,"line":1142},[551,45252,1193],{},[551,45254,45255],{"class":553,"line":1148},[551,45256,45257],{},"catch (Exception ex)  \u002F\u002F Captura TODO (incluso bugs del sistema)\n",[551,45259,45260],{"class":553,"line":1154},[551,45261,1151],{},[551,45263,45264],{"class":553,"line":1160},[551,45265,45266],{},"    MessageBox.Show(\"Error\");\n",[551,45268,45269],{"class":553,"line":1166},[551,45270,1193],{},[551,45272,45273],{"class":553,"line":1172},[551,45274,1139],{"emptyLinePlaceholder":238},[551,45276,45277],{"class":553,"line":1178},[551,45278,45279],{},"\u002F\u002F ✓ BIEN - Específico\n",[551,45281,45282],{"class":553,"line":1184},[551,45283,43272],{},[551,45285,45286],{"class":553,"line":1190},[551,45287,1151],{},[551,45289,45290],{"class":553,"line":1472},[551,45291,16123],{},[551,45293,45294],{"class":553,"line":1477},[551,45295,1193],{},[551,45297,45298],{"class":553,"line":1797},[551,45299,43447],{},[551,45301,45302],{"class":553,"line":1802},[551,45303,1151],{},[551,45305,45306],{"class":553,"line":1808},[551,45307,45308],{},"    MessageBox.Show(\"Archivo no encontrado\");\n",[551,45310,45311],{"class":553,"line":1814},[551,45312,1193],{},[551,45314,45315],{"class":553,"line":1820},[551,45316,45317],{},"catch (UnauthorizedAccessException ex)\n",[551,45319,45320],{"class":553,"line":1826},[551,45321,1151],{},[551,45323,45324],{"class":553,"line":1832},[551,45325,45326],{},"    MessageBox.Show(\"Sin permisos de acceso\");\n",[551,45328,45329],{"class":553,"line":1838},[551,45330,1193],{},[551,45332,45333],{"class":553,"line":1844},[551,45334,45335],{},"catch (IOException ex)\n",[551,45337,45338],{"class":553,"line":1850},[551,45339,1151],{},[551,45341,45342],{"class":553,"line":1855},[551,45343,45344],{},"    MessageBox.Show(\"Error de E\u002FS: \" + ex.Message);\n",[551,45346,45347],{"class":553,"line":1861},[551,45348,1193],{},[367,45350,45352],{"id":45351},"_73-siempre-valida-entrada-de-usuario","7.3 Siempre valida entrada de usuario",[543,45354,45356],{"className":545,"code":45355,"language":547,"meta":228,"style":228},"public void ProcesarCorriente(string inputCorriente)\n{\n    \u002F\u002F Validar antes de convertir\n    if (string.IsNullOrWhiteSpace(inputCorriente))\n    {\n        MessageBox.Show(\"Debe ingresar un valor de corriente\");\n        return;\n    }\n\n    double corriente;\n    if (!double.TryParse(inputCorriente, out corriente))\n    {\n        MessageBox.Show(\"El valor ingresado no es un número válido\");\n        return;\n    }\n\n    if (corriente \u003C= 0)\n    {\n        MessageBox.Show(\"La corriente debe ser mayor que cero\");\n        return;\n    }\n\n    \u002F\u002F Ahora sí procesar\n    MessageBox.Show(\"Corriente válida: \" + corriente + \"A\");\n}\n",[54,45357,45358,45363,45367,45372,45377,45381,45386,45391,45395,45399,45404,45409,45413,45418,45422,45426,45430,45434,45438,45443,45447,45451,45455,45460,45464],{"__ignoreMap":228},[551,45359,45360],{"class":553,"line":554},[551,45361,45362],{},"public void ProcesarCorriente(string inputCorriente)\n",[551,45364,45365],{"class":553,"line":229},[551,45366,1151],{},[551,45368,45369],{"class":553,"line":670},[551,45370,45371],{},"    \u002F\u002F Validar antes de convertir\n",[551,45373,45374],{"class":553,"line":1136},[551,45375,45376],{},"    if (string.IsNullOrWhiteSpace(inputCorriente))\n",[551,45378,45379],{"class":553,"line":1142},[551,45380,1169],{},[551,45382,45383],{"class":553,"line":1148},[551,45384,45385],{},"        MessageBox.Show(\"Debe ingresar un valor de corriente\");\n",[551,45387,45388],{"class":553,"line":1154},[551,45389,45390],{},"        return;\n",[551,45392,45393],{"class":553,"line":1160},[551,45394,1187],{},[551,45396,45397],{"class":553,"line":1166},[551,45398,1139],{"emptyLinePlaceholder":238},[551,45400,45401],{"class":553,"line":1172},[551,45402,45403],{},"    double corriente;\n",[551,45405,45406],{"class":553,"line":1178},[551,45407,45408],{},"    if (!double.TryParse(inputCorriente, out corriente))\n",[551,45410,45411],{"class":553,"line":1184},[551,45412,1169],{},[551,45414,45415],{"class":553,"line":1190},[551,45416,45417],{},"        MessageBox.Show(\"El valor ingresado no es un número válido\");\n",[551,45419,45420],{"class":553,"line":1472},[551,45421,45390],{},[551,45423,45424],{"class":553,"line":1477},[551,45425,1187],{},[551,45427,45428],{"class":553,"line":1797},[551,45429,1139],{"emptyLinePlaceholder":238},[551,45431,45432],{"class":553,"line":1802},[551,45433,43788],{},[551,45435,45436],{"class":553,"line":1808},[551,45437,1169],{},[551,45439,45440],{"class":553,"line":1814},[551,45441,45442],{},"        MessageBox.Show(\"La corriente debe ser mayor que cero\");\n",[551,45444,45445],{"class":553,"line":1820},[551,45446,45390],{},[551,45448,45449],{"class":553,"line":1826},[551,45450,1187],{},[551,45452,45453],{"class":553,"line":1832},[551,45454,1139],{"emptyLinePlaceholder":238},[551,45456,45457],{"class":553,"line":1838},[551,45458,45459],{},"    \u002F\u002F Ahora sí procesar\n",[551,45461,45462],{"class":553,"line":1844},[551,45463,43832],{},[551,45465,45466],{"class":553,"line":1850},[551,45467,1193],{},[367,45469,45471],{"id":45470},"_74-proporciona-mensajes-útiles","7.4 Proporciona mensajes útiles",[543,45473,45475],{"className":545,"code":45474,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL - Mensaje genérico\ncatch (Exception ex)\n{\n    MessageBox.Show(\"Error\");\n}\n\n\u002F\u002F ✓ BIEN - Mensaje informativo\ncatch (FileNotFoundException ex)\n{\n    MessageBox.Show(string.Format(\n        \"No se encontró el archivo:\\n{0}\\n\\nVerifique que la ruta sea correcta.\",\n        ex.FileName));\n}\n\n\u002F\u002F ✓ MEJOR - Mensaje + acción sugerida\ncatch (UnauthorizedAccessException ex)\n{\n    MessageBox.Show(\n        \"Error de permisos.\\n\\n\" +\n        \"El archivo está protegido o en uso.\\n\\n\" +\n        \"Soluciones:\\n\" +\n        \"1. Cierre el archivo si está abierto\\n\" +\n        \"2. Ejecute como administrador\\n\" +\n        \"3. Verifique permisos de carpeta\");\n}\n",[54,45476,45477,45482,45486,45490,45494,45498,45502,45507,45511,45515,45520,45525,45530,45534,45538,45543,45547,45551,45556,45561,45566,45571,45576,45581,45586],{"__ignoreMap":228},[551,45478,45479],{"class":553,"line":554},[551,45480,45481],{},"\u002F\u002F ❌ MAL - Mensaje genérico\n",[551,45483,45484],{"class":553,"line":229},[551,45485,43365],{},[551,45487,45488],{"class":553,"line":670},[551,45489,1151],{},[551,45491,45492],{"class":553,"line":1136},[551,45493,45266],{},[551,45495,45496],{"class":553,"line":1142},[551,45497,1193],{},[551,45499,45500],{"class":553,"line":1148},[551,45501,1139],{"emptyLinePlaceholder":238},[551,45503,45504],{"class":553,"line":1154},[551,45505,45506],{},"\u002F\u002F ✓ BIEN - Mensaje informativo\n",[551,45508,45509],{"class":553,"line":1160},[551,45510,43447],{},[551,45512,45513],{"class":553,"line":1166},[551,45514,1151],{},[551,45516,45517],{"class":553,"line":1172},[551,45518,45519],{},"    MessageBox.Show(string.Format(\n",[551,45521,45522],{"class":553,"line":1178},[551,45523,45524],{},"        \"No se encontró el archivo:\\n{0}\\n\\nVerifique que la ruta sea correcta.\",\n",[551,45526,45527],{"class":553,"line":1184},[551,45528,45529],{},"        ex.FileName));\n",[551,45531,45532],{"class":553,"line":1190},[551,45533,1193],{},[551,45535,45536],{"class":553,"line":1472},[551,45537,1139],{"emptyLinePlaceholder":238},[551,45539,45540],{"class":553,"line":1477},[551,45541,45542],{},"\u002F\u002F ✓ MEJOR - Mensaje + acción sugerida\n",[551,45544,45545],{"class":553,"line":1797},[551,45546,45317],{},[551,45548,45549],{"class":553,"line":1802},[551,45550,1151],{},[551,45552,45553],{"class":553,"line":1808},[551,45554,45555],{},"    MessageBox.Show(\n",[551,45557,45558],{"class":553,"line":1814},[551,45559,45560],{},"        \"Error de permisos.\\n\\n\" +\n",[551,45562,45563],{"class":553,"line":1820},[551,45564,45565],{},"        \"El archivo está protegido o en uso.\\n\\n\" +\n",[551,45567,45568],{"class":553,"line":1826},[551,45569,45570],{},"        \"Soluciones:\\n\" +\n",[551,45572,45573],{"class":553,"line":1832},[551,45574,45575],{},"        \"1. Cierre el archivo si está abierto\\n\" +\n",[551,45577,45578],{"class":553,"line":1838},[551,45579,45580],{},"        \"2. Ejecute como administrador\\n\" +\n",[551,45582,45583],{"class":553,"line":1844},[551,45584,45585],{},"        \"3. Verifique permisos de carpeta\");\n",[551,45587,45588],{"class":553,"line":1850},[551,45589,1193],{},[367,45591,45593],{"id":45592},"_75-no-ocultes-excepciones","7.5 No ocultes excepciones",[543,45595,45597],{"className":545,"code":45596,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ MAL - \"Tragarse\" el error\ntry\n{\n    \u002F\u002F Código que falla\n}\ncatch\n{\n    \u002F\u002F No hacer nada - el usuario no sabe qué pasó\n}\n\n\u002F\u002F ✓ BIEN - Al menos registrar\ntry\n{\n    \u002F\u002F Código que falla\n}\ncatch (Exception ex)\n{\n    Logger.Error(\"Error en procesamiento\", ex);\n    MessageBox.Show(\"Ocurrió un error. Revise el log para detalles.\");\n}\n",[54,45598,45599,45604,45608,45612,45616,45620,45625,45629,45634,45638,45642,45647,45651,45655,45659,45663,45667,45671,45676,45681],{"__ignoreMap":228},[551,45600,45601],{"class":553,"line":554},[551,45602,45603],{},"\u002F\u002F ❌ MAL - \"Tragarse\" el error\n",[551,45605,45606],{"class":553,"line":229},[551,45607,43272],{},[551,45609,45610],{"class":553,"line":670},[551,45611,1151],{},[551,45613,45614],{"class":553,"line":1136},[551,45615,43901],{},[551,45617,45618],{"class":553,"line":1142},[551,45619,1193],{},[551,45621,45622],{"class":553,"line":1148},[551,45623,45624],{},"catch\n",[551,45626,45627],{"class":553,"line":1154},[551,45628,1151],{},[551,45630,45631],{"class":553,"line":1160},[551,45632,45633],{},"    \u002F\u002F No hacer nada - el usuario no sabe qué pasó\n",[551,45635,45636],{"class":553,"line":1166},[551,45637,1193],{},[551,45639,45640],{"class":553,"line":1172},[551,45641,1139],{"emptyLinePlaceholder":238},[551,45643,45644],{"class":553,"line":1178},[551,45645,45646],{},"\u002F\u002F ✓ BIEN - Al menos registrar\n",[551,45648,45649],{"class":553,"line":1184},[551,45650,43272],{},[551,45652,45653],{"class":553,"line":1190},[551,45654,1151],{},[551,45656,45657],{"class":553,"line":1472},[551,45658,43901],{},[551,45660,45661],{"class":553,"line":1477},[551,45662,1193],{},[551,45664,45665],{"class":553,"line":1797},[551,45666,43365],{},[551,45668,45669],{"class":553,"line":1802},[551,45670,1151],{},[551,45672,45673],{"class":553,"line":1808},[551,45674,45675],{},"    Logger.Error(\"Error en procesamiento\", ex);\n",[551,45677,45678],{"class":553,"line":1814},[551,45679,45680],{},"    MessageBox.Show(\"Ocurrió un error. Revise el log para detalles.\");\n",[551,45682,45683],{"class":553,"line":1820},[551,45684,1193],{},[43,45686],{},[46,45688,35443],{"id":4024},[13,45690,7975,45691,45694],{},[16,45692,45693],{},"Validador Robusto de Archivos y Datos"," completo.",[331,45696,45698],{"id":45697},"proyecto-completo-validadorrobustocs","Proyecto completo: ValidadorRobusto.cs",[543,45700,45702],{"className":545,"code":45701,"language":547,"meta":228,"style":228},"\u002F\u002F\n\u002F\u002F Proyecto: Validador Robusto de Archivos y Datos EPLAN\n\u002F\u002F Capítulo: 11\n\u002F\u002F Descripción: Sistema completo de validación con manejo de errores robusto,\n\u002F\u002F              logging detallado, y validaciones personalizadas\n\u002F\u002F Autor: C.D. López\n\u002F\u002F Fecha: Enero 2025\n\u002F\u002F\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\n\n\u002F\u002F ========================================\n\u002F\u002F LOGGER PROFESIONAL\n\u002F\u002F ========================================\npublic enum NivelLog\n{\n    Debug = 0,\n    Info = 1,\n    Warning = 2,\n    Error = 3\n}\n\npublic class Logger\n{\n    private string archivoLog;\n    private NivelLog nivelMinimo;\n\n    public Logger(string ruta, NivelLog nivelMinimo = NivelLog.Info)\n    {\n        this.archivoLog = ruta;\n        this.nivelMinimo = nivelMinimo;\n\n        \u002F\u002F Crear archivo de log si no existe\n        try\n        {\n            string directorio = Path.GetDirectoryName(ruta);\n            if (!Directory.Exists(directorio))\n            {\n                Directory.CreateDirectory(directorio);\n            }\n        }\n        catch { }\n    }\n\n    public void Debug(string mensaje)\n    {\n        Log(NivelLog.Debug, mensaje);\n    }\n\n    public void Info(string mensaje)\n    {\n        Log(NivelLog.Info, mensaje);\n    }\n\n    public void Warning(string mensaje)\n    {\n        Log(NivelLog.Warning, mensaje);\n    }\n\n    public void Error(string mensaje, Exception ex = null)\n    {\n        string mensajeCompleto = mensaje;\n        if (ex != null)\n        {\n            mensajeCompleto += string.Format(\"\\n  Excepción: {0}\\n  Tipo: {1}\",\n                ex.Message, ex.GetType().Name);\n        }\n\n        Log(NivelLog.Error, mensajeCompleto);\n    }\n\n    private void Log(NivelLog nivel, string mensaje)\n    {\n        if (nivel \u003C nivelMinimo)\n            return;\n\n        try\n        {\n            string timestamp = DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");\n            string lineaLog = string.Format(\"[{0}] [{1}] {2}\",\n                timestamp, nivel.ToString().ToUpper(), mensaje);\n\n            File.AppendAllText(archivoLog, lineaLog + \"\\n\");\n        }\n        catch { }\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F EXCEPCIÓN PERSONALIZADA\n\u002F\u002F ========================================\npublic class ComponenteInvalidoException : Exception\n{\n    public string Designacion { get; set; }\n    public string Campo { get; set; }\n\n    public ComponenteInvalidoException(string designacion, string campo, string mensaje)\n        : base(mensaje)\n    {\n        this.Designacion = designacion;\n        this.Campo = campo;\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F CLASE COMPONENTE\n\u002F\u002F ========================================\npublic class ComponenteElectrico\n{\n    public string Designacion { get; set; }\n    public string Codigo { get; set; }\n    public string Tipo { get; set; }\n    public double Corriente { get; set; }\n    public double Voltaje { get; set; }\n\n    public ComponenteElectrico(string designacion, string codigo, string tipo,\n                              double corriente, double voltaje)\n    {\n        this.Designacion = designacion;\n        this.Codigo = codigo;\n        this.Tipo = tipo;\n        this.Corriente = corriente;\n        this.Voltaje = voltaje;\n    }\n\n    public override string ToString()\n    {\n        return string.Format(\"{0} | {1} | {2} | {3}A | {4}V\",\n            Designacion, Codigo, Tipo, Corriente, Voltaje);\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F VALIDADOR DE COMPONENTES\n\u002F\u002F ========================================\npublic class ValidadorComponentes\n{\n    private Logger log;\n\n    public ValidadorComponentes(Logger logger)\n    {\n        this.log = logger;\n    }\n\n    \u002F\u002F Validar designación\n    public void ValidarDesignacion(string designacion)\n    {\n        if (string.IsNullOrWhiteSpace(designacion))\n        {\n            throw new ComponenteInvalidoException(\"\", \"Designacion\",\n                \"La designación no puede estar vacía\");\n        }\n\n        if (designacion.Length \u003C 2)\n        {\n            throw new ComponenteInvalidoException(designacion, \"Designacion\",\n                \"La designación debe tener al menos 2 caracteres\");\n        }\n\n        char primerCaracter = designacion[0];\n        if (!char.IsLetter(primerCaracter))\n        {\n            throw new ComponenteInvalidoException(designacion, \"Designacion\",\n                \"La designación debe comenzar con letra\");\n        }\n    }\n\n    \u002F\u002F Validar código\n    public void ValidarCodigo(string designacion, string codigo)\n    {\n        if (string.IsNullOrWhiteSpace(codigo))\n        {\n            throw new ComponenteInvalidoException(designacion, \"Codigo\",\n                \"El código no puede estar vacío\");\n        }\n\n        if (codigo.Length \u003C 5)\n        {\n            throw new ComponenteInvalidoException(designacion, \"Codigo\",\n                \"El código debe tener al menos 5 caracteres\");\n        }\n    }\n\n    \u002F\u002F Validar corriente\n    public void ValidarCorriente(string designacion, double corriente)\n    {\n        if (corriente \u003C= 0)\n        {\n            throw new ComponenteInvalidoException(designacion, \"Corriente\",\n                string.Format(\"La corriente debe ser mayor que 0 (actual: {0}A)\", corriente));\n        }\n\n        if (corriente > 10000)\n        {\n            throw new ComponenteInvalidoException(designacion, \"Corriente\",\n                string.Format(\"La corriente excede el límite de 10000A (actual: {0}A)\", corriente));\n        }\n    }\n\n    \u002F\u002F Validar voltaje\n    public void ValidarVoltaje(string designacion, double voltaje)\n    {\n        double[] voltajesPermitidos = {24, 48, 110, 220, 230, 380, 400, 440, 480, 690};\n\n        bool voltajeValido = false;\n        foreach (double v in voltajesPermitidos)\n        {\n            if (Math.Abs(voltaje - v) \u003C 5)  \u002F\u002F Tolerancia de ±5V\n            {\n                voltajeValido = true;\n                break;\n            }\n        }\n\n        if (!voltajeValido)\n        {\n            throw new ComponenteInvalidoException(designacion, \"Voltaje\",\n                string.Format(\"Voltaje no estándar: {0}V\", voltaje));\n        }\n    }\n\n    \u002F\u002F Validar componente completo\n    public bool ValidarComponente(ComponenteElectrico componente, out string mensajeError)\n    {\n        mensajeError = \"\";\n\n        try\n        {\n            ValidarDesignacion(componente.Designacion);\n            ValidarCodigo(componente.Designacion, componente.Codigo);\n            ValidarCorriente(componente.Designacion, componente.Corriente);\n            ValidarVoltaje(componente.Designacion, componente.Voltaje);\n\n            log.Info(string.Format(\"Componente válido: {0}\", componente.Designacion));\n            return true;\n        }\n        catch (ComponenteInvalidoException ex)\n        {\n            mensajeError = string.Format(\"[{0}] Campo '{1}': {2}\",\n                ex.Designacion, ex.Campo, ex.Message);\n\n            log.Warning(mensajeError);\n            return false;\n        }\n        catch (Exception ex)\n        {\n            mensajeError = \"Error inesperado: \" + ex.Message;\n            log.Error(mensajeError, ex);\n            return false;\n        }\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F VALIDADOR DE ARCHIVOS\n\u002F\u002F ========================================\npublic class ValidadorArchivos\n{\n    private Logger log;\n\n    public ValidadorArchivos(Logger logger)\n    {\n        this.log = logger;\n    }\n\n    \u002F\u002F Validar que archivo existe\n    public bool ValidarExistencia(string rutaArchivo, out string mensajeError)\n    {\n        mensajeError = \"\";\n\n        if (string.IsNullOrWhiteSpace(rutaArchivo))\n        {\n            mensajeError = \"La ruta del archivo no puede estar vacía\";\n            log.Error(mensajeError);\n            return false;\n        }\n\n        if (!File.Exists(rutaArchivo))\n        {\n            mensajeError = string.Format(\"El archivo no existe:\\n{0}\", rutaArchivo);\n            log.Error(mensajeError);\n            return false;\n        }\n\n        log.Info(string.Format(\"Archivo existe: {0}\", rutaArchivo));\n        return true;\n    }\n\n    \u002F\u002F Validar extensión\n    public bool ValidarExtension(string rutaArchivo, string[] extensionesPermitidas,\n                                 out string mensajeError)\n    {\n        mensajeError = \"\";\n\n        string extension = Path.GetExtension(rutaArchivo).ToLower();\n\n        bool extensionValida = false;\n        foreach (string ext in extensionesPermitidas)\n        {\n            if (extension == ext.ToLower())\n            {\n                extensionValida = true;\n                break;\n            }\n        }\n\n        if (!extensionValida)\n        {\n            mensajeError = string.Format(\n                \"Extensión inválida: {0}\\nExtensiones permitidas: {1}\",\n                extension, string.Join(\", \", extensionesPermitidas));\n\n            log.Error(mensajeError);\n            return false;\n        }\n\n        log.Info(string.Format(\"Extensión válida: {0}\", extension));\n        return true;\n    }\n\n    \u002F\u002F Validar permisos de lectura\n    public bool ValidarPermisosLectura(string rutaArchivo, out string mensajeError)\n    {\n        mensajeError = \"\";\n\n        try\n        {\n            using (FileStream fs = File.Open(rutaArchivo, FileMode.Open, FileAccess.Read))\n            {\n                \u002F\u002F Si llegamos aquí, tenemos permisos\n            }\n\n            log.Info(\"Permisos de lectura: OK\");\n            return true;\n        }\n        catch (UnauthorizedAccessException ex)\n        {\n            mensajeError = \"Sin permisos de lectura para el archivo\";\n            log.Error(mensajeError, ex);\n            return false;\n        }\n        catch (Exception ex)\n        {\n            mensajeError = \"Error al verificar permisos: \" + ex.Message;\n            log.Error(mensajeError, ex);\n            return false;\n        }\n    }\n\n    \u002F\u002F Validar que archivo no está vacío\n    public bool ValidarContenido(string rutaArchivo, out string mensajeError)\n    {\n        mensajeError = \"\";\n\n        try\n        {\n            FileInfo info = new FileInfo(rutaArchivo);\n\n            if (info.Length == 0)\n            {\n                mensajeError = \"El archivo está vacío\";\n                log.Warning(mensajeError);\n                return false;\n            }\n\n            log.Info(string.Format(\"Tamaño del archivo: {0} bytes\", info.Length));\n            return true;\n        }\n        catch (Exception ex)\n        {\n            mensajeError = \"Error al leer información del archivo: \" + ex.Message;\n            log.Error(mensajeError, ex);\n            return false;\n        }\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F PROCESADOR DE ARCHIVOS\n\u002F\u002F ========================================\npublic class ProcesadorArchivos\n{\n    private Logger log;\n    private ValidadorArchivos validadorArchivos;\n    private ValidadorComponentes validadorComponentes;\n\n    public ProcesadorArchivos(Logger logger)\n    {\n        this.log = logger;\n        this.validadorArchivos = new ValidadorArchivos(logger);\n        this.validadorComponentes = new ValidadorComponentes(logger);\n    }\n\n    \u002F\u002F Procesar archivo de componentes\n    public void ProcesarArchivoComponentes(string rutaArchivo)\n    {\n        log.Info(\"========================================\");\n        log.Info(\"Iniciando procesamiento de archivo\");\n        log.Info(\"Archivo: \" + rutaArchivo);\n\n        int lineasProcesadas = 0;\n        int lineasValidas = 0;\n        int lineasInvalidas = 0;\n        List\u003Cstring> errores = new List\u003Cstring>();\n\n        try\n        {\n            \u002F\u002F Validar archivo\n            string error;\n\n            if (!validadorArchivos.ValidarExistencia(rutaArchivo, out error))\n            {\n                MessageBox.Show(error, \"Error de archivo\");\n                return;\n            }\n\n            string[] extensionesPermitidas = {\".txt\", \".csv\"};\n            if (!validadorArchivos.ValidarExtension(rutaArchivo, extensionesPermitidas, out error))\n            {\n                MessageBox.Show(error, \"Error de extensión\");\n                return;\n            }\n\n            if (!validadorArchivos.ValidarPermisosLectura(rutaArchivo, out error))\n            {\n                MessageBox.Show(error, \"Error de permisos\");\n                return;\n            }\n\n            if (!validadorArchivos.ValidarContenido(rutaArchivo, out error))\n            {\n                MessageBox.Show(error, \"Error de contenido\");\n                return;\n            }\n\n            \u002F\u002F Leer archivo\n            log.Info(\"Leyendo archivo...\");\n            string[] lineas = File.ReadAllLines(rutaArchivo);\n            log.Info(string.Format(\"Total de líneas: {0}\", lineas.Length));\n\n            \u002F\u002F Procesar cada línea\n            foreach (string linea in lineas)\n            {\n                lineasProcesadas++;\n\n                \u002F\u002F Saltar líneas vacías\n                if (string.IsNullOrWhiteSpace(linea))\n                {\n                    log.Debug(\"Línea vacía ignorada\");\n                    continue;\n                }\n\n                \u002F\u002F Saltar líneas de comentario\n                if (linea.Trim().StartsWith(\"#\") || linea.Trim().StartsWith(\"\u002F\u002F\"))\n                {\n                    log.Debug(\"Comentario ignorado: \" + linea);\n                    continue;\n                }\n\n                try\n                {\n                    \u002F\u002F Parsear línea (formato: Designacion,Codigo,Tipo,Corriente,Voltaje)\n                    string[] partes = linea.Split(',');\n\n                    if (partes.Length != 5)\n                    {\n                        string errorLinea = string.Format(\n                            \"Línea {0}: Formato inválido (esperaba 5 campos, encontró {1})\",\n                            lineasProcesadas, partes.Length);\n\n                        errores.Add(errorLinea);\n                        log.Warning(errorLinea);\n                        lineasInvalidas++;\n                        continue;\n                    }\n\n                    \u002F\u002F Parsear campos\n                    string designacion = partes[0].Trim();\n                    string codigo = partes[1].Trim();\n                    string tipo = partes[2].Trim();\n\n                    double corriente;\n                    if (!double.TryParse(partes[3].Trim(), out corriente))\n                    {\n                        string errorLinea = string.Format(\n                            \"Línea {0}: Corriente inválida '{1}'\", lineasProcesadas, partes[3]);\n\n                        errores.Add(errorLinea);\n                        log.Warning(errorLinea);\n                        lineasInvalidas++;\n                        continue;\n                    }\n\n                    double voltaje;\n                    if (!double.TryParse(partes[4].Trim(), out voltaje))\n                    {\n                        string errorLinea = string.Format(\n                            \"Línea {0}: Voltaje inválido '{1}'\", lineasProcesadas, partes[4]);\n\n                        errores.Add(errorLinea);\n                        log.Warning(errorLinea);\n                        lineasInvalidas++;\n                        continue;\n                    }\n\n                    \u002F\u002F Crear componente\n                    ComponenteElectrico componente = new ComponenteElectrico(\n                        designacion, codigo, tipo, corriente, voltaje);\n\n                    \u002F\u002F Validar componente\n                    string errorValidacion;\n                    if (validadorComponentes.ValidarComponente(componente, out errorValidacion))\n                    {\n                        lineasValidas++;\n                        log.Info(string.Format(\"Línea {0}: OK - {1}\",\n                            lineasProcesadas, componente));\n                    }\n                    else\n                    {\n                        errores.Add(string.Format(\"Línea {0}: {1}\",\n                            lineasProcesadas, errorValidacion));\n                        lineasInvalidas++;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    string errorLinea = string.Format(\n                        \"Línea {0}: Error inesperado - {1}\", lineasProcesadas, ex.Message);\n\n                    errores.Add(errorLinea);\n                    log.Error(errorLinea, ex);\n                    lineasInvalidas++;\n                }\n            }\n\n            \u002F\u002F Generar reporte\n            GenerarReporte(rutaArchivo, lineasProcesadas, lineasValidas, lineasInvalidas, errores);\n        }\n        catch (IOException ex)\n        {\n            string mensaje = \"Error de lectura\u002Fescritura: \" + ex.Message;\n            log.Error(mensaje, ex);\n            MessageBox.Show(mensaje, \"Error de E\u002FS\");\n        }\n        catch (UnauthorizedAccessException ex)\n        {\n            string mensaje = \"Sin permisos de acceso al archivo\";\n            log.Error(mensaje, ex);\n            MessageBox.Show(mensaje, \"Error de permisos\");\n        }\n        catch (Exception ex)\n        {\n            string mensaje = \"Error inesperado: \" + ex.Message;\n            log.Error(mensaje, ex);\n            MessageBox.Show(mensaje, \"Error crítico\");\n        }\n        finally\n        {\n            log.Info(\"Procesamiento finalizado\");\n            log.Info(\"========================================\");\n        }\n    }\n\n    \u002F\u002F Generar reporte de validación\n    private void GenerarReporte(string archivoOrigen, int totalLineas, int lineasValidas,\n                                int lineasInvalidas, List\u003Cstring> errores)\n    {\n        string reporte = \"REPORTE DE VALIDACIÓN\\n\";\n        reporte += \"========================================\\n\";\n        reporte += string.Format(\"Archivo: {0}\\n\", Path.GetFileName(archivoOrigen));\n        reporte += string.Format(\"Fecha: {0}\\n\\n\", DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\"));\n\n        reporte += \"RESUMEN:\\n\";\n        reporte += string.Format(\"  Líneas procesadas: {0}\\n\", totalLineas);\n        reporte += string.Format(\"  Líneas válidas: {0}\\n\", lineasValidas);\n        reporte += string.Format(\"  Líneas inválidas: {0}\\n\\n\", lineasInvalidas);\n\n        if (lineasInvalidas > 0)\n        {\n            reporte += \"ERRORES ENCONTRADOS:\\n\";\n            reporte += \"----------------------------------------\\n\";\n            foreach (string error in errores)\n            {\n                reporte += error + \"\\n\";\n            }\n        }\n        else\n        {\n            reporte += \"✓ Todos los componentes son válidos\\n\";\n        }\n\n        reporte += \"========================================\\n\";\n\n        log.Info(\"Reporte generado\");\n        MessageBox.Show(reporte, \"Reporte de Validación\");\n    }\n}\n\n\u002F\u002F ========================================\n\u002F\u002F SCRIPT PRINCIPAL\n\u002F\u002F ========================================\npublic class ValidadorRobusto\n{\n    [Start]\n    public void Ejecutar()\n    {\n        try\n        {\n            \u002F\u002F Crear logger\n            string rutaLog = @\"C:\\temp\\eplan_logs\\validacion.log\";\n            Logger log = new Logger(rutaLog, NivelLog.Info);\n\n            log.Info(\"==================================================\");\n            log.Info(\"VALIDADOR ROBUSTO DE ARCHIVOS Y DATOS\");\n            log.Info(\"==================================================\");\n\n            \u002F\u002F Crear procesador\n            ProcesadorArchivos procesador = new ProcesadorArchivos(log);\n\n            \u002F\u002F Archivo de prueba\n            string archivoComponentes = @\"C:\\temp\\componentes.txt\";\n\n            \u002F\u002F Procesar\n            procesador.ProcesarArchivoComponentes(archivoComponentes);\n\n            \u002F\u002F Mostrar ubicación del log\n            MessageBox.Show(string.Format(\"Procesamiento completado.\\n\\nLog disponible en:\\n{0}\", rutaLog),\n                \"Validación completada\");\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(string.Format(\"Error crítico en la aplicación:\\n\\n{0}\\n\\n{1}\",\n                ex.Message, ex.StackTrace), \"Error crítico\");\n        }\n    }\n}\n",[54,45703,45704,45708,45713,45718,45723,45728,45732,45736,45740,45744,45748,45752,45757,45761,45765,45769,45773,45778,45782,45786,45790,45794,45798,45802,45806,45810,45814,45818,45822,45826,45830,45834,45839,45843,45847,45851,45855,45860,45864,45868,45873,45878,45882,45887,45891,45895,45899,45903,45907,45911,45915,45919,45923,45927,45931,45935,45939,45943,45947,45951,45955,45959,45963,45967,45971,45975,45979,45983,45987,45992,45997,46001,46005,46009,46013,46017,46021,46025,46029,46033,46037,46041,46045,46049,46053,46057,46061,46066,46070,46074,46078,46082,46086,46090,46095,46099,46103,46107,46111,46116,46120,46125,46129,46133,46137,46142,46146,46150,46154,46158,46163,46167,46171,46175,46179,46183,46187,46191,46195,46199,46203,46208,46212,46216,46220,46224,46228,46232,46236,46240,46244,46248,46253,46258,46262,46266,46270,46274,46279,46283,46288,46292,46297,46301,46306,46310,46315,46319,46323,46328,46333,46337,46342,46346,46351,46356,46360,46364,46369,46373,46378,46383,46387,46391,46396,46401,46405,46409,46414,46418,46422,46426,46431,46436,46440,46445,46449,46454,46459,46463,46467,46472,46476,46480,46485,46489,46493,46497,46502,46507,46511,46516,46520,46525,46530,46534,46538,46543,46547,46551,46556,46560,46564,46568,46573,46578,46582,46587,46591,46596,46601,46605,46610,46614,46619,46623,46627,46631,46635,46640,46644,46649,46654,46658,46662,46666,46671,46676,46680,46685,46689,46693,46697,46702,46707,46712,46717,46721,46726,46731,46735,46740,46744,46749,46754,46758,46763,46767,46771,46775,46779,46784,46789,46793,46797,46801,46805,46809,46813,46818,46822,46827,46831,46835,46839,46844,46848,46852,46856,46860,46865,46870,46874,46878,46882,46887,46891,46896,46901,46905,46909,46913,46918,46922,46927,46931,46935,46939,46943,46948,46952,46956,46960,46965,46970,46975,46979,46983,46987,46992,46996,47001,47006,47010,47015,47019,47024,47028,47032,47036,47040,47045,47049,47054,47059,47064,47068,47072,47076,47081,47086,47092,47097,47102,47107,47113,47119,47124,47129,47134,47139,47144,47150,47155,47161,47166,47171,47177,47182,47187,47193,47198,47204,47209,47214,47219,47224,47229,47235,47240,47245,47250,47255,47260,47266,47272,47277,47282,47287,47292,47297,47303,47308,47314,47319,47325,47331,47337,47342,47347,47353,47358,47363,47368,47373,47379,47384,47389,47394,47399,47404,47409,47414,47420,47425,47431,47436,47441,47447,47453,47458,47464,47469,47474,47480,47486,47491,47496,47502,47508,47513,47519,47525,47531,47536,47542,47548,47554,47560,47565,47570,47575,47581,47587,47592,47598,47603,47609,47615,47620,47625,47631,47637,47642,47648,47653,47658,47663,47669,47674,47680,47685,47690,47695,47701,47706,47712,47717,47722,47727,47733,47739,47745,47751,47756,47762,47768,47773,47779,47784,47790,47796,47801,47807,47813,47818,47823,47829,47835,47840,47846,47851,47856,47861,47867,47872,47878,47884,47889,47895,47901,47907,47913,47919,47924,47930,47936,47942,47948,47954,47959,47965,47971,47977,47983,47988,47994,48000,48005,48010,48016,48021,48026,48031,48036,48041,48046,48051,48057,48063,48068,48073,48079,48084,48089,48094,48099,48104,48109,48114,48120,48126,48132,48137,48143,48149,48155,48160,48166,48172,48178,48183,48189,48194,48200,48206,48211,48216,48221,48227,48232,48238,48244,48249,48255,48261,48267,48272,48277,48282,48288,48294,48299,48305,48310,48316,48322,48328,48333,48338,48343,48349,48354,48360,48365,48370,48375,48381,48386,48392,48397,48403,48408,48414,48420,48425,48430,48435,48441,48447,48453,48458,48464,48470,48476,48482,48487,48493,48499,48505,48511,48516,48522,48527,48533,48539,48545,48550,48556,48561,48566,48571,48576,48582,48587,48592,48597,48602,48608,48614,48619,48624,48629,48634,48640,48645,48651,48656,48661,48666,48671,48676,48681,48687,48693,48699,48704,48710,48716,48721,48726,48732,48738,48743,48749,48755,48760,48766,48772,48777,48783,48789,48795,48800,48805,48810,48816,48822,48827,48832],{"__ignoreMap":228},[551,45705,45706],{"class":553,"line":554},[551,45707,40148],{},[551,45709,45710],{"class":553,"line":229},[551,45711,45712],{},"\u002F\u002F Proyecto: Validador Robusto de Archivos y Datos EPLAN\n",[551,45714,45715],{"class":553,"line":670},[551,45716,45717],{},"\u002F\u002F Capítulo: 11\n",[551,45719,45720],{"class":553,"line":1136},[551,45721,45722],{},"\u002F\u002F Descripción: Sistema completo de validación con manejo de errores robusto,\n",[551,45724,45725],{"class":553,"line":1142},[551,45726,45727],{},"\u002F\u002F              logging detallado, y validaciones personalizadas\n",[551,45729,45730],{"class":553,"line":1148},[551,45731,40178],{},[551,45733,45734],{"class":553,"line":1154},[551,45735,40183],{},[551,45737,45738],{"class":553,"line":1160},[551,45739,40148],{},[551,45741,45742],{"class":553,"line":1166},[551,45743,1139],{"emptyLinePlaceholder":238},[551,45745,45746],{"class":553,"line":1172},[551,45747,1123],{},[551,45749,45750],{"class":553,"line":1178},[551,45751,35466],{},[551,45753,45754],{"class":553,"line":1184},[551,45755,45756],{},"using System.IO;\n",[551,45758,45759],{"class":553,"line":1190},[551,45760,1128],{},[551,45762,45763],{"class":553,"line":1472},[551,45764,1133],{},[551,45766,45767],{"class":553,"line":1477},[551,45768,1139],{"emptyLinePlaceholder":238},[551,45770,45771],{"class":553,"line":1797},[551,45772,8157],{},[551,45774,45775],{"class":553,"line":1802},[551,45776,45777],{},"\u002F\u002F LOGGER PROFESIONAL\n",[551,45779,45780],{"class":553,"line":1808},[551,45781,8157],{},[551,45783,45784],{"class":553,"line":1814},[551,45785,44841],{},[551,45787,45788],{"class":553,"line":1820},[551,45789,1151],{},[551,45791,45792],{"class":553,"line":1826},[551,45793,44850],{},[551,45795,45796],{"class":553,"line":1832},[551,45797,44855],{},[551,45799,45800],{"class":553,"line":1838},[551,45801,44860],{},[551,45803,45804],{"class":553,"line":1844},[551,45805,44865],{},[551,45807,45808],{"class":553,"line":1850},[551,45809,1193],{},[551,45811,45812],{"class":553,"line":1855},[551,45813,1139],{"emptyLinePlaceholder":238},[551,45815,45816],{"class":553,"line":1861},[551,45817,44531],{},[551,45819,45820],{"class":553,"line":1867},[551,45821,1151],{},[551,45823,45824],{"class":553,"line":1873},[551,45825,44540],{},[551,45827,45828],{"class":553,"line":1878},[551,45829,44891],{},[551,45831,45832],{"class":553,"line":1883},[551,45833,1139],{"emptyLinePlaceholder":238},[551,45835,45836],{"class":553,"line":1888},[551,45837,45838],{},"    public Logger(string ruta, NivelLog nivelMinimo = NivelLog.Info)\n",[551,45840,45841],{"class":553,"line":4615},[551,45842,1169],{},[551,45844,45845],{"class":553,"line":4620},[551,45846,44558],{},[551,45848,45849],{"class":553,"line":4626},[551,45850,44913],{},[551,45852,45853],{"class":553,"line":4631},[551,45854,1139],{"emptyLinePlaceholder":238},[551,45856,45857],{"class":553,"line":4636},[551,45858,45859],{},"        \u002F\u002F Crear archivo de log si no existe\n",[551,45861,45862],{"class":553,"line":4641},[551,45863,41211],{},[551,45865,45866],{"class":553,"line":4647},[551,45867,9062],{},[551,45869,45870],{"class":553,"line":4653},[551,45871,45872],{},"            string directorio = Path.GetDirectoryName(ruta);\n",[551,45874,45875],{"class":553,"line":4659},[551,45876,45877],{},"            if (!Directory.Exists(directorio))\n",[551,45879,45880],{"class":553,"line":4665},[551,45881,12301],{},[551,45883,45884],{"class":553,"line":4671},[551,45885,45886],{},"                Directory.CreateDirectory(directorio);\n",[551,45888,45889],{"class":553,"line":4677},[551,45890,12311],{},[551,45892,45893],{"class":553,"line":4683},[551,45894,9077],{},[551,45896,45897],{"class":553,"line":4689},[551,45898,45089],{},[551,45900,45901],{"class":553,"line":4695},[551,45902,1187],{},[551,45904,45905],{"class":553,"line":4701},[551,45906,1139],{"emptyLinePlaceholder":238},[551,45908,45909],{"class":553,"line":4707},[551,45910,44926],{},[551,45912,45913],{"class":553,"line":4713},[551,45914,1169],{},[551,45916,45917],{"class":553,"line":4719},[551,45918,44935],{},[551,45920,45921],{"class":553,"line":4725},[551,45922,1187],{},[551,45924,45925],{"class":553,"line":4731},[551,45926,1139],{"emptyLinePlaceholder":238},[551,45928,45929],{"class":553,"line":4737},[551,45930,44571],{},[551,45932,45933],{"class":553,"line":4743},[551,45934,1169],{},[551,45936,45937],{"class":553,"line":4749},[551,45938,44956],{},[551,45940,45941],{"class":553,"line":4755},[551,45942,1187],{},[551,45944,45945],{"class":553,"line":4761},[551,45946,1139],{"emptyLinePlaceholder":238},[551,45948,45949],{"class":553,"line":4766},[551,45950,44593],{},[551,45952,45953],{"class":553,"line":4771},[551,45954,1169],{},[551,45956,45957],{"class":553,"line":4777},[551,45958,44977],{},[551,45960,45961],{"class":553,"line":4782},[551,45962,1187],{},[551,45964,45965],{"class":553,"line":4787},[551,45966,1139],{"emptyLinePlaceholder":238},[551,45968,45969],{"class":553,"line":4793},[551,45970,44615],{},[551,45972,45973],{"class":553,"line":4799},[551,45974,1169],{},[551,45976,45977],{"class":553,"line":4805},[551,45978,44624],{},[551,45980,45981],{"class":553,"line":4811},[551,45982,44633],{},[551,45984,45985],{"class":553,"line":4817},[551,45986,9062],{},[551,45988,45989],{"class":553,"line":4822},[551,45990,45991],{},"            mensajeCompleto += string.Format(\"\\n  Excepción: {0}\\n  Tipo: {1}\",\n",[551,45993,45994],{"class":553,"line":4827},[551,45995,45996],{},"                ex.Message, ex.GetType().Name);\n",[551,45998,45999],{"class":553,"line":9183},[551,46000,9077],{},[551,46002,46003],{"class":553,"line":9188},[551,46004,1139],{"emptyLinePlaceholder":238},[551,46006,46007],{"class":553,"line":9193},[551,46008,45015],{},[551,46010,46011],{"class":553,"line":9198},[551,46012,1187],{},[551,46014,46015],{"class":553,"line":9204},[551,46016,1139],{"emptyLinePlaceholder":238},[551,46018,46019],{"class":553,"line":9209},[551,46020,45028],{},[551,46022,46023],{"class":553,"line":9214},[551,46024,1169],{},[551,46026,46027],{"class":553,"line":9219},[551,46028,45042],{},[551,46030,46031],{"class":553,"line":9224},[551,46032,42906],{},[551,46034,46035],{"class":553,"line":9230},[551,46036,1139],{"emptyLinePlaceholder":238},[551,46038,46039],{"class":553,"line":9236},[551,46040,41211],{},[551,46042,46043],{"class":553,"line":9242},[551,46044,9062],{},[551,46046,46047],{"class":553,"line":9247},[551,46048,44690],{},[551,46050,46051],{"class":553,"line":9253},[551,46052,45067],{},[551,46054,46055],{"class":553,"line":9258},[551,46056,45072],{},[551,46058,46059],{"class":553,"line":9264},[551,46060,1139],{"emptyLinePlaceholder":238},[551,46062,46063],{"class":553,"line":9270},[551,46064,46065],{},"            File.AppendAllText(archivoLog, lineaLog + \"\\n\");\n",[551,46067,46068],{"class":553,"line":9275},[551,46069,9077],{},[551,46071,46072],{"class":553,"line":9281},[551,46073,45089],{},[551,46075,46076],{"class":553,"line":9287},[551,46077,1187],{},[551,46079,46080],{"class":553,"line":9292},[551,46081,1193],{},[551,46083,46084],{"class":553,"line":9297},[551,46085,1139],{"emptyLinePlaceholder":238},[551,46087,46088],{"class":553,"line":9302},[551,46089,8157],{},[551,46091,46092],{"class":553,"line":9308},[551,46093,46094],{},"\u002F\u002F EXCEPCIÓN PERSONALIZADA\n",[551,46096,46097],{"class":553,"line":9313},[551,46098,8157],{},[551,46100,46101],{"class":553,"line":9318},[551,46102,43965],{},[551,46104,46105],{"class":553,"line":9323},[551,46106,1151],{},[551,46108,46109],{"class":553,"line":9328},[551,46110,35594],{},[551,46112,46113],{"class":553,"line":9334},[551,46114,46115],{},"    public string Campo { get; set; }\n",[551,46117,46118],{"class":553,"line":9339},[551,46119,1139],{"emptyLinePlaceholder":238},[551,46121,46122],{"class":553,"line":9344},[551,46123,46124],{},"    public ComponenteInvalidoException(string designacion, string campo, string mensaje)\n",[551,46126,46127],{"class":553,"line":9350},[551,46128,43987],{},[551,46130,46131],{"class":553,"line":9355},[551,46132,1169],{},[551,46134,46135],{"class":553,"line":9361},[551,46136,35642],{},[551,46138,46139],{"class":553,"line":9367},[551,46140,46141],{},"        this.Campo = campo;\n",[551,46143,46144],{"class":553,"line":9372},[551,46145,1187],{},[551,46147,46148],{"class":553,"line":9378},[551,46149,1193],{},[551,46151,46152],{"class":553,"line":9384},[551,46153,1139],{"emptyLinePlaceholder":238},[551,46155,46156],{"class":553,"line":9389},[551,46157,8157],{},[551,46159,46160],{"class":553,"line":9394},[551,46161,46162],{},"\u002F\u002F CLASE COMPONENTE\n",[551,46164,46165],{"class":553,"line":9399},[551,46166,8157],{},[551,46168,46169],{"class":553,"line":9405},[551,46170,38937],{},[551,46172,46173],{"class":553,"line":9410},[551,46174,1151],{},[551,46176,46177],{"class":553,"line":9415},[551,46178,35594],{},[551,46180,46181],{"class":553,"line":9420},[551,46182,35599],{},[551,46184,46185],{"class":553,"line":9425},[551,46186,35604],{},[551,46188,46189],{"class":553,"line":9431},[551,46190,35609],{},[551,46192,46193],{"class":553,"line":9436},[551,46194,35614],{},[551,46196,46197],{"class":553,"line":9441},[551,46198,1139],{"emptyLinePlaceholder":238},[551,46200,46201],{"class":553,"line":9447},[551,46202,39040],{},[551,46204,46205],{"class":553,"line":9452},[551,46206,46207],{},"                              double corriente, double voltaje)\n",[551,46209,46210],{"class":553,"line":9458},[551,46211,1169],{},[551,46213,46214],{"class":553,"line":9464},[551,46215,35642],{},[551,46217,46218],{"class":553,"line":9469},[551,46219,35647],{},[551,46221,46222],{"class":553,"line":9475},[551,46223,35652],{},[551,46225,46226],{"class":553,"line":9481},[551,46227,35657],{},[551,46229,46230],{"class":553,"line":9487},[551,46231,35662],{},[551,46233,46234],{"class":553,"line":9492},[551,46235,1187],{},[551,46237,46238],{"class":553,"line":9497},[551,46239,1139],{"emptyLinePlaceholder":238},[551,46241,46242],{"class":553,"line":9502},[551,46243,35680],{},[551,46245,46246],{"class":553,"line":9508},[551,46247,1169],{},[551,46249,46250],{"class":553,"line":9514},[551,46251,46252],{},"        return string.Format(\"{0} | {1} | {2} | {3}A | {4}V\",\n",[551,46254,46255],{"class":553,"line":9519},[551,46256,46257],{},"            Designacion, Codigo, Tipo, Corriente, Voltaje);\n",[551,46259,46260],{"class":553,"line":9524},[551,46261,1187],{},[551,46263,46264],{"class":553,"line":9529},[551,46265,1193],{},[551,46267,46268],{"class":553,"line":9535},[551,46269,1139],{"emptyLinePlaceholder":238},[551,46271,46272],{"class":553,"line":9540},[551,46273,8157],{},[551,46275,46276],{"class":553,"line":9545},[551,46277,46278],{},"\u002F\u002F VALIDADOR DE COMPONENTES\n",[551,46280,46281],{"class":553,"line":9551},[551,46282,8157],{},[551,46284,46285],{"class":553,"line":9557},[551,46286,46287],{},"public class ValidadorComponentes\n",[551,46289,46290],{"class":553,"line":9562},[551,46291,1151],{},[551,46293,46294],{"class":553,"line":9568},[551,46295,46296],{},"    private Logger log;\n",[551,46298,46299],{"class":553,"line":9573},[551,46300,1139],{"emptyLinePlaceholder":238},[551,46302,46303],{"class":553,"line":9578},[551,46304,46305],{},"    public ValidadorComponentes(Logger logger)\n",[551,46307,46308],{"class":553,"line":9584},[551,46309,1169],{},[551,46311,46312],{"class":553,"line":9589},[551,46313,46314],{},"        this.log = logger;\n",[551,46316,46317],{"class":553,"line":9594},[551,46318,1187],{},[551,46320,46321],{"class":553,"line":9600},[551,46322,1139],{"emptyLinePlaceholder":238},[551,46324,46325],{"class":553,"line":9606},[551,46326,46327],{},"    \u002F\u002F Validar designación\n",[551,46329,46330],{"class":553,"line":9611},[551,46331,46332],{},"    public void ValidarDesignacion(string designacion)\n",[551,46334,46335],{"class":553,"line":9617},[551,46336,1169],{},[551,46338,46339],{"class":553,"line":9623},[551,46340,46341],{},"        if (string.IsNullOrWhiteSpace(designacion))\n",[551,46343,46344],{"class":553,"line":9629},[551,46345,9062],{},[551,46347,46348],{"class":553,"line":9635},[551,46349,46350],{},"            throw new ComponenteInvalidoException(\"\", \"Designacion\",\n",[551,46352,46353],{"class":553,"line":9641},[551,46354,46355],{},"                \"La designación no puede estar vacía\");\n",[551,46357,46358],{"class":553,"line":9647},[551,46359,9077],{},[551,46361,46362],{"class":553,"line":9653},[551,46363,1139],{"emptyLinePlaceholder":238},[551,46365,46366],{"class":553,"line":9659},[551,46367,46368],{},"        if (designacion.Length \u003C 2)\n",[551,46370,46371],{"class":553,"line":9665},[551,46372,9062],{},[551,46374,46375],{"class":553,"line":9671},[551,46376,46377],{},"            throw new ComponenteInvalidoException(designacion, \"Designacion\",\n",[551,46379,46380],{"class":553,"line":9677},[551,46381,46382],{},"                \"La designación debe tener al menos 2 caracteres\");\n",[551,46384,46385],{"class":553,"line":9682},[551,46386,9077],{},[551,46388,46389],{"class":553,"line":9688},[551,46390,1139],{"emptyLinePlaceholder":238},[551,46392,46393],{"class":553,"line":9694},[551,46394,46395],{},"        char primerCaracter = designacion[0];\n",[551,46397,46398],{"class":553,"line":9700},[551,46399,46400],{},"        if (!char.IsLetter(primerCaracter))\n",[551,46402,46403],{"class":553,"line":9706},[551,46404,9062],{},[551,46406,46407],{"class":553,"line":9712},[551,46408,46377],{},[551,46410,46411],{"class":553,"line":9718},[551,46412,46413],{},"                \"La designación debe comenzar con letra\");\n",[551,46415,46416],{"class":553,"line":9724},[551,46417,9077],{},[551,46419,46420],{"class":553,"line":9730},[551,46421,1187],{},[551,46423,46424],{"class":553,"line":9736},[551,46425,1139],{"emptyLinePlaceholder":238},[551,46427,46428],{"class":553,"line":9742},[551,46429,46430],{},"    \u002F\u002F Validar código\n",[551,46432,46433],{"class":553,"line":9747},[551,46434,46435],{},"    public void ValidarCodigo(string designacion, string codigo)\n",[551,46437,46438],{"class":553,"line":9752},[551,46439,1169],{},[551,46441,46442],{"class":553,"line":9757},[551,46443,46444],{},"        if (string.IsNullOrWhiteSpace(codigo))\n",[551,46446,46447],{"class":553,"line":9763},[551,46448,9062],{},[551,46450,46451],{"class":553,"line":9768},[551,46452,46453],{},"            throw new ComponenteInvalidoException(designacion, \"Codigo\",\n",[551,46455,46456],{"class":553,"line":9773},[551,46457,46458],{},"                \"El código no puede estar vacío\");\n",[551,46460,46461],{"class":553,"line":9779},[551,46462,9077],{},[551,46464,46465],{"class":553,"line":9784},[551,46466,1139],{"emptyLinePlaceholder":238},[551,46468,46469],{"class":553,"line":9790},[551,46470,46471],{},"        if (codigo.Length \u003C 5)\n",[551,46473,46474],{"class":553,"line":9795},[551,46475,9062],{},[551,46477,46478],{"class":553,"line":15107},[551,46479,46453],{},[551,46481,46482],{"class":553,"line":15113},[551,46483,46484],{},"                \"El código debe tener al menos 5 caracteres\");\n",[551,46486,46487],{"class":553,"line":15119},[551,46488,9077],{},[551,46490,46491],{"class":553,"line":15124},[551,46492,1187],{},[551,46494,46495],{"class":553,"line":15130},[551,46496,1139],{"emptyLinePlaceholder":238},[551,46498,46499],{"class":553,"line":15135},[551,46500,46501],{},"    \u002F\u002F Validar corriente\n",[551,46503,46504],{"class":553,"line":15140},[551,46505,46506],{},"    public void ValidarCorriente(string designacion, double corriente)\n",[551,46508,46509],{"class":553,"line":15146},[551,46510,1169],{},[551,46512,46513],{"class":553,"line":15151},[551,46514,46515],{},"        if (corriente \u003C= 0)\n",[551,46517,46518],{"class":553,"line":15156},[551,46519,9062],{},[551,46521,46522],{"class":553,"line":15161},[551,46523,46524],{},"            throw new ComponenteInvalidoException(designacion, \"Corriente\",\n",[551,46526,46527],{"class":553,"line":15167},[551,46528,46529],{},"                string.Format(\"La corriente debe ser mayor que 0 (actual: {0}A)\", corriente));\n",[551,46531,46532],{"class":553,"line":15172},[551,46533,9077],{},[551,46535,46536],{"class":553,"line":15177},[551,46537,1139],{"emptyLinePlaceholder":238},[551,46539,46540],{"class":553,"line":15182},[551,46541,46542],{},"        if (corriente > 10000)\n",[551,46544,46545],{"class":553,"line":15188},[551,46546,9062],{},[551,46548,46549],{"class":553,"line":15193},[551,46550,46524],{},[551,46552,46553],{"class":553,"line":15198},[551,46554,46555],{},"                string.Format(\"La corriente excede el límite de 10000A (actual: {0}A)\", corriente));\n",[551,46557,46558],{"class":553,"line":15204},[551,46559,9077],{},[551,46561,46562],{"class":553,"line":15209},[551,46563,1187],{},[551,46565,46566],{"class":553,"line":15214},[551,46567,1139],{"emptyLinePlaceholder":238},[551,46569,46570],{"class":553,"line":15220},[551,46571,46572],{},"    \u002F\u002F Validar voltaje\n",[551,46574,46575],{"class":553,"line":15225},[551,46576,46577],{},"    public void ValidarVoltaje(string designacion, double voltaje)\n",[551,46579,46580],{"class":553,"line":15230},[551,46581,1169],{},[551,46583,46584],{"class":553,"line":15235},[551,46585,46586],{},"        double[] voltajesPermitidos = {24, 48, 110, 220, 230, 380, 400, 440, 480, 690};\n",[551,46588,46589],{"class":553,"line":15241},[551,46590,1139],{"emptyLinePlaceholder":238},[551,46592,46593],{"class":553,"line":15246},[551,46594,46595],{},"        bool voltajeValido = false;\n",[551,46597,46598],{"class":553,"line":15252},[551,46599,46600],{},"        foreach (double v in voltajesPermitidos)\n",[551,46602,46603],{"class":553,"line":15257},[551,46604,9062],{},[551,46606,46607],{"class":553,"line":15263},[551,46608,46609],{},"            if (Math.Abs(voltaje - v) \u003C 5)  \u002F\u002F Tolerancia de ±5V\n",[551,46611,46612],{"class":553,"line":15268},[551,46613,12301],{},[551,46615,46616],{"class":553,"line":15274},[551,46617,46618],{},"                voltajeValido = true;\n",[551,46620,46621],{"class":553,"line":15279},[551,46622,20613],{},[551,46624,46625],{"class":553,"line":15284},[551,46626,12311],{},[551,46628,46629],{"class":553,"line":15289},[551,46630,9077],{},[551,46632,46633],{"class":553,"line":15295},[551,46634,1139],{"emptyLinePlaceholder":238},[551,46636,46637],{"class":553,"line":15301},[551,46638,46639],{},"        if (!voltajeValido)\n",[551,46641,46642],{"class":553,"line":15306},[551,46643,9062],{},[551,46645,46646],{"class":553,"line":15312},[551,46647,46648],{},"            throw new ComponenteInvalidoException(designacion, \"Voltaje\",\n",[551,46650,46651],{"class":553,"line":15317},[551,46652,46653],{},"                string.Format(\"Voltaje no estándar: {0}V\", voltaje));\n",[551,46655,46656],{"class":553,"line":15322},[551,46657,9077],{},[551,46659,46660],{"class":553,"line":15327},[551,46661,1187],{},[551,46663,46664],{"class":553,"line":15333},[551,46665,1139],{"emptyLinePlaceholder":238},[551,46667,46668],{"class":553,"line":15338},[551,46669,46670],{},"    \u002F\u002F Validar componente completo\n",[551,46672,46673],{"class":553,"line":15343},[551,46674,46675],{},"    public bool ValidarComponente(ComponenteElectrico componente, out string mensajeError)\n",[551,46677,46678],{"class":553,"line":15348},[551,46679,1169],{},[551,46681,46682],{"class":553,"line":15354},[551,46683,46684],{},"        mensajeError = \"\";\n",[551,46686,46687],{"class":553,"line":15359},[551,46688,1139],{"emptyLinePlaceholder":238},[551,46690,46691],{"class":553,"line":15364},[551,46692,41211],{},[551,46694,46695],{"class":553,"line":15369},[551,46696,9062],{},[551,46698,46699],{"class":553,"line":15374},[551,46700,46701],{},"            ValidarDesignacion(componente.Designacion);\n",[551,46703,46704],{"class":553,"line":15379},[551,46705,46706],{},"            ValidarCodigo(componente.Designacion, componente.Codigo);\n",[551,46708,46709],{"class":553,"line":15384},[551,46710,46711],{},"            ValidarCorriente(componente.Designacion, componente.Corriente);\n",[551,46713,46714],{"class":553,"line":15389},[551,46715,46716],{},"            ValidarVoltaje(componente.Designacion, componente.Voltaje);\n",[551,46718,46719],{"class":553,"line":15395},[551,46720,1139],{"emptyLinePlaceholder":238},[551,46722,46723],{"class":553,"line":15401},[551,46724,46725],{},"            log.Info(string.Format(\"Componente válido: {0}\", componente.Designacion));\n",[551,46727,46728],{"class":553,"line":15407},[551,46729,46730],{},"            return true;\n",[551,46732,46733],{"class":553,"line":15413},[551,46734,9077],{},[551,46736,46737],{"class":553,"line":15419},[551,46738,46739],{},"        catch (ComponenteInvalidoException ex)\n",[551,46741,46742],{"class":553,"line":15425},[551,46743,9062],{},[551,46745,46746],{"class":553,"line":15431},[551,46747,46748],{},"            mensajeError = string.Format(\"[{0}] Campo '{1}': {2}\",\n",[551,46750,46751],{"class":553,"line":15437},[551,46752,46753],{},"                ex.Designacion, ex.Campo, ex.Message);\n",[551,46755,46756],{"class":553,"line":15443},[551,46757,1139],{"emptyLinePlaceholder":238},[551,46759,46760],{"class":553,"line":15449},[551,46761,46762],{},"            log.Warning(mensajeError);\n",[551,46764,46765],{"class":553,"line":15455},[551,46766,39691],{},[551,46768,46769],{"class":553,"line":15461},[551,46770,9077],{},[551,46772,46773],{"class":553,"line":15467},[551,46774,41473],{},[551,46776,46777],{"class":553,"line":15473},[551,46778,9062],{},[551,46780,46781],{"class":553,"line":15479},[551,46782,46783],{},"            mensajeError = \"Error inesperado: \" + ex.Message;\n",[551,46785,46786],{"class":553,"line":15485},[551,46787,46788],{},"            log.Error(mensajeError, ex);\n",[551,46790,46791],{"class":553,"line":15491},[551,46792,39691],{},[551,46794,46795],{"class":553,"line":15497},[551,46796,9077],{},[551,46798,46799],{"class":553,"line":15503},[551,46800,1187],{},[551,46802,46803],{"class":553,"line":15509},[551,46804,1193],{},[551,46806,46807],{"class":553,"line":15515},[551,46808,1139],{"emptyLinePlaceholder":238},[551,46810,46811],{"class":553,"line":15520},[551,46812,8157],{},[551,46814,46815],{"class":553,"line":15526},[551,46816,46817],{},"\u002F\u002F VALIDADOR DE ARCHIVOS\n",[551,46819,46820],{"class":553,"line":15532},[551,46821,8157],{},[551,46823,46824],{"class":553,"line":15537},[551,46825,46826],{},"public class ValidadorArchivos\n",[551,46828,46829],{"class":553,"line":15543},[551,46830,1151],{},[551,46832,46833],{"class":553,"line":15549},[551,46834,46296],{},[551,46836,46837],{"class":553,"line":15555},[551,46838,1139],{"emptyLinePlaceholder":238},[551,46840,46841],{"class":553,"line":15561},[551,46842,46843],{},"    public ValidadorArchivos(Logger logger)\n",[551,46845,46846],{"class":553,"line":15567},[551,46847,1169],{},[551,46849,46850],{"class":553,"line":15573},[551,46851,46314],{},[551,46853,46854],{"class":553,"line":15578},[551,46855,1187],{},[551,46857,46858],{"class":553,"line":15584},[551,46859,1139],{"emptyLinePlaceholder":238},[551,46861,46862],{"class":553,"line":15590},[551,46863,46864],{},"    \u002F\u002F Validar que archivo existe\n",[551,46866,46867],{"class":553,"line":15596},[551,46868,46869],{},"    public bool ValidarExistencia(string rutaArchivo, out string mensajeError)\n",[551,46871,46872],{"class":553,"line":15602},[551,46873,1169],{},[551,46875,46876],{"class":553,"line":15608},[551,46877,46684],{},[551,46879,46880],{"class":553,"line":15614},[551,46881,1139],{"emptyLinePlaceholder":238},[551,46883,46884],{"class":553,"line":15620},[551,46885,46886],{},"        if (string.IsNullOrWhiteSpace(rutaArchivo))\n",[551,46888,46889],{"class":553,"line":15626},[551,46890,9062],{},[551,46892,46893],{"class":553,"line":15632},[551,46894,46895],{},"            mensajeError = \"La ruta del archivo no puede estar vacía\";\n",[551,46897,46898],{"class":553,"line":15637},[551,46899,46900],{},"            log.Error(mensajeError);\n",[551,46902,46903],{"class":553,"line":15642},[551,46904,39691],{},[551,46906,46907],{"class":553,"line":15647},[551,46908,9077],{},[551,46910,46911],{"class":553,"line":15652},[551,46912,1139],{"emptyLinePlaceholder":238},[551,46914,46915],{"class":553,"line":15657},[551,46916,46917],{},"        if (!File.Exists(rutaArchivo))\n",[551,46919,46920],{"class":553,"line":15662},[551,46921,9062],{},[551,46923,46924],{"class":553,"line":15668},[551,46925,46926],{},"            mensajeError = string.Format(\"El archivo no existe:\\n{0}\", rutaArchivo);\n",[551,46928,46929],{"class":553,"line":15673},[551,46930,46900],{},[551,46932,46933],{"class":553,"line":15679},[551,46934,39691],{},[551,46936,46937],{"class":553,"line":15684},[551,46938,9077],{},[551,46940,46941],{"class":553,"line":21750},[551,46942,1139],{"emptyLinePlaceholder":238},[551,46944,46945],{"class":553,"line":21755},[551,46946,46947],{},"        log.Info(string.Format(\"Archivo existe: {0}\", rutaArchivo));\n",[551,46949,46950],{"class":553,"line":21761},[551,46951,39719],{},[551,46953,46954],{"class":553,"line":21766},[551,46955,1187],{},[551,46957,46958],{"class":553,"line":41351},[551,46959,1139],{"emptyLinePlaceholder":238},[551,46961,46962],{"class":553,"line":41357},[551,46963,46964],{},"    \u002F\u002F Validar extensión\n",[551,46966,46967],{"class":553,"line":41363},[551,46968,46969],{},"    public bool ValidarExtension(string rutaArchivo, string[] extensionesPermitidas,\n",[551,46971,46972],{"class":553,"line":41369},[551,46973,46974],{},"                                 out string mensajeError)\n",[551,46976,46977],{"class":553,"line":41374},[551,46978,1169],{},[551,46980,46981],{"class":553,"line":41380},[551,46982,46684],{},[551,46984,46985],{"class":553,"line":41385},[551,46986,1139],{"emptyLinePlaceholder":238},[551,46988,46989],{"class":553,"line":41390},[551,46990,46991],{},"        string extension = Path.GetExtension(rutaArchivo).ToLower();\n",[551,46993,46994],{"class":553,"line":41396},[551,46995,1139],{"emptyLinePlaceholder":238},[551,46997,46998],{"class":553,"line":41402},[551,46999,47000],{},"        bool extensionValida = false;\n",[551,47002,47003],{"class":553,"line":41407},[551,47004,47005],{},"        foreach (string ext in extensionesPermitidas)\n",[551,47007,47008],{"class":553,"line":41413},[551,47009,9062],{},[551,47011,47012],{"class":553,"line":41419},[551,47013,47014],{},"            if (extension == ext.ToLower())\n",[551,47016,47017],{"class":553,"line":41425},[551,47018,12301],{},[551,47020,47021],{"class":553,"line":41431},[551,47022,47023],{},"                extensionValida = true;\n",[551,47025,47026],{"class":553,"line":41436},[551,47027,20613],{},[551,47029,47030],{"class":553,"line":41442},[551,47031,12311],{},[551,47033,47034],{"class":553,"line":41448},[551,47035,9077],{},[551,47037,47038],{"class":553,"line":41454},[551,47039,1139],{"emptyLinePlaceholder":238},[551,47041,47042],{"class":553,"line":41460},[551,47043,47044],{},"        if (!extensionValida)\n",[551,47046,47047],{"class":553,"line":41465},[551,47048,9062],{},[551,47050,47051],{"class":553,"line":41470},[551,47052,47053],{},"            mensajeError = string.Format(\n",[551,47055,47056],{"class":553,"line":41476},[551,47057,47058],{},"                \"Extensión inválida: {0}\\nExtensiones permitidas: {1}\",\n",[551,47060,47061],{"class":553,"line":41481},[551,47062,47063],{},"                extension, string.Join(\", \", extensionesPermitidas));\n",[551,47065,47066],{"class":553,"line":41487},[551,47067,1139],{"emptyLinePlaceholder":238},[551,47069,47070],{"class":553,"line":41492},[551,47071,46900],{},[551,47073,47074],{"class":553,"line":41497},[551,47075,39691],{},[551,47077,47079],{"class":553,"line":47078},319,[551,47080,9077],{},[551,47082,47084],{"class":553,"line":47083},320,[551,47085,1139],{"emptyLinePlaceholder":238},[551,47087,47089],{"class":553,"line":47088},321,[551,47090,47091],{},"        log.Info(string.Format(\"Extensión válida: {0}\", extension));\n",[551,47093,47095],{"class":553,"line":47094},322,[551,47096,39719],{},[551,47098,47100],{"class":553,"line":47099},323,[551,47101,1187],{},[551,47103,47105],{"class":553,"line":47104},324,[551,47106,1139],{"emptyLinePlaceholder":238},[551,47108,47110],{"class":553,"line":47109},325,[551,47111,47112],{},"    \u002F\u002F Validar permisos de lectura\n",[551,47114,47116],{"class":553,"line":47115},326,[551,47117,47118],{},"    public bool ValidarPermisosLectura(string rutaArchivo, out string mensajeError)\n",[551,47120,47122],{"class":553,"line":47121},327,[551,47123,1169],{},[551,47125,47127],{"class":553,"line":47126},328,[551,47128,46684],{},[551,47130,47132],{"class":553,"line":47131},329,[551,47133,1139],{"emptyLinePlaceholder":238},[551,47135,47137],{"class":553,"line":47136},330,[551,47138,41211],{},[551,47140,47142],{"class":553,"line":47141},331,[551,47143,9062],{},[551,47145,47147],{"class":553,"line":47146},332,[551,47148,47149],{},"            using (FileStream fs = File.Open(rutaArchivo, FileMode.Open, FileAccess.Read))\n",[551,47151,47153],{"class":553,"line":47152},333,[551,47154,12301],{},[551,47156,47158],{"class":553,"line":47157},334,[551,47159,47160],{},"                \u002F\u002F Si llegamos aquí, tenemos permisos\n",[551,47162,47164],{"class":553,"line":47163},335,[551,47165,12311],{},[551,47167,47169],{"class":553,"line":47168},336,[551,47170,1139],{"emptyLinePlaceholder":238},[551,47172,47174],{"class":553,"line":47173},337,[551,47175,47176],{},"            log.Info(\"Permisos de lectura: OK\");\n",[551,47178,47180],{"class":553,"line":47179},338,[551,47181,46730],{},[551,47183,47185],{"class":553,"line":47184},339,[551,47186,9077],{},[551,47188,47190],{"class":553,"line":47189},340,[551,47191,47192],{},"        catch (UnauthorizedAccessException ex)\n",[551,47194,47196],{"class":553,"line":47195},341,[551,47197,9062],{},[551,47199,47201],{"class":553,"line":47200},342,[551,47202,47203],{},"            mensajeError = \"Sin permisos de lectura para el archivo\";\n",[551,47205,47207],{"class":553,"line":47206},343,[551,47208,46788],{},[551,47210,47212],{"class":553,"line":47211},344,[551,47213,39691],{},[551,47215,47217],{"class":553,"line":47216},345,[551,47218,9077],{},[551,47220,47222],{"class":553,"line":47221},346,[551,47223,41473],{},[551,47225,47227],{"class":553,"line":47226},347,[551,47228,9062],{},[551,47230,47232],{"class":553,"line":47231},348,[551,47233,47234],{},"            mensajeError = \"Error al verificar permisos: \" + ex.Message;\n",[551,47236,47238],{"class":553,"line":47237},349,[551,47239,46788],{},[551,47241,47243],{"class":553,"line":47242},350,[551,47244,39691],{},[551,47246,47248],{"class":553,"line":47247},351,[551,47249,9077],{},[551,47251,47253],{"class":553,"line":47252},352,[551,47254,1187],{},[551,47256,47258],{"class":553,"line":47257},353,[551,47259,1139],{"emptyLinePlaceholder":238},[551,47261,47263],{"class":553,"line":47262},354,[551,47264,47265],{},"    \u002F\u002F Validar que archivo no está vacío\n",[551,47267,47269],{"class":553,"line":47268},355,[551,47270,47271],{},"    public bool ValidarContenido(string rutaArchivo, out string mensajeError)\n",[551,47273,47275],{"class":553,"line":47274},356,[551,47276,1169],{},[551,47278,47280],{"class":553,"line":47279},357,[551,47281,46684],{},[551,47283,47285],{"class":553,"line":47284},358,[551,47286,1139],{"emptyLinePlaceholder":238},[551,47288,47290],{"class":553,"line":47289},359,[551,47291,41211],{},[551,47293,47295],{"class":553,"line":47294},360,[551,47296,9062],{},[551,47298,47300],{"class":553,"line":47299},361,[551,47301,47302],{},"            FileInfo info = new FileInfo(rutaArchivo);\n",[551,47304,47306],{"class":553,"line":47305},362,[551,47307,1139],{"emptyLinePlaceholder":238},[551,47309,47311],{"class":553,"line":47310},363,[551,47312,47313],{},"            if (info.Length == 0)\n",[551,47315,47317],{"class":553,"line":47316},364,[551,47318,12301],{},[551,47320,47322],{"class":553,"line":47321},365,[551,47323,47324],{},"                mensajeError = \"El archivo está vacío\";\n",[551,47326,47328],{"class":553,"line":47327},366,[551,47329,47330],{},"                log.Warning(mensajeError);\n",[551,47332,47334],{"class":553,"line":47333},367,[551,47335,47336],{},"                return false;\n",[551,47338,47340],{"class":553,"line":47339},368,[551,47341,12311],{},[551,47343,47345],{"class":553,"line":47344},369,[551,47346,1139],{"emptyLinePlaceholder":238},[551,47348,47350],{"class":553,"line":47349},370,[551,47351,47352],{},"            log.Info(string.Format(\"Tamaño del archivo: {0} bytes\", info.Length));\n",[551,47354,47356],{"class":553,"line":47355},371,[551,47357,46730],{},[551,47359,47361],{"class":553,"line":47360},372,[551,47362,9077],{},[551,47364,47366],{"class":553,"line":47365},373,[551,47367,41473],{},[551,47369,47371],{"class":553,"line":47370},374,[551,47372,9062],{},[551,47374,47376],{"class":553,"line":47375},375,[551,47377,47378],{},"            mensajeError = \"Error al leer información del archivo: \" + ex.Message;\n",[551,47380,47382],{"class":553,"line":47381},376,[551,47383,46788],{},[551,47385,47387],{"class":553,"line":47386},377,[551,47388,39691],{},[551,47390,47392],{"class":553,"line":47391},378,[551,47393,9077],{},[551,47395,47397],{"class":553,"line":47396},379,[551,47398,1187],{},[551,47400,47402],{"class":553,"line":47401},380,[551,47403,1193],{},[551,47405,47407],{"class":553,"line":47406},381,[551,47408,1139],{"emptyLinePlaceholder":238},[551,47410,47412],{"class":553,"line":47411},382,[551,47413,8157],{},[551,47415,47417],{"class":553,"line":47416},383,[551,47418,47419],{},"\u002F\u002F PROCESADOR DE ARCHIVOS\n",[551,47421,47423],{"class":553,"line":47422},384,[551,47424,8157],{},[551,47426,47428],{"class":553,"line":47427},385,[551,47429,47430],{},"public class ProcesadorArchivos\n",[551,47432,47434],{"class":553,"line":47433},386,[551,47435,1151],{},[551,47437,47439],{"class":553,"line":47438},387,[551,47440,46296],{},[551,47442,47444],{"class":553,"line":47443},388,[551,47445,47446],{},"    private ValidadorArchivos validadorArchivos;\n",[551,47448,47450],{"class":553,"line":47449},389,[551,47451,47452],{},"    private ValidadorComponentes validadorComponentes;\n",[551,47454,47456],{"class":553,"line":47455},390,[551,47457,1139],{"emptyLinePlaceholder":238},[551,47459,47461],{"class":553,"line":47460},391,[551,47462,47463],{},"    public ProcesadorArchivos(Logger logger)\n",[551,47465,47467],{"class":553,"line":47466},392,[551,47468,1169],{},[551,47470,47472],{"class":553,"line":47471},393,[551,47473,46314],{},[551,47475,47477],{"class":553,"line":47476},394,[551,47478,47479],{},"        this.validadorArchivos = new ValidadorArchivos(logger);\n",[551,47481,47483],{"class":553,"line":47482},395,[551,47484,47485],{},"        this.validadorComponentes = new ValidadorComponentes(logger);\n",[551,47487,47489],{"class":553,"line":47488},396,[551,47490,1187],{},[551,47492,47494],{"class":553,"line":47493},397,[551,47495,1139],{"emptyLinePlaceholder":238},[551,47497,47499],{"class":553,"line":47498},398,[551,47500,47501],{},"    \u002F\u002F Procesar archivo de componentes\n",[551,47503,47505],{"class":553,"line":47504},399,[551,47506,47507],{},"    public void ProcesarArchivoComponentes(string rutaArchivo)\n",[551,47509,47511],{"class":553,"line":47510},400,[551,47512,1169],{},[551,47514,47516],{"class":553,"line":47515},401,[551,47517,47518],{},"        log.Info(\"========================================\");\n",[551,47520,47522],{"class":553,"line":47521},402,[551,47523,47524],{},"        log.Info(\"Iniciando procesamiento de archivo\");\n",[551,47526,47528],{"class":553,"line":47527},403,[551,47529,47530],{},"        log.Info(\"Archivo: \" + rutaArchivo);\n",[551,47532,47534],{"class":553,"line":47533},404,[551,47535,1139],{"emptyLinePlaceholder":238},[551,47537,47539],{"class":553,"line":47538},405,[551,47540,47541],{},"        int lineasProcesadas = 0;\n",[551,47543,47545],{"class":553,"line":47544},406,[551,47546,47547],{},"        int lineasValidas = 0;\n",[551,47549,47551],{"class":553,"line":47550},407,[551,47552,47553],{},"        int lineasInvalidas = 0;\n",[551,47555,47557],{"class":553,"line":47556},408,[551,47558,47559],{},"        List\u003Cstring> errores = new List\u003Cstring>();\n",[551,47561,47563],{"class":553,"line":47562},409,[551,47564,1139],{"emptyLinePlaceholder":238},[551,47566,47568],{"class":553,"line":47567},410,[551,47569,41211],{},[551,47571,47573],{"class":553,"line":47572},411,[551,47574,9062],{},[551,47576,47578],{"class":553,"line":47577},412,[551,47579,47580],{},"            \u002F\u002F Validar archivo\n",[551,47582,47584],{"class":553,"line":47583},413,[551,47585,47586],{},"            string error;\n",[551,47588,47590],{"class":553,"line":47589},414,[551,47591,1139],{"emptyLinePlaceholder":238},[551,47593,47595],{"class":553,"line":47594},415,[551,47596,47597],{},"            if (!validadorArchivos.ValidarExistencia(rutaArchivo, out error))\n",[551,47599,47601],{"class":553,"line":47600},416,[551,47602,12301],{},[551,47604,47606],{"class":553,"line":47605},417,[551,47607,47608],{},"                MessageBox.Show(error, \"Error de archivo\");\n",[551,47610,47612],{"class":553,"line":47611},418,[551,47613,47614],{},"                return;\n",[551,47616,47618],{"class":553,"line":47617},419,[551,47619,12311],{},[551,47621,47623],{"class":553,"line":47622},420,[551,47624,1139],{"emptyLinePlaceholder":238},[551,47626,47628],{"class":553,"line":47627},421,[551,47629,47630],{},"            string[] extensionesPermitidas = {\".txt\", \".csv\"};\n",[551,47632,47634],{"class":553,"line":47633},422,[551,47635,47636],{},"            if (!validadorArchivos.ValidarExtension(rutaArchivo, extensionesPermitidas, out error))\n",[551,47638,47640],{"class":553,"line":47639},423,[551,47641,12301],{},[551,47643,47645],{"class":553,"line":47644},424,[551,47646,47647],{},"                MessageBox.Show(error, \"Error de extensión\");\n",[551,47649,47651],{"class":553,"line":47650},425,[551,47652,47614],{},[551,47654,47656],{"class":553,"line":47655},426,[551,47657,12311],{},[551,47659,47661],{"class":553,"line":47660},427,[551,47662,1139],{"emptyLinePlaceholder":238},[551,47664,47666],{"class":553,"line":47665},428,[551,47667,47668],{},"            if (!validadorArchivos.ValidarPermisosLectura(rutaArchivo, out error))\n",[551,47670,47672],{"class":553,"line":47671},429,[551,47673,12301],{},[551,47675,47677],{"class":553,"line":47676},430,[551,47678,47679],{},"                MessageBox.Show(error, \"Error de permisos\");\n",[551,47681,47683],{"class":553,"line":47682},431,[551,47684,47614],{},[551,47686,47688],{"class":553,"line":47687},432,[551,47689,12311],{},[551,47691,47693],{"class":553,"line":47692},433,[551,47694,1139],{"emptyLinePlaceholder":238},[551,47696,47698],{"class":553,"line":47697},434,[551,47699,47700],{},"            if (!validadorArchivos.ValidarContenido(rutaArchivo, out error))\n",[551,47702,47704],{"class":553,"line":47703},435,[551,47705,12301],{},[551,47707,47709],{"class":553,"line":47708},436,[551,47710,47711],{},"                MessageBox.Show(error, \"Error de contenido\");\n",[551,47713,47715],{"class":553,"line":47714},437,[551,47716,47614],{},[551,47718,47720],{"class":553,"line":47719},438,[551,47721,12311],{},[551,47723,47725],{"class":553,"line":47724},439,[551,47726,1139],{"emptyLinePlaceholder":238},[551,47728,47730],{"class":553,"line":47729},440,[551,47731,47732],{},"            \u002F\u002F Leer archivo\n",[551,47734,47736],{"class":553,"line":47735},441,[551,47737,47738],{},"            log.Info(\"Leyendo archivo...\");\n",[551,47740,47742],{"class":553,"line":47741},442,[551,47743,47744],{},"            string[] lineas = File.ReadAllLines(rutaArchivo);\n",[551,47746,47748],{"class":553,"line":47747},443,[551,47749,47750],{},"            log.Info(string.Format(\"Total de líneas: {0}\", lineas.Length));\n",[551,47752,47754],{"class":553,"line":47753},444,[551,47755,1139],{"emptyLinePlaceholder":238},[551,47757,47759],{"class":553,"line":47758},445,[551,47760,47761],{},"            \u002F\u002F Procesar cada línea\n",[551,47763,47765],{"class":553,"line":47764},446,[551,47766,47767],{},"            foreach (string linea in lineas)\n",[551,47769,47771],{"class":553,"line":47770},447,[551,47772,12301],{},[551,47774,47776],{"class":553,"line":47775},448,[551,47777,47778],{},"                lineasProcesadas++;\n",[551,47780,47782],{"class":553,"line":47781},449,[551,47783,1139],{"emptyLinePlaceholder":238},[551,47785,47787],{"class":553,"line":47786},450,[551,47788,47789],{},"                \u002F\u002F Saltar líneas vacías\n",[551,47791,47793],{"class":553,"line":47792},451,[551,47794,47795],{},"                if (string.IsNullOrWhiteSpace(linea))\n",[551,47797,47799],{"class":553,"line":47798},452,[551,47800,28010],{},[551,47802,47804],{"class":553,"line":47803},453,[551,47805,47806],{},"                    log.Debug(\"Línea vacía ignorada\");\n",[551,47808,47810],{"class":553,"line":47809},454,[551,47811,47812],{},"                    continue;\n",[551,47814,47816],{"class":553,"line":47815},455,[551,47817,28025],{},[551,47819,47821],{"class":553,"line":47820},456,[551,47822,1139],{"emptyLinePlaceholder":238},[551,47824,47826],{"class":553,"line":47825},457,[551,47827,47828],{},"                \u002F\u002F Saltar líneas de comentario\n",[551,47830,47832],{"class":553,"line":47831},458,[551,47833,47834],{},"                if (linea.Trim().StartsWith(\"#\") || linea.Trim().StartsWith(\"\u002F\u002F\"))\n",[551,47836,47838],{"class":553,"line":47837},459,[551,47839,28010],{},[551,47841,47843],{"class":553,"line":47842},460,[551,47844,47845],{},"                    log.Debug(\"Comentario ignorado: \" + linea);\n",[551,47847,47849],{"class":553,"line":47848},461,[551,47850,47812],{},[551,47852,47854],{"class":553,"line":47853},462,[551,47855,28025],{},[551,47857,47859],{"class":553,"line":47858},463,[551,47860,1139],{"emptyLinePlaceholder":238},[551,47862,47864],{"class":553,"line":47863},464,[551,47865,47866],{},"                try\n",[551,47868,47870],{"class":553,"line":47869},465,[551,47871,28010],{},[551,47873,47875],{"class":553,"line":47874},466,[551,47876,47877],{},"                    \u002F\u002F Parsear línea (formato: Designacion,Codigo,Tipo,Corriente,Voltaje)\n",[551,47879,47881],{"class":553,"line":47880},467,[551,47882,47883],{},"                    string[] partes = linea.Split(',');\n",[551,47885,47887],{"class":553,"line":47886},468,[551,47888,1139],{"emptyLinePlaceholder":238},[551,47890,47892],{"class":553,"line":47891},469,[551,47893,47894],{},"                    if (partes.Length != 5)\n",[551,47896,47898],{"class":553,"line":47897},470,[551,47899,47900],{},"                    {\n",[551,47902,47904],{"class":553,"line":47903},471,[551,47905,47906],{},"                        string errorLinea = string.Format(\n",[551,47908,47910],{"class":553,"line":47909},472,[551,47911,47912],{},"                            \"Línea {0}: Formato inválido (esperaba 5 campos, encontró {1})\",\n",[551,47914,47916],{"class":553,"line":47915},473,[551,47917,47918],{},"                            lineasProcesadas, partes.Length);\n",[551,47920,47922],{"class":553,"line":47921},474,[551,47923,1139],{"emptyLinePlaceholder":238},[551,47925,47927],{"class":553,"line":47926},475,[551,47928,47929],{},"                        errores.Add(errorLinea);\n",[551,47931,47933],{"class":553,"line":47932},476,[551,47934,47935],{},"                        log.Warning(errorLinea);\n",[551,47937,47939],{"class":553,"line":47938},477,[551,47940,47941],{},"                        lineasInvalidas++;\n",[551,47943,47945],{"class":553,"line":47944},478,[551,47946,47947],{},"                        continue;\n",[551,47949,47951],{"class":553,"line":47950},479,[551,47952,47953],{},"                    }\n",[551,47955,47957],{"class":553,"line":47956},480,[551,47958,1139],{"emptyLinePlaceholder":238},[551,47960,47962],{"class":553,"line":47961},481,[551,47963,47964],{},"                    \u002F\u002F Parsear campos\n",[551,47966,47968],{"class":553,"line":47967},482,[551,47969,47970],{},"                    string designacion = partes[0].Trim();\n",[551,47972,47974],{"class":553,"line":47973},483,[551,47975,47976],{},"                    string codigo = partes[1].Trim();\n",[551,47978,47980],{"class":553,"line":47979},484,[551,47981,47982],{},"                    string tipo = partes[2].Trim();\n",[551,47984,47986],{"class":553,"line":47985},485,[551,47987,1139],{"emptyLinePlaceholder":238},[551,47989,47991],{"class":553,"line":47990},486,[551,47992,47993],{},"                    double corriente;\n",[551,47995,47997],{"class":553,"line":47996},487,[551,47998,47999],{},"                    if (!double.TryParse(partes[3].Trim(), out corriente))\n",[551,48001,48003],{"class":553,"line":48002},488,[551,48004,47900],{},[551,48006,48008],{"class":553,"line":48007},489,[551,48009,47906],{},[551,48011,48013],{"class":553,"line":48012},490,[551,48014,48015],{},"                            \"Línea {0}: Corriente inválida '{1}'\", lineasProcesadas, partes[3]);\n",[551,48017,48019],{"class":553,"line":48018},491,[551,48020,1139],{"emptyLinePlaceholder":238},[551,48022,48024],{"class":553,"line":48023},492,[551,48025,47929],{},[551,48027,48029],{"class":553,"line":48028},493,[551,48030,47935],{},[551,48032,48034],{"class":553,"line":48033},494,[551,48035,47941],{},[551,48037,48039],{"class":553,"line":48038},495,[551,48040,47947],{},[551,48042,48044],{"class":553,"line":48043},496,[551,48045,47953],{},[551,48047,48049],{"class":553,"line":48048},497,[551,48050,1139],{"emptyLinePlaceholder":238},[551,48052,48054],{"class":553,"line":48053},498,[551,48055,48056],{},"                    double voltaje;\n",[551,48058,48060],{"class":553,"line":48059},499,[551,48061,48062],{},"                    if (!double.TryParse(partes[4].Trim(), out voltaje))\n",[551,48064,48066],{"class":553,"line":48065},500,[551,48067,47900],{},[551,48069,48071],{"class":553,"line":48070},501,[551,48072,47906],{},[551,48074,48076],{"class":553,"line":48075},502,[551,48077,48078],{},"                            \"Línea {0}: Voltaje inválido '{1}'\", lineasProcesadas, partes[4]);\n",[551,48080,48082],{"class":553,"line":48081},503,[551,48083,1139],{"emptyLinePlaceholder":238},[551,48085,48087],{"class":553,"line":48086},504,[551,48088,47929],{},[551,48090,48092],{"class":553,"line":48091},505,[551,48093,47935],{},[551,48095,48097],{"class":553,"line":48096},506,[551,48098,47941],{},[551,48100,48102],{"class":553,"line":48101},507,[551,48103,47947],{},[551,48105,48107],{"class":553,"line":48106},508,[551,48108,47953],{},[551,48110,48112],{"class":553,"line":48111},509,[551,48113,1139],{"emptyLinePlaceholder":238},[551,48115,48117],{"class":553,"line":48116},510,[551,48118,48119],{},"                    \u002F\u002F Crear componente\n",[551,48121,48123],{"class":553,"line":48122},511,[551,48124,48125],{},"                    ComponenteElectrico componente = new ComponenteElectrico(\n",[551,48127,48129],{"class":553,"line":48128},512,[551,48130,48131],{},"                        designacion, codigo, tipo, corriente, voltaje);\n",[551,48133,48135],{"class":553,"line":48134},513,[551,48136,1139],{"emptyLinePlaceholder":238},[551,48138,48140],{"class":553,"line":48139},514,[551,48141,48142],{},"                    \u002F\u002F Validar componente\n",[551,48144,48146],{"class":553,"line":48145},515,[551,48147,48148],{},"                    string errorValidacion;\n",[551,48150,48152],{"class":553,"line":48151},516,[551,48153,48154],{},"                    if (validadorComponentes.ValidarComponente(componente, out errorValidacion))\n",[551,48156,48158],{"class":553,"line":48157},517,[551,48159,47900],{},[551,48161,48163],{"class":553,"line":48162},518,[551,48164,48165],{},"                        lineasValidas++;\n",[551,48167,48169],{"class":553,"line":48168},519,[551,48170,48171],{},"                        log.Info(string.Format(\"Línea {0}: OK - {1}\",\n",[551,48173,48175],{"class":553,"line":48174},520,[551,48176,48177],{},"                            lineasProcesadas, componente));\n",[551,48179,48181],{"class":553,"line":48180},521,[551,48182,47953],{},[551,48184,48186],{"class":553,"line":48185},522,[551,48187,48188],{},"                    else\n",[551,48190,48192],{"class":553,"line":48191},523,[551,48193,47900],{},[551,48195,48197],{"class":553,"line":48196},524,[551,48198,48199],{},"                        errores.Add(string.Format(\"Línea {0}: {1}\",\n",[551,48201,48203],{"class":553,"line":48202},525,[551,48204,48205],{},"                            lineasProcesadas, errorValidacion));\n",[551,48207,48209],{"class":553,"line":48208},526,[551,48210,47941],{},[551,48212,48214],{"class":553,"line":48213},527,[551,48215,47953],{},[551,48217,48219],{"class":553,"line":48218},528,[551,48220,28025],{},[551,48222,48224],{"class":553,"line":48223},529,[551,48225,48226],{},"                catch (Exception ex)\n",[551,48228,48230],{"class":553,"line":48229},530,[551,48231,28010],{},[551,48233,48235],{"class":553,"line":48234},531,[551,48236,48237],{},"                    string errorLinea = string.Format(\n",[551,48239,48241],{"class":553,"line":48240},532,[551,48242,48243],{},"                        \"Línea {0}: Error inesperado - {1}\", lineasProcesadas, ex.Message);\n",[551,48245,48247],{"class":553,"line":48246},533,[551,48248,1139],{"emptyLinePlaceholder":238},[551,48250,48252],{"class":553,"line":48251},534,[551,48253,48254],{},"                    errores.Add(errorLinea);\n",[551,48256,48258],{"class":553,"line":48257},535,[551,48259,48260],{},"                    log.Error(errorLinea, ex);\n",[551,48262,48264],{"class":553,"line":48263},536,[551,48265,48266],{},"                    lineasInvalidas++;\n",[551,48268,48270],{"class":553,"line":48269},537,[551,48271,28025],{},[551,48273,48275],{"class":553,"line":48274},538,[551,48276,12311],{},[551,48278,48280],{"class":553,"line":48279},539,[551,48281,1139],{"emptyLinePlaceholder":238},[551,48283,48285],{"class":553,"line":48284},540,[551,48286,48287],{},"            \u002F\u002F Generar reporte\n",[551,48289,48291],{"class":553,"line":48290},541,[551,48292,48293],{},"            GenerarReporte(rutaArchivo, lineasProcesadas, lineasValidas, lineasInvalidas, errores);\n",[551,48295,48297],{"class":553,"line":48296},542,[551,48298,9077],{},[551,48300,48302],{"class":553,"line":48301},543,[551,48303,48304],{},"        catch (IOException ex)\n",[551,48306,48308],{"class":553,"line":48307},544,[551,48309,9062],{},[551,48311,48313],{"class":553,"line":48312},545,[551,48314,48315],{},"            string mensaje = \"Error de lectura\u002Fescritura: \" + ex.Message;\n",[551,48317,48319],{"class":553,"line":48318},546,[551,48320,48321],{},"            log.Error(mensaje, ex);\n",[551,48323,48325],{"class":553,"line":48324},547,[551,48326,48327],{},"            MessageBox.Show(mensaje, \"Error de E\u002FS\");\n",[551,48329,48331],{"class":553,"line":48330},548,[551,48332,9077],{},[551,48334,48336],{"class":553,"line":48335},549,[551,48337,47192],{},[551,48339,48341],{"class":553,"line":48340},550,[551,48342,9062],{},[551,48344,48346],{"class":553,"line":48345},551,[551,48347,48348],{},"            string mensaje = \"Sin permisos de acceso al archivo\";\n",[551,48350,48352],{"class":553,"line":48351},552,[551,48353,48321],{},[551,48355,48357],{"class":553,"line":48356},553,[551,48358,48359],{},"            MessageBox.Show(mensaje, \"Error de permisos\");\n",[551,48361,48363],{"class":553,"line":48362},554,[551,48364,9077],{},[551,48366,48368],{"class":553,"line":48367},555,[551,48369,41473],{},[551,48371,48373],{"class":553,"line":48372},556,[551,48374,9062],{},[551,48376,48378],{"class":553,"line":48377},557,[551,48379,48380],{},"            string mensaje = \"Error inesperado: \" + ex.Message;\n",[551,48382,48384],{"class":553,"line":48383},558,[551,48385,48321],{},[551,48387,48389],{"class":553,"line":48388},559,[551,48390,48391],{},"            MessageBox.Show(mensaje, \"Error crítico\");\n",[551,48393,48395],{"class":553,"line":48394},560,[551,48396,9077],{},[551,48398,48400],{"class":553,"line":48399},561,[551,48401,48402],{},"        finally\n",[551,48404,48406],{"class":553,"line":48405},562,[551,48407,9062],{},[551,48409,48411],{"class":553,"line":48410},563,[551,48412,48413],{},"            log.Info(\"Procesamiento finalizado\");\n",[551,48415,48417],{"class":553,"line":48416},564,[551,48418,48419],{},"            log.Info(\"========================================\");\n",[551,48421,48423],{"class":553,"line":48422},565,[551,48424,9077],{},[551,48426,48428],{"class":553,"line":48427},566,[551,48429,1187],{},[551,48431,48433],{"class":553,"line":48432},567,[551,48434,1139],{"emptyLinePlaceholder":238},[551,48436,48438],{"class":553,"line":48437},568,[551,48439,48440],{},"    \u002F\u002F Generar reporte de validación\n",[551,48442,48444],{"class":553,"line":48443},569,[551,48445,48446],{},"    private void GenerarReporte(string archivoOrigen, int totalLineas, int lineasValidas,\n",[551,48448,48450],{"class":553,"line":48449},570,[551,48451,48452],{},"                                int lineasInvalidas, List\u003Cstring> errores)\n",[551,48454,48456],{"class":553,"line":48455},571,[551,48457,1169],{},[551,48459,48461],{"class":553,"line":48460},572,[551,48462,48463],{},"        string reporte = \"REPORTE DE VALIDACIÓN\\n\";\n",[551,48465,48467],{"class":553,"line":48466},573,[551,48468,48469],{},"        reporte += \"========================================\\n\";\n",[551,48471,48473],{"class":553,"line":48472},574,[551,48474,48475],{},"        reporte += string.Format(\"Archivo: {0}\\n\", Path.GetFileName(archivoOrigen));\n",[551,48477,48479],{"class":553,"line":48478},575,[551,48480,48481],{},"        reporte += string.Format(\"Fecha: {0}\\n\\n\", DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\"));\n",[551,48483,48485],{"class":553,"line":48484},576,[551,48486,1139],{"emptyLinePlaceholder":238},[551,48488,48490],{"class":553,"line":48489},577,[551,48491,48492],{},"        reporte += \"RESUMEN:\\n\";\n",[551,48494,48496],{"class":553,"line":48495},578,[551,48497,48498],{},"        reporte += string.Format(\"  Líneas procesadas: {0}\\n\", totalLineas);\n",[551,48500,48502],{"class":553,"line":48501},579,[551,48503,48504],{},"        reporte += string.Format(\"  Líneas válidas: {0}\\n\", lineasValidas);\n",[551,48506,48508],{"class":553,"line":48507},580,[551,48509,48510],{},"        reporte += string.Format(\"  Líneas inválidas: {0}\\n\\n\", lineasInvalidas);\n",[551,48512,48514],{"class":553,"line":48513},581,[551,48515,1139],{"emptyLinePlaceholder":238},[551,48517,48519],{"class":553,"line":48518},582,[551,48520,48521],{},"        if (lineasInvalidas > 0)\n",[551,48523,48525],{"class":553,"line":48524},583,[551,48526,9062],{},[551,48528,48530],{"class":553,"line":48529},584,[551,48531,48532],{},"            reporte += \"ERRORES ENCONTRADOS:\\n\";\n",[551,48534,48536],{"class":553,"line":48535},585,[551,48537,48538],{},"            reporte += \"----------------------------------------\\n\";\n",[551,48540,48542],{"class":553,"line":48541},586,[551,48543,48544],{},"            foreach (string error in errores)\n",[551,48546,48548],{"class":553,"line":48547},587,[551,48549,12301],{},[551,48551,48553],{"class":553,"line":48552},588,[551,48554,48555],{},"                reporte += error + \"\\n\";\n",[551,48557,48559],{"class":553,"line":48558},589,[551,48560,12311],{},[551,48562,48564],{"class":553,"line":48563},590,[551,48565,9077],{},[551,48567,48569],{"class":553,"line":48568},591,[551,48570,9082],{},[551,48572,48574],{"class":553,"line":48573},592,[551,48575,9062],{},[551,48577,48579],{"class":553,"line":48578},593,[551,48580,48581],{},"            reporte += \"✓ Todos los componentes son válidos\\n\";\n",[551,48583,48585],{"class":553,"line":48584},594,[551,48586,9077],{},[551,48588,48590],{"class":553,"line":48589},595,[551,48591,1139],{"emptyLinePlaceholder":238},[551,48593,48595],{"class":553,"line":48594},596,[551,48596,48469],{},[551,48598,48600],{"class":553,"line":48599},597,[551,48601,1139],{"emptyLinePlaceholder":238},[551,48603,48605],{"class":553,"line":48604},598,[551,48606,48607],{},"        log.Info(\"Reporte generado\");\n",[551,48609,48611],{"class":553,"line":48610},599,[551,48612,48613],{},"        MessageBox.Show(reporte, \"Reporte de Validación\");\n",[551,48615,48617],{"class":553,"line":48616},600,[551,48618,1187],{},[551,48620,48622],{"class":553,"line":48621},601,[551,48623,1193],{},[551,48625,48627],{"class":553,"line":48626},602,[551,48628,1139],{"emptyLinePlaceholder":238},[551,48630,48632],{"class":553,"line":48631},603,[551,48633,8157],{},[551,48635,48637],{"class":553,"line":48636},604,[551,48638,48639],{},"\u002F\u002F SCRIPT PRINCIPAL\n",[551,48641,48643],{"class":553,"line":48642},605,[551,48644,8157],{},[551,48646,48648],{"class":553,"line":48647},606,[551,48649,48650],{},"public class ValidadorRobusto\n",[551,48652,48654],{"class":553,"line":48653},607,[551,48655,1151],{},[551,48657,48659],{"class":553,"line":48658},608,[551,48660,1157],{},[551,48662,48664],{"class":553,"line":48663},609,[551,48665,1163],{},[551,48667,48669],{"class":553,"line":48668},610,[551,48670,1169],{},[551,48672,48674],{"class":553,"line":48673},611,[551,48675,41211],{},[551,48677,48679],{"class":553,"line":48678},612,[551,48680,9062],{},[551,48682,48684],{"class":553,"line":48683},613,[551,48685,48686],{},"            \u002F\u002F Crear logger\n",[551,48688,48690],{"class":553,"line":48689},614,[551,48691,48692],{},"            string rutaLog = @\"C:\\temp\\eplan_logs\\validacion.log\";\n",[551,48694,48696],{"class":553,"line":48695},615,[551,48697,48698],{},"            Logger log = new Logger(rutaLog, NivelLog.Info);\n",[551,48700,48702],{"class":553,"line":48701},616,[551,48703,1139],{"emptyLinePlaceholder":238},[551,48705,48707],{"class":553,"line":48706},617,[551,48708,48709],{},"            log.Info(\"==================================================\");\n",[551,48711,48713],{"class":553,"line":48712},618,[551,48714,48715],{},"            log.Info(\"VALIDADOR ROBUSTO DE ARCHIVOS Y DATOS\");\n",[551,48717,48719],{"class":553,"line":48718},619,[551,48720,48709],{},[551,48722,48724],{"class":553,"line":48723},620,[551,48725,1139],{"emptyLinePlaceholder":238},[551,48727,48729],{"class":553,"line":48728},621,[551,48730,48731],{},"            \u002F\u002F Crear procesador\n",[551,48733,48735],{"class":553,"line":48734},622,[551,48736,48737],{},"            ProcesadorArchivos procesador = new ProcesadorArchivos(log);\n",[551,48739,48741],{"class":553,"line":48740},623,[551,48742,1139],{"emptyLinePlaceholder":238},[551,48744,48746],{"class":553,"line":48745},624,[551,48747,48748],{},"            \u002F\u002F Archivo de prueba\n",[551,48750,48752],{"class":553,"line":48751},625,[551,48753,48754],{},"            string archivoComponentes = @\"C:\\temp\\componentes.txt\";\n",[551,48756,48758],{"class":553,"line":48757},626,[551,48759,1139],{"emptyLinePlaceholder":238},[551,48761,48763],{"class":553,"line":48762},627,[551,48764,48765],{},"            \u002F\u002F Procesar\n",[551,48767,48769],{"class":553,"line":48768},628,[551,48770,48771],{},"            procesador.ProcesarArchivoComponentes(archivoComponentes);\n",[551,48773,48775],{"class":553,"line":48774},629,[551,48776,1139],{"emptyLinePlaceholder":238},[551,48778,48780],{"class":553,"line":48779},630,[551,48781,48782],{},"            \u002F\u002F Mostrar ubicación del log\n",[551,48784,48786],{"class":553,"line":48785},631,[551,48787,48788],{},"            MessageBox.Show(string.Format(\"Procesamiento completado.\\n\\nLog disponible en:\\n{0}\", rutaLog),\n",[551,48790,48792],{"class":553,"line":48791},632,[551,48793,48794],{},"                \"Validación completada\");\n",[551,48796,48798],{"class":553,"line":48797},633,[551,48799,9077],{},[551,48801,48803],{"class":553,"line":48802},634,[551,48804,41473],{},[551,48806,48808],{"class":553,"line":48807},635,[551,48809,9062],{},[551,48811,48813],{"class":553,"line":48812},636,[551,48814,48815],{},"            MessageBox.Show(string.Format(\"Error crítico en la aplicación:\\n\\n{0}\\n\\n{1}\",\n",[551,48817,48819],{"class":553,"line":48818},637,[551,48820,48821],{},"                ex.Message, ex.StackTrace), \"Error crítico\");\n",[551,48823,48825],{"class":553,"line":48824},638,[551,48826,9077],{},[551,48828,48830],{"class":553,"line":48829},639,[551,48831,1187],{},[551,48833,48835],{"class":553,"line":48834},640,[551,48836,1193],{},[331,48838,48840],{"id":48839},"archivo-de-prueba-componentestxt","Archivo de prueba: componentes.txt",[13,48842,48843,48844,416],{},"Crea este archivo en ",[54,48845,48846],{},"C:\\temp\\componentes.txt",[543,48848,48851],{"className":48849,"code":48850,"language":847},[845],"# Archivo de componentes eléctricos\n# Formato: Designacion,Codigo,Tipo,Corriente,Voltaje\n\nK1,3RT2026-1BB40,Contactor,25.0,400\nK2,3RT2036-1BB40,Contactor,40.0,400\nQ1,3RV2011-1JA10,Guardamotor,4.5,400\nM1,WEG-7.5KW,Motor,15.2,400\n\n# Líneas con errores para probar validación\nK3,ABC,Contactor,-10.0,400\n,3RT2026,Contactor,25.0,400\nK5,3RT2026-1BB40,Contactor,25.0,999\nK6,3RT2026-1BB40,Contactor,abc,400\nK7,SHORT,Contactor,25.0,400,extra\n",[54,48852,48850],{"__ignoreMap":228},[43,48854],{},[46,48856,35765],{"id":4851},[331,48858,48860],{"id":48859},"cuándo-usar-excepciones-vs-validación","¿Cuándo usar excepciones vs validación?",[13,48862,48863,416],{},[16,48864,48865],{},"Usa excepciones para",[126,48867,48868,48871,48874],{},[88,48869,48870],{},"Condiciones verdaderamente excepcionales",[88,48872,48873],{},"Errores que no esperas normalmente",[88,48875,48876],{},"Violaciones de contratos (pre\u002Fpostcondiciones)",[13,48878,48879,416],{},[16,48880,48881],{},"Usa validación para",[126,48883,48884,48887,48890],{},[88,48885,48886],{},"Entrada de usuario",[88,48888,48889],{},"Datos externos (archivos, red)",[88,48891,48892],{},"Condiciones esperadas del negocio",[331,48894,48896],{"id":48895},"stack-unwinding","Stack unwinding",[13,48898,48899,48900,416],{},"Cuando se lanza una excepción, el programa \"desenrolla\" la pila de llamadas hasta encontrar un ",[54,48901,43401],{},[543,48903,48905],{"className":545,"code":48904,"language":547,"meta":228,"style":228},"public void Metodo1()\n{\n    try\n    {\n        Metodo2();\n    }\n    catch (Exception ex)\n    {\n        MessageBox.Show(\"Capturado en Metodo1: \" + ex.Message);\n    }\n}\n\npublic void Metodo2()\n{\n    Metodo3();  \u002F\u002F No captura excepciones\n}\n\npublic void Metodo3()\n{\n    throw new Exception(\"Error en Metodo3\");\n}\n\n\u002F\u002F Flujo:\n\u002F\u002F Metodo3 lanza excepción\n\u002F\u002F → Metodo2 no la captura, sube\n\u002F\u002F → Metodo1 la captura y maneja\n",[54,48906,48907,48912,48916,48920,48924,48929,48933,48937,48941,48946,48950,48954,48958,48963,48967,48972,48976,48980,48985,48989,48994,48998,49002,49007,49012,49017],{"__ignoreMap":228},[551,48908,48909],{"class":553,"line":554},[551,48910,48911],{},"public void Metodo1()\n",[551,48913,48914],{"class":553,"line":229},[551,48915,1151],{},[551,48917,48918],{"class":553,"line":670},[551,48919,42869],{},[551,48921,48922],{"class":553,"line":1136},[551,48923,1169],{},[551,48925,48926],{"class":553,"line":1142},[551,48927,48928],{},"        Metodo2();\n",[551,48930,48931],{"class":553,"line":1148},[551,48932,1187],{},[551,48934,48935],{"class":553,"line":1154},[551,48936,43071],{},[551,48938,48939],{"class":553,"line":1160},[551,48940,1169],{},[551,48942,48943],{"class":553,"line":1166},[551,48944,48945],{},"        MessageBox.Show(\"Capturado en Metodo1: \" + ex.Message);\n",[551,48947,48948],{"class":553,"line":1172},[551,48949,1187],{},[551,48951,48952],{"class":553,"line":1178},[551,48953,1193],{},[551,48955,48956],{"class":553,"line":1184},[551,48957,1139],{"emptyLinePlaceholder":238},[551,48959,48960],{"class":553,"line":1190},[551,48961,48962],{},"public void Metodo2()\n",[551,48964,48965],{"class":553,"line":1472},[551,48966,1151],{},[551,48968,48969],{"class":553,"line":1477},[551,48970,48971],{},"    Metodo3();  \u002F\u002F No captura excepciones\n",[551,48973,48974],{"class":553,"line":1797},[551,48975,1193],{},[551,48977,48978],{"class":553,"line":1802},[551,48979,1139],{"emptyLinePlaceholder":238},[551,48981,48982],{"class":553,"line":1808},[551,48983,48984],{},"public void Metodo3()\n",[551,48986,48987],{"class":553,"line":1814},[551,48988,1151],{},[551,48990,48991],{"class":553,"line":1820},[551,48992,48993],{},"    throw new Exception(\"Error en Metodo3\");\n",[551,48995,48996],{"class":553,"line":1826},[551,48997,1193],{},[551,48999,49000],{"class":553,"line":1832},[551,49001,1139],{"emptyLinePlaceholder":238},[551,49003,49004],{"class":553,"line":1838},[551,49005,49006],{},"\u002F\u002F Flujo:\n",[551,49008,49009],{"class":553,"line":1844},[551,49010,49011],{},"\u002F\u002F Metodo3 lanza excepción\n",[551,49013,49014],{"class":553,"line":1850},[551,49015,49016],{},"\u002F\u002F → Metodo2 no la captura, sube\n",[551,49018,49019],{"class":553,"line":1855},[551,49020,49021],{},"\u002F\u002F → Metodo1 la captura y maneja\n",[331,49023,49025],{"id":49024},"using-manejo-automático-de-recursos","Using: Manejo automático de recursos",[543,49027,49029],{"className":545,"code":49028,"language":547,"meta":228,"style":228},"\u002F\u002F Sin using - manual\nStreamReader reader = null;\ntry\n{\n    reader = new StreamReader(\"archivo.txt\");\n    string contenido = reader.ReadToEnd();\n}\nfinally\n{\n    if (reader != null)\n        reader.Close();\n}\n\n\u002F\u002F Con using - automático\nusing (StreamReader reader = new StreamReader(\"archivo.txt\"))\n{\n    string contenido = reader.ReadToEnd();\n}  \u002F\u002F Automáticamente llama reader.Close()\n",[54,49030,49031,49036,49041,49045,49049,49054,49058,49062,49066,49070,49074,49079,49083,49087,49092,49097,49101,49105],{"__ignoreMap":228},[551,49032,49033],{"class":553,"line":554},[551,49034,49035],{},"\u002F\u002F Sin using - manual\n",[551,49037,49038],{"class":553,"line":229},[551,49039,49040],{},"StreamReader reader = null;\n",[551,49042,49043],{"class":553,"line":670},[551,49044,43272],{},[551,49046,49047],{"class":553,"line":1136},[551,49048,1151],{},[551,49050,49051],{"class":553,"line":1142},[551,49052,49053],{},"    reader = new StreamReader(\"archivo.txt\");\n",[551,49055,49056],{"class":553,"line":1148},[551,49057,43591],{},[551,49059,49060],{"class":553,"line":1154},[551,49061,1193],{},[551,49063,49064],{"class":553,"line":1160},[551,49065,43621],{},[551,49067,49068],{"class":553,"line":1166},[551,49069,1151],{},[551,49071,49072],{"class":553,"line":1172},[551,49073,43635],{},[551,49075,49076],{"class":553,"line":1178},[551,49077,49078],{},"        reader.Close();\n",[551,49080,49081],{"class":553,"line":1184},[551,49082,1193],{},[551,49084,49085],{"class":553,"line":1190},[551,49086,1139],{"emptyLinePlaceholder":238},[551,49088,49089],{"class":553,"line":1472},[551,49090,49091],{},"\u002F\u002F Con using - automático\n",[551,49093,49094],{"class":553,"line":1477},[551,49095,49096],{},"using (StreamReader reader = new StreamReader(\"archivo.txt\"))\n",[551,49098,49099],{"class":553,"line":1797},[551,49100,1151],{},[551,49102,49103],{"class":553,"line":1802},[551,49104,43591],{},[551,49106,49107],{"class":553,"line":1808},[551,49108,49109],{},"}  \u002F\u002F Automáticamente llama reader.Close()\n",[13,49111,49112,416],{},[16,49113,49114,49115],{},"Ventajas de ",[54,49116,49117],{},"using",[126,49119,49120,49123,49126],{},[88,49121,49122],{},"Garantiza liberación de recursos",[88,49124,49125],{},"Código más limpio",[88,49127,49128],{},"Menos propenso a errores",[43,49130],{},[46,49132,36015],{"id":22684},[13,49134,22688],{},[126,49136,49137,49143,49149,49155,49161,49167,49173,49178],{},[88,49138,36022,49139,49142],{},[16,49140,49141],{},"Excepciones",": Eventos anormales durante la ejecución",[88,49144,36022,49145,49148],{},[16,49146,49147],{},"Try-catch-finally",": Estructura fundamental de manejo de errores",[88,49150,36022,49151,49154],{},[16,49152,49153],{},"Tipos de excepciones",": FileNotFoundException, FormatException, etc.",[88,49156,36022,49157,49160],{},[16,49158,49159],{},"Throw",": Lanzar excepciones propias y personalizadas",[88,49162,36022,49163,49166],{},[16,49164,49165],{},"Validación",": Prevenir errores antes de que ocurran",[88,49168,36022,49169,49172],{},[16,49170,49171],{},"Logging",": Registrar eventos y errores para debugging",[88,49174,36022,49175,49177],{},[16,49176,5121],{},": Capturar específico, validar entrada, mensajes útiles",[88,49179,36022,49180,49182],{},[16,49181,22725],{},": Validador robusto con manejo completo de errores",[13,49184,49185,416],{},[16,49186,22731],{},[126,49188,49189,49192,49195,49198,49201,49204],{},[88,49190,49191],{},"Las excepciones son para casos excepcionales, no para control de flujo",[88,49193,49194],{},"Siempre valida entrada de usuario antes de procesar",[88,49196,49197],{},"Captura excepciones específicas, no genéricas",[88,49199,49200],{},"Proporciona mensajes de error útiles y accionables",[88,49202,49203],{},"Registra errores para poder diagnosticar problemas",[88,49205,10479,49206,49208,49209,32897],{},[54,49207,43665],{}," para liberar recursos (o mejor aún, ",[54,49210,49117],{},[43,49212],{},[46,49214,36079],{"id":36078},[331,49216,36083],{"id":36082},[13,49218,49219],{},[16,49220,36097],{},[331,49222,36092],{"id":36091},[13,49224,49225],{},[16,49226,49227],{},"Capítulo 12: Arquitectura de EPLAN API",[13,49229,49230],{},"En el próximo capítulo comenzarás a trabajar con EPLAN API. Aprenderás su estructura, namespaces principales, cómo leer la documentación, y crearás tus primeros scripts que interactúan con proyectos EPLAN reales.",[43,49232],{},[46,49234,36105],{"id":10522},[126,49236,49237,49244,49251,49258,49265],{},[88,49238,16557,49239],{},[955,49240,49243],{"href":49241,"rel":49242},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Ffundamentals\u002Fexceptions\u002F",[959],"Documentación de C# - Excepciones",[88,49245,16557,49246],{},[955,49247,49250],{"href":49248,"rel":49249},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Fstatements\u002Fexception-handling-statements",[959],"Documentación de C# - Try-Catch",[88,49252,16557,49253],{},[955,49254,49257],{"href":49255,"rel":49256},"https:\u002F\u002Flearn.microsoft.com\u002Fes-es\u002Fdotnet\u002Fcsharp\u002Flanguage-reference\u002Fstatements\u002Fthrow",[959],"Documentación de C# - Throw",[88,49259,16557,49260],{},[955,49261,49264],{"href":49262,"rel":49263},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fstandard\u002Fexceptions\u002Fbest-practices-for-exceptions",[959],"Best Practices for Exceptions",[88,49266,36133,49267,93,49269],{},[551,49268,36136],{},[54,49270,49271],{},"code\u002Fcap-11\u002F",[43,49273],{},[46,49275,36144],{"id":5727},[331,49277,49279],{"id":49278},"p-debo-capturar-todas-las-excepciones","P: ¿Debo capturar todas las excepciones?",[13,49281,49282,49284,49285,49288],{},[16,49283,5737],{}," No. Solo captura excepciones que puedas manejar de forma significativa. Si no puedes hacer nada útil con la excepción, déjala propagarse. Evita ",[54,49286,49287],{},"catch (Exception)"," genérico a menos que sea el nivel más alto de tu aplicación.",[331,49290,49292,49293,4842,49295,36151],{"id":49291},"p-cuál-es-la-diferencia-entre-throw-y-throw-ex","P: ¿Cuál es la diferencia entre ",[54,49294,22453],{},[54,49296,49297],{},"throw ex",[13,49299,49300],{},[16,49301,5737],{},[126,49303,49304,49310],{},[88,49305,49306,49309],{},[54,49307,49308],{},"throw;"," re-lanza la excepción original manteniendo el stack trace completo",[88,49311,49312,49315,49316,49319],{},[54,49313,49314],{},"throw ex;"," re-lanza pero ",[16,49317,49318],{},"pierde"," el stack trace original",[13,49321,49322],{},[16,49323,49324,49325,49327],{},"Siempre usa ",[54,49326,49308],{}," sin parámetro para re-lanzar.",[331,49329,49331],{"id":49330},"p-las-excepciones-son-lentas","P: ¿Las excepciones son lentas?",[13,49333,49334,49336,49337,49340,49341,49344,49345,49348,49349,49351],{},[16,49335,5737],{}," Sí, las excepciones tienen un costo de rendimiento. Por eso ",[16,49338,49339],{},"no"," debes usarlas para control de flujo normal. Usa ",[54,49342,49343],{},"TryParse"," en lugar de ",[54,49346,49347],{},"try-catch"," para conversiones, y validaciones ",[54,49350,11644],{}," para condiciones esperadas.",[331,49353,49355],{"id":49354},"p-cuándo-debo-crear-excepciones-personalizadas","P: ¿Cuándo debo crear excepciones personalizadas?",[13,49357,49358,49360,49361,4000,49364,41],{},[16,49359,5737],{}," Cuando necesitas comunicar un error específico de tu dominio que no está cubierto por las excepciones estándar. Ejemplo: ",[54,49362,49363],{},"ComponenteInvalidoException",[54,49365,49366],{},"VoltajeIncompatibleException",[331,49368,49370],{"id":49369},"p-qué-hacer-si-un-método-lanza-múltiples-tipos-de-excepciones","P: ¿Qué hacer si un método lanza múltiples tipos de excepciones?",[13,49372,49373,49375,49376,49378],{},[16,49374,5737],{}," Usa múltiples bloques ",[54,49377,43401],{},", ordenados de más específico a más genérico:",[543,49380,49382],{"className":545,"code":49381,"language":547,"meta":228,"style":228},"try\n{\n    \u002F\u002F código\n}\ncatch (FileNotFoundException ex) { }\ncatch (UnauthorizedAccessException ex) { }\ncatch (IOException ex) { }\ncatch (Exception ex) { }  \u002F\u002F Captura el resto\n",[54,49383,49384,49388,49392,49397,49401,49405,49410,49415],{"__ignoreMap":228},[551,49385,49386],{"class":553,"line":554},[551,49387,43272],{},[551,49389,49390],{"class":553,"line":229},[551,49391,1151],{},[551,49393,49394],{"class":553,"line":670},[551,49395,49396],{},"    \u002F\u002F código\n",[551,49398,49399],{"class":553,"line":1136},[551,49400,1193],{},[551,49402,49403],{"class":553,"line":1142},[551,49404,43545],{},[551,49406,49407],{"class":553,"line":1148},[551,49408,49409],{},"catch (UnauthorizedAccessException ex) { }\n",[551,49411,49412],{"class":553,"line":1154},[551,49413,49414],{},"catch (IOException ex) { }\n",[551,49416,49417],{"class":553,"line":1160},[551,49418,43555],{},[331,49420,49422,49423,49425],{"id":49421},"p-es-malo-usar-catch-sin-especificar-el-tipo","P: ¿Es malo usar ",[54,49424,43401],{}," sin especificar el tipo?",[13,49427,49428,49430,49431,49434,49435,49438],{},[16,49429,5737],{}," Sí, evita ",[54,49432,49433],{},"catch { }"," sin tipo. Siempre especifica al menos ",[54,49436,49437],{},"catch (Exception ex)"," para poder acceder a la información del error y registrarlo.",[43,49440],{},[46,49442,36275],{"id":10614},[13,49444,10618],{},[126,49446,49448,49454,49460,49466,49474,49480,49486,49492,49498,49504],{"className":49447},[275],[88,49449,49451,49453],{"className":49450},[279],[281,49452],{"disabled":238,"type":283}," Entender qué son las excepciones y cuándo ocurren",[88,49455,49457,49459],{"className":49456},[279],[281,49458],{"disabled":238,"type":283}," Poder escribir try-catch-finally correctamente",[88,49461,49463,49465],{"className":49462},[279],[281,49464],{"disabled":238,"type":283}," Conocer los tipos comunes de excepciones",[88,49467,49469,49471,49472],{"className":49468},[279],[281,49470],{"disabled":238,"type":283}," Saber lanzar excepciones con ",[54,49473,22453],{},[88,49475,49477,49479],{"className":49476},[279],[281,49478],{"disabled":238,"type":283}," Poder crear excepciones personalizadas",[88,49481,49483,49485],{"className":49482},[279],[281,49484],{"disabled":238,"type":283}," Implementar validación de datos con TryParse",[88,49487,49489,49491],{"className":49488},[279],[281,49490],{"disabled":238,"type":283}," Crear un logger simple para registrar errores",[88,49493,49495,49497],{"className":49494},[279],[281,49496],{"disabled":238,"type":283}," Haber ejecutado el validador robusto completo",[88,49499,49501,49503],{"className":49500},[279],[281,49502],{"disabled":238,"type":283}," Entender las mejores prácticas de manejo de errores",[88,49505,49507,49509],{"className":49506},[279],[281,49508],{"disabled":238,"type":283}," (Opcional) Adaptar el validador para tus propios datos",[43,49511],{},[13,49513,49514,49517],{},[16,49515,49516],{},"¡Felicitaciones! Has completado la Parte I de la guía."," 🎉",[13,49519,49520],{},"Ya tienes todos los fundamentos de programación necesarios para trabajar con EPLAN API. En la Parte II comenzarás a crear scripts reales que automatizan tareas en EPLAN Electric P8.",[13,49522,49523,36338],{},[16,49524,49525],{},"¿Listo para empezar con EPLAN API? ¡Vamos al Capítulo 12!",[43,49527],{},[13,49529,49530,10676,49532,42509,49534,93,49536],{},[31,49531,657],{},[31,49533,10679],{},[31,49535,10683],{},[54,49537,49271],{},[660,49539,662],{},{"title":228,"searchDepth":229,"depth":229,"links":49541},[49542,49543,49544,49545,49554,49558,49563,49564,49568,49569,49579],{"id":267,"depth":229,"text":33353},{"id":319,"depth":229,"text":33429},{"id":739,"depth":229,"text":33450},{"id":328,"depth":229,"text":33501,"children":49546},[49547,49548,49549,49550,49551,49552,49553],{"id":42733,"depth":670,"text":42734},{"id":43115,"depth":670,"text":43116},{"id":43323,"depth":670,"text":43324},{"id":43764,"depth":670,"text":43765},{"id":44148,"depth":670,"text":44149},{"id":44516,"depth":670,"text":44517},{"id":45139,"depth":670,"text":45140},{"id":4024,"depth":229,"text":35443,"children":49555},[49556,49557],{"id":45697,"depth":670,"text":45698},{"id":48839,"depth":670,"text":48840},{"id":4851,"depth":229,"text":35765,"children":49559},[49560,49561,49562],{"id":48859,"depth":670,"text":48860},{"id":48895,"depth":670,"text":48896},{"id":49024,"depth":670,"text":49025},{"id":22684,"depth":229,"text":36015},{"id":36078,"depth":229,"text":36079,"children":49565},[49566,49567],{"id":36082,"depth":670,"text":36083},{"id":36091,"depth":670,"text":36092},{"id":10522,"depth":229,"text":36105},{"id":5727,"depth":229,"text":36144,"children":49570},[49571,49572,49574,49575,49576,49577],{"id":49278,"depth":670,"text":49279},{"id":49291,"depth":670,"text":49573},"P: ¿Cuál es la diferencia entre throw y throw ex?",{"id":49330,"depth":670,"text":49331},{"id":49354,"depth":670,"text":49355},{"id":49369,"depth":670,"text":49370},{"id":49421,"depth":670,"text":49578},"P: ¿Es malo usar catch sin especificar el tipo?",{"id":10614,"depth":229,"text":36275},"Maneja errores en C# con try\u002Fcatch y excepciones para crear scripts EPLAN robustos y automatizar EPLAN Electric P8 sin fallos.",{},"\u002Fguia\u002Ffundamentos\u002Fcap-11-manejo-errores",{"title":42574,"description":49580},"guia\u002Ffundamentos\u002Fcap-11-manejo-errores","5g7XE_ReLYOwlkJPWi-sTJcxwPbOtYRXOd1yW2FAgh0",{"id":49587,"title":49588,"body":49589,"description":51891,"extension":236,"meta":51892,"navigation":238,"path":51893,"seo":51894,"stem":51895,"tagline":242,"__hash__":51896},"guia\u002Fguia\u002Feplan-api\u002Fcap-12-atributo-start.md","Capítulo 12: Atributo [Start] en EPLAN",{"type":7,"value":49590,"toc":51833},[49591,49603,49605,49607,49609,49628,49630,49632,49634,49648,49650,49654,49657,49663,49672,49674,49678,49682,49692,49696,49723,49730,49734,49737,49763,49767,49835,49841,49843,49849,49855,49868,49874,49884,49890,49896,49905,49908,49937,49943,49949,50047,50053,50059,50065,50073,50075,50081,50085,50088,50096,50163,50167,50170,50175,50190,50209,50214,50222,50225,50230,50239,50245,50252,50265,50288,50293,50302,50305,50309,50322,50327,50334,50350,50356,50360,50365,50389,50391,50395,50399,50405,50482,50500,50504,50511,50561,50564,50568,50635,50647,50649,50653,50657,50664,50677,50681,50688,50693,50717,50722,50786,50791,50805,50809,50815,50819,50839,50843,50942,50946,50960,50966,50970,50975,50996,51002,51010,51012,51016,51020,51025,51045,51049,51056,51112,51118,51122,51129,51216,51221,51225,51232,51303,51308,51314,51318,51334,51336,51340,51344,51349,51397,51402,51452,51456,51460,51510,51514,51540,51544,51548,51575,51579,51605,51609,51613,51640,51644,51675,51677,51679,51681,51731,51733,51735,51742,51748,51753,51756,51764,51770,51775,51778,51780,51783,51787,51792,51796,51804,51811,51813,51831],[10,49592,49593],{},[13,49594,49595,19,49598,19,49601,262],{},[16,49596,49597],{},"Parte II: Primeros pasos con EPLAN API",[16,49599,49600],{},"Sección 5: Atributos de scripting",[16,49602,25],{},[43,49604],{},[46,49606,268],{"id":267},[13,49608,702],{},[126,49610,49611,49614,49619,49622,49625],{},[88,49612,49613],{},"Entender qué es un atributo en C#",[88,49615,49616,49617],{},"Comprender el propósito del atributo ",[54,49618,1644],{},[88,49620,49621],{},"Escribir tu primer script funcional en EPLAN",[88,49623,49624],{},"Conocer la estructura mínima de un script",[88,49626,49627],{},"Diferenciar entre MessageBox y BaseException para mostrar información",[43,49629],{},[46,49631,320],{"id":319},[13,49633,726],{},[126,49635,49636,49639,49642,49645],{},[88,49637,49638],{},"Haber completado la Parte I (Capítulos 1-11) sobre fundamentos de C#",[88,49640,49641],{},"Tener EPLAN Electric P8 instalado",[88,49643,49644],{},"Saber ejecutar scripts (Fichero > Extras > Interfaces > Ejecutar script...)",[88,49646,49647],{},"Conocer clases, métodos y namespaces de C#",[43,49649],{},[46,49651,49653],{"id":49652},"introducción","Introducción",[13,49655,49656],{},"Bienvenido a tu primer contacto con la EPLAN API. Hasta ahora has aprendido C# de forma genérica, pero a partir de este capítulo comenzarás a aplicar esos conocimientos para automatizar EPLAN Electric P8.",[13,49658,49659,49660],{},"La pregunta fundamental es: ",[16,49661,49662],{},"¿Cómo sabe EPLAN qué método ejecutar cuando abres un archivo .cs?",[13,49664,49665,49666,49669,49670,41],{},"La respuesta es simple: mediante ",[16,49667,49668],{},"atributos de scripting",". El más básico y fundamental es ",[54,49671,1644],{},[43,49673],{},[46,49675,49677],{"id":49676},"_1-qué-es-un-atributo-en-c","1. ¿Qué es un atributo en C#?",[331,49679,49681],{"id":49680},"_11-definición","1.1 Definición",[13,49683,33655,49684,49687,49688,49691],{},[16,49685,49686],{},"atributo"," en C# es una ",[16,49689,49690],{},"etiqueta de metadatos"," que se coloca encima de una clase, método, propiedad o parámetro para indicar información adicional al compilador o al runtime.",[13,49693,49694],{},[16,49695,17002],{},[543,49697,49699],{"className":545,"code":49698,"language":547,"meta":228,"style":228},"[NombreDelAtributo]\npublic void MiMetodo()\n{\n    \u002F\u002F código\n}\n",[54,49700,49701,49706,49711,49715,49719],{"__ignoreMap":228},[551,49702,49703],{"class":553,"line":554},[551,49704,49705],{},"[NombreDelAtributo]\n",[551,49707,49708],{"class":553,"line":229},[551,49709,49710],{},"public void MiMetodo()\n",[551,49712,49713],{"class":553,"line":670},[551,49714,1151],{},[551,49716,49717],{"class":553,"line":1136},[551,49718,49396],{},[551,49720,49721],{"class":553,"line":1142},[551,49722,1193],{},[13,49724,49725,49726,49729],{},"Los atributos van entre corchetes ",[54,49727,49728],{},"[]"," y se colocan justo antes del elemento al que afectan.",[331,49731,49733],{"id":49732},"_12-para-qué-sirven-los-atributos","1.2 ¿Para qué sirven los atributos?",[13,49735,49736],{},"Los atributos permiten:",[126,49738,49739,49745,49751,49757],{},[88,49740,49741,49744],{},[16,49742,49743],{},"Marcar"," elementos con información especial",[88,49746,49747,49750],{},[16,49748,49749],{},"Modificar el comportamiento"," de clases o métodos",[88,49752,49753,49756],{},[16,49754,49755],{},"Indicar al runtime"," cómo debe tratar cierto código",[88,49758,49759,49762],{},[16,49760,49761],{},"Documentar"," características especiales del código",[331,49764,49766],{"id":49765},"_13-ejemplos-de-atributos-comunes-en-c","1.3 Ejemplos de atributos comunes en C#",[543,49768,49770],{"className":545,"code":49769,"language":547,"meta":228,"style":228},"[Obsolete(\"Este método está obsoleto, usa el nuevo\")]\npublic void MetodoViejo()\n{\n    \u002F\u002F ...\n}\n\n[Serializable]\npublic class MiClase\n{\n    \u002F\u002F Esta clase puede serializarse\n}\n\n[DllImport(\"user32.dll\")]\npublic static extern int MessageBeep(uint beepType);\n",[54,49771,49772,49777,49782,49786,49790,49794,49798,49803,49808,49812,49817,49821,49825,49830],{"__ignoreMap":228},[551,49773,49774],{"class":553,"line":554},[551,49775,49776],{},"[Obsolete(\"Este método está obsoleto, usa el nuevo\")]\n",[551,49778,49779],{"class":553,"line":229},[551,49780,49781],{},"public void MetodoViejo()\n",[551,49783,49784],{"class":553,"line":670},[551,49785,1151],{},[551,49787,49788],{"class":553,"line":1136},[551,49789,16123],{},[551,49791,49792],{"class":553,"line":1142},[551,49793,1193],{},[551,49795,49796],{"class":553,"line":1148},[551,49797,1139],{"emptyLinePlaceholder":238},[551,49799,49800],{"class":553,"line":1154},[551,49801,49802],{},"[Serializable]\n",[551,49804,49805],{"class":553,"line":1160},[551,49806,49807],{},"public class MiClase\n",[551,49809,49810],{"class":553,"line":1166},[551,49811,1151],{},[551,49813,49814],{"class":553,"line":1172},[551,49815,49816],{},"    \u002F\u002F Esta clase puede serializarse\n",[551,49818,49819],{"class":553,"line":1178},[551,49820,1193],{},[551,49822,49823],{"class":553,"line":1184},[551,49824,1139],{"emptyLinePlaceholder":238},[551,49826,49827],{"class":553,"line":1190},[551,49828,49829],{},"[DllImport(\"user32.dll\")]\n",[551,49831,49832],{"class":553,"line":1472},[551,49833,49834],{},"public static extern int MessageBeep(uint beepType);\n",[13,49836,49837,49838,49840],{},"En EPLAN, usamos ",[16,49839,49668],{}," para indicar qué métodos debe ejecutar el motor de scripts.",[43,49842],{},[46,49844,49846,49847],{"id":49845},"_2-el-atributo-start","2. El atributo ",[551,49848,1300],{},[331,49850,49852,49853,36151],{"id":49851},"_21-qué-es-start","2.1 ¿Qué es ",[551,49854,1300],{},[13,49856,49857,49859,49860,49863,49864,49867],{},[54,49858,1644],{}," es un ",[16,49861,49862],{},"atributo de EPLAN"," que marca el ",[16,49865,49866],{},"punto de entrada"," de un script.",[13,49869,49870,49871,49873],{},"Cuando ejecutas un script en EPLAN (Fichero > Extras > Interfaces > Ejecutar script...), EPLAN busca un método marcado con ",[54,49872,1644],{}," y lo ejecuta automáticamente.",[13,49875,49876,49879,49880,49883],{},[16,49877,49878],{},"Analogía:"," Es como el método ",[54,49881,49882],{},"Main()"," en aplicaciones de consola C#, pero para scripts de EPLAN.",[331,49885,49887,49888,36151],{"id":49886},"_22-dónde-se-define-start","2.2 ¿Dónde se define ",[551,49889,1300],{},[13,49891,49892,49893,49895],{},"El atributo ",[54,49894,1644],{}," está definido en el namespace:",[543,49897,49899],{"className":545,"code":49898,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Scripting;\n",[54,49900,49901],{"__ignoreMap":228},[551,49902,49903],{"class":553,"line":554},[551,49904,49898],{},[13,49906,49907],{},"Este namespace contiene todos los atributos de scripting de EPLAN:",[126,49909,49910,49915,49921,49927],{},[88,49911,49912,49914],{},[54,49913,1644],{}," - Punto de entrada",[88,49916,49917,49920],{},[54,49918,49919],{},"[DeclareAction]"," - Acciones personalizadas",[88,49922,49923,49926],{},[54,49924,49925],{},"[DeclareEventHandler]"," - Manejadores de eventos",[88,49928,49929,49932,49933,49936],{},[54,49930,49931],{},"[DeclareRegister]"," \u002F ",[54,49934,49935],{},"[DeclareUnregister]"," - Carga automática",[331,49938,49940,49941],{"id":49939},"_23-reglas-del-atributo-start","2.3 Reglas del atributo ",[551,49942,1300],{},[13,49944,49945,49946,49948],{},"Para que ",[54,49947,1644],{}," funcione correctamente:",[85,49950,49951,49970,50002,50034,50042],{},[88,49952,49953,49956],{},[16,49954,49955],{},"Debe aplicarse a un método público",[543,49957,49959],{"className":545,"code":49958,"language":547,"meta":228,"style":228},"[Start]\npublic void MiMetodo()  \u002F\u002F ✓ Correcto\n",[54,49960,49961,49965],{"__ignoreMap":228},[551,49962,49963],{"class":553,"line":554},[551,49964,1310],{},[551,49966,49967],{"class":553,"line":229},[551,49968,49969],{},"public void MiMetodo()  \u002F\u002F ✓ Correcto\n",[88,49971,49972,49975],{},[16,49973,49974],{},"El método debe ser void (no devolver valor)",[543,49976,49978],{"className":545,"code":49977,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()  \u002F\u002F ✓ Correcto\n\n[Start]\npublic string Ejecutar()  \u002F\u002F ✗ Incorrecto\n",[54,49979,49980,49984,49989,49993,49997],{"__ignoreMap":228},[551,49981,49982],{"class":553,"line":554},[551,49983,1310],{},[551,49985,49986],{"class":553,"line":229},[551,49987,49988],{},"public void Ejecutar()  \u002F\u002F ✓ Correcto\n",[551,49990,49991],{"class":553,"line":670},[551,49992,1139],{"emptyLinePlaceholder":238},[551,49994,49995],{"class":553,"line":1136},[551,49996,1310],{},[551,49998,49999],{"class":553,"line":1142},[551,50000,50001],{},"public string Ejecutar()  \u002F\u002F ✗ Incorrecto\n",[88,50003,50004,50007,50008],{},[16,50005,50006],{},"El método no debe tener parámetros"," (en su forma básica)",[543,50009,50011],{"className":545,"code":50010,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()  \u002F\u002F ✓ Correcto\n\n[Start]\npublic void Ejecutar(string param)  \u002F\u002F ✗ Incorrecto\n",[54,50012,50013,50017,50021,50025,50029],{"__ignoreMap":228},[551,50014,50015],{"class":553,"line":554},[551,50016,1310],{},[551,50018,50019],{"class":553,"line":229},[551,50020,49988],{},[551,50022,50023],{"class":553,"line":670},[551,50024,1139],{"emptyLinePlaceholder":238},[551,50026,50027],{"class":553,"line":1136},[551,50028,1310],{},[551,50030,50031],{"class":553,"line":1142},[551,50032,50033],{},"public void Ejecutar(string param)  \u002F\u002F ✗ Incorrecto\n",[88,50035,50036],{},[16,50037,50038,50039,50041],{},"Solo puede haber un método ",[551,50040,1300],{}," por script",[88,50043,50044],{},[16,50045,50046],{},"Debe estar dentro de una clase pública",[331,50048,50050,50051,36151],{"id":50049},"_24-qué-pasa-si-no-pongo-start","2.4 ¿Qué pasa si no pongo ",[551,50052,1300],{},[13,50054,50055,50056,50058],{},"Si tu script no tiene ningún método marcado con ",[54,50057,1644],{},", EPLAN mostrará un error al intentar ejecutarlo:",[543,50060,50063],{"className":50061,"code":50062,"language":847},[845],"No se encontró un punto de entrada en el script.\n",[54,50064,50062],{"__ignoreMap":228},[13,50066,49892,50067,9848,50069,50072],{},[54,50068,1644],{},[16,50070,50071],{},"obligatorio"," para scripts ejecutables.",[43,50074],{},[46,50076,50078,50079],{"id":50077},"_3-tu-primer-script-con-start","3. Tu primer script con ",[551,50080,1300],{},[331,50082,50084],{"id":50083},"_31-el-script-más-simple-posible","3.1 El script más simple posible",[13,50086,50087],{},"Veamos el script más básico que puedes escribir en EPLAN:",[13,50089,50090,73,50093],{},[16,50091,50092],{},"Archivo:",[54,50094,50095],{},"01_HolaMundo.cs",[543,50097,50099],{"className":545,"code":50098,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\nnamespace MisPrimerosScripts\n{\n    public class HolaMundo\n    {\n        [Start]\n        public void Ejecutar()\n        {\n            MessageBox.Show(\"Scripting is great!\");\n        }\n    }\n}\n",[54,50100,50101,50106,50110,50114,50119,50123,50128,50132,50137,50142,50146,50151,50155,50159],{"__ignoreMap":228},[551,50102,50103],{"class":553,"line":554},[551,50104,50105],{},"using System.Windows.Forms;\n",[551,50107,50108],{"class":553,"line":229},[551,50109,49898],{},[551,50111,50112],{"class":553,"line":670},[551,50113,1139],{"emptyLinePlaceholder":238},[551,50115,50116],{"class":553,"line":1136},[551,50117,50118],{},"namespace MisPrimerosScripts\n",[551,50120,50121],{"class":553,"line":1142},[551,50122,1151],{},[551,50124,50125],{"class":553,"line":1148},[551,50126,50127],{},"    public class HolaMundo\n",[551,50129,50130],{"class":553,"line":1154},[551,50131,1169],{},[551,50133,50134],{"class":553,"line":1160},[551,50135,50136],{},"        [Start]\n",[551,50138,50139],{"class":553,"line":1166},[551,50140,50141],{},"        public void Ejecutar()\n",[551,50143,50144],{"class":553,"line":1172},[551,50145,9062],{},[551,50147,50148],{"class":553,"line":1178},[551,50149,50150],{},"            MessageBox.Show(\"Scripting is great!\");\n",[551,50152,50153],{"class":553,"line":1184},[551,50154,9077],{},[551,50156,50157],{"class":553,"line":1190},[551,50158,1187],{},[551,50160,50161],{"class":553,"line":1472},[551,50162,1193],{},[331,50164,50166],{"id":50165},"_32-análisis-línea-por-línea","3.2 Análisis línea por línea",[13,50168,50169],{},"Analicemos cada parte del script:",[13,50171,50172],{},[16,50173,50174],{},"Línea 1-2: Namespaces necesarios",[543,50176,50178],{"className":545,"code":50177,"language":547,"meta":228,"style":228},"using System.Windows.Forms;      \u002F\u002F Para MessageBox\nusing Eplan.EplApi.Scripting;    \u002F\u002F Para el atributo [Start]\n",[54,50179,50180,50185],{"__ignoreMap":228},[551,50181,50182],{"class":553,"line":554},[551,50183,50184],{},"using System.Windows.Forms;      \u002F\u002F Para MessageBox\n",[551,50186,50187],{"class":553,"line":229},[551,50188,50189],{},"using Eplan.EplApi.Scripting;    \u002F\u002F Para el atributo [Start]\n",[126,50191,50192,50201],{},[88,50193,50194,50197,50198,50200],{},[54,50195,50196],{},"System.Windows.Forms"," - Proporciona ",[54,50199,1683],{}," para mostrar ventanas de diálogo",[88,50202,50203,50206,50207],{},[54,50204,50205],{},"Eplan.EplApi.Scripting"," - Proporciona el atributo ",[54,50208,1644],{},[13,50210,50211],{},[16,50212,50213],{},"Línea 4: Namespace (opcional pero recomendado)",[543,50215,50216],{"className":545,"code":50118,"language":547,"meta":228,"style":228},[54,50217,50218],{"__ignoreMap":228},[551,50219,50220],{"class":553,"line":554},[551,50221,50118],{},[13,50223,50224],{},"Organiza tu código. No es obligatorio, pero es buena práctica.",[13,50226,50227],{},[16,50228,50229],{},"Línea 6: Clase pública",[543,50231,50233],{"className":545,"code":50232,"language":547,"meta":228,"style":228},"public class HolaMundo\n",[54,50234,50235],{"__ignoreMap":228},[551,50236,50237],{"class":553,"line":554},[551,50238,50232],{},[13,50240,50241,50242,50244],{},"Toda clase que contenga ",[54,50243,1644],{}," debe ser pública.",[13,50246,50247],{},[16,50248,50249,50250],{},"Línea 8-9: Método con ",[551,50251,1300],{},[543,50253,50255],{"className":545,"code":50254,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()\n",[54,50256,50257,50261],{"__ignoreMap":228},[551,50258,50259],{"class":553,"line":554},[551,50260,1310],{},[551,50262,50263],{"class":553,"line":229},[551,50264,1315],{},[126,50266,50267,50272,50277,50282],{},[88,50268,50269,50271],{},[54,50270,1644],{}," - Marca este método como punto de entrada",[88,50273,50274,50276],{},[54,50275,42334],{}," - Debe ser público para que EPLAN pueda acceder",[88,50278,50279,50281],{},[54,50280,30120],{}," - No devuelve ningún valor",[88,50283,50284,50287],{},[54,50285,50286],{},"Ejecutar()"," - El nombre puede ser cualquiera (Ejecutar, Function, Main, Run, etc.)",[13,50289,50290],{},[16,50291,50292],{},"Línea 11: Código funcional",[543,50294,50296],{"className":545,"code":50295,"language":547,"meta":228,"style":228},"MessageBox.Show(\"Scripting is great!\");\n",[54,50297,50298],{"__ignoreMap":228},[551,50299,50300],{"class":553,"line":554},[551,50301,50295],{},[13,50303,50304],{},"Muestra una ventana emergente con el mensaje.",[331,50306,50308],{"id":50307},"_33-por-qué-usar-messagebox-en-vez-de-consolewriteline","3.3 ¿Por qué usar MessageBox en vez de Console.WriteLine?",[13,50310,50311,50314,50315,50318,50319,50321],{},[16,50312,50313],{},"Pregunta común:"," \"En C# básico usábamos ",[54,50316,50317],{},"Console.WriteLine()",", ¿por qué ahora usamos ",[54,50320,1683],{},"?\"",[13,50323,50324],{},[16,50325,50326],{},"Respuesta:",[13,50328,50329,50330,50333],{},"EPLAN Electric P8 es una ",[16,50331,50332],{},"aplicación Windows con GUI"," (interfaz gráfica), NO una aplicación de consola.",[126,50335,50336,50341],{},[88,50337,50338,50340],{},[54,50339,50317],{}," - Escribe en la consola de comandos (EPLAN no tiene consola visible)",[88,50342,50343,50345,50346,50349],{},[54,50344,1683],{}," - Muestra una ventana de diálogo ",[16,50347,50348],{},"visible"," en pantalla",[13,50351,50352,50353,50355],{},"Si usas ",[54,50354,50317],{}," en un script de EPLAN, el texto se imprimirá... ¡pero no lo verás en ningún lado!",[331,50357,50359],{"id":50358},"_34-ejecutar-el-script","3.4 Ejecutar el script",[13,50361,50362],{},[16,50363,50364],{},"Pasos:",[85,50366,50367,50370,50375,50380,50386],{},[88,50368,50369],{},"Abre EPLAN Electric P8",[88,50371,50372,50373],{},"Ve a: ",[16,50374,1521],{},[88,50376,50377,50378],{},"Navega a la ubicación de ",[54,50379,50095],{},[88,50381,50382,50383],{},"Selecciona el archivo y haz clic en ",[16,50384,50385],{},"Abrir",[88,50387,50388],{},"Verás una ventana emergente con el mensaje \"Scripting is great!\"",[43,50390],{},[46,50392,50394],{"id":50393},"_4-variaciones-del-script-básico","4. Variaciones del script básico",[331,50396,50398],{"id":50397},"_41-cambiar-el-nombre-del-método","4.1 Cambiar el nombre del método",[13,50400,50401,50402,50404],{},"El nombre del método con ",[54,50403,1644],{}," puede ser cualquiera:",[543,50406,50408],{"className":545,"code":50407,"language":547,"meta":228,"style":228},"[Start]\npublic void Function()  \u002F\u002F ✓ Funciona\n{\n    MessageBox.Show(\"Hola\");\n}\n\n[Start]\npublic void Main()  \u002F\u002F ✓ Funciona\n{\n    MessageBox.Show(\"Hola\");\n}\n\n[Start]\npublic void Run()  \u002F\u002F ✓ Funciona\n{\n    MessageBox.Show(\"Hola\");\n}\n",[54,50409,50410,50414,50419,50423,50428,50432,50436,50440,50445,50449,50453,50457,50461,50465,50470,50474,50478],{"__ignoreMap":228},[551,50411,50412],{"class":553,"line":554},[551,50413,1310],{},[551,50415,50416],{"class":553,"line":229},[551,50417,50418],{},"public void Function()  \u002F\u002F ✓ Funciona\n",[551,50420,50421],{"class":553,"line":670},[551,50422,1151],{},[551,50424,50425],{"class":553,"line":1136},[551,50426,50427],{},"    MessageBox.Show(\"Hola\");\n",[551,50429,50430],{"class":553,"line":1142},[551,50431,1193],{},[551,50433,50434],{"class":553,"line":1148},[551,50435,1139],{"emptyLinePlaceholder":238},[551,50437,50438],{"class":553,"line":1154},[551,50439,1310],{},[551,50441,50442],{"class":553,"line":1160},[551,50443,50444],{},"public void Main()  \u002F\u002F ✓ Funciona\n",[551,50446,50447],{"class":553,"line":1166},[551,50448,1151],{},[551,50450,50451],{"class":553,"line":1172},[551,50452,50427],{},[551,50454,50455],{"class":553,"line":1178},[551,50456,1193],{},[551,50458,50459],{"class":553,"line":1184},[551,50460,1139],{"emptyLinePlaceholder":238},[551,50462,50463],{"class":553,"line":1190},[551,50464,1310],{},[551,50466,50467],{"class":553,"line":1472},[551,50468,50469],{},"public void Run()  \u002F\u002F ✓ Funciona\n",[551,50471,50472],{"class":553,"line":1477},[551,50473,1151],{},[551,50475,50476],{"class":553,"line":1797},[551,50477,50427],{},[551,50479,50480],{"class":553,"line":1802},[551,50481,1193],{},[13,50483,50484,50487,50488,4000,50490,4000,50493,50496,50497,41],{},[16,50485,50486],{},"Recomendación:"," Usa nombres descriptivos como ",[54,50489,50286],{},[54,50491,50492],{},"Run()",[54,50494,50495],{},"Function()",", o ",[54,50498,50499],{},"Start()",[331,50501,50503],{"id":50502},"_42-simplificar-el-namespace","4.2 Simplificar el namespace",[13,50505,50506,50507,50510],{},"El namespace es ",[16,50508,50509],{},"opcional",". Puedes escribir:",[543,50512,50514],{"className":545,"code":50513,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class HolaMundo\n{\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Scripting is great!\");\n    }\n}\n",[54,50515,50516,50520,50524,50528,50532,50536,50540,50544,50548,50553,50557],{"__ignoreMap":228},[551,50517,50518],{"class":553,"line":554},[551,50519,50105],{},[551,50521,50522],{"class":553,"line":229},[551,50523,49898],{},[551,50525,50526],{"class":553,"line":670},[551,50527,1139],{"emptyLinePlaceholder":238},[551,50529,50530],{"class":553,"line":1136},[551,50531,50232],{},[551,50533,50534],{"class":553,"line":1142},[551,50535,1151],{},[551,50537,50538],{"class":553,"line":1148},[551,50539,1157],{},[551,50541,50542],{"class":553,"line":1154},[551,50543,1163],{},[551,50545,50546],{"class":553,"line":1160},[551,50547,1169],{},[551,50549,50550],{"class":553,"line":1166},[551,50551,50552],{},"        MessageBox.Show(\"Scripting is great!\");\n",[551,50554,50555],{"class":553,"line":1172},[551,50556,1187],{},[551,50558,50559],{"class":553,"line":1178},[551,50560,1193],{},[13,50562,50563],{},"Funciona igual, pero es menos organizado.",[331,50565,50567],{"id":50566},"_43-código-con-comentarios","4.3 Código con comentarios",[543,50569,50571],{"className":545,"code":50570,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class HolaMundo\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Mostrar mensaje simple al usuario\n        MessageBox.Show(\"Scripting is great!\");\n\n        \u002F\u002F El método termina aquí\n        return;\n    }\n}\n",[54,50572,50573,50577,50581,50585,50589,50593,50597,50601,50605,50610,50614,50618,50623,50627,50631],{"__ignoreMap":228},[551,50574,50575],{"class":553,"line":554},[551,50576,50105],{},[551,50578,50579],{"class":553,"line":229},[551,50580,49898],{},[551,50582,50583],{"class":553,"line":670},[551,50584,1139],{"emptyLinePlaceholder":238},[551,50586,50587],{"class":553,"line":1136},[551,50588,50232],{},[551,50590,50591],{"class":553,"line":1142},[551,50592,1151],{},[551,50594,50595],{"class":553,"line":1148},[551,50596,1157],{},[551,50598,50599],{"class":553,"line":1154},[551,50600,1163],{},[551,50602,50603],{"class":553,"line":1160},[551,50604,1169],{},[551,50606,50607],{"class":553,"line":1166},[551,50608,50609],{},"        \u002F\u002F Mostrar mensaje simple al usuario\n",[551,50611,50612],{"class":553,"line":1172},[551,50613,50552],{},[551,50615,50616],{"class":553,"line":1178},[551,50617,1139],{"emptyLinePlaceholder":238},[551,50619,50620],{"class":553,"line":1184},[551,50621,50622],{},"        \u002F\u002F El método termina aquí\n",[551,50624,50625],{"class":553,"line":1190},[551,50626,45390],{},[551,50628,50629],{"class":553,"line":1472},[551,50630,1187],{},[551,50632,50633],{"class":553,"line":1477},[551,50634,1193],{},[13,50636,30790,50637,50640,50641,50643,50644,50646],{},[54,50638,50639],{},"return;"," al final es ",[16,50642,50509],{}," en métodos ",[54,50645,30120],{},", pero puede ayudar a la claridad.",[43,50648],{},[46,50650,50652],{"id":50651},"_5-messagebox-vs-baseexception","5. MessageBox vs BaseException",[331,50654,50656],{"id":50655},"_51-dos-formas-de-mostrar-mensajes-en-eplan","5.1 Dos formas de mostrar mensajes en EPLAN",[13,50658,50659,50660,50663],{},"Existen ",[16,50661,50662],{},"dos formas principales"," de mostrar información al usuario en scripts EPLAN:",[85,50665,50666,50671],{},[88,50667,50668,50670],{},[16,50669,1683],{}," - Ventana emergente (System.Windows.Forms)",[88,50672,50673,50676],{},[16,50674,50675],{},"BaseException"," - Mensajes en la ventana \"Mensajes de sistema\" de EPLAN (Eplan.EplApi.Base)",[331,50678,50680],{"id":50679},"_52-messageboxshow","5.2 MessageBox.Show()",[13,50682,50683,73,50686],{},[16,50684,50685],{},"Namespace:",[54,50687,50196],{},[13,50689,50690],{},[16,50691,50692],{},"Características:",[126,50694,50695,50702,50711,50714],{},[88,50696,50697,50698,50701],{},"Muestra una ",[16,50699,50700],{},"ventana emergente"," que bloquea EPLAN hasta que el usuario la cierre",[88,50703,50704,50705,50707,50708],{},"Muy ",[16,50706,50348],{}," e ",[16,50709,50710],{},"intrusivo",[88,50712,50713],{},"Ideal para mensajes importantes que requieren atención inmediata",[88,50715,50716],{},"Puede tener botones (OK, Yes\u002FNo, etc.)",[13,50718,50719],{},[16,50720,50721],{},"Ejemplo:",[543,50723,50725],{"className":545,"code":50724,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class EjemploMessageBox\n{\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Este es un mensaje importante\",\n                       \"Título\",\n                       MessageBoxButtons.OK,\n                       MessageBoxIcon.Information);\n    }\n}\n",[54,50726,50727,50731,50735,50739,50744,50748,50752,50756,50760,50765,50770,50774,50778,50782],{"__ignoreMap":228},[551,50728,50729],{"class":553,"line":554},[551,50730,50105],{},[551,50732,50733],{"class":553,"line":229},[551,50734,49898],{},[551,50736,50737],{"class":553,"line":670},[551,50738,1139],{"emptyLinePlaceholder":238},[551,50740,50741],{"class":553,"line":1136},[551,50742,50743],{},"public class EjemploMessageBox\n",[551,50745,50746],{"class":553,"line":1142},[551,50747,1151],{},[551,50749,50750],{"class":553,"line":1148},[551,50751,1157],{},[551,50753,50754],{"class":553,"line":1154},[551,50755,1163],{},[551,50757,50758],{"class":553,"line":1160},[551,50759,1169],{},[551,50761,50762],{"class":553,"line":1166},[551,50763,50764],{},"        MessageBox.Show(\"Este es un mensaje importante\",\n",[551,50766,50767],{"class":553,"line":1172},[551,50768,50769],{},"                       \"Título\",\n",[551,50771,50772],{"class":553,"line":1178},[551,50773,1464],{},[551,50775,50776],{"class":553,"line":1184},[551,50777,1469],{},[551,50779,50780],{"class":553,"line":1190},[551,50781,1187],{},[551,50783,50784],{"class":553,"line":1472},[551,50785,1193],{},[13,50787,50788],{},[16,50789,50790],{},"Cuándo usar:",[126,50792,50793,50796,50799,50802],{},[88,50794,50795],{},"Confirmaciones (¿Desea continuar?)",[88,50797,50798],{},"Advertencias críticas",[88,50800,50801],{},"Errores que requieren atención inmediata",[88,50803,50804],{},"Información que el usuario DEBE ver",[331,50806,50808],{"id":50807},"_53-baseexception","5.3 BaseException",[13,50810,50811,73,50813],{},[16,50812,50685],{},[54,50814,1248],{},[13,50816,50817],{},[16,50818,50692],{},[126,50820,50821,50824,50830,50833,50836],{},[88,50822,50823],{},"Muestra mensajes en la ventana \"Mensajes de sistema\" de EPLAN",[88,50825,50826,50829],{},[16,50827,50828],{},"No bloquea"," la interfaz",[88,50831,50832],{},"Menos intrusivo",[88,50834,50835],{},"El usuario puede revisar los mensajes después",[88,50837,50838],{},"Tiene niveles: Message, Warning, Error",[13,50840,50841],{},[16,50842,50721],{},[543,50844,50846],{"className":545,"code":50845,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class EjemploBaseException\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Mensaje informativo\n        new BaseException(\"Proceso completado correctamente\",\n                         MessageLevel.Message).FixMessage();\n\n        \u002F\u002F Advertencia\n        new BaseException(\"Atención: Revisa la configuración\",\n                         MessageLevel.Warning).FixMessage();\n\n        \u002F\u002F Error\n        new BaseException(\"Error al procesar archivo\",\n                         MessageLevel.Error).FixMessage();\n    }\n}\n",[54,50847,50848,50852,50856,50860,50865,50869,50873,50877,50881,50886,50891,50896,50900,50905,50910,50915,50919,50924,50929,50934,50938],{"__ignoreMap":228},[551,50849,50850],{"class":553,"line":554},[551,50851,1128],{},[551,50853,50854],{"class":553,"line":229},[551,50855,49898],{},[551,50857,50858],{"class":553,"line":670},[551,50859,1139],{"emptyLinePlaceholder":238},[551,50861,50862],{"class":553,"line":1136},[551,50863,50864],{},"public class EjemploBaseException\n",[551,50866,50867],{"class":553,"line":1142},[551,50868,1151],{},[551,50870,50871],{"class":553,"line":1148},[551,50872,1157],{},[551,50874,50875],{"class":553,"line":1154},[551,50876,1163],{},[551,50878,50879],{"class":553,"line":1160},[551,50880,1169],{},[551,50882,50883],{"class":553,"line":1166},[551,50884,50885],{},"        \u002F\u002F Mensaje informativo\n",[551,50887,50888],{"class":553,"line":1172},[551,50889,50890],{},"        new BaseException(\"Proceso completado correctamente\",\n",[551,50892,50893],{"class":553,"line":1178},[551,50894,50895],{},"                         MessageLevel.Message).FixMessage();\n",[551,50897,50898],{"class":553,"line":1184},[551,50899,1139],{"emptyLinePlaceholder":238},[551,50901,50902],{"class":553,"line":1190},[551,50903,50904],{},"        \u002F\u002F Advertencia\n",[551,50906,50907],{"class":553,"line":1472},[551,50908,50909],{},"        new BaseException(\"Atención: Revisa la configuración\",\n",[551,50911,50912],{"class":553,"line":1477},[551,50913,50914],{},"                         MessageLevel.Warning).FixMessage();\n",[551,50916,50917],{"class":553,"line":1797},[551,50918,1139],{"emptyLinePlaceholder":238},[551,50920,50921],{"class":553,"line":1802},[551,50922,50923],{},"        \u002F\u002F Error\n",[551,50925,50926],{"class":553,"line":1808},[551,50927,50928],{},"        new BaseException(\"Error al procesar archivo\",\n",[551,50930,50931],{"class":553,"line":1814},[551,50932,50933],{},"                         MessageLevel.Error).FixMessage();\n",[551,50935,50936],{"class":553,"line":1820},[551,50937,1187],{},[551,50939,50940],{"class":553,"line":1826},[551,50941,1193],{},[13,50943,50944],{},[16,50945,50790],{},[126,50947,50948,50951,50954,50957],{},[88,50949,50950],{},"Logs de operaciones",[88,50952,50953],{},"Mensajes informativos que no requieren acción inmediata",[88,50955,50956],{},"Advertencias no críticas",[88,50958,50959],{},"Registro de progreso de operaciones largas",[13,50961,50962,50965],{},[16,50963,50964],{},"Importante:"," Para ver los mensajes de BaseException, debes abrir la ventana \"Mensajes de sistema\" en EPLAN (Ver > Mensajes de sistema).",[331,50967,50969],{"id":50968},"_54-cuál-usar","5.4 ¿Cuál usar?",[13,50971,50972],{},[16,50973,50974],{},"Regla general:",[126,50976,50977,50987],{},[88,50978,50979,50982,50983,50986],{},[16,50980,50981],{},"MessageBox",": Cuando necesitas la atención ",[16,50984,50985],{},"inmediata"," del usuario",[88,50988,50989,50991,50992,50995],{},[16,50990,50675],{},": Para ",[16,50993,50994],{},"registro y logging"," de operaciones",[13,50997,50998,50999,416],{},"Muchos scripts usan ",[16,51000,51001],{},"ambos",[126,51003,51004,51007],{},[88,51005,51006],{},"BaseException para logs detallados",[88,51008,51009],{},"MessageBox solo para confirmaciones o errores críticos",[43,51011],{},[46,51013,51015],{"id":51014},"_6-proyecto-del-capítulo-tres-variaciones-de-hola-mundo","6. Proyecto del capítulo: Tres variaciones de Hola Mundo",[331,51017,51019],{"id":51018},"_61-objetivo","6.1 Objetivo",[13,51021,51022,51023,416],{},"Crear tres scripts que demuestren diferentes formas de usar ",[54,51024,1644],{},[85,51026,51027,51033,51039],{},[88,51028,51029,51032],{},[16,51030,51031],{},"HolaMundo_MessageBox.cs"," - Usando MessageBox básico",[88,51034,51035,51038],{},[16,51036,51037],{},"HolaMundo_MessageBoxAvanzado.cs"," - MessageBox con opciones",[88,51040,51041,51044],{},[16,51042,51043],{},"HolaMundo_BaseException.cs"," - Usando BaseException",[331,51046,51048],{"id":51047},"_62-script-1-messagebox-básico","6.2 Script 1: MessageBox básico",[13,51050,51051,73,51053],{},[16,51052,50092],{},[54,51054,51055],{},"01_HolaMundo_MessageBox.cs",[543,51057,51059],{"className":545,"code":51058,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class HolaMundo_MessageBox\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Mensaje más simple posible\n        MessageBox.Show(\"¡Hola desde EPLAN API!\");\n    }\n}\n",[54,51060,51061,51065,51069,51073,51078,51082,51086,51090,51094,51099,51104,51108],{"__ignoreMap":228},[551,51062,51063],{"class":553,"line":554},[551,51064,50105],{},[551,51066,51067],{"class":553,"line":229},[551,51068,49898],{},[551,51070,51071],{"class":553,"line":670},[551,51072,1139],{"emptyLinePlaceholder":238},[551,51074,51075],{"class":553,"line":1136},[551,51076,51077],{},"public class HolaMundo_MessageBox\n",[551,51079,51080],{"class":553,"line":1142},[551,51081,1151],{},[551,51083,51084],{"class":553,"line":1148},[551,51085,1157],{},[551,51087,51088],{"class":553,"line":1154},[551,51089,1163],{},[551,51091,51092],{"class":553,"line":1160},[551,51093,1169],{},[551,51095,51096],{"class":553,"line":1166},[551,51097,51098],{},"        \u002F\u002F Mensaje más simple posible\n",[551,51100,51101],{"class":553,"line":1172},[551,51102,51103],{},"        MessageBox.Show(\"¡Hola desde EPLAN API!\");\n",[551,51105,51106],{"class":553,"line":1178},[551,51107,1187],{},[551,51109,51110],{"class":553,"line":1184},[551,51111,1193],{},[13,51113,51114,51117],{},[16,51115,51116],{},"Qué hace:"," Muestra una ventana emergente con mensaje básico.",[331,51119,51121],{"id":51120},"_63-script-2-messagebox-avanzado","6.3 Script 2: MessageBox avanzado",[13,51123,51124,73,51126],{},[16,51125,50092],{},[54,51127,51128],{},"02_HolaMundo_MessageBoxAvanzado.cs",[543,51130,51132],{"className":545,"code":51131,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class HolaMundo_MessageBoxAvanzado\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F MessageBox con título, icono y botón personalizado\n        MessageBox.Show(\n            \"Este es tu primer script en EPLAN API.\\n\\n\" +\n            \"Has usado correctamente el atributo [Start] para \" +\n            \"marcar el punto de entrada del script.\",\n            \"Felicitaciones\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Information\n        );\n    }\n}\n",[54,51133,51134,51138,51142,51146,51151,51155,51159,51163,51167,51172,51176,51181,51186,51191,51196,51200,51204,51208,51212],{"__ignoreMap":228},[551,51135,51136],{"class":553,"line":554},[551,51137,50105],{},[551,51139,51140],{"class":553,"line":229},[551,51141,49898],{},[551,51143,51144],{"class":553,"line":670},[551,51145,1139],{"emptyLinePlaceholder":238},[551,51147,51148],{"class":553,"line":1136},[551,51149,51150],{},"public class HolaMundo_MessageBoxAvanzado\n",[551,51152,51153],{"class":553,"line":1142},[551,51154,1151],{},[551,51156,51157],{"class":553,"line":1148},[551,51158,1157],{},[551,51160,51161],{"class":553,"line":1154},[551,51162,1163],{},[551,51164,51165],{"class":553,"line":1160},[551,51166,1169],{},[551,51168,51169],{"class":553,"line":1166},[551,51170,51171],{},"        \u002F\u002F MessageBox con título, icono y botón personalizado\n",[551,51173,51174],{"class":553,"line":1172},[551,51175,4790],{},[551,51177,51178],{"class":553,"line":1178},[551,51179,51180],{},"            \"Este es tu primer script en EPLAN API.\\n\\n\" +\n",[551,51182,51183],{"class":553,"line":1184},[551,51184,51185],{},"            \"Has usado correctamente el atributo [Start] para \" +\n",[551,51187,51188],{"class":553,"line":1190},[551,51189,51190],{},"            \"marcar el punto de entrada del script.\",\n",[551,51192,51193],{"class":553,"line":1472},[551,51194,51195],{},"            \"Felicitaciones\",\n",[551,51197,51198],{"class":553,"line":1477},[551,51199,4808],{},[551,51201,51202],{"class":553,"line":1797},[551,51203,4814],{},[551,51205,51206],{"class":553,"line":1802},[551,51207,4758],{},[551,51209,51210],{"class":553,"line":1808},[551,51211,1187],{},[551,51213,51214],{"class":553,"line":1814},[551,51215,1193],{},[13,51217,51218,51220],{},[16,51219,51116],{}," Muestra mensaje con título, icono y formato multilínea.",[331,51222,51224],{"id":51223},"_64-script-3-baseexception","6.4 Script 3: BaseException",[13,51226,51227,73,51229],{},[16,51228,50092],{},[54,51230,51231],{},"03_HolaMundo_BaseException.cs",[543,51233,51235],{"className":545,"code":51234,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class HolaMundo_BaseException\n{\n    [Start]\n    public void Ejecutar()\n    {\n        \u002F\u002F Mensaje informativo en \"Mensajes de sistema\"\n        new BaseException(\n            \"Script ejecutado correctamente usando el atributo [Start]\",\n            MessageLevel.Message\n        ).FixMessage();\n    }\n}\n",[54,51236,51237,51241,51245,51249,51254,51258,51262,51266,51270,51275,51280,51285,51290,51295,51299],{"__ignoreMap":228},[551,51238,51239],{"class":553,"line":554},[551,51240,1128],{},[551,51242,51243],{"class":553,"line":229},[551,51244,49898],{},[551,51246,51247],{"class":553,"line":670},[551,51248,1139],{"emptyLinePlaceholder":238},[551,51250,51251],{"class":553,"line":1136},[551,51252,51253],{},"public class HolaMundo_BaseException\n",[551,51255,51256],{"class":553,"line":1142},[551,51257,1151],{},[551,51259,51260],{"class":553,"line":1148},[551,51261,1157],{},[551,51263,51264],{"class":553,"line":1154},[551,51265,1163],{},[551,51267,51268],{"class":553,"line":1160},[551,51269,1169],{},[551,51271,51272],{"class":553,"line":1166},[551,51273,51274],{},"        \u002F\u002F Mensaje informativo en \"Mensajes de sistema\"\n",[551,51276,51277],{"class":553,"line":1172},[551,51278,51279],{},"        new BaseException(\n",[551,51281,51282],{"class":553,"line":1178},[551,51283,51284],{},"            \"Script ejecutado correctamente usando el atributo [Start]\",\n",[551,51286,51287],{"class":553,"line":1184},[551,51288,51289],{},"            MessageLevel.Message\n",[551,51291,51292],{"class":553,"line":1190},[551,51293,51294],{},"        ).FixMessage();\n",[551,51296,51297],{"class":553,"line":1472},[551,51298,1187],{},[551,51300,51301],{"class":553,"line":1477},[551,51302,1193],{},[13,51304,51305,51307],{},[16,51306,51116],{}," Registra un mensaje en la ventana \"Mensajes de sistema\" de EPLAN.",[13,51309,51310,51313],{},[16,51311,51312],{},"Para verlo:"," Después de ejecutar el script, abre Ver > Mensajes de sistema en EPLAN.",[331,51315,51317],{"id":51316},"_65-prueba-los-tres-scripts","6.5 Prueba los tres scripts",[85,51319,51320,51323],{},[88,51321,51322],{},"Ejecuta cada script desde EPLAN",[88,51324,51325,51326],{},"Observa las diferencias:\n",[126,51327,51328,51331],{},[88,51329,51330],{},"Scripts 1 y 2: Ventana emergente que debes cerrar",[88,51332,51333],{},"Script 3: Nada visible hasta que abras \"Mensajes de sistema\"",[43,51335],{},[46,51337,51339],{"id":51338},"_7-errores-comunes","7. Errores comunes",[331,51341,51343],{"id":51342},"_71-olvidar-el-using-eplaneplapiscripting","7.1 Olvidar el using Eplan.EplApi.Scripting",[13,51345,51346],{},[16,51347,51348],{},"Error:",[543,51350,51352],{"className":545,"code":51351,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\n\npublic class MiScript\n{\n    [Start]  \u002F\u002F Error: No se reconoce 'Start'\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Hola\");\n    }\n}\n",[54,51353,51354,51358,51362,51367,51371,51376,51380,51384,51389,51393],{"__ignoreMap":228},[551,51355,51356],{"class":553,"line":554},[551,51357,50105],{},[551,51359,51360],{"class":553,"line":229},[551,51361,1139],{"emptyLinePlaceholder":238},[551,51363,51364],{"class":553,"line":670},[551,51365,51366],{},"public class MiScript\n",[551,51368,51369],{"class":553,"line":1136},[551,51370,1151],{},[551,51372,51373],{"class":553,"line":1142},[551,51374,51375],{},"    [Start]  \u002F\u002F Error: No se reconoce 'Start'\n",[551,51377,51378],{"class":553,"line":1148},[551,51379,1163],{},[551,51381,51382],{"class":553,"line":1154},[551,51383,1169],{},[551,51385,51386],{"class":553,"line":1160},[551,51387,51388],{},"        MessageBox.Show(\"Hola\");\n",[551,51390,51391],{"class":553,"line":1166},[551,51392,1187],{},[551,51394,51395],{"class":553,"line":1172},[551,51396,1193],{},[13,51398,51399],{},[16,51400,51401],{},"Solución:",[543,51403,51405],{"className":545,"code":51404,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;  \u002F\u002F Agregar este using\n\npublic class MiScript\n{\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Hola\");\n    }\n}\n",[54,51406,51407,51411,51416,51420,51424,51428,51432,51436,51440,51444,51448],{"__ignoreMap":228},[551,51408,51409],{"class":553,"line":554},[551,51410,50105],{},[551,51412,51413],{"class":553,"line":229},[551,51414,51415],{},"using Eplan.EplApi.Scripting;  \u002F\u002F Agregar este using\n",[551,51417,51418],{"class":553,"line":670},[551,51419,1139],{"emptyLinePlaceholder":238},[551,51421,51422],{"class":553,"line":1136},[551,51423,51366],{},[551,51425,51426],{"class":553,"line":1142},[551,51427,1151],{},[551,51429,51430],{"class":553,"line":1148},[551,51431,1157],{},[551,51433,51434],{"class":553,"line":1154},[551,51435,1163],{},[551,51437,51438],{"class":553,"line":1160},[551,51439,1169],{},[551,51441,51442],{"class":553,"line":1166},[551,51443,51388],{},[551,51445,51446],{"class":553,"line":1172},[551,51447,1187],{},[551,51449,51450],{"class":553,"line":1178},[551,51451,1193],{},[331,51453,51455],{"id":51454},"_72-método-privado","7.2 Método privado",[13,51457,51458],{},[16,51459,51348],{},[543,51461,51463],{"className":545,"code":51462,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class MiScript\n{\n    [Start]\n    private void Ejecutar()  \u002F\u002F ✗ Private no funciona\n    {\n        MessageBox.Show(\"Hola\");\n    }\n}\n",[54,51464,51465,51469,51473,51477,51481,51485,51489,51494,51498,51502,51506],{"__ignoreMap":228},[551,51466,51467],{"class":553,"line":554},[551,51468,50105],{},[551,51470,51471],{"class":553,"line":229},[551,51472,49898],{},[551,51474,51475],{"class":553,"line":670},[551,51476,1139],{"emptyLinePlaceholder":238},[551,51478,51479],{"class":553,"line":1136},[551,51480,51366],{},[551,51482,51483],{"class":553,"line":1142},[551,51484,1151],{},[551,51486,51487],{"class":553,"line":1148},[551,51488,1157],{},[551,51490,51491],{"class":553,"line":1154},[551,51492,51493],{},"    private void Ejecutar()  \u002F\u002F ✗ Private no funciona\n",[551,51495,51496],{"class":553,"line":1160},[551,51497,1169],{},[551,51499,51500],{"class":553,"line":1166},[551,51501,51388],{},[551,51503,51504],{"class":553,"line":1172},[551,51505,1187],{},[551,51507,51508],{"class":553,"line":1178},[551,51509,1193],{},[13,51511,51512],{},[16,51513,51401],{},[543,51515,51517],{"className":545,"code":51516,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()  \u002F\u002F ✓ Debe ser public\n{\n    MessageBox.Show(\"Hola\");\n}\n",[54,51518,51519,51523,51528,51532,51536],{"__ignoreMap":228},[551,51520,51521],{"class":553,"line":554},[551,51522,1310],{},[551,51524,51525],{"class":553,"line":229},[551,51526,51527],{},"public void Ejecutar()  \u002F\u002F ✓ Debe ser public\n",[551,51529,51530],{"class":553,"line":670},[551,51531,1151],{},[551,51533,51534],{"class":553,"line":1136},[551,51535,50427],{},[551,51537,51538],{"class":553,"line":1142},[551,51539,1193],{},[331,51541,51543],{"id":51542},"_73-método-que-devuelve-valor","7.3 Método que devuelve valor",[13,51545,51546],{},[16,51547,51348],{},[543,51549,51551],{"className":545,"code":51550,"language":547,"meta":228,"style":228},"[Start]\npublic string Ejecutar()  \u002F\u002F ✗ [Start] debe ser void\n{\n    return \"Hola\";\n}\n",[54,51552,51553,51557,51562,51566,51571],{"__ignoreMap":228},[551,51554,51555],{"class":553,"line":554},[551,51556,1310],{},[551,51558,51559],{"class":553,"line":229},[551,51560,51561],{},"public string Ejecutar()  \u002F\u002F ✗ [Start] debe ser void\n",[551,51563,51564],{"class":553,"line":670},[551,51565,1151],{},[551,51567,51568],{"class":553,"line":1136},[551,51569,51570],{},"    return \"Hola\";\n",[551,51572,51573],{"class":553,"line":1142},[551,51574,1193],{},[13,51576,51577],{},[16,51578,51401],{},[543,51580,51582],{"className":545,"code":51581,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()  \u002F\u002F ✓ Debe ser void\n{\n    MessageBox.Show(\"Hola\");\n}\n",[54,51583,51584,51588,51593,51597,51601],{"__ignoreMap":228},[551,51585,51586],{"class":553,"line":554},[551,51587,1310],{},[551,51589,51590],{"class":553,"line":229},[551,51591,51592],{},"public void Ejecutar()  \u002F\u002F ✓ Debe ser void\n",[551,51594,51595],{"class":553,"line":670},[551,51596,1151],{},[551,51598,51599],{"class":553,"line":1136},[551,51600,50427],{},[551,51602,51603],{"class":553,"line":1142},[551,51604,1193],{},[331,51606,51608],{"id":51607},"_74-método-con-parámetros","7.4 Método con parámetros",[13,51610,51611],{},[16,51612,51348],{},[543,51614,51616],{"className":545,"code":51615,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar(string mensaje)  \u002F\u002F ✗ No puede tener parámetros\n{\n    MessageBox.Show(mensaje);\n}\n",[54,51617,51618,51622,51627,51631,51636],{"__ignoreMap":228},[551,51619,51620],{"class":553,"line":554},[551,51621,1310],{},[551,51623,51624],{"class":553,"line":229},[551,51625,51626],{},"public void Ejecutar(string mensaje)  \u002F\u002F ✗ No puede tener parámetros\n",[551,51628,51629],{"class":553,"line":670},[551,51630,1151],{},[551,51632,51633],{"class":553,"line":1136},[551,51634,51635],{},"    MessageBox.Show(mensaje);\n",[551,51637,51638],{"class":553,"line":1142},[551,51639,1193],{},[13,51641,51642],{},[16,51643,51401],{},[543,51645,51647],{"className":545,"code":51646,"language":547,"meta":228,"style":228},"[Start]\npublic void Ejecutar()  \u002F\u002F ✓ Sin parámetros\n{\n    string mensaje = \"Hola\";  \u002F\u002F Definir dentro del método\n    MessageBox.Show(mensaje);\n}\n",[54,51648,51649,51653,51658,51662,51667,51671],{"__ignoreMap":228},[551,51650,51651],{"class":553,"line":554},[551,51652,1310],{},[551,51654,51655],{"class":553,"line":229},[551,51656,51657],{},"public void Ejecutar()  \u002F\u002F ✓ Sin parámetros\n",[551,51659,51660],{"class":553,"line":670},[551,51661,1151],{},[551,51663,51664],{"class":553,"line":1136},[551,51665,51666],{},"    string mensaje = \"Hola\";  \u002F\u002F Definir dentro del método\n",[551,51668,51669],{"class":553,"line":1142},[551,51670,51635],{},[551,51672,51673],{"class":553,"line":1148},[551,51674,1193],{},[43,51676],{},[46,51678,22685],{"id":22684},[13,51680,22688],{},[126,51682,51683,51690,51698,51706,51714,51723],{},[88,51684,51685,51686,51689],{},"Qué son los ",[16,51687,51688],{},"atributos"," en C# y para qué sirven",[88,51691,30790,51692,51697],{},[16,51693,51694,51695],{},"atributo ",[551,51696,1300],{}," marca el punto de entrada de un script EPLAN",[88,51699,51700,51701,21817,51704],{},"Cómo escribir el ",[16,51702,51703],{},"script más simple posible",[551,51705,1300],{},[88,51707,37190,51708,51713],{},[16,51709,51710,51711],{},"reglas del atributo ",[551,51712,1300],{},": método público, void, sin parámetros",[88,51715,51716,51717,51719,51720,51722],{},"La diferencia entre ",[16,51718,50981],{}," (ventana emergente) y ",[16,51721,50675],{}," (mensajes de sistema)",[88,51724,21963,51725,51728,51729],{},[16,51726,51727],{},"errores comunes"," al usar ",[551,51730,1300],{},[43,51732],{},[46,51734,5728],{"id":5727},[13,51736,51737],{},[16,51738,51739,51740,36151],{},"P: ¿Puedo tener varios métodos en la misma clase además de ",[551,51741,1300],{},[13,51743,51744,51745,51747],{},"R: Sí, puedes tener todos los métodos adicionales que necesites. Solo el método con ",[54,51746,1644],{}," se ejecutará automáticamente, pero puedes llamar a otros métodos desde él.",[13,51749,51750],{},[16,51751,51752],{},"P: ¿El nombre de la clase importa?",[13,51754,51755],{},"R: No. Puedes llamar a la clase como quieras. Solo debe ser pública.",[13,51757,51758],{},[16,51759,51760,51761,51763],{},"P: ¿Puedo tener múltiples clases con ",[551,51762,1300],{}," en el mismo archivo?",[13,51765,51766,51767,51769],{},"R: Técnicamente sí, pero solo se ejecutará el primer ",[54,51768,1644],{}," que encuentre EPLAN. No es recomendable. Usa un archivo .cs por script.",[13,51771,51772],{},[16,51773,51774],{},"P: ¿Qué pasa si mi script tiene un error de sintaxis?",[13,51776,51777],{},"R: EPLAN mostrará un error de compilación al intentar ejecutarlo. Revisa el mensaje de error para identificar el problema.",[43,51779],{},[46,51781,51782],{"id":36078},"Conexiones",[331,51784,51786],{"id":51785},"capítulo-anterior","Capítulo anterior",[13,51788,51789,51791],{},[16,51790,42247],{}," - Completaste los fundamentos de C#",[331,51793,51795],{"id":51794},"próximo-capítulo","Próximo capítulo",[13,51797,51798],{},[16,51799,51800,51801,49920],{},"Capítulo 13: ",[551,51802,51803],{},"DeclareAction",[13,51805,51806,51807,51810],{},"En el próximo capítulo aprenderás a crear ",[16,51808,51809],{},"acciones personalizadas"," que pueden ejecutarse desde el menú de EPLAN y asignarse a botones de la cinta de opciones.",[43,51812],{},[13,51814,51815,10676,51817,51819,51820,93,51822,51825,93,51828],{},[31,51816,657],{},[31,51818,10679],{},": 20-25 minutos\n",[31,51821,10683],{},[54,51823,51824],{},"code\u002Fcap-12\u002F",[31,51826,51827],{},"Script de referencia",[54,51829,51830],{},"EPLAN-Scripting-4.0\u002F01_FirstSteps\u002F01_Start.cs",[660,51832,662],{},{"title":228,"searchDepth":229,"depth":229,"links":51834},[51835,51836,51837,51838,51843,51854,51861,51866,51872,51879,51885,51886,51887],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":49676,"depth":229,"text":49677,"children":51839},[51840,51841,51842],{"id":49680,"depth":670,"text":49681},{"id":49732,"depth":670,"text":49733},{"id":49765,"depth":670,"text":49766},{"id":49845,"depth":229,"text":51844,"children":51845},"2. El atributo Start",[51846,51848,51850,51852],{"id":49851,"depth":670,"text":51847},"2.1 ¿Qué es Start?",{"id":49886,"depth":670,"text":51849},"2.2 ¿Dónde se define Start?",{"id":49939,"depth":670,"text":51851},"2.3 Reglas del atributo Start",{"id":50049,"depth":670,"text":51853},"2.4 ¿Qué pasa si no pongo Start?",{"id":50077,"depth":229,"text":51855,"children":51856},"3. Tu primer script con Start",[51857,51858,51859,51860],{"id":50083,"depth":670,"text":50084},{"id":50165,"depth":670,"text":50166},{"id":50307,"depth":670,"text":50308},{"id":50358,"depth":670,"text":50359},{"id":50393,"depth":229,"text":50394,"children":51862},[51863,51864,51865],{"id":50397,"depth":670,"text":50398},{"id":50502,"depth":670,"text":50503},{"id":50566,"depth":670,"text":50567},{"id":50651,"depth":229,"text":50652,"children":51867},[51868,51869,51870,51871],{"id":50655,"depth":670,"text":50656},{"id":50679,"depth":670,"text":50680},{"id":50807,"depth":670,"text":50808},{"id":50968,"depth":670,"text":50969},{"id":51014,"depth":229,"text":51015,"children":51873},[51874,51875,51876,51877,51878],{"id":51018,"depth":670,"text":51019},{"id":51047,"depth":670,"text":51048},{"id":51120,"depth":670,"text":51121},{"id":51223,"depth":670,"text":51224},{"id":51316,"depth":670,"text":51317},{"id":51338,"depth":229,"text":51339,"children":51880},[51881,51882,51883,51884],{"id":51342,"depth":670,"text":51343},{"id":51454,"depth":670,"text":51455},{"id":51542,"depth":670,"text":51543},{"id":51607,"depth":670,"text":51608},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":51888},[51889,51890],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Crea tu primer script EPLAN con el atributo [Start] en C#. Ejemplo completo y explicado para automatizar EPLAN Electric P8 gratis.",{},"\u002Fguia\u002Feplan-api\u002Fcap-12-atributo-start",{"title":49588,"description":51891},"guia\u002Feplan-api\u002Fcap-12-atributo-start","VFpUXqTiDoRHF70eBjUHZ4PcvSuZhnoX3zrsKdiGBY8",{"id":51898,"title":51899,"body":51900,"description":54598,"extension":236,"meta":54599,"navigation":238,"path":54600,"seo":54601,"stem":54602,"tagline":242,"__hash__":54603},"guia\u002Fguia\u002Feplan-api\u002Fcap-13-atributo-declareaction.md","Capítulo 13: Atributo [DeclareAction] en EPLAN",{"type":7,"value":51901,"toc":54541},[51902,51912,51914,51916,51918,51939,51941,51943,51945,51960,51962,51964,51973,51984,51987,52001,52006,52008,52014,52016,52027,52032,52044,52048,52074,52079,52102,52106,52111,52119,52121,52129,52231,52235,52242,52292,52302,52308,52359,52373,52375,52381,52385,52392,52444,52448,52458,52463,52502,52506,52511,52537,52542,52564,52569,52594,52596,52600,52604,52614,52619,52630,52634,52641,52772,52777,52791,52795,52800,52811,52816,52827,52829,52837,52841,52846,52851,52929,52933,52937,52959,52964,53128,53133,53146,53148,53152,53156,53162,53169,53173,53177,53210,53216,53220,53225,53233,53238,53246,53251,53259,53261,53265,53269,53275,53279,53285,53349,53355,53438,53442,53447,53458,53463,53471,53473,53477,53481,53484,53489,53515,53519,53526,54141,54145,54151,54158,54164,54172,54178,54186,54192,54200,54202,54206,54210,54214,54240,54244,54270,54274,54278,54333,54338,54345,54354,54366,54380,54382,54384,54386,54445,54447,54449,54459,54462,54467,54470,54475,54482,54487,54493,54495,54497,54499,54507,54509,54514,54520,54522,54539],[10,51903,51904],{},[13,51905,51906,19,51908,19,51910,262],{},[16,51907,49597],{},[16,51909,49600],{},[16,51911,25],{},[43,51913],{},[46,51915,268],{"id":267},[13,51917,702],{},[126,51919,51920,51927,51930,51933,51936],{},[88,51921,51922,51923,4842,51925],{},"Entender la diferencia entre ",[54,51924,1644],{},[54,51926,49919],{},[88,51928,51929],{},"Crear acciones personalizadas con nombres específicos",[88,51931,51932],{},"Llamar acciones desde otros scripts",[88,51934,51935],{},"Tener múltiples acciones en el mismo script",[88,51937,51938],{},"Asignar acciones a botones de la cinta de opciones de EPLAN",[43,51940],{},[46,51942,320],{"id":319},[13,51944,726],{},[126,51946,51947,51952,51954,51957],{},[88,51948,51949,51950,32897],{},"Haber completado el Capítulo 12 (atributo ",[551,51951,1300],{},[88,51953,49613],{},[88,51955,51956],{},"Saber ejecutar scripts en EPLAN",[88,51958,51959],{},"Conocer la estructura básica de un script",[43,51961],{},[46,51963,49653],{"id":49652},[13,51965,51966,51967,51969,51970,51972],{},"En el capítulo anterior aprendiste a usar ",[54,51968,1644],{}," para crear scripts que se ejecutan directamente. Pero ",[54,51971,1644],{}," tiene limitaciones:",[126,51974,51975,51978,51981],{},[88,51976,51977],{},"Solo puede haber uno por script",[88,51979,51980],{},"Se ejecuta automáticamente al abrir el archivo",[88,51982,51983],{},"No tiene un nombre específico que puedas llamar",[13,51985,51986],{},"¿Qué pasa si quieres:",[126,51988,51989,51992,51995,51998],{},[88,51990,51991],{},"Crear múltiples funciones ejecutables en el mismo script?",[88,51993,51994],{},"Asignar una función a un botón personalizado en la cinta de EPLAN?",[88,51996,51997],{},"Llamar una función desde otro script?",[88,51999,52000],{},"Dar un nombre descriptivo a tu acción?",[13,52002,52003,52004,41],{},"Para eso existe ",[54,52005,49919],{},[43,52007],{},[46,52009,52011,52012,36151],{"id":52010},"_1-qué-es-declareaction","1. ¿Qué es ",[551,52013,51803],{},[331,52015,49681],{"id":49680},[13,52017,52018,49859,52020,52022,52023,52026],{},[54,52019,49919],{},[16,52021,49862],{}," que convierte un método en una ",[16,52024,52025],{},"acción registrada"," en el sistema.",[13,52028,52029],{},[16,52030,52031],{},"Diferencia clave:",[126,52033,52034,52039],{},[88,52035,52036,52038],{},[54,52037,1644],{}," - Punto de entrada anónimo, se ejecuta al abrir el script",[88,52040,52041,52043],{},[54,52042,49919],{}," - Acción con nombre, se registra en EPLAN y puede llamarse",[331,52045,52047],{"id":52046},"_12-sintaxis-básica","1.2 Sintaxis básica",[543,52049,52051],{"className":545,"code":52050,"language":547,"meta":228,"style":228},"[DeclareAction(\"NombreDeLaAccion\")]\npublic void MiMetodo()\n{\n    \u002F\u002F código\n}\n",[54,52052,52053,52058,52062,52066,52070],{"__ignoreMap":228},[551,52054,52055],{"class":553,"line":554},[551,52056,52057],{},"[DeclareAction(\"NombreDeLaAccion\")]\n",[551,52059,52060],{"class":553,"line":229},[551,52061,49710],{},[551,52063,52064],{"class":553,"line":670},[551,52065,1151],{},[551,52067,52068],{"class":553,"line":1136},[551,52069,49396],{},[551,52071,52072],{"class":553,"line":1142},[551,52073,1193],{},[13,52075,52076],{},[16,52077,52078],{},"Componentes:",[126,52080,52081,52087,52093],{},[88,52082,52083,52086],{},[54,52084,52085],{},"[DeclareAction(\"...\")]"," - Atributo con parámetro (nombre de la acción)",[88,52088,52089,52092],{},[54,52090,52091],{},"\"NombreDeLaAccion\""," - String que identifica la acción",[88,52094,52095,52098,52099,52101],{},[54,52096,52097],{},"public void"," - Igual que ",[551,52100,1300],{},", debe ser público y void",[331,52103,52105],{"id":52104},"_13-dónde-se-define","1.3 ¿Dónde se define?",[13,52107,52108,52109,416],{},"El atributo está en el mismo namespace que ",[54,52110,1644],{},[543,52112,52113],{"className":545,"code":49898,"language":547,"meta":228,"style":228},[54,52114,52115],{"__ignoreMap":228},[551,52116,52117],{"class":553,"line":554},[551,52118,49898],{},[43,52120],{},[46,52122,52124,52125,4842,52127],{"id":52123},"_2-diferencias-entre-start-y-declareaction","2. Diferencias entre ",[551,52126,1300],{},[551,52128,51803],{},[6589,52130,52131,52145],{},[6592,52132,52133],{},[6595,52134,52135,52137,52141],{},[6598,52136,35277],{},[6598,52138,52139],{},[551,52140,1300],{},[6598,52142,52143],{},[551,52144,51803],{},[6611,52146,52147,52160,52172,52184,52197,52208,52219],{},[6595,52148,52149,52154,52157],{},[6616,52150,52151],{},[16,52152,52153],{},"Nombre",[6616,52155,52156],{},"Anónimo",[6616,52158,52159],{},"Con nombre específico",[6595,52161,52162,52167,52169],{},[6616,52163,52164],{},[16,52165,52166],{},"Cantidad por script",[6616,52168,11916],{},[6616,52170,52171],{},"Múltiples",[6595,52173,52174,52178,52181],{},[6616,52175,52176],{},[16,52177,110],{},[6616,52179,52180],{},"Automática al abrir script",[6616,52182,52183],{},"Debe llamarse explícitamente",[6595,52185,52186,52191,52194],{},[6616,52187,52188],{},[16,52189,52190],{},"Parámetro",[6616,52192,52193],{},"No acepta parámetros",[6616,52195,52196],{},"Requiere nombre de acción",[6595,52198,52199,52204,52206],{},[6616,52200,52201],{},[16,52202,52203],{},"Asignable a botón",[6616,52205,18787],{},[6616,52207,18790],{},[6595,52209,52210,52215,52217],{},[6616,52211,52212],{},[16,52213,52214],{},"Llamable desde CLI",[6616,52216,18787],{},[6616,52218,18790],{},[6595,52220,52221,52225,52228],{},[6616,52222,52223],{},[16,52224,6771],{},[6616,52226,52227],{},"Scripts standalone",[6616,52229,52230],{},"Acciones reutilizables",[331,52232,52234],{"id":52233},"_21-ejemplo-comparativo","2.1 Ejemplo comparativo",[13,52236,52237],{},[16,52238,52239,52240,416],{},"Con ",[551,52241,1300],{},[543,52243,52245],{"className":545,"code":52244,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class MiScript\n{\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Script ejecutado\");\n    }\n}\n",[54,52246,52247,52251,52255,52259,52263,52267,52271,52275,52279,52284,52288],{"__ignoreMap":228},[551,52248,52249],{"class":553,"line":554},[551,52250,50105],{},[551,52252,52253],{"class":553,"line":229},[551,52254,49898],{},[551,52256,52257],{"class":553,"line":670},[551,52258,1139],{"emptyLinePlaceholder":238},[551,52260,52261],{"class":553,"line":1136},[551,52262,51366],{},[551,52264,52265],{"class":553,"line":1142},[551,52266,1151],{},[551,52268,52269],{"class":553,"line":1148},[551,52270,1157],{},[551,52272,52273],{"class":553,"line":1154},[551,52274,1163],{},[551,52276,52277],{"class":553,"line":1160},[551,52278,1169],{},[551,52280,52281],{"class":553,"line":1166},[551,52282,52283],{},"        MessageBox.Show(\"Script ejecutado\");\n",[551,52285,52286],{"class":553,"line":1172},[551,52287,1187],{},[551,52289,52290],{"class":553,"line":1178},[551,52291,1193],{},[126,52293,52294,52296,52299],{},[88,52295,51980],{},[88,52297,52298],{},"No se puede llamar por nombre",[88,52300,52301],{},"No se puede asignar a botón",[13,52303,52304],{},[16,52305,52239,52306,416],{},[551,52307,51803],{},[543,52309,52311],{"className":545,"code":52310,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class MiScript\n{\n    [DeclareAction(\"MostrarMensaje\")]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Acción ejecutada\");\n    }\n}\n",[54,52312,52313,52317,52321,52325,52329,52333,52338,52342,52346,52351,52355],{"__ignoreMap":228},[551,52314,52315],{"class":553,"line":554},[551,52316,50105],{},[551,52318,52319],{"class":553,"line":229},[551,52320,49898],{},[551,52322,52323],{"class":553,"line":670},[551,52324,1139],{"emptyLinePlaceholder":238},[551,52326,52327],{"class":553,"line":1136},[551,52328,51366],{},[551,52330,52331],{"class":553,"line":1142},[551,52332,1151],{},[551,52334,52335],{"class":553,"line":1148},[551,52336,52337],{},"    [DeclareAction(\"MostrarMensaje\")]\n",[551,52339,52340],{"class":553,"line":1154},[551,52341,1163],{},[551,52343,52344],{"class":553,"line":1160},[551,52345,1169],{},[551,52347,52348],{"class":553,"line":1166},[551,52349,52350],{},"        MessageBox.Show(\"Acción ejecutada\");\n",[551,52352,52353],{"class":553,"line":1172},[551,52354,1187],{},[551,52356,52357],{"class":553,"line":1178},[551,52358,1193],{},[126,52360,52361,52364,52367,52370],{},[88,52362,52363],{},"No se ejecuta automáticamente",[88,52365,52366],{},"Se puede llamar usando el nombre \"MostrarMensaje\"",[88,52368,52369],{},"Se puede asignar a un botón de la cinta",[88,52371,52372],{},"Se puede ejecutar desde CommandLineInterpreter",[43,52374],{},[46,52376,52378,52379],{"id":52377},"_3-tu-primera-acción-con-declareaction","3. Tu primera acción con ",[551,52380,51803],{},[331,52382,52384],{"id":52383},"_31-script-simple-con-acción","3.1 Script simple con acción",[13,52386,52387,73,52389],{},[16,52388,50092],{},[54,52390,52391],{},"01_AccionSimple.cs",[543,52393,52395],{"className":545,"code":52394,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class AccionSimple\n{\n    [DeclareAction(\"MiPrimeraAccion\")]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Has ejecutado tu primera acción declarada!\");\n    }\n}\n",[54,52396,52397,52401,52405,52409,52414,52418,52423,52427,52431,52436,52440],{"__ignoreMap":228},[551,52398,52399],{"class":553,"line":554},[551,52400,50105],{},[551,52402,52403],{"class":553,"line":229},[551,52404,49898],{},[551,52406,52407],{"class":553,"line":670},[551,52408,1139],{"emptyLinePlaceholder":238},[551,52410,52411],{"class":553,"line":1136},[551,52412,52413],{},"public class AccionSimple\n",[551,52415,52416],{"class":553,"line":1142},[551,52417,1151],{},[551,52419,52420],{"class":553,"line":1148},[551,52421,52422],{},"    [DeclareAction(\"MiPrimeraAccion\")]\n",[551,52424,52425],{"class":553,"line":1154},[551,52426,1163],{},[551,52428,52429],{"class":553,"line":1160},[551,52430,1169],{},[551,52432,52433],{"class":553,"line":1166},[551,52434,52435],{},"        MessageBox.Show(\"Has ejecutado tu primera acción declarada!\");\n",[551,52437,52438],{"class":553,"line":1172},[551,52439,1187],{},[551,52441,52442],{"class":553,"line":1178},[551,52443,1193],{},[331,52445,52447],{"id":52446},"_32-cómo-ejecutar-esta-acción","3.2 ¿Cómo ejecutar esta acción?",[13,52449,52450,52451,52453,52454,52457],{},"A diferencia de ",[54,52452,1644],{},", esta acción ",[16,52455,52456],{},"no se ejecuta automáticamente"," al abrir el archivo.",[13,52459,52460],{},[16,52461,52462],{},"Formas de ejecutarla:",[85,52464,52465,52475,52481],{},[88,52466,52467,52470],{},[16,52468,52469],{},"Desde el menú Utilidades > Scripts > Ejecutar acción",[126,52471,52472],{},[88,52473,52474],{},"Buscar la acción por nombre: \"MiPrimeraAccion\"",[88,52476,52477,52480],{},[16,52478,52479],{},"Asignándola a un botón de la cinta"," (lo veremos más adelante)",[88,52482,52483,52486,52487],{},[16,52484,52485],{},"Desde otro script"," usando CommandLineInterpreter:",[543,52488,52490],{"className":545,"code":52489,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\ncli.Execute(\"MiPrimeraAccion\");\n",[54,52491,52492,52497],{"__ignoreMap":228},[551,52493,52494],{"class":553,"line":554},[551,52495,52496],{},"CommandLineInterpreter cli = new CommandLineInterpreter();\n",[551,52498,52499],{"class":553,"line":229},[551,52500,52501],{},"cli.Execute(\"MiPrimeraAccion\");\n",[331,52503,52505],{"id":52504},"_33-reglas-del-nombre-de-acción","3.3 Reglas del nombre de acción",[13,52507,52508],{},[16,52509,52510],{},"Convenciones importantes:",[85,52512,52513,52519,52525,52531],{},[88,52514,52515,52518],{},[16,52516,52517],{},"No usar espacios"," - \"MiAccion\" (bien), \"Mi Accion\" (evitar)",[88,52520,52521,52524],{},[16,52522,52523],{},"CamelCase o PascalCase"," - \"GuardarYGenerar\", \"exportarPDF\"",[88,52526,52527,52530],{},[16,52528,52529],{},"Nombres descriptivos"," - \"ExportarPDF\" mejor que \"Accion1\"",[88,52532,52533,52536],{},[16,52534,52535],{},"Únicos en el sistema"," - Si hay dos acciones con el mismo nombre, hay conflicto",[13,52538,52539],{},[16,52540,52541],{},"Buenos nombres:",[126,52543,52544,52549,52554,52559],{},[88,52545,52546],{},[54,52547,52548],{},"ExportarProyectoAPDF",[88,52550,52551],{},[54,52552,52553],{},"GenerarYSincronizar",[88,52555,52556],{},[54,52557,52558],{},"ValidarConexiones",[88,52560,52561],{},[54,52562,52563],{},"CrearInformeTecnico",[13,52565,52566],{},[16,52567,52568],{},"Malos nombres:",[126,52570,52571,52577,52582,52588],{},[88,52572,52573,52576],{},[54,52574,52575],{},"Action1"," - No descriptivo",[88,52578,52579,52581],{},[54,52580,1537],{}," - Demasiado genérico",[88,52583,52584,52587],{},[54,52585,52586],{},"Mi Accion"," - Tiene espacio",[88,52589,52590,52593],{},[54,52591,52592],{},"do_stuff"," - No sigue convenciones C#",[43,52595],{},[46,52597,52599],{"id":52598},"_4-múltiples-acciones-en-el-mismo-script","4. Múltiples acciones en el mismo script",[331,52601,52603],{"id":52602},"_41-por-qué-tener-múltiples-acciones","4.1 ¿Por qué tener múltiples acciones?",[13,52605,52606,52607,52609,52610,52613],{},"Una de las ventajas de ",[54,52608,49919],{}," es que ",[16,52611,52612],{},"puedes tener múltiples acciones"," en el mismo archivo .cs.",[13,52615,52616],{},[16,52617,52618],{},"Casos de uso:",[126,52620,52621,52624,52627],{},[88,52622,52623],{},"Agrupar acciones relacionadas (Guardar, Generar, Exportar)",[88,52625,52626],{},"Crear una \"suite\" de herramientas en un solo script",[88,52628,52629],{},"Organizar mejor el código",[331,52631,52633],{"id":52632},"_42-ejemplo-con-múltiples-acciones","4.2 Ejemplo con múltiples acciones",[13,52635,52636,73,52638],{},[16,52637,50092],{},[54,52639,52640],{},"02_MultipleAcciones.cs",[543,52642,52644],{"className":545,"code":52643,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.Base;\n\npublic class MultipleAcciones\n{\n    [DeclareAction(\"MostrarProyecto\")]\n    public void MostrarProyecto()\n    {\n        string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n        MessageBox.Show(\"Proyecto actual: \" + nombre);\n    }\n\n    [DeclareAction(\"MostrarRuta\")]\n    public void MostrarRuta()\n    {\n        string ruta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n        MessageBox.Show(\"Ruta del proyecto: \" + ruta);\n    }\n\n    [DeclareAction(\"MostrarTodo\")]\n    public void MostrarTodo()\n    {\n        \u002F\u002F Llamar a las otras acciones\n        MostrarProyecto();\n        MostrarRuta();\n    }\n}\n",[54,52645,52646,52650,52654,52658,52662,52667,52671,52676,52681,52685,52690,52695,52699,52703,52708,52713,52717,52722,52727,52731,52735,52740,52745,52749,52754,52759,52764,52768],{"__ignoreMap":228},[551,52647,52648],{"class":553,"line":554},[551,52649,50105],{},[551,52651,52652],{"class":553,"line":229},[551,52653,49898],{},[551,52655,52656],{"class":553,"line":670},[551,52657,1128],{},[551,52659,52660],{"class":553,"line":1136},[551,52661,1139],{"emptyLinePlaceholder":238},[551,52663,52664],{"class":553,"line":1142},[551,52665,52666],{},"public class MultipleAcciones\n",[551,52668,52669],{"class":553,"line":1148},[551,52670,1151],{},[551,52672,52673],{"class":553,"line":1154},[551,52674,52675],{},"    [DeclareAction(\"MostrarProyecto\")]\n",[551,52677,52678],{"class":553,"line":1160},[551,52679,52680],{},"    public void MostrarProyecto()\n",[551,52682,52683],{"class":553,"line":1166},[551,52684,1169],{},[551,52686,52687],{"class":553,"line":1172},[551,52688,52689],{},"        string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,52691,52692],{"class":553,"line":1178},[551,52693,52694],{},"        MessageBox.Show(\"Proyecto actual: \" + nombre);\n",[551,52696,52697],{"class":553,"line":1184},[551,52698,1187],{},[551,52700,52701],{"class":553,"line":1190},[551,52702,1139],{"emptyLinePlaceholder":238},[551,52704,52705],{"class":553,"line":1472},[551,52706,52707],{},"    [DeclareAction(\"MostrarRuta\")]\n",[551,52709,52710],{"class":553,"line":1477},[551,52711,52712],{},"    public void MostrarRuta()\n",[551,52714,52715],{"class":553,"line":1797},[551,52716,1169],{},[551,52718,52719],{"class":553,"line":1802},[551,52720,52721],{},"        string ruta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[551,52723,52724],{"class":553,"line":1808},[551,52725,52726],{},"        MessageBox.Show(\"Ruta del proyecto: \" + ruta);\n",[551,52728,52729],{"class":553,"line":1814},[551,52730,1187],{},[551,52732,52733],{"class":553,"line":1820},[551,52734,1139],{"emptyLinePlaceholder":238},[551,52736,52737],{"class":553,"line":1826},[551,52738,52739],{},"    [DeclareAction(\"MostrarTodo\")]\n",[551,52741,52742],{"class":553,"line":1832},[551,52743,52744],{},"    public void MostrarTodo()\n",[551,52746,52747],{"class":553,"line":1838},[551,52748,1169],{},[551,52750,52751],{"class":553,"line":1844},[551,52752,52753],{},"        \u002F\u002F Llamar a las otras acciones\n",[551,52755,52756],{"class":553,"line":1850},[551,52757,52758],{},"        MostrarProyecto();\n",[551,52760,52761],{"class":553,"line":1855},[551,52762,52763],{},"        MostrarRuta();\n",[551,52765,52766],{"class":553,"line":1861},[551,52767,1187],{},[551,52769,52770],{"class":553,"line":1867},[551,52771,1193],{},[13,52773,52774],{},[16,52775,52776],{},"Análisis:",[126,52778,52779,52782,52785,52788],{},[88,52780,52781],{},"Tres acciones declaradas: \"MostrarProyecto\", \"MostrarRuta\", \"MostrarTodo\"",[88,52783,52784],{},"Cada acción hace una tarea específica",[88,52786,52787],{},"La tercera acción llama a las otras dos (reutilización de código)",[88,52789,52790],{},"Todas están en el mismo archivo .cs",[331,52792,52794],{"id":52793},"_43-ventajas-de-este-enfoque","4.3 Ventajas de este enfoque",[13,52796,52797],{},[16,52798,52799],{},"Organización:",[126,52801,52802,52805,52808],{},[88,52803,52804],{},"Acciones relacionadas en el mismo lugar",[88,52806,52807],{},"Fácil de mantener",[88,52809,52810],{},"Código reutilizable entre acciones",[13,52812,52813],{},[16,52814,52815],{},"Eficiencia:",[126,52817,52818,52821,52824],{},[88,52819,52820],{},"Un solo archivo para cargar",[88,52822,52823],{},"Métodos privados compartidos entre acciones",[88,52825,52826],{},"Menos duplicación de código",[43,52828],{},[46,52830,52832,52833,4842,52835],{"id":52831},"_5-combinar-start-y-declareaction","5. Combinar ",[551,52834,1300],{},[551,52836,51803],{},[331,52838,52840],{"id":52839},"_51-se-pueden-usar-juntos","5.1 ¿Se pueden usar juntos?",[13,52842,52843,52845],{},[16,52844,18790],{},", puedes tener ambos en el mismo script.",[13,52847,52848],{},[16,52849,52850],{},"Ejemplo válido:",[543,52852,52854],{"className":545,"code":52853,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class MiScript\n{\n    [Start]\n    public void EjecutarAlAbrir()\n    {\n        MessageBox.Show(\"Este método se ejecuta al abrir el script\");\n    }\n\n    [DeclareAction(\"AccionPersonalizada\")]\n    public void MiAccion()\n    {\n        MessageBox.Show(\"Esta acción se ejecuta cuando se llama por nombre\");\n    }\n}\n",[54,52855,52856,52860,52864,52868,52872,52876,52880,52885,52889,52894,52898,52902,52907,52912,52916,52921,52925],{"__ignoreMap":228},[551,52857,52858],{"class":553,"line":554},[551,52859,50105],{},[551,52861,52862],{"class":553,"line":229},[551,52863,49898],{},[551,52865,52866],{"class":553,"line":670},[551,52867,1139],{"emptyLinePlaceholder":238},[551,52869,52870],{"class":553,"line":1136},[551,52871,51366],{},[551,52873,52874],{"class":553,"line":1142},[551,52875,1151],{},[551,52877,52878],{"class":553,"line":1148},[551,52879,1157],{},[551,52881,52882],{"class":553,"line":1154},[551,52883,52884],{},"    public void EjecutarAlAbrir()\n",[551,52886,52887],{"class":553,"line":1160},[551,52888,1169],{},[551,52890,52891],{"class":553,"line":1166},[551,52892,52893],{},"        MessageBox.Show(\"Este método se ejecuta al abrir el script\");\n",[551,52895,52896],{"class":553,"line":1172},[551,52897,1187],{},[551,52899,52900],{"class":553,"line":1178},[551,52901,1139],{"emptyLinePlaceholder":238},[551,52903,52904],{"class":553,"line":1184},[551,52905,52906],{},"    [DeclareAction(\"AccionPersonalizada\")]\n",[551,52908,52909],{"class":553,"line":1190},[551,52910,52911],{},"    public void MiAccion()\n",[551,52913,52914],{"class":553,"line":1472},[551,52915,1169],{},[551,52917,52918],{"class":553,"line":1477},[551,52919,52920],{},"        MessageBox.Show(\"Esta acción se ejecuta cuando se llama por nombre\");\n",[551,52922,52923],{"class":553,"line":1797},[551,52924,1187],{},[551,52926,52927],{"class":553,"line":1802},[551,52928,1193],{},[331,52930,52932],{"id":52931},"_52-cuándo-usar-esta-combinación","5.2 ¿Cuándo usar esta combinación?",[13,52934,52935],{},[16,52936,52618],{},[126,52938,52939,52944,52949,52954],{},[88,52940,52941,52943],{},[551,52942,1300],{}," para mostrar un menú o configuración inicial",[88,52945,52946,52948],{},[551,52947,51803],{}," para las acciones reales del menú",[88,52950,52951,52953],{},[551,52952,1300],{}," para registrar las acciones al cargar EPLAN",[88,52955,52956,52958],{},[551,52957,51803],{}," para las funciones ejecutables",[13,52960,52961],{},[16,52962,52963],{},"Ejemplo práctico:",[543,52965,52967],{"className":545,"code":52966,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.Base;\n\npublic class SuiteHerramientas\n{\n    [Start]\n    public void MostrarMenu()\n    {\n        MessageBox.Show(\n            \"Suite de herramientas cargada.\\n\\n\" +\n            \"Acciones disponibles:\\n\" +\n            \"- MostrarProyecto\\n\" +\n            \"- MostrarRuta\\n\" +\n            \"- MostrarPropiedades\",\n            \"Herramientas\"\n        );\n    }\n\n    [DeclareAction(\"MostrarProyecto\")]\n    public void MostrarProyecto()\n    {\n        \u002F\u002F implementación\n    }\n\n    [DeclareAction(\"MostrarRuta\")]\n    public void MostrarRuta()\n    {\n        \u002F\u002F implementación\n    }\n\n    [DeclareAction(\"MostrarPropiedades\")]\n    public void MostrarPropiedades()\n    {\n        \u002F\u002F implementación\n    }\n}\n",[54,52968,52969,52973,52977,52981,52985,52990,52994,52998,53003,53007,53011,53016,53021,53026,53031,53036,53041,53045,53049,53053,53057,53061,53065,53070,53074,53078,53082,53086,53090,53094,53098,53102,53107,53112,53116,53120,53124],{"__ignoreMap":228},[551,52970,52971],{"class":553,"line":554},[551,52972,50105],{},[551,52974,52975],{"class":553,"line":229},[551,52976,49898],{},[551,52978,52979],{"class":553,"line":670},[551,52980,1128],{},[551,52982,52983],{"class":553,"line":1136},[551,52984,1139],{"emptyLinePlaceholder":238},[551,52986,52987],{"class":553,"line":1142},[551,52988,52989],{},"public class SuiteHerramientas\n",[551,52991,52992],{"class":553,"line":1148},[551,52993,1151],{},[551,52995,52996],{"class":553,"line":1154},[551,52997,1157],{},[551,52999,53000],{"class":553,"line":1160},[551,53001,53002],{},"    public void MostrarMenu()\n",[551,53004,53005],{"class":553,"line":1166},[551,53006,1169],{},[551,53008,53009],{"class":553,"line":1172},[551,53010,4790],{},[551,53012,53013],{"class":553,"line":1178},[551,53014,53015],{},"            \"Suite de herramientas cargada.\\n\\n\" +\n",[551,53017,53018],{"class":553,"line":1184},[551,53019,53020],{},"            \"Acciones disponibles:\\n\" +\n",[551,53022,53023],{"class":553,"line":1190},[551,53024,53025],{},"            \"- MostrarProyecto\\n\" +\n",[551,53027,53028],{"class":553,"line":1472},[551,53029,53030],{},"            \"- MostrarRuta\\n\" +\n",[551,53032,53033],{"class":553,"line":1477},[551,53034,53035],{},"            \"- MostrarPropiedades\",\n",[551,53037,53038],{"class":553,"line":1797},[551,53039,53040],{},"            \"Herramientas\"\n",[551,53042,53043],{"class":553,"line":1802},[551,53044,4758],{},[551,53046,53047],{"class":553,"line":1808},[551,53048,1187],{},[551,53050,53051],{"class":553,"line":1814},[551,53052,1139],{"emptyLinePlaceholder":238},[551,53054,53055],{"class":553,"line":1820},[551,53056,52675],{},[551,53058,53059],{"class":553,"line":1826},[551,53060,52680],{},[551,53062,53063],{"class":553,"line":1832},[551,53064,1169],{},[551,53066,53067],{"class":553,"line":1838},[551,53068,53069],{},"        \u002F\u002F implementación\n",[551,53071,53072],{"class":553,"line":1844},[551,53073,1187],{},[551,53075,53076],{"class":553,"line":1850},[551,53077,1139],{"emptyLinePlaceholder":238},[551,53079,53080],{"class":553,"line":1855},[551,53081,52707],{},[551,53083,53084],{"class":553,"line":1861},[551,53085,52712],{},[551,53087,53088],{"class":553,"line":1867},[551,53089,1169],{},[551,53091,53092],{"class":553,"line":1873},[551,53093,53069],{},[551,53095,53096],{"class":553,"line":1878},[551,53097,1187],{},[551,53099,53100],{"class":553,"line":1883},[551,53101,1139],{"emptyLinePlaceholder":238},[551,53103,53104],{"class":553,"line":1888},[551,53105,53106],{},"    [DeclareAction(\"MostrarPropiedades\")]\n",[551,53108,53109],{"class":553,"line":4615},[551,53110,53111],{},"    public void MostrarPropiedades()\n",[551,53113,53114],{"class":553,"line":4620},[551,53115,1169],{},[551,53117,53118],{"class":553,"line":4626},[551,53119,53069],{},[551,53121,53122],{"class":553,"line":4631},[551,53123,1187],{},[551,53125,53126],{"class":553,"line":4636},[551,53127,1193],{},[13,53129,53130],{},[16,53131,53132],{},"Comportamiento:",[126,53134,53135,53140,53143],{},[88,53136,53137,53138,32897],{},"Al ejecutar el .cs directamente: Se muestra el menú (",[551,53139,1300],{},[88,53141,53142],{},"Al llamar \"MostrarProyecto\": Se ejecuta solo esa acción",[88,53144,53145],{},"Al llamar \"MostrarPropiedades\": Se ejecuta solo esa acción",[43,53147],{},[46,53149,53151],{"id":53150},"_6-asignar-acciones-a-la-cinta-de-opciones","6. Asignar acciones a la cinta de opciones",[331,53153,53155],{"id":53154},"_61-qué-es-la-cinta-de-opciones","6.1 ¿Qué es la cinta de opciones?",[13,53157,31129,53158,53161],{},[16,53159,53160],{},"cinta de opciones"," (Ribbon) es la barra de herramientas superior de EPLAN con pestañas (Inicio, Insertar, Datos, etc.).",[13,53163,53164,53165,53168],{},"Puedes ",[16,53166,53167],{},"agregar botones personalizados"," que ejecuten tus acciones declaradas.",[331,53170,53172],{"id":53171},"_62-cómo-asignar-una-acción-a-un-botón","6.2 Cómo asignar una acción a un botón",[13,53174,53175],{},[16,53176,50364],{},[85,53178,53179,53181,53184,53189,53196,53201,53204,53207],{},[88,53180,50369],{},[88,53182,53183],{},"Haz clic derecho en la cinta de opciones",[88,53185,1092,53186],{},[16,53187,53188],{},"Personalizar cinta de opciones",[88,53190,53191,53192,53195],{},"Haz clic en ",[16,53193,53194],{},"Nuevo grupo"," (dentro de una pestaña existente)",[88,53197,53191,53198],{},[16,53199,53200],{},"Nuevo botón",[88,53202,53203],{},"En \"Acción\", busca el nombre de tu acción (ej: \"MiPrimeraAccion\")",[88,53205,53206],{},"Personaliza el nombre del botón y el icono",[88,53208,53209],{},"Acepta",[13,53211,53212,53215],{},[16,53213,53214],{},"Nota:"," Esto se explicó en detalle en el Capítulo 2 de la guía. No lo repetiremos aquí.",[331,53217,53219],{"id":53218},"_63-ventajas-de-asignar-acciones","6.3 Ventajas de asignar acciones",[13,53221,53222],{},[16,53223,53224],{},"Accesibilidad:",[126,53226,53227,53230],{},[88,53228,53229],{},"Ejecutar acciones con un solo clic",[88,53231,53232],{},"No necesitas abrir el script cada vez",[13,53234,53235],{},[16,53236,53237],{},"Profesionalismo:",[126,53239,53240,53243],{},[88,53241,53242],{},"Interfaz personalizada para tu empresa",[88,53244,53245],{},"Flujo de trabajo optimizado",[13,53247,53248],{},[16,53249,53250],{},"Productividad:",[126,53252,53253,53256],{},[88,53254,53255],{},"Acciones comunes siempre disponibles",[88,53257,53258],{},"Ideal para tareas repetitivas",[43,53260],{},[46,53262,53264],{"id":53263},"_7-llamar-acciones-desde-otros-scripts","7. Llamar acciones desde otros scripts",[331,53266,53268],{"id":53267},"_71-commandlineinterpreter","7.1 CommandLineInterpreter",[13,53270,53271,53272,41],{},"Puedes ejecutar acciones declaradas desde otros scripts usando ",[54,53273,53274],{},"CommandLineInterpreter",[13,53276,53277],{},[16,53278,50721],{},[13,53280,53281,53284],{},[16,53282,53283],{},"Script 1:"," Define las acciones",[543,53286,53288],{"className":545,"code":53287,"language":547,"meta":228,"style":228},"\u002F\u002F Archivo: Herramientas.cs\nusing System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.Base;\n\npublic class Herramientas\n{\n    [DeclareAction(\"MostrarProyecto\")]\n    public void MostrarProyecto()\n    {\n        string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n        MessageBox.Show(\"Proyecto: \" + nombre);\n    }\n}\n",[54,53289,53290,53295,53299,53303,53307,53311,53316,53320,53324,53328,53332,53336,53341,53345],{"__ignoreMap":228},[551,53291,53292],{"class":553,"line":554},[551,53293,53294],{},"\u002F\u002F Archivo: Herramientas.cs\n",[551,53296,53297],{"class":553,"line":229},[551,53298,50105],{},[551,53300,53301],{"class":553,"line":670},[551,53302,49898],{},[551,53304,53305],{"class":553,"line":1136},[551,53306,1128],{},[551,53308,53309],{"class":553,"line":1142},[551,53310,1139],{"emptyLinePlaceholder":238},[551,53312,53313],{"class":553,"line":1148},[551,53314,53315],{},"public class Herramientas\n",[551,53317,53318],{"class":553,"line":1154},[551,53319,1151],{},[551,53321,53322],{"class":553,"line":1160},[551,53323,52675],{},[551,53325,53326],{"class":553,"line":1166},[551,53327,52680],{},[551,53329,53330],{"class":553,"line":1172},[551,53331,1169],{},[551,53333,53334],{"class":553,"line":1178},[551,53335,52689],{},[551,53337,53338],{"class":553,"line":1184},[551,53339,53340],{},"        MessageBox.Show(\"Proyecto: \" + nombre);\n",[551,53342,53343],{"class":553,"line":1190},[551,53344,1187],{},[551,53346,53347],{"class":553,"line":1472},[551,53348,1193],{},[13,53350,53351,53354],{},[16,53352,53353],{},"Script 2:"," Llama a la acción",[543,53356,53358],{"className":545,"code":53357,"language":547,"meta":228,"style":228},"\u002F\u002F Archivo: WorkflowCompleto.cs\nusing System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.ApplicationFramework;\n\npublic class WorkflowCompleto\n{\n    [Start]\n    public void Ejecutar()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n\n        \u002F\u002F Llamar a la acción declarada en Herramientas.cs\n        cli.Execute(\"MostrarProyecto\");\n\n        MessageBox.Show(\"Workflow completado\");\n    }\n}\n",[54,53359,53360,53365,53369,53373,53377,53381,53386,53390,53394,53398,53402,53407,53411,53416,53421,53425,53430,53434],{"__ignoreMap":228},[551,53361,53362],{"class":553,"line":554},[551,53363,53364],{},"\u002F\u002F Archivo: WorkflowCompleto.cs\n",[551,53366,53367],{"class":553,"line":229},[551,53368,50105],{},[551,53370,53371],{"class":553,"line":670},[551,53372,49898],{},[551,53374,53375],{"class":553,"line":1136},[551,53376,1133],{},[551,53378,53379],{"class":553,"line":1142},[551,53380,1139],{"emptyLinePlaceholder":238},[551,53382,53383],{"class":553,"line":1148},[551,53384,53385],{},"public class WorkflowCompleto\n",[551,53387,53388],{"class":553,"line":1154},[551,53389,1151],{},[551,53391,53392],{"class":553,"line":1160},[551,53393,1157],{},[551,53395,53396],{"class":553,"line":1166},[551,53397,1163],{},[551,53399,53400],{"class":553,"line":1172},[551,53401,1169],{},[551,53403,53404],{"class":553,"line":1178},[551,53405,53406],{},"        CommandLineInterpreter cli = new CommandLineInterpreter();\n",[551,53408,53409],{"class":553,"line":1184},[551,53410,1139],{"emptyLinePlaceholder":238},[551,53412,53413],{"class":553,"line":1190},[551,53414,53415],{},"        \u002F\u002F Llamar a la acción declarada en Herramientas.cs\n",[551,53417,53418],{"class":553,"line":1472},[551,53419,53420],{},"        cli.Execute(\"MostrarProyecto\");\n",[551,53422,53423],{"class":553,"line":1477},[551,53424,1139],{"emptyLinePlaceholder":238},[551,53426,53427],{"class":553,"line":1797},[551,53428,53429],{},"        MessageBox.Show(\"Workflow completado\");\n",[551,53431,53432],{"class":553,"line":1802},[551,53433,1187],{},[551,53435,53436],{"class":553,"line":1808},[551,53437,1193],{},[331,53439,53441],{"id":53440},"_72-ventaja-de-este-enfoque","7.2 Ventaja de este enfoque",[13,53443,53444],{},[16,53445,53446],{},"Modularidad:",[126,53448,53449,53452,53455],{},[88,53450,53451],{},"Acciones reutilizables entre scripts",[88,53453,53454],{},"No duplicar código",[88,53456,53457],{},"Cambiar la implementación en un solo lugar",[13,53459,53460],{},[16,53461,53462],{},"Mantenibilidad:",[126,53464,53465,53468],{},[88,53466,53467],{},"Fácil actualizar herramientas",[88,53469,53470],{},"Menos riesgo de inconsistencias",[43,53472],{},[46,53474,53476],{"id":53475},"_8-proyecto-del-capítulo-suite-de-acciones-básicas","8. Proyecto del capítulo: Suite de acciones básicas",[331,53478,53480],{"id":53479},"_81-objetivo","8.1 Objetivo",[13,53482,53483],{},"Crear un script con múltiples acciones que realicen tareas comunes de EPLAN.",[13,53485,53486],{},[16,53487,53488],{},"Acciones a implementar:",[85,53490,53491,53497,53503,53509],{},[88,53492,53493,53496],{},[54,53494,53495],{},"MostrarProyecto"," - Muestra nombre del proyecto",[88,53498,53499,53502],{},[54,53500,53501],{},"MostrarRutas"," - Muestra rutas importantes",[88,53504,53505,53508],{},[54,53506,53507],{},"MostrarPropiedades"," - Muestra propiedades del proyecto",[88,53510,53511,53514],{},[54,53512,53513],{},"ResumenCompleto"," - Ejecuta las tres anteriores en orden",[331,53516,53518],{"id":53517},"_82-implementación-completa","8.2 Implementación completa",[13,53520,53521,73,53523],{},[16,53522,50092],{},[54,53524,53525],{},"SuiteAcciones.cs",[543,53527,53529],{"className":545,"code":53528,"language":547,"meta":228,"style":228},"using System;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.Base;\n\npublic class SuiteAcciones\n{\n    \u002F\u002F Acción 1: Mostrar nombre del proyecto\n    [DeclareAction(\"MostrarProyecto\")]\n    public void MostrarProyecto()\n    {\n        try\n        {\n            string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n            MessageBox.Show(\n                \"Proyecto actual: \" + nombre,\n                \"Información de Proyecto\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error al obtener nombre: \" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n\n    \u002F\u002F Acción 2: Mostrar rutas importantes\n    [DeclareAction(\"MostrarRutas\")]\n    public void MostrarRutas()\n    {\n        try\n        {\n            string rutaProyecto = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n            string rutaDoc = PathMap.SubstitutePath(\"$(DOC)\");\n\n            MessageBox.Show(\n                \"Rutas del sistema:\\n\\n\" +\n                \"Proyecto: \" + rutaProyecto + \"\\n\" +\n                \"Documentos: \" + rutaDoc,\n                \"Rutas\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error al obtener rutas: \" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n\n    \u002F\u002F Acción 3: Mostrar propiedades del proyecto\n    [DeclareAction(\"MostrarPropiedades\")]\n    public void MostrarPropiedades()\n    {\n        try\n        {\n            string campo1 = PathMap.SubstitutePath(\"$(PROJECTPROPERTYFIELD1)\");\n            string campo2 = PathMap.SubstitutePath(\"$(PROJECTPROPERTYFIELD2)\");\n\n            MessageBox.Show(\n                \"Propiedades del proyecto:\\n\\n\" +\n                \"Campo 1: \" + campo1 + \"\\n\" +\n                \"Campo 2: \" + campo2,\n                \"Propiedades\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error al obtener propiedades: \" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n\n    \u002F\u002F Acción 4: Resumen completo\n    [DeclareAction(\"ResumenCompleto\")]\n    public void ResumenCompleto()\n    {\n        try\n        {\n            MostrarProyecto();\n            MostrarRutas();\n            MostrarPropiedades();\n\n            MessageBox.Show(\n                \"Resumen completo ejecutado:\\n\" +\n                \"1. Nombre mostrado\\n\" +\n                \"2. Rutas mostradas\\n\" +\n                \"3. Propiedades mostradas\",\n                \"Resumen Completado\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error en resumen: \" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n\n    \u002F\u002F [Start] opcional para mostrar información\n    [Start]\n    public void MostrarInfo()\n    {\n        MessageBox.Show(\n            \"Suite de Acciones EPLAN\\n\\n\" +\n            \"Acciones disponibles:\\n\" +\n            \"- MostrarProyecto\\n\" +\n            \"- MostrarRutas\\n\" +\n            \"- MostrarPropiedades\\n\" +\n            \"- ResumenCompleto\\n\\n\" +\n            \"Asigna estas acciones a botones en la cinta de opciones.\",\n            \"Suite de Acciones\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Information\n        );\n    }\n}\n",[54,53530,53531,53535,53539,53543,53547,53551,53556,53560,53565,53569,53573,53577,53581,53585,53590,53594,53599,53604,53609,53614,53619,53624,53628,53632,53636,53640,53645,53650,53654,53659,53663,53667,53671,53675,53680,53685,53690,53694,53698,53702,53707,53712,53716,53720,53725,53730,53735,53740,53744,53748,53752,53756,53760,53764,53768,53773,53777,53781,53785,53789,53793,53797,53801,53806,53810,53814,53818,53822,53826,53831,53836,53840,53844,53849,53854,53859,53864,53868,53872,53876,53880,53884,53888,53892,53897,53901,53905,53909,53913,53917,53921,53925,53930,53935,53940,53944,53948,53952,53957,53962,53967,53971,53975,53980,53985,53990,53995,54000,54004,54008,54012,54016,54020,54024,54028,54033,54037,54041,54045,54049,54053,54057,54061,54066,54070,54075,54079,54083,54088,54092,54096,54101,54106,54111,54116,54121,54125,54129,54133,54137],{"__ignoreMap":228},[551,53532,53533],{"class":553,"line":554},[551,53534,1123],{},[551,53536,53537],{"class":553,"line":229},[551,53538,50105],{},[551,53540,53541],{"class":553,"line":670},[551,53542,49898],{},[551,53544,53545],{"class":553,"line":1136},[551,53546,1128],{},[551,53548,53549],{"class":553,"line":1142},[551,53550,1139],{"emptyLinePlaceholder":238},[551,53552,53553],{"class":553,"line":1148},[551,53554,53555],{},"public class SuiteAcciones\n",[551,53557,53558],{"class":553,"line":1154},[551,53559,1151],{},[551,53561,53562],{"class":553,"line":1160},[551,53563,53564],{},"    \u002F\u002F Acción 1: Mostrar nombre del proyecto\n",[551,53566,53567],{"class":553,"line":1166},[551,53568,52675],{},[551,53570,53571],{"class":553,"line":1172},[551,53572,52680],{},[551,53574,53575],{"class":553,"line":1178},[551,53576,1169],{},[551,53578,53579],{"class":553,"line":1184},[551,53580,41211],{},[551,53582,53583],{"class":553,"line":1190},[551,53584,9062],{},[551,53586,53587],{"class":553,"line":1472},[551,53588,53589],{},"            string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,53591,53592],{"class":553,"line":1477},[551,53593,1139],{"emptyLinePlaceholder":238},[551,53595,53596],{"class":553,"line":1797},[551,53597,53598],{},"            MessageBox.Show(\n",[551,53600,53601],{"class":553,"line":1802},[551,53602,53603],{},"                \"Proyecto actual: \" + nombre,\n",[551,53605,53606],{"class":553,"line":1808},[551,53607,53608],{},"                \"Información de Proyecto\",\n",[551,53610,53611],{"class":553,"line":1814},[551,53612,53613],{},"                MessageBoxButtons.OK,\n",[551,53615,53616],{"class":553,"line":1820},[551,53617,53618],{},"                MessageBoxIcon.Information\n",[551,53620,53621],{"class":553,"line":1826},[551,53622,53623],{},"            );\n",[551,53625,53626],{"class":553,"line":1832},[551,53627,9077],{},[551,53629,53630],{"class":553,"line":1838},[551,53631,41473],{},[551,53633,53634],{"class":553,"line":1844},[551,53635,9062],{},[551,53637,53638],{"class":553,"line":1850},[551,53639,53598],{},[551,53641,53642],{"class":553,"line":1855},[551,53643,53644],{},"                \"Error al obtener nombre: \" + ex.Message,\n",[551,53646,53647],{"class":553,"line":1861},[551,53648,53649],{},"                \"Error\",\n",[551,53651,53652],{"class":553,"line":1867},[551,53653,53613],{},[551,53655,53656],{"class":553,"line":1873},[551,53657,53658],{},"                MessageBoxIcon.Error\n",[551,53660,53661],{"class":553,"line":1878},[551,53662,53623],{},[551,53664,53665],{"class":553,"line":1883},[551,53666,9077],{},[551,53668,53669],{"class":553,"line":1888},[551,53670,1187],{},[551,53672,53673],{"class":553,"line":4615},[551,53674,1139],{"emptyLinePlaceholder":238},[551,53676,53677],{"class":553,"line":4620},[551,53678,53679],{},"    \u002F\u002F Acción 2: Mostrar rutas importantes\n",[551,53681,53682],{"class":553,"line":4626},[551,53683,53684],{},"    [DeclareAction(\"MostrarRutas\")]\n",[551,53686,53687],{"class":553,"line":4631},[551,53688,53689],{},"    public void MostrarRutas()\n",[551,53691,53692],{"class":553,"line":4636},[551,53693,1169],{},[551,53695,53696],{"class":553,"line":4641},[551,53697,41211],{},[551,53699,53700],{"class":553,"line":4647},[551,53701,9062],{},[551,53703,53704],{"class":553,"line":4653},[551,53705,53706],{},"            string rutaProyecto = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[551,53708,53709],{"class":553,"line":4659},[551,53710,53711],{},"            string rutaDoc = PathMap.SubstitutePath(\"$(DOC)\");\n",[551,53713,53714],{"class":553,"line":4665},[551,53715,1139],{"emptyLinePlaceholder":238},[551,53717,53718],{"class":553,"line":4671},[551,53719,53598],{},[551,53721,53722],{"class":553,"line":4677},[551,53723,53724],{},"                \"Rutas del sistema:\\n\\n\" +\n",[551,53726,53727],{"class":553,"line":4683},[551,53728,53729],{},"                \"Proyecto: \" + rutaProyecto + \"\\n\" +\n",[551,53731,53732],{"class":553,"line":4689},[551,53733,53734],{},"                \"Documentos: \" + rutaDoc,\n",[551,53736,53737],{"class":553,"line":4695},[551,53738,53739],{},"                \"Rutas\",\n",[551,53741,53742],{"class":553,"line":4701},[551,53743,53613],{},[551,53745,53746],{"class":553,"line":4707},[551,53747,53618],{},[551,53749,53750],{"class":553,"line":4713},[551,53751,53623],{},[551,53753,53754],{"class":553,"line":4719},[551,53755,9077],{},[551,53757,53758],{"class":553,"line":4725},[551,53759,41473],{},[551,53761,53762],{"class":553,"line":4731},[551,53763,9062],{},[551,53765,53766],{"class":553,"line":4737},[551,53767,53598],{},[551,53769,53770],{"class":553,"line":4743},[551,53771,53772],{},"                \"Error al obtener rutas: \" + ex.Message,\n",[551,53774,53775],{"class":553,"line":4749},[551,53776,53649],{},[551,53778,53779],{"class":553,"line":4755},[551,53780,53613],{},[551,53782,53783],{"class":553,"line":4761},[551,53784,53658],{},[551,53786,53787],{"class":553,"line":4766},[551,53788,53623],{},[551,53790,53791],{"class":553,"line":4771},[551,53792,9077],{},[551,53794,53795],{"class":553,"line":4777},[551,53796,1187],{},[551,53798,53799],{"class":553,"line":4782},[551,53800,1139],{"emptyLinePlaceholder":238},[551,53802,53803],{"class":553,"line":4787},[551,53804,53805],{},"    \u002F\u002F Acción 3: Mostrar propiedades del proyecto\n",[551,53807,53808],{"class":553,"line":4793},[551,53809,53106],{},[551,53811,53812],{"class":553,"line":4799},[551,53813,53111],{},[551,53815,53816],{"class":553,"line":4805},[551,53817,1169],{},[551,53819,53820],{"class":553,"line":4811},[551,53821,41211],{},[551,53823,53824],{"class":553,"line":4817},[551,53825,9062],{},[551,53827,53828],{"class":553,"line":4822},[551,53829,53830],{},"            string campo1 = PathMap.SubstitutePath(\"$(PROJECTPROPERTYFIELD1)\");\n",[551,53832,53833],{"class":553,"line":4827},[551,53834,53835],{},"            string campo2 = PathMap.SubstitutePath(\"$(PROJECTPROPERTYFIELD2)\");\n",[551,53837,53838],{"class":553,"line":9183},[551,53839,1139],{"emptyLinePlaceholder":238},[551,53841,53842],{"class":553,"line":9188},[551,53843,53598],{},[551,53845,53846],{"class":553,"line":9193},[551,53847,53848],{},"                \"Propiedades del proyecto:\\n\\n\" +\n",[551,53850,53851],{"class":553,"line":9198},[551,53852,53853],{},"                \"Campo 1: \" + campo1 + \"\\n\" +\n",[551,53855,53856],{"class":553,"line":9204},[551,53857,53858],{},"                \"Campo 2: \" + campo2,\n",[551,53860,53861],{"class":553,"line":9209},[551,53862,53863],{},"                \"Propiedades\",\n",[551,53865,53866],{"class":553,"line":9214},[551,53867,53613],{},[551,53869,53870],{"class":553,"line":9219},[551,53871,53618],{},[551,53873,53874],{"class":553,"line":9224},[551,53875,53623],{},[551,53877,53878],{"class":553,"line":9230},[551,53879,9077],{},[551,53881,53882],{"class":553,"line":9236},[551,53883,41473],{},[551,53885,53886],{"class":553,"line":9242},[551,53887,9062],{},[551,53889,53890],{"class":553,"line":9247},[551,53891,53598],{},[551,53893,53894],{"class":553,"line":9253},[551,53895,53896],{},"                \"Error al obtener propiedades: \" + ex.Message,\n",[551,53898,53899],{"class":553,"line":9258},[551,53900,53649],{},[551,53902,53903],{"class":553,"line":9264},[551,53904,53613],{},[551,53906,53907],{"class":553,"line":9270},[551,53908,53658],{},[551,53910,53911],{"class":553,"line":9275},[551,53912,53623],{},[551,53914,53915],{"class":553,"line":9281},[551,53916,9077],{},[551,53918,53919],{"class":553,"line":9287},[551,53920,1187],{},[551,53922,53923],{"class":553,"line":9292},[551,53924,1139],{"emptyLinePlaceholder":238},[551,53926,53927],{"class":553,"line":9297},[551,53928,53929],{},"    \u002F\u002F Acción 4: Resumen completo\n",[551,53931,53932],{"class":553,"line":9302},[551,53933,53934],{},"    [DeclareAction(\"ResumenCompleto\")]\n",[551,53936,53937],{"class":553,"line":9308},[551,53938,53939],{},"    public void ResumenCompleto()\n",[551,53941,53942],{"class":553,"line":9313},[551,53943,1169],{},[551,53945,53946],{"class":553,"line":9318},[551,53947,41211],{},[551,53949,53950],{"class":553,"line":9323},[551,53951,9062],{},[551,53953,53954],{"class":553,"line":9328},[551,53955,53956],{},"            MostrarProyecto();\n",[551,53958,53959],{"class":553,"line":9334},[551,53960,53961],{},"            MostrarRutas();\n",[551,53963,53964],{"class":553,"line":9339},[551,53965,53966],{},"            MostrarPropiedades();\n",[551,53968,53969],{"class":553,"line":9344},[551,53970,1139],{"emptyLinePlaceholder":238},[551,53972,53973],{"class":553,"line":9350},[551,53974,53598],{},[551,53976,53977],{"class":553,"line":9355},[551,53978,53979],{},"                \"Resumen completo ejecutado:\\n\" +\n",[551,53981,53982],{"class":553,"line":9361},[551,53983,53984],{},"                \"1. Nombre mostrado\\n\" +\n",[551,53986,53987],{"class":553,"line":9367},[551,53988,53989],{},"                \"2. Rutas mostradas\\n\" +\n",[551,53991,53992],{"class":553,"line":9372},[551,53993,53994],{},"                \"3. Propiedades mostradas\",\n",[551,53996,53997],{"class":553,"line":9378},[551,53998,53999],{},"                \"Resumen Completado\",\n",[551,54001,54002],{"class":553,"line":9384},[551,54003,53613],{},[551,54005,54006],{"class":553,"line":9389},[551,54007,53618],{},[551,54009,54010],{"class":553,"line":9394},[551,54011,53623],{},[551,54013,54014],{"class":553,"line":9399},[551,54015,9077],{},[551,54017,54018],{"class":553,"line":9405},[551,54019,41473],{},[551,54021,54022],{"class":553,"line":9410},[551,54023,9062],{},[551,54025,54026],{"class":553,"line":9415},[551,54027,53598],{},[551,54029,54030],{"class":553,"line":9420},[551,54031,54032],{},"                \"Error en resumen: \" + ex.Message,\n",[551,54034,54035],{"class":553,"line":9425},[551,54036,53649],{},[551,54038,54039],{"class":553,"line":9431},[551,54040,53613],{},[551,54042,54043],{"class":553,"line":9436},[551,54044,53658],{},[551,54046,54047],{"class":553,"line":9441},[551,54048,53623],{},[551,54050,54051],{"class":553,"line":9447},[551,54052,9077],{},[551,54054,54055],{"class":553,"line":9452},[551,54056,1187],{},[551,54058,54059],{"class":553,"line":9458},[551,54060,1139],{"emptyLinePlaceholder":238},[551,54062,54063],{"class":553,"line":9464},[551,54064,54065],{},"    \u002F\u002F [Start] opcional para mostrar información\n",[551,54067,54068],{"class":553,"line":9469},[551,54069,1157],{},[551,54071,54072],{"class":553,"line":9475},[551,54073,54074],{},"    public void MostrarInfo()\n",[551,54076,54077],{"class":553,"line":9481},[551,54078,1169],{},[551,54080,54081],{"class":553,"line":9487},[551,54082,4790],{},[551,54084,54085],{"class":553,"line":9492},[551,54086,54087],{},"            \"Suite de Acciones EPLAN\\n\\n\" +\n",[551,54089,54090],{"class":553,"line":9497},[551,54091,53020],{},[551,54093,54094],{"class":553,"line":9502},[551,54095,53025],{},[551,54097,54098],{"class":553,"line":9508},[551,54099,54100],{},"            \"- MostrarRutas\\n\" +\n",[551,54102,54103],{"class":553,"line":9514},[551,54104,54105],{},"            \"- MostrarPropiedades\\n\" +\n",[551,54107,54108],{"class":553,"line":9519},[551,54109,54110],{},"            \"- ResumenCompleto\\n\\n\" +\n",[551,54112,54113],{"class":553,"line":9524},[551,54114,54115],{},"            \"Asigna estas acciones a botones en la cinta de opciones.\",\n",[551,54117,54118],{"class":553,"line":9529},[551,54119,54120],{},"            \"Suite de Acciones\",\n",[551,54122,54123],{"class":553,"line":9535},[551,54124,4808],{},[551,54126,54127],{"class":553,"line":9540},[551,54128,4814],{},[551,54130,54131],{"class":553,"line":9545},[551,54132,4758],{},[551,54134,54135],{"class":553,"line":9551},[551,54136,1187],{},[551,54138,54139],{"class":553,"line":9557},[551,54140,1193],{},[331,54142,54144],{"id":54143},"_83-prueba-del-proyecto","8.3 Prueba del proyecto",[13,54146,54147,54150],{},[16,54148,54149],{},"Paso 1:"," Ejecutar el script directamente",[126,54152,54153],{},[88,54154,54155,54156,32897],{},"Se mostrará la información de las acciones disponibles (",[551,54157,1300],{},[13,54159,54160,54163],{},[16,54161,54162],{},"Paso 2:"," Ejecutar acciones individuales",[126,54165,54166,54169],{},[88,54167,54168],{},"Usa Utilidades > Scripts > Ejecutar acción",[88,54170,54171],{},"Prueba: MostrarProyecto, MostrarRutas, MostrarPropiedades",[13,54173,54174,54177],{},[16,54175,54176],{},"Paso 3:"," Ejecutar resumen completo",[126,54179,54180,54183],{},[88,54181,54182],{},"Usa Utilidades > Scripts > Ejecutar acción > ResumenCompleto",[88,54184,54185],{},"Verifica que ejecuta las tres acciones en orden",[13,54187,54188,54191],{},[16,54189,54190],{},"Paso 4:"," Asignar a botones (opcional)",[126,54193,54194,54197],{},[88,54195,54196],{},"Personaliza la cinta de opciones",[88,54198,54199],{},"Crea botones para las acciones más usadas",[43,54201],{},[46,54203,54205],{"id":54204},"_9-errores-comunes","9. Errores comunes",[331,54207,54209],{"id":54208},"_91-olvidar-el-parámetro-del-nombre","9.1 Olvidar el parámetro del nombre",[13,54211,54212],{},[16,54213,51348],{},[543,54215,54217],{"className":545,"code":54216,"language":547,"meta":228,"style":228},"[DeclareAction]  \u002F\u002F ✗ Falta el nombre de la acción\npublic void MiMetodo()\n{\n    \u002F\u002F ...\n}\n",[54,54218,54219,54224,54228,54232,54236],{"__ignoreMap":228},[551,54220,54221],{"class":553,"line":554},[551,54222,54223],{},"[DeclareAction]  \u002F\u002F ✗ Falta el nombre de la acción\n",[551,54225,54226],{"class":553,"line":229},[551,54227,49710],{},[551,54229,54230],{"class":553,"line":670},[551,54231,1151],{},[551,54233,54234],{"class":553,"line":1136},[551,54235,16123],{},[551,54237,54238],{"class":553,"line":1142},[551,54239,1193],{},[13,54241,54242],{},[16,54243,51401],{},[543,54245,54247],{"className":545,"code":54246,"language":547,"meta":228,"style":228},"[DeclareAction(\"NombreDeLaAccion\")]  \u002F\u002F ✓ Con nombre\npublic void MiMetodo()\n{\n    \u002F\u002F ...\n}\n",[54,54248,54249,54254,54258,54262,54266],{"__ignoreMap":228},[551,54250,54251],{"class":553,"line":554},[551,54252,54253],{},"[DeclareAction(\"NombreDeLaAccion\")]  \u002F\u002F ✓ Con nombre\n",[551,54255,54256],{"class":553,"line":229},[551,54257,49710],{},[551,54259,54260],{"class":553,"line":670},[551,54261,1151],{},[551,54263,54264],{"class":553,"line":1136},[551,54265,16123],{},[551,54267,54268],{"class":553,"line":1142},[551,54269,1193],{},[331,54271,54273],{"id":54272},"_92-nombre-duplicado","9.2 Nombre duplicado",[13,54275,54276],{},[16,54277,51348],{},[543,54279,54281],{"className":545,"code":54280,"language":547,"meta":228,"style":228},"public class Script1\n{\n    [DeclareAction(\"MiAccion\")]  \u002F\u002F ✗ Nombre duplicado\n    public void Metodo1() { }\n}\n\npublic class Script2\n{\n    [DeclareAction(\"MiAccion\")]  \u002F\u002F ✗ Mismo nombre\n    public void Metodo2() { }\n}\n",[54,54282,54283,54288,54292,54297,54302,54306,54310,54315,54319,54324,54329],{"__ignoreMap":228},[551,54284,54285],{"class":553,"line":554},[551,54286,54287],{},"public class Script1\n",[551,54289,54290],{"class":553,"line":229},[551,54291,1151],{},[551,54293,54294],{"class":553,"line":670},[551,54295,54296],{},"    [DeclareAction(\"MiAccion\")]  \u002F\u002F ✗ Nombre duplicado\n",[551,54298,54299],{"class":553,"line":1136},[551,54300,54301],{},"    public void Metodo1() { }\n",[551,54303,54304],{"class":553,"line":1142},[551,54305,1193],{},[551,54307,54308],{"class":553,"line":1148},[551,54309,1139],{"emptyLinePlaceholder":238},[551,54311,54312],{"class":553,"line":1154},[551,54313,54314],{},"public class Script2\n",[551,54316,54317],{"class":553,"line":1160},[551,54318,1151],{},[551,54320,54321],{"class":553,"line":1166},[551,54322,54323],{},"    [DeclareAction(\"MiAccion\")]  \u002F\u002F ✗ Mismo nombre\n",[551,54325,54326],{"class":553,"line":1172},[551,54327,54328],{},"    public void Metodo2() { }\n",[551,54330,54331],{"class":553,"line":1178},[551,54332,1193],{},[13,54334,54335,54337],{},[16,54336,51401],{}," Usar nombres únicos para cada acción.",[331,54339,54341,54342,54344],{"id":54340},"_93-intentar-ejecutar-declareaction-directamente","9.3 Intentar ejecutar ",[551,54343,51803],{}," directamente",[13,54346,54347,54350,54351,54353],{},[16,54348,54349],{},"Error común:","\nAbrir un .cs con solo ",[551,54352,51803],{}," esperando que se ejecute.",[13,54355,54356,54359,54360,73,54362,54365],{},[16,54357,54358],{},"Realidad:","\nLas acciones con ",[551,54361,51803],{},[16,54363,54364],{},"no se ejecutan automáticamente",". Debes:",[126,54367,54368,54371,54374],{},[88,54369,54370],{},"Llamarlas por nombre",[88,54372,54373],{},"Asignarlas a botones",[88,54375,54376,54377,54379],{},"O añadir un ",[551,54378,1300],{}," que las ejecute",[43,54381],{},[46,54383,22685],{"id":22684},[13,54385,22688],{},[126,54387,54388,54395,54408,54417,54424,54430,54439],{},[88,54389,49892,54390,54394],{},[16,54391,54392],{},[551,54393,51803],{}," crea acciones con nombre en EPLAN",[88,54396,54397,54398,54402,54403,54407],{},"Diferencias entre ",[16,54399,54400],{},[551,54401,1300],{}," (ejecución automática) y ",[16,54404,54405],{},[551,54406,51803],{}," (acción registrada)",[88,54409,54410,54411,54416],{},"Puedes tener ",[16,54412,54413,54414],{},"múltiples ",[551,54415,51803],{}," en el mismo script",[88,54418,54419,54420,54423],{},"Las acciones se pueden ",[16,54421,54422],{},"asignar a botones"," de la cinta de opciones",[88,54425,54419,54426,54429],{},[16,54427,54428],{},"llamar desde otros scripts"," con CommandLineInterpreter",[88,54431,53164,54432,54416],{},[16,54433,54434,54435,4842,54437],{},"combinar ",[551,54436,1300],{},[551,54438,51803],{},[88,54440,54441,54442],{},"Las acciones deben tener ",[16,54443,54444],{},"nombres únicos y descriptivos",[43,54446],{},[46,54448,5728],{"id":5727},[13,54450,54451],{},[16,54452,54453,54454,4842,54456,54458],{},"P: ¿Puedo tener ",[551,54455,1300],{},[551,54457,51803],{}," en el mismo método?",[13,54460,54461],{},"R: No. Un método solo puede tener un atributo de ejecución. Pero puedes tener ambos en diferentes métodos de la misma clase.",[13,54463,54464],{},[16,54465,54466],{},"P: ¿Cómo sé qué acciones están registradas en EPLAN?",[13,54468,54469],{},"R: Ve a Utilidades > Scripts > Ejecutar acción. Verás todas las acciones disponibles.",[13,54471,54472],{},[16,54473,54474],{},"P: ¿Las acciones persisten después de cerrar EPLAN?",[13,54476,54477,54478,54481],{},"R: No. Las acciones solo están disponibles mientras el script esté cargado. Para tenerlas siempre, debes usar ",[551,54479,54480],{},"DeclareRegister"," (siguiente capítulo).",[13,54483,54484],{},[16,54485,54486],{},"P: ¿Puedo pasar parámetros a una acción?",[13,54488,54489,54490,54492],{},"R: Sí, pero no con ",[551,54491,51803],{}," básico. Hay formas avanzadas que veremos más adelante.",[43,54494],{},[46,54496,51782],{"id":36078},[331,54498,51786],{"id":51785},[13,54500,54501,54506],{},[16,54502,54503,54504],{},"Capítulo 12: El atributo ",[551,54505,1300],{}," - Aprendiste el punto de entrada básico de scripts",[331,54508,51795],{"id":51794},[13,54510,54511],{},[16,54512,54513],{},"Capítulo 14: Event Handlers - Reaccionar a eventos",[13,54515,51806,54516,54519],{},[16,54517,54518],{},"event handlers"," que reaccionan automáticamente a eventos de EPLAN (abrir proyecto, cerrar página, etc.).",[43,54521],{},[13,54523,54524,10676,54526,54528,54529,93,54531,54534,93,54536],{},[31,54525,657],{},[31,54527,10679],{},": 25-30 minutos\n",[31,54530,10683],{},[54,54532,54533],{},"code\u002Fcap-13\u002F",[31,54535,51827],{},[54,54537,54538],{},"EPLAN-Scripting-4.0\u002F01_FirstSteps\u002F02_DeclareAction.cs",[660,54540,662],{},{"title":228,"searchDepth":229,"depth":229,"links":54542},[54543,54544,54545,54546,54552,54556,54562,54567,54572,54577,54581,54586,54592,54593,54594],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":52010,"depth":229,"text":54547,"children":54548},"1. ¿Qué es DeclareAction?",[54549,54550,54551],{"id":49680,"depth":670,"text":49681},{"id":52046,"depth":670,"text":52047},{"id":52104,"depth":670,"text":52105},{"id":52123,"depth":229,"text":54553,"children":54554},"2. Diferencias entre Start y DeclareAction",[54555],{"id":52233,"depth":670,"text":52234},{"id":52377,"depth":229,"text":54557,"children":54558},"3. Tu primera acción con DeclareAction",[54559,54560,54561],{"id":52383,"depth":670,"text":52384},{"id":52446,"depth":670,"text":52447},{"id":52504,"depth":670,"text":52505},{"id":52598,"depth":229,"text":52599,"children":54563},[54564,54565,54566],{"id":52602,"depth":670,"text":52603},{"id":52632,"depth":670,"text":52633},{"id":52793,"depth":670,"text":52794},{"id":52831,"depth":229,"text":54568,"children":54569},"5. Combinar Start y DeclareAction",[54570,54571],{"id":52839,"depth":670,"text":52840},{"id":52931,"depth":670,"text":52932},{"id":53150,"depth":229,"text":53151,"children":54573},[54574,54575,54576],{"id":53154,"depth":670,"text":53155},{"id":53171,"depth":670,"text":53172},{"id":53218,"depth":670,"text":53219},{"id":53263,"depth":229,"text":53264,"children":54578},[54579,54580],{"id":53267,"depth":670,"text":53268},{"id":53440,"depth":670,"text":53441},{"id":53475,"depth":229,"text":53476,"children":54582},[54583,54584,54585],{"id":53479,"depth":670,"text":53480},{"id":53517,"depth":670,"text":53518},{"id":54143,"depth":670,"text":54144},{"id":54204,"depth":229,"text":54205,"children":54587},[54588,54589,54590],{"id":54208,"depth":670,"text":54209},{"id":54272,"depth":670,"text":54273},{"id":54340,"depth":670,"text":54591},"9.3 Intentar ejecutar DeclareAction directamente",{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":54595},[54596,54597],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Aprende a registrar acciones con el atributo [DeclareAction] en C# y crea tu primer script EPLAN reutilizable en EPLAN Electric P8.",{},"\u002Fguia\u002Feplan-api\u002Fcap-13-atributo-declareaction",{"title":51899,"description":54598},"guia\u002Feplan-api\u002Fcap-13-atributo-declareaction","u8ya7p0Y-A5Z1cTcnK6S5WzVvNFFrvZceZUsVId77Vw",{"id":54605,"title":54606,"body":54607,"description":56362,"extension":236,"meta":56363,"navigation":238,"path":56364,"seo":56365,"stem":56366,"tagline":242,"__hash__":56367},"guia\u002Fguia\u002Feplan-api\u002Fcap-14-event-handlers.md","Capítulo 14: Event Handlers en la API de EPLAN",{"type":7,"value":54608,"toc":56316},[54609,54620,54622,54624,54626,54650,54652,54654,54656,54675,54677,54679,54682,54698,54705,54708,54722,54728,54730,54734,54736,54746,54751,54753,54780,54784,54803,54805,54808,54816,54818,54822,54930,54932,54936,54940,54947,54999,55003,55011,55031,55036,55040,55051,55056,55072,55074,55078,55081,55085,55092,55106,55110,55138,55142,55149,55161,55165,55193,55200,55212,55216,55244,55253,55255,55259,55263,55272,55276,55303,55307,55313,55449,55453,55458,55473,55501,55514,55516,55520,55522,55525,55529,55535,55765,55769,55774,55789,55803,55808,55842,55845,55850,55880,55883,55888,55926,55946,55951,55966,55969,55971,55975,55979,55984,55995,55999,56016,56020,56025,56036,56041,56049,56054,56062,56064,56068,56072,56077,56085,56089,56093,56102,56107,56111,56115,56155,56164,56166,56168,56170,56219,56221,56223,56228,56231,56236,56242,56247,56253,56258,56265,56267,56269,56271,56277,56279,56284,56287,56289,56303,56314],[10,54610,54611],{},[13,54612,54613,19,54615,19,54617,54619],{},[16,54614,49597],{},[16,54616,49600],{},[16,54618,25],{},": Principiante-Intermedio",[43,54621],{},[46,54623,268],{"id":267},[13,54625,702],{},[126,54627,54628,54631,54641,54644,54647],{},[88,54629,54630],{},"Entender qué es un event handler y cuándo usarlo",[88,54632,54633,54634,4000,54636,4842,54638],{},"Diferenciar entre ",[551,54635,1300],{},[551,54637,51803],{},[551,54639,54640],{},"DeclareEventHandler",[88,54642,54643],{},"Crear scripts que se ejecutan automáticamente al ocurrir eventos",[88,54645,54646],{},"Conocer los eventos más comunes de EPLAN",[88,54648,54649],{},"Implementar event handlers con y sin parámetros",[43,54651],{},[46,54653,320],{"id":319},[13,54655,726],{},[126,54657,54658,54666,54669,54672],{},[88,54659,54660,54661,54663,54664,32897],{},"Haber completado los Capítulos 12 (",[551,54662,1300],{},") y 13 (",[551,54665,51803],{},[88,54667,54668],{},"Entender atributos de C#",[88,54670,54671],{},"Conocer PathMap y CommandLineInterpreter",[88,54673,54674],{},"Saber usar try-catch para manejo de errores",[43,54676],{},[46,54678,49653],{"id":49652},[13,54680,54681],{},"Hasta ahora has aprendido dos formas de ejecutar código en EPLAN:",[126,54683,54684,54691],{},[88,54685,54686,54690],{},[16,54687,54688],{},[551,54689,1300],{}," - Se ejecuta manualmente al abrir el script",[88,54692,54693,54697],{},[16,54694,54695],{},[551,54696,51803],{}," - Se ejecuta al llamar la acción por nombre",[13,54699,54700,54701,54704],{},"Pero ¿qué pasa si quieres que tu código se ejecute ",[16,54702,54703],{},"automáticamente"," cuando ocurre algo en EPLAN?",[13,54706,54707],{},"Por ejemplo:",[126,54709,54710,54713,54716,54719],{},[88,54711,54712],{},"Cuando el usuario cierra un proyecto",[88,54714,54715],{},"Cuando se abre una página",[88,54717,54718],{},"Cuando se ejecuta cualquier acción",[88,54720,54721],{},"Cuando ocurre un error",[13,54723,54724,54725,41],{},"Para eso existen los ",[16,54726,54727],{},"Event Handlers",[43,54729],{},[46,54731,54733],{"id":54732},"_1-qué-es-un-event-handler","1. ¿Qué es un Event Handler?",[331,54735,49681],{"id":49680},[13,54737,33655,54738,54741,54742,54745],{},[16,54739,54740],{},"Event Handler"," (manejador de eventos) es un método que se ejecuta automáticamente cuando ocurre un ",[16,54743,54744],{},"evento específico"," en EPLAN.",[13,54747,54748,54750],{},[16,54749,49878],{}," Es como un detector de movimiento que enciende la luz automáticamente cuando alguien entra a una habitación.",[331,54752,52047],{"id":52046},[543,54754,54756],{"className":545,"code":54755,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"NombreDelEvento\")]\npublic void MiMetodo()\n{\n    \u002F\u002F Código que se ejecuta cuando ocurre el evento\n}\n",[54,54757,54758,54763,54767,54771,54776],{"__ignoreMap":228},[551,54759,54760],{"class":553,"line":554},[551,54761,54762],{},"[DeclareEventHandler(\"NombreDelEvento\")]\n",[551,54764,54765],{"class":553,"line":229},[551,54766,49710],{},[551,54768,54769],{"class":553,"line":670},[551,54770,1151],{},[551,54772,54773],{"class":553,"line":1136},[551,54774,54775],{},"    \u002F\u002F Código que se ejecuta cuando ocurre el evento\n",[551,54777,54778],{"class":553,"line":1142},[551,54779,1193],{},[13,54781,54782],{},[16,54783,52078],{},[126,54785,54786,54792,54798],{},[88,54787,54788,54791],{},[54,54789,54790],{},"[DeclareEventHandler(\"...\")]"," - Atributo con el nombre del evento",[88,54793,54794,54797],{},[54,54795,54796],{},"\"NombreDelEvento\""," - String que identifica el evento a capturar",[88,54799,54800,54802],{},[54,54801,52097],{}," - Método público sin valor de retorno",[331,54804,52105],{"id":52104},[13,54806,54807],{},"El atributo está en el mismo namespace que los anteriores:",[543,54809,54810],{"className":545,"code":49898,"language":547,"meta":228,"style":228},[54,54811,54812],{"__ignoreMap":228},[551,54813,54814],{"class":553,"line":554},[551,54815,49898],{},[43,54817],{},[46,54819,54821],{"id":54820},"_2-comparación-de-atributos-de-scripting","2. Comparación de atributos de scripting",[6589,54823,54824,54842],{},[6592,54825,54826],{},[6595,54827,54828,54830,54834,54838],{},[6598,54829,35277],{},[6598,54831,54832],{},[551,54833,1300],{},[6598,54835,54836],{},[551,54837,51803],{},[6598,54839,54840],{},[551,54841,54640],{},[6611,54843,54844,54859,54873,54886,54901,54914],{},[6595,54845,54846,54850,54853,54856],{},[6616,54847,54848],{},[16,54849,110],{},[6616,54851,54852],{},"Manual al abrir script",[6616,54854,54855],{},"Manual al llamar acción",[6616,54857,54858],{},"Automática al ocurrir evento",[6595,54860,54861,54865,54867,54870],{},[6616,54862,54863],{},[16,54864,52153],{},[6616,54866,52156],{},[6616,54868,54869],{},"Con nombre",[6616,54871,54872],{},"Con nombre de evento",[6595,54874,54875,54880,54882,54884],{},[6616,54876,54877],{},[16,54878,54879],{},"Cantidad",[6616,54881,11916],{},[6616,54883,52171],{},[6616,54885,52171],{},[6595,54887,54888,54892,54895,54898],{},[6616,54889,54890],{},[16,54891,52190],{},[6616,54893,54894],{},"No acepta",[6616,54896,54897],{},"Nombre de acción",[6616,54899,54900],{},"Nombre de evento",[6595,54902,54903,54907,54909,54911],{},[6616,54904,54905],{},[16,54906,6771],{},[6616,54908,52227],{},[6616,54910,52230],{},[6616,54912,54913],{},"Automatización reactiva",[6595,54915,54916,54921,54924,54927],{},[6616,54917,54918],{},[16,54919,54920],{},"Cuándo se ejecuta",[6616,54922,54923],{},"Al abrir el .cs",[6616,54925,54926],{},"Al invocar por nombre",[6616,54928,54929],{},"Al ocurrir el evento",[43,54931],{},[46,54933,54935],{"id":54934},"_3-tu-primer-event-handler","3. Tu primer Event Handler",[331,54937,54939],{"id":54938},"_31-event-handler-simple-al-cerrar-proyecto","3.1 Event Handler simple: Al cerrar proyecto",[13,54941,54942,73,54944],{},[16,54943,50092],{},[54,54945,54946],{},"01_EventHandlerSimple.cs",[543,54948,54950],{"className":545,"code":54949,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class EventHandlerSimple\n{\n    [DeclareEventHandler(\"onActionStart.String.XPrjActionProjectClose\")]\n    public void AlCerrarProyecto()\n    {\n        MessageBox.Show(\"Scripting is great!\");\n    }\n}\n",[54,54951,54952,54956,54960,54964,54969,54973,54978,54983,54987,54991,54995],{"__ignoreMap":228},[551,54953,54954],{"class":553,"line":554},[551,54955,50105],{},[551,54957,54958],{"class":553,"line":229},[551,54959,49898],{},[551,54961,54962],{"class":553,"line":670},[551,54963,1139],{"emptyLinePlaceholder":238},[551,54965,54966],{"class":553,"line":1136},[551,54967,54968],{},"public class EventHandlerSimple\n",[551,54970,54971],{"class":553,"line":1142},[551,54972,1151],{},[551,54974,54975],{"class":553,"line":1148},[551,54976,54977],{},"    [DeclareEventHandler(\"onActionStart.String.XPrjActionProjectClose\")]\n",[551,54979,54980],{"class":553,"line":1154},[551,54981,54982],{},"    public void AlCerrarProyecto()\n",[551,54984,54985],{"class":553,"line":1160},[551,54986,1169],{},[551,54988,54989],{"class":553,"line":1166},[551,54990,50552],{},[551,54992,54993],{"class":553,"line":1172},[551,54994,1187],{},[551,54996,54997],{"class":553,"line":1178},[551,54998,1193],{},[331,55000,55002],{"id":55001},"_32-análisis-del-código","3.2 Análisis del código",[13,55004,55005,73,55008],{},[16,55006,55007],{},"Evento:",[54,55009,55010],{},"onActionStart.String.XPrjActionProjectClose",[126,55012,55013,55019,55025],{},[88,55014,55015,55018],{},[54,55016,55017],{},"onActionStart"," - Se ejecuta al INICIAR una acción",[88,55020,55021,55024],{},[54,55022,55023],{},"String"," - Tipo de dato",[88,55026,55027,55030],{},[54,55028,55029],{},"XPrjActionProjectClose"," - Acción de cerrar proyecto",[13,55032,55033,55035],{},[16,55034,53132],{},"\nCada vez que el usuario cierre un proyecto en EPLAN, se mostrará el MessageBox automáticamente.",[331,55037,55039],{"id":55038},"_33-cómo-cargar-el-event-handler","3.3 ¿Cómo cargar el Event Handler?",[13,55041,52450,55042,4842,55044,55046,55047,55050],{},[551,55043,1300],{},[551,55045,51803],{},", los event handlers NO se ejecutan al abrir el script una vez. Necesitas ",[16,55048,55049],{},"registrarlos"," para que estén activos.",[13,55052,55053],{},[16,55054,55055],{},"Formas de registrar:",[85,55057,55058,55064],{},[88,55059,55060,55063],{},[16,55061,55062],{},"Ejecutar el script una vez"," - Algunos event handlers se registran temporalmente",[88,55065,55066,55071],{},[16,55067,55068,55069],{},"Usar ",[551,55070,54480],{}," - Para que se carguen automáticamente al iniciar EPLAN (Capítulo 15)",[43,55073],{},[46,55075,55077],{"id":55076},"_4-eventos-disponibles-en-eplan","4. Eventos disponibles en EPLAN",[13,55079,55080],{},"Basándome en los scripts oficiales de EPLAN-Scripting-4.0, estos son los eventos documentados:",[331,55082,55084],{"id":55083},"_41-eventos-de-proyecto","4.1 Eventos de proyecto",[13,55086,55087,73,55089],{},[16,55088,55007],{},[54,55090,55091],{},"Eplan.EplApi.OnUserPreCloseProject",[126,55093,55094,55100],{},[88,55095,55096,55099],{},[16,55097,55098],{},"Cuándo se ejecuta:"," Antes de cerrar un proyecto",[88,55101,55102,55105],{},[16,55103,55104],{},"Uso típico:"," Realizar acciones finales (exportar, guardar configuración, limpiar archivos temporales)",[13,55107,55108],{},[16,55109,50721],{},[543,55111,55113],{"className":545,"code":55112,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\npublic void AntesDeCerrarProyecto()\n{\n    MessageBox.Show(\"El proyecto se va a cerrar\");\n}\n",[54,55114,55115,55120,55125,55129,55134],{"__ignoreMap":228},[551,55116,55117],{"class":553,"line":554},[551,55118,55119],{},"[DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n",[551,55121,55122],{"class":553,"line":229},[551,55123,55124],{},"public void AntesDeCerrarProyecto()\n",[551,55126,55127],{"class":553,"line":670},[551,55128,1151],{},[551,55130,55131],{"class":553,"line":1136},[551,55132,55133],{},"    MessageBox.Show(\"El proyecto se va a cerrar\");\n",[551,55135,55136],{"class":553,"line":1142},[551,55137,1193],{},[331,55139,55141],{"id":55140},"_42-eventos-de-acciones","4.2 Eventos de acciones",[13,55143,55144,73,55146],{},[16,55145,55007],{},[54,55147,55148],{},"onActionStart.String.\u003CNombreAccion>",[126,55150,55151,55156],{},[88,55152,55153,55155],{},[16,55154,55098],{}," Al INICIAR una acción específica",[88,55157,55158,55160],{},[16,55159,55104],{}," Preparar datos antes de ejecutar una acción",[13,55162,55163],{},[16,55164,50721],{},[543,55166,55168],{"className":545,"code":55167,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"onActionStart.String.XPrjActionProjectClose\")]\npublic void AntesDeAccion()\n{\n    MessageBox.Show(\"Se va a ejecutar la acción de cerrar proyecto\");\n}\n",[54,55169,55170,55175,55180,55184,55189],{"__ignoreMap":228},[551,55171,55172],{"class":553,"line":554},[551,55173,55174],{},"[DeclareEventHandler(\"onActionStart.String.XPrjActionProjectClose\")]\n",[551,55176,55177],{"class":553,"line":229},[551,55178,55179],{},"public void AntesDeAccion()\n",[551,55181,55182],{"class":553,"line":670},[551,55183,1151],{},[551,55185,55186],{"class":553,"line":1136},[551,55187,55188],{},"    MessageBox.Show(\"Se va a ejecutar la acción de cerrar proyecto\");\n",[551,55190,55191],{"class":553,"line":1142},[551,55192,1193],{},[13,55194,55195,73,55197],{},[16,55196,55007],{},[54,55198,55199],{},"onActionEnd.String.*",[126,55201,55202,55207],{},[88,55203,55204,55206],{},[16,55205,55098],{}," Al FINALIZAR cualquier acción (el asterisco es wildcard)",[88,55208,55209,55211],{},[16,55210,55104],{}," Logging, captura de errores, auditoría",[13,55213,55214],{},[16,55215,50721],{},[543,55217,55219],{"className":545,"code":55218,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"onActionEnd.String.*\")]\npublic void DespuesDeAccion(IEventParameter iEventParameter)\n{\n    \u002F\u002F Se ejecuta después de CUALQUIER acción en EPLAN\n}\n",[54,55220,55221,55226,55231,55235,55240],{"__ignoreMap":228},[551,55222,55223],{"class":553,"line":554},[551,55224,55225],{},"[DeclareEventHandler(\"onActionEnd.String.*\")]\n",[551,55227,55228],{"class":553,"line":229},[551,55229,55230],{},"public void DespuesDeAccion(IEventParameter iEventParameter)\n",[551,55232,55233],{"class":553,"line":670},[551,55234,1151],{},[551,55236,55237],{"class":553,"line":1136},[551,55238,55239],{},"    \u002F\u002F Se ejecuta después de CUALQUIER acción en EPLAN\n",[551,55241,55242],{"class":553,"line":1142},[551,55243,1193],{},[13,55245,55246,55248,55249,55252],{},[16,55247,53214],{}," Este event handler requiere el parámetro ",[54,55250,55251],{},"IEventParameter"," para obtener información del evento.",[43,55254],{},[46,55256,55258],{"id":55257},"_5-event-handlers-con-parámetros","5. Event Handlers con parámetros",[331,55260,55262],{"id":55261},"_51-cuándo-usar-parámetros","5.1 ¿Cuándo usar parámetros?",[13,55264,55265,55266,55269,55270,41],{},"Algunos eventos proporcionan ",[16,55267,55268],{},"información adicional"," sobre lo que ocurrió. Para acceder a esa información, el event handler debe aceptar un parámetro de tipo ",[54,55271,55251],{},[331,55273,55275],{"id":55274},"_52-sintaxis","5.2 Sintaxis",[543,55277,55279],{"className":545,"code":55278,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"NombreDelEvento\")]\npublic void MiMetodo(IEventParameter iEventParameter)\n{\n    \u002F\u002F Acceder a información del evento\n}\n",[54,55280,55281,55285,55290,55294,55299],{"__ignoreMap":228},[551,55282,55283],{"class":553,"line":554},[551,55284,54762],{},[551,55286,55287],{"class":553,"line":229},[551,55288,55289],{},"public void MiMetodo(IEventParameter iEventParameter)\n",[551,55291,55292],{"class":553,"line":670},[551,55293,1151],{},[551,55295,55296],{"class":553,"line":1136},[551,55297,55298],{},"    \u002F\u002F Acceder a información del evento\n",[551,55300,55301],{"class":553,"line":1142},[551,55302,1193],{},[331,55304,55306],{"id":55305},"_53-ejemplo-avanzado-capturar-nombre-de-acción","5.3 Ejemplo avanzado: Capturar nombre de acción",[13,55308,55309,55310,416],{},"Este ejemplo está basado en ",[54,55311,55312],{},"EPLAN-Scripting-4.0\u002F99_AdditionalExamples\u002F12_HTTPServerEplan\u002FActionNameServer\u002FactionNameOnServer.cs",[543,55314,55316],{"className":545,"code":55315,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.ApplicationFramework;\nusing System.Windows.Forms;\n\npublic class EventHandlerAvanzado\n{\n    [DeclareEventHandler(\"onActionEnd.String.*\")]\n    public long DespuesDeCualquierAccion(IEventParameter iEventParameter)\n    {\n        try\n        {\n            \u002F\u002F Convertir IEventParameter a EventParameterString\n            EventParameterString oEventParameterString = new EventParameterString(iEventParameter);\n\n            \u002F\u002F Extraer el nombre de la acción ejecutada\n            string nombreAccion = oEventParameterString.String;\n\n            \u002F\u002F Hacer algo con el nombre de la acción\n            \u002F\u002F Ejemplo: Logging, auditoría, enviar a servidor, etc.\n            MessageBox.Show(\"Se ejecutó: \" + nombreAccion);\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n\n        return 0;\n    }\n}\n",[54,55317,55318,55322,55326,55330,55334,55338,55343,55347,55352,55357,55361,55365,55369,55374,55379,55383,55388,55393,55397,55402,55407,55412,55416,55420,55424,55429,55433,55437,55441,55445],{"__ignoreMap":228},[551,55319,55320],{"class":553,"line":554},[551,55321,1123],{},[551,55323,55324],{"class":553,"line":229},[551,55325,49898],{},[551,55327,55328],{"class":553,"line":670},[551,55329,1133],{},[551,55331,55332],{"class":553,"line":1136},[551,55333,50105],{},[551,55335,55336],{"class":553,"line":1142},[551,55337,1139],{"emptyLinePlaceholder":238},[551,55339,55340],{"class":553,"line":1148},[551,55341,55342],{},"public class EventHandlerAvanzado\n",[551,55344,55345],{"class":553,"line":1154},[551,55346,1151],{},[551,55348,55349],{"class":553,"line":1160},[551,55350,55351],{},"    [DeclareEventHandler(\"onActionEnd.String.*\")]\n",[551,55353,55354],{"class":553,"line":1166},[551,55355,55356],{},"    public long DespuesDeCualquierAccion(IEventParameter iEventParameter)\n",[551,55358,55359],{"class":553,"line":1172},[551,55360,1169],{},[551,55362,55363],{"class":553,"line":1178},[551,55364,41211],{},[551,55366,55367],{"class":553,"line":1184},[551,55368,9062],{},[551,55370,55371],{"class":553,"line":1190},[551,55372,55373],{},"            \u002F\u002F Convertir IEventParameter a EventParameterString\n",[551,55375,55376],{"class":553,"line":1472},[551,55377,55378],{},"            EventParameterString oEventParameterString = new EventParameterString(iEventParameter);\n",[551,55380,55381],{"class":553,"line":1477},[551,55382,1139],{"emptyLinePlaceholder":238},[551,55384,55385],{"class":553,"line":1797},[551,55386,55387],{},"            \u002F\u002F Extraer el nombre de la acción ejecutada\n",[551,55389,55390],{"class":553,"line":1802},[551,55391,55392],{},"            string nombreAccion = oEventParameterString.String;\n",[551,55394,55395],{"class":553,"line":1808},[551,55396,1139],{"emptyLinePlaceholder":238},[551,55398,55399],{"class":553,"line":1814},[551,55400,55401],{},"            \u002F\u002F Hacer algo con el nombre de la acción\n",[551,55403,55404],{"class":553,"line":1820},[551,55405,55406],{},"            \u002F\u002F Ejemplo: Logging, auditoría, enviar a servidor, etc.\n",[551,55408,55409],{"class":553,"line":1826},[551,55410,55411],{},"            MessageBox.Show(\"Se ejecutó: \" + nombreAccion);\n",[551,55413,55414],{"class":553,"line":1832},[551,55415,9077],{},[551,55417,55418],{"class":553,"line":1838},[551,55419,41473],{},[551,55421,55422],{"class":553,"line":1844},[551,55423,9062],{},[551,55425,55426],{"class":553,"line":1850},[551,55427,55428],{},"            MessageBox.Show(\"Error: \" + ex.Message);\n",[551,55430,55431],{"class":553,"line":1855},[551,55432,9077],{},[551,55434,55435],{"class":553,"line":1861},[551,55436,1139],{"emptyLinePlaceholder":238},[551,55438,55439],{"class":553,"line":1867},[551,55440,31632],{},[551,55442,55443],{"class":553,"line":1873},[551,55444,1187],{},[551,55446,55447],{"class":553,"line":1878},[551,55448,1193],{},[331,55450,55452],{"id":55451},"_54-explicación-del-uso-de-ieventparameter","5.4 Explicación del uso de IEventParameter",[13,55454,55455],{},[16,55456,55457],{},"Línea 14-15: Conversión de parámetro",[543,55459,55461],{"className":545,"code":55460,"language":547,"meta":228,"style":228},"EventParameterString oEventParameterString = new EventParameterString(iEventParameter);\nstring nombreAccion = oEventParameterString.String;\n",[54,55462,55463,55468],{"__ignoreMap":228},[551,55464,55465],{"class":553,"line":554},[551,55466,55467],{},"EventParameterString oEventParameterString = new EventParameterString(iEventParameter);\n",[551,55469,55470],{"class":553,"line":229},[551,55471,55472],{},"string nombreAccion = oEventParameterString.String;\n",[126,55474,55475,55480,55486,55494],{},[88,55476,55477,55479],{},[54,55478,55251],{}," es la interfaz base para parámetros de eventos",[88,55481,55482,55485],{},[54,55483,55484],{},"EventParameterString"," es una implementación concreta que contiene un string",[88,55487,55488,55489,55491,55492],{},"Se crea un ",[54,55490,55484],{}," a partir del ",[54,55493,55251],{},[88,55495,55496,55497,55500],{},"La propiedad ",[54,55498,55499],{},".String"," contiene el valor (en este caso, el nombre de la acción ejecutada)",[13,55502,55503,55506,55507,55509,55510,55513],{},[16,55504,55505],{},"Valor de retorno:","\nLos event handlers con ",[54,55508,55251],{}," pueden devolver ",[54,55511,55512],{},"long"," (aunque generalmente se devuelve 0).",[43,55515],{},[46,55517,55519],{"id":55518},"_6-proyecto-del-capítulo-exportar-pdf-al-cerrar","6. Proyecto del capítulo: Exportar PDF al cerrar",[331,55521,51019],{"id":51018},[13,55523,55524],{},"Crear un event handler que pregunte al usuario si desea exportar el proyecto a PDF antes de cerrarlo.",[331,55526,55528],{"id":55527},"_62-análisis-del-script-oficial","6.2 Análisis del script oficial",[13,55530,55531,55532,416],{},"Este script está basado directamente en ",[54,55533,55534],{},"EPLAN-Scripting-4.0\u002F16_Export\u002F03_PdfOnClosing.cs",[543,55536,55538],{"className":545,"code":55537,"language":547,"meta":228,"style":228},"using System.IO;\nusing System.Windows.Forms;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class ExportarPdfAlCerrar\n{\n    [DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n    public void AlCerrarProyecto()\n    {\n        \u002F\u002F Obtener información del proyecto usando PathMap\n        string rutaDocumentos = PathMap.SubstitutePath(\"$(DOC)\");\n        string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n        \u002F\u002F Preguntar al usuario\n        DialogResult resultado = MessageBox.Show(\n            \"Do you want export a PDF for project '\" + nombreProyecto + \"' ?\",\n            \"PDF-Export\",\n            MessageBoxButtons.YesNo,\n            MessageBoxIcon.Question\n        );\n\n        if (resultado == DialogResult.Yes)\n        {\n            \u002F\u002F Crear barra de progreso\n            Progress progress = new Progress(\"SimpleProgress\");\n            progress.SetAllowCancel(true);\n            progress.SetAskOnCancel(true);\n            progress.BeginPart(100, \"\");\n            progress.ShowImmediately();\n\n            \u002F\u002F Preparar exportación\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n            ActionCallingContext acc = new ActionCallingContext();\n\n            string archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);\n            acc.AddParameter(\"TYPE\", \"PDFPROJECTSCHEME\");\n            acc.AddParameter(\"EXPORTFILE\", archivoCompleto);\n            acc.AddParameter(\"EXPORTSCHEME\", \"EPLAN_default_value\");\n\n            \u002F\u002F Ejecutar exportación\n            cli.Execute(\"export\", acc);\n\n            \u002F\u002F Cerrar barra de progreso\n            progress.EndPart(true);\n        }\n    }\n}\n",[54,55539,55540,55544,55548,55552,55556,55560,55564,55569,55573,55578,55582,55586,55591,55596,55601,55605,55610,55615,55620,55625,55630,55635,55639,55643,55648,55652,55657,55662,55667,55672,55677,55682,55686,55691,55696,55701,55705,55710,55715,55720,55725,55729,55734,55739,55743,55748,55753,55757,55761],{"__ignoreMap":228},[551,55541,55542],{"class":553,"line":554},[551,55543,45756],{},[551,55545,55546],{"class":553,"line":229},[551,55547,50105],{},[551,55549,55550],{"class":553,"line":670},[551,55551,1133],{},[551,55553,55554],{"class":553,"line":1136},[551,55555,1128],{},[551,55557,55558],{"class":553,"line":1142},[551,55559,49898],{},[551,55561,55562],{"class":553,"line":1148},[551,55563,1139],{"emptyLinePlaceholder":238},[551,55565,55566],{"class":553,"line":1154},[551,55567,55568],{},"public class ExportarPdfAlCerrar\n",[551,55570,55571],{"class":553,"line":1160},[551,55572,1151],{},[551,55574,55575],{"class":553,"line":1166},[551,55576,55577],{},"    [DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n",[551,55579,55580],{"class":553,"line":1172},[551,55581,54982],{},[551,55583,55584],{"class":553,"line":1178},[551,55585,1169],{},[551,55587,55588],{"class":553,"line":1184},[551,55589,55590],{},"        \u002F\u002F Obtener información del proyecto usando PathMap\n",[551,55592,55593],{"class":553,"line":1190},[551,55594,55595],{},"        string rutaDocumentos = PathMap.SubstitutePath(\"$(DOC)\");\n",[551,55597,55598],{"class":553,"line":1472},[551,55599,55600],{},"        string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,55602,55603],{"class":553,"line":1477},[551,55604,1139],{"emptyLinePlaceholder":238},[551,55606,55607],{"class":553,"line":1797},[551,55608,55609],{},"        \u002F\u002F Preguntar al usuario\n",[551,55611,55612],{"class":553,"line":1802},[551,55613,55614],{},"        DialogResult resultado = MessageBox.Show(\n",[551,55616,55617],{"class":553,"line":1808},[551,55618,55619],{},"            \"Do you want export a PDF for project '\" + nombreProyecto + \"' ?\",\n",[551,55621,55622],{"class":553,"line":1814},[551,55623,55624],{},"            \"PDF-Export\",\n",[551,55626,55627],{"class":553,"line":1820},[551,55628,55629],{},"            MessageBoxButtons.YesNo,\n",[551,55631,55632],{"class":553,"line":1826},[551,55633,55634],{},"            MessageBoxIcon.Question\n",[551,55636,55637],{"class":553,"line":1832},[551,55638,4758],{},[551,55640,55641],{"class":553,"line":1838},[551,55642,1139],{"emptyLinePlaceholder":238},[551,55644,55645],{"class":553,"line":1844},[551,55646,55647],{},"        if (resultado == DialogResult.Yes)\n",[551,55649,55650],{"class":553,"line":1850},[551,55651,9062],{},[551,55653,55654],{"class":553,"line":1855},[551,55655,55656],{},"            \u002F\u002F Crear barra de progreso\n",[551,55658,55659],{"class":553,"line":1861},[551,55660,55661],{},"            Progress progress = new Progress(\"SimpleProgress\");\n",[551,55663,55664],{"class":553,"line":1867},[551,55665,55666],{},"            progress.SetAllowCancel(true);\n",[551,55668,55669],{"class":553,"line":1873},[551,55670,55671],{},"            progress.SetAskOnCancel(true);\n",[551,55673,55674],{"class":553,"line":1878},[551,55675,55676],{},"            progress.BeginPart(100, \"\");\n",[551,55678,55679],{"class":553,"line":1883},[551,55680,55681],{},"            progress.ShowImmediately();\n",[551,55683,55684],{"class":553,"line":1888},[551,55685,1139],{"emptyLinePlaceholder":238},[551,55687,55688],{"class":553,"line":4615},[551,55689,55690],{},"            \u002F\u002F Preparar exportación\n",[551,55692,55693],{"class":553,"line":4620},[551,55694,55695],{},"            CommandLineInterpreter cli = new CommandLineInterpreter();\n",[551,55697,55698],{"class":553,"line":4626},[551,55699,55700],{},"            ActionCallingContext acc = new ActionCallingContext();\n",[551,55702,55703],{"class":553,"line":4631},[551,55704,1139],{"emptyLinePlaceholder":238},[551,55706,55707],{"class":553,"line":4636},[551,55708,55709],{},"            string archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);\n",[551,55711,55712],{"class":553,"line":4641},[551,55713,55714],{},"            acc.AddParameter(\"TYPE\", \"PDFPROJECTSCHEME\");\n",[551,55716,55717],{"class":553,"line":4647},[551,55718,55719],{},"            acc.AddParameter(\"EXPORTFILE\", archivoCompleto);\n",[551,55721,55722],{"class":553,"line":4653},[551,55723,55724],{},"            acc.AddParameter(\"EXPORTSCHEME\", \"EPLAN_default_value\");\n",[551,55726,55727],{"class":553,"line":4659},[551,55728,1139],{"emptyLinePlaceholder":238},[551,55730,55731],{"class":553,"line":4665},[551,55732,55733],{},"            \u002F\u002F Ejecutar exportación\n",[551,55735,55736],{"class":553,"line":4671},[551,55737,55738],{},"            cli.Execute(\"export\", acc);\n",[551,55740,55741],{"class":553,"line":4677},[551,55742,1139],{"emptyLinePlaceholder":238},[551,55744,55745],{"class":553,"line":4683},[551,55746,55747],{},"            \u002F\u002F Cerrar barra de progreso\n",[551,55749,55750],{"class":553,"line":4689},[551,55751,55752],{},"            progress.EndPart(true);\n",[551,55754,55755],{"class":553,"line":4695},[551,55756,9077],{},[551,55758,55759],{"class":553,"line":4701},[551,55760,1187],{},[551,55762,55763],{"class":553,"line":4707},[551,55764,1193],{},[331,55766,55768],{"id":55767},"_63-explicación-línea-por-línea","6.3 Explicación línea por línea",[13,55770,55771],{},[16,55772,55773],{},"Líneas 9-10: Obtener información del proyecto",[543,55775,55777],{"className":545,"code":55776,"language":547,"meta":228,"style":228},"string rutaDocumentos = PathMap.SubstitutePath(\"$(DOC)\");\nstring nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[54,55778,55779,55784],{"__ignoreMap":228},[551,55780,55781],{"class":553,"line":554},[551,55782,55783],{},"string rutaDocumentos = PathMap.SubstitutePath(\"$(DOC)\");\n",[551,55785,55786],{"class":553,"line":229},[551,55787,55788],{},"string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[126,55790,55791,55797],{},[88,55792,55793,55796],{},[54,55794,55795],{},"$(DOC)"," - Ruta de la carpeta de documentos del proyecto",[88,55798,55799,55802],{},[54,55800,55801],{},"$(PROJECTNAME)"," - Nombre del proyecto actual",[13,55804,55805],{},[16,55806,55807],{},"Líneas 12-18: Preguntar al usuario",[543,55809,55811],{"className":545,"code":55810,"language":547,"meta":228,"style":228},"DialogResult resultado = MessageBox.Show(\n    \"Do you want export a PDF for project '\" + nombreProyecto + \"' ?\",\n    \"PDF-Export\",\n    MessageBoxButtons.YesNo,\n    MessageBoxIcon.Question\n);\n",[54,55812,55813,55818,55823,55828,55833,55838],{"__ignoreMap":228},[551,55814,55815],{"class":553,"line":554},[551,55816,55817],{},"DialogResult resultado = MessageBox.Show(\n",[551,55819,55820],{"class":553,"line":229},[551,55821,55822],{},"    \"Do you want export a PDF for project '\" + nombreProyecto + \"' ?\",\n",[551,55824,55825],{"class":553,"line":670},[551,55826,55827],{},"    \"PDF-Export\",\n",[551,55829,55830],{"class":553,"line":1136},[551,55831,55832],{},"    MessageBoxButtons.YesNo,\n",[551,55834,55835],{"class":553,"line":1142},[551,55836,55837],{},"    MessageBoxIcon.Question\n",[551,55839,55840],{"class":553,"line":1148},[551,55841,3967],{},[13,55843,55844],{},"Muestra un diálogo con botones Sí\u002FNo.",[13,55846,55847],{},[16,55848,55849],{},"Líneas 20-27: Crear barra de progreso",[543,55851,55853],{"className":545,"code":55852,"language":547,"meta":228,"style":228},"Progress progress = new Progress(\"SimpleProgress\");\nprogress.SetAllowCancel(true);\nprogress.SetAskOnCancel(true);\nprogress.BeginPart(100, \"\");\nprogress.ShowImmediately();\n",[54,55854,55855,55860,55865,55870,55875],{"__ignoreMap":228},[551,55856,55857],{"class":553,"line":554},[551,55858,55859],{},"Progress progress = new Progress(\"SimpleProgress\");\n",[551,55861,55862],{"class":553,"line":229},[551,55863,55864],{},"progress.SetAllowCancel(true);\n",[551,55866,55867],{"class":553,"line":670},[551,55868,55869],{},"progress.SetAskOnCancel(true);\n",[551,55871,55872],{"class":553,"line":1136},[551,55873,55874],{},"progress.BeginPart(100, \"\");\n",[551,55876,55877],{"class":553,"line":1142},[551,55878,55879],{},"progress.ShowImmediately();\n",[13,55881,55882],{},"Muestra barra de progreso durante la exportación.",[13,55884,55885],{},[16,55886,55887],{},"Líneas 29-35: Configurar exportación",[543,55889,55891],{"className":545,"code":55890,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\nActionCallingContext acc = new ActionCallingContext();\n\nstring archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);\nacc.AddParameter(\"TYPE\", \"PDFPROJECTSCHEME\");\nacc.AddParameter(\"EXPORTFILE\", archivoCompleto);\nacc.AddParameter(\"EXPORTSCHEME\", \"EPLAN_default_value\");\n",[54,55892,55893,55897,55902,55906,55911,55916,55921],{"__ignoreMap":228},[551,55894,55895],{"class":553,"line":554},[551,55896,52496],{},[551,55898,55899],{"class":553,"line":229},[551,55900,55901],{},"ActionCallingContext acc = new ActionCallingContext();\n",[551,55903,55904],{"class":553,"line":670},[551,55905,1139],{"emptyLinePlaceholder":238},[551,55907,55908],{"class":553,"line":1136},[551,55909,55910],{},"string archivoCompleto = Path.Combine(rutaDocumentos, nombreProyecto);\n",[551,55912,55913],{"class":553,"line":1142},[551,55914,55915],{},"acc.AddParameter(\"TYPE\", \"PDFPROJECTSCHEME\");\n",[551,55917,55918],{"class":553,"line":1148},[551,55919,55920],{},"acc.AddParameter(\"EXPORTFILE\", archivoCompleto);\n",[551,55922,55923],{"class":553,"line":1154},[551,55924,55925],{},"acc.AddParameter(\"EXPORTSCHEME\", \"EPLAN_default_value\");\n",[126,55927,55928,55934,55940],{},[88,55929,55930,55933],{},[54,55931,55932],{},"TYPE",": Tipo de exportación (PDF de esquema de proyecto)",[88,55935,55936,55939],{},[54,55937,55938],{},"EXPORTFILE",": Ruta donde guardar el PDF",[88,55941,55942,55945],{},[54,55943,55944],{},"EXPORTSCHEME",": Esquema de exportación a usar",[13,55947,55948],{},[16,55949,55950],{},"Líneas 37-41: Ejecutar y finalizar",[543,55952,55954],{"className":545,"code":55953,"language":547,"meta":228,"style":228},"cli.Execute(\"export\", acc);\nprogress.EndPart(true);\n",[54,55955,55956,55961],{"__ignoreMap":228},[551,55957,55958],{"class":553,"line":554},[551,55959,55960],{},"cli.Execute(\"export\", acc);\n",[551,55962,55963],{"class":553,"line":229},[551,55964,55965],{},"progress.EndPart(true);\n",[13,55967,55968],{},"Ejecuta la exportación y cierra la barra de progreso.",[43,55970],{},[46,55972,55974],{"id":55973},"_7-ventajas-y-limitaciones","7. Ventajas y limitaciones",[331,55976,55978],{"id":55977},"_71-ventajas-de-event-handlers","7.1 Ventajas de Event Handlers",[13,55980,55981],{},[16,55982,55983],{},"Automatización completa:",[126,55985,55986,55989,55992],{},[88,55987,55988],{},"No requiere intervención del usuario",[88,55990,55991],{},"Se ejecutan en el momento exacto necesario",[88,55993,55994],{},"Permiten workflows automáticos",[13,55996,55997],{},[16,55998,52618],{},[126,56000,56001,56004,56007,56010,56013],{},[88,56002,56003],{},"Exportar automáticamente al cerrar proyecto",[88,56005,56006],{},"Validar datos antes de guardar",[88,56008,56009],{},"Logging de todas las acciones",[88,56011,56012],{},"Sincronización automática con sistemas externos",[88,56014,56015],{},"Auditoría de cambios",[331,56017,56019],{"id":56018},"_72-limitaciones","7.2 Limitaciones",[13,56021,56022],{},[16,56023,56024],{},"No persisten entre sesiones:",[126,56026,56027,56030],{},[88,56028,56029],{},"Los event handlers solo están activos mientras el script esté cargado",[88,56031,56032,56033,56035],{},"Para tenerlos siempre activos, debes usar ",[54,56034,49931],{}," (Capítulo 15)",[13,56037,56038],{},[16,56039,56040],{},"Difíciles de debuggear:",[126,56042,56043,56046],{},[88,56044,56045],{},"Se ejecutan automáticamente, puede ser difícil saber cuándo y por qué",[88,56047,56048],{},"Errores pueden pasar desapercibidos",[13,56050,56051],{},[16,56052,56053],{},"Documentación limitada:",[126,56055,56056,56059],{},[88,56057,56058],{},"No hay lista oficial completa de todos los eventos disponibles",[88,56060,56061],{},"Debes investigar o basarte en ejemplos",[43,56063],{},[46,56065,56067],{"id":56066},"_8-errores-comunes","8. Errores comunes",[331,56069,56071],{"id":56070},"_81-olvidar-registrar-el-event-handler","8.1 Olvidar registrar el event handler",[13,56073,56074,56076],{},[16,56075,51348],{},"\nCrear el script pero nunca ejecutarlo, esperando que funcione automáticamente.",[13,56078,56079,56081,56082,56084],{},[16,56080,51401],{},"\nDebes ejecutar el script al menos una vez para registrar el event handler, o usar ",[54,56083,49931],{}," para carga automática.",[331,56086,56088],{"id":56087},"_82-nombre-de-evento-incorrecto","8.2 Nombre de evento incorrecto",[13,56090,56091],{},[16,56092,51348],{},[543,56094,56096],{"className":545,"code":56095,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"onProjectClose\")]  \u002F\u002F ✗ Nombre incorrecto\n",[54,56097,56098],{"__ignoreMap":228},[551,56099,56100],{"class":553,"line":554},[551,56101,56095],{},[13,56103,56104,56106],{},[16,56105,51401],{},"\nUsa los nombres exactos de eventos documentados. Los nombres son case-sensitive.",[331,56108,56110],{"id":56109},"_83-event-handler-que-bloquea-eplan","8.3 Event handler que bloquea EPLAN",[13,56112,56113],{},[16,56114,51348],{},[543,56116,56118],{"className":545,"code":56117,"language":547,"meta":228,"style":228},"[DeclareEventHandler(\"onActionEnd.String.*\")]\npublic void Bloqueante(IEventParameter iEventParameter)\n{\n    \u002F\u002F Operación muy larga sin Progress\n    for (int i = 0; i \u003C 1000000; i++) {\n        \u002F\u002F ...\n    }\n}\n",[54,56119,56120,56124,56129,56133,56138,56143,56147,56151],{"__ignoreMap":228},[551,56121,56122],{"class":553,"line":554},[551,56123,55225],{},[551,56125,56126],{"class":553,"line":229},[551,56127,56128],{},"public void Bloqueante(IEventParameter iEventParameter)\n",[551,56130,56131],{"class":553,"line":670},[551,56132,1151],{},[551,56134,56135],{"class":553,"line":1136},[551,56136,56137],{},"    \u002F\u002F Operación muy larga sin Progress\n",[551,56139,56140],{"class":553,"line":1142},[551,56141,56142],{},"    for (int i = 0; i \u003C 1000000; i++) {\n",[551,56144,56145],{"class":553,"line":1148},[551,56146,22204],{},[551,56148,56149],{"class":553,"line":1154},[551,56150,1187],{},[551,56152,56153],{"class":553,"line":1160},[551,56154,1193],{},[13,56156,56157,56159,56160,56163],{},[16,56158,51401],{},"\nLos event handlers deben ser rápidos. Si necesitas operaciones largas, usa ",[54,56161,56162],{},"Progress"," o ejecución asíncrona.",[43,56165],{},[46,56167,22685],{"id":22684},[13,56169,22688],{},[126,56171,56172,56177,56185,56195,56204,56210],{},[88,56173,21963,56174,56176],{},[16,56175,54727],{}," se ejecutan automáticamente cuando ocurre un evento",[88,56178,56179,56180],{},"Se declaran con el atributo ",[16,56181,56182],{},[551,56183,56184],{},"DeclareEventHandler(\"NombreEvento\")",[88,56186,56187,56188,4000,56190,4000,56193],{},"Eventos principales: ",[54,56189,55091],{},[54,56191,56192],{},"onActionStart.String.*",[54,56194,55199],{},[88,56196,56197,56198,56200,56201,56203],{},"Event handlers pueden tener ",[16,56199,29751],{}," (",[54,56202,55251],{},") para acceder a información del evento",[88,56205,56206,56207],{},"Usos típicos: ",[16,56208,56209],{},"exportación automática, validación, logging, auditoría",[88,56211,56212,56213,56216,56217,32897],{},"Requieren ",[16,56214,56215],{},"registro"," para estar activos (temporal o permanente con ",[551,56218,54480],{},[43,56220],{},[46,56222,5728],{"id":5727},[13,56224,56225],{},[16,56226,56227],{},"P: ¿Dónde está la lista completa de eventos disponibles?",[13,56229,56230],{},"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).",[13,56232,56233],{},[16,56234,56235],{},"P: ¿Puedo tener múltiples event handlers en el mismo script?",[13,56237,56238,56239,56241],{},"R: Sí, puedes tener varios ",[54,56240,49925],{}," para diferentes eventos en el mismo archivo.",[13,56243,56244],{},[16,56245,56246],{},"P: ¿Los event handlers persisten después de cerrar EPLAN?",[13,56248,56249,56250,56252],{},"R: No. Debes volver a ejecutar el script cada vez que abras EPLAN, o usar ",[54,56251,49931],{}," para carga automática (próximo capítulo).",[13,56254,56255],{},[16,56256,56257],{},"P: ¿Puedo cancelar un evento?",[13,56259,56260,56261,56264],{},"R: Depende del evento. Algunos eventos como ",[54,56262,56263],{},"OnUserPreCloseProject"," permiten cierta interacción, pero no estoy al 90% seguro de cómo cancelar eventos sin más documentación.",[43,56266],{},[46,56268,51782],{"id":36078},[331,56270,51786],{"id":51785},[13,56272,56273],{},[16,56274,51800,56275,49920],{},[551,56276,51803],{},[331,56278,51795],{"id":51794},[13,56280,56281],{},[16,56282,56283],{},"Capítulo 15: Register\u002FUnregister - Carga automática",[13,56285,56286],{},"En el próximo capítulo aprenderás a hacer que tus scripts y event handlers se carguen automáticamente al iniciar EPLAN.",[43,56288],{},[13,56290,56291,10676,56293,54528,56295,93,56297,56300,416],{},[31,56292,657],{},[31,56294,10679],{},[31,56296,10683],{},[54,56298,56299],{},"code\u002Fcap-14\u002F",[31,56301,56302],{},"Scripts de referencia",[126,56304,56305,56310],{},[88,56306,56307],{},[54,56308,56309],{},"EPLAN-Scripting-4.0\u002F01_FirstSteps\u002F03_DeclareEventHandler.cs",[88,56311,56312],{},[54,56313,55534],{},[660,56315,662],{},{"title":228,"searchDepth":229,"depth":229,"links":56317},[56318,56319,56320,56321,56326,56327,56332,56336,56342,56347,56351,56356,56357,56358],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":54732,"depth":229,"text":54733,"children":56322},[56323,56324,56325],{"id":49680,"depth":670,"text":49681},{"id":52046,"depth":670,"text":52047},{"id":52104,"depth":670,"text":52105},{"id":54820,"depth":229,"text":54821},{"id":54934,"depth":229,"text":54935,"children":56328},[56329,56330,56331],{"id":54938,"depth":670,"text":54939},{"id":55001,"depth":670,"text":55002},{"id":55038,"depth":670,"text":55039},{"id":55076,"depth":229,"text":55077,"children":56333},[56334,56335],{"id":55083,"depth":670,"text":55084},{"id":55140,"depth":670,"text":55141},{"id":55257,"depth":229,"text":55258,"children":56337},[56338,56339,56340,56341],{"id":55261,"depth":670,"text":55262},{"id":55274,"depth":670,"text":55275},{"id":55305,"depth":670,"text":55306},{"id":55451,"depth":670,"text":55452},{"id":55518,"depth":229,"text":55519,"children":56343},[56344,56345,56346],{"id":51018,"depth":670,"text":51019},{"id":55527,"depth":670,"text":55528},{"id":55767,"depth":670,"text":55768},{"id":55973,"depth":229,"text":55974,"children":56348},[56349,56350],{"id":55977,"depth":670,"text":55978},{"id":56018,"depth":670,"text":56019},{"id":56066,"depth":229,"text":56067,"children":56352},[56353,56354,56355],{"id":56070,"depth":670,"text":56071},{"id":56087,"depth":670,"text":56088},{"id":56109,"depth":670,"text":56110},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":56359},[56360,56361],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Reacciona a eventos con event handlers en la API de EPLAN en C#. Comunica scripts y automatiza tareas en EPLAN Electric P8.",{},"\u002Fguia\u002Feplan-api\u002Fcap-14-event-handlers",{"title":54606,"description":56362},"guia\u002Feplan-api\u002Fcap-14-event-handlers","lKmr04Zi-3pj-cychMo895kaLZEMPvyuECZg01Y_ePc",{"id":56369,"title":56370,"body":56371,"description":58574,"extension":236,"meta":58575,"navigation":238,"path":58576,"seo":58577,"stem":58578,"tagline":242,"__hash__":58579},"guia\u002Fguia\u002Feplan-api\u002Fcap-15-register-unregister.md","Capítulo 15: Registrar acciones en EPLAN",{"type":7,"value":56372,"toc":58526},[56373,56384,56386,56388,56390,56412,56414,56416,56418,56435,56437,56439,56442,56465,56471,56474,56488,56499,56501,56509,56513,56524,56533,56537,56555,56557,56612,56616,56635,56639,56642,56650,56652,56656,56660,56667,56675,56681,56689,56693,56699,56701,56705,56709,56715,56795,56799,56804,56815,56820,56825,56830,56841,56843,56847,56851,56854,56965,56971,56975,56981,56987,57234,57240,57242,57246,57250,57256,57432,57437,57470,57472,57476,57480,57483,57489,57492,57496,57506,57510,57513,57518,57521,57523,57527,57531,57534,57539,57583,57588,57624,57628,57631,57637,57716,57720,57723,57778,57780,57784,57876,57878,57882,57886,57889,57903,57907,58321,58325,58330,58338,58343,58351,58356,58364,58366,58368,58370,58413,58415,58417,58425,58428,58437,58446,58453,58456,58461,58464,58469,58474,58476,58478,58480,58484,58486,58491,58494,58496,58509,58524],[10,56374,56375],{},[13,56376,56377,19,56379,19,56381,56383],{},[16,56378,49597],{},[16,56380,49600],{},[16,56382,25],{},": Intermedio",[43,56385],{},[46,56387,268],{"id":267},[13,56389,702],{},[126,56391,56392,56400,56403,56406,56409],{},[88,56393,56394,56395,4842,56397],{},"Entender qué son los atributos ",[551,56396,54480],{},[551,56398,56399],{},"DeclareUnregister",[88,56401,56402],{},"Hacer que tus scripts se carguen automáticamente al iniciar EPLAN",[88,56404,56405],{},"Implementar inicialización y limpieza de recursos",[88,56407,56408],{},"Combinar Register\u002FUnregister con otros atributos de scripting",[88,56410,56411],{},"Conocer casos de uso típicos de carga automática",[43,56413],{},[46,56415,320],{"id":319},[13,56417,726],{},[126,56419,56420,56429,56432],{},[88,56421,56422,56423,4000,56425,4000,56427,32897],{},"Haber completado los Capítulos 12-14 (",[551,56424,1300],{},[551,56426,51803],{},[551,56428,54640],{},[88,56430,56431],{},"Entender el ciclo de vida de scripts en EPLAN",[88,56433,56434],{},"Conocer conceptos básicos de inicialización y limpieza de recursos",[43,56436],{},[46,56438,49653],{"id":49652},[13,56440,56441],{},"En los capítulos anteriores has aprendido diferentes formas de ejecutar código:",[126,56443,56444,56451,56458],{},[88,56445,56446,56450],{},[16,56447,56448],{},[551,56449,1300],{}," - Ejecución manual al abrir el script",[88,56452,56453,56457],{},[16,56454,56455],{},[551,56456,51803],{}," - Ejecución al llamar la acción por nombre",[88,56459,56460,56464],{},[16,56461,56462],{},[551,56463,54640],{}," - Ejecución automática al ocurrir un evento",[13,56466,56467,56468,41],{},"Pero todos estos tienen un problema: ",[16,56469,56470],{},"debes ejecutar o registrar el script manualmente cada vez que abres EPLAN",[13,56472,56473],{},"¿Qué pasa si quieres que tu script:",[126,56475,56476,56479,56482,56485],{},[88,56477,56478],{},"Se cargue automáticamente al iniciar EPLAN?",[88,56480,56481],{},"Configure elementos de interfaz (ribbon, menús) al arrancar?",[88,56483,56484],{},"Registre event handlers permanentemente?",[88,56486,56487],{},"Se limpie correctamente al cerrar EPLAN?",[13,56489,56490,56491,4842,56495,41],{},"Para eso existen ",[16,56492,56493],{},[551,56494,54480],{},[16,56496,56497],{},[551,56498,56399],{},[43,56500],{},[46,56502,56504,56505,4842,56507,36151],{"id":56503},"_1-qué-son-declareregister-y-declareunregister","1. ¿Qué son ",[551,56506,54480],{},[551,56508,56399],{},[331,56510,56512],{"id":56511},"_11-definiciones","1.1 Definiciones",[13,56514,56515,56519,56520,56523],{},[16,56516,56517],{},[551,56518,54480],{},": Atributo que marca un método que se ejecuta automáticamente cuando EPLAN ",[16,56521,56522],{},"carga"," el script.",[13,56525,56526,56519,56530,56523],{},[16,56527,56528],{},[551,56529,56399],{},[16,56531,56532],{},"descarga",[13,56534,56535],{},[16,56536,49878],{},[126,56538,56539,56547],{},[88,56540,56541,56543,56544,56546],{},[54,56542,49931],{}," es como el ",[16,56545,37573],{}," de una aplicación",[88,56548,56549,56543,56551,56554],{},[54,56550,49935],{},[16,56552,56553],{},"destructor"," o método Dispose",[331,56556,52047],{"id":52046},[543,56558,56560],{"className":545,"code":56559,"language":547,"meta":228,"style":228},"[DeclareRegister]\npublic void Register()\n{\n    \u002F\u002F Código de inicialización\n}\n\n[DeclareUnregister]\npublic void UnRegister()\n{\n    \u002F\u002F Código de limpieza\n}\n",[54,56561,56562,56567,56572,56576,56581,56585,56589,56594,56599,56603,56608],{"__ignoreMap":228},[551,56563,56564],{"class":553,"line":554},[551,56565,56566],{},"[DeclareRegister]\n",[551,56568,56569],{"class":553,"line":229},[551,56570,56571],{},"public void Register()\n",[551,56573,56574],{"class":553,"line":670},[551,56575,1151],{},[551,56577,56578],{"class":553,"line":1136},[551,56579,56580],{},"    \u002F\u002F Código de inicialización\n",[551,56582,56583],{"class":553,"line":1142},[551,56584,1193],{},[551,56586,56587],{"class":553,"line":1148},[551,56588,1139],{"emptyLinePlaceholder":238},[551,56590,56591],{"class":553,"line":1154},[551,56592,56593],{},"[DeclareUnregister]\n",[551,56595,56596],{"class":553,"line":1160},[551,56597,56598],{},"public void UnRegister()\n",[551,56600,56601],{"class":553,"line":1166},[551,56602,1151],{},[551,56604,56605],{"class":553,"line":1172},[551,56606,56607],{},"    \u002F\u002F Código de limpieza\n",[551,56609,56610],{"class":553,"line":1178},[551,56611,1193],{},[13,56613,56614],{},[16,56615,52078],{},[126,56617,56618,56621,56624,56627],{},[88,56619,56620],{},"Métodos públicos sin parámetros",[88,56622,56623],{},"Devuelven void",[88,56625,56626],{},"Los nombres pueden ser cualquiera, pero por convención se usan Register\u002FUnRegister",[88,56628,56629,56630,56632,56633,50041],{},"Solo puede haber un ",[551,56631,54480],{}," y un ",[551,56634,56399],{},[331,56636,56638],{"id":56637},"_13-dónde-se-definen","1.3 ¿Dónde se definen?",[13,56640,56641],{},"Están en el mismo namespace que los otros atributos:",[543,56643,56644],{"className":545,"code":49898,"language":547,"meta":228,"style":228},[54,56645,56646],{"__ignoreMap":228},[551,56647,56648],{"class":553,"line":554},[551,56649,49898],{},[43,56651],{},[46,56653,56655],{"id":56654},"_2-ciclo-de-vida-del-script","2. Ciclo de vida del script",[331,56657,56659],{"id":56658},"_21-cuándo-se-ejecutan","2.1 Cuándo se ejecutan",[13,56661,56662,56666],{},[16,56663,56664],{},[551,56665,54480],{}," se ejecuta:",[126,56668,56669,56672],{},[88,56670,56671],{},"Al iniciar EPLAN (si el script está configurado para carga automática)",[88,56673,56674],{},"Al ejecutar manualmente el script por primera vez",[13,56676,56677,56666],{},[16,56678,56679],{},[551,56680,56399],{},[126,56682,56683,56686],{},[88,56684,56685],{},"Al cerrar EPLAN",[88,56687,56688],{},"Al descargar manualmente el script",[331,56690,56692],{"id":56691},"_22-diagrama-del-ciclo-de-vida","2.2 Diagrama del ciclo de vida",[543,56694,56697],{"className":56695,"code":56696,"language":847},[845],"┌─────────────────────────────────────────────┐\n│         INICIO DE EPLAN                     │\n└─────────────────┬───────────────────────────┘\n                  │\n                  ▼\n         ┌────────────────────┐\n         │  [DeclareRegister] │ ← Inicialización\n         └────────┬───────────┘\n                  │\n                  ▼\n         ┌────────────────────┐\n         │   Script activo    │\n         │  - [DeclareAction] │\n         │  - [EventHandler]  │\n         └────────┬───────────┘\n                  │\n                  ▼\n       ┌──────────────────────┐\n       │ [DeclareUnregister]  │ ← Limpieza\n       └──────────┬───────────┘\n                  │\n                  ▼\n         ┌────────────────────┐\n         │    CIERRE DE EPLAN  │\n         └────────────────────┘\n",[54,56698,56696],{"__ignoreMap":228},[43,56700],{},[46,56702,56704],{"id":56703},"_3-tu-primer-script-con-registerunregister","3. Tu primer script con Register\u002FUnregister",[331,56706,56708],{"id":56707},"_31-ejemplo-básico","3.1 Ejemplo básico",[13,56710,56711,56712,416],{},"Este ejemplo está basado directamente en ",[54,56713,56714],{},"EPLAN-Scripting-4.0\u002F01_FirstSteps\u002F04_DeclareRegisterUnregister.cs",[543,56716,56718],{"className":545,"code":56717,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class RegisterBasico\n{\n    [DeclareRegister]\n    public void Register()\n    {\n        MessageBox.Show(\"Script loaded.\");\n    }\n\n    [DeclareUnregister]\n    public void UnRegister()\n    {\n        MessageBox.Show(\"Script unloaded.\");\n    }\n}\n",[54,56719,56720,56724,56728,56732,56737,56741,56746,56751,56755,56760,56764,56768,56773,56778,56782,56787,56791],{"__ignoreMap":228},[551,56721,56722],{"class":553,"line":554},[551,56723,50105],{},[551,56725,56726],{"class":553,"line":229},[551,56727,49898],{},[551,56729,56730],{"class":553,"line":670},[551,56731,1139],{"emptyLinePlaceholder":238},[551,56733,56734],{"class":553,"line":1136},[551,56735,56736],{},"public class RegisterBasico\n",[551,56738,56739],{"class":553,"line":1142},[551,56740,1151],{},[551,56742,56743],{"class":553,"line":1148},[551,56744,56745],{},"    [DeclareRegister]\n",[551,56747,56748],{"class":553,"line":1154},[551,56749,56750],{},"    public void Register()\n",[551,56752,56753],{"class":553,"line":1160},[551,56754,1169],{},[551,56756,56757],{"class":553,"line":1166},[551,56758,56759],{},"        MessageBox.Show(\"Script loaded.\");\n",[551,56761,56762],{"class":553,"line":1172},[551,56763,1187],{},[551,56765,56766],{"class":553,"line":1178},[551,56767,1139],{"emptyLinePlaceholder":238},[551,56769,56770],{"class":553,"line":1184},[551,56771,56772],{},"    [DeclareUnregister]\n",[551,56774,56775],{"class":553,"line":1190},[551,56776,56777],{},"    public void UnRegister()\n",[551,56779,56780],{"class":553,"line":1472},[551,56781,1169],{},[551,56783,56784],{"class":553,"line":1477},[551,56785,56786],{},"        MessageBox.Show(\"Script unloaded.\");\n",[551,56788,56789],{"class":553,"line":1797},[551,56790,1187],{},[551,56792,56793],{"class":553,"line":1802},[551,56794,1193],{},[331,56796,56798],{"id":56797},"_32-cómo-probar-este-script","3.2 ¿Cómo probar este script?",[13,56800,56801],{},[16,56802,56803],{},"Paso 1: Ejecutar el script",[126,56805,56806,56809,56812],{},[88,56807,56808],{},"Utilidades > Scripts > Ejecutar",[88,56810,56811],{},"Seleccionar el archivo .cs",[88,56813,56814],{},"Verás el mensaje \"Script loaded.\"",[13,56816,56817],{},[16,56818,56819],{},"Paso 2: Cerrar EPLAN",[126,56821,56822],{},[88,56823,56824],{},"Al cerrar EPLAN, verás el mensaje \"Script unloaded.\"",[13,56826,56827],{},[16,56828,56829],{},"Paso 3: Configurar carga automática",[126,56831,56832,56835,56838],{},[88,56833,56834],{},"Copia el script a la carpeta de scripts de EPLAN",[88,56836,56837],{},"Configura EPLAN para cargar scripts al inicio",[88,56839,56840],{},"La próxima vez que abras EPLAN, verás \"Script loaded.\" automáticamente",[43,56842],{},[46,56844,56846],{"id":56845},"_4-casos-de-uso-típicos","4. Casos de uso típicos",[331,56848,56850],{"id":56849},"_41-registrar-event-handlers-permanentemente","4.1 Registrar event handlers permanentemente",[13,56852,56853],{},"Uno de los usos más comunes es registrar event handlers para que persistan entre sesiones:",[543,56855,56857],{"className":545,"code":56856,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class EventHandlerPermanente\n{\n    [DeclareRegister]\n    public void Register()\n    {\n        \u002F\u002F Al cargar el script, los event handlers se registran automáticamente\n        MessageBox.Show(\"Event handlers registrados\");\n    }\n\n    [DeclareUnregister]\n    public void UnRegister()\n    {\n        \u002F\u002F Limpieza al cerrar\n        MessageBox.Show(\"Event handlers desregistrados\");\n    }\n\n    [DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n    public void AlCerrarProyecto()\n    {\n        MessageBox.Show(\"Proyecto cerrándose\");\n    }\n}\n",[54,56858,56859,56863,56867,56871,56876,56880,56884,56888,56892,56897,56902,56906,56910,56914,56918,56922,56927,56932,56936,56940,56944,56948,56952,56957,56961],{"__ignoreMap":228},[551,56860,56861],{"class":553,"line":554},[551,56862,50105],{},[551,56864,56865],{"class":553,"line":229},[551,56866,49898],{},[551,56868,56869],{"class":553,"line":670},[551,56870,1139],{"emptyLinePlaceholder":238},[551,56872,56873],{"class":553,"line":1136},[551,56874,56875],{},"public class EventHandlerPermanente\n",[551,56877,56878],{"class":553,"line":1142},[551,56879,1151],{},[551,56881,56882],{"class":553,"line":1148},[551,56883,56745],{},[551,56885,56886],{"class":553,"line":1154},[551,56887,56750],{},[551,56889,56890],{"class":553,"line":1160},[551,56891,1169],{},[551,56893,56894],{"class":553,"line":1166},[551,56895,56896],{},"        \u002F\u002F Al cargar el script, los event handlers se registran automáticamente\n",[551,56898,56899],{"class":553,"line":1172},[551,56900,56901],{},"        MessageBox.Show(\"Event handlers registrados\");\n",[551,56903,56904],{"class":553,"line":1178},[551,56905,1187],{},[551,56907,56908],{"class":553,"line":1184},[551,56909,1139],{"emptyLinePlaceholder":238},[551,56911,56912],{"class":553,"line":1190},[551,56913,56772],{},[551,56915,56916],{"class":553,"line":1472},[551,56917,56777],{},[551,56919,56920],{"class":553,"line":1477},[551,56921,1169],{},[551,56923,56924],{"class":553,"line":1797},[551,56925,56926],{},"        \u002F\u002F Limpieza al cerrar\n",[551,56928,56929],{"class":553,"line":1802},[551,56930,56931],{},"        MessageBox.Show(\"Event handlers desregistrados\");\n",[551,56933,56934],{"class":553,"line":1808},[551,56935,1187],{},[551,56937,56938],{"class":553,"line":1814},[551,56939,1139],{"emptyLinePlaceholder":238},[551,56941,56942],{"class":553,"line":1820},[551,56943,55577],{},[551,56945,56946],{"class":553,"line":1826},[551,56947,54982],{},[551,56949,56950],{"class":553,"line":1832},[551,56951,1169],{},[551,56953,56954],{"class":553,"line":1838},[551,56955,56956],{},"        MessageBox.Show(\"Proyecto cerrándose\");\n",[551,56958,56959],{"class":553,"line":1844},[551,56960,1187],{},[551,56962,56963],{"class":553,"line":1850},[551,56964,1193],{},[13,56966,56967,56970],{},[16,56968,56969],{},"Ventaja:"," El event handler estará activo siempre que EPLAN esté abierto, sin necesidad de ejecutar el script manualmente cada vez.",[331,56972,56974],{"id":56973},"_42-crear-elementos-de-ribbon-permanentes","4.2 Crear elementos de Ribbon permanentes",[13,56976,56977,56978,56980],{},"Los scripts con ",[551,56979,54480],{}," pueden crear pestañas, grupos y botones en la cinta de opciones automáticamente.",[13,56982,56983,56984,416],{},"Este ejemplo está simplificado de ",[54,56985,56986],{},"EPLAN-Scripting-4.0\u002F07_RibbonContextMenus\u002F01_Ribbon.cs",[543,56988,56990],{"className":545,"code":56989,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Gui;\nusing Eplan.EplApi.Scripting;\n\npublic class CrearRibbon\n{\n    private const string ACTION_NAME = \"MiAccion\";\n\n    [DeclareRegister]\n    public void Register()\n    {\n        \u002F\u002F Crear elementos de Ribbon al cargar\n        RibbonBar ribbonBar = new RibbonBar();\n\n        \u002F\u002F Crear tab con MultiLangString\n        MultiLangString tabName = new MultiLangString();\n        tabName.AddString(ISOCode.Language.L_en_US, \"My Tab\");\n\n        RibbonTab ribbonTab = ribbonBar.GetTab(tabName, true);\n        if (ribbonTab == null)\n        {\n            ribbonTab = ribbonBar.AddTab(tabName);\n        }\n\n        \u002F\u002F Agregar grupo de comandos\n        RibbonCommandGroup group = ribbonTab.AddCommandGroup(\"My Group\");\n\n        \u002F\u002F Agregar botón con acción\n        RibbonIcon icon = new RibbonIcon(CommandIcon.Accumulator);\n        group.AddCommand(\"My Action\", ACTION_NAME, icon);\n    }\n\n    [DeclareUnregister]\n    public void UnRegister()\n    {\n        \u002F\u002F Limpiar elementos del Ribbon al descargar\n        RibbonBar ribbonBar = new RibbonBar();\n\n        MultiLangString tabName = new MultiLangString();\n        tabName.AddString(ISOCode.Language.L_en_US, \"My Tab\");\n\n        RibbonTab ribbonTab = ribbonBar.GetTab(tabName, true);\n        if (ribbonTab != null)\n        {\n            ribbonTab.Remove();\n        }\n    }\n\n    [DeclareAction(ACTION_NAME)]\n    public void Function()\n    {\n        MessageBox.Show(\"Action was executed!\");\n    }\n}\n",[54,56991,56992,56996,57000,57005,57009,57013,57018,57022,57027,57031,57035,57039,57043,57048,57053,57057,57062,57067,57072,57076,57081,57086,57090,57095,57099,57103,57108,57113,57117,57122,57127,57132,57136,57140,57144,57148,57152,57157,57161,57165,57169,57173,57177,57181,57186,57190,57195,57199,57203,57207,57212,57217,57221,57226,57230],{"__ignoreMap":228},[551,56993,56994],{"class":553,"line":554},[551,56995,50105],{},[551,56997,56998],{"class":553,"line":229},[551,56999,1128],{},[551,57001,57002],{"class":553,"line":670},[551,57003,57004],{},"using Eplan.EplApi.Gui;\n",[551,57006,57007],{"class":553,"line":1136},[551,57008,49898],{},[551,57010,57011],{"class":553,"line":1142},[551,57012,1139],{"emptyLinePlaceholder":238},[551,57014,57015],{"class":553,"line":1148},[551,57016,57017],{},"public class CrearRibbon\n",[551,57019,57020],{"class":553,"line":1154},[551,57021,1151],{},[551,57023,57024],{"class":553,"line":1160},[551,57025,57026],{},"    private const string ACTION_NAME = \"MiAccion\";\n",[551,57028,57029],{"class":553,"line":1166},[551,57030,1139],{"emptyLinePlaceholder":238},[551,57032,57033],{"class":553,"line":1172},[551,57034,56745],{},[551,57036,57037],{"class":553,"line":1178},[551,57038,56750],{},[551,57040,57041],{"class":553,"line":1184},[551,57042,1169],{},[551,57044,57045],{"class":553,"line":1190},[551,57046,57047],{},"        \u002F\u002F Crear elementos de Ribbon al cargar\n",[551,57049,57050],{"class":553,"line":1472},[551,57051,57052],{},"        RibbonBar ribbonBar = new RibbonBar();\n",[551,57054,57055],{"class":553,"line":1477},[551,57056,1139],{"emptyLinePlaceholder":238},[551,57058,57059],{"class":553,"line":1797},[551,57060,57061],{},"        \u002F\u002F Crear tab con MultiLangString\n",[551,57063,57064],{"class":553,"line":1802},[551,57065,57066],{},"        MultiLangString tabName = new MultiLangString();\n",[551,57068,57069],{"class":553,"line":1808},[551,57070,57071],{},"        tabName.AddString(ISOCode.Language.L_en_US, \"My Tab\");\n",[551,57073,57074],{"class":553,"line":1814},[551,57075,1139],{"emptyLinePlaceholder":238},[551,57077,57078],{"class":553,"line":1820},[551,57079,57080],{},"        RibbonTab ribbonTab = ribbonBar.GetTab(tabName, true);\n",[551,57082,57083],{"class":553,"line":1826},[551,57084,57085],{},"        if (ribbonTab == null)\n",[551,57087,57088],{"class":553,"line":1832},[551,57089,9062],{},[551,57091,57092],{"class":553,"line":1838},[551,57093,57094],{},"            ribbonTab = ribbonBar.AddTab(tabName);\n",[551,57096,57097],{"class":553,"line":1844},[551,57098,9077],{},[551,57100,57101],{"class":553,"line":1850},[551,57102,1139],{"emptyLinePlaceholder":238},[551,57104,57105],{"class":553,"line":1855},[551,57106,57107],{},"        \u002F\u002F Agregar grupo de comandos\n",[551,57109,57110],{"class":553,"line":1861},[551,57111,57112],{},"        RibbonCommandGroup group = ribbonTab.AddCommandGroup(\"My Group\");\n",[551,57114,57115],{"class":553,"line":1867},[551,57116,1139],{"emptyLinePlaceholder":238},[551,57118,57119],{"class":553,"line":1873},[551,57120,57121],{},"        \u002F\u002F Agregar botón con acción\n",[551,57123,57124],{"class":553,"line":1878},[551,57125,57126],{},"        RibbonIcon icon = new RibbonIcon(CommandIcon.Accumulator);\n",[551,57128,57129],{"class":553,"line":1883},[551,57130,57131],{},"        group.AddCommand(\"My Action\", ACTION_NAME, icon);\n",[551,57133,57134],{"class":553,"line":1888},[551,57135,1187],{},[551,57137,57138],{"class":553,"line":4615},[551,57139,1139],{"emptyLinePlaceholder":238},[551,57141,57142],{"class":553,"line":4620},[551,57143,56772],{},[551,57145,57146],{"class":553,"line":4626},[551,57147,56777],{},[551,57149,57150],{"class":553,"line":4631},[551,57151,1169],{},[551,57153,57154],{"class":553,"line":4636},[551,57155,57156],{},"        \u002F\u002F Limpiar elementos del Ribbon al descargar\n",[551,57158,57159],{"class":553,"line":4641},[551,57160,57052],{},[551,57162,57163],{"class":553,"line":4647},[551,57164,1139],{"emptyLinePlaceholder":238},[551,57166,57167],{"class":553,"line":4653},[551,57168,57066],{},[551,57170,57171],{"class":553,"line":4659},[551,57172,57071],{},[551,57174,57175],{"class":553,"line":4665},[551,57176,1139],{"emptyLinePlaceholder":238},[551,57178,57179],{"class":553,"line":4671},[551,57180,57080],{},[551,57182,57183],{"class":553,"line":4677},[551,57184,57185],{},"        if (ribbonTab != null)\n",[551,57187,57188],{"class":553,"line":4683},[551,57189,9062],{},[551,57191,57192],{"class":553,"line":4689},[551,57193,57194],{},"            ribbonTab.Remove();\n",[551,57196,57197],{"class":553,"line":4695},[551,57198,9077],{},[551,57200,57201],{"class":553,"line":4701},[551,57202,1187],{},[551,57204,57205],{"class":553,"line":4707},[551,57206,1139],{"emptyLinePlaceholder":238},[551,57208,57209],{"class":553,"line":4713},[551,57210,57211],{},"    [DeclareAction(ACTION_NAME)]\n",[551,57213,57214],{"class":553,"line":4719},[551,57215,57216],{},"    public void Function()\n",[551,57218,57219],{"class":553,"line":4725},[551,57220,1169],{},[551,57222,57223],{"class":553,"line":4731},[551,57224,57225],{},"        MessageBox.Show(\"Action was executed!\");\n",[551,57227,57228],{"class":553,"line":4737},[551,57229,1187],{},[551,57231,57232],{"class":553,"line":4743},[551,57233,1193],{},[13,57235,57236,57239],{},[16,57237,57238],{},"Resultado:"," Al cargar EPLAN, aparecerá automáticamente una nueva pestaña \"My Tab\" con un botón que ejecuta tu acción.",[43,57241],{},[46,57243,57245],{"id":57244},"_5-combinar-con-otros-atributos","5. Combinar con otros atributos",[331,57247,57249],{"id":57248},"_51-register-action-eventhandler","5.1 Register + Action + EventHandler",[13,57251,57252,57253,57255],{},"Puedes combinar ",[551,57254,54480],{}," con otros atributos en el mismo script:",[543,57257,57259],{"className":545,"code":57258,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class ScriptCompleto\n{\n    \u002F\u002F Inicialización: Se ejecuta al cargar\n    [DeclareRegister]\n    public void Register()\n    {\n        MessageBox.Show(\"Script cargado y listo\");\n    }\n\n    \u002F\u002F Limpieza: Se ejecuta al descargar\n    [DeclareUnregister]\n    public void UnRegister()\n    {\n        MessageBox.Show(\"Script descargado\");\n    }\n\n    \u002F\u002F Acción: Se ejecuta al llamar por nombre\n    [DeclareAction(\"MiAccion\")]\n    public void MiAccion()\n    {\n        MessageBox.Show(\"Acción ejecutada\");\n    }\n\n    \u002F\u002F Event Handler: Se ejecuta automáticamente al cerrar proyecto\n    [DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n    public void AlCerrarProyecto()\n    {\n        MessageBox.Show(\"Cerrando proyecto\");\n    }\n\n    \u002F\u002F Start: Se ejecuta al ejecutar el script manualmente\n    [Start]\n    public void Ejecutar()\n    {\n        MessageBox.Show(\"Script ejecutado manualmente\");\n    }\n}\n",[54,57260,57261,57265,57269,57273,57278,57282,57287,57291,57295,57299,57304,57308,57312,57317,57321,57325,57329,57334,57338,57342,57347,57352,57356,57360,57364,57368,57372,57377,57381,57385,57389,57394,57398,57402,57407,57411,57415,57419,57424,57428],{"__ignoreMap":228},[551,57262,57263],{"class":553,"line":554},[551,57264,50105],{},[551,57266,57267],{"class":553,"line":229},[551,57268,49898],{},[551,57270,57271],{"class":553,"line":670},[551,57272,1139],{"emptyLinePlaceholder":238},[551,57274,57275],{"class":553,"line":1136},[551,57276,57277],{},"public class ScriptCompleto\n",[551,57279,57280],{"class":553,"line":1142},[551,57281,1151],{},[551,57283,57284],{"class":553,"line":1148},[551,57285,57286],{},"    \u002F\u002F Inicialización: Se ejecuta al cargar\n",[551,57288,57289],{"class":553,"line":1154},[551,57290,56745],{},[551,57292,57293],{"class":553,"line":1160},[551,57294,56750],{},[551,57296,57297],{"class":553,"line":1166},[551,57298,1169],{},[551,57300,57301],{"class":553,"line":1172},[551,57302,57303],{},"        MessageBox.Show(\"Script cargado y listo\");\n",[551,57305,57306],{"class":553,"line":1178},[551,57307,1187],{},[551,57309,57310],{"class":553,"line":1184},[551,57311,1139],{"emptyLinePlaceholder":238},[551,57313,57314],{"class":553,"line":1190},[551,57315,57316],{},"    \u002F\u002F Limpieza: Se ejecuta al descargar\n",[551,57318,57319],{"class":553,"line":1472},[551,57320,56772],{},[551,57322,57323],{"class":553,"line":1477},[551,57324,56777],{},[551,57326,57327],{"class":553,"line":1797},[551,57328,1169],{},[551,57330,57331],{"class":553,"line":1802},[551,57332,57333],{},"        MessageBox.Show(\"Script descargado\");\n",[551,57335,57336],{"class":553,"line":1808},[551,57337,1187],{},[551,57339,57340],{"class":553,"line":1814},[551,57341,1139],{"emptyLinePlaceholder":238},[551,57343,57344],{"class":553,"line":1820},[551,57345,57346],{},"    \u002F\u002F Acción: Se ejecuta al llamar por nombre\n",[551,57348,57349],{"class":553,"line":1826},[551,57350,57351],{},"    [DeclareAction(\"MiAccion\")]\n",[551,57353,57354],{"class":553,"line":1832},[551,57355,52911],{},[551,57357,57358],{"class":553,"line":1838},[551,57359,1169],{},[551,57361,57362],{"class":553,"line":1844},[551,57363,52350],{},[551,57365,57366],{"class":553,"line":1850},[551,57367,1187],{},[551,57369,57370],{"class":553,"line":1855},[551,57371,1139],{"emptyLinePlaceholder":238},[551,57373,57374],{"class":553,"line":1861},[551,57375,57376],{},"    \u002F\u002F Event Handler: Se ejecuta automáticamente al cerrar proyecto\n",[551,57378,57379],{"class":553,"line":1867},[551,57380,55577],{},[551,57382,57383],{"class":553,"line":1873},[551,57384,54982],{},[551,57386,57387],{"class":553,"line":1878},[551,57388,1169],{},[551,57390,57391],{"class":553,"line":1883},[551,57392,57393],{},"        MessageBox.Show(\"Cerrando proyecto\");\n",[551,57395,57396],{"class":553,"line":1888},[551,57397,1187],{},[551,57399,57400],{"class":553,"line":4615},[551,57401,1139],{"emptyLinePlaceholder":238},[551,57403,57404],{"class":553,"line":4620},[551,57405,57406],{},"    \u002F\u002F Start: Se ejecuta al ejecutar el script manualmente\n",[551,57408,57409],{"class":553,"line":4626},[551,57410,1157],{},[551,57412,57413],{"class":553,"line":4631},[551,57414,1163],{},[551,57416,57417],{"class":553,"line":4636},[551,57418,1169],{},[551,57420,57421],{"class":553,"line":4641},[551,57422,57423],{},"        MessageBox.Show(\"Script ejecutado manualmente\");\n",[551,57425,57426],{"class":553,"line":4647},[551,57427,1187],{},[551,57429,57430],{"class":553,"line":4653},[551,57431,1193],{},[13,57433,57434],{},[16,57435,57436],{},"Flujo de ejecución:",[85,57438,57439,57446,57452,57458,57464],{},[88,57440,57441,57442,57445],{},"Al iniciar EPLAN: ",[54,57443,57444],{},"Register()"," se ejecuta",[88,57447,57448,57449,57451],{},"Si ejecutas el .cs: ",[54,57450,50286],{}," se ejecuta (además de Register si es la primera vez)",[88,57453,57454,57455,57445],{},"Si llamas \"MiAccion\": ",[54,57456,57457],{},"MiAccion()",[88,57459,57460,57461,57445],{},"Al cerrar proyecto: ",[54,57462,57463],{},"AlCerrarProyecto()",[88,57465,57466,57467,57445],{},"Al cerrar EPLAN: ",[54,57468,57469],{},"UnRegister()",[43,57471],{},[46,57473,57475],{"id":57474},"_6-configurar-carga-automática-en-eplan","6. Configurar carga automática en EPLAN",[331,57477,57479],{"id":57478},"_61-ubicación-de-scripts","6.1 Ubicación de scripts",[13,57481,57482],{},"Para que un script se cargue automáticamente, debe estar en una de estas ubicaciones:",[543,57484,57487],{"className":57485,"code":57486,"language":847},[845],"C:\\Users\\[TuUsuario]\\EPLAN\\Scripts\\\n",[54,57488,57486],{"__ignoreMap":228},[13,57490,57491],{},"O en la carpeta de scripts configurada en EPLAN.",[331,57493,57495],{"id":57494},"_62-verificar-configuración","6.2 Verificar configuración",[85,57497,57498,57500,57503],{},[88,57499,892],{},[88,57501,57502],{},"Ve a: Opciones > Configuración > Usuario > Gestión > Scripts",[88,57504,57505],{},"Verifica que la opción de carga automática esté activada",[331,57507,57509],{"id":57508},"_63-ver-scripts-cargados","6.3 Ver scripts cargados",[13,57511,57512],{},"Para ver qué scripts están actualmente cargados:",[126,57514,57515],{},[88,57516,57517],{},"Utilidades > Scripts > Gestionar scripts cargados",[13,57519,57520],{},"Aquí puedes ver, cargar y descargar scripts manualmente.",[43,57522],{},[46,57524,57526],{"id":57525},"_7-buenas-prácticas","7. Buenas prácticas",[331,57528,57530],{"id":57529},"_71-mantén-register-rápido","7.1 Mantén Register rápido",[13,57532,57533],{},"El método Register se ejecuta al iniciar EPLAN. Si tarda mucho, retrasará el inicio.",[13,57535,57536],{},[16,57537,57538],{},"Mal:",[543,57540,57542],{"className":545,"code":57541,"language":547,"meta":228,"style":228},"[DeclareRegister]\npublic void Register()\n{\n    \u002F\u002F Operación muy lenta\n    for (int i = 0; i \u003C 10000000; i++)\n    {\n        \u002F\u002F procesamiento pesado\n    }\n}\n",[54,57543,57544,57548,57552,57556,57561,57566,57570,57575,57579],{"__ignoreMap":228},[551,57545,57546],{"class":553,"line":554},[551,57547,56566],{},[551,57549,57550],{"class":553,"line":229},[551,57551,56571],{},[551,57553,57554],{"class":553,"line":670},[551,57555,1151],{},[551,57557,57558],{"class":553,"line":1136},[551,57559,57560],{},"    \u002F\u002F Operación muy lenta\n",[551,57562,57563],{"class":553,"line":1142},[551,57564,57565],{},"    for (int i = 0; i \u003C 10000000; i++)\n",[551,57567,57568],{"class":553,"line":1148},[551,57569,1169],{},[551,57571,57572],{"class":553,"line":1154},[551,57573,57574],{},"        \u002F\u002F procesamiento pesado\n",[551,57576,57577],{"class":553,"line":1160},[551,57578,1187],{},[551,57580,57581],{"class":553,"line":1166},[551,57582,1193],{},[13,57584,57585],{},[16,57586,57587],{},"Bien:",[543,57589,57591],{"className":545,"code":57590,"language":547,"meta":228,"style":228},"[DeclareRegister]\npublic void Register()\n{\n    \u002F\u002F Solo configuración básica y rápida\n    Settings settings = new Settings();\n    settings.SetBoolSetting(\"USER.MiConfiguracion\", true, 0);\n}\n",[54,57592,57593,57597,57601,57605,57610,57615,57620],{"__ignoreMap":228},[551,57594,57595],{"class":553,"line":554},[551,57596,56566],{},[551,57598,57599],{"class":553,"line":229},[551,57600,56571],{},[551,57602,57603],{"class":553,"line":670},[551,57604,1151],{},[551,57606,57607],{"class":553,"line":1136},[551,57608,57609],{},"    \u002F\u002F Solo configuración básica y rápida\n",[551,57611,57612],{"class":553,"line":1142},[551,57613,57614],{},"    Settings settings = new Settings();\n",[551,57616,57617],{"class":553,"line":1148},[551,57618,57619],{},"    settings.SetBoolSetting(\"USER.MiConfiguracion\", true, 0);\n",[551,57621,57622],{"class":553,"line":1154},[551,57623,1193],{},[331,57625,57627],{"id":57626},"_72-siempre-implementa-unregister","7.2 Siempre implementa UnRegister",[13,57629,57630],{},"Si creas recursos en Register (archivos, conexiones, elementos de UI), límpialos en UnRegister.",[13,57632,57633,57636],{},[16,57634,57635],{},"Principio:"," Si lo creas en Register, destrúyelo en UnRegister.",[543,57638,57640],{"className":545,"code":57639,"language":547,"meta":228,"style":228},"[DeclareRegister]\npublic void Register()\n{\n    \u002F\u002F Crear ribbon tab\n    RibbonBar ribbonBar = new RibbonBar();\n    ribbonTab = ribbonBar.AddTab(tabName);\n}\n\n[DeclareUnregister]\npublic void UnRegister()\n{\n    \u002F\u002F Remover ribbon tab\n    if (ribbonTab != null)\n    {\n        ribbonTab.Remove();\n    }\n}\n",[54,57641,57642,57646,57650,57654,57659,57664,57669,57673,57677,57681,57685,57689,57694,57699,57703,57708,57712],{"__ignoreMap":228},[551,57643,57644],{"class":553,"line":554},[551,57645,56566],{},[551,57647,57648],{"class":553,"line":229},[551,57649,56571],{},[551,57651,57652],{"class":553,"line":670},[551,57653,1151],{},[551,57655,57656],{"class":553,"line":1136},[551,57657,57658],{},"    \u002F\u002F Crear ribbon tab\n",[551,57660,57661],{"class":553,"line":1142},[551,57662,57663],{},"    RibbonBar ribbonBar = new RibbonBar();\n",[551,57665,57666],{"class":553,"line":1148},[551,57667,57668],{},"    ribbonTab = ribbonBar.AddTab(tabName);\n",[551,57670,57671],{"class":553,"line":1154},[551,57672,1193],{},[551,57674,57675],{"class":553,"line":1160},[551,57676,1139],{"emptyLinePlaceholder":238},[551,57678,57679],{"class":553,"line":1166},[551,57680,56593],{},[551,57682,57683],{"class":553,"line":1172},[551,57684,56598],{},[551,57686,57687],{"class":553,"line":1178},[551,57688,1151],{},[551,57690,57691],{"class":553,"line":1184},[551,57692,57693],{},"    \u002F\u002F Remover ribbon tab\n",[551,57695,57696],{"class":553,"line":1190},[551,57697,57698],{},"    if (ribbonTab != null)\n",[551,57700,57701],{"class":553,"line":1472},[551,57702,1169],{},[551,57704,57705],{"class":553,"line":1477},[551,57706,57707],{},"        ribbonTab.Remove();\n",[551,57709,57710],{"class":553,"line":1797},[551,57711,1187],{},[551,57713,57714],{"class":553,"line":1802},[551,57715,1193],{},[331,57717,57719],{"id":57718},"_73-manejo-de-errores","7.3 Manejo de errores",[13,57721,57722],{},"Siempre usa try-catch en Register y UnRegister para evitar que un error bloquee EPLAN:",[543,57724,57726],{"className":545,"code":57725,"language":547,"meta":228,"style":228},"[DeclareRegister]\npublic void Register()\n{\n    try\n    {\n        \u002F\u002F Inicialización\n    }\n    catch (Exception ex)\n    {\n        MessageBox.Show(\"Error al cargar: \" + ex.Message);\n    }\n}\n",[54,57727,57728,57732,57736,57740,57744,57748,57753,57757,57761,57765,57770,57774],{"__ignoreMap":228},[551,57729,57730],{"class":553,"line":554},[551,57731,56566],{},[551,57733,57734],{"class":553,"line":229},[551,57735,56571],{},[551,57737,57738],{"class":553,"line":670},[551,57739,1151],{},[551,57741,57742],{"class":553,"line":1136},[551,57743,42869],{},[551,57745,57746],{"class":553,"line":1142},[551,57747,1169],{},[551,57749,57750],{"class":553,"line":1148},[551,57751,57752],{},"        \u002F\u002F Inicialización\n",[551,57754,57755],{"class":553,"line":1154},[551,57756,1187],{},[551,57758,57759],{"class":553,"line":1160},[551,57760,43071],{},[551,57762,57763],{"class":553,"line":1166},[551,57764,1169],{},[551,57766,57767],{"class":553,"line":1172},[551,57768,57769],{},"        MessageBox.Show(\"Error al cargar: \" + ex.Message);\n",[551,57771,57772],{"class":553,"line":1178},[551,57773,1187],{},[551,57775,57776],{"class":553,"line":1184},[551,57777,1193],{},[43,57779],{},[46,57781,57783],{"id":57782},"_8-diferencias-con-otros-atributos","8. Diferencias con otros atributos",[6589,57785,57786,57808],{},[6592,57787,57788],{},[6595,57789,57790,57792,57796,57800,57804],{},[6598,57791,35277],{},[6598,57793,57794],{},[551,57795,54480],{},[6598,57797,57798],{},[551,57799,1300],{},[6598,57801,57802],{},[551,57803,51803],{},[6598,57805,57806],{},[551,57807,54640],{},[6611,57809,57810,57828,57844,57862],{},[6595,57811,57812,57816,57819,57822,57825],{},[6616,57813,57814],{},[16,57815,54920],{},[6616,57817,57818],{},"Al cargar script",[6616,57820,57821],{},"Al ejecutar .cs",[6616,57823,57824],{},"Al llamar acción",[6616,57826,57827],{},"Al ocurrir evento",[6595,57829,57830,57835,57837,57839,57841],{},[6616,57831,57832],{},[16,57833,57834],{},"Carga automática",[6616,57836,18790],{},[6616,57838,18787],{},[6616,57840,18787],{},[6616,57842,57843],{},"Solo si Register lo carga",[6595,57845,57846,57851,57854,57857,57860],{},[6616,57847,57848],{},[16,57849,57850],{},"Persistencia",[6616,57852,57853],{},"Hasta cerrar EPLAN",[6616,57855,57856],{},"Una vez",[6616,57858,57859],{},"Múltiples veces",[6616,57861,57859],{},[6595,57863,57864,57868,57870,57872,57874],{},[6616,57865,57866],{},[16,57867,6771],{},[6616,57869,23369],{},[6616,57871,52227],{},[6616,57873,52230],{},[6616,57875,54913],{},[43,57877],{},[46,57879,57881],{"id":57880},"_9-proyecto-del-capítulo-suite-de-herramientas-autocargable","9. Proyecto del capítulo: Suite de herramientas autocargable",[331,57883,57885],{"id":57884},"_91-objetivo","9.1 Objetivo",[13,57887,57888],{},"Crear un script que:",[126,57890,57891,57894,57897,57900],{},[88,57892,57893],{},"Se cargue automáticamente al iniciar EPLAN",[88,57895,57896],{},"Registre un event handler permanente",[88,57898,57899],{},"Cree una acción ejecutable",[88,57901,57902],{},"Se limpie correctamente al cerrar",[331,57904,57906],{"id":57905},"_92-implementación-completa","9.2 Implementación completa",[543,57908,57910],{"className":545,"code":57909,"language":547,"meta":228,"style":228},"using System;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class SuiteAutocargable\n{\n    \u002F\u002F Inicialización al cargar EPLAN\n    [DeclareRegister]\n    public void Register()\n    {\n        try\n        {\n            MessageBox.Show(\n                \"Suite de Herramientas cargada.\\n\\n\" +\n                \"Características:\\n\" +\n                \"- Event handler al cerrar proyecto\\n\" +\n                \"- Acción: MostrarInfo\\n\" +\n                \"- Carga automática al iniciar EPLAN\",\n                \"Suite Cargada\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error al cargar: \" + ex.Message);\n        }\n    }\n\n    \u002F\u002F Limpieza al cerrar EPLAN\n    [DeclareUnregister]\n    public void UnRegister()\n    {\n        try\n        {\n            MessageBox.Show(\n                \"Suite de Herramientas descargada correctamente.\",\n                \"Suite Descargada\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error al descargar: \" + ex.Message);\n        }\n    }\n\n    \u002F\u002F Acción ejecutable\n    [DeclareAction(\"MostrarInfo\")]\n    public void MostrarInfo()\n    {\n        try\n        {\n            string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n            string rutaProyecto = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n\n            MessageBox.Show(\n                \"Información del Proyecto:\\n\\n\" +\n                \"Nombre: \" + nombreProyecto + \"\\n\" +\n                \"Ruta: \" + rutaProyecto,\n                \"Información\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n\n    \u002F\u002F Event handler permanente\n    [DeclareEventHandler(\"Eplan.EplApi.OnUserPreCloseProject\")]\n    public void AlCerrarProyecto()\n    {\n        try\n        {\n            DialogResult resultado = MessageBox.Show(\n                \"El proyecto se va a cerrar.\\n\\n¿Deseas continuar?\",\n                \"Confirmación\",\n                MessageBoxButtons.YesNo,\n                MessageBoxIcon.Question\n            );\n\n            \u002F\u002F Nota: Este ejemplo solo muestra confirmación\n            \u002F\u002F No cancela el cierre (eso requiere APIs más avanzadas)\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error en event handler: \" + ex.Message);\n        }\n    }\n}\n",[54,57911,57912,57916,57920,57924,57928,57932,57937,57941,57946,57950,57954,57958,57962,57966,57970,57975,57980,57985,57990,57995,58000,58004,58008,58012,58016,58020,58024,58029,58033,58037,58041,58046,58050,58054,58058,58062,58066,58070,58075,58080,58084,58088,58092,58096,58100,58104,58109,58113,58117,58121,58126,58131,58135,58139,58143,58147,58152,58156,58160,58164,58169,58174,58179,58184,58188,58192,58196,58200,58204,58208,58212,58216,58220,58224,58229,58233,58237,58241,58245,58249,58254,58259,58264,58269,58274,58278,58282,58287,58292,58296,58300,58304,58309,58313,58317],{"__ignoreMap":228},[551,57913,57914],{"class":553,"line":554},[551,57915,1123],{},[551,57917,57918],{"class":553,"line":229},[551,57919,50105],{},[551,57921,57922],{"class":553,"line":670},[551,57923,1128],{},[551,57925,57926],{"class":553,"line":1136},[551,57927,49898],{},[551,57929,57930],{"class":553,"line":1142},[551,57931,1139],{"emptyLinePlaceholder":238},[551,57933,57934],{"class":553,"line":1148},[551,57935,57936],{},"public class SuiteAutocargable\n",[551,57938,57939],{"class":553,"line":1154},[551,57940,1151],{},[551,57942,57943],{"class":553,"line":1160},[551,57944,57945],{},"    \u002F\u002F Inicialización al cargar EPLAN\n",[551,57947,57948],{"class":553,"line":1166},[551,57949,56745],{},[551,57951,57952],{"class":553,"line":1172},[551,57953,56750],{},[551,57955,57956],{"class":553,"line":1178},[551,57957,1169],{},[551,57959,57960],{"class":553,"line":1184},[551,57961,41211],{},[551,57963,57964],{"class":553,"line":1190},[551,57965,9062],{},[551,57967,57968],{"class":553,"line":1472},[551,57969,53598],{},[551,57971,57972],{"class":553,"line":1477},[551,57973,57974],{},"                \"Suite de Herramientas cargada.\\n\\n\" +\n",[551,57976,57977],{"class":553,"line":1797},[551,57978,57979],{},"                \"Características:\\n\" +\n",[551,57981,57982],{"class":553,"line":1802},[551,57983,57984],{},"                \"- Event handler al cerrar proyecto\\n\" +\n",[551,57986,57987],{"class":553,"line":1808},[551,57988,57989],{},"                \"- Acción: MostrarInfo\\n\" +\n",[551,57991,57992],{"class":553,"line":1814},[551,57993,57994],{},"                \"- Carga automática al iniciar EPLAN\",\n",[551,57996,57997],{"class":553,"line":1820},[551,57998,57999],{},"                \"Suite Cargada\",\n",[551,58001,58002],{"class":553,"line":1826},[551,58003,53613],{},[551,58005,58006],{"class":553,"line":1832},[551,58007,53618],{},[551,58009,58010],{"class":553,"line":1838},[551,58011,53623],{},[551,58013,58014],{"class":553,"line":1844},[551,58015,9077],{},[551,58017,58018],{"class":553,"line":1850},[551,58019,41473],{},[551,58021,58022],{"class":553,"line":1855},[551,58023,9062],{},[551,58025,58026],{"class":553,"line":1861},[551,58027,58028],{},"            MessageBox.Show(\"Error al cargar: \" + ex.Message);\n",[551,58030,58031],{"class":553,"line":1867},[551,58032,9077],{},[551,58034,58035],{"class":553,"line":1873},[551,58036,1187],{},[551,58038,58039],{"class":553,"line":1878},[551,58040,1139],{"emptyLinePlaceholder":238},[551,58042,58043],{"class":553,"line":1883},[551,58044,58045],{},"    \u002F\u002F Limpieza al cerrar EPLAN\n",[551,58047,58048],{"class":553,"line":1888},[551,58049,56772],{},[551,58051,58052],{"class":553,"line":4615},[551,58053,56777],{},[551,58055,58056],{"class":553,"line":4620},[551,58057,1169],{},[551,58059,58060],{"class":553,"line":4626},[551,58061,41211],{},[551,58063,58064],{"class":553,"line":4631},[551,58065,9062],{},[551,58067,58068],{"class":553,"line":4636},[551,58069,53598],{},[551,58071,58072],{"class":553,"line":4641},[551,58073,58074],{},"                \"Suite de Herramientas descargada correctamente.\",\n",[551,58076,58077],{"class":553,"line":4647},[551,58078,58079],{},"                \"Suite Descargada\",\n",[551,58081,58082],{"class":553,"line":4653},[551,58083,53613],{},[551,58085,58086],{"class":553,"line":4659},[551,58087,53618],{},[551,58089,58090],{"class":553,"line":4665},[551,58091,53623],{},[551,58093,58094],{"class":553,"line":4671},[551,58095,9077],{},[551,58097,58098],{"class":553,"line":4677},[551,58099,41473],{},[551,58101,58102],{"class":553,"line":4683},[551,58103,9062],{},[551,58105,58106],{"class":553,"line":4689},[551,58107,58108],{},"            MessageBox.Show(\"Error al descargar: \" + ex.Message);\n",[551,58110,58111],{"class":553,"line":4695},[551,58112,9077],{},[551,58114,58115],{"class":553,"line":4701},[551,58116,1187],{},[551,58118,58119],{"class":553,"line":4707},[551,58120,1139],{"emptyLinePlaceholder":238},[551,58122,58123],{"class":553,"line":4713},[551,58124,58125],{},"    \u002F\u002F Acción ejecutable\n",[551,58127,58128],{"class":553,"line":4719},[551,58129,58130],{},"    [DeclareAction(\"MostrarInfo\")]\n",[551,58132,58133],{"class":553,"line":4725},[551,58134,54074],{},[551,58136,58137],{"class":553,"line":4731},[551,58138,1169],{},[551,58140,58141],{"class":553,"line":4737},[551,58142,41211],{},[551,58144,58145],{"class":553,"line":4743},[551,58146,9062],{},[551,58148,58149],{"class":553,"line":4749},[551,58150,58151],{},"            string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,58153,58154],{"class":553,"line":4755},[551,58155,53706],{},[551,58157,58158],{"class":553,"line":4761},[551,58159,1139],{"emptyLinePlaceholder":238},[551,58161,58162],{"class":553,"line":4766},[551,58163,53598],{},[551,58165,58166],{"class":553,"line":4771},[551,58167,58168],{},"                \"Información del Proyecto:\\n\\n\" +\n",[551,58170,58171],{"class":553,"line":4777},[551,58172,58173],{},"                \"Nombre: \" + nombreProyecto + \"\\n\" +\n",[551,58175,58176],{"class":553,"line":4782},[551,58177,58178],{},"                \"Ruta: \" + rutaProyecto,\n",[551,58180,58181],{"class":553,"line":4787},[551,58182,58183],{},"                \"Información\",\n",[551,58185,58186],{"class":553,"line":4793},[551,58187,53613],{},[551,58189,58190],{"class":553,"line":4799},[551,58191,53618],{},[551,58193,58194],{"class":553,"line":4805},[551,58195,53623],{},[551,58197,58198],{"class":553,"line":4811},[551,58199,9077],{},[551,58201,58202],{"class":553,"line":4817},[551,58203,41473],{},[551,58205,58206],{"class":553,"line":4822},[551,58207,9062],{},[551,58209,58210],{"class":553,"line":4827},[551,58211,55428],{},[551,58213,58214],{"class":553,"line":9183},[551,58215,9077],{},[551,58217,58218],{"class":553,"line":9188},[551,58219,1187],{},[551,58221,58222],{"class":553,"line":9193},[551,58223,1139],{"emptyLinePlaceholder":238},[551,58225,58226],{"class":553,"line":9198},[551,58227,58228],{},"    \u002F\u002F Event handler permanente\n",[551,58230,58231],{"class":553,"line":9204},[551,58232,55577],{},[551,58234,58235],{"class":553,"line":9209},[551,58236,54982],{},[551,58238,58239],{"class":553,"line":9214},[551,58240,1169],{},[551,58242,58243],{"class":553,"line":9219},[551,58244,41211],{},[551,58246,58247],{"class":553,"line":9224},[551,58248,9062],{},[551,58250,58251],{"class":553,"line":9230},[551,58252,58253],{},"            DialogResult resultado = MessageBox.Show(\n",[551,58255,58256],{"class":553,"line":9236},[551,58257,58258],{},"                \"El proyecto se va a cerrar.\\n\\n¿Deseas continuar?\",\n",[551,58260,58261],{"class":553,"line":9242},[551,58262,58263],{},"                \"Confirmación\",\n",[551,58265,58266],{"class":553,"line":9247},[551,58267,58268],{},"                MessageBoxButtons.YesNo,\n",[551,58270,58271],{"class":553,"line":9253},[551,58272,58273],{},"                MessageBoxIcon.Question\n",[551,58275,58276],{"class":553,"line":9258},[551,58277,53623],{},[551,58279,58280],{"class":553,"line":9264},[551,58281,1139],{"emptyLinePlaceholder":238},[551,58283,58284],{"class":553,"line":9270},[551,58285,58286],{},"            \u002F\u002F Nota: Este ejemplo solo muestra confirmación\n",[551,58288,58289],{"class":553,"line":9275},[551,58290,58291],{},"            \u002F\u002F No cancela el cierre (eso requiere APIs más avanzadas)\n",[551,58293,58294],{"class":553,"line":9281},[551,58295,9077],{},[551,58297,58298],{"class":553,"line":9287},[551,58299,41473],{},[551,58301,58302],{"class":553,"line":9292},[551,58303,9062],{},[551,58305,58306],{"class":553,"line":9297},[551,58307,58308],{},"            MessageBox.Show(\"Error en event handler: \" + ex.Message);\n",[551,58310,58311],{"class":553,"line":9302},[551,58312,9077],{},[551,58314,58315],{"class":553,"line":9308},[551,58316,1187],{},[551,58318,58319],{"class":553,"line":9313},[551,58320,1193],{},[331,58322,58324],{"id":58323},"_93-características-del-proyecto","9.3 Características del proyecto",[13,58326,58327],{},[16,58328,58329],{},"Al iniciar EPLAN:",[126,58331,58332,58335],{},[88,58333,58334],{},"Muestra mensaje de bienvenida",[88,58336,58337],{},"Event handler queda registrado",[13,58339,58340],{},[16,58341,58342],{},"Durante uso:",[126,58344,58345,58348],{},[88,58346,58347],{},"Acción \"MostrarInfo\" disponible en menú",[88,58349,58350],{},"Event handler se ejecuta al cerrar proyectos",[13,58352,58353],{},[16,58354,58355],{},"Al cerrar EPLAN:",[126,58357,58358,58361],{},[88,58359,58360],{},"Muestra mensaje de despedida",[88,58362,58363],{},"Limpieza automática",[43,58365],{},[46,58367,22685],{"id":22684},[13,58369,22688],{},[126,58371,58372,58384,58390,58396,58401,58407],{},[88,58373,58374,58375,4842,58379,58383],{},"Los atributos ",[16,58376,58377],{},[551,58378,54480],{},[16,58380,58381],{},[551,58382,56399],{}," permiten carga automática",[88,58385,58386,58389],{},[16,58387,58388],{},"Register"," se ejecuta al cargar el script (inicio de EPLAN o carga manual)",[88,58391,58392,58395],{},[16,58393,58394],{},"UnRegister"," se ejecuta al descargar (cierre de EPLAN)",[88,58397,56206,58398],{},[16,58399,58400],{},"registrar event handlers permanentes, configurar UI, activar debug",[88,58402,58403,58404,54416],{},"Se pueden ",[16,58405,58406],{},"combinar con otros atributos",[88,58408,58409,58410],{},"Buenas prácticas: ",[16,58411,58412],{},"mantener Register rápido, siempre implementar UnRegister, usar try-catch",[43,58414],{},[46,58416,5728],{"id":5727},[13,58418,58419],{},[16,58420,58421,58422,58424],{},"P: ¿El script con ",[551,58423,54480],{}," se ejecuta siempre al iniciar EPLAN?",[13,58426,58427],{},"R: Solo si está en la carpeta de scripts configurada y la carga automática está activada. De lo contrario, debes cargarlo manualmente una vez.",[13,58429,58430],{},[16,58431,54453,58432,4842,58434,58436],{},[551,58433,1300],{},[551,58435,54480],{}," en el mismo script?",[13,58438,58439,58440,58442,58443,58445],{},"R: Sí. ",[551,58441,54480],{}," se ejecuta al cargar, ",[551,58444,1300],{}," se ejecuta al abrir el .cs manualmente.",[13,58447,58448],{},[16,58449,58450,58451,36151],{},"P: ¿Qué pasa si no implemento ",[551,58452,56399],{},[13,58454,58455],{},"R: No pasa nada malo, pero si Register crea recursos (UI, archivos, conexiones), no se limpiarán correctamente.",[13,58457,58458],{},[16,58459,58460],{},"P: ¿Los event handlers registrados con este método persisten entre sesiones?",[13,58462,58463],{},"R: Sí, mientras el script esté configurado para carga automática, los event handlers estarán activos en cada sesión.",[13,58465,58466],{},[16,58467,58468],{},"P: ¿Puedo descargar el script manualmente?",[13,58470,58471,58472,41],{},"R: Sí, en Utilidades > Scripts > Gestionar scripts cargados. Al descargar, se ejecutará ",[551,58473,56399],{},[43,58475],{},[46,58477,51782],{"id":36078},[331,58479,51786],{"id":51785},[13,58481,58482],{},[16,58483,54513],{},[331,58485,51795],{"id":51794},[13,58487,58488],{},[16,58489,58490],{},"Capítulo 16: Ejecutar un comando simple con CommandLineInterpreter",[13,58492,58493],{},"En el próximo capítulo comenzarás a explorar el CommandLineInterpreter en profundidad, aprendiendo a ejecutar comandos básicos de EPLAN.",[43,58495],{},[13,58497,58498,10676,58500,54528,58502,93,58504,58507,416],{},[31,58499,657],{},[31,58501,10679],{},[31,58503,10683],{},[54,58505,58506],{},"code\u002Fcap-15\u002F",[31,58508,56302],{},[126,58510,58511,58515,58520],{},[88,58512,58513],{},[54,58514,56714],{},[88,58516,58517],{},[54,58518,58519],{},"EPLAN-Scripting-4.0\u002F10_Debug\u002F01_DebugSetting.cs",[88,58521,58522],{},[54,58523,56986],{},[660,58525,662],{},{"title":228,"searchDepth":229,"depth":229,"links":58527},[58528,58529,58530,58531,58537,58541,58545,58549,58552,58557,58562,58563,58568,58569,58570],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":56503,"depth":229,"text":58532,"children":58533},"1. ¿Qué son DeclareRegister y DeclareUnregister?",[58534,58535,58536],{"id":56511,"depth":670,"text":56512},{"id":52046,"depth":670,"text":52047},{"id":56637,"depth":670,"text":56638},{"id":56654,"depth":229,"text":56655,"children":58538},[58539,58540],{"id":56658,"depth":670,"text":56659},{"id":56691,"depth":670,"text":56692},{"id":56703,"depth":229,"text":56704,"children":58542},[58543,58544],{"id":56707,"depth":670,"text":56708},{"id":56797,"depth":670,"text":56798},{"id":56845,"depth":229,"text":56846,"children":58546},[58547,58548],{"id":56849,"depth":670,"text":56850},{"id":56973,"depth":670,"text":56974},{"id":57244,"depth":229,"text":57245,"children":58550},[58551],{"id":57248,"depth":670,"text":57249},{"id":57474,"depth":229,"text":57475,"children":58553},[58554,58555,58556],{"id":57478,"depth":670,"text":57479},{"id":57494,"depth":670,"text":57495},{"id":57508,"depth":670,"text":57509},{"id":57525,"depth":229,"text":57526,"children":58558},[58559,58560,58561],{"id":57529,"depth":670,"text":57530},{"id":57626,"depth":670,"text":57627},{"id":57718,"depth":670,"text":57719},{"id":57782,"depth":229,"text":57783},{"id":57880,"depth":229,"text":57881,"children":58564},[58565,58566,58567],{"id":57884,"depth":670,"text":57885},{"id":57905,"depth":670,"text":57906},{"id":58323,"depth":670,"text":58324},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":58571},[58572,58573],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Registra y desregistra acciones en EPLAN con Register\u002FUnregister para cargar scripts de forma automática en EPLAN Electric P8.",{},"\u002Fguia\u002Feplan-api\u002Fcap-15-register-unregister",{"title":56370,"description":58574},"guia\u002Feplan-api\u002Fcap-15-register-unregister","tNIvejhRMK145MQtL3uRNRXxcbY_r3adnqwK_fHtqoQ",{"id":58581,"title":58582,"body":58583,"description":60011,"extension":236,"meta":60012,"navigation":238,"path":60013,"seo":60014,"stem":60015,"tagline":242,"__hash__":60016},"guia\u002Fguia\u002Feplan-api\u002Fcap-16-ejecutar-comando-simple.md","Capítulo 16: Ejecutar comandos con CommandLineInterpreter",{"type":7,"value":58584,"toc":59964},[58585,58596,58598,58600,58602,58619,58621,58623,58625,58638,58640,58642,58650,58657,58662,58664,58668,58670,58679,58684,58688,58691,58699,58703,58709,58729,58736,58738,58742,58746,58751,58806,58810,58814,58829,58834,58842,58845,58850,58859,58862,58866,58869,58880,58886,58888,58892,58896,58905,58910,58918,58922,58934,58938,59040,59042,59046,59049,59053,59068,59081,59085,59095,59107,59115,59117,59121,59125,59128,59241,59245,59248,59252,59267,59271,59289,59293,59296,59402,59404,59408,59411,59415,59420,59432,59437,59448,59453,59461,59466,59471,59475,59478,59514,59516,59520,59524,59527,59531,59746,59748,59752,59756,59765,59772,59776,59783,59803,59807,59810,59824,59827,59829,59831,59833,59875,59877,59879,59884,59887,59892,59895,59900,59906,59911,59917,59922,59925,59927,59929,59931,59935,59937,59942,59945,59947,59962],[10,58586,58587],{},[13,58588,58589,19,58591,19,58594,262],{},[16,58590,49597],{},[16,58592,58593],{},"Sección 6: CommandLineInterpreter básico",[16,58595,25],{},[43,58597],{},[46,58599,268],{"id":267},[13,58601,702],{},[126,58603,58604,58607,58610,58613,58616],{},[88,58605,58606],{},"Entender qué es CommandLineInterpreter y para qué sirve",[88,58608,58609],{},"Crear una instancia de CommandLineInterpreter",[88,58611,58612],{},"Ejecutar comandos básicos de EPLAN",[88,58614,58615],{},"Conocer la estructura de un comando simple",[88,58617,58618],{},"Manejar errores en ejecución de comandos",[43,58620],{},[46,58622,320],{"id":319},[13,58624,726],{},[126,58626,58627,58630,58635],{},[88,58628,58629],{},"Haber completado los Capítulos 12-15 (atributos de scripting)",[88,58631,58632,58633],{},"Conocer el atributo ",[551,58634,1300],{},[88,58636,58637],{},"Entender try-catch para manejo de errores",[43,58639],{},[46,58641,49653],{"id":49652},[13,58643,58644,58645,4000,58647,58649],{},"Hasta ahora has aprendido a estructurar scripts con diferentes atributos (",[551,58646,1300],{},[551,58648,51803],{},", etc.), pero todos tus scripts solo mostraban mensajes al usuario.",[13,58651,58652,58653,58656],{},"¿Cómo puedes hacer que EPLAN realmente ",[16,58654,58655],{},"haga algo","? ¿Cómo ejecutas las acciones que normalmente harías desde los menús o botones de EPLAN?",[13,58658,58659,58660,41],{},"La respuesta es: ",[16,58661,53274],{},[43,58663],{},[46,58665,58667],{"id":58666},"_1-qué-es-commandlineinterpreter","1. ¿Qué es CommandLineInterpreter?",[331,58669,49681],{"id":49680},[13,58671,58672,58674,58675,58678],{},[16,58673,53274],{}," (CLI) es una clase de EPLAN API que permite ejecutar ",[16,58676,58677],{},"acciones de EPLAN"," programáticamente, como si las ejecutaras desde el menú o la línea de comandos de EPLAN.",[13,58680,58681,58683],{},[16,58682,49878],{}," Es como tener acceso a la consola de comandos de EPLAN desde tu código.",[331,58685,58687],{"id":58686},"_12-dónde-se-define","1.2 ¿Dónde se define?",[13,58689,58690],{},"CommandLineInterpreter está en el namespace:",[543,58692,58693],{"className":545,"code":1133,"language":547,"meta":228,"style":228},[54,58694,58695],{"__ignoreMap":228},[551,58696,58697],{"class":553,"line":554},[551,58698,1133],{},[331,58700,58702],{"id":58701},"_13-para-qué-sirve","1.3 ¿Para qué sirve?",[13,58704,58705,58706,416],{},"Con CommandLineInterpreter puedes ejecutar ",[16,58707,58708],{},"cualquier acción disponible en EPLAN",[126,58710,58711,58714,58717,58720,58723,58726],{},[88,58712,58713],{},"Abrir reportes",[88,58715,58716],{},"Guardar proyectos",[88,58718,58719],{},"Generar conexiones",[88,58721,58722],{},"Exportar documentos",[88,58724,58725],{},"Sincronizar datos",[88,58727,58728],{},"Y muchas más...",[13,58730,58731,58733,58734,154],{},[16,58732,50964],{}," Solo puedes ejecutar acciones que ya existen en EPLAN. No puedes inventar comandos nuevos (aunque sí puedes crear acciones personalizadas con ",[551,58735,51803],{},[43,58737],{},[46,58739,58741],{"id":58740},"_2-tu-primer-comando-con-commandlineinterpreter","2. Tu primer comando con CommandLineInterpreter",[331,58743,58745],{"id":58744},"_21-script-más-simple-posible","2.1 Script más simple posible",[13,58747,56711,58748,416],{},[54,58749,58750],{},"EPLAN-Scripting-4.0\u002F02_RunActions\u002F01_SingleAction.cs",[543,58752,58754],{"className":545,"code":58753,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class ComandoSimple\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n        cli.Execute(\"check\");\n    }\n}\n",[54,58755,58756,58760,58764,58768,58773,58777,58781,58785,58789,58793,58798,58802],{"__ignoreMap":228},[551,58757,58758],{"class":553,"line":554},[551,58759,1133],{},[551,58761,58762],{"class":553,"line":229},[551,58763,49898],{},[551,58765,58766],{"class":553,"line":670},[551,58767,1139],{"emptyLinePlaceholder":238},[551,58769,58770],{"class":553,"line":1136},[551,58771,58772],{},"public class ComandoSimple\n",[551,58774,58775],{"class":553,"line":1142},[551,58776,1151],{},[551,58778,58779],{"class":553,"line":1148},[551,58780,1157],{},[551,58782,58783],{"class":553,"line":1154},[551,58784,57216],{},[551,58786,58787],{"class":553,"line":1160},[551,58788,1169],{},[551,58790,58791],{"class":553,"line":1166},[551,58792,53406],{},[551,58794,58795],{"class":553,"line":1172},[551,58796,58797],{},"        cli.Execute(\"check\");\n",[551,58799,58800],{"class":553,"line":1178},[551,58801,1187],{},[551,58803,58804],{"class":553,"line":1184},[551,58805,1193],{},[331,58807,58809],{"id":58808},"_22-análisis-línea-por-línea","2.2 Análisis línea por línea",[13,58811,58812],{},[16,58813,50174],{},[543,58815,58817],{"className":545,"code":58816,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;  \u002F\u002F Para CommandLineInterpreter\nusing Eplan.EplApi.Scripting;             \u002F\u002F Para [Start]\n",[54,58818,58819,58824],{"__ignoreMap":228},[551,58820,58821],{"class":553,"line":554},[551,58822,58823],{},"using Eplan.EplApi.ApplicationFramework;  \u002F\u002F Para CommandLineInterpreter\n",[551,58825,58826],{"class":553,"line":229},[551,58827,58828],{},"using Eplan.EplApi.Scripting;             \u002F\u002F Para [Start]\n",[13,58830,58831],{},[16,58832,58833],{},"Línea 9: Crear instancia de CLI",[543,58835,58836],{"className":545,"code":52496,"language":547,"meta":228,"style":228},[54,58837,58838],{"__ignoreMap":228},[551,58839,58840],{"class":553,"line":554},[551,58841,52496],{},[13,58843,58844],{},"Crea un objeto que puede ejecutar comandos de EPLAN.",[13,58846,58847],{},[16,58848,58849],{},"Línea 10: Ejecutar comando",[543,58851,58853],{"className":545,"code":58852,"language":547,"meta":228,"style":228},"cli.Execute(\"check\");\n",[54,58854,58855],{"__ignoreMap":228},[551,58856,58857],{"class":553,"line":554},[551,58858,58852],{},[13,58860,58861],{},"Ejecuta el comando \"check\", que verifica el proyecto en busca de errores.",[331,58863,58865],{"id":58864},"_23-qué-hace-este-script","2.3 ¿Qué hace este script?",[13,58867,58868],{},"Al ejecutar este script:",[85,58870,58871,58874,58877],{},[88,58872,58873],{},"Se crea un CommandLineInterpreter",[88,58875,58876],{},"Se ejecuta el comando \"check\"",[88,58878,58879],{},"EPLAN verifica el proyecto en busca de errores",[13,58881,58882,58883],{},"Es equivalente a ir manualmente a: ",[16,58884,58885],{},"Utilidades > Verificar > Verificar proyecto",[43,58887],{},[46,58889,58891],{"id":58890},"_3-estructura-básica-de-execute","3. Estructura básica de Execute()",[331,58893,58895],{"id":58894},"_31-sintaxis","3.1 Sintaxis",[543,58897,58899],{"className":545,"code":58898,"language":547,"meta":228,"style":228},"cli.Execute(string actionName);\n",[54,58900,58901],{"__ignoreMap":228},[551,58902,58903],{"class":553,"line":554},[551,58904,58898],{},[13,58906,58907],{},[16,58908,58909],{},"Parámetros:",[126,58911,58912],{},[88,58913,58914,58917],{},[54,58915,58916],{},"actionName"," - String con el nombre de la acción a ejecutar",[13,58919,58920],{},[16,58921,55505],{},[126,58923,58924],{},[88,58925,58926,19,58928,58930,58931,58933],{},[54,58927,6586],{},[54,58929,2853],{}," si el comando se ejecutó correctamente, ",[54,58932,2857],{}," si falló",[331,58935,58937],{"id":58936},"_32-ejemplo-con-validación-de-retorno","3.2 Ejemplo con validación de retorno",[543,58939,58941],{"className":545,"code":58940,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ComandoConValidacion\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n\n        bool resultado = cli.Execute(\"check\");\n\n        if (resultado)\n        {\n            MessageBox.Show(\"Comando ejecutado correctamente\");\n        }\n        else\n        {\n            MessageBox.Show(\"Error al ejecutar comando\");\n        }\n    }\n}\n",[54,58942,58943,58947,58951,58955,58959,58964,58968,58972,58976,58980,58984,58988,58993,58997,59002,59006,59011,59015,59019,59023,59028,59032,59036],{"__ignoreMap":228},[551,58944,58945],{"class":553,"line":554},[551,58946,1133],{},[551,58948,58949],{"class":553,"line":229},[551,58950,49898],{},[551,58952,58953],{"class":553,"line":670},[551,58954,50105],{},[551,58956,58957],{"class":553,"line":1136},[551,58958,1139],{"emptyLinePlaceholder":238},[551,58960,58961],{"class":553,"line":1142},[551,58962,58963],{},"public class ComandoConValidacion\n",[551,58965,58966],{"class":553,"line":1148},[551,58967,1151],{},[551,58969,58970],{"class":553,"line":1154},[551,58971,1157],{},[551,58973,58974],{"class":553,"line":1160},[551,58975,57216],{},[551,58977,58978],{"class":553,"line":1166},[551,58979,1169],{},[551,58981,58982],{"class":553,"line":1172},[551,58983,53406],{},[551,58985,58986],{"class":553,"line":1178},[551,58987,1139],{"emptyLinePlaceholder":238},[551,58989,58990],{"class":553,"line":1184},[551,58991,58992],{},"        bool resultado = cli.Execute(\"check\");\n",[551,58994,58995],{"class":553,"line":1190},[551,58996,1139],{"emptyLinePlaceholder":238},[551,58998,58999],{"class":553,"line":1472},[551,59000,59001],{},"        if (resultado)\n",[551,59003,59004],{"class":553,"line":1477},[551,59005,9062],{},[551,59007,59008],{"class":553,"line":1797},[551,59009,59010],{},"            MessageBox.Show(\"Comando ejecutado correctamente\");\n",[551,59012,59013],{"class":553,"line":1802},[551,59014,9077],{},[551,59016,59017],{"class":553,"line":1808},[551,59018,9082],{},[551,59020,59021],{"class":553,"line":1814},[551,59022,9062],{},[551,59024,59025],{"class":553,"line":1820},[551,59026,59027],{},"            MessageBox.Show(\"Error al ejecutar comando\");\n",[551,59029,59030],{"class":553,"line":1826},[551,59031,9077],{},[551,59033,59034],{"class":553,"line":1832},[551,59035,1187],{},[551,59037,59038],{"class":553,"line":1838},[551,59039,1193],{},[43,59041],{},[46,59043,59045],{"id":59044},"_4-comandos-verificados-en-scripts-oficiales","4. Comandos verificados en scripts oficiales",[13,59047,59048],{},"Estos son comandos que aparecen en los scripts oficiales de EPLAN-Scripting-4.0:",[331,59050,59052],{"id":59051},"_41-check","4.1 check",[13,59054,59055,73,59058,59061,59063,59064,59067],{},[16,59056,59057],{},"Comando:",[54,59059,59060],{},"check",[16,59062,51116],{}," Verifica el proyecto en busca de errores\n",[16,59065,59066],{},"Equivalente en menú:"," Utilidades > Verificar > Verificar proyecto",[543,59069,59071],{"className":545,"code":59070,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\ncli.Execute(\"check\");\n",[54,59072,59073,59077],{"__ignoreMap":228},[551,59074,59075],{"class":553,"line":554},[551,59076,52496],{},[551,59078,59079],{"class":553,"line":229},[551,59080,58852],{},[331,59082,59084],{"id":59083},"_42-generate","4.2 generate",[13,59086,59087,73,59089,59092,59094],{},[16,59088,59057],{},[54,59090,59091],{},"generate",[16,59093,51116],{}," Genera conexiones y numeración del proyecto",[543,59096,59097],{"className":545,"code":59070,"language":547,"meta":228,"style":228},[54,59098,59099,59103],{"__ignoreMap":228},[551,59100,59101],{"class":553,"line":554},[551,59102,52496],{},[551,59104,59105],{"class":553,"line":229},[551,59106,58852],{},[13,59108,59109,59111,59112,59114],{},[16,59110,53214],{}," La acción ",[54,59113,59060],{}," soporta parámetros como TYPE (\"PROJECT\", \"PAGES\") y VERIFICATIONSCHEME que veremos en capítulos posteriores.",[43,59116],{},[46,59118,59120],{"id":59119},"_5-buenas-prácticas","5. Buenas prácticas",[331,59122,59124],{"id":59123},"_51-siempre-usar-try-catch","5.1 Siempre usar try-catch",[13,59126,59127],{},"Los comandos pueden fallar por diversas razones (proyecto no abierto, permisos, etc.). Siempre maneja errores:",[543,59129,59131],{"className":545,"code":59130,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ComandoSeguro\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n            bool resultado = cli.Execute(\"check\");\n\n            if (!resultado)\n            {\n                MessageBox.Show(\"El comando no se pudo ejecutar\");\n            }\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,59132,59133,59137,59141,59145,59149,59153,59158,59162,59166,59170,59174,59178,59182,59186,59191,59195,59200,59204,59209,59213,59217,59221,59225,59229,59233,59237],{"__ignoreMap":228},[551,59134,59135],{"class":553,"line":554},[551,59136,1123],{},[551,59138,59139],{"class":553,"line":229},[551,59140,1133],{},[551,59142,59143],{"class":553,"line":670},[551,59144,49898],{},[551,59146,59147],{"class":553,"line":1136},[551,59148,50105],{},[551,59150,59151],{"class":553,"line":1142},[551,59152,1139],{"emptyLinePlaceholder":238},[551,59154,59155],{"class":553,"line":1148},[551,59156,59157],{},"public class ComandoSeguro\n",[551,59159,59160],{"class":553,"line":1154},[551,59161,1151],{},[551,59163,59164],{"class":553,"line":1160},[551,59165,1157],{},[551,59167,59168],{"class":553,"line":1166},[551,59169,57216],{},[551,59171,59172],{"class":553,"line":1172},[551,59173,1169],{},[551,59175,59176],{"class":553,"line":1178},[551,59177,41211],{},[551,59179,59180],{"class":553,"line":1184},[551,59181,9062],{},[551,59183,59184],{"class":553,"line":1190},[551,59185,55695],{},[551,59187,59188],{"class":553,"line":1472},[551,59189,59190],{},"            bool resultado = cli.Execute(\"check\");\n",[551,59192,59193],{"class":553,"line":1477},[551,59194,1139],{"emptyLinePlaceholder":238},[551,59196,59197],{"class":553,"line":1797},[551,59198,59199],{},"            if (!resultado)\n",[551,59201,59202],{"class":553,"line":1802},[551,59203,12301],{},[551,59205,59206],{"class":553,"line":1808},[551,59207,59208],{},"                MessageBox.Show(\"El comando no se pudo ejecutar\");\n",[551,59210,59211],{"class":553,"line":1814},[551,59212,12311],{},[551,59214,59215],{"class":553,"line":1820},[551,59216,9077],{},[551,59218,59219],{"class":553,"line":1826},[551,59220,41473],{},[551,59222,59223],{"class":553,"line":1832},[551,59224,9062],{},[551,59226,59227],{"class":553,"line":1838},[551,59228,55428],{},[551,59230,59231],{"class":553,"line":1844},[551,59232,9077],{},[551,59234,59235],{"class":553,"line":1850},[551,59236,1187],{},[551,59238,59239],{"class":553,"line":1855},[551,59240,1193],{},[331,59242,59244],{"id":59243},"_52-crear-la-instancia-de-cli-una-sola-vez","5.2 Crear la instancia de CLI una sola vez",[13,59246,59247],{},"Si vas a ejecutar varios comandos, crea el CLI una sola vez:",[13,59249,59250],{},[16,59251,57538],{},[543,59253,59255],{"className":545,"code":59254,"language":547,"meta":228,"style":228},"new CommandLineInterpreter().Execute(\"check\");\nnew CommandLineInterpreter().Execute(\"generate\");\n",[54,59256,59257,59262],{"__ignoreMap":228},[551,59258,59259],{"class":553,"line":554},[551,59260,59261],{},"new CommandLineInterpreter().Execute(\"check\");\n",[551,59263,59264],{"class":553,"line":229},[551,59265,59266],{},"new CommandLineInterpreter().Execute(\"generate\");\n",[13,59268,59269],{},[16,59270,57587],{},[543,59272,59274],{"className":545,"code":59273,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\ncli.Execute(\"check\");\ncli.Execute(\"generate\");\n",[54,59275,59276,59280,59284],{"__ignoreMap":228},[551,59277,59278],{"class":553,"line":554},[551,59279,52496],{},[551,59281,59282],{"class":553,"line":229},[551,59283,58852],{},[551,59285,59286],{"class":553,"line":670},[551,59287,59288],{},"cli.Execute(\"generate\");\n",[331,59290,59292],{"id":59291},"_53-verificar-que-hay-proyecto-abierto-si-es-necesario","5.3 Verificar que hay proyecto abierto si es necesario",[13,59294,59295],{},"Muchos comandos requieren que haya un proyecto abierto:",[543,59297,59299],{"className":545,"code":59298,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ComandoConVerificacion\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Verificar que hay proyecto abierto\n        string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n        if (string.IsNullOrEmpty(nombreProyecto) || nombreProyecto.StartsWith(\"$(\"))\n        {\n            MessageBox.Show(\"No hay proyecto abierto\");\n            return;\n        }\n\n        \u002F\u002F Ejecutar comando\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n        cli.Execute(\"check\");\n    }\n}\n",[54,59300,59301,59305,59309,59313,59317,59321,59326,59330,59334,59338,59342,59347,59351,59355,59360,59364,59369,59373,59377,59381,59386,59390,59394,59398],{"__ignoreMap":228},[551,59302,59303],{"class":553,"line":554},[551,59304,1128],{},[551,59306,59307],{"class":553,"line":229},[551,59308,1133],{},[551,59310,59311],{"class":553,"line":670},[551,59312,49898],{},[551,59314,59315],{"class":553,"line":1136},[551,59316,50105],{},[551,59318,59319],{"class":553,"line":1142},[551,59320,1139],{"emptyLinePlaceholder":238},[551,59322,59323],{"class":553,"line":1148},[551,59324,59325],{},"public class ComandoConVerificacion\n",[551,59327,59328],{"class":553,"line":1154},[551,59329,1151],{},[551,59331,59332],{"class":553,"line":1160},[551,59333,1157],{},[551,59335,59336],{"class":553,"line":1166},[551,59337,57216],{},[551,59339,59340],{"class":553,"line":1172},[551,59341,1169],{},[551,59343,59344],{"class":553,"line":1178},[551,59345,59346],{},"        \u002F\u002F Verificar que hay proyecto abierto\n",[551,59348,59349],{"class":553,"line":1184},[551,59350,55600],{},[551,59352,59353],{"class":553,"line":1190},[551,59354,1139],{"emptyLinePlaceholder":238},[551,59356,59357],{"class":553,"line":1472},[551,59358,59359],{},"        if (string.IsNullOrEmpty(nombreProyecto) || nombreProyecto.StartsWith(\"$(\"))\n",[551,59361,59362],{"class":553,"line":1477},[551,59363,9062],{},[551,59365,59366],{"class":553,"line":1797},[551,59367,59368],{},"            MessageBox.Show(\"No hay proyecto abierto\");\n",[551,59370,59371],{"class":553,"line":1802},[551,59372,42906],{},[551,59374,59375],{"class":553,"line":1808},[551,59376,9077],{},[551,59378,59379],{"class":553,"line":1814},[551,59380,1139],{"emptyLinePlaceholder":238},[551,59382,59383],{"class":553,"line":1820},[551,59384,59385],{},"        \u002F\u002F Ejecutar comando\n",[551,59387,59388],{"class":553,"line":1826},[551,59389,53406],{},[551,59391,59392],{"class":553,"line":1832},[551,59393,58797],{},[551,59395,59396],{"class":553,"line":1838},[551,59397,1187],{},[551,59399,59400],{"class":553,"line":1844},[551,59401,1193],{},[43,59403],{},[46,59405,59407],{"id":59406},"_6-cómo-descubrir-nombres-de-comandos","6. ¿Cómo descubrir nombres de comandos?",[13,59409,59410],{},"Esta es una pregunta común: ¿Cómo sé qué comandos puedo ejecutar?",[331,59412,59414],{"id":59413},"_61-fuentes-de-información","6.1 Fuentes de información",[13,59416,59417],{},[16,59418,59419],{},"1. Documentación oficial de EPLAN API",[126,59421,59422,59429],{},[88,59423,59424,59425,59428],{},"Archivo: ",[54,59426,59427],{},"EplanAPI.chm"," (en carpeta de instalación)",[88,59430,59431],{},"Busca por \"Actions\" o nombres de comandos",[13,59433,59434],{},[16,59435,59436],{},"2. Scripts de ejemplo oficiales",[126,59438,59439,59445],{},[88,59440,59441,59442],{},"Carpeta: ",[54,59443,59444],{},"EPLAN-Scripting-4.0",[88,59446,59447],{},"Muchos scripts usan CommandLineInterpreter",[13,59449,59450],{},[16,59451,59452],{},"3. Observar la interfaz de EPLAN",[126,59454,59455,59458],{},[88,59456,59457],{},"Muchas acciones del menú tienen nombres internos",[88,59459,59460],{},"No siempre coinciden exactamente con el texto del menú",[13,59462,59463],{},[16,59464,59465],{},"4. Trial and error con validación",[126,59467,59468],{},[88,59469,59470],{},"Prueba comandos y verifica el valor de retorno",[331,59472,59474],{"id":59473},"_62-comandos-verificados-en-documentación-oficial","6.2 Comandos verificados en documentación oficial",[13,59476,59477],{},"Estos comandos están documentados en la API oficial de EPLAN:",[126,59479,59480,59485,59490,59496,59502,59508],{},[88,59481,59482,59484],{},[54,59483,59060],{}," - Verificar proyecto",[88,59486,59487,59489],{},[54,59488,59091],{}," - Generar conexiones y numeración",[88,59491,59492,59495],{},[54,59493,59494],{},"compress"," - Comprimir proyecto",[88,59497,59498,59501],{},[54,59499,59500],{},"synchronize"," - Sincronizar datos maestros (requiere parámetro TYPE)",[88,59503,59504,59507],{},[54,59505,59506],{},"export"," - Exportar (requiere parámetros, lo veremos en capítulos siguientes)",[88,59509,59510,59513],{},[54,59511,59512],{},"backup"," - Crear copia de seguridad (requiere parámetros)",[43,59515],{},[46,59517,59519],{"id":59518},"_7-proyecto-del-capítulo-verificar-proyecto-automáticamente","7. Proyecto del capítulo: Verificar proyecto automáticamente",[331,59521,59523],{"id":59522},"_71-objetivo","7.1 Objetivo",[13,59525,59526],{},"Crear un script que verifique el proyecto de EPLAN en busca de errores.",[331,59528,59530],{"id":59529},"_72-implementación","7.2 Implementación",[543,59532,59534],{"className":545,"code":59533,"language":547,"meta":228,"style":228},"using System;\nusing System.Windows.Forms;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class VerificarProyecto\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            \u002F\u002F Crear intérprete de línea de comandos\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Ejecutar comando para verificar proyecto\n            bool resultado = cli.Execute(\"check\");\n\n            \u002F\u002F Verificar resultado\n            if (resultado)\n            {\n                MessageBox.Show(\n                    \"Verificación del proyecto completada\",\n                    \"Éxito\",\n                    MessageBoxButtons.OK,\n                    MessageBoxIcon.Information\n                );\n            }\n            else\n            {\n                MessageBox.Show(\n                    \"No se pudo verificar el proyecto\",\n                    \"Error\",\n                    MessageBoxButtons.OK,\n                    MessageBoxIcon.Warning\n                );\n            }\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error al ejecutar comando:\\n\" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n}\n",[54,59535,59536,59540,59544,59548,59552,59556,59561,59565,59569,59573,59577,59581,59585,59590,59594,59598,59603,59607,59611,59616,59621,59625,59630,59635,59640,59645,59650,59654,59658,59662,59666,59670,59675,59680,59684,59689,59693,59697,59701,59705,59709,59713,59718,59722,59726,59730,59734,59738,59742],{"__ignoreMap":228},[551,59537,59538],{"class":553,"line":554},[551,59539,1123],{},[551,59541,59542],{"class":553,"line":229},[551,59543,50105],{},[551,59545,59546],{"class":553,"line":670},[551,59547,1133],{},[551,59549,59550],{"class":553,"line":1136},[551,59551,49898],{},[551,59553,59554],{"class":553,"line":1142},[551,59555,1139],{"emptyLinePlaceholder":238},[551,59557,59558],{"class":553,"line":1148},[551,59559,59560],{},"public class VerificarProyecto\n",[551,59562,59563],{"class":553,"line":1154},[551,59564,1151],{},[551,59566,59567],{"class":553,"line":1160},[551,59568,1157],{},[551,59570,59571],{"class":553,"line":1166},[551,59572,57216],{},[551,59574,59575],{"class":553,"line":1172},[551,59576,1169],{},[551,59578,59579],{"class":553,"line":1178},[551,59580,41211],{},[551,59582,59583],{"class":553,"line":1184},[551,59584,9062],{},[551,59586,59587],{"class":553,"line":1190},[551,59588,59589],{},"            \u002F\u002F Crear intérprete de línea de comandos\n",[551,59591,59592],{"class":553,"line":1472},[551,59593,55695],{},[551,59595,59596],{"class":553,"line":1477},[551,59597,1139],{"emptyLinePlaceholder":238},[551,59599,59600],{"class":553,"line":1797},[551,59601,59602],{},"            \u002F\u002F Ejecutar comando para verificar proyecto\n",[551,59604,59605],{"class":553,"line":1802},[551,59606,59190],{},[551,59608,59609],{"class":553,"line":1808},[551,59610,1139],{"emptyLinePlaceholder":238},[551,59612,59613],{"class":553,"line":1814},[551,59614,59615],{},"            \u002F\u002F Verificar resultado\n",[551,59617,59618],{"class":553,"line":1820},[551,59619,59620],{},"            if (resultado)\n",[551,59622,59623],{"class":553,"line":1826},[551,59624,12301],{},[551,59626,59627],{"class":553,"line":1832},[551,59628,59629],{},"                MessageBox.Show(\n",[551,59631,59632],{"class":553,"line":1838},[551,59633,59634],{},"                    \"Verificación del proyecto completada\",\n",[551,59636,59637],{"class":553,"line":1844},[551,59638,59639],{},"                    \"Éxito\",\n",[551,59641,59642],{"class":553,"line":1850},[551,59643,59644],{},"                    MessageBoxButtons.OK,\n",[551,59646,59647],{"class":553,"line":1855},[551,59648,59649],{},"                    MessageBoxIcon.Information\n",[551,59651,59652],{"class":553,"line":1861},[551,59653,21424],{},[551,59655,59656],{"class":553,"line":1867},[551,59657,12311],{},[551,59659,59660],{"class":553,"line":1873},[551,59661,15260],{},[551,59663,59664],{"class":553,"line":1878},[551,59665,12301],{},[551,59667,59668],{"class":553,"line":1883},[551,59669,59629],{},[551,59671,59672],{"class":553,"line":1888},[551,59673,59674],{},"                    \"No se pudo verificar el proyecto\",\n",[551,59676,59677],{"class":553,"line":4615},[551,59678,59679],{},"                    \"Error\",\n",[551,59681,59682],{"class":553,"line":4620},[551,59683,59644],{},[551,59685,59686],{"class":553,"line":4626},[551,59687,59688],{},"                    MessageBoxIcon.Warning\n",[551,59690,59691],{"class":553,"line":4631},[551,59692,21424],{},[551,59694,59695],{"class":553,"line":4636},[551,59696,12311],{},[551,59698,59699],{"class":553,"line":4641},[551,59700,9077],{},[551,59702,59703],{"class":553,"line":4647},[551,59704,41473],{},[551,59706,59707],{"class":553,"line":4653},[551,59708,9062],{},[551,59710,59711],{"class":553,"line":4659},[551,59712,53598],{},[551,59714,59715],{"class":553,"line":4665},[551,59716,59717],{},"                \"Error al ejecutar comando:\\n\" + ex.Message,\n",[551,59719,59720],{"class":553,"line":4671},[551,59721,53649],{},[551,59723,59724],{"class":553,"line":4677},[551,59725,53613],{},[551,59727,59728],{"class":553,"line":4683},[551,59729,53658],{},[551,59731,59732],{"class":553,"line":4689},[551,59733,53623],{},[551,59735,59736],{"class":553,"line":4695},[551,59737,9077],{},[551,59739,59740],{"class":553,"line":4701},[551,59741,1187],{},[551,59743,59744],{"class":553,"line":4707},[551,59745,1193],{},[43,59747],{},[46,59749,59751],{"id":59750},"_8-limitaciones-de-comandos-simples","8. Limitaciones de comandos simples",[331,59753,59755],{"id":59754},"_81-sin-parámetros","8.1 Sin parámetros",[13,59757,52239,59758,59761,59762,41],{},[54,59759,59760],{},"Execute(string)"," solo puedes ejecutar comandos ",[16,59763,59764],{},"sin parámetros",[13,59766,59767,59768,59771],{},"Para comandos que necesitan parámetros (como exportar a una ruta específica), necesitas ",[16,59769,59770],{},"ActionCallingContext",", que veremos en el Capítulo 18.",[331,59773,59775],{"id":59774},"_82-nombres-exactos","8.2 Nombres exactos",[13,59777,59778,59779,59782],{},"Los nombres de comandos son ",[16,59780,59781],{},"case-sensitive"," y deben ser exactos:",[543,59784,59786],{"className":545,"code":59785,"language":547,"meta":228,"style":228},"cli.Execute(\"check\");   \u002F\u002F ✓ Funciona\ncli.Execute(\"Check\");   \u002F\u002F ✗ Puede no funcionar\ncli.Execute(\"CHECK\");   \u002F\u002F ✗ Puede no funcionar\n",[54,59787,59788,59793,59798],{"__ignoreMap":228},[551,59789,59790],{"class":553,"line":554},[551,59791,59792],{},"cli.Execute(\"check\");   \u002F\u002F ✓ Funciona\n",[551,59794,59795],{"class":553,"line":229},[551,59796,59797],{},"cli.Execute(\"Check\");   \u002F\u002F ✗ Puede no funcionar\n",[551,59799,59800],{"class":553,"line":670},[551,59801,59802],{},"cli.Execute(\"CHECK\");   \u002F\u002F ✗ Puede no funcionar\n",[331,59804,59806],{"id":59805},"_83-estado-de-eplan","8.3 Estado de EPLAN",[13,59808,59809],{},"Algunos comandos solo funcionan en ciertos contextos:",[126,59811,59812,59815,59818,59821],{},[88,59813,59814],{},"Proyecto abierto",[88,59816,59817],{},"Página seleccionada",[88,59819,59820],{},"Modo de edición activo",[88,59822,59823],{},"Etc.",[13,59825,59826],{},"Siempre verifica las precondiciones antes de ejecutar comandos.",[43,59828],{},[46,59830,22685],{"id":22684},[13,59832,22688],{},[126,59834,59835,59840,59846,59856,59865,59870],{},[88,59836,59837,59839],{},[16,59838,53274],{}," permite ejecutar acciones de EPLAN programáticamente",[88,59841,59842,59843],{},"Se usa con ",[54,59844,59845],{},"cli.Execute(\"nombreComando\")",[88,59847,59848,59849,59852,59853,59855],{},"El método ",[54,59850,59851],{},"Execute()"," devuelve ",[54,59854,6586],{}," indicando éxito o fallo",[88,59857,59858,59859,4000,59861,4000,59863],{},"Comandos verificados: ",[54,59860,59060],{},[54,59862,59091],{},[54,59864,59494],{},[88,59866,58409,59867],{},[16,59868,59869],{},"try-catch, verificar retorno, crear CLI una vez, validar precondiciones",[88,59871,59778,59872,59874],{},[16,59873,59781],{}," y deben ser exactos",[43,59876],{},[46,59878,5728],{"id":5727},[13,59880,59881],{},[16,59882,59883],{},"P: ¿Dónde encuentro la lista completa de comandos disponibles?",[13,59885,59886],{},"R: En la documentación oficial de EPLAN API (EplanAPI.chm) y en los scripts de ejemplo oficiales.",[13,59888,59889],{},[16,59890,59891],{},"P: ¿Puedo ejecutar comandos que no aparecen en el menú?",[13,59893,59894],{},"R: Sí, existen acciones internas que solo son accesibles mediante CommandLineInterpreter.",[13,59896,59897],{},[16,59898,59899],{},"P: ¿Qué pasa si ejecuto un comando que no existe?",[13,59901,59902,59903,59905],{},"R: El método Execute() devuelve ",[54,59904,2857],{}," y puede lanzar una excepción. Por eso es importante usar try-catch.",[13,59907,59908],{},[16,59909,59910],{},"P: ¿Puedo crear mis propios comandos?",[13,59912,59913,59914,59916],{},"R: No directamente, pero puedes crear acciones personalizadas con ",[551,59915,51803],{}," y luego ejecutarlas con CLI.",[13,59918,59919],{},[16,59920,59921],{},"P: ¿Todos los comandos requieren un proyecto abierto?",[13,59923,59924],{},"R: No, pero muchos sí. Depende de la naturaleza del comando.",[43,59926],{},[46,59928,51782],{"id":36078},[331,59930,51786],{"id":51785},[13,59932,59933],{},[16,59934,56283],{},[331,59936,51795],{"id":51794},[13,59938,59939],{},[16,59940,59941],{},"Capítulo 17: Ejecutar múltiples comandos",[13,59943,59944],{},"En el próximo capítulo aprenderás a ejecutar múltiples comandos en secuencia y crear workflows básicos.",[43,59946],{},[13,59948,59949,10676,59951,51819,59953,93,59955,59958,93,59960],{},[31,59950,657],{},[31,59952,10679],{},[31,59954,10683],{},[54,59956,59957],{},"code\u002Fcap-16\u002F",[31,59959,51827],{},[54,59961,58750],{},[660,59963,662],{},{"title":228,"searchDepth":229,"depth":229,"links":59965},[59966,59967,59968,59969,59974,59979,59983,59987,59992,59996,60000,60005,60006,60007],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":58666,"depth":229,"text":58667,"children":59970},[59971,59972,59973],{"id":49680,"depth":670,"text":49681},{"id":58686,"depth":670,"text":58687},{"id":58701,"depth":670,"text":58702},{"id":58740,"depth":229,"text":58741,"children":59975},[59976,59977,59978],{"id":58744,"depth":670,"text":58745},{"id":58808,"depth":670,"text":58809},{"id":58864,"depth":670,"text":58865},{"id":58890,"depth":229,"text":58891,"children":59980},[59981,59982],{"id":58894,"depth":670,"text":58895},{"id":58936,"depth":670,"text":58937},{"id":59044,"depth":229,"text":59045,"children":59984},[59985,59986],{"id":59051,"depth":670,"text":59052},{"id":59083,"depth":670,"text":59084},{"id":59119,"depth":229,"text":59120,"children":59988},[59989,59990,59991],{"id":59123,"depth":670,"text":59124},{"id":59243,"depth":670,"text":59244},{"id":59291,"depth":670,"text":59292},{"id":59406,"depth":229,"text":59407,"children":59993},[59994,59995],{"id":59413,"depth":670,"text":59414},{"id":59473,"depth":670,"text":59474},{"id":59518,"depth":229,"text":59519,"children":59997},[59998,59999],{"id":59522,"depth":670,"text":59523},{"id":59529,"depth":670,"text":59530},{"id":59750,"depth":229,"text":59751,"children":60001},[60002,60003,60004],{"id":59754,"depth":670,"text":59755},{"id":59774,"depth":670,"text":59775},{"id":59805,"depth":670,"text":59806},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":60008},[60009,60010],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Ejecuta comandos de EPLAN desde un script en C# con CommandLineInterpreter. Automatiza tareas en EPLAN Electric P8 sin licencias premium.",{},"\u002Fguia\u002Feplan-api\u002Fcap-16-ejecutar-comando-simple",{"title":58582,"description":60011},"guia\u002Feplan-api\u002Fcap-16-ejecutar-comando-simple","EwygfEgZCWJsXx7OlKjyrmD4Rwj_OXeYn9NGaybxacg",{"id":60018,"title":60019,"body":60020,"description":62013,"extension":236,"meta":62014,"navigation":238,"path":62015,"seo":62016,"stem":62017,"tagline":242,"__hash__":62018},"guia\u002Fguia\u002Feplan-api\u002Fcap-17-ejecutar-multiples-comandos.md","Capítulo 17: Ejecutar múltiples comandos en EPLAN",{"type":7,"value":60021,"toc":61968},[60022,60032,60034,60036,60038,60055,60057,60059,60061,60074,60076,60078,60081,60084,60095,60098,60108,60110,60114,60118,60123,60191,60195,60200,60208,60215,60220,60240,60246,60250,60252,60272,60278,60280,60284,60288,60293,60321,60326,60330,60419,60422,60433,60435,60439,60443,60446,60450,60654,60659,60663,60669,60835,60840,60842,60846,60850,60939,60945,60949,61089,61091,61095,61099,61103,61121,61125,61147,61153,61157,61205,61210,61214,61268,61273,61277,61328,61333,61335,61339,61413,61415,61419,61421,61424,61437,61441,61777,61781,61784,61790,61792,61796,61798,61806,61810,61813,61824,61826,61828,61830,61873,61875,61877,61882,61885,61890,61897,61902,61908,61913,61916,61921,61928,61930,61932,61934,61939,61941,61946,61949,61951,61966],[10,60023,60024],{},[13,60025,60026,19,60028,19,60030,262],{},[16,60027,49597],{},[16,60029,58593],{},[16,60031,25],{},[43,60033],{},[46,60035,268],{"id":267},[13,60037,702],{},[126,60039,60040,60043,60046,60049,60052],{},[88,60041,60042],{},"Ejecutar múltiples comandos de EPLAN en secuencia",[88,60044,60045],{},"Crear workflows básicos con CommandLineInterpreter",[88,60047,60048],{},"Entender el orden de ejecución de comandos",[88,60050,60051],{},"Manejar errores en workflows de múltiples comandos",[88,60053,60054],{},"Combinar comandos para automatizar tareas repetitivas",[43,60056],{},[46,60058,320],{"id":319},[13,60060,726],{},[126,60062,60063,60066,60069,60072],{},[88,60064,60065],{},"Haber completado el Capítulo 16 (ejecutar comando simple)",[88,60067,60068],{},"Entender cómo crear una instancia de CommandLineInterpreter",[88,60070,60071],{},"Conocer el método Execute() y su valor de retorno",[88,60073,54674],{},[43,60075],{},[46,60077,49653],{"id":49652},[13,60079,60080],{},"En el capítulo anterior aprendiste a ejecutar un comando simple con CommandLineInterpreter. Pero en el mundo real, raramente ejecutarás solo un comando.",[13,60082,60083],{},"Imagina que quieres automatizar tu proceso diario de trabajo:",[85,60085,60086,60089,60092],{},[88,60087,60088],{},"Generar conexiones y numeración del proyecto",[88,60090,60091],{},"Abrir la ventana de reportes",[88,60093,60094],{},"Verificar el proyecto en busca de errores",[13,60096,60097],{},"¿Tendrías que ejecutar el script tres veces, una por cada comando?",[13,60099,60100,60103,60104,60107],{},[16,60101,60102],{},"No."," Puedes ejecutar múltiples comandos en un mismo script, creando lo que llamamos ",[16,60105,60106],{},"workflows"," (flujos de trabajo).",[43,60109],{},[46,60111,60113],{"id":60112},"_1-script-básico-con-múltiples-comandos","1. Script básico con múltiples comandos",[331,60115,60117],{"id":60116},"_11-ejemplo-del-script-oficial","1.1 Ejemplo del script oficial",[13,60119,56711,60120,416],{},[54,60121,60122],{},"EPLAN-Scripting-4.0\u002F02_RunActions\u002F02_MultipleActions.cs",[543,60124,60126],{"className":545,"code":60125,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class MultiplesComandos\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n\n        cli.Execute(\"generate\");\n        cli.Execute(\"compress\");\n        cli.Execute(\"check\");\n    }\n}\n",[54,60127,60128,60132,60136,60140,60145,60149,60153,60157,60161,60165,60169,60174,60179,60183,60187],{"__ignoreMap":228},[551,60129,60130],{"class":553,"line":554},[551,60131,1133],{},[551,60133,60134],{"class":553,"line":229},[551,60135,49898],{},[551,60137,60138],{"class":553,"line":670},[551,60139,1139],{"emptyLinePlaceholder":238},[551,60141,60142],{"class":553,"line":1136},[551,60143,60144],{},"public class MultiplesComandos\n",[551,60146,60147],{"class":553,"line":1142},[551,60148,1151],{},[551,60150,60151],{"class":553,"line":1148},[551,60152,1157],{},[551,60154,60155],{"class":553,"line":1154},[551,60156,57216],{},[551,60158,60159],{"class":553,"line":1160},[551,60160,1169],{},[551,60162,60163],{"class":553,"line":1166},[551,60164,53406],{},[551,60166,60167],{"class":553,"line":1172},[551,60168,1139],{"emptyLinePlaceholder":238},[551,60170,60171],{"class":553,"line":1178},[551,60172,60173],{},"        cli.Execute(\"generate\");\n",[551,60175,60176],{"class":553,"line":1184},[551,60177,60178],{},"        cli.Execute(\"compress\");\n",[551,60180,60181],{"class":553,"line":1190},[551,60182,58797],{},[551,60184,60185],{"class":553,"line":1472},[551,60186,1187],{},[551,60188,60189],{"class":553,"line":1477},[551,60190,1193],{},[331,60192,60194],{"id":60193},"_12-análisis-línea-por-línea","1.2 Análisis línea por línea",[13,60196,60197],{},[16,60198,60199],{},"Líneas 9-10: Crear CLI una sola vez",[543,60201,60202],{"className":545,"code":52496,"language":547,"meta":228,"style":228},[54,60203,60204],{"__ignoreMap":228},[551,60205,60206],{"class":553,"line":554},[551,60207,52496],{},[13,60209,60210,60211,60214],{},"Creas el intérprete ",[16,60212,60213],{},"una sola vez"," y lo reutilizas para todos los comandos.",[13,60216,60217],{},[16,60218,60219],{},"Líneas 12-14: Ejecutar comandos en secuencia",[543,60221,60223],{"className":545,"code":60222,"language":547,"meta":228,"style":228},"cli.Execute(\"generate\");   \u002F\u002F Comando 1\ncli.Execute(\"compress\");   \u002F\u002F Comando 2\ncli.Execute(\"check\");      \u002F\u002F Comando 3\n",[54,60224,60225,60230,60235],{"__ignoreMap":228},[551,60226,60227],{"class":553,"line":554},[551,60228,60229],{},"cli.Execute(\"generate\");   \u002F\u002F Comando 1\n",[551,60231,60232],{"class":553,"line":229},[551,60233,60234],{},"cli.Execute(\"compress\");   \u002F\u002F Comando 2\n",[551,60236,60237],{"class":553,"line":670},[551,60238,60239],{},"cli.Execute(\"check\");      \u002F\u002F Comando 3\n",[13,60241,60242,60243,60245],{},"Los comandos se ejecutan ",[16,60244,11640],{},", uno después del otro.",[331,60247,60249],{"id":60248},"_13-qué-hace-este-script","1.3 ¿Qué hace este script?",[13,60251,58868],{},[85,60253,60254,60260,60266],{},[88,60255,60256,60259],{},[16,60257,60258],{},"Primer comando",": Genera conexiones y numeración",[88,60261,60262,60265],{},[16,60263,60264],{},"Segundo comando",": Comprime el proyecto (optimiza almacenamiento interno)",[88,60267,60268,60271],{},[16,60269,60270],{},"Tercer comando",": Verifica el proyecto en busca de errores",[13,60273,60274,60275,60277],{},"Todo esto ocurre ",[16,60276,54703],{},", sin intervención del usuario.",[43,60279],{},[46,60281,60283],{"id":60282},"_2-orden-de-ejecución","2. Orden de ejecución",[331,60285,60287],{"id":60286},"_21-ejecución-secuencial","2.1 Ejecución secuencial",[13,60289,60242,60290,416],{},[16,60291,60292],{},"en el orden en que aparecen",[543,60294,60296],{"className":545,"code":60295,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\n\ncli.Execute(\"comando1\");  \u002F\u002F Se ejecuta PRIMERO\ncli.Execute(\"comando2\");  \u002F\u002F Se ejecuta SEGUNDO\ncli.Execute(\"comando3\");  \u002F\u002F Se ejecuta TERCERO\n",[54,60297,60298,60302,60306,60311,60316],{"__ignoreMap":228},[551,60299,60300],{"class":553,"line":554},[551,60301,52496],{},[551,60303,60304],{"class":553,"line":229},[551,60305,1139],{"emptyLinePlaceholder":238},[551,60307,60308],{"class":553,"line":670},[551,60309,60310],{},"cli.Execute(\"comando1\");  \u002F\u002F Se ejecuta PRIMERO\n",[551,60312,60313],{"class":553,"line":1136},[551,60314,60315],{},"cli.Execute(\"comando2\");  \u002F\u002F Se ejecuta SEGUNDO\n",[551,60317,60318],{"class":553,"line":1142},[551,60319,60320],{},"cli.Execute(\"comando3\");  \u002F\u002F Se ejecuta TERCERO\n",[13,60322,60323,60325],{},[16,60324,50964],{}," Cada comando espera a que el anterior termine antes de ejecutarse.",[331,60327,60329],{"id":60328},"_22-ejemplo-práctico-workflow-de-documentación","2.2 Ejemplo práctico: Workflow de documentación",[543,60331,60333],{"className":545,"code":60332,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class WorkflowDocumentacion\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n\n        \u002F\u002F Paso 1: Generar conexiones y numeración\n        cli.Execute(\"generate\");\n\n        \u002F\u002F Paso 2: Comprimir proyecto\n        cli.Execute(\"compress\");\n\n        \u002F\u002F Paso 3: Verificar proyecto\n        cli.Execute(\"check\");\n    }\n}\n",[54,60334,60335,60339,60343,60347,60352,60356,60360,60364,60368,60372,60376,60381,60385,60389,60394,60398,60402,60407,60411,60415],{"__ignoreMap":228},[551,60336,60337],{"class":553,"line":554},[551,60338,1133],{},[551,60340,60341],{"class":553,"line":229},[551,60342,49898],{},[551,60344,60345],{"class":553,"line":670},[551,60346,1139],{"emptyLinePlaceholder":238},[551,60348,60349],{"class":553,"line":1136},[551,60350,60351],{},"public class WorkflowDocumentacion\n",[551,60353,60354],{"class":553,"line":1142},[551,60355,1151],{},[551,60357,60358],{"class":553,"line":1148},[551,60359,1157],{},[551,60361,60362],{"class":553,"line":1154},[551,60363,57216],{},[551,60365,60366],{"class":553,"line":1160},[551,60367,1169],{},[551,60369,60370],{"class":553,"line":1166},[551,60371,53406],{},[551,60373,60374],{"class":553,"line":1172},[551,60375,1139],{"emptyLinePlaceholder":238},[551,60377,60378],{"class":553,"line":1178},[551,60379,60380],{},"        \u002F\u002F Paso 1: Generar conexiones y numeración\n",[551,60382,60383],{"class":553,"line":1184},[551,60384,60173],{},[551,60386,60387],{"class":553,"line":1190},[551,60388,1139],{"emptyLinePlaceholder":238},[551,60390,60391],{"class":553,"line":1472},[551,60392,60393],{},"        \u002F\u002F Paso 2: Comprimir proyecto\n",[551,60395,60396],{"class":553,"line":1477},[551,60397,60178],{},[551,60399,60400],{"class":553,"line":1797},[551,60401,1139],{"emptyLinePlaceholder":238},[551,60403,60404],{"class":553,"line":1802},[551,60405,60406],{},"        \u002F\u002F Paso 3: Verificar proyecto\n",[551,60408,60409],{"class":553,"line":1808},[551,60410,58797],{},[551,60412,60413],{"class":553,"line":1814},[551,60414,1187],{},[551,60416,60417],{"class":553,"line":1820},[551,60418,1193],{},[13,60420,60421],{},"Este script crea un workflow que:",[85,60423,60424,60427,60430],{},[88,60425,60426],{},"Genera conexiones y numeración automáticamente",[88,60428,60429],{},"Comprime el proyecto para optimizar almacenamiento",[88,60431,60432],{},"Verifica el proyecto en busca de errores",[43,60434],{},[46,60436,60438],{"id":60437},"_3-manejo-de-errores-en-workflows","3. Manejo de errores en workflows",[331,60440,60442],{"id":60441},"_31-problema-un-comando-falla","3.1 Problema: Un comando falla",[13,60444,60445],{},"¿Qué pasa si el segundo comando falla? Por defecto, el script continúa ejecutando los siguientes comandos.",[331,60447,60449],{"id":60448},"_32-validar-cada-comando-individualmente","3.2 Validar cada comando individualmente",[543,60451,60453],{"className":545,"code":60452,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class WorkflowConValidacion\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Comando 1: Generar conexiones\n            bool resultado1 = cli.Execute(\"generate\");\n            if (!resultado1)\n            {\n                MessageBox.Show(\"Error al generar\");\n                return;  \u002F\u002F Detener ejecución\n            }\n\n            \u002F\u002F Comando 2: Comprimir proyecto\n            bool resultado2 = cli.Execute(\"compress\");\n            if (!resultado2)\n            {\n                MessageBox.Show(\"Error al comprimir proyecto\");\n                return;  \u002F\u002F Detener ejecución\n            }\n\n            \u002F\u002F Comando 3: Verificar proyecto\n            bool resultado3 = cli.Execute(\"check\");\n            if (!resultado3)\n            {\n                MessageBox.Show(\"Error al verificar proyecto\");\n                return;  \u002F\u002F Detener ejecución\n            }\n\n            MessageBox.Show(\"Workflow completado exitosamente\");\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,60454,60455,60459,60463,60467,60471,60475,60480,60484,60488,60492,60496,60500,60504,60508,60512,60517,60522,60527,60531,60536,60541,60545,60549,60554,60559,60564,60568,60573,60577,60581,60585,60590,60595,60600,60604,60609,60613,60617,60621,60626,60630,60634,60638,60642,60646,60650],{"__ignoreMap":228},[551,60456,60457],{"class":553,"line":554},[551,60458,1123],{},[551,60460,60461],{"class":553,"line":229},[551,60462,1133],{},[551,60464,60465],{"class":553,"line":670},[551,60466,49898],{},[551,60468,60469],{"class":553,"line":1136},[551,60470,50105],{},[551,60472,60473],{"class":553,"line":1142},[551,60474,1139],{"emptyLinePlaceholder":238},[551,60476,60477],{"class":553,"line":1148},[551,60478,60479],{},"public class WorkflowConValidacion\n",[551,60481,60482],{"class":553,"line":1154},[551,60483,1151],{},[551,60485,60486],{"class":553,"line":1160},[551,60487,1157],{},[551,60489,60490],{"class":553,"line":1166},[551,60491,57216],{},[551,60493,60494],{"class":553,"line":1172},[551,60495,1169],{},[551,60497,60498],{"class":553,"line":1178},[551,60499,41211],{},[551,60501,60502],{"class":553,"line":1184},[551,60503,9062],{},[551,60505,60506],{"class":553,"line":1190},[551,60507,55695],{},[551,60509,60510],{"class":553,"line":1472},[551,60511,1139],{"emptyLinePlaceholder":238},[551,60513,60514],{"class":553,"line":1477},[551,60515,60516],{},"            \u002F\u002F Comando 1: Generar conexiones\n",[551,60518,60519],{"class":553,"line":1797},[551,60520,60521],{},"            bool resultado1 = cli.Execute(\"generate\");\n",[551,60523,60524],{"class":553,"line":1802},[551,60525,60526],{},"            if (!resultado1)\n",[551,60528,60529],{"class":553,"line":1808},[551,60530,12301],{},[551,60532,60533],{"class":553,"line":1814},[551,60534,60535],{},"                MessageBox.Show(\"Error al generar\");\n",[551,60537,60538],{"class":553,"line":1820},[551,60539,60540],{},"                return;  \u002F\u002F Detener ejecución\n",[551,60542,60543],{"class":553,"line":1826},[551,60544,12311],{},[551,60546,60547],{"class":553,"line":1832},[551,60548,1139],{"emptyLinePlaceholder":238},[551,60550,60551],{"class":553,"line":1838},[551,60552,60553],{},"            \u002F\u002F Comando 2: Comprimir proyecto\n",[551,60555,60556],{"class":553,"line":1844},[551,60557,60558],{},"            bool resultado2 = cli.Execute(\"compress\");\n",[551,60560,60561],{"class":553,"line":1850},[551,60562,60563],{},"            if (!resultado2)\n",[551,60565,60566],{"class":553,"line":1855},[551,60567,12301],{},[551,60569,60570],{"class":553,"line":1861},[551,60571,60572],{},"                MessageBox.Show(\"Error al comprimir proyecto\");\n",[551,60574,60575],{"class":553,"line":1867},[551,60576,60540],{},[551,60578,60579],{"class":553,"line":1873},[551,60580,12311],{},[551,60582,60583],{"class":553,"line":1878},[551,60584,1139],{"emptyLinePlaceholder":238},[551,60586,60587],{"class":553,"line":1883},[551,60588,60589],{},"            \u002F\u002F Comando 3: Verificar proyecto\n",[551,60591,60592],{"class":553,"line":1888},[551,60593,60594],{},"            bool resultado3 = cli.Execute(\"check\");\n",[551,60596,60597],{"class":553,"line":4615},[551,60598,60599],{},"            if (!resultado3)\n",[551,60601,60602],{"class":553,"line":4620},[551,60603,12301],{},[551,60605,60606],{"class":553,"line":4626},[551,60607,60608],{},"                MessageBox.Show(\"Error al verificar proyecto\");\n",[551,60610,60611],{"class":553,"line":4631},[551,60612,60540],{},[551,60614,60615],{"class":553,"line":4636},[551,60616,12311],{},[551,60618,60619],{"class":553,"line":4641},[551,60620,1139],{"emptyLinePlaceholder":238},[551,60622,60623],{"class":553,"line":4647},[551,60624,60625],{},"            MessageBox.Show(\"Workflow completado exitosamente\");\n",[551,60627,60628],{"class":553,"line":4653},[551,60629,9077],{},[551,60631,60632],{"class":553,"line":4659},[551,60633,41473],{},[551,60635,60636],{"class":553,"line":4665},[551,60637,9062],{},[551,60639,60640],{"class":553,"line":4671},[551,60641,55428],{},[551,60643,60644],{"class":553,"line":4677},[551,60645,9077],{},[551,60647,60648],{"class":553,"line":4683},[551,60649,1187],{},[551,60651,60652],{"class":553,"line":4689},[551,60653,1193],{},[13,60655,60656,60658],{},[16,60657,56969],{}," Si un comando falla, detienes el workflow inmediatamente.",[331,60660,60662],{"id":60661},"_33-continuar-aunque-fallen-comandos","3.3 Continuar aunque fallen comandos",[13,60664,60665,60666,416],{},"A veces quieres ejecutar todos los comandos ",[16,60667,60668],{},"aunque alguno falle",[543,60670,60672],{"className":545,"code":60671,"language":547,"meta":228,"style":228},"using System;\nusing System.Text;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class WorkflowRobusto\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n        StringBuilder reporte = new StringBuilder();\n\n        \u002F\u002F Comando 1: Generar conexiones\n        if (cli.Execute(\"generate\"))\n            reporte.AppendLine(\"✓ Generación completada\");\n        else\n            reporte.AppendLine(\"✗ Error al generar\");\n\n        \u002F\u002F Comando 2: Comprimir proyecto\n        if (cli.Execute(\"compress\"))\n            reporte.AppendLine(\"✓ Compresión completada\");\n        else\n            reporte.AppendLine(\"✗ Error al comprimir proyecto\");\n\n        \u002F\u002F Comando 3: Verificar proyecto\n        if (cli.Execute(\"check\"))\n            reporte.AppendLine(\"✓ Verificación completada\");\n        else\n            reporte.AppendLine(\"✗ Error al verificar proyecto\");\n\n        \u002F\u002F Mostrar reporte final\n        MessageBox.Show(reporte.ToString(), \"Reporte de Ejecución\");\n    }\n}\n",[54,60673,60674,60678,60683,60687,60691,60695,60699,60704,60708,60712,60716,60720,60724,60729,60733,60738,60743,60748,60752,60757,60761,60766,60771,60776,60780,60785,60789,60794,60799,60804,60808,60813,60817,60822,60827,60831],{"__ignoreMap":228},[551,60675,60676],{"class":553,"line":554},[551,60677,1123],{},[551,60679,60680],{"class":553,"line":229},[551,60681,60682],{},"using System.Text;\n",[551,60684,60685],{"class":553,"line":670},[551,60686,1133],{},[551,60688,60689],{"class":553,"line":1136},[551,60690,49898],{},[551,60692,60693],{"class":553,"line":1142},[551,60694,50105],{},[551,60696,60697],{"class":553,"line":1148},[551,60698,1139],{"emptyLinePlaceholder":238},[551,60700,60701],{"class":553,"line":1154},[551,60702,60703],{},"public class WorkflowRobusto\n",[551,60705,60706],{"class":553,"line":1160},[551,60707,1151],{},[551,60709,60710],{"class":553,"line":1166},[551,60711,1157],{},[551,60713,60714],{"class":553,"line":1172},[551,60715,57216],{},[551,60717,60718],{"class":553,"line":1178},[551,60719,1169],{},[551,60721,60722],{"class":553,"line":1184},[551,60723,53406],{},[551,60725,60726],{"class":553,"line":1190},[551,60727,60728],{},"        StringBuilder reporte = new StringBuilder();\n",[551,60730,60731],{"class":553,"line":1472},[551,60732,1139],{"emptyLinePlaceholder":238},[551,60734,60735],{"class":553,"line":1477},[551,60736,60737],{},"        \u002F\u002F Comando 1: Generar conexiones\n",[551,60739,60740],{"class":553,"line":1797},[551,60741,60742],{},"        if (cli.Execute(\"generate\"))\n",[551,60744,60745],{"class":553,"line":1802},[551,60746,60747],{},"            reporte.AppendLine(\"✓ Generación completada\");\n",[551,60749,60750],{"class":553,"line":1808},[551,60751,9082],{},[551,60753,60754],{"class":553,"line":1814},[551,60755,60756],{},"            reporte.AppendLine(\"✗ Error al generar\");\n",[551,60758,60759],{"class":553,"line":1820},[551,60760,1139],{"emptyLinePlaceholder":238},[551,60762,60763],{"class":553,"line":1826},[551,60764,60765],{},"        \u002F\u002F Comando 2: Comprimir proyecto\n",[551,60767,60768],{"class":553,"line":1832},[551,60769,60770],{},"        if (cli.Execute(\"compress\"))\n",[551,60772,60773],{"class":553,"line":1838},[551,60774,60775],{},"            reporte.AppendLine(\"✓ Compresión completada\");\n",[551,60777,60778],{"class":553,"line":1844},[551,60779,9082],{},[551,60781,60782],{"class":553,"line":1850},[551,60783,60784],{},"            reporte.AppendLine(\"✗ Error al comprimir proyecto\");\n",[551,60786,60787],{"class":553,"line":1855},[551,60788,1139],{"emptyLinePlaceholder":238},[551,60790,60791],{"class":553,"line":1861},[551,60792,60793],{},"        \u002F\u002F Comando 3: Verificar proyecto\n",[551,60795,60796],{"class":553,"line":1867},[551,60797,60798],{},"        if (cli.Execute(\"check\"))\n",[551,60800,60801],{"class":553,"line":1873},[551,60802,60803],{},"            reporte.AppendLine(\"✓ Verificación completada\");\n",[551,60805,60806],{"class":553,"line":1878},[551,60807,9082],{},[551,60809,60810],{"class":553,"line":1883},[551,60811,60812],{},"            reporte.AppendLine(\"✗ Error al verificar proyecto\");\n",[551,60814,60815],{"class":553,"line":1888},[551,60816,1139],{"emptyLinePlaceholder":238},[551,60818,60819],{"class":553,"line":4615},[551,60820,60821],{},"        \u002F\u002F Mostrar reporte final\n",[551,60823,60824],{"class":553,"line":4620},[551,60825,60826],{},"        MessageBox.Show(reporte.ToString(), \"Reporte de Ejecución\");\n",[551,60828,60829],{"class":553,"line":4626},[551,60830,1187],{},[551,60832,60833],{"class":553,"line":4631},[551,60834,1193],{},[13,60836,60837,60839],{},[16,60838,56969],{}," Obtienes un reporte completo de qué comandos funcionaron y cuáles no.",[43,60841],{},[46,60843,60845],{"id":60844},"_4-workflows-comunes-con-comandos-verificados","4. Workflows comunes con comandos verificados",[331,60847,60849],{"id":60848},"_41-workflow-de-verificación-del-sistema","4.1 Workflow de verificación del sistema",[543,60851,60853],{"className":545,"code":60852,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class VerificarSistema\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n\n        \u002F\u002F Generar conexiones y numeración\n        cli.Execute(\"generate\");\n\n        \u002F\u002F Comprimir proyecto\n        cli.Execute(\"compress\");\n\n        \u002F\u002F Verificar proyecto\n        cli.Execute(\"check\");\n    }\n}\n",[54,60854,60855,60859,60863,60867,60872,60876,60880,60884,60888,60892,60896,60901,60905,60909,60914,60918,60922,60927,60931,60935],{"__ignoreMap":228},[551,60856,60857],{"class":553,"line":554},[551,60858,1133],{},[551,60860,60861],{"class":553,"line":229},[551,60862,49898],{},[551,60864,60865],{"class":553,"line":670},[551,60866,1139],{"emptyLinePlaceholder":238},[551,60868,60869],{"class":553,"line":1136},[551,60870,60871],{},"public class VerificarSistema\n",[551,60873,60874],{"class":553,"line":1142},[551,60875,1151],{},[551,60877,60878],{"class":553,"line":1148},[551,60879,1157],{},[551,60881,60882],{"class":553,"line":1154},[551,60883,57216],{},[551,60885,60886],{"class":553,"line":1160},[551,60887,1169],{},[551,60889,60890],{"class":553,"line":1166},[551,60891,53406],{},[551,60893,60894],{"class":553,"line":1172},[551,60895,1139],{"emptyLinePlaceholder":238},[551,60897,60898],{"class":553,"line":1178},[551,60899,60900],{},"        \u002F\u002F Generar conexiones y numeración\n",[551,60902,60903],{"class":553,"line":1184},[551,60904,60173],{},[551,60906,60907],{"class":553,"line":1190},[551,60908,1139],{"emptyLinePlaceholder":238},[551,60910,60911],{"class":553,"line":1472},[551,60912,60913],{},"        \u002F\u002F Comprimir proyecto\n",[551,60915,60916],{"class":553,"line":1477},[551,60917,60178],{},[551,60919,60920],{"class":553,"line":1797},[551,60921,1139],{"emptyLinePlaceholder":238},[551,60923,60924],{"class":553,"line":1802},[551,60925,60926],{},"        \u002F\u002F Verificar proyecto\n",[551,60928,60929],{"class":553,"line":1808},[551,60930,58797],{},[551,60932,60933],{"class":553,"line":1814},[551,60934,1187],{},[551,60936,60937],{"class":553,"line":1820},[551,60938,1193],{},[13,60940,60941,60944],{},[16,60942,60943],{},"Uso:"," Ejecutar al iniciar EPLAN para verificar el estado del sistema.",[331,60946,60948],{"id":60947},"_42-workflow-de-mantenimiento","4.2 Workflow de mantenimiento",[543,60950,60952],{"className":545,"code":60951,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class MantenimientoProyecto\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Comprimir proyecto para optimizar almacenamiento\n            if (!cli.Execute(\"compress\"))\n            {\n                MessageBox.Show(\"No se pudo comprimir el proyecto\");\n                return;\n            }\n\n            MessageBox.Show(\n                \"Proyecto comprimido correctamente.\\n\" +\n                \"El almacenamiento interno ha sido optimizado.\",\n                \"Workflow de Mantenimiento\"\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,60953,60954,60958,60962,60966,60970,60975,60979,60983,60987,60991,60995,60999,61003,61007,61012,61017,61021,61026,61030,61034,61038,61042,61047,61052,61057,61061,61065,61069,61073,61077,61081,61085],{"__ignoreMap":228},[551,60955,60956],{"class":553,"line":554},[551,60957,1133],{},[551,60959,60960],{"class":553,"line":229},[551,60961,49898],{},[551,60963,60964],{"class":553,"line":670},[551,60965,50105],{},[551,60967,60968],{"class":553,"line":1136},[551,60969,1139],{"emptyLinePlaceholder":238},[551,60971,60972],{"class":553,"line":1142},[551,60973,60974],{},"public class MantenimientoProyecto\n",[551,60976,60977],{"class":553,"line":1148},[551,60978,1151],{},[551,60980,60981],{"class":553,"line":1154},[551,60982,1157],{},[551,60984,60985],{"class":553,"line":1160},[551,60986,57216],{},[551,60988,60989],{"class":553,"line":1166},[551,60990,1169],{},[551,60992,60993],{"class":553,"line":1172},[551,60994,41211],{},[551,60996,60997],{"class":553,"line":1178},[551,60998,9062],{},[551,61000,61001],{"class":553,"line":1184},[551,61002,55695],{},[551,61004,61005],{"class":553,"line":1190},[551,61006,1139],{"emptyLinePlaceholder":238},[551,61008,61009],{"class":553,"line":1472},[551,61010,61011],{},"            \u002F\u002F Comprimir proyecto para optimizar almacenamiento\n",[551,61013,61014],{"class":553,"line":1477},[551,61015,61016],{},"            if (!cli.Execute(\"compress\"))\n",[551,61018,61019],{"class":553,"line":1797},[551,61020,12301],{},[551,61022,61023],{"class":553,"line":1802},[551,61024,61025],{},"                MessageBox.Show(\"No se pudo comprimir el proyecto\");\n",[551,61027,61028],{"class":553,"line":1808},[551,61029,47614],{},[551,61031,61032],{"class":553,"line":1814},[551,61033,12311],{},[551,61035,61036],{"class":553,"line":1820},[551,61037,1139],{"emptyLinePlaceholder":238},[551,61039,61040],{"class":553,"line":1826},[551,61041,53598],{},[551,61043,61044],{"class":553,"line":1832},[551,61045,61046],{},"                \"Proyecto comprimido correctamente.\\n\" +\n",[551,61048,61049],{"class":553,"line":1838},[551,61050,61051],{},"                \"El almacenamiento interno ha sido optimizado.\",\n",[551,61053,61054],{"class":553,"line":1844},[551,61055,61056],{},"                \"Workflow de Mantenimiento\"\n",[551,61058,61059],{"class":553,"line":1850},[551,61060,53623],{},[551,61062,61063],{"class":553,"line":1855},[551,61064,9077],{},[551,61066,61067],{"class":553,"line":1861},[551,61068,41473],{},[551,61070,61071],{"class":553,"line":1867},[551,61072,9062],{},[551,61074,61075],{"class":553,"line":1873},[551,61076,55428],{},[551,61078,61079],{"class":553,"line":1878},[551,61080,9077],{},[551,61082,61083],{"class":553,"line":1883},[551,61084,1187],{},[551,61086,61087],{"class":553,"line":1888},[551,61088,1193],{},[43,61090],{},[46,61092,61094],{"id":61093},"_5-buenas-prácticas-para-workflows","5. Buenas prácticas para workflows",[331,61096,61098],{"id":61097},"_51-crear-cli-una-sola-vez","5.1 Crear CLI una sola vez",[13,61100,61101],{},[16,61102,57538],{},[543,61104,61106],{"className":545,"code":61105,"language":547,"meta":228,"style":228},"new CommandLineInterpreter().Execute(\"generate\");\nnew CommandLineInterpreter().Execute(\"compress\");\nnew CommandLineInterpreter().Execute(\"check\");\n",[54,61107,61108,61112,61117],{"__ignoreMap":228},[551,61109,61110],{"class":553,"line":554},[551,61111,59266],{},[551,61113,61114],{"class":553,"line":229},[551,61115,61116],{},"new CommandLineInterpreter().Execute(\"compress\");\n",[551,61118,61119],{"class":553,"line":670},[551,61120,59261],{},[13,61122,61123],{},[16,61124,57587],{},[543,61126,61128],{"className":545,"code":61127,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\ncli.Execute(\"generate\");\ncli.Execute(\"compress\");\ncli.Execute(\"check\");\n",[54,61129,61130,61134,61138,61143],{"__ignoreMap":228},[551,61131,61132],{"class":553,"line":554},[551,61133,52496],{},[551,61135,61136],{"class":553,"line":229},[551,61137,59288],{},[551,61139,61140],{"class":553,"line":670},[551,61141,61142],{},"cli.Execute(\"compress\");\n",[551,61144,61145],{"class":553,"line":1136},[551,61146,58852],{},[13,61148,61149,61152],{},[16,61150,61151],{},"Razón:"," Crear múltiples instancias consume más recursos innecesariamente.",[331,61154,61156],{"id":61155},"_52-comentar-cada-paso-del-workflow","5.2 Comentar cada paso del workflow",[543,61158,61160],{"className":545,"code":61159,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\n\n\u002F\u002F Paso 1: Generar conexiones y numeración\ncli.Execute(\"generate\");\n\n\u002F\u002F Paso 2: Comprimir proyecto\ncli.Execute(\"compress\");\n\n\u002F\u002F Paso 3: Verificar proyecto\ncli.Execute(\"check\");\n",[54,61161,61162,61166,61170,61175,61179,61183,61188,61192,61196,61201],{"__ignoreMap":228},[551,61163,61164],{"class":553,"line":554},[551,61165,52496],{},[551,61167,61168],{"class":553,"line":229},[551,61169,1139],{"emptyLinePlaceholder":238},[551,61171,61172],{"class":553,"line":670},[551,61173,61174],{},"\u002F\u002F Paso 1: Generar conexiones y numeración\n",[551,61176,61177],{"class":553,"line":1136},[551,61178,59288],{},[551,61180,61181],{"class":553,"line":1142},[551,61182,1139],{"emptyLinePlaceholder":238},[551,61184,61185],{"class":553,"line":1148},[551,61186,61187],{},"\u002F\u002F Paso 2: Comprimir proyecto\n",[551,61189,61190],{"class":553,"line":1154},[551,61191,61142],{},[551,61193,61194],{"class":553,"line":1160},[551,61195,1139],{"emptyLinePlaceholder":238},[551,61197,61198],{"class":553,"line":1166},[551,61199,61200],{},"\u002F\u002F Paso 3: Verificar proyecto\n",[551,61202,61203],{"class":553,"line":1172},[551,61204,58852],{},[13,61206,61207,61209],{},[16,61208,61151],{}," Hace el código más legible y fácil de mantener.",[331,61211,61213],{"id":61212},"_53-usar-try-catch-general","5.3 Usar try-catch general",[543,61215,61217],{"className":545,"code":61216,"language":547,"meta":228,"style":228},"try\n{\n    CommandLineInterpreter cli = new CommandLineInterpreter();\n    cli.Execute(\"comando1\");\n    cli.Execute(\"comando2\");\n    cli.Execute(\"comando3\");\n}\ncatch (Exception ex)\n{\n    MessageBox.Show(\"Error en workflow: \" + ex.Message);\n}\n",[54,61218,61219,61223,61227,61232,61237,61242,61247,61251,61255,61259,61264],{"__ignoreMap":228},[551,61220,61221],{"class":553,"line":554},[551,61222,43272],{},[551,61224,61225],{"class":553,"line":229},[551,61226,1151],{},[551,61228,61229],{"class":553,"line":670},[551,61230,61231],{},"    CommandLineInterpreter cli = new CommandLineInterpreter();\n",[551,61233,61234],{"class":553,"line":1136},[551,61235,61236],{},"    cli.Execute(\"comando1\");\n",[551,61238,61239],{"class":553,"line":1142},[551,61240,61241],{},"    cli.Execute(\"comando2\");\n",[551,61243,61244],{"class":553,"line":1148},[551,61245,61246],{},"    cli.Execute(\"comando3\");\n",[551,61248,61249],{"class":553,"line":1154},[551,61250,1193],{},[551,61252,61253],{"class":553,"line":1160},[551,61254,43365],{},[551,61256,61257],{"class":553,"line":1166},[551,61258,1151],{},[551,61260,61261],{"class":553,"line":1172},[551,61262,61263],{},"    MessageBox.Show(\"Error en workflow: \" + ex.Message);\n",[551,61265,61266],{"class":553,"line":1178},[551,61267,1193],{},[13,61269,61270,61272],{},[16,61271,61151],{}," Captura cualquier error inesperado en cualquier comando.",[331,61274,61276],{"id":61275},"_54-informar-al-usuario","5.4 Informar al usuario",[543,61278,61280],{"className":545,"code":61279,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\n\nCommandLineInterpreter cli = new CommandLineInterpreter();\n\nMessageBox.Show(\"Iniciando workflow de verificación...\");\n\ncli.Execute(\"generate\");\ncli.Execute(\"compress\");\ncli.Execute(\"check\");\n\nMessageBox.Show(\"Workflow completado\");\n",[54,61281,61282,61286,61290,61294,61298,61303,61307,61311,61315,61319,61323],{"__ignoreMap":228},[551,61283,61284],{"class":553,"line":554},[551,61285,50105],{},[551,61287,61288],{"class":553,"line":229},[551,61289,1139],{"emptyLinePlaceholder":238},[551,61291,61292],{"class":553,"line":670},[551,61293,52496],{},[551,61295,61296],{"class":553,"line":1136},[551,61297,1139],{"emptyLinePlaceholder":238},[551,61299,61300],{"class":553,"line":1142},[551,61301,61302],{},"MessageBox.Show(\"Iniciando workflow de verificación...\");\n",[551,61304,61305],{"class":553,"line":1148},[551,61306,1139],{"emptyLinePlaceholder":238},[551,61308,61309],{"class":553,"line":1154},[551,61310,59288],{},[551,61312,61313],{"class":553,"line":1160},[551,61314,61142],{},[551,61316,61317],{"class":553,"line":1166},[551,61318,58852],{},[551,61320,61321],{"class":553,"line":1172},[551,61322,1139],{"emptyLinePlaceholder":238},[551,61324,61325],{"class":553,"line":1178},[551,61326,61327],{},"MessageBox.Show(\"Workflow completado\");\n",[13,61329,61330,61332],{},[16,61331,61151],{}," El usuario sabe qué está pasando y cuándo terminó.",[43,61334],{},[46,61336,61338],{"id":61337},"_6-diferencias-entre-un-comando-y-múltiples-comandos","6. Diferencias entre un comando y múltiples comandos",[6589,61340,61341,61354],{},[6592,61342,61343],{},[6595,61344,61345,61348,61351],{},[6598,61346,61347],{},"Aspecto",[6598,61349,61350],{},"Un comando",[6598,61352,61353],{},"Múltiples comandos",[6611,61355,61356,61370,61381,61392,61402],{},[6595,61357,61358,61361,61364],{},[6616,61359,61360],{},"Creación de CLI",[6616,61362,61363],{},"Opcional guardar en variable",[6616,61365,61366,61369],{},[16,61367,61368],{},"Obligatorio"," guardar en variable",[6595,61371,61372,61375,61378],{},[6616,61373,61374],{},"Manejo de errores",[6616,61376,61377],{},"Simple: verificar un retorno",[6616,61379,61380],{},"Complejo: verificar múltiples retornos",[6595,61382,61383,61386,61389],{},[6616,61384,61385],{},"Complejidad",[6616,61387,61388],{},"Baja",[6616,61390,61391],{},"Media",[6595,61393,61394,61396,61399],{},[6616,61395,6771],{},[6616,61397,61398],{},"Acción única",[6616,61400,61401],{},"Workflows, automatizaciones",[6595,61403,61404,61407,61410],{},[6616,61405,61406],{},"Tiempo de ejecución",[6616,61408,61409],{},"Rápido",[6616,61411,61412],{},"Depende del número de comandos",[43,61414],{},[46,61416,61418],{"id":61417},"_7-proyecto-del-capítulo-workflow-completo-de-verificación","7. Proyecto del capítulo: Workflow completo de verificación",[331,61420,59523],{"id":59522},[13,61422,61423],{},"Crear un workflow que:",[85,61425,61426,61429,61432,61434],{},[88,61427,61428],{},"Genera conexiones y numeración",[88,61430,61431],{},"Abre la ventana de reportes",[88,61433,60432],{},[88,61435,61436],{},"Informa al usuario del resultado de cada paso",[331,61438,61440],{"id":61439},"_72-implementación-completa","7.2 Implementación completa",[543,61442,61444],{"className":545,"code":61443,"language":547,"meta":228,"style":228},"using System;\nusing System.Text;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class WorkflowVerificacionCompleto\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            \u002F\u002F Crear intérprete de comandos\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Preparar reporte de ejecución\n            StringBuilder reporte = new StringBuilder();\n            reporte.AppendLine(\"WORKFLOW DE VERIFICACIÓN\");\n            reporte.AppendLine(\"======================\");\n            reporte.AppendLine();\n\n            \u002F\u002F Paso 1: Generar conexiones y numeración\n            reporte.Append(\"1. Generando conexiones... \");\n            if (cli.Execute(\"generate\"))\n            {\n                reporte.AppendLine(\"OK\");\n            }\n            else\n            {\n                reporte.AppendLine(\"ERROR\");\n            }\n\n            \u002F\u002F Paso 2: Comprimir proyecto\n            reporte.Append(\"2. Comprimiendo proyecto... \");\n            if (cli.Execute(\"compress\"))\n            {\n                reporte.AppendLine(\"OK\");\n            }\n            else\n            {\n                reporte.AppendLine(\"ERROR\");\n            }\n\n            \u002F\u002F Paso 3: Verificar proyecto\n            reporte.Append(\"3. Verificando proyecto... \");\n            if (cli.Execute(\"check\"))\n            {\n                reporte.AppendLine(\"OK\");\n            }\n            else\n            {\n                reporte.AppendLine(\"ERROR\");\n            }\n\n            \u002F\u002F Mostrar reporte final\n            reporte.AppendLine();\n            reporte.AppendLine(\"Workflow completado.\");\n\n            MessageBox.Show(\n                reporte.ToString(),\n                \"Reporte de Verificación\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\n                \"Error al ejecutar workflow:\\n\" + ex.Message,\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n    }\n}\n",[54,61445,61446,61450,61454,61458,61462,61466,61470,61475,61479,61483,61487,61491,61495,61499,61504,61508,61512,61517,61522,61527,61532,61537,61541,61546,61551,61556,61560,61565,61569,61573,61577,61582,61586,61590,61595,61600,61605,61609,61613,61617,61621,61625,61629,61633,61637,61642,61647,61652,61656,61660,61664,61668,61672,61676,61680,61684,61689,61693,61698,61702,61706,61711,61716,61720,61724,61728,61732,61736,61740,61744,61749,61753,61757,61761,61765,61769,61773],{"__ignoreMap":228},[551,61447,61448],{"class":553,"line":554},[551,61449,1123],{},[551,61451,61452],{"class":553,"line":229},[551,61453,60682],{},[551,61455,61456],{"class":553,"line":670},[551,61457,1133],{},[551,61459,61460],{"class":553,"line":1136},[551,61461,49898],{},[551,61463,61464],{"class":553,"line":1142},[551,61465,50105],{},[551,61467,61468],{"class":553,"line":1148},[551,61469,1139],{"emptyLinePlaceholder":238},[551,61471,61472],{"class":553,"line":1154},[551,61473,61474],{},"public class WorkflowVerificacionCompleto\n",[551,61476,61477],{"class":553,"line":1160},[551,61478,1151],{},[551,61480,61481],{"class":553,"line":1166},[551,61482,1157],{},[551,61484,61485],{"class":553,"line":1172},[551,61486,57216],{},[551,61488,61489],{"class":553,"line":1178},[551,61490,1169],{},[551,61492,61493],{"class":553,"line":1184},[551,61494,41211],{},[551,61496,61497],{"class":553,"line":1190},[551,61498,9062],{},[551,61500,61501],{"class":553,"line":1472},[551,61502,61503],{},"            \u002F\u002F Crear intérprete de comandos\n",[551,61505,61506],{"class":553,"line":1477},[551,61507,55695],{},[551,61509,61510],{"class":553,"line":1797},[551,61511,1139],{"emptyLinePlaceholder":238},[551,61513,61514],{"class":553,"line":1802},[551,61515,61516],{},"            \u002F\u002F Preparar reporte de ejecución\n",[551,61518,61519],{"class":553,"line":1808},[551,61520,61521],{},"            StringBuilder reporte = new StringBuilder();\n",[551,61523,61524],{"class":553,"line":1814},[551,61525,61526],{},"            reporte.AppendLine(\"WORKFLOW DE VERIFICACIÓN\");\n",[551,61528,61529],{"class":553,"line":1820},[551,61530,61531],{},"            reporte.AppendLine(\"======================\");\n",[551,61533,61534],{"class":553,"line":1826},[551,61535,61536],{},"            reporte.AppendLine();\n",[551,61538,61539],{"class":553,"line":1832},[551,61540,1139],{"emptyLinePlaceholder":238},[551,61542,61543],{"class":553,"line":1838},[551,61544,61545],{},"            \u002F\u002F Paso 1: Generar conexiones y numeración\n",[551,61547,61548],{"class":553,"line":1844},[551,61549,61550],{},"            reporte.Append(\"1. Generando conexiones... \");\n",[551,61552,61553],{"class":553,"line":1850},[551,61554,61555],{},"            if (cli.Execute(\"generate\"))\n",[551,61557,61558],{"class":553,"line":1855},[551,61559,12301],{},[551,61561,61562],{"class":553,"line":1861},[551,61563,61564],{},"                reporte.AppendLine(\"OK\");\n",[551,61566,61567],{"class":553,"line":1867},[551,61568,12311],{},[551,61570,61571],{"class":553,"line":1873},[551,61572,15260],{},[551,61574,61575],{"class":553,"line":1878},[551,61576,12301],{},[551,61578,61579],{"class":553,"line":1883},[551,61580,61581],{},"                reporte.AppendLine(\"ERROR\");\n",[551,61583,61584],{"class":553,"line":1888},[551,61585,12311],{},[551,61587,61588],{"class":553,"line":4615},[551,61589,1139],{"emptyLinePlaceholder":238},[551,61591,61592],{"class":553,"line":4620},[551,61593,61594],{},"            \u002F\u002F Paso 2: Comprimir proyecto\n",[551,61596,61597],{"class":553,"line":4626},[551,61598,61599],{},"            reporte.Append(\"2. Comprimiendo proyecto... \");\n",[551,61601,61602],{"class":553,"line":4631},[551,61603,61604],{},"            if (cli.Execute(\"compress\"))\n",[551,61606,61607],{"class":553,"line":4636},[551,61608,12301],{},[551,61610,61611],{"class":553,"line":4641},[551,61612,61564],{},[551,61614,61615],{"class":553,"line":4647},[551,61616,12311],{},[551,61618,61619],{"class":553,"line":4653},[551,61620,15260],{},[551,61622,61623],{"class":553,"line":4659},[551,61624,12301],{},[551,61626,61627],{"class":553,"line":4665},[551,61628,61581],{},[551,61630,61631],{"class":553,"line":4671},[551,61632,12311],{},[551,61634,61635],{"class":553,"line":4677},[551,61636,1139],{"emptyLinePlaceholder":238},[551,61638,61639],{"class":553,"line":4683},[551,61640,61641],{},"            \u002F\u002F Paso 3: Verificar proyecto\n",[551,61643,61644],{"class":553,"line":4689},[551,61645,61646],{},"            reporte.Append(\"3. Verificando proyecto... \");\n",[551,61648,61649],{"class":553,"line":4695},[551,61650,61651],{},"            if (cli.Execute(\"check\"))\n",[551,61653,61654],{"class":553,"line":4701},[551,61655,12301],{},[551,61657,61658],{"class":553,"line":4707},[551,61659,61564],{},[551,61661,61662],{"class":553,"line":4713},[551,61663,12311],{},[551,61665,61666],{"class":553,"line":4719},[551,61667,15260],{},[551,61669,61670],{"class":553,"line":4725},[551,61671,12301],{},[551,61673,61674],{"class":553,"line":4731},[551,61675,61581],{},[551,61677,61678],{"class":553,"line":4737},[551,61679,12311],{},[551,61681,61682],{"class":553,"line":4743},[551,61683,1139],{"emptyLinePlaceholder":238},[551,61685,61686],{"class":553,"line":4749},[551,61687,61688],{},"            \u002F\u002F Mostrar reporte final\n",[551,61690,61691],{"class":553,"line":4755},[551,61692,61536],{},[551,61694,61695],{"class":553,"line":4761},[551,61696,61697],{},"            reporte.AppendLine(\"Workflow completado.\");\n",[551,61699,61700],{"class":553,"line":4766},[551,61701,1139],{"emptyLinePlaceholder":238},[551,61703,61704],{"class":553,"line":4771},[551,61705,53598],{},[551,61707,61708],{"class":553,"line":4777},[551,61709,61710],{},"                reporte.ToString(),\n",[551,61712,61713],{"class":553,"line":4782},[551,61714,61715],{},"                \"Reporte de Verificación\",\n",[551,61717,61718],{"class":553,"line":4787},[551,61719,53613],{},[551,61721,61722],{"class":553,"line":4793},[551,61723,53618],{},[551,61725,61726],{"class":553,"line":4799},[551,61727,53623],{},[551,61729,61730],{"class":553,"line":4805},[551,61731,9077],{},[551,61733,61734],{"class":553,"line":4811},[551,61735,41473],{},[551,61737,61738],{"class":553,"line":4817},[551,61739,9062],{},[551,61741,61742],{"class":553,"line":4822},[551,61743,53598],{},[551,61745,61746],{"class":553,"line":4827},[551,61747,61748],{},"                \"Error al ejecutar workflow:\\n\" + ex.Message,\n",[551,61750,61751],{"class":553,"line":9183},[551,61752,53649],{},[551,61754,61755],{"class":553,"line":9188},[551,61756,53613],{},[551,61758,61759],{"class":553,"line":9193},[551,61760,53658],{},[551,61762,61763],{"class":553,"line":9198},[551,61764,53623],{},[551,61766,61767],{"class":553,"line":9204},[551,61768,9077],{},[551,61770,61771],{"class":553,"line":9209},[551,61772,1187],{},[551,61774,61775],{"class":553,"line":9214},[551,61776,1193],{},[331,61778,61780],{"id":61779},"_73-salida-esperada","7.3 Salida esperada",[13,61782,61783],{},"Al ejecutar este script, verás un mensaje como:",[543,61785,61788],{"className":61786,"code":61787,"language":847},[845],"WORKFLOW DE VERIFICACIÓN\n======================\n\n1. Generando conexiones... OK\n2. Abriendo ventana de reportes... OK\n3. Verificando proyecto... OK\n\nWorkflow completado.\n",[54,61789,61787],{"__ignoreMap":228},[43,61791],{},[46,61793,61795],{"id":61794},"_8-limitaciones-actuales","8. Limitaciones actuales",[331,61797,59755],{"id":59754},[13,61799,61800,61801,61803,61804,59771],{},"Hasta ahora solo puedes ejecutar comandos ",[16,61802,59764],{},". Para comandos que necesitan parámetros (como exportar a una ruta específica), necesitas ",[16,61805,59770],{},[331,61807,61809],{"id":61808},"_82-sin-condicionales-entre-comandos","8.2 Sin condicionales entre comandos",[13,61811,61812],{},"Por ahora, todos los comandos se ejecutan siempre. Más adelante aprenderás a:",[126,61814,61815,61818,61821],{},[88,61816,61817],{},"Ejecutar comando 2 solo si comando 1 tuvo éxito",[88,61819,61820],{},"Saltar comandos según condiciones",[88,61822,61823],{},"Crear workflows más complejos",[43,61825],{},[46,61827,22685],{"id":22684},[13,61829,22688],{},[126,61831,61832,61839,61845,61851,61854,61859,61867],{},[88,61833,61834,61835,61838],{},"Puedes ejecutar ",[16,61836,61837],{},"múltiples comandos"," con el mismo CommandLineInterpreter",[88,61840,60242,61841,61844],{},[16,61842,61843],{},"en secuencia",", uno después del otro",[88,61846,61847,61848,61850],{},"Crear el CLI ",[16,61849,60213],{}," y reutilizarlo es más eficiente",[88,61852,61853],{},"Puedes validar cada comando individualmente o crear reportes completos",[88,61855,21963,61856,61858],{},[16,61857,60106],{}," automatizan tareas repetitivas combinando múltiples comandos",[88,61860,49324,61861,4842,61863,61866],{},[16,61862,49347],{},[16,61864,61865],{},"comenta cada paso"," del workflow",[88,61868,61869,61872],{},[16,61870,61871],{},"StringBuilder"," es útil para crear reportes de múltiples pasos",[43,61874],{},[46,61876,5728],{"id":5727},[13,61878,61879],{},[16,61880,61881],{},"P: ¿Cuántos comandos puedo ejecutar en un mismo script?",[13,61883,61884],{},"R: No hay un límite definido, pero ten en cuenta el tiempo de ejecución. Workflows de 10-20 comandos son comunes.",[13,61886,61887],{},[16,61888,61889],{},"P: ¿Los comandos se ejecutan en paralelo o en secuencia?",[13,61891,61892,61893,61896],{},"R: En ",[16,61894,61895],{},"secuencia",". Cada comando espera a que el anterior termine.",[13,61898,61899],{},[16,61900,61901],{},"P: ¿Qué pasa si el segundo comando depende del resultado del primero?",[13,61903,61904,61905],{},"R: Debes verificar el valor de retorno del primer comando antes de ejecutar el segundo. Esto lo puedes hacer con ",[54,61906,61907],{},"if (!cli.Execute(...)) return;",[13,61909,61910],{},[16,61911,61912],{},"P: ¿Puedo ejecutar el mismo comando varias veces?",[13,61914,61915],{},"R: Sí, puedes ejecutar el mismo comando múltiples veces si es necesario.",[13,61917,61918],{},[16,61919,61920],{},"P: ¿Cómo puedo pausar entre comandos?",[13,61922,61923,61924,61927],{},"R: Usa ",[54,61925,61926],{},"System.Threading.Thread.Sleep(milliseconds)"," para pausar entre comandos, aunque generalmente no es necesario.",[43,61929],{},[46,61931,51782],{"id":36078},[331,61933,51786],{"id":51785},[13,61935,61936],{},[16,61937,61938],{},"Capítulo 16: Ejecutar un comando simple",[331,61940,51795],{"id":51794},[13,61942,61943],{},[16,61944,61945],{},"Capítulo 18: Comandos con parámetros",[13,61947,61948],{},"En el próximo capítulo aprenderás a ejecutar comandos que requieren parámetros usando ActionCallingContext, como exportar archivos a rutas específicas.",[43,61950],{},[13,61952,61953,10676,61955,54528,61957,93,61959,61962,93,61964],{},[31,61954,657],{},[31,61956,10679],{},[31,61958,10683],{},[54,61960,61961],{},"code\u002Fcap-17\u002F",[31,61963,51827],{},[54,61965,60122],{},[660,61967,662],{},{"title":228,"searchDepth":229,"depth":229,"links":61969},[61970,61971,61972,61973,61978,61982,61987,61991,61997,61998,62003,62007,62008,62009],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":60112,"depth":229,"text":60113,"children":61974},[61975,61976,61977],{"id":60116,"depth":670,"text":60117},{"id":60193,"depth":670,"text":60194},{"id":60248,"depth":670,"text":60249},{"id":60282,"depth":229,"text":60283,"children":61979},[61980,61981],{"id":60286,"depth":670,"text":60287},{"id":60328,"depth":670,"text":60329},{"id":60437,"depth":229,"text":60438,"children":61983},[61984,61985,61986],{"id":60441,"depth":670,"text":60442},{"id":60448,"depth":670,"text":60449},{"id":60661,"depth":670,"text":60662},{"id":60844,"depth":229,"text":60845,"children":61988},[61989,61990],{"id":60848,"depth":670,"text":60849},{"id":60947,"depth":670,"text":60948},{"id":61093,"depth":229,"text":61094,"children":61992},[61993,61994,61995,61996],{"id":61097,"depth":670,"text":61098},{"id":61155,"depth":670,"text":61156},{"id":61212,"depth":670,"text":61213},{"id":61275,"depth":670,"text":61276},{"id":61337,"depth":229,"text":61338},{"id":61417,"depth":229,"text":61418,"children":61999},[62000,62001,62002],{"id":59522,"depth":670,"text":59523},{"id":61439,"depth":670,"text":61440},{"id":61779,"depth":670,"text":61780},{"id":61794,"depth":229,"text":61795,"children":62004},[62005,62006],{"id":59754,"depth":670,"text":59755},{"id":61808,"depth":670,"text":61809},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":62010},[62011,62012],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Encadena varios comandos en un script EPLAN con CommandLineInterpreter y automatiza flujos completos en EPLAN Electric P8.",{},"\u002Fguia\u002Feplan-api\u002Fcap-17-ejecutar-multiples-comandos",{"title":60019,"description":62013},"guia\u002Feplan-api\u002Fcap-17-ejecutar-multiples-comandos","iKrrBMG7SvlKVj-SUBay6BLRICGAfzZYgJV7ewdi39c",{"id":62020,"title":62021,"body":62022,"description":63581,"extension":236,"meta":63582,"navigation":238,"path":63583,"seo":63584,"stem":63585,"tagline":242,"__hash__":63586},"guia\u002Fguia\u002Feplan-api\u002Fcap-18-comandos-con-parametros.md","Capítulo 18: Comandos con parámetros en EPLAN",{"type":7,"value":62023,"toc":63530},[62024,62034,62036,62038,62040,62057,62059,62061,62063,62074,62076,62078,62088,62102,62107,62109,62113,62115,62120,62125,62168,62170,62173,62181,62183,62187,62191,62197,62275,62277,62282,62290,62293,62298,62306,62312,62317,62326,62335,62340,62349,62352,62354,62358,62360,62369,62373,62385,62389,62392,62457,62466,62470,62473,62502,62504,62508,62512,62521,62525,62538,62542,62549,62553,62558,62570,62575,62597,62599,62603,62607,62772,62774,62778,62782,62788,62845,62849,62852,62915,62920,62922,62926,63057,63062,63064,63068,63072,63131,63135,63141,63145,63154,63158,63167,63173,63177,63195,63199,63227,63229,63231,63235,63239,63258,63263,63286,63290,63294,63303,63307,63316,63320,63324,63333,63337,63346,63348,63352,63356,63359,63373,63377,63380,63406,63408,63410,63412,63449,63451,63453,63458,63467,63472,63475,63480,63483,63488,63491,63493,63495,63497,63501,63503,63508,63511,63513,63528],[10,62025,62026],{},[13,62027,62028,19,62030,19,62032,56383],{},[16,62029,49597],{},[16,62031,58593],{},[16,62033,25],{},[43,62035],{},[46,62037,268],{"id":267},[13,62039,702],{},[126,62041,62042,62045,62048,62051,62054],{},[88,62043,62044],{},"Entender qué es ActionCallingContext",[88,62046,62047],{},"Pasar parámetros a comandos de EPLAN",[88,62049,62050],{},"Usar AddParameter() correctamente",[88,62052,62053],{},"Ejecutar comandos que requieren configuración",[88,62055,62056],{},"Combinar múltiples parámetros en un mismo comando",[43,62058],{},[46,62060,320],{"id":319},[13,62062,726],{},[126,62064,62065,62068,62071],{},[88,62066,62067],{},"Haber completado los Capítulos 16-17",[88,62069,62070],{},"Saber ejecutar comandos simples y múltiples con CommandLineInterpreter",[88,62072,62073],{},"Entender el método Execute()",[43,62075],{},[46,62077,49653],{"id":49652},[13,62079,62080,62081,62084,62085,62087],{},"Hasta ahora has ejecutado comandos simples como ",[54,62082,62083],{},"cli.Execute(\"check\")",". Pero muchos comandos de EPLAN necesitan ",[16,62086,29751],{}," adicionales:",[126,62089,62090,62093,62096,62099],{},[88,62091,62092],{},"Exportar a una ruta específica",[88,62094,62095],{},"Abrir un archivo concreto",[88,62097,62098],{},"Configurar propiedades con valores específicos",[88,62100,62101],{},"Ejecutar acciones con opciones personalizadas",[13,62103,62104,62105,41],{},"Para pasar parámetros a los comandos, necesitas ",[16,62106,59770],{},[43,62108],{},[46,62110,62112],{"id":62111},"_1-qué-es-actioncallingcontext","1. ¿Qué es ActionCallingContext?",[331,62114,49681],{"id":49680},[13,62116,62117,62119],{},[16,62118,59770],{}," es un contenedor de parámetros que se pasa a los comandos cuando estos requieren configuración adicional.",[13,62121,62122,62124],{},[16,62123,49878],{}," Es como pasar argumentos a una función en C#:",[543,62126,62128],{"className":545,"code":62127,"language":547,"meta":228,"style":228},"\u002F\u002F En C#:\nMiMetodo(parametro1, parametro2);\n\n\u002F\u002F Con EPLAN API:\nActionCallingContext acc = new ActionCallingContext();\nacc.AddParameter(\"nombre1\", \"valor1\");\nacc.AddParameter(\"nombre2\", \"valor2\");\ncli.Execute(\"comando\", acc);\n",[54,62129,62130,62135,62140,62144,62149,62153,62158,62163],{"__ignoreMap":228},[551,62131,62132],{"class":553,"line":554},[551,62133,62134],{},"\u002F\u002F En C#:\n",[551,62136,62137],{"class":553,"line":229},[551,62138,62139],{},"MiMetodo(parametro1, parametro2);\n",[551,62141,62142],{"class":553,"line":670},[551,62143,1139],{"emptyLinePlaceholder":238},[551,62145,62146],{"class":553,"line":1136},[551,62147,62148],{},"\u002F\u002F Con EPLAN API:\n",[551,62150,62151],{"class":553,"line":1142},[551,62152,55901],{},[551,62154,62155],{"class":553,"line":1148},[551,62156,62157],{},"acc.AddParameter(\"nombre1\", \"valor1\");\n",[551,62159,62160],{"class":553,"line":1154},[551,62161,62162],{},"acc.AddParameter(\"nombre2\", \"valor2\");\n",[551,62164,62165],{"class":553,"line":1160},[551,62166,62167],{},"cli.Execute(\"comando\", acc);\n",[331,62169,58687],{"id":58686},[13,62171,62172],{},"ActionCallingContext está en el mismo namespace que CommandLineInterpreter:",[543,62174,62175],{"className":545,"code":1133,"language":547,"meta":228,"style":228},[54,62176,62177],{"__ignoreMap":228},[551,62178,62179],{"class":553,"line":554},[551,62180,1133],{},[43,62182],{},[46,62184,62186],{"id":62185},"_2-estructura-básica-con-parámetros","2. Estructura básica con parámetros",[331,62188,62190],{"id":62189},"_21-script-del-ejemplo-oficial","2.1 Script del ejemplo oficial",[13,62192,62193,62194,416],{},"Basado en ",[54,62195,62196],{},"EPLAN-Scripting-4.0\u002F02_RunActions\u002F03_ActionsWithParameter.cs",[543,62198,62200],{"className":545,"code":62199,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class ComandoConParametros\n{\n    [Start]\n    public void Function()\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n        ActionCallingContext acc = new ActionCallingContext();\n\n        \u002F\u002F Según la documentación, los parámetros de interacción van en el Name\n        acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n\n        cli.Execute(\"XGedStartInteractionAction\", acc);\n    }\n}\n",[54,62201,62202,62206,62210,62214,62219,62223,62227,62231,62235,62239,62244,62248,62253,62258,62262,62267,62271],{"__ignoreMap":228},[551,62203,62204],{"class":553,"line":554},[551,62205,1133],{},[551,62207,62208],{"class":553,"line":229},[551,62209,49898],{},[551,62211,62212],{"class":553,"line":670},[551,62213,1139],{"emptyLinePlaceholder":238},[551,62215,62216],{"class":553,"line":1136},[551,62217,62218],{},"public class ComandoConParametros\n",[551,62220,62221],{"class":553,"line":1142},[551,62222,1151],{},[551,62224,62225],{"class":553,"line":1148},[551,62226,1157],{},[551,62228,62229],{"class":553,"line":1154},[551,62230,57216],{},[551,62232,62233],{"class":553,"line":1160},[551,62234,1169],{},[551,62236,62237],{"class":553,"line":1166},[551,62238,53406],{},[551,62240,62241],{"class":553,"line":1172},[551,62242,62243],{},"        ActionCallingContext acc = new ActionCallingContext();\n",[551,62245,62246],{"class":553,"line":1178},[551,62247,1139],{"emptyLinePlaceholder":238},[551,62249,62250],{"class":553,"line":1184},[551,62251,62252],{},"        \u002F\u002F Según la documentación, los parámetros de interacción van en el Name\n",[551,62254,62255],{"class":553,"line":1190},[551,62256,62257],{},"        acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n",[551,62259,62260],{"class":553,"line":1472},[551,62261,1139],{"emptyLinePlaceholder":238},[551,62263,62264],{"class":553,"line":1477},[551,62265,62266],{},"        cli.Execute(\"XGedStartInteractionAction\", acc);\n",[551,62268,62269],{"class":553,"line":1797},[551,62270,1187],{},[551,62272,62273],{"class":553,"line":1802},[551,62274,1193],{},[331,62276,58809],{"id":58808},[13,62278,62279],{},[16,62280,62281],{},"Línea 9: Crear CommandLineInterpreter",[543,62283,62284],{"className":545,"code":52496,"language":547,"meta":228,"style":228},[54,62285,62286],{"__ignoreMap":228},[551,62287,62288],{"class":553,"line":554},[551,62289,52496],{},[13,62291,62292],{},"Como siempre, necesitas el intérprete de comandos.",[13,62294,62295],{},[16,62296,62297],{},"Línea 10: Crear ActionCallingContext",[543,62299,62300],{"className":545,"code":55901,"language":547,"meta":228,"style":228},[54,62301,62302],{"__ignoreMap":228},[551,62303,62304],{"class":553,"line":554},[551,62305,55901],{},[13,62307,62308,62309,41],{},"Creas el contenedor de parámetros ",[16,62310,62311],{},"vacío",[13,62313,62314],{},[16,62315,62316],{},"Línea 12: Agregar parámetro con interacción",[543,62318,62320],{"className":545,"code":62319,"language":547,"meta":228,"style":228},"acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n",[54,62321,62322],{"__ignoreMap":228},[551,62323,62324],{"class":553,"line":554},[551,62325,62319],{},[13,62327,62328,62329,62331,62332,41],{},"Según la documentación oficial, los parámetros de interacción se concatenan al nombre con barra (",[54,62330,6060],{},"). El formato es: ",[54,62333,62334],{},"NombreInteraccion\u002Fparam1:valor1\u002Fparam2:valor2",[13,62336,62337],{},[16,62338,62339],{},"Línea 14: Ejecutar comando con parámetros",[543,62341,62343],{"className":545,"code":62342,"language":547,"meta":228,"style":228},"cli.Execute(\"XGedStartInteractionAction\", acc);\n",[54,62344,62345],{"__ignoreMap":228},[551,62346,62347],{"class":553,"line":554},[551,62348,62342],{},[13,62350,62351],{},"Pasas el contexto como segundo parámetro de Execute().",[43,62353],{},[46,62355,62357],{"id":62356},"_3-addparameter-en-detalle","3. AddParameter() en detalle",[331,62359,58895],{"id":58894},[543,62361,62363],{"className":545,"code":62362,"language":547,"meta":228,"style":228},"acc.AddParameter(string nombre, string valor);\n",[54,62364,62365],{"__ignoreMap":228},[551,62366,62367],{"class":553,"line":554},[551,62368,62362],{},[13,62370,62371],{},[16,62372,58909],{},[126,62374,62375,62380],{},[88,62376,62377,62379],{},[54,62378,2436],{}," - Nombre del parámetro (definido por la acción)",[88,62381,62382,62384],{},[54,62383,2440],{}," - Valor del parámetro (siempre como string)",[331,62386,62388],{"id":62387},"_32-tipos-de-valores","3.2 Tipos de valores",[13,62390,62391],{},"Aunque AddParameter() siempre recibe strings, los valores pueden representar diferentes tipos:",[543,62393,62395],{"className":545,"code":62394,"language":547,"meta":228,"style":228},"ActionCallingContext acc = new ActionCallingContext();\n\n\u002F\u002F String\nacc.AddParameter(\"FILENAME\", \"reporte.pdf\");\n\n\u002F\u002F Número (como string)\nacc.AddParameter(\"height\", \"20\");\n\n\u002F\u002F Booleano (como string)\nacc.AddParameter(\"OVERWRITE\", \"1\");  \u002F\u002F 1 = true, 0 = false\n\n\u002F\u002F Ruta\nacc.AddParameter(\"EXPORTFILE\", @\"C:\\temp\\export.xml\");\n",[54,62396,62397,62401,62405,62410,62415,62419,62424,62429,62433,62438,62443,62447,62452],{"__ignoreMap":228},[551,62398,62399],{"class":553,"line":554},[551,62400,55901],{},[551,62402,62403],{"class":553,"line":229},[551,62404,1139],{"emptyLinePlaceholder":238},[551,62406,62407],{"class":553,"line":670},[551,62408,62409],{},"\u002F\u002F String\n",[551,62411,62412],{"class":553,"line":1136},[551,62413,62414],{},"acc.AddParameter(\"FILENAME\", \"reporte.pdf\");\n",[551,62416,62417],{"class":553,"line":1142},[551,62418,1139],{"emptyLinePlaceholder":238},[551,62420,62421],{"class":553,"line":1148},[551,62422,62423],{},"\u002F\u002F Número (como string)\n",[551,62425,62426],{"class":553,"line":1154},[551,62427,62428],{},"acc.AddParameter(\"height\", \"20\");\n",[551,62430,62431],{"class":553,"line":1160},[551,62432,1139],{"emptyLinePlaceholder":238},[551,62434,62435],{"class":553,"line":1166},[551,62436,62437],{},"\u002F\u002F Booleano (como string)\n",[551,62439,62440],{"class":553,"line":1172},[551,62441,62442],{},"acc.AddParameter(\"OVERWRITE\", \"1\");  \u002F\u002F 1 = true, 0 = false\n",[551,62444,62445],{"class":553,"line":1178},[551,62446,1139],{"emptyLinePlaceholder":238},[551,62448,62449],{"class":553,"line":1184},[551,62450,62451],{},"\u002F\u002F Ruta\n",[551,62453,62454],{"class":553,"line":1190},[551,62455,62456],{},"acc.AddParameter(\"EXPORTFILE\", @\"C:\\temp\\export.xml\");\n",[13,62458,62459,62461,62462,62465],{},[16,62460,50964],{}," Todos los valores se pasan como ",[16,62463,62464],{},"string",", incluso números y booleanos.",[331,62467,62469],{"id":62468},"_33-múltiples-parámetros","3.3 Múltiples parámetros",[13,62471,62472],{},"Puedes agregar tantos parámetros como necesites:",[543,62474,62476],{"className":545,"code":62475,"language":547,"meta":228,"style":228},"ActionCallingContext acc = new ActionCallingContext();\nacc.AddParameter(\"parametro1\", \"valor1\");\nacc.AddParameter(\"parametro2\", \"valor2\");\nacc.AddParameter(\"parametro3\", \"valor3\");\n\u002F\u002F ... etc\n",[54,62477,62478,62482,62487,62492,62497],{"__ignoreMap":228},[551,62479,62480],{"class":553,"line":554},[551,62481,55901],{},[551,62483,62484],{"class":553,"line":229},[551,62485,62486],{},"acc.AddParameter(\"parametro1\", \"valor1\");\n",[551,62488,62489],{"class":553,"line":670},[551,62490,62491],{},"acc.AddParameter(\"parametro2\", \"valor2\");\n",[551,62493,62494],{"class":553,"line":1136},[551,62495,62496],{},"acc.AddParameter(\"parametro3\", \"valor3\");\n",[551,62498,62499],{"class":553,"line":1142},[551,62500,62501],{},"\u002F\u002F ... etc\n",[43,62503],{},[46,62505,62507],{"id":62506},"_4-comando-execute-con-parámetros","4. Comando Execute() con parámetros",[331,62509,62511],{"id":62510},"_41-sintaxis-completa","4.1 Sintaxis completa",[543,62513,62515],{"className":545,"code":62514,"language":547,"meta":228,"style":228},"bool Execute(string actionName, ActionCallingContext context);\n",[54,62516,62517],{"__ignoreMap":228},[551,62518,62519],{"class":553,"line":554},[551,62520,62514],{},[13,62522,62523],{},[16,62524,58909],{},[126,62526,62527,62532],{},[88,62528,62529,62531],{},[54,62530,58916],{}," - Nombre del comando",[88,62533,62534,62537],{},[54,62535,62536],{},"context"," - Contexto con los parámetros (opcional)",[13,62539,62540],{},[16,62541,55505],{},[126,62543,62544],{},[88,62545,62546,62548],{},[54,62547,6586],{}," - true si éxito, false si falló",[331,62550,62552],{"id":62551},"_42-comparación-con-y-sin-parámetros","4.2 Comparación: Con y sin parámetros",[13,62554,62555],{},[16,62556,62557],{},"Sin parámetros:",[543,62559,62560],{"className":545,"code":59070,"language":547,"meta":228,"style":228},[54,62561,62562,62566],{"__ignoreMap":228},[551,62563,62564],{"class":553,"line":554},[551,62565,52496],{},[551,62567,62568],{"class":553,"line":229},[551,62569,58852],{},[13,62571,62572],{},[16,62573,62574],{},"Con parámetros:",[543,62576,62578],{"className":545,"code":62577,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\nActionCallingContext acc = new ActionCallingContext();\nacc.AddParameter(\"PARAMETRO\", \"valor\");\ncli.Execute(\"comando\", acc);\n",[54,62579,62580,62584,62588,62593],{"__ignoreMap":228},[551,62581,62582],{"class":553,"line":554},[551,62583,52496],{},[551,62585,62586],{"class":553,"line":229},[551,62587,55901],{},[551,62589,62590],{"class":553,"line":670},[551,62591,62592],{},"acc.AddParameter(\"PARAMETRO\", \"valor\");\n",[551,62594,62595],{"class":553,"line":1136},[551,62596,62167],{},[43,62598],{},[46,62600,62602],{"id":62601},"_5-ejemplo-práctico-configurar-acción","5. Ejemplo práctico: Configurar acción",[331,62604,62606],{"id":62605},"_51-script-completo-con-validación","5.1 Script completo con validación",[543,62608,62610],{"className":545,"code":62609,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ConfigurarAccion\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            \u002F\u002F Crear intérprete y contexto\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n            ActionCallingContext acc = new ActionCallingContext();\n\n            \u002F\u002F Configurar parámetros (interacción con parámetros concatenados)\n            acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n\n            \u002F\u002F Ejecutar comando con parámetros\n            bool resultado = cli.Execute(\"XGedStartInteractionAction\", acc);\n\n            \u002F\u002F Verificar resultado\n            if (resultado)\n            {\n                MessageBox.Show(\"Comando ejecutado correctamente\");\n            }\n            else\n            {\n                MessageBox.Show(\"Error al ejecutar comando\");\n            }\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,62611,62612,62616,62620,62624,62628,62632,62637,62641,62645,62649,62653,62657,62661,62666,62670,62674,62678,62683,62688,62692,62697,62702,62706,62710,62714,62718,62723,62727,62731,62735,62740,62744,62748,62752,62756,62760,62764,62768],{"__ignoreMap":228},[551,62613,62614],{"class":553,"line":554},[551,62615,1123],{},[551,62617,62618],{"class":553,"line":229},[551,62619,1133],{},[551,62621,62622],{"class":553,"line":670},[551,62623,49898],{},[551,62625,62626],{"class":553,"line":1136},[551,62627,50105],{},[551,62629,62630],{"class":553,"line":1142},[551,62631,1139],{"emptyLinePlaceholder":238},[551,62633,62634],{"class":553,"line":1148},[551,62635,62636],{},"public class ConfigurarAccion\n",[551,62638,62639],{"class":553,"line":1154},[551,62640,1151],{},[551,62642,62643],{"class":553,"line":1160},[551,62644,1157],{},[551,62646,62647],{"class":553,"line":1166},[551,62648,57216],{},[551,62650,62651],{"class":553,"line":1172},[551,62652,1169],{},[551,62654,62655],{"class":553,"line":1178},[551,62656,41211],{},[551,62658,62659],{"class":553,"line":1184},[551,62660,9062],{},[551,62662,62663],{"class":553,"line":1190},[551,62664,62665],{},"            \u002F\u002F Crear intérprete y contexto\n",[551,62667,62668],{"class":553,"line":1472},[551,62669,55695],{},[551,62671,62672],{"class":553,"line":1477},[551,62673,55700],{},[551,62675,62676],{"class":553,"line":1797},[551,62677,1139],{"emptyLinePlaceholder":238},[551,62679,62680],{"class":553,"line":1802},[551,62681,62682],{},"            \u002F\u002F Configurar parámetros (interacción con parámetros concatenados)\n",[551,62684,62685],{"class":553,"line":1808},[551,62686,62687],{},"            acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n",[551,62689,62690],{"class":553,"line":1814},[551,62691,1139],{"emptyLinePlaceholder":238},[551,62693,62694],{"class":553,"line":1820},[551,62695,62696],{},"            \u002F\u002F Ejecutar comando con parámetros\n",[551,62698,62699],{"class":553,"line":1826},[551,62700,62701],{},"            bool resultado = cli.Execute(\"XGedStartInteractionAction\", acc);\n",[551,62703,62704],{"class":553,"line":1832},[551,62705,1139],{"emptyLinePlaceholder":238},[551,62707,62708],{"class":553,"line":1838},[551,62709,59615],{},[551,62711,62712],{"class":553,"line":1844},[551,62713,59620],{},[551,62715,62716],{"class":553,"line":1850},[551,62717,12301],{},[551,62719,62720],{"class":553,"line":1855},[551,62721,62722],{},"                MessageBox.Show(\"Comando ejecutado correctamente\");\n",[551,62724,62725],{"class":553,"line":1861},[551,62726,12311],{},[551,62728,62729],{"class":553,"line":1867},[551,62730,15260],{},[551,62732,62733],{"class":553,"line":1873},[551,62734,12301],{},[551,62736,62737],{"class":553,"line":1878},[551,62738,62739],{},"                MessageBox.Show(\"Error al ejecutar comando\");\n",[551,62741,62742],{"class":553,"line":1883},[551,62743,12311],{},[551,62745,62746],{"class":553,"line":1888},[551,62747,9077],{},[551,62749,62750],{"class":553,"line":4615},[551,62751,41473],{},[551,62753,62754],{"class":553,"line":4620},[551,62755,9062],{},[551,62757,62758],{"class":553,"line":4626},[551,62759,55428],{},[551,62761,62762],{"class":553,"line":4631},[551,62763,9077],{},[551,62765,62766],{"class":553,"line":4636},[551,62767,1187],{},[551,62769,62770],{"class":553,"line":4641},[551,62771,1193],{},[43,62773],{},[46,62775,62777],{"id":62776},"_6-reutilizar-actioncallingcontext","6. Reutilizar ActionCallingContext",[331,62779,62781],{"id":62780},"_61-un-contexto-por-comando","6.1 Un contexto por comando",[13,62783,62784,62787],{},[16,62785,62786],{},"Recomendado:"," Crear un nuevo contexto para cada comando:",[543,62789,62791],{"className":545,"code":62790,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\n\n\u002F\u002F Primer comando\nActionCallingContext acc1 = new ActionCallingContext();\nacc1.AddParameter(\"param1\", \"valor1\");\ncli.Execute(\"comando1\", acc1);\n\n\u002F\u002F Segundo comando\nActionCallingContext acc2 = new ActionCallingContext();\nacc2.AddParameter(\"param2\", \"valor2\");\ncli.Execute(\"comando2\", acc2);\n",[54,62792,62793,62797,62801,62806,62811,62816,62821,62825,62830,62835,62840],{"__ignoreMap":228},[551,62794,62795],{"class":553,"line":554},[551,62796,52496],{},[551,62798,62799],{"class":553,"line":229},[551,62800,1139],{"emptyLinePlaceholder":238},[551,62802,62803],{"class":553,"line":670},[551,62804,62805],{},"\u002F\u002F Primer comando\n",[551,62807,62808],{"class":553,"line":1136},[551,62809,62810],{},"ActionCallingContext acc1 = new ActionCallingContext();\n",[551,62812,62813],{"class":553,"line":1142},[551,62814,62815],{},"acc1.AddParameter(\"param1\", \"valor1\");\n",[551,62817,62818],{"class":553,"line":1148},[551,62819,62820],{},"cli.Execute(\"comando1\", acc1);\n",[551,62822,62823],{"class":553,"line":1154},[551,62824,1139],{"emptyLinePlaceholder":238},[551,62826,62827],{"class":553,"line":1160},[551,62828,62829],{},"\u002F\u002F Segundo comando\n",[551,62831,62832],{"class":553,"line":1166},[551,62833,62834],{},"ActionCallingContext acc2 = new ActionCallingContext();\n",[551,62836,62837],{"class":553,"line":1172},[551,62838,62839],{},"acc2.AddParameter(\"param2\", \"valor2\");\n",[551,62841,62842],{"class":553,"line":1178},[551,62843,62844],{},"cli.Execute(\"comando2\", acc2);\n",[331,62846,62848],{"id":62847},"_62-limpiar-y-reutilizar-contexto","6.2 Limpiar y reutilizar contexto",[13,62850,62851],{},"Si quieres reutilizar el mismo contexto, puedes limpiarlo:",[543,62853,62855],{"className":545,"code":62854,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\nActionCallingContext acc = new ActionCallingContext();\n\n\u002F\u002F Primer comando\nacc.AddParameter(\"param1\", \"valor1\");\ncli.Execute(\"comando1\", acc);\n\n\u002F\u002F Limpiar contexto (crear nuevo)\nacc = new ActionCallingContext();\n\n\u002F\u002F Segundo comando\nacc.AddParameter(\"param2\", \"valor2\");\ncli.Execute(\"comando2\", acc);\n",[54,62856,62857,62861,62865,62869,62873,62878,62883,62887,62892,62897,62901,62905,62910],{"__ignoreMap":228},[551,62858,62859],{"class":553,"line":554},[551,62860,52496],{},[551,62862,62863],{"class":553,"line":229},[551,62864,55901],{},[551,62866,62867],{"class":553,"line":670},[551,62868,1139],{"emptyLinePlaceholder":238},[551,62870,62871],{"class":553,"line":1136},[551,62872,62805],{},[551,62874,62875],{"class":553,"line":1142},[551,62876,62877],{},"acc.AddParameter(\"param1\", \"valor1\");\n",[551,62879,62880],{"class":553,"line":1148},[551,62881,62882],{},"cli.Execute(\"comando1\", acc);\n",[551,62884,62885],{"class":553,"line":1154},[551,62886,1139],{"emptyLinePlaceholder":238},[551,62888,62889],{"class":553,"line":1160},[551,62890,62891],{},"\u002F\u002F Limpiar contexto (crear nuevo)\n",[551,62893,62894],{"class":553,"line":1166},[551,62895,62896],{},"acc = new ActionCallingContext();\n",[551,62898,62899],{"class":553,"line":1172},[551,62900,1139],{"emptyLinePlaceholder":238},[551,62902,62903],{"class":553,"line":1178},[551,62904,62829],{},[551,62906,62907],{"class":553,"line":1184},[551,62908,62909],{},"acc.AddParameter(\"param2\", \"valor2\");\n",[551,62911,62912],{"class":553,"line":1190},[551,62913,62914],{},"cli.Execute(\"comando2\", acc);\n",[13,62916,62917,62919],{},[16,62918,53214],{}," Es más simple y claro crear un nuevo contexto cada vez.",[43,62921],{},[46,62923,62925],{"id":62924},"_7-workflow-con-múltiples-comandos-parametrizados","7. Workflow con múltiples comandos parametrizados",[543,62927,62929],{"className":545,"code":62928,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class WorkflowParametrizado\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Comando 1: Sin parámetros\n            cli.Execute(\"check\");\n\n            \u002F\u002F Comando 2: Con parámetros (concatenados al Name)\n            ActionCallingContext acc = new ActionCallingContext();\n            acc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n            cli.Execute(\"XGedStartInteractionAction\", acc);\n\n            MessageBox.Show(\"Workflow completado\");\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,62930,62931,62935,62939,62943,62947,62951,62956,62960,62964,62968,62972,62976,62980,62984,62988,62993,62998,63002,63007,63011,63015,63020,63024,63029,63033,63037,63041,63045,63049,63053],{"__ignoreMap":228},[551,62932,62933],{"class":553,"line":554},[551,62934,1123],{},[551,62936,62937],{"class":553,"line":229},[551,62938,1133],{},[551,62940,62941],{"class":553,"line":670},[551,62942,49898],{},[551,62944,62945],{"class":553,"line":1136},[551,62946,50105],{},[551,62948,62949],{"class":553,"line":1142},[551,62950,1139],{"emptyLinePlaceholder":238},[551,62952,62953],{"class":553,"line":1148},[551,62954,62955],{},"public class WorkflowParametrizado\n",[551,62957,62958],{"class":553,"line":1154},[551,62959,1151],{},[551,62961,62962],{"class":553,"line":1160},[551,62963,1157],{},[551,62965,62966],{"class":553,"line":1166},[551,62967,57216],{},[551,62969,62970],{"class":553,"line":1172},[551,62971,1169],{},[551,62973,62974],{"class":553,"line":1178},[551,62975,41211],{},[551,62977,62978],{"class":553,"line":1184},[551,62979,9062],{},[551,62981,62982],{"class":553,"line":1190},[551,62983,55695],{},[551,62985,62986],{"class":553,"line":1472},[551,62987,1139],{"emptyLinePlaceholder":238},[551,62989,62990],{"class":553,"line":1477},[551,62991,62992],{},"            \u002F\u002F Comando 1: Sin parámetros\n",[551,62994,62995],{"class":553,"line":1797},[551,62996,62997],{},"            cli.Execute(\"check\");\n",[551,62999,63000],{"class":553,"line":1802},[551,63001,1139],{"emptyLinePlaceholder":238},[551,63003,63004],{"class":553,"line":1808},[551,63005,63006],{},"            \u002F\u002F Comando 2: Con parámetros (concatenados al Name)\n",[551,63008,63009],{"class":553,"line":1814},[551,63010,55700],{},[551,63012,63013],{"class":553,"line":1820},[551,63014,62687],{},[551,63016,63017],{"class":553,"line":1826},[551,63018,63019],{},"            cli.Execute(\"XGedStartInteractionAction\", acc);\n",[551,63021,63022],{"class":553,"line":1832},[551,63023,1139],{"emptyLinePlaceholder":238},[551,63025,63026],{"class":553,"line":1838},[551,63027,63028],{},"            MessageBox.Show(\"Workflow completado\");\n",[551,63030,63031],{"class":553,"line":1844},[551,63032,9077],{},[551,63034,63035],{"class":553,"line":1850},[551,63036,41473],{},[551,63038,63039],{"class":553,"line":1855},[551,63040,9062],{},[551,63042,63043],{"class":553,"line":1861},[551,63044,55428],{},[551,63046,63047],{"class":553,"line":1867},[551,63048,9077],{},[551,63050,63051],{"class":553,"line":1873},[551,63052,1187],{},[551,63054,63055],{"class":553,"line":1878},[551,63056,1193],{},[13,63058,63059,63061],{},[16,63060,53214],{}," Puedes mezclar comandos con y sin parámetros en el mismo workflow.",[43,63063],{},[46,63065,63067],{"id":63066},"_8-buenas-prácticas","8. Buenas prácticas",[331,63069,63071],{"id":63070},"_81-validar-parámetros-antes-de-agregar","8.1 Validar parámetros antes de agregar",[543,63073,63075],{"className":545,"code":63074,"language":547,"meta":228,"style":228},"string rutaArchivo = @\"C:\\temp\\export.xml\";\n\n\u002F\u002F Validar que la ruta es válida\nif (string.IsNullOrEmpty(rutaArchivo))\n{\n    MessageBox.Show(\"Ruta de archivo no válida\");\n    return;\n}\n\n\u002F\u002F Agregar parámetro\nActionCallingContext acc = new ActionCallingContext();\nacc.AddParameter(\"EXPORTFILE\", rutaArchivo);\n",[54,63076,63077,63082,63086,63091,63096,63100,63105,63109,63113,63117,63122,63126],{"__ignoreMap":228},[551,63078,63079],{"class":553,"line":554},[551,63080,63081],{},"string rutaArchivo = @\"C:\\temp\\export.xml\";\n",[551,63083,63084],{"class":553,"line":229},[551,63085,1139],{"emptyLinePlaceholder":238},[551,63087,63088],{"class":553,"line":670},[551,63089,63090],{},"\u002F\u002F Validar que la ruta es válida\n",[551,63092,63093],{"class":553,"line":1136},[551,63094,63095],{},"if (string.IsNullOrEmpty(rutaArchivo))\n",[551,63097,63098],{"class":553,"line":1142},[551,63099,1151],{},[551,63101,63102],{"class":553,"line":1148},[551,63103,63104],{},"    MessageBox.Show(\"Ruta de archivo no válida\");\n",[551,63106,63107],{"class":553,"line":1154},[551,63108,16027],{},[551,63110,63111],{"class":553,"line":1160},[551,63112,1193],{},[551,63114,63115],{"class":553,"line":1166},[551,63116,1139],{"emptyLinePlaceholder":238},[551,63118,63119],{"class":553,"line":1172},[551,63120,63121],{},"\u002F\u002F Agregar parámetro\n",[551,63123,63124],{"class":553,"line":1178},[551,63125,55901],{},[551,63127,63128],{"class":553,"line":1184},[551,63129,63130],{},"acc.AddParameter(\"EXPORTFILE\", rutaArchivo);\n",[331,63132,63134],{"id":63133},"_82-usar-nombres-de-parámetros-correctos","8.2 Usar nombres de parámetros correctos",[13,63136,63137,63138,63140],{},"Los nombres de parámetros son ",[16,63139,59781],{}," y específicos de cada comando.",[13,63142,63143],{},[16,63144,57538],{},[543,63146,63148],{"className":545,"code":63147,"language":547,"meta":228,"style":228},"acc.AddParameter(\"filename\", \"archivo.pdf\");  \u002F\u002F Puede no funcionar\n",[54,63149,63150],{"__ignoreMap":228},[551,63151,63152],{"class":553,"line":554},[551,63153,63147],{},[13,63155,63156],{},[16,63157,57587],{},[543,63159,63161],{"className":545,"code":63160,"language":547,"meta":228,"style":228},"acc.AddParameter(\"FILENAME\", \"archivo.pdf\");  \u002F\u002F Nombre correcto\n",[54,63162,63163],{"__ignoreMap":228},[551,63164,63165],{"class":553,"line":554},[551,63166,63160],{},[13,63168,63169,63172],{},[16,63170,63171],{},"¿Cómo saber el nombre correcto?"," Consulta la documentación de EPLAN API o los scripts de ejemplo oficiales.",[331,63174,63176],{"id":63175},"_83-comentar-qué-hace-cada-parámetro","8.3 Comentar qué hace cada parámetro",[543,63178,63180],{"className":545,"code":63179,"language":547,"meta":228,"style":228},"ActionCallingContext acc = new ActionCallingContext();\n\u002F\u002F Para interacciones, los parámetros van concatenados al Name\nacc.AddParameter(\"Name\", \"XGedIaFormatText\u002Fheight:20\");\n",[54,63181,63182,63186,63191],{"__ignoreMap":228},[551,63183,63184],{"class":553,"line":554},[551,63185,55901],{},[551,63187,63188],{"class":553,"line":229},[551,63189,63190],{},"\u002F\u002F Para interacciones, los parámetros van concatenados al Name\n",[551,63192,63193],{"class":553,"line":670},[551,63194,62319],{},[331,63196,63198],{"id":63197},"_84-validar-resultado-del-comando","8.4 Validar resultado del comando",[543,63200,63202],{"className":545,"code":63201,"language":547,"meta":228,"style":228},"bool resultado = cli.Execute(\"comando\", acc);\nif (!resultado)\n{\n    MessageBox.Show(\"El comando falló. Verifica los parámetros.\");\n}\n",[54,63203,63204,63209,63214,63218,63223],{"__ignoreMap":228},[551,63205,63206],{"class":553,"line":554},[551,63207,63208],{},"bool resultado = cli.Execute(\"comando\", acc);\n",[551,63210,63211],{"class":553,"line":229},[551,63212,63213],{},"if (!resultado)\n",[551,63215,63216],{"class":553,"line":670},[551,63217,1151],{},[551,63219,63220],{"class":553,"line":1136},[551,63221,63222],{},"    MessageBox.Show(\"El comando falló. Verifica los parámetros.\");\n",[551,63224,63225],{"class":553,"line":1142},[551,63226,1193],{},[43,63228],{},[46,63230,54205],{"id":54204},[331,63232,63234],{"id":63233},"_91-olvidar-crear-el-actioncallingcontext","9.1 Olvidar crear el ActionCallingContext",[13,63236,63237],{},[16,63238,51348],{},[543,63240,63242],{"className":545,"code":63241,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\n\u002F\u002F Falta crear ActionCallingContext\ncli.Execute(\"comando\", acc);  \u002F\u002F acc no existe\n",[54,63243,63244,63248,63253],{"__ignoreMap":228},[551,63245,63246],{"class":553,"line":554},[551,63247,52496],{},[551,63249,63250],{"class":553,"line":229},[551,63251,63252],{},"\u002F\u002F Falta crear ActionCallingContext\n",[551,63254,63255],{"class":553,"line":670},[551,63256,63257],{},"cli.Execute(\"comando\", acc);  \u002F\u002F acc no existe\n",[13,63259,63260],{},[16,63261,63262],{},"Corrección:",[543,63264,63266],{"className":545,"code":63265,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\nActionCallingContext acc = new ActionCallingContext();  \u002F\u002F Crear contexto\nacc.AddParameter(\"param\", \"value\");\ncli.Execute(\"comando\", acc);\n",[54,63267,63268,63272,63277,63282],{"__ignoreMap":228},[551,63269,63270],{"class":553,"line":554},[551,63271,52496],{},[551,63273,63274],{"class":553,"line":229},[551,63275,63276],{},"ActionCallingContext acc = new ActionCallingContext();  \u002F\u002F Crear contexto\n",[551,63278,63279],{"class":553,"line":670},[551,63280,63281],{},"acc.AddParameter(\"param\", \"value\");\n",[551,63283,63284],{"class":553,"line":1136},[551,63285,62167],{},[331,63287,63289],{"id":63288},"_92-pasar-valores-con-tipo-incorrecto","9.2 Pasar valores con tipo incorrecto",[13,63291,63292],{},[16,63293,51348],{},[543,63295,63297],{"className":545,"code":63296,"language":547,"meta":228,"style":228},"acc.AddParameter(\"height\", 20);  \u002F\u002F int, no string\n",[54,63298,63299],{"__ignoreMap":228},[551,63300,63301],{"class":553,"line":554},[551,63302,63296],{},[13,63304,63305],{},[16,63306,63262],{},[543,63308,63310],{"className":545,"code":63309,"language":547,"meta":228,"style":228},"acc.AddParameter(\"height\", \"20\");  \u002F\u002F Siempre string\n",[54,63311,63312],{"__ignoreMap":228},[551,63313,63314],{"class":553,"line":554},[551,63315,63309],{},[331,63317,63319],{"id":63318},"_93-nombre-de-parámetro-incorrecto","9.3 Nombre de parámetro incorrecto",[13,63321,63322],{},[16,63323,51348],{},[543,63325,63327],{"className":545,"code":63326,"language":547,"meta":228,"style":228},"acc.AddParameter(\"altura\", \"20\");  \u002F\u002F Nombre incorrecto\n",[54,63328,63329],{"__ignoreMap":228},[551,63330,63331],{"class":553,"line":554},[551,63332,63326],{},[13,63334,63335],{},[16,63336,63262],{},[543,63338,63340],{"className":545,"code":63339,"language":547,"meta":228,"style":228},"acc.AddParameter(\"height\", \"20\");  \u002F\u002F Nombre correcto según documentación\n",[54,63341,63342],{"__ignoreMap":228},[551,63343,63344],{"class":553,"line":554},[551,63345,63339],{},[43,63347],{},[46,63349,63351],{"id":63350},"_10-qué-comandos-requieren-parámetros","10. ¿Qué comandos requieren parámetros?",[331,63353,63355],{"id":63354},"_101-indicadores-comunes","10.1 Indicadores comunes",[13,63357,63358],{},"Comandos que suelen requerir parámetros:",[126,63360,63361,63364,63367,63370],{},[88,63362,63363],{},"Comandos de exportación (ruta de destino)",[88,63365,63366],{},"Comandos de importación (ruta de origen)",[88,63368,63369],{},"Comandos de configuración (valores a establecer)",[88,63371,63372],{},"Comandos de acciones específicas (opciones de ejecución)",[331,63374,63376],{"id":63375},"_102-fuentes-de-información","10.2 Fuentes de información",[13,63378,63379],{},"Para saber qué parámetros requiere un comando:",[85,63381,63382,63388,63394,63400],{},[88,63383,63384,63387],{},[16,63385,63386],{},"Documentación EPLAN API"," (EplanAPI.chm)",[88,63389,63390,63393],{},[16,63391,63392],{},"Scripts oficiales"," de EPLAN-Scripting-4.0",[88,63395,63396,63399],{},[16,63397,63398],{},"Experimentación"," con validación de resultados",[88,63401,63402,63405],{},[16,63403,63404],{},"Foros"," y comunidad EPLAN",[43,63407],{},[46,63409,22685],{"id":22684},[13,63411,22688],{},[126,63413,63414,63419,63425,63430,63436,63439,63443,63446],{},[88,63415,63416,63418],{},[16,63417,59770],{}," es el contenedor de parámetros para comandos",[88,63420,55068,63421,63424],{},[54,63422,63423],{},"AddParameter(nombre, valor)"," para agregar parámetros",[88,63426,63427,63428],{},"Todos los valores se pasan como ",[16,63429,62464],{},[88,63431,63432,63433],{},"Sintaxis: ",[54,63434,63435],{},"cli.Execute(comando, contexto)",[88,63437,63438],{},"Puedes combinar comandos con y sin parámetros",[88,63440,63137,63441],{},[16,63442,59781],{},[88,63444,63445],{},"Siempre validar el resultado del comando",[88,63447,63448],{},"Crear un contexto nuevo para cada comando es más claro",[43,63450],{},[46,63452,5728],{"id":5727},[13,63454,63455],{},[16,63456,63457],{},"P: ¿Puedo pasar números directamente a AddParameter()?",[13,63459,63460,63461,2854,63464],{},"R: No, debes convertirlos a string: ",[54,63462,63463],{},"acc.AddParameter(\"height\", \"20\")",[54,63465,63466],{},"acc.AddParameter(\"height\", altura.ToString())",[13,63468,63469],{},[16,63470,63471],{},"P: ¿Cuántos parámetros puedo agregar?",[13,63473,63474],{},"R: No hay límite específico. Depende del comando.",[13,63476,63477],{},[16,63478,63479],{},"P: ¿Qué pasa si paso un parámetro que el comando no espera?",[13,63481,63482],{},"R: Generalmente se ignora, pero puede causar errores. Verifica la documentación.",[13,63484,63485],{},[16,63486,63487],{},"P: ¿Puedo modificar un parámetro después de agregarlo?",[13,63489,63490],{},"R: No directamente. Debes crear un nuevo ActionCallingContext.",[43,63492],{},[46,63494,51782],{"id":36078},[331,63496,51786],{"id":51785},[13,63498,63499],{},[16,63500,59941],{},[331,63502,51795],{"id":51794},[13,63504,63505],{},[16,63506,63507],{},"Capítulo 19: Parámetros múltiples en ActionCallingContext",[13,63509,63510],{},"En el próximo capítulo verás ejemplos más avanzados de pasar múltiples parámetros complejos.",[43,63512],{},[13,63514,63515,10676,63517,51819,63519,93,63521,63524,93,63526],{},[31,63516,657],{},[31,63518,10679],{},[31,63520,10683],{},[54,63522,63523],{},"code\u002Fcap-18\u002F",[31,63525,51827],{},[54,63527,62196],{},[660,63529,662],{},{"title":228,"searchDepth":229,"depth":229,"links":63531},[63532,63533,63534,63535,63539,63543,63548,63552,63555,63559,63560,63566,63571,63575,63576,63577],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":62111,"depth":229,"text":62112,"children":63536},[63537,63538],{"id":49680,"depth":670,"text":49681},{"id":58686,"depth":670,"text":58687},{"id":62185,"depth":229,"text":62186,"children":63540},[63541,63542],{"id":62189,"depth":670,"text":62190},{"id":58808,"depth":670,"text":58809},{"id":62356,"depth":229,"text":62357,"children":63544},[63545,63546,63547],{"id":58894,"depth":670,"text":58895},{"id":62387,"depth":670,"text":62388},{"id":62468,"depth":670,"text":62469},{"id":62506,"depth":229,"text":62507,"children":63549},[63550,63551],{"id":62510,"depth":670,"text":62511},{"id":62551,"depth":670,"text":62552},{"id":62601,"depth":229,"text":62602,"children":63553},[63554],{"id":62605,"depth":670,"text":62606},{"id":62776,"depth":229,"text":62777,"children":63556},[63557,63558],{"id":62780,"depth":670,"text":62781},{"id":62847,"depth":670,"text":62848},{"id":62924,"depth":229,"text":62925},{"id":63066,"depth":229,"text":63067,"children":63561},[63562,63563,63564,63565],{"id":63070,"depth":670,"text":63071},{"id":63133,"depth":670,"text":63134},{"id":63175,"depth":670,"text":63176},{"id":63197,"depth":670,"text":63198},{"id":54204,"depth":229,"text":54205,"children":63567},[63568,63569,63570],{"id":63233,"depth":670,"text":63234},{"id":63288,"depth":670,"text":63289},{"id":63318,"depth":670,"text":63319},{"id":63350,"depth":229,"text":63351,"children":63572},[63573,63574],{"id":63354,"depth":670,"text":63355},{"id":63375,"depth":670,"text":63376},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":63578},[63579,63580],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Pasa parámetros a los comandos de EPLAN desde C# y automatiza tareas complejas en EPLAN Electric P8 con scripts gratuitos.",{},"\u002Fguia\u002Feplan-api\u002Fcap-18-comandos-con-parametros",{"title":62021,"description":63581},"guia\u002Feplan-api\u002Fcap-18-comandos-con-parametros","O4ncXNX-oHW1cu9WPBOHRUSgtnze0wJRJkEAXRjiI_A",{"id":63588,"title":63589,"body":63590,"description":65411,"extension":236,"meta":65412,"navigation":238,"path":65413,"seo":65414,"stem":65415,"tagline":242,"__hash__":65416},"guia\u002Fguia\u002Feplan-api\u002Fcap-19-parametros-multiples.md","Capítulo 19: Parámetros múltiples en EPLAN",{"type":7,"value":63591,"toc":65366},[63592,63602,63604,63606,63608,63625,63627,63629,63631,63642,63644,63646,63661,63664,63674,63676,63680,63684,63692,63710,63714,63723,63755,63760,63762,63766,63768,63777,63781,63797,63807,63811,63900,63904,63909,63917,63920,63925,63934,63937,63942,63951,63957,63964,63966,63970,63974,63979,64124,64128,64278,64280,64284,64288,64291,64483,64485,64489,64493,64496,64576,64580,64637,64639,64643,64647,64653,64981,64983,64985,64989,65027,65031,65072,65076,65113,65117,65177,65179,65183,65187,65190,65196,65200,65236,65240,65243,65245,65247,65249,65276,65278,65280,65288,65294,65299,65302,65307,65310,65315,65326,65328,65330,65332,65336,65338,65343,65346,65348,65364],[10,63593,63594],{},[13,63595,63596,19,63598,19,63600,56383],{},[16,63597,49597],{},[16,63599,58593],{},[16,63601,25],{},[43,63603],{},[46,63605,268],{"id":267},[13,63607,702],{},[126,63609,63610,63613,63616,63619,63622],{},[88,63611,63612],{},"Recibir parámetros en tu script con ActionCallingContext",[88,63614,63615],{},"Usar GetParameter() para leer valores pasados al script",[88,63617,63618],{},"Pasar múltiples parámetros complejos a comandos",[88,63620,63621],{},"Crear scripts parametrizables y reutilizables",[88,63623,63624],{},"Combinar AddParameter() y GetParameter()",[43,63626],{},[46,63628,320],{"id":319},[13,63630,726],{},[126,63632,63633,63636,63639],{},[88,63634,63635],{},"Haber completado el Capítulo 18 (comandos con parámetros)",[88,63637,63638],{},"Entender ActionCallingContext y AddParameter()",[88,63640,63641],{},"Saber ejecutar comandos con parámetros",[43,63643],{},[46,63645,49653],{"id":49652},[13,63647,63648,63649,63652,63653,63656,63657,63660],{},"En el capítulo anterior aprendiste a ",[16,63650,63651],{},"pasar"," parámetros a comandos usando ",[54,63654,63655],{},"AddParameter()",". Pero, ¿qué pasa si quieres que ",[16,63658,63659],{},"tu propio script"," reciba parámetros?",[13,63662,63663],{},"Imagina que quieres crear un script reutilizable que configure un proyecto, pero que los valores (nombre de cliente, ubicación, etc.) cambien cada vez que lo ejecutas.",[13,63665,63666,63667,63670,63671,41],{},"Para esto necesitas ",[16,63668,63669],{},"recibir parámetros"," en tu script usando ",[54,63672,63673],{},"GetParameter()",[43,63675],{},[46,63677,63679],{"id":63678},"_1-dos-usos-de-actioncallingcontext","1. Dos usos de ActionCallingContext",[331,63681,63683],{"id":63682},"_11-pasar-parámetros-addparameter","1.1 Pasar parámetros (AddParameter)",[13,63685,63686,63688,63689],{},[16,63687,60943],{}," Enviar parámetros ",[16,63690,63691],{},"a un comando de EPLAN",[543,63693,63695],{"className":545,"code":63694,"language":547,"meta":228,"style":228},"ActionCallingContext acc = new ActionCallingContext();\nacc.AddParameter(\"PROJECTNAME\", \"MiProyecto\");\ncli.Execute(\"comando\", acc);\n",[54,63696,63697,63701,63706],{"__ignoreMap":228},[551,63698,63699],{"class":553,"line":554},[551,63700,55901],{},[551,63702,63703],{"class":553,"line":229},[551,63704,63705],{},"acc.AddParameter(\"PROJECTNAME\", \"MiProyecto\");\n",[551,63707,63708],{"class":553,"line":670},[551,63709,62167],{},[331,63711,63713],{"id":63712},"_12-recibir-parámetros-getparameter","1.2 Recibir parámetros (GetParameter)",[13,63715,63716,63718,63719,63722],{},[16,63717,60943],{}," Recibir parámetros ",[16,63720,63721],{},"en tu script"," desde fuera",[543,63724,63726],{"className":545,"code":63725,"language":547,"meta":228,"style":228},"[Start]\npublic void Execute(ActionCallingContext oActionCallingContext)\n{\n    string valorRecibido = \"\";\n    oActionCallingContext.GetParameter(\"NOMBRE_PARAMETRO\", ref valorRecibido);\n}\n",[54,63727,63728,63732,63737,63741,63746,63751],{"__ignoreMap":228},[551,63729,63730],{"class":553,"line":554},[551,63731,1310],{},[551,63733,63734],{"class":553,"line":229},[551,63735,63736],{},"public void Execute(ActionCallingContext oActionCallingContext)\n",[551,63738,63739],{"class":553,"line":670},[551,63740,1151],{},[551,63742,63743],{"class":553,"line":1136},[551,63744,63745],{},"    string valorRecibido = \"\";\n",[551,63747,63748],{"class":553,"line":1142},[551,63749,63750],{},"    oActionCallingContext.GetParameter(\"NOMBRE_PARAMETRO\", ref valorRecibido);\n",[551,63752,63753],{"class":553,"line":1148},[551,63754,1193],{},[13,63756,63757,63759],{},[16,63758,53214],{}," Puedes hacer ambas cosas en el mismo script.",[43,63761],{},[46,63763,63765],{"id":63764},"_2-recibir-parámetros-con-getparameter","2. Recibir parámetros con GetParameter()",[331,63767,23267],{"id":23266},[543,63769,63771],{"className":545,"code":63770,"language":547,"meta":228,"style":228},"oActionCallingContext.GetParameter(string nombre, ref string variable);\n",[54,63772,63773],{"__ignoreMap":228},[551,63774,63775],{"class":553,"line":554},[551,63776,63770],{},[13,63778,63779],{},[16,63780,58909],{},[126,63782,63783,63788],{},[88,63784,63785,63787],{},[54,63786,2436],{}," - Nombre del parámetro a obtener",[88,63789,63790,63793,63794,32897],{},[54,63791,63792],{},"variable"," - Variable donde se almacenará el valor (debe usar ",[54,63795,63796],{},"ref",[13,63798,63799,63801,63802,63804,63805,41],{},[16,63800,50964],{}," La variable debe declararse ",[16,63803,43510],{}," de usarla y debe ser ",[16,63806,63796],{},[331,63808,63810],{"id":63809},"_22-ejemplo-básico","2.2 Ejemplo básico",[543,63812,63814],{"className":545,"code":63813,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ScriptConParametros\n{\n    [Start]\n    public void Execute(ActionCallingContext oActionCallingContext)\n    {\n        \u002F\u002F Declarar variable para recibir el parámetro\n        string nombreProyecto = \"\";\n\n        \u002F\u002F Obtener parámetro\n        oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n\n        \u002F\u002F Usar el parámetro\n        MessageBox.Show(\"Nombre del proyecto: \" + nombreProyecto);\n    }\n}\n",[54,63815,63816,63820,63824,63828,63832,63837,63841,63845,63850,63854,63859,63864,63868,63873,63878,63882,63887,63892,63896],{"__ignoreMap":228},[551,63817,63818],{"class":553,"line":554},[551,63819,1133],{},[551,63821,63822],{"class":553,"line":229},[551,63823,49898],{},[551,63825,63826],{"class":553,"line":670},[551,63827,50105],{},[551,63829,63830],{"class":553,"line":1136},[551,63831,1139],{"emptyLinePlaceholder":238},[551,63833,63834],{"class":553,"line":1142},[551,63835,63836],{},"public class ScriptConParametros\n",[551,63838,63839],{"class":553,"line":1148},[551,63840,1151],{},[551,63842,63843],{"class":553,"line":1154},[551,63844,1157],{},[551,63846,63847],{"class":553,"line":1160},[551,63848,63849],{},"    public void Execute(ActionCallingContext oActionCallingContext)\n",[551,63851,63852],{"class":553,"line":1166},[551,63853,1169],{},[551,63855,63856],{"class":553,"line":1172},[551,63857,63858],{},"        \u002F\u002F Declarar variable para recibir el parámetro\n",[551,63860,63861],{"class":553,"line":1178},[551,63862,63863],{},"        string nombreProyecto = \"\";\n",[551,63865,63866],{"class":553,"line":1184},[551,63867,1139],{"emptyLinePlaceholder":238},[551,63869,63870],{"class":553,"line":1190},[551,63871,63872],{},"        \u002F\u002F Obtener parámetro\n",[551,63874,63875],{"class":553,"line":1472},[551,63876,63877],{},"        oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n",[551,63879,63880],{"class":553,"line":1477},[551,63881,1139],{"emptyLinePlaceholder":238},[551,63883,63884],{"class":553,"line":1797},[551,63885,63886],{},"        \u002F\u002F Usar el parámetro\n",[551,63888,63889],{"class":553,"line":1802},[551,63890,63891],{},"        MessageBox.Show(\"Nombre del proyecto: \" + nombreProyecto);\n",[551,63893,63894],{"class":553,"line":1808},[551,63895,1187],{},[551,63897,63898],{"class":553,"line":1814},[551,63899,1193],{},[331,63901,63903],{"id":63902},"_23-análisis-línea-por-línea","2.3 Análisis línea por línea",[13,63905,63906],{},[16,63907,63908],{},"Línea 9: Método con ActionCallingContext",[543,63910,63911],{"className":545,"code":63736,"language":547,"meta":228,"style":228},[54,63912,63913],{"__ignoreMap":228},[551,63914,63915],{"class":553,"line":554},[551,63916,63736],{},[13,63918,63919],{},"Tu método recibe el contexto como parámetro.",[13,63921,63922],{},[16,63923,63924],{},"Línea 12: Declarar variable",[543,63926,63928],{"className":545,"code":63927,"language":547,"meta":228,"style":228},"string nombreProyecto = \"\";\n",[54,63929,63930],{"__ignoreMap":228},[551,63931,63932],{"class":553,"line":554},[551,63933,63927],{},[13,63935,63936],{},"Inicializas la variable que recibirá el valor.",[13,63938,63939],{},[16,63940,63941],{},"Línea 15: Obtener parámetro",[543,63943,63945],{"className":545,"code":63944,"language":547,"meta":228,"style":228},"oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n",[54,63946,63947],{"__ignoreMap":228},[551,63948,63949],{"class":553,"line":554},[551,63950,63944],{},[13,63952,63953,63954,41],{},"Obtienes el valor del parámetro \"ProjectName\" y lo almacenas en ",[54,63955,63956],{},"nombreProyecto",[13,63958,63959,73,63961,63963],{},[16,63960,53214],{},[54,63962,63796],{}," es obligatorio para que GetParameter() pueda modificar la variable.",[43,63965],{},[46,63967,63969],{"id":63968},"_3-múltiples-parámetros","3. Múltiples parámetros",[331,63971,63973],{"id":63972},"_31-recibir-varios-parámetros","3.1 Recibir varios parámetros",[13,63975,62193,63976,416],{},[54,63977,63978],{},"EPLAN-Scripting-4.0\u002F02_RunActions\u002FEGCExecutor.cs",[543,63980,63982],{"className":545,"code":63981,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ConfigurarProyecto\n{\n    [Start]\n    public void Execute(ActionCallingContext oActionCallingContext)\n    {\n        \u002F\u002F Declarar variables para recibir parámetros\n        string nombreProyecto = \"\";\n        string cliente = \"\";\n        string ubicacion = \"\";\n        string desarrollador = \"\";\n\n        \u002F\u002F Obtener múltiples parámetros\n        oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n        oActionCallingContext.GetParameter(\"Customer\", ref cliente);\n        oActionCallingContext.GetParameter(\"Location\", ref ubicacion);\n        oActionCallingContext.GetParameter(\"Developed\", ref desarrollador);\n\n        \u002F\u002F Usar los parámetros\n        string mensaje = \"Configurando proyecto:\\n\\n\" +\n                        \"Proyecto: \" + nombreProyecto + \"\\n\" +\n                        \"Cliente: \" + cliente + \"\\n\" +\n                        \"Ubicación: \" + ubicacion + \"\\n\" +\n                        \"Desarrollado por: \" + desarrollador;\n\n        MessageBox.Show(mensaje, \"Configuración de Proyecto\");\n    }\n}\n",[54,63983,63984,63988,63992,63996,64000,64005,64009,64013,64017,64021,64026,64030,64035,64040,64045,64049,64054,64058,64063,64068,64073,64077,64082,64087,64092,64097,64102,64107,64111,64116,64120],{"__ignoreMap":228},[551,63985,63986],{"class":553,"line":554},[551,63987,1133],{},[551,63989,63990],{"class":553,"line":229},[551,63991,49898],{},[551,63993,63994],{"class":553,"line":670},[551,63995,50105],{},[551,63997,63998],{"class":553,"line":1136},[551,63999,1139],{"emptyLinePlaceholder":238},[551,64001,64002],{"class":553,"line":1142},[551,64003,64004],{},"public class ConfigurarProyecto\n",[551,64006,64007],{"class":553,"line":1148},[551,64008,1151],{},[551,64010,64011],{"class":553,"line":1154},[551,64012,1157],{},[551,64014,64015],{"class":553,"line":1160},[551,64016,63849],{},[551,64018,64019],{"class":553,"line":1166},[551,64020,1169],{},[551,64022,64023],{"class":553,"line":1172},[551,64024,64025],{},"        \u002F\u002F Declarar variables para recibir parámetros\n",[551,64027,64028],{"class":553,"line":1178},[551,64029,63863],{},[551,64031,64032],{"class":553,"line":1184},[551,64033,64034],{},"        string cliente = \"\";\n",[551,64036,64037],{"class":553,"line":1190},[551,64038,64039],{},"        string ubicacion = \"\";\n",[551,64041,64042],{"class":553,"line":1472},[551,64043,64044],{},"        string desarrollador = \"\";\n",[551,64046,64047],{"class":553,"line":1477},[551,64048,1139],{"emptyLinePlaceholder":238},[551,64050,64051],{"class":553,"line":1797},[551,64052,64053],{},"        \u002F\u002F Obtener múltiples parámetros\n",[551,64055,64056],{"class":553,"line":1802},[551,64057,63877],{},[551,64059,64060],{"class":553,"line":1808},[551,64061,64062],{},"        oActionCallingContext.GetParameter(\"Customer\", ref cliente);\n",[551,64064,64065],{"class":553,"line":1814},[551,64066,64067],{},"        oActionCallingContext.GetParameter(\"Location\", ref ubicacion);\n",[551,64069,64070],{"class":553,"line":1820},[551,64071,64072],{},"        oActionCallingContext.GetParameter(\"Developed\", ref desarrollador);\n",[551,64074,64075],{"class":553,"line":1826},[551,64076,1139],{"emptyLinePlaceholder":238},[551,64078,64079],{"class":553,"line":1832},[551,64080,64081],{},"        \u002F\u002F Usar los parámetros\n",[551,64083,64084],{"class":553,"line":1838},[551,64085,64086],{},"        string mensaje = \"Configurando proyecto:\\n\\n\" +\n",[551,64088,64089],{"class":553,"line":1844},[551,64090,64091],{},"                        \"Proyecto: \" + nombreProyecto + \"\\n\" +\n",[551,64093,64094],{"class":553,"line":1850},[551,64095,64096],{},"                        \"Cliente: \" + cliente + \"\\n\" +\n",[551,64098,64099],{"class":553,"line":1855},[551,64100,64101],{},"                        \"Ubicación: \" + ubicacion + \"\\n\" +\n",[551,64103,64104],{"class":553,"line":1861},[551,64105,64106],{},"                        \"Desarrollado por: \" + desarrollador;\n",[551,64108,64109],{"class":553,"line":1867},[551,64110,1139],{"emptyLinePlaceholder":238},[551,64112,64113],{"class":553,"line":1873},[551,64114,64115],{},"        MessageBox.Show(mensaje, \"Configuración de Proyecto\");\n",[551,64117,64118],{"class":553,"line":1878},[551,64119,1187],{},[551,64121,64122],{"class":553,"line":1883},[551,64123,1193],{},[331,64125,64127],{"id":64126},"_32-parámetros-opcionales-con-validación","3.2 Parámetros opcionales con validación",[543,64129,64131],{"className":545,"code":64130,"language":547,"meta":228,"style":228},"using Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ScriptConValidacion\n{\n    [Start]\n    public void Execute(ActionCallingContext oActionCallingContext)\n    {\n        \u002F\u002F Parámetros obligatorios\n        string nombreProyecto = \"\";\n        oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n\n        if (string.IsNullOrEmpty(nombreProyecto))\n        {\n            MessageBox.Show(\"Error: ProjectName es obligatorio\");\n            return;\n        }\n\n        \u002F\u002F Parámetros opcionales con valor por defecto\n        string cliente = \"\";\n        oActionCallingContext.GetParameter(\"Customer\", ref cliente);\n\n        if (string.IsNullOrEmpty(cliente))\n        {\n            cliente = \"Cliente no especificado\";\n        }\n\n        MessageBox.Show(\n            \"Proyecto: \" + nombreProyecto + \"\\n\" +\n            \"Cliente: \" + cliente\n        );\n    }\n}\n",[54,64132,64133,64137,64141,64145,64149,64154,64158,64162,64166,64170,64175,64179,64183,64187,64192,64196,64201,64205,64209,64213,64218,64222,64226,64230,64235,64239,64244,64248,64252,64256,64261,64266,64270,64274],{"__ignoreMap":228},[551,64134,64135],{"class":553,"line":554},[551,64136,1133],{},[551,64138,64139],{"class":553,"line":229},[551,64140,49898],{},[551,64142,64143],{"class":553,"line":670},[551,64144,50105],{},[551,64146,64147],{"class":553,"line":1136},[551,64148,1139],{"emptyLinePlaceholder":238},[551,64150,64151],{"class":553,"line":1142},[551,64152,64153],{},"public class ScriptConValidacion\n",[551,64155,64156],{"class":553,"line":1148},[551,64157,1151],{},[551,64159,64160],{"class":553,"line":1154},[551,64161,1157],{},[551,64163,64164],{"class":553,"line":1160},[551,64165,63849],{},[551,64167,64168],{"class":553,"line":1166},[551,64169,1169],{},[551,64171,64172],{"class":553,"line":1172},[551,64173,64174],{},"        \u002F\u002F Parámetros obligatorios\n",[551,64176,64177],{"class":553,"line":1178},[551,64178,63863],{},[551,64180,64181],{"class":553,"line":1184},[551,64182,63877],{},[551,64184,64185],{"class":553,"line":1190},[551,64186,1139],{"emptyLinePlaceholder":238},[551,64188,64189],{"class":553,"line":1472},[551,64190,64191],{},"        if (string.IsNullOrEmpty(nombreProyecto))\n",[551,64193,64194],{"class":553,"line":1477},[551,64195,9062],{},[551,64197,64198],{"class":553,"line":1797},[551,64199,64200],{},"            MessageBox.Show(\"Error: ProjectName es obligatorio\");\n",[551,64202,64203],{"class":553,"line":1802},[551,64204,42906],{},[551,64206,64207],{"class":553,"line":1808},[551,64208,9077],{},[551,64210,64211],{"class":553,"line":1814},[551,64212,1139],{"emptyLinePlaceholder":238},[551,64214,64215],{"class":553,"line":1820},[551,64216,64217],{},"        \u002F\u002F Parámetros opcionales con valor por defecto\n",[551,64219,64220],{"class":553,"line":1826},[551,64221,64034],{},[551,64223,64224],{"class":553,"line":1832},[551,64225,64062],{},[551,64227,64228],{"class":553,"line":1838},[551,64229,1139],{"emptyLinePlaceholder":238},[551,64231,64232],{"class":553,"line":1844},[551,64233,64234],{},"        if (string.IsNullOrEmpty(cliente))\n",[551,64236,64237],{"class":553,"line":1850},[551,64238,9062],{},[551,64240,64241],{"class":553,"line":1855},[551,64242,64243],{},"            cliente = \"Cliente no especificado\";\n",[551,64245,64246],{"class":553,"line":1861},[551,64247,9077],{},[551,64249,64250],{"class":553,"line":1867},[551,64251,1139],{"emptyLinePlaceholder":238},[551,64253,64254],{"class":553,"line":1873},[551,64255,4790],{},[551,64257,64258],{"class":553,"line":1878},[551,64259,64260],{},"            \"Proyecto: \" + nombreProyecto + \"\\n\" +\n",[551,64262,64263],{"class":553,"line":1883},[551,64264,64265],{},"            \"Cliente: \" + cliente\n",[551,64267,64268],{"class":553,"line":1888},[551,64269,4758],{},[551,64271,64272],{"class":553,"line":4615},[551,64273,1187],{},[551,64275,64276],{"class":553,"line":4620},[551,64277,1193],{},[43,64279],{},[46,64281,64283],{"id":64282},"_4-combinar-addparameter-y-getparameter","4. Combinar AddParameter() y GetParameter()",[331,64285,64287],{"id":64286},"_41-recibir-parámetros-y-ejecutar-comandos","4.1 Recibir parámetros y ejecutar comandos",[13,64289,64290],{},"Un patrón común es recibir parámetros en tu script y luego usarlos para ejecutar comandos:",[543,64292,64294],{"className":545,"code":64293,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ConfigurarYEjecutar\n{\n    [Start]\n    public void Execute(ActionCallingContext oActionCallingContext)\n    {\n        try\n        {\n            \u002F\u002F 1. Recibir parámetros\n            string nombreProyecto = \"\";\n            string rutaExportacion = \"\";\n\n            oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n            oActionCallingContext.GetParameter(\"ExportPath\", ref rutaExportacion);\n\n            \u002F\u002F Validar parámetros\n            if (string.IsNullOrEmpty(nombreProyecto))\n            {\n                MessageBox.Show(\"Error: ProjectName es obligatorio\");\n                return;\n            }\n\n            \u002F\u002F 2. Usar parámetros para ejecutar comandos\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n\n            \u002F\u002F Generar reportes\n            ActionCallingContext acc = new ActionCallingContext();\n            acc.AddParameter(\"TYPE\", \"PROJECT\");\n            acc.AddParameter(\"PROJECTNAME\", nombreProyecto);\n            cli.Execute(\"reports\", acc);\n\n            MessageBox.Show(\"Configuración completada para: \" + nombreProyecto);\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message);\n        }\n    }\n}\n",[54,64295,64296,64300,64304,64308,64312,64316,64321,64325,64329,64333,64337,64341,64345,64350,64355,64360,64364,64369,64374,64378,64383,64388,64392,64397,64401,64405,64409,64414,64418,64422,64427,64431,64436,64441,64446,64450,64455,64459,64463,64467,64471,64475,64479],{"__ignoreMap":228},[551,64297,64298],{"class":553,"line":554},[551,64299,1123],{},[551,64301,64302],{"class":553,"line":229},[551,64303,1133],{},[551,64305,64306],{"class":553,"line":670},[551,64307,49898],{},[551,64309,64310],{"class":553,"line":1136},[551,64311,50105],{},[551,64313,64314],{"class":553,"line":1142},[551,64315,1139],{"emptyLinePlaceholder":238},[551,64317,64318],{"class":553,"line":1148},[551,64319,64320],{},"public class ConfigurarYEjecutar\n",[551,64322,64323],{"class":553,"line":1154},[551,64324,1151],{},[551,64326,64327],{"class":553,"line":1160},[551,64328,1157],{},[551,64330,64331],{"class":553,"line":1166},[551,64332,63849],{},[551,64334,64335],{"class":553,"line":1172},[551,64336,1169],{},[551,64338,64339],{"class":553,"line":1178},[551,64340,41211],{},[551,64342,64343],{"class":553,"line":1184},[551,64344,9062],{},[551,64346,64347],{"class":553,"line":1190},[551,64348,64349],{},"            \u002F\u002F 1. Recibir parámetros\n",[551,64351,64352],{"class":553,"line":1472},[551,64353,64354],{},"            string nombreProyecto = \"\";\n",[551,64356,64357],{"class":553,"line":1477},[551,64358,64359],{},"            string rutaExportacion = \"\";\n",[551,64361,64362],{"class":553,"line":1797},[551,64363,1139],{"emptyLinePlaceholder":238},[551,64365,64366],{"class":553,"line":1802},[551,64367,64368],{},"            oActionCallingContext.GetParameter(\"ProjectName\", ref nombreProyecto);\n",[551,64370,64371],{"class":553,"line":1808},[551,64372,64373],{},"            oActionCallingContext.GetParameter(\"ExportPath\", ref rutaExportacion);\n",[551,64375,64376],{"class":553,"line":1814},[551,64377,1139],{"emptyLinePlaceholder":238},[551,64379,64380],{"class":553,"line":1820},[551,64381,64382],{},"            \u002F\u002F Validar parámetros\n",[551,64384,64385],{"class":553,"line":1826},[551,64386,64387],{},"            if (string.IsNullOrEmpty(nombreProyecto))\n",[551,64389,64390],{"class":553,"line":1832},[551,64391,12301],{},[551,64393,64394],{"class":553,"line":1838},[551,64395,64396],{},"                MessageBox.Show(\"Error: ProjectName es obligatorio\");\n",[551,64398,64399],{"class":553,"line":1844},[551,64400,47614],{},[551,64402,64403],{"class":553,"line":1850},[551,64404,12311],{},[551,64406,64407],{"class":553,"line":1855},[551,64408,1139],{"emptyLinePlaceholder":238},[551,64410,64411],{"class":553,"line":1861},[551,64412,64413],{},"            \u002F\u002F 2. Usar parámetros para ejecutar comandos\n",[551,64415,64416],{"class":553,"line":1867},[551,64417,55695],{},[551,64419,64420],{"class":553,"line":1873},[551,64421,1139],{"emptyLinePlaceholder":238},[551,64423,64424],{"class":553,"line":1878},[551,64425,64426],{},"            \u002F\u002F Generar reportes\n",[551,64428,64429],{"class":553,"line":1883},[551,64430,55700],{},[551,64432,64433],{"class":553,"line":1888},[551,64434,64435],{},"            acc.AddParameter(\"TYPE\", \"PROJECT\");\n",[551,64437,64438],{"class":553,"line":4615},[551,64439,64440],{},"            acc.AddParameter(\"PROJECTNAME\", nombreProyecto);\n",[551,64442,64443],{"class":553,"line":4620},[551,64444,64445],{},"            cli.Execute(\"reports\", acc);\n",[551,64447,64448],{"class":553,"line":4626},[551,64449,1139],{"emptyLinePlaceholder":238},[551,64451,64452],{"class":553,"line":4631},[551,64453,64454],{},"            MessageBox.Show(\"Configuración completada para: \" + nombreProyecto);\n",[551,64456,64457],{"class":553,"line":4636},[551,64458,9077],{},[551,64460,64461],{"class":553,"line":4641},[551,64462,41473],{},[551,64464,64465],{"class":553,"line":4647},[551,64466,9062],{},[551,64468,64469],{"class":553,"line":4653},[551,64470,55428],{},[551,64472,64473],{"class":553,"line":4659},[551,64474,9077],{},[551,64476,64477],{"class":553,"line":4665},[551,64478,1187],{},[551,64480,64481],{"class":553,"line":4671},[551,64482,1193],{},[43,64484],{},[46,64486,64488],{"id":64487},"_5-tipos-de-parámetros","5. Tipos de parámetros",[331,64490,64492],{"id":64491},"_51-todos-son-strings","5.1 Todos son strings",[13,64494,64495],{},"Aunque GetParameter() siempre trabaja con strings, puedes convertir los valores:",[543,64497,64499],{"className":545,"code":64498,"language":547,"meta":228,"style":228},"\u002F\u002F Recibir como string\nstring alturaStr = \"\";\nstring sobrescribirStr = \"\";\n\noActionCallingContext.GetParameter(\"height\", ref alturaStr);\noActionCallingContext.GetParameter(\"overwrite\", ref sobrescribirStr);\n\n\u002F\u002F Convertir a otros tipos\nint altura = int.Parse(alturaStr);\nbool sobrescribir = sobrescribirStr == \"1\" || sobrescribirStr.ToLower() == \"true\";\n\n\u002F\u002F Usar los valores convertidos\nif (sobrescribir && altura > 20)\n{\n    \u002F\u002F Hacer algo...\n}\n",[54,64500,64501,64506,64511,64516,64520,64525,64530,64534,64539,64544,64549,64553,64558,64563,64567,64572],{"__ignoreMap":228},[551,64502,64503],{"class":553,"line":554},[551,64504,64505],{},"\u002F\u002F Recibir como string\n",[551,64507,64508],{"class":553,"line":229},[551,64509,64510],{},"string alturaStr = \"\";\n",[551,64512,64513],{"class":553,"line":670},[551,64514,64515],{},"string sobrescribirStr = \"\";\n",[551,64517,64518],{"class":553,"line":1136},[551,64519,1139],{"emptyLinePlaceholder":238},[551,64521,64522],{"class":553,"line":1142},[551,64523,64524],{},"oActionCallingContext.GetParameter(\"height\", ref alturaStr);\n",[551,64526,64527],{"class":553,"line":1148},[551,64528,64529],{},"oActionCallingContext.GetParameter(\"overwrite\", ref sobrescribirStr);\n",[551,64531,64532],{"class":553,"line":1154},[551,64533,1139],{"emptyLinePlaceholder":238},[551,64535,64536],{"class":553,"line":1160},[551,64537,64538],{},"\u002F\u002F Convertir a otros tipos\n",[551,64540,64541],{"class":553,"line":1166},[551,64542,64543],{},"int altura = int.Parse(alturaStr);\n",[551,64545,64546],{"class":553,"line":1172},[551,64547,64548],{},"bool sobrescribir = sobrescribirStr == \"1\" || sobrescribirStr.ToLower() == \"true\";\n",[551,64550,64551],{"class":553,"line":1178},[551,64552,1139],{"emptyLinePlaceholder":238},[551,64554,64555],{"class":553,"line":1184},[551,64556,64557],{},"\u002F\u002F Usar los valores convertidos\n",[551,64559,64560],{"class":553,"line":1190},[551,64561,64562],{},"if (sobrescribir && altura > 20)\n",[551,64564,64565],{"class":553,"line":1472},[551,64566,1151],{},[551,64568,64569],{"class":553,"line":1477},[551,64570,64571],{},"    \u002F\u002F Hacer algo...\n",[551,64573,64574],{"class":553,"line":1797},[551,64575,1193],{},[331,64577,64579],{"id":64578},"_52-manejo-seguro-de-conversiones","5.2 Manejo seguro de conversiones",[543,64581,64583],{"className":545,"code":64582,"language":547,"meta":228,"style":228},"string alturaStr = \"\";\noActionCallingContext.GetParameter(\"height\", ref alturaStr);\n\nint altura;\nif (int.TryParse(alturaStr, out altura))\n{\n    MessageBox.Show(\"Altura: \" + altura);\n}\nelse\n{\n    MessageBox.Show(\"Error: altura debe ser un número\");\n}\n",[54,64584,64585,64589,64593,64597,64602,64607,64611,64616,64620,64624,64628,64633],{"__ignoreMap":228},[551,64586,64587],{"class":553,"line":554},[551,64588,64510],{},[551,64590,64591],{"class":553,"line":229},[551,64592,64524],{},[551,64594,64595],{"class":553,"line":670},[551,64596,1139],{"emptyLinePlaceholder":238},[551,64598,64599],{"class":553,"line":1136},[551,64600,64601],{},"int altura;\n",[551,64603,64604],{"class":553,"line":1142},[551,64605,64606],{},"if (int.TryParse(alturaStr, out altura))\n",[551,64608,64609],{"class":553,"line":1148},[551,64610,1151],{},[551,64612,64613],{"class":553,"line":1154},[551,64614,64615],{},"    MessageBox.Show(\"Altura: \" + altura);\n",[551,64617,64618],{"class":553,"line":1160},[551,64619,1193],{},[551,64621,64622],{"class":553,"line":1166},[551,64623,3704],{},[551,64625,64626],{"class":553,"line":1172},[551,64627,1151],{},[551,64629,64630],{"class":553,"line":1178},[551,64631,64632],{},"    MessageBox.Show(\"Error: altura debe ser un número\");\n",[551,64634,64635],{"class":553,"line":1184},[551,64636,1193],{},[43,64638],{},[46,64640,64642],{"id":64641},"_6-ejemplo-práctico-completo","6. Ejemplo práctico completo",[331,64644,64646],{"id":64645},"_61-script-para-configurar-propiedades-de-proyecto","6.1 Script para configurar propiedades de proyecto",[13,64648,64649,64650,416],{},"Basado en patrones de ",[54,64651,64652],{},"EGCExecutor.cs",[543,64654,64656],{"className":545,"code":64655,"language":547,"meta":228,"style":228},"using System;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing Eplan.EplApi.Base;\nusing System.Windows.Forms;\n\npublic class ConfigurarPropiedadesProyecto\n{\n    [Start]\n    public void Execute(ActionCallingContext oActionCallingContext)\n    {\n        try\n        {\n            \u002F\u002F Recibir parámetros\n            string cliente = \"\";\n            string descripcion = \"\";\n            string ubicacion = \"\";\n\n            oActionCallingContext.GetParameter(\"Customer\", ref cliente);\n            oActionCallingContext.GetParameter(\"Description\", ref descripcion);\n            oActionCallingContext.GetParameter(\"Location\", ref ubicacion);\n\n            \u002F\u002F Validar que al menos un parámetro esté presente\n            if (string.IsNullOrEmpty(cliente) &&\n                string.IsNullOrEmpty(descripcion) &&\n                string.IsNullOrEmpty(ubicacion))\n            {\n                MessageBox.Show(\"Error: Debe proporcionar al menos un parámetro\");\n                return;\n            }\n\n            \u002F\u002F Configurar propiedades del proyecto\n            if (!string.IsNullOrEmpty(cliente))\n            {\n                SetProjectProperty(\"10102\", cliente);\n            }\n\n            if (!string.IsNullOrEmpty(descripcion))\n            {\n                SetProjectProperty(\"10011\", descripcion);\n            }\n\n            if (!string.IsNullOrEmpty(ubicacion))\n            {\n                SetProjectProperty(\"10032\", ubicacion);\n            }\n\n            MessageBox.Show(\n                \"Propiedades configuradas correctamente:\\n\\n\" +\n                \"Cliente: \" + cliente + \"\\n\" +\n                \"Descripción: \" + descripcion + \"\\n\" +\n                \"Ubicación: \" + ubicacion,\n                \"Éxito\"\n            );\n        }\n        catch (Exception ex)\n        {\n            MessageBox.Show(\"Error: \" + ex.Message, \"Error\");\n        }\n    }\n\n    private void SetProjectProperty(string propertyId, string value)\n    {\n        CommandLineInterpreter cli = new CommandLineInterpreter();\n        ActionCallingContext acc = new ActionCallingContext();\n\n        acc.AddParameter(\"PropertyIdentName\", propertyId);\n        acc.AddParameter(\"PropertyIndex\", \"0\");\n        acc.AddParameter(\"PropertyValue\", value);\n\n        cli.Execute(\"XEsSetProjectPropertyAction\", acc);\n    }\n}\n",[54,64657,64658,64662,64666,64670,64674,64678,64682,64687,64691,64695,64699,64703,64707,64711,64716,64721,64726,64731,64735,64740,64745,64750,64754,64759,64764,64769,64774,64778,64783,64787,64791,64795,64800,64805,64809,64814,64818,64822,64827,64831,64836,64840,64844,64849,64853,64858,64862,64866,64870,64875,64880,64885,64890,64895,64899,64903,64907,64911,64916,64920,64924,64928,64933,64937,64941,64945,64949,64954,64959,64964,64968,64973,64977],{"__ignoreMap":228},[551,64659,64660],{"class":553,"line":554},[551,64661,1123],{},[551,64663,64664],{"class":553,"line":229},[551,64665,1133],{},[551,64667,64668],{"class":553,"line":670},[551,64669,49898],{},[551,64671,64672],{"class":553,"line":1136},[551,64673,1128],{},[551,64675,64676],{"class":553,"line":1142},[551,64677,50105],{},[551,64679,64680],{"class":553,"line":1148},[551,64681,1139],{"emptyLinePlaceholder":238},[551,64683,64684],{"class":553,"line":1154},[551,64685,64686],{},"public class ConfigurarPropiedadesProyecto\n",[551,64688,64689],{"class":553,"line":1160},[551,64690,1151],{},[551,64692,64693],{"class":553,"line":1166},[551,64694,1157],{},[551,64696,64697],{"class":553,"line":1172},[551,64698,63849],{},[551,64700,64701],{"class":553,"line":1178},[551,64702,1169],{},[551,64704,64705],{"class":553,"line":1184},[551,64706,41211],{},[551,64708,64709],{"class":553,"line":1190},[551,64710,9062],{},[551,64712,64713],{"class":553,"line":1472},[551,64714,64715],{},"            \u002F\u002F Recibir parámetros\n",[551,64717,64718],{"class":553,"line":1477},[551,64719,64720],{},"            string cliente = \"\";\n",[551,64722,64723],{"class":553,"line":1797},[551,64724,64725],{},"            string descripcion = \"\";\n",[551,64727,64728],{"class":553,"line":1802},[551,64729,64730],{},"            string ubicacion = \"\";\n",[551,64732,64733],{"class":553,"line":1808},[551,64734,1139],{"emptyLinePlaceholder":238},[551,64736,64737],{"class":553,"line":1814},[551,64738,64739],{},"            oActionCallingContext.GetParameter(\"Customer\", ref cliente);\n",[551,64741,64742],{"class":553,"line":1820},[551,64743,64744],{},"            oActionCallingContext.GetParameter(\"Description\", ref descripcion);\n",[551,64746,64747],{"class":553,"line":1826},[551,64748,64749],{},"            oActionCallingContext.GetParameter(\"Location\", ref ubicacion);\n",[551,64751,64752],{"class":553,"line":1832},[551,64753,1139],{"emptyLinePlaceholder":238},[551,64755,64756],{"class":553,"line":1838},[551,64757,64758],{},"            \u002F\u002F Validar que al menos un parámetro esté presente\n",[551,64760,64761],{"class":553,"line":1844},[551,64762,64763],{},"            if (string.IsNullOrEmpty(cliente) &&\n",[551,64765,64766],{"class":553,"line":1850},[551,64767,64768],{},"                string.IsNullOrEmpty(descripcion) &&\n",[551,64770,64771],{"class":553,"line":1855},[551,64772,64773],{},"                string.IsNullOrEmpty(ubicacion))\n",[551,64775,64776],{"class":553,"line":1861},[551,64777,12301],{},[551,64779,64780],{"class":553,"line":1867},[551,64781,64782],{},"                MessageBox.Show(\"Error: Debe proporcionar al menos un parámetro\");\n",[551,64784,64785],{"class":553,"line":1873},[551,64786,47614],{},[551,64788,64789],{"class":553,"line":1878},[551,64790,12311],{},[551,64792,64793],{"class":553,"line":1883},[551,64794,1139],{"emptyLinePlaceholder":238},[551,64796,64797],{"class":553,"line":1888},[551,64798,64799],{},"            \u002F\u002F Configurar propiedades del proyecto\n",[551,64801,64802],{"class":553,"line":4615},[551,64803,64804],{},"            if (!string.IsNullOrEmpty(cliente))\n",[551,64806,64807],{"class":553,"line":4620},[551,64808,12301],{},[551,64810,64811],{"class":553,"line":4626},[551,64812,64813],{},"                SetProjectProperty(\"10102\", cliente);\n",[551,64815,64816],{"class":553,"line":4631},[551,64817,12311],{},[551,64819,64820],{"class":553,"line":4636},[551,64821,1139],{"emptyLinePlaceholder":238},[551,64823,64824],{"class":553,"line":4641},[551,64825,64826],{},"            if (!string.IsNullOrEmpty(descripcion))\n",[551,64828,64829],{"class":553,"line":4647},[551,64830,12301],{},[551,64832,64833],{"class":553,"line":4653},[551,64834,64835],{},"                SetProjectProperty(\"10011\", descripcion);\n",[551,64837,64838],{"class":553,"line":4659},[551,64839,12311],{},[551,64841,64842],{"class":553,"line":4665},[551,64843,1139],{"emptyLinePlaceholder":238},[551,64845,64846],{"class":553,"line":4671},[551,64847,64848],{},"            if (!string.IsNullOrEmpty(ubicacion))\n",[551,64850,64851],{"class":553,"line":4677},[551,64852,12301],{},[551,64854,64855],{"class":553,"line":4683},[551,64856,64857],{},"                SetProjectProperty(\"10032\", ubicacion);\n",[551,64859,64860],{"class":553,"line":4689},[551,64861,12311],{},[551,64863,64864],{"class":553,"line":4695},[551,64865,1139],{"emptyLinePlaceholder":238},[551,64867,64868],{"class":553,"line":4701},[551,64869,53598],{},[551,64871,64872],{"class":553,"line":4707},[551,64873,64874],{},"                \"Propiedades configuradas correctamente:\\n\\n\" +\n",[551,64876,64877],{"class":553,"line":4713},[551,64878,64879],{},"                \"Cliente: \" + cliente + \"\\n\" +\n",[551,64881,64882],{"class":553,"line":4719},[551,64883,64884],{},"                \"Descripción: \" + descripcion + \"\\n\" +\n",[551,64886,64887],{"class":553,"line":4725},[551,64888,64889],{},"                \"Ubicación: \" + ubicacion,\n",[551,64891,64892],{"class":553,"line":4731},[551,64893,64894],{},"                \"Éxito\"\n",[551,64896,64897],{"class":553,"line":4737},[551,64898,53623],{},[551,64900,64901],{"class":553,"line":4743},[551,64902,9077],{},[551,64904,64905],{"class":553,"line":4749},[551,64906,41473],{},[551,64908,64909],{"class":553,"line":4755},[551,64910,9062],{},[551,64912,64913],{"class":553,"line":4761},[551,64914,64915],{},"            MessageBox.Show(\"Error: \" + ex.Message, \"Error\");\n",[551,64917,64918],{"class":553,"line":4766},[551,64919,9077],{},[551,64921,64922],{"class":553,"line":4771},[551,64923,1187],{},[551,64925,64926],{"class":553,"line":4777},[551,64927,1139],{"emptyLinePlaceholder":238},[551,64929,64930],{"class":553,"line":4782},[551,64931,64932],{},"    private void SetProjectProperty(string propertyId, string value)\n",[551,64934,64935],{"class":553,"line":4787},[551,64936,1169],{},[551,64938,64939],{"class":553,"line":4793},[551,64940,53406],{},[551,64942,64943],{"class":553,"line":4799},[551,64944,62243],{},[551,64946,64947],{"class":553,"line":4805},[551,64948,1139],{"emptyLinePlaceholder":238},[551,64950,64951],{"class":553,"line":4811},[551,64952,64953],{},"        acc.AddParameter(\"PropertyIdentName\", propertyId);\n",[551,64955,64956],{"class":553,"line":4817},[551,64957,64958],{},"        acc.AddParameter(\"PropertyIndex\", \"0\");\n",[551,64960,64961],{"class":553,"line":4822},[551,64962,64963],{},"        acc.AddParameter(\"PropertyValue\", value);\n",[551,64965,64966],{"class":553,"line":4827},[551,64967,1139],{"emptyLinePlaceholder":238},[551,64969,64970],{"class":553,"line":9183},[551,64971,64972],{},"        cli.Execute(\"XEsSetProjectPropertyAction\", acc);\n",[551,64974,64975],{"class":553,"line":9188},[551,64976,1187],{},[551,64978,64979],{"class":553,"line":9193},[551,64980,1193],{},[43,64982],{},[46,64984,57526],{"id":57525},[331,64986,64988],{"id":64987},"_71-inicializar-variables-antes-de-getparameter","7.1 Inicializar variables antes de GetParameter()",[543,64990,64992],{"className":545,"code":64991,"language":547,"meta":228,"style":228},"\u002F\u002F Bien\nstring parametro = \"\";\noActionCallingContext.GetParameter(\"PARAM\", ref parametro);\n\n\u002F\u002F Mal - variable no inicializada\nstring parametro;\noActionCallingContext.GetParameter(\"PARAM\", ref parametro);  \u002F\u002F Error\n",[54,64993,64994,64998,65003,65008,65012,65017,65022],{"__ignoreMap":228},[551,64995,64996],{"class":553,"line":554},[551,64997,2156],{},[551,64999,65000],{"class":553,"line":229},[551,65001,65002],{},"string parametro = \"\";\n",[551,65004,65005],{"class":553,"line":670},[551,65006,65007],{},"oActionCallingContext.GetParameter(\"PARAM\", ref parametro);\n",[551,65009,65010],{"class":553,"line":1136},[551,65011,1139],{"emptyLinePlaceholder":238},[551,65013,65014],{"class":553,"line":1142},[551,65015,65016],{},"\u002F\u002F Mal - variable no inicializada\n",[551,65018,65019],{"class":553,"line":1148},[551,65020,65021],{},"string parametro;\n",[551,65023,65024],{"class":553,"line":1154},[551,65025,65026],{},"oActionCallingContext.GetParameter(\"PARAM\", ref parametro);  \u002F\u002F Error\n",[331,65028,65030],{"id":65029},"_72-validar-parámetros-recibidos","7.2 Validar parámetros recibidos",[543,65032,65034],{"className":545,"code":65033,"language":547,"meta":228,"style":228},"string ruta = \"\";\noActionCallingContext.GetParameter(\"PATH\", ref ruta);\n\nif (string.IsNullOrEmpty(ruta))\n{\n    MessageBox.Show(\"Error: PATH no puede estar vacío\");\n    return;\n}\n",[54,65035,65036,65041,65046,65050,65055,65059,65064,65068],{"__ignoreMap":228},[551,65037,65038],{"class":553,"line":554},[551,65039,65040],{},"string ruta = \"\";\n",[551,65042,65043],{"class":553,"line":229},[551,65044,65045],{},"oActionCallingContext.GetParameter(\"PATH\", ref ruta);\n",[551,65047,65048],{"class":553,"line":670},[551,65049,1139],{"emptyLinePlaceholder":238},[551,65051,65052],{"class":553,"line":1136},[551,65053,65054],{},"if (string.IsNullOrEmpty(ruta))\n",[551,65056,65057],{"class":553,"line":1142},[551,65058,1151],{},[551,65060,65061],{"class":553,"line":1148},[551,65062,65063],{},"    MessageBox.Show(\"Error: PATH no puede estar vacío\");\n",[551,65065,65066],{"class":553,"line":1154},[551,65067,16027],{},[551,65069,65070],{"class":553,"line":1160},[551,65071,1193],{},[331,65073,65075],{"id":65074},"_73-proporcionar-valores-por-defecto","7.3 Proporcionar valores por defecto",[543,65077,65079],{"className":545,"code":65078,"language":547,"meta":228,"style":228},"string idioma = \"\";\noActionCallingContext.GetParameter(\"Language\", ref idioma);\n\nif (string.IsNullOrEmpty(idioma))\n{\n    idioma = \"es_ES\";  \u002F\u002F Valor por defecto\n}\n",[54,65080,65081,65086,65091,65095,65100,65104,65109],{"__ignoreMap":228},[551,65082,65083],{"class":553,"line":554},[551,65084,65085],{},"string idioma = \"\";\n",[551,65087,65088],{"class":553,"line":229},[551,65089,65090],{},"oActionCallingContext.GetParameter(\"Language\", ref idioma);\n",[551,65092,65093],{"class":553,"line":670},[551,65094,1139],{"emptyLinePlaceholder":238},[551,65096,65097],{"class":553,"line":1136},[551,65098,65099],{},"if (string.IsNullOrEmpty(idioma))\n",[551,65101,65102],{"class":553,"line":1142},[551,65103,1151],{},[551,65105,65106],{"class":553,"line":1148},[551,65107,65108],{},"    idioma = \"es_ES\";  \u002F\u002F Valor por defecto\n",[551,65110,65111],{"class":553,"line":1154},[551,65112,1193],{},[331,65114,65116],{"id":65115},"_74-documentar-parámetros-esperados","7.4 Documentar parámetros esperados",[543,65118,65120],{"className":545,"code":65119,"language":547,"meta":228,"style":228},"\u002F\u002F\u002F \u003Csummary>\n\u002F\u002F\u002F Configura propiedades del proyecto.\n\u002F\u002F\u002F Parámetros esperados:\n\u002F\u002F\u002F - Customer: Nombre del cliente (opcional)\n\u002F\u002F\u002F - Description: Descripción del proyecto (opcional)\n\u002F\u002F\u002F - Location: Ubicación del proyecto (opcional)\n\u002F\u002F\u002F \u003C\u002Fsummary>\n[Start]\npublic void Execute(ActionCallingContext oActionCallingContext)\n{\n    \u002F\u002F ...\n}\n",[54,65121,65122,65127,65132,65137,65142,65147,65152,65157,65161,65165,65169,65173],{"__ignoreMap":228},[551,65123,65124],{"class":553,"line":554},[551,65125,65126],{},"\u002F\u002F\u002F \u003Csummary>\n",[551,65128,65129],{"class":553,"line":229},[551,65130,65131],{},"\u002F\u002F\u002F Configura propiedades del proyecto.\n",[551,65133,65134],{"class":553,"line":670},[551,65135,65136],{},"\u002F\u002F\u002F Parámetros esperados:\n",[551,65138,65139],{"class":553,"line":1136},[551,65140,65141],{},"\u002F\u002F\u002F - Customer: Nombre del cliente (opcional)\n",[551,65143,65144],{"class":553,"line":1142},[551,65145,65146],{},"\u002F\u002F\u002F - Description: Descripción del proyecto (opcional)\n",[551,65148,65149],{"class":553,"line":1148},[551,65150,65151],{},"\u002F\u002F\u002F - Location: Ubicación del proyecto (opcional)\n",[551,65153,65154],{"class":553,"line":1154},[551,65155,65156],{},"\u002F\u002F\u002F \u003C\u002Fsummary>\n",[551,65158,65159],{"class":553,"line":1160},[551,65160,1310],{},[551,65162,65163],{"class":553,"line":1166},[551,65164,63736],{},[551,65166,65167],{"class":553,"line":1172},[551,65168,1151],{},[551,65170,65171],{"class":553,"line":1178},[551,65172,16123],{},[551,65174,65175],{"class":553,"line":1184},[551,65176,1193],{},[43,65178],{},[46,65180,65182],{"id":65181},"_8-cómo-pasar-parámetros-a-tu-script","8. ¿Cómo pasar parámetros a tu script?",[331,65184,65186],{"id":65185},"_81-desde-línea-de-comandos","8.1 Desde línea de comandos",[13,65188,65189],{},"Puedes ejecutar tu script desde la línea de comandos de EPLAN pasando parámetros:",[543,65191,65194],{"className":65192,"code":65193,"language":847},[845],"ExecuteScript \u002FScriptPath:\"C:\\Scripts\\MiScript.cs\" \u002FCustomer:\"Acme Corp\" \u002FLocation:\"Madrid\"\n",[54,65195,65193],{"__ignoreMap":228},[331,65197,65199],{"id":65198},"_82-desde-otro-script","8.2 Desde otro script",[543,65201,65203],{"className":545,"code":65202,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\nActionCallingContext acc = new ActionCallingContext();\n\nacc.AddParameter(\"Customer\", \"Acme Corp\");\nacc.AddParameter(\"Location\", \"Madrid\");\n\ncli.Execute(\"MiAccionPersonalizada\", acc);\n",[54,65204,65205,65209,65213,65217,65222,65227,65231],{"__ignoreMap":228},[551,65206,65207],{"class":553,"line":554},[551,65208,52496],{},[551,65210,65211],{"class":553,"line":229},[551,65212,55901],{},[551,65214,65215],{"class":553,"line":670},[551,65216,1139],{"emptyLinePlaceholder":238},[551,65218,65219],{"class":553,"line":1136},[551,65220,65221],{},"acc.AddParameter(\"Customer\", \"Acme Corp\");\n",[551,65223,65224],{"class":553,"line":1142},[551,65225,65226],{},"acc.AddParameter(\"Location\", \"Madrid\");\n",[551,65228,65229],{"class":553,"line":1148},[551,65230,1139],{"emptyLinePlaceholder":238},[551,65232,65233],{"class":553,"line":1154},[551,65234,65235],{},"cli.Execute(\"MiAccionPersonalizada\", acc);\n",[331,65237,65239],{"id":65238},"_83-desde-aplicación-externa","8.3 Desde aplicación externa",[13,65241,65242],{},"Si llamas a EPLAN desde una aplicación externa, puedes pasar parámetros vía línea de comandos.",[43,65244],{},[46,65246,22685],{"id":22684},[13,65248,22688],{},[126,65250,65251,65256,65261,65264,65267,65270,65273],{},[88,65252,65253,65255],{},[16,65254,63673],{}," permite recibir parámetros en tu script",[88,65257,55068,65258,65260],{},[54,65259,63796],{}," es obligatorio con GetParameter()",[88,65262,65263],{},"Puedes recibir múltiples parámetros",[88,65265,65266],{},"Combinar GetParameter() (recibir) y AddParameter() (enviar)",[88,65268,65269],{},"Validar y convertir parámetros recibidos",[88,65271,65272],{},"Proporcionar valores por defecto para parámetros opcionales",[88,65274,65275],{},"Documentar los parámetros que tu script espera",[43,65277],{},[46,65279,5728],{"id":5727},[13,65281,65282],{},[16,65283,65284,65285,65287],{},"P: ¿Por qué necesito ",[54,65286,63796],{}," en GetParameter()?",[13,65289,65290,65291,65293],{},"R: Porque GetParameter() modifica la variable que le pasas. En C#, ",[54,65292,63796],{}," permite que un método modifique el valor de una variable.",[13,65295,65296],{},[16,65297,65298],{},"P: ¿Qué pasa si pido un parámetro que no fue proporcionado?",[13,65300,65301],{},"R: La variable permanece con su valor inicial (vacía si la inicializaste como \"\"). Por eso es importante validar.",[13,65303,65304],{},[16,65305,65306],{},"P: ¿Puedo tener parámetros obligatorios y opcionales?",[13,65308,65309],{},"R: Sí, usa validación para los obligatorios y valores por defecto para los opcionales.",[13,65311,65312],{},[16,65313,65314],{},"P: ¿GetParameter() y AddParameter() son lo mismo?",[13,65316,65317,65318,65321,65322,65325],{},"R: No. GetParameter() ",[16,65319,65320],{},"recibe"," parámetros en tu script. AddParameter() ",[16,65323,65324],{},"envía"," parámetros a comandos.",[43,65327],{},[46,65329,51782],{"id":36078},[331,65331,51786],{"id":51785},[13,65333,65334],{},[16,65335,61945],{},[331,65337,51795],{"id":51794},[13,65339,65340],{},[16,65341,65342],{},"Capítulo 20: PathMap - Variables del sistema",[13,65344,65345],{},"En el próximo capítulo aprenderás a usar PathMap.SubstitutePath() para obtener información del proyecto actual.",[43,65347],{},[13,65349,65350,10676,65352,54528,65354,93,65356,65359,93,65361,65363],{},[31,65351,657],{},[31,65353,10679],{},[31,65355,10683],{},[54,65357,65358],{},"code\u002Fcap-19\u002F",[31,65360,51827],{},[54,65362,63978],{}," (simplificado)",[660,65365,662],{},{"title":228,"searchDepth":229,"depth":229,"links":65367},[65368,65369,65370,65371,65375,65380,65384,65387,65391,65394,65400,65405,65406,65407],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":49652,"depth":229,"text":49653},{"id":63678,"depth":229,"text":63679,"children":65372},[65373,65374],{"id":63682,"depth":670,"text":63683},{"id":63712,"depth":670,"text":63713},{"id":63764,"depth":229,"text":63765,"children":65376},[65377,65378,65379],{"id":23266,"depth":670,"text":23267},{"id":63809,"depth":670,"text":63810},{"id":63902,"depth":670,"text":63903},{"id":63968,"depth":229,"text":63969,"children":65381},[65382,65383],{"id":63972,"depth":670,"text":63973},{"id":64126,"depth":670,"text":64127},{"id":64282,"depth":229,"text":64283,"children":65385},[65386],{"id":64286,"depth":670,"text":64287},{"id":64487,"depth":229,"text":64488,"children":65388},[65389,65390],{"id":64491,"depth":670,"text":64492},{"id":64578,"depth":670,"text":64579},{"id":64641,"depth":229,"text":64642,"children":65392},[65393],{"id":64645,"depth":670,"text":64646},{"id":57525,"depth":229,"text":57526,"children":65395},[65396,65397,65398,65399],{"id":64987,"depth":670,"text":64988},{"id":65029,"depth":670,"text":65030},{"id":65074,"depth":670,"text":65075},{"id":65115,"depth":670,"text":65116},{"id":65181,"depth":229,"text":65182,"children":65401},[65402,65403,65404],{"id":65185,"depth":670,"text":65186},{"id":65198,"depth":670,"text":65199},{"id":65238,"depth":670,"text":65239},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":65408},[65409,65410],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Envía parámetros múltiples con ActionCallingContext en la API de EPLAN en C# para automatizar tareas avanzadas en EPLAN Electric P8.",{},"\u002Fguia\u002Feplan-api\u002Fcap-19-parametros-multiples",{"title":63589,"description":65411},"guia\u002Feplan-api\u002Fcap-19-parametros-multiples","HsOOlkr3M7li297-mOoiTOJHadU0XXy6qhkpEEvuy3E",{"id":65418,"title":65419,"body":65420,"description":67016,"extension":236,"meta":67017,"navigation":238,"path":67018,"seo":67019,"stem":67020,"tagline":242,"__hash__":67021},"guia\u002Fguia\u002Fpathmap-mensajes\u002Fcap-20-pathmap-variables-sistema.md","Capítulo 20: PathMap y variables del sistema EPLAN",{"type":7,"value":65421,"toc":66965},[65422,65434,65436,65438,65440,65457,65459,65461,65473,65475,65479,65482,65488,65497,65503,65509,65529,65534,65543,65557,65567,65569,65573,65575,65584,65590,65601,65603,65611,65616,65620,65627,65646,65649,65651,65655,65659,65668,65673,65684,65689,65696,65700,65705,65765,65769,65790,65795,65797,65801,65805,65808,65817,65820,65846,65851,65857,65861,65864,65879,65885,65890,65938,65940,65944,65951,65955,66007,66011,66092,66096,66122,66130,66132,66136,66140,66145,66159,66164,66179,66184,66219,66224,66233,66237,66242,66253,66255,66259,66263,66266,66270,66420,66424,66432,66438,66454,66460,66462,66466,66470,66534,66539,66551,66555,66558,66568,66575,66577,66579,66583,66632,66636,66640,66660,66664,66679,66683,66711,66713,66717,66721,66726,66737,66742,66753,66757,66762,66771,66782,66786,66795,66805,66807,66809,66818,66823,66848,66853,66870,66875,66877,66879,66884,66891,66896,66899,66904,66914,66919,66925,66927,66929,66931,66935,66937,66942,66945,66947,66963],[10,65423,65424],{},[13,65425,65426,19,65429,19,65432,262],{},[16,65427,65428],{},"Parte III: PathMap y mensajes",[16,65430,65431],{},"Sección 7: Trabajar con strings y variables",[16,65433,25],{},[43,65435],{},[46,65437,268],{"id":267},[13,65439,702],{},[126,65441,65442,65445,65448,65451,65454],{},[88,65443,65444],{},"Entender qué es PathMap y por qué existe",[88,65446,65447],{},"Comprender el concepto de \"variables del sistema\"",[88,65449,65450],{},"Usar PathMap.SubstitutePath() para obtener información del proyecto",[88,65452,65453],{},"Conocer las variables PathMap más importantes y verificadas",[88,65455,65456],{},"Saber cuándo usar PathMap en lugar de otras alternativas",[43,65458],{},[46,65460,320],{"id":319},[126,65462,65463,65467,65470],{},[88,65464,58632,65465],{},[551,65466,1300],{},[88,65468,65469],{},"Entender strings en C#",[88,65471,65472],{},"Saber mostrar mensajes con MessageBox",[43,65474],{},[46,65476,65478],{"id":65477},"introducción-el-problema-que-resuelve-pathmap","Introducción: El problema que resuelve PathMap",[13,65480,65481],{},"Imagina que necesitas saber el nombre del proyecto actual en tu script. ¿Cómo lo obtienes?",[13,65483,65484,65487],{},[16,65485,65486],{},"Primera idea (errónea):"," \"Simplemente pregunto al usuario\"",[543,65489,65491],{"className":545,"code":65490,"language":547,"meta":228,"style":228},"string nombreProyecto = MessageBox.Show(\"¿Cuál es el nombre del proyecto?\");\n",[54,65492,65493],{"__ignoreMap":228},[551,65494,65495],{"class":553,"line":554},[551,65496,65490],{},[13,65498,65499,65502],{},[16,65500,65501],{},"Problema:"," El usuario tendría que escribirlo manualmente cada vez. ¡Terrible experiencia!",[13,65504,65505,65508],{},[16,65506,65507],{},"Segunda idea (errónea):"," \"Uso DataModel para acceder al proyecto\"",[543,65510,65512],{"className":545,"code":65511,"language":547,"meta":228,"style":228},"\u002F\u002F ❌ Requiere licencia premium\nProject proyecto = new ProjectManager().OpenProjects[0];\nstring nombre = proyecto.Name;\n",[54,65513,65514,65519,65524],{"__ignoreMap":228},[551,65515,65516],{"class":553,"line":554},[551,65517,65518],{},"\u002F\u002F ❌ Requiere licencia premium\n",[551,65520,65521],{"class":553,"line":229},[551,65522,65523],{},"Project proyecto = new ProjectManager().OpenProjects[0];\n",[551,65525,65526],{"class":553,"line":670},[551,65527,65528],{},"string nombre = proyecto.Name;\n",[13,65530,65531,65533],{},[16,65532,65501],{}," Requiere licencia premium (DataModel). No es gratuito.",[13,65535,65536,65539,65540],{},[16,65537,65538],{},"Solución correcta:"," Usar ",[16,65541,65542],{},"PathMap",[543,65544,65546],{"className":545,"code":65545,"language":547,"meta":228,"style":228},"\u002F\u002F ✅ Gratuito, automático, sin preguntar al usuario\nstring nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[54,65547,65548,65553],{"__ignoreMap":228},[551,65549,65550],{"class":553,"line":554},[551,65551,65552],{},"\u002F\u002F ✅ Gratuito, automático, sin preguntar al usuario\n",[551,65554,65555],{"class":553,"line":229},[551,65556,55788],{},[13,65558,65559,65560,4842,65563,65566],{},"PathMap es la forma ",[16,65561,65562],{},"gratuita",[16,65564,65565],{},"automática"," de obtener información del proyecto actual.",[43,65568],{},[46,65570,65572],{"id":65571},"_1-qué-es-pathmap","1. ¿Qué es PathMap?",[331,65574,49681],{"id":49680},[13,65576,65577,65579,65580,65583],{},[16,65578,65542],{}," es una clase de EPLAN API que permite acceder a ",[16,65581,65582],{},"variables del sistema"," predefinidas por EPLAN.",[13,65585,65586,65589],{},[16,65587,65588],{},"Variables del sistema"," son valores que EPLAN mantiene automáticamente sobre:",[126,65591,65592,65595,65598],{},[88,65593,65594],{},"El proyecto actual (nombre, ruta, propiedades)",[88,65596,65597],{},"Las carpetas de EPLAN (instalación, datos maestros, etc.)",[88,65599,65600],{},"El entorno (usuario, computadora, etc.)",[331,65602,58687],{"id":58686},[543,65604,65605],{"className":545,"code":1128,"language":547,"meta":228,"style":228},[54,65606,65607],{"__ignoreMap":228},[551,65608,65609],{"class":553,"line":554},[551,65610,1128],{},[13,65612,65613,65614,41],{},"PathMap está en el namespace ",[54,65615,1248],{},[331,65617,65619],{"id":65618},"_13-analogía","1.3 Analogía",[13,65621,65622,65623,65626],{},"Piensa en PathMap como un ",[16,65624,65625],{},"diccionario"," donde:",[126,65628,65629,65637],{},[88,65630,37190,65631,65634,65635],{},[16,65632,65633],{},"claves"," son nombres de variables como ",[54,65636,55801],{},[88,65638,21963,65639,65642,65643],{},[16,65640,65641],{},"valores"," son los datos reales como ",[54,65644,65645],{},"\"MiProyecto\"",[13,65647,65648],{},"EPLAN mantiene este diccionario actualizado automáticamente.",[43,65650],{},[46,65652,65654],{"id":65653},"_2-el-método-substitutepath","2. El método SubstitutePath()",[331,65656,65658],{"id":65657},"_21-sintaxis","2.1 Sintaxis",[543,65660,65662],{"className":545,"code":65661,"language":547,"meta":228,"style":228},"string valor = PathMap.SubstitutePath(\"$(NOMBRE_VARIABLE)\");\n",[54,65663,65664],{"__ignoreMap":228},[551,65665,65666],{"class":553,"line":554},[551,65667,65661],{},[13,65669,65670],{},[16,65671,65672],{},"Parámetro:",[126,65674,65675],{},[88,65676,65677,65680,65681,32897],{},[54,65678,65679],{},"\"$(NOMBRE_VARIABLE)\""," - Nombre de la variable a obtener (siempre entre ",[54,65682,65683],{},"$( )",[13,65685,65686],{},[16,65687,65688],{},"Retorno:",[126,65690,65691],{},[88,65692,65693,65695],{},[54,65694,62464],{}," - El valor de la variable, o la variable sin sustituir si no existe",[331,65697,65699],{"id":65698},"_22-ejemplo-del-script-oficial","2.2 Ejemplo del script oficial",[13,65701,62193,65702,416],{},[54,65703,65704],{},"EPLAN-Scripting-4.0\u002F03_Classes\u002F02_StringPathVariable.cs",[543,65706,65708],{"className":545,"code":65707,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class ObtenerNombreProyecto\n{\n    [Start]\n    public void Function()\n    {\n        string projectName = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n        MessageBox.Show(projectName);\n    }\n}\n",[54,65709,65710,65714,65718,65722,65726,65731,65735,65739,65743,65747,65752,65757,65761],{"__ignoreMap":228},[551,65711,65712],{"class":553,"line":554},[551,65713,50105],{},[551,65715,65716],{"class":553,"line":229},[551,65717,1128],{},[551,65719,65720],{"class":553,"line":670},[551,65721,49898],{},[551,65723,65724],{"class":553,"line":1136},[551,65725,1139],{"emptyLinePlaceholder":238},[551,65727,65728],{"class":553,"line":1142},[551,65729,65730],{},"public class ObtenerNombreProyecto\n",[551,65732,65733],{"class":553,"line":1148},[551,65734,1151],{},[551,65736,65737],{"class":553,"line":1154},[551,65738,1157],{},[551,65740,65741],{"class":553,"line":1160},[551,65742,57216],{},[551,65744,65745],{"class":553,"line":1166},[551,65746,1169],{},[551,65748,65749],{"class":553,"line":1172},[551,65750,65751],{},"        string projectName = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,65753,65754],{"class":553,"line":1178},[551,65755,65756],{},"        MessageBox.Show(projectName);\n",[551,65758,65759],{"class":553,"line":1184},[551,65760,1187],{},[551,65762,65763],{"class":553,"line":1190},[551,65764,1193],{},[13,65766,65767],{},[16,65768,1225],{},[85,65770,65771,65777,65784,65787],{},[88,65772,65773,65774],{},"Llama a ",[54,65775,65776],{},"PathMap.SubstitutePath(\"$(PROJECTNAME)\")",[88,65778,65779,65780,65783],{},"EPLAN busca la variable ",[54,65781,65782],{},"PROJECTNAME"," en su diccionario interno",[88,65785,65786],{},"Devuelve el nombre del proyecto actual (por ejemplo: \"MiProyecto\")",[88,65788,65789],{},"Lo muestra en un MessageBox",[13,65791,65792,65794],{},[16,65793,53214],{}," No necesitas abrir el proyecto manualmente ni saber de antemano su nombre. EPLAN ya lo tiene.",[43,65796],{},[46,65798,65800],{"id":65799},"_3-cómo-funciona-internamente","3. ¿Cómo funciona internamente?",[331,65802,65804],{"id":65803},"_31-el-proceso-de-sustitución","3.1 El proceso de sustitución",[13,65806,65807],{},"Cuando ejecutas:",[543,65809,65811],{"className":545,"code":65810,"language":547,"meta":228,"style":228},"string valor = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[54,65812,65813],{"__ignoreMap":228},[551,65814,65815],{"class":553,"line":554},[551,65816,65810],{},[13,65818,65819],{},"Internamente EPLAN hace:",[85,65821,65822,65828,65833,65837,65843],{},[88,65823,65824,65825],{},"Lee la cadena ",[54,65826,65827],{},"\"$(PROJECTNAME)\"",[88,65829,65830,65831],{},"Identifica que hay una variable entre ",[54,65832,65683],{},[88,65834,1952,65835,65783],{},[54,65836,65782],{},[88,65838,65839,65842],{},[16,65840,65841],{},"Sustituye"," la variable por su valor real",[88,65844,65845],{},"Devuelve el resultado",[13,65847,65848],{},[16,65849,65850],{},"Ejemplo visual:",[543,65852,65855],{"className":65853,"code":65854,"language":847},[845],"Input:  \"$(PROJECTNAME)\"\n        ↓ (EPLAN busca en su diccionario)\n        PROJECTNAME = \"MiProyecto_2025\"\n        ↓\nOutput: \"MiProyecto_2025\"\n",[54,65856,65854],{"__ignoreMap":228},[331,65858,65860],{"id":65859},"_32-variables-no-existentes","3.2 Variables no existentes",[13,65862,65863],{},"¿Qué pasa si la variable no existe?",[543,65865,65867],{"className":545,"code":65866,"language":547,"meta":228,"style":228},"string valor = PathMap.SubstitutePath(\"$(VARIABLE_INVENTADA)\");\n\u002F\u002F valor = \"$(VARIABLE_INVENTADA)\"  (sin sustituir)\n",[54,65868,65869,65874],{"__ignoreMap":228},[551,65870,65871],{"class":553,"line":554},[551,65872,65873],{},"string valor = PathMap.SubstitutePath(\"$(VARIABLE_INVENTADA)\");\n",[551,65875,65876],{"class":553,"line":229},[551,65877,65878],{},"\u002F\u002F valor = \"$(VARIABLE_INVENTADA)\"  (sin sustituir)\n",[13,65880,65881,65882,41],{},"Si la variable no existe, ",[16,65883,65884],{},"devuelve la cadena original sin cambios",[13,65886,65887],{},[16,65888,65889],{},"Cómo detectarlo:",[543,65891,65893],{"className":545,"code":65892,"language":547,"meta":228,"style":228},"string valor = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\nif (valor.StartsWith(\"$(\"))\n{\n    MessageBox.Show(\"La variable no fue sustituida. Puede que no exista o no haya proyecto abierto.\");\n}\nelse\n{\n    MessageBox.Show(\"Nombre del proyecto: \" + valor);\n}\n",[54,65894,65895,65899,65903,65908,65912,65917,65921,65925,65929,65934],{"__ignoreMap":228},[551,65896,65897],{"class":553,"line":554},[551,65898,65810],{},[551,65900,65901],{"class":553,"line":229},[551,65902,1139],{"emptyLinePlaceholder":238},[551,65904,65905],{"class":553,"line":670},[551,65906,65907],{},"if (valor.StartsWith(\"$(\"))\n",[551,65909,65910],{"class":553,"line":1136},[551,65911,1151],{},[551,65913,65914],{"class":553,"line":1142},[551,65915,65916],{},"    MessageBox.Show(\"La variable no fue sustituida. Puede que no exista o no haya proyecto abierto.\");\n",[551,65918,65919],{"class":553,"line":1148},[551,65920,1193],{},[551,65922,65923],{"class":553,"line":1154},[551,65924,3704],{},[551,65926,65927],{"class":553,"line":1160},[551,65928,1151],{},[551,65930,65931],{"class":553,"line":1166},[551,65932,65933],{},"    MessageBox.Show(\"Nombre del proyecto: \" + valor);\n",[551,65935,65936],{"class":553,"line":1172},[551,65937,1193],{},[43,65939],{},[46,65941,65943],{"id":65942},"_4-variables-pathmap-verificadas","4. Variables PathMap verificadas",[13,65945,65946,65947,65950],{},"Estas variables están ",[16,65948,65949],{},"verificadas"," en los scripts oficiales de EPLAN-Scripting-4.0:",[331,65952,65954],{"id":65953},"_41-variables-de-proyecto","4.1 Variables de proyecto",[6589,65956,65957,65969],{},[6592,65958,65959],{},[6595,65960,65961,65964,65967],{},[6598,65962,65963],{},"Variable",[6598,65965,65966],{},"Descripción",[6598,65968,6606],{},[6611,65970,65971,65982,65995],{},[6595,65972,65973,65977,65980],{},[6616,65974,65975],{},[54,65976,55801],{},[6616,65978,65979],{},"Nombre del proyecto sin extensión",[6616,65981,65645],{},[6595,65983,65984,65989,65992],{},[6616,65985,65986],{},[54,65987,65988],{},"$(PROJECTPATH)",[6616,65990,65991],{},"Ruta completa del proyecto",[6616,65993,65994],{},"\"C:\\Proyectos\\MiProyecto.elk\"",[6595,65996,65997,66002,66005],{},[6616,65998,65999],{},[54,66000,66001],{},"$(P)",[6616,66003,66004],{},"Directorio completo del proyecto",[6616,66006,65994],{},[331,66008,66010],{"id":66009},"_42-variables-de-carpetas-eplan","4.2 Variables de carpetas EPLAN",[6589,66012,66013,66021],{},[6592,66014,66015],{},[6595,66016,66017,66019],{},[6598,66018,65963],{},[6598,66020,65966],{},[6611,66022,66023,66032,66042,66052,66062,66072,66082],{},[6595,66024,66025,66029],{},[6616,66026,66027],{},[54,66028,55795],{},[6616,66030,66031],{},"Carpeta de documentos de EPLAN",[6595,66033,66034,66039],{},[6616,66035,66036],{},[54,66037,66038],{},"$(MD_PROJECTS)",[6616,66040,66041],{},"Carpeta de datos maestros - Proyectos",[6595,66043,66044,66049],{},[6616,66045,66046],{},[54,66047,66048],{},"$(MD_PARTS)",[6616,66050,66051],{},"Carpeta de datos maestros - Artículos",[6595,66053,66054,66059],{},[6616,66055,66056],{},[54,66057,66058],{},"$(MD_MACROS)",[6616,66060,66061],{},"Carpeta de datos maestros - Macros",[6595,66063,66064,66069],{},[6616,66065,66066],{},[54,66067,66068],{},"$(MD_SYMBOLS)",[6616,66070,66071],{},"Carpeta de datos maestros - Símbolos",[6595,66073,66074,66079],{},[6616,66075,66076],{},[54,66077,66078],{},"$(BIN)",[6616,66080,66081],{},"Carpeta de binarios de EPLAN",[6595,66083,66084,66089],{},[6616,66085,66086],{},[54,66087,66088],{},"$(EPLAN)",[6616,66090,66091],{},"Carpeta de instalación de EPLAN",[331,66093,66095],{"id":66094},"_43-variables-de-propiedades-de-proyecto","4.3 Variables de propiedades de proyecto",[6589,66097,66098,66106],{},[6592,66099,66100],{},[6595,66101,66102,66104],{},[6598,66103,65963],{},[6598,66105,65966],{},[6611,66107,66108],{},[6595,66109,66110,66119],{},[6616,66111,66112,66115,66116],{},[54,66113,66114],{},"$(PROJECTPROPERTYFIELD1)"," a ",[54,66117,66118],{},"$(PROJECTPROPERTYFIELD30)",[6616,66120,66121],{},"Campos personalizados del proyecto",[13,66123,66124,66126,66127,66129],{},[16,66125,50964],{}," Solo usa variables que están ",[16,66128,65949],{}," en scripts oficiales.",[43,66131],{},[46,66133,66135],{"id":66134},"_5-cuándo-usar-pathmap","5. Cuándo usar PathMap",[331,66137,66139],{"id":66138},"_51-casos-de-uso-comunes","5.1 Casos de uso comunes",[13,66141,66142],{},[16,66143,66144],{},"1. Obtener información del proyecto actual",[543,66146,66148],{"className":545,"code":66147,"language":547,"meta":228,"style":228},"string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\nstring rutaProyecto = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[54,66149,66150,66154],{"__ignoreMap":228},[551,66151,66152],{"class":553,"line":554},[551,66153,55788],{},[551,66155,66156],{"class":553,"line":229},[551,66157,66158],{},"string rutaProyecto = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[13,66160,66161],{},[16,66162,66163],{},"2. Construir rutas de archivos relacionadas al proyecto",[543,66165,66167],{"className":545,"code":66166,"language":547,"meta":228,"style":228},"string directorioProyecto = PathMap.SubstitutePath(\"$(P)\");\nstring archivoExport = directorioProyecto + \"export.xml\";\n",[54,66168,66169,66174],{"__ignoreMap":228},[551,66170,66171],{"class":553,"line":554},[551,66172,66173],{},"string directorioProyecto = PathMap.SubstitutePath(\"$(P)\");\n",[551,66175,66176],{"class":553,"line":229},[551,66177,66178],{},"string archivoExport = directorioProyecto + \"export.xml\";\n",[13,66180,66181],{},[16,66182,66183],{},"3. Verificar si hay proyecto abierto",[543,66185,66187],{"className":545,"code":66186,"language":547,"meta":228,"style":228},"string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\nif (string.IsNullOrEmpty(nombreProyecto) || nombreProyecto.StartsWith(\"$(\"))\n{\n    MessageBox.Show(\"No hay proyecto abierto\");\n    return;\n}\n",[54,66188,66189,66193,66197,66202,66206,66211,66215],{"__ignoreMap":228},[551,66190,66191],{"class":553,"line":554},[551,66192,55788],{},[551,66194,66195],{"class":553,"line":229},[551,66196,1139],{"emptyLinePlaceholder":238},[551,66198,66199],{"class":553,"line":670},[551,66200,66201],{},"if (string.IsNullOrEmpty(nombreProyecto) || nombreProyecto.StartsWith(\"$(\"))\n",[551,66203,66204],{"class":553,"line":1136},[551,66205,1151],{},[551,66207,66208],{"class":553,"line":1142},[551,66209,66210],{},"    MessageBox.Show(\"No hay proyecto abierto\");\n",[551,66212,66213],{"class":553,"line":1148},[551,66214,16027],{},[551,66216,66217],{"class":553,"line":1154},[551,66218,1193],{},[13,66220,66221],{},[16,66222,66223],{},"4. Acceder a datos maestros",[543,66225,66227],{"className":545,"code":66226,"language":547,"meta":228,"style":228},"string carpetaArticulos = PathMap.SubstitutePath(\"$(MD_PARTS)\");\n",[54,66228,66229],{"__ignoreMap":228},[551,66230,66231],{"class":553,"line":554},[551,66232,66226],{},[331,66234,66236],{"id":66235},"_52-cuándo-no-usar-pathmap","5.2 Cuándo NO usar PathMap",[13,66238,66239],{},[16,66240,66241],{},"No uses PathMap si:",[126,66243,66244,66247,66250],{},[88,66245,66246],{},"Necesitas información compleja del proyecto (usa DataModel si tienes licencia, o exporta y parsea)",[88,66248,66249],{},"Necesitas modificar propiedades (usa comandos CLI con ActionCallingContext)",[88,66251,66252],{},"La variable no está verificada en scripts oficiales",[43,66254],{},[46,66256,66258],{"id":66257},"_6-ejemplo-pedagógico-validar-proyecto-abierto","6. Ejemplo pedagógico: Validar proyecto abierto",[331,66260,66262],{"id":66261},"_61-el-problema","6.1 El problema",[13,66264,66265],{},"Muchos scripts requieren que haya un proyecto abierto. ¿Cómo verificarlo de forma gratuita?",[331,66267,66269],{"id":66268},"_62-la-solución-con-pathmap","6.2 La solución con PathMap",[543,66271,66273],{"className":545,"code":66272,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class ValidarProyectoAbierto\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Obtener nombre del proyecto\n        string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n        \u002F\u002F Verificar si se obtuvo un valor válido\n        if (string.IsNullOrEmpty(nombreProyecto) || nombreProyecto.StartsWith(\"$(\"))\n        {\n            MessageBox.Show(\n                \"No hay ningún proyecto abierto.\\n\\n\" +\n                \"Por favor, abre un proyecto antes de ejecutar este script.\",\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Warning\n            );\n            return;\n        }\n\n        \u002F\u002F Si llegamos aquí, hay un proyecto abierto\n        MessageBox.Show(\n            \"Proyecto abierto: \" + nombreProyecto,\n            \"Información\",\n            MessageBoxButtons.OK,\n            MessageBoxIcon.Information\n        );\n    }\n}\n",[54,66274,66275,66279,66283,66287,66291,66296,66300,66304,66308,66312,66317,66321,66325,66330,66334,66338,66342,66347,66352,66356,66360,66365,66369,66373,66377,66381,66386,66390,66395,66400,66404,66408,66412,66416],{"__ignoreMap":228},[551,66276,66277],{"class":553,"line":554},[551,66278,50105],{},[551,66280,66281],{"class":553,"line":229},[551,66282,1128],{},[551,66284,66285],{"class":553,"line":670},[551,66286,49898],{},[551,66288,66289],{"class":553,"line":1136},[551,66290,1139],{"emptyLinePlaceholder":238},[551,66292,66293],{"class":553,"line":1142},[551,66294,66295],{},"public class ValidarProyectoAbierto\n",[551,66297,66298],{"class":553,"line":1148},[551,66299,1151],{},[551,66301,66302],{"class":553,"line":1154},[551,66303,1157],{},[551,66305,66306],{"class":553,"line":1160},[551,66307,57216],{},[551,66309,66310],{"class":553,"line":1166},[551,66311,1169],{},[551,66313,66314],{"class":553,"line":1172},[551,66315,66316],{},"        \u002F\u002F Obtener nombre del proyecto\n",[551,66318,66319],{"class":553,"line":1178},[551,66320,55600],{},[551,66322,66323],{"class":553,"line":1184},[551,66324,1139],{"emptyLinePlaceholder":238},[551,66326,66327],{"class":553,"line":1190},[551,66328,66329],{},"        \u002F\u002F Verificar si se obtuvo un valor válido\n",[551,66331,66332],{"class":553,"line":1472},[551,66333,59359],{},[551,66335,66336],{"class":553,"line":1477},[551,66337,9062],{},[551,66339,66340],{"class":553,"line":1797},[551,66341,53598],{},[551,66343,66344],{"class":553,"line":1802},[551,66345,66346],{},"                \"No hay ningún proyecto abierto.\\n\\n\" +\n",[551,66348,66349],{"class":553,"line":1808},[551,66350,66351],{},"                \"Por favor, abre un proyecto antes de ejecutar este script.\",\n",[551,66353,66354],{"class":553,"line":1814},[551,66355,53649],{},[551,66357,66358],{"class":553,"line":1820},[551,66359,53613],{},[551,66361,66362],{"class":553,"line":1826},[551,66363,66364],{},"                MessageBoxIcon.Warning\n",[551,66366,66367],{"class":553,"line":1832},[551,66368,53623],{},[551,66370,66371],{"class":553,"line":1838},[551,66372,42906],{},[551,66374,66375],{"class":553,"line":1844},[551,66376,9077],{},[551,66378,66379],{"class":553,"line":1850},[551,66380,1139],{"emptyLinePlaceholder":238},[551,66382,66383],{"class":553,"line":1855},[551,66384,66385],{},"        \u002F\u002F Si llegamos aquí, hay un proyecto abierto\n",[551,66387,66388],{"class":553,"line":1861},[551,66389,4790],{},[551,66391,66392],{"class":553,"line":1867},[551,66393,66394],{},"            \"Proyecto abierto: \" + nombreProyecto,\n",[551,66396,66397],{"class":553,"line":1873},[551,66398,66399],{},"            \"Información\",\n",[551,66401,66402],{"class":553,"line":1878},[551,66403,4808],{},[551,66405,66406],{"class":553,"line":1883},[551,66407,4814],{},[551,66409,66410],{"class":553,"line":1888},[551,66411,4758],{},[551,66413,66414],{"class":553,"line":4615},[551,66415,1187],{},[551,66417,66418],{"class":553,"line":4620},[551,66419,1193],{},[331,66421,66423],{"id":66422},"_63-explicación-del-código","6.3 Explicación del código",[13,66425,66426],{},[16,66427,66428,66429,36151],{},"¿Por qué verificar con ",[54,66430,66431],{},"StartsWith(\"$(\")",[13,66433,66434,66435,416],{},"Cuando no hay proyecto abierto, PathMap devuelve la variable ",[16,66436,66437],{},"sin sustituir",[126,66439,66440,66445],{},[88,66441,66442,66443],{},"Con proyecto: ",[54,66444,65645],{},[88,66446,66447,66448,66450,66451,32897],{},"Sin proyecto: ",[54,66449,65827],{}," (contiene ",[54,66452,66453],{},"$(",[13,66455,66456,66457,66459],{},"Si el string devuelto empieza con ",[54,66458,66453],{},", significa que la variable no se sustituyó.",[43,66461],{},[46,66463,66465],{"id":66464},"_7-diferencia-con-otras-aproximaciones","7. Diferencia con otras aproximaciones",[331,66467,66469],{"id":66468},"_71-pathmap-vs-datamodel","7.1 PathMap vs DataModel",[6589,66471,66472,66483],{},[6592,66473,66474],{},[6595,66475,66476,66478,66480],{},[6598,66477,61347],{},[6598,66479,65542],{},[6598,66481,66482],{},"DataModel",[6611,66484,66485,66497,66509,66522],{},[6595,66486,66487,66492,66494],{},[6616,66488,66489],{},[16,66490,66491],{},"Licencia",[6616,66493,1006],{},[6616,66495,66496],{},"Premium",[6595,66498,66499,66503,66506],{},[6616,66500,66501],{},[16,66502,61385],{},[6616,66504,66505],{},"Simple",[6616,66507,66508],{},"Complejo",[6595,66510,66511,66516,66519],{},[6616,66512,66513],{},[16,66514,66515],{},"Información",[6616,66517,66518],{},"Básica",[6616,66520,66521],{},"Completa",[6595,66523,66524,66528,66531],{},[6616,66525,66526],{},[16,66527,6771],{},[6616,66529,66530],{},"Nombre, ruta, campos personalizados",[6616,66532,66533],{},"Páginas, componentes, conexiones",[13,66535,66536],{},[16,66537,66538],{},"Cuándo usar cada uno:",[126,66540,66541,66546],{},[88,66542,66543,66545],{},[16,66544,65542],{},": Información básica del proyecto (nombre, ruta, propiedades)",[88,66547,66548,66550],{},[16,66549,66482],{},": Información detallada (solo si tienes licencia premium)",[331,66552,66554],{"id":66553},"_72-pathmap-vs-exportar-y-parsear","7.2 PathMap vs Exportar y parsear",[13,66556,66557],{},"Para información compleja (lista de componentes, conexiones, etc.):",[13,66559,66560,66563,66564,66567],{},[16,66561,66562],{},"Con PathMap:"," No es posible\n",[16,66565,66566],{},"Con Export + Parse:"," Exporta a XML\u002FCSV, luego parsea con System.Xml.Linq (gratuito)",[13,66569,66570,66571,66574],{},"PathMap es solo para información ",[16,66572,66573],{},"básica"," del proyecto y del entorno.",[43,66576],{},[46,66578,63067],{"id":63066},[331,66580,66582],{"id":66581},"_81-siempre-validar-el-resultado","8.1 Siempre validar el resultado",[543,66584,66586],{"className":545,"code":66585,"language":547,"meta":228,"style":228},"string valor = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n\u002F\u002F Validar ANTES de usar\nif (string.IsNullOrEmpty(valor) || valor.StartsWith(\"$(\"))\n{\n    \u002F\u002F Manejar el caso de variable no sustituida\n    return;\n}\n\n\u002F\u002F Ahora es seguro usar 'valor'\n",[54,66587,66588,66592,66596,66601,66606,66610,66615,66619,66623,66627],{"__ignoreMap":228},[551,66589,66590],{"class":553,"line":554},[551,66591,65810],{},[551,66593,66594],{"class":553,"line":229},[551,66595,1139],{"emptyLinePlaceholder":238},[551,66597,66598],{"class":553,"line":670},[551,66599,66600],{},"\u002F\u002F Validar ANTES de usar\n",[551,66602,66603],{"class":553,"line":1136},[551,66604,66605],{},"if (string.IsNullOrEmpty(valor) || valor.StartsWith(\"$(\"))\n",[551,66607,66608],{"class":553,"line":1142},[551,66609,1151],{},[551,66611,66612],{"class":553,"line":1148},[551,66613,66614],{},"    \u002F\u002F Manejar el caso de variable no sustituida\n",[551,66616,66617],{"class":553,"line":1154},[551,66618,16027],{},[551,66620,66621],{"class":553,"line":1160},[551,66622,1193],{},[551,66624,66625],{"class":553,"line":1166},[551,66626,1139],{"emptyLinePlaceholder":238},[551,66628,66629],{"class":553,"line":1172},[551,66630,66631],{},"\u002F\u002F Ahora es seguro usar 'valor'\n",[331,66633,66635],{"id":66634},"_82-solo-usar-variables-verificadas","8.2 Solo usar variables verificadas",[13,66637,66638],{},[16,66639,57587],{},[543,66641,66643],{"className":545,"code":66642,"language":547,"meta":228,"style":228},"\u002F\u002F Variables verificadas en scripts oficiales\nstring nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\nstring ruta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[54,66644,66645,66650,66655],{"__ignoreMap":228},[551,66646,66647],{"class":553,"line":554},[551,66648,66649],{},"\u002F\u002F Variables verificadas en scripts oficiales\n",[551,66651,66652],{"class":553,"line":229},[551,66653,66654],{},"string nombre = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,66656,66657],{"class":553,"line":670},[551,66658,66659],{},"string ruta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[13,66661,66662],{},[16,66663,57538],{},[543,66665,66667],{"className":545,"code":66666,"language":547,"meta":228,"style":228},"\u002F\u002F Variable NO verificada (puede no existir)\nstring usuario = PathMap.SubstitutePath(\"$(USERNAME)\");\n",[54,66668,66669,66674],{"__ignoreMap":228},[551,66670,66671],{"class":553,"line":554},[551,66672,66673],{},"\u002F\u002F Variable NO verificada (puede no existir)\n",[551,66675,66676],{"class":553,"line":229},[551,66677,66678],{},"string usuario = PathMap.SubstitutePath(\"$(USERNAME)\");\n",[331,66680,66682],{"id":66681},"_83-comentar-qué-variable-estás-obteniendo","8.3 Comentar qué variable estás obteniendo",[543,66684,66686],{"className":545,"code":66685,"language":547,"meta":228,"style":228},"\u002F\u002F Obtener nombre del proyecto actual (sin extensión)\nstring nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n\u002F\u002F Obtener ruta completa del proyecto\nstring rutaCompleta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[54,66687,66688,66693,66697,66701,66706],{"__ignoreMap":228},[551,66689,66690],{"class":553,"line":554},[551,66691,66692],{},"\u002F\u002F Obtener nombre del proyecto actual (sin extensión)\n",[551,66694,66695],{"class":553,"line":229},[551,66696,55788],{},[551,66698,66699],{"class":553,"line":670},[551,66700,1139],{"emptyLinePlaceholder":238},[551,66702,66703],{"class":553,"line":1136},[551,66704,66705],{},"\u002F\u002F Obtener ruta completa del proyecto\n",[551,66707,66708],{"class":553,"line":1142},[551,66709,66710],{},"string rutaCompleta = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[43,66712],{},[46,66714,66716],{"id":66715},"_9-casos-prácticos-explicados","9. Casos prácticos explicados",[331,66718,66720],{"id":66719},"_91-por-qué-pathmap-en-lugar-de-preguntar-al-usuario","9.1 ¿Por qué PathMap en lugar de preguntar al usuario?",[13,66722,66723,66725],{},[16,66724,65501],{}," Si pides al usuario que escriba el nombre del proyecto:",[126,66727,66728,66731,66734],{},[88,66729,66730],{},"Es tedioso (el usuario ya lo abrió, ¿por qué escribirlo otra vez?)",[88,66732,66733],{},"Propenso a errores (puede escribirlo mal)",[88,66735,66736],{},"Mala experiencia de usuario",[13,66738,66739],{},[16,66740,66741],{},"Solución con PathMap:",[126,66743,66744,66747,66750],{},[88,66745,66746],{},"Automático (cero interacción)",[88,66748,66749],{},"Sin errores (EPLAN lo sabe con certeza)",[88,66751,66752],{},"Mejor experiencia",[331,66754,66756],{"id":66755},"_92-por-qué-pathmap-en-lugar-de-hardcodear","9.2 ¿Por qué PathMap en lugar de hardcodear?",[13,66758,66759,66761],{},[16,66760,65501],{}," Si hardcodeas el nombre:",[543,66763,66765],{"className":545,"code":66764,"language":547,"meta":228,"style":228},"string nombreProyecto = \"MiProyecto\";  \u002F\u002F ❌ Hardcodeado\n",[54,66766,66767],{"__ignoreMap":228},[551,66768,66769],{"class":553,"line":554},[551,66770,66764],{},[126,66772,66773,66776,66779],{},[88,66774,66775],{},"Solo funciona para ese proyecto específico",[88,66777,66778],{},"No es reutilizable",[88,66780,66781],{},"Difícil de mantener",[13,66783,66784],{},[16,66785,66741],{},[543,66787,66789],{"className":545,"code":66788,"language":547,"meta":228,"style":228},"string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");  \u002F\u002F ✅ Dinámico\n",[54,66790,66791],{"__ignoreMap":228},[551,66792,66793],{"class":553,"line":554},[551,66794,66788],{},[126,66796,66797,66800,66803],{},[88,66798,66799],{},"Funciona con cualquier proyecto",[88,66801,66802],{},"Reutilizable",[88,66804,52807],{},[43,66806],{},[46,66808,22685],{"id":22684},[13,66810,66811,66813,66814,4842,66816,41],{},[16,66812,65542],{}," es tu herramienta para obtener información básica del proyecto de forma ",[16,66815,65562],{},[16,66817,65565],{},[13,66819,66820],{},[16,66821,66822],{},"Conceptos clave:",[126,66824,66825,66831,66836,66839,66845],{},[88,66826,66827,66830],{},[54,66828,66829],{},"PathMap.SubstitutePath()"," sustituye variables del sistema por sus valores reales",[88,66832,66833,66834],{},"Las variables se escriben entre ",[54,66835,65683],{},[88,66837,66838],{},"Si la variable no existe, devuelve el string sin sustituir",[88,66840,66841,66842,66844],{},"Solo usa variables ",[16,66843,65949],{}," en scripts oficiales",[88,66846,66847],{},"Siempre valida el resultado antes de usarlo",[13,66849,66850],{},[16,66851,66852],{},"Cuándo usar PathMap:",[126,66854,66855,66858,66861,66864,66867],{},[88,66856,66857],{},"Obtener nombre del proyecto",[88,66859,66860],{},"Obtener ruta del proyecto",[88,66862,66863],{},"Verificar si hay proyecto abierto",[88,66865,66866],{},"Acceder a carpetas de EPLAN",[88,66868,66869],{},"Leer campos personalizados del proyecto",[13,66871,66872],{},[16,66873,66874],{},"PathMap es la alternativa gratuita a DataModel para información básica.",[43,66876],{},[46,66878,5728],{"id":5727},[13,66880,66881],{},[16,66882,66883],{},"P: ¿Por qué las variables llevan $() alrededor?",[13,66885,66886,66887,66890],{},"R: Es la sintaxis que EPLAN usa para identificar variables del sistema. Sin los ",[54,66888,66889],{},"$()",", sería solo un string normal.",[13,66892,66893],{},[16,66894,66895],{},"P: ¿Puedo usar PathMap sin que haya proyecto abierto?",[13,66897,66898],{},"R: Algunas variables (como las de carpetas de EPLAN) funcionan sin proyecto abierto. Las variables de proyecto requieren que haya uno abierto.",[13,66900,66901],{},[16,66902,66903],{},"P: ¿Puedo modificar valores con PathMap?",[13,66905,66906,66907,66910,66911,41],{},"R: No. PathMap es ",[16,66908,66909],{},"solo lectura",". Para modificar, usa comandos CLI como ",[54,66912,66913],{},"XEsSetProjectPropertyAction",[13,66915,66916],{},[16,66917,66918],{},"P: ¿Todas las variables PathMap son gratuitas?",[13,66920,66921,66922,66924],{},"R: Sí. PathMap pertenece a ",[54,66923,1248],{},", que es completamente gratuito.",[43,66926],{},[46,66928,51782],{"id":36078},[331,66930,51786],{"id":51785},[13,66932,66933],{},[16,66934,63507],{},[331,66936,51795],{"id":51794},[13,66938,66939],{},[16,66940,66941],{},"Capítulo 21: BaseException - Mensajes del sistema",[13,66943,66944],{},"En el próximo capítulo aprenderás a mostrar mensajes en la ventana \"Mensajes de sistema\" de EPLAN usando BaseException.",[43,66946],{},[13,66948,66949,10676,66951,66953,66954,93,66956,66959,93,66961],{},[31,66950,657],{},[31,66952,10679],{},": 25 minutos\n",[31,66955,10683],{},[54,66957,66958],{},"code\u002Fcap-20\u002F",[31,66960,51827],{},[54,66962,65704],{},[660,66964,662],{},{"title":228,"searchDepth":229,"depth":229,"links":66966},[66967,66968,66969,66970,66975,66979,66983,66988,66992,66997,67001,67006,67010,67011,67012],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":65477,"depth":229,"text":65478},{"id":65571,"depth":229,"text":65572,"children":66971},[66972,66973,66974],{"id":49680,"depth":670,"text":49681},{"id":58686,"depth":670,"text":58687},{"id":65618,"depth":670,"text":65619},{"id":65653,"depth":229,"text":65654,"children":66976},[66977,66978],{"id":65657,"depth":670,"text":65658},{"id":65698,"depth":670,"text":65699},{"id":65799,"depth":229,"text":65800,"children":66980},[66981,66982],{"id":65803,"depth":670,"text":65804},{"id":65859,"depth":670,"text":65860},{"id":65942,"depth":229,"text":65943,"children":66984},[66985,66986,66987],{"id":65953,"depth":670,"text":65954},{"id":66009,"depth":670,"text":66010},{"id":66094,"depth":670,"text":66095},{"id":66134,"depth":229,"text":66135,"children":66989},[66990,66991],{"id":66138,"depth":670,"text":66139},{"id":66235,"depth":670,"text":66236},{"id":66257,"depth":229,"text":66258,"children":66993},[66994,66995,66996],{"id":66261,"depth":670,"text":66262},{"id":66268,"depth":670,"text":66269},{"id":66422,"depth":670,"text":66423},{"id":66464,"depth":229,"text":66465,"children":66998},[66999,67000],{"id":66468,"depth":670,"text":66469},{"id":66553,"depth":670,"text":66554},{"id":63066,"depth":229,"text":63067,"children":67002},[67003,67004,67005],{"id":66581,"depth":670,"text":66582},{"id":66634,"depth":670,"text":66635},{"id":66681,"depth":670,"text":66682},{"id":66715,"depth":229,"text":66716,"children":67007},[67008,67009],{"id":66719,"depth":670,"text":66720},{"id":66755,"depth":670,"text":66756},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":67013},[67014,67015],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Usa PathMap para resolver rutas y variables del sistema en tus scripts EPLAN en C# y crea automatizaciones portables en EPLAN Electric P8.",{},"\u002Fguia\u002Fpathmap-mensajes\u002Fcap-20-pathmap-variables-sistema",{"title":65419,"description":67016},"guia\u002Fpathmap-mensajes\u002Fcap-20-pathmap-variables-sistema","pVshGBpwMHPXiIl4IC6sh1spq-ovYAjwdHf8nvR2cJ8",{"id":67023,"title":67024,"body":67025,"description":68703,"extension":236,"meta":68704,"navigation":238,"path":68705,"seo":68706,"stem":68707,"tagline":242,"__hash__":68708},"guia\u002Fguia\u002Fpathmap-mensajes\u002Fcap-21-baseexception-mensajes-sistema.md","Capítulo 21: BaseException y mensajes en EPLAN",{"type":7,"value":67026,"toc":68652},[67027,67038,67040,67042,67044,67064,67066,67068,67081,67083,67087,67093,67102,67108,67128,67133,67135,67139,67141,67150,67155,67180,67182,67190,67195,67199,67207,67221,67229,67243,67245,67249,67253,67279,67283,67311,67315,67347,67351,67366,67368,67372,67376,67379,67431,67435,67438,67458,67464,67466,67470,67472,67487,67492,67506,67510,67515,67611,67615,67622,67627,67629,67633,67637,67643,67649,67677,67681,67684,67693,67696,67698,67702,67706,67711,67795,67800,67804,67809,67873,67878,67882,67887,67951,67956,67958,67962,67966,67969,68129,68134,68146,68150,68153,68292,68297,68299,68303,68307,68321,68335,68339,68342,68361,68367,68369,68373,68377,68416,68420,68449,68453,68504,68506,68508,68513,68517,68543,68548,68560,68565,68576,68578,68580,68585,68588,68593,68596,68601,68604,68609,68612,68614,68616,68618,68622,68624,68629,68632,68634,68650],[10,67028,67029],{},[13,67030,67031,19,67033,19,67036,262],{},[16,67032,65428],{},[16,67034,67035],{},"Sección 8: Manejo de errores y mensajes",[16,67037,25],{},[43,67039],{},[46,67041,268],{"id":267},[13,67043,702],{},[126,67045,67046,67049,67052,67055,67058,67061],{},[88,67047,67048],{},"Entender qué es BaseException y para qué sirve",[88,67050,67051],{},"Comprender la diferencia entre MessageBox y BaseException",[88,67053,67054],{},"Conocer los niveles de mensajes (Message, Warning, Error)",[88,67056,67057],{},"Usar FixMessage() correctamente",[88,67059,67060],{},"Decidir cuándo usar cada tipo de mensaje",[88,67062,67063],{},"Ver los mensajes en la ventana \"Mensajes de sistema\" de EPLAN",[43,67065],{},[46,67067,320],{"id":319},[126,67069,67070,67073,67076],{},[88,67071,67072],{},"Conocer MessageBox.Show()",[88,67074,67075],{},"Entender el concepto de logging",[88,67077,67078,67079],{},"Saber usar el atributo ",[551,67080,1300],{},[43,67082],{},[46,67084,67086],{"id":67085},"introducción-dos-formas-de-comunicar","Introducción: Dos formas de comunicar",[13,67088,67089,67090,67092],{},"Hasta ahora has usado ",[16,67091,50981],{}," para mostrar información al usuario:",[543,67094,67096],{"className":545,"code":67095,"language":547,"meta":228,"style":228},"MessageBox.Show(\"Proyecto guardado correctamente\");\n",[54,67097,67098],{"__ignoreMap":228},[551,67099,67100],{"class":553,"line":554},[551,67101,67095],{},[13,67103,67104,67105,416],{},"Esto funciona, pero tiene ",[16,67106,67107],{},"limitaciones",[126,67109,67110,67116,67122],{},[88,67111,67112,67115],{},[16,67113,67114],{},"Bloquea EPLAN"," hasta que el usuario cierre el mensaje",[88,67117,67118,67121],{},[16,67119,67120],{},"Se pierde"," después de cerrar (no queda registro)",[88,67123,67124,67127],{},[16,67125,67126],{},"Interrumpe"," el flujo de trabajo del usuario",[13,67129,67130,67131,41],{},"Para mensajes informativos, warnings y errores que no requieren intervención inmediata, EPLAN ofrece ",[16,67132,50675],{},[43,67134],{},[46,67136,67138],{"id":67137},"_1-qué-es-baseexception","1. ¿Qué es BaseException?",[331,67140,49681],{"id":49680},[13,67142,67143,67145,67146,67149],{},[16,67144,50675],{}," es una clase que permite enviar mensajes a la ventana ",[16,67147,67148],{},"\"Mensajes de sistema\""," de EPLAN.",[13,67151,67152],{},[16,67153,67154],{},"Características principales:",[126,67156,67157,67162,67168,67174],{},[88,67158,67159,67161],{},[16,67160,50828],{}," la interfaz de usuario",[88,67163,67164,67167],{},[16,67165,67166],{},"Queda registrado"," en el historial de mensajes",[88,67169,67170,67173],{},[16,67171,67172],{},"Se puede revisar después"," en cualquier momento",[88,67175,67176,67179],{},[16,67177,67178],{},"Categorizado por nivel"," (Message, Warning, Error, etc.)",[331,67181,58687],{"id":58686},[543,67183,67184],{"className":545,"code":1128,"language":547,"meta":228,"style":228},[54,67185,67186],{"__ignoreMap":228},[551,67187,67188],{"class":553,"line":554},[551,67189,1128],{},[13,67191,67192,67193,41],{},"BaseException está en el namespace ",[54,67194,1248],{},[331,67196,67198],{"id":67197},"_13-analogía-messagebox-vs-baseexception","1.3 Analogía: MessageBox vs BaseException",[13,67200,67201,67203,67204,416],{},[16,67202,50981],{}," es como una ",[16,67205,67206],{},"alarma sonora",[126,67208,67209,67212,67215,67218],{},[88,67210,67211],{},"Inmediata y obvia",[88,67213,67214],{},"Interrumpe todo",[88,67216,67217],{},"Requiere atención inmediata",[88,67219,67220],{},"No queda registro después de apagarla",[13,67222,67223,67225,67226,416],{},[16,67224,50675],{}," es como un ",[16,67227,67228],{},"log en un archivo",[126,67230,67231,67234,67237,67240],{},[88,67232,67233],{},"Discreta",[88,67235,67236],{},"No interrumpe",[88,67238,67239],{},"Se puede revisar cuando sea conveniente",[88,67241,67242],{},"Queda registro permanente",[43,67244],{},[46,67246,67248],{"id":67247},"_2-cuándo-usar-cada-uno","2. ¿Cuándo usar cada uno?",[331,67250,67252],{"id":67251},"_21-usar-messagebox-cuando","2.1 Usar MessageBox cuando:",[126,67254,67255,67261,67267,67273],{},[88,67256,67257,67260],{},[16,67258,67259],{},"Requieres confirmación"," del usuario (¿Continuar? Sí\u002FNo)",[88,67262,67263,67266],{},[16,67264,67265],{},"Es crítico"," que el usuario vea el mensaje ahora mismo",[88,67268,67269,67272],{},[16,67270,67271],{},"Necesitas respuesta"," del usuario para continuar",[88,67274,67275,67278],{},[16,67276,67277],{},"Es información muy importante"," que no puede pasarse por alto",[13,67280,67281],{},[16,67282,50721],{},[543,67284,67286],{"className":545,"code":67285,"language":547,"meta":228,"style":228},"if (MessageBox.Show(\"¿Desea sobrescribir el archivo?\", \"Confirmación\",\n    MessageBoxButtons.YesNo) == DialogResult.Yes)\n{\n    \u002F\u002F Sobrescribir\n}\n",[54,67287,67288,67293,67298,67302,67307],{"__ignoreMap":228},[551,67289,67290],{"class":553,"line":554},[551,67291,67292],{},"if (MessageBox.Show(\"¿Desea sobrescribir el archivo?\", \"Confirmación\",\n",[551,67294,67295],{"class":553,"line":229},[551,67296,67297],{},"    MessageBoxButtons.YesNo) == DialogResult.Yes)\n",[551,67299,67300],{"class":553,"line":670},[551,67301,1151],{},[551,67303,67304],{"class":553,"line":1136},[551,67305,67306],{},"    \u002F\u002F Sobrescribir\n",[551,67308,67309],{"class":553,"line":1142},[551,67310,1193],{},[331,67312,67314],{"id":67313},"_22-usar-baseexception-cuando","2.2 Usar BaseException cuando:",[126,67316,67317,67323,67329,67335,67341],{},[88,67318,67319,67322],{},[16,67320,67321],{},"Es información de progreso"," (\"Procesando página 5 de 10...\")",[88,67324,67325,67328],{},[16,67326,67327],{},"Es un warning"," que no requiere acción inmediata",[88,67330,67331,67334],{},[16,67332,67333],{},"Quieres logging"," para debugging o auditoría",[88,67336,67337,67340],{},[16,67338,67339],{},"No quieres interrumpir"," el flujo de trabajo",[88,67342,67343,67346],{},[16,67344,67345],{},"El script procesa muchos elementos"," (sería molesto mostrar 100 MessageBox)",[13,67348,67349],{},[16,67350,50721],{},[543,67352,67354],{"className":545,"code":67353,"language":547,"meta":228,"style":228},"new BaseException(\"Procesando página 5 de 10...\", MessageLevel.Message).FixMessage();\n\u002F\u002F El usuario puede seguir trabajando mientras se procesa\n",[54,67355,67356,67361],{"__ignoreMap":228},[551,67357,67358],{"class":553,"line":554},[551,67359,67360],{},"new BaseException(\"Procesando página 5 de 10...\", MessageLevel.Message).FixMessage();\n",[551,67362,67363],{"class":553,"line":229},[551,67364,67365],{},"\u002F\u002F El usuario puede seguir trabajando mientras se procesa\n",[43,67367],{},[46,67369,67371],{"id":67370},"_3-niveles-de-mensajes","3. Niveles de mensajes",[331,67373,67375],{"id":67374},"_31-los-tres-niveles-principales","3.1 Los tres niveles principales",[13,67377,67378],{},"BaseException tiene diferentes niveles de severidad:",[6589,67380,67381,67392],{},[6592,67382,67383],{},[6595,67384,67385,67387,67389],{},[6598,67386,25],{},[6598,67388,65966],{},[6598,67390,67391],{},"Cuándo usar",[6611,67393,67394,67407,67420],{},[6595,67395,67396,67401,67404],{},[6616,67397,67398],{},[16,67399,67400],{},"Message",[6616,67402,67403],{},"Información general",[6616,67405,67406],{},"Progreso, confirmaciones, datos informativos",[6595,67408,67409,67414,67417],{},[6616,67410,67411],{},[16,67412,67413],{},"Warning",[6616,67415,67416],{},"Advertencia",[6616,67418,67419],{},"Algo inusual pero no crítico, precauciones",[6595,67421,67422,67426,67428],{},[6616,67423,67424],{},[16,67425,453],{},[6616,67427,453],{},[6616,67429,67430],{},"Algo salió mal, operación fallida",[331,67432,67434],{"id":67433},"_32-niveles-adicionales-menos-comunes","3.2 Niveles adicionales (menos comunes)",[13,67436,67437],{},"El script oficial también muestra:",[126,67439,67440,67446,67452],{},[88,67441,67442,67445],{},[16,67443,67444],{},"Assert"," - Validaciones internas",[88,67447,67448,67451],{},[16,67449,67450],{},"Trace"," - Debugging detallado",[88,67453,67454,67457],{},[16,67455,67456],{},"FatalError"," - Error crítico que requiere cerrar EPLAN",[13,67459,67460,67463],{},[16,67461,67462],{},"En la práctica, usa principalmente:"," Message, Warning y Error.",[43,67465],{},[46,67467,67469],{"id":67468},"_4-cómo-usar-baseexception","4. Cómo usar BaseException",[331,67471,24174],{"id":24173},[543,67473,67475],{"className":545,"code":67474,"language":547,"meta":228,"style":228},"BaseException mensaje = new BaseException(\"Texto del mensaje\", MessageLevel.Nivel);\nmensaje.FixMessage();\n",[54,67476,67477,67482],{"__ignoreMap":228},[551,67478,67479],{"class":553,"line":554},[551,67480,67481],{},"BaseException mensaje = new BaseException(\"Texto del mensaje\", MessageLevel.Nivel);\n",[551,67483,67484],{"class":553,"line":229},[551,67485,67486],{},"mensaje.FixMessage();\n",[13,67488,67489],{},[16,67490,67491],{},"Dos pasos:",[85,67493,67494,67500],{},[88,67495,67496,67499],{},[16,67497,67498],{},"Crear"," el objeto BaseException con el texto y nivel",[88,67501,67502,67505],{},[16,67503,67504],{},"Enviar"," el mensaje con FixMessage()",[331,67507,67509],{"id":67508},"_42-ejemplo-básico-del-script-oficial","4.2 Ejemplo básico del script oficial",[13,67511,62193,67512,416],{},[54,67513,67514],{},"EPLAN-Scripting-4.0\u002F03_Classes\u002F08_BaseException.cs",[543,67516,67518],{"className":545,"code":67517,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class MensajesSistema\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Mensaje informativo\n        BaseException mensaje = new BaseException(\"Operación completada\", MessageLevel.Message);\n        mensaje.FixMessage();\n\n        \u002F\u002F Advertencia\n        BaseException advertencia = new BaseException(\"Archivo no encontrado\", MessageLevel.Warning);\n        advertencia.FixMessage();\n\n        \u002F\u002F Error\n        BaseException error = new BaseException(\"Falló la exportación\", MessageLevel.Error);\n        error.FixMessage();\n    }\n}\n",[54,67519,67520,67524,67528,67532,67537,67541,67545,67549,67553,67557,67562,67567,67571,67575,67580,67585,67589,67593,67598,67603,67607],{"__ignoreMap":228},[551,67521,67522],{"class":553,"line":554},[551,67523,1128],{},[551,67525,67526],{"class":553,"line":229},[551,67527,49898],{},[551,67529,67530],{"class":553,"line":670},[551,67531,1139],{"emptyLinePlaceholder":238},[551,67533,67534],{"class":553,"line":1136},[551,67535,67536],{},"public class MensajesSistema\n",[551,67538,67539],{"class":553,"line":1142},[551,67540,1151],{},[551,67542,67543],{"class":553,"line":1148},[551,67544,1157],{},[551,67546,67547],{"class":553,"line":1154},[551,67548,57216],{},[551,67550,67551],{"class":553,"line":1160},[551,67552,1169],{},[551,67554,67555],{"class":553,"line":1166},[551,67556,50885],{},[551,67558,67559],{"class":553,"line":1172},[551,67560,67561],{},"        BaseException mensaje = new BaseException(\"Operación completada\", MessageLevel.Message);\n",[551,67563,67564],{"class":553,"line":1178},[551,67565,67566],{},"        mensaje.FixMessage();\n",[551,67568,67569],{"class":553,"line":1184},[551,67570,1139],{"emptyLinePlaceholder":238},[551,67572,67573],{"class":553,"line":1190},[551,67574,50904],{},[551,67576,67577],{"class":553,"line":1472},[551,67578,67579],{},"        BaseException advertencia = new BaseException(\"Archivo no encontrado\", MessageLevel.Warning);\n",[551,67581,67582],{"class":553,"line":1477},[551,67583,67584],{},"        advertencia.FixMessage();\n",[551,67586,67587],{"class":553,"line":1797},[551,67588,1139],{"emptyLinePlaceholder":238},[551,67590,67591],{"class":553,"line":1802},[551,67592,50923],{},[551,67594,67595],{"class":553,"line":1808},[551,67596,67597],{},"        BaseException error = new BaseException(\"Falló la exportación\", MessageLevel.Error);\n",[551,67599,67600],{"class":553,"line":1814},[551,67601,67602],{},"        error.FixMessage();\n",[551,67604,67605],{"class":553,"line":1820},[551,67606,1187],{},[551,67608,67609],{"class":553,"line":1826},[551,67610,1193],{},[331,67612,67614],{"id":67613},"_43-dónde-aparecen-los-mensajes","4.3 ¿Dónde aparecen los mensajes?",[13,67616,67617,67618,67621],{},"Los mensajes aparecen en: ",[16,67619,67620],{},"Ver > Mensajes de sistema"," (o presionar F8).",[13,67623,67624,67626],{},[16,67625,50964],{}," Si no ves la ventana \"Mensajes de sistema\", ábrela desde el menú Ver en EPLAN.",[43,67628],{},[46,67630,67632],{"id":67631},"_5-el-método-fixmessage","5. El método FixMessage()",[331,67634,67636],{"id":67635},"_51-qué-hace-fixmessage","5.1 ¿Qué hace FixMessage()?",[13,67638,67639,67642],{},[16,67640,67641],{},"FixMessage()"," envía el mensaje a la ventana \"Mensajes de sistema\" de EPLAN.",[13,67644,67645,67646,41],{},"Sin llamar a FixMessage(), el mensaje existe pero ",[16,67647,67648],{},"no se muestra",[543,67650,67652],{"className":545,"code":67651,"language":547,"meta":228,"style":228},"\u002F\u002F Solo crea el objeto, NO lo envía\nBaseException mensaje = new BaseException(\"Hola\", MessageLevel.Message);\n\n\u002F\u002F AHORA sí lo envía a la ventana de mensajes\nmensaje.FixMessage();\n",[54,67653,67654,67659,67664,67668,67673],{"__ignoreMap":228},[551,67655,67656],{"class":553,"line":554},[551,67657,67658],{},"\u002F\u002F Solo crea el objeto, NO lo envía\n",[551,67660,67661],{"class":553,"line":229},[551,67662,67663],{},"BaseException mensaje = new BaseException(\"Hola\", MessageLevel.Message);\n",[551,67665,67666],{"class":553,"line":670},[551,67667,1139],{"emptyLinePlaceholder":238},[551,67669,67670],{"class":553,"line":1136},[551,67671,67672],{},"\u002F\u002F AHORA sí lo envía a la ventana de mensajes\n",[551,67674,67675],{"class":553,"line":1142},[551,67676,67486],{},[331,67678,67680],{"id":67679},"_52-forma-abreviada-en-una-línea","5.2 Forma abreviada (en una línea)",[13,67682,67683],{},"En lugar de dos líneas, puedes hacerlo en una:",[543,67685,67687],{"className":545,"code":67686,"language":547,"meta":228,"style":228},"new BaseException(\"Mensaje\", MessageLevel.Message).FixMessage();\n",[54,67688,67689],{"__ignoreMap":228},[551,67690,67691],{"class":553,"line":554},[551,67692,67686],{},[13,67694,67695],{},"Esto es común en código de producción.",[43,67697],{},[46,67699,67701],{"id":67700},"_6-ejemplos-pedagógicos-por-nivel","6. Ejemplos pedagógicos por nivel",[331,67703,67705],{"id":67704},"_61-messagelevelmessage-información","6.1 MessageLevel.Message (Información)",[13,67707,67708,67710],{},[16,67709,60943],{}," Informar progreso, confirmaciones, datos generales.",[543,67712,67714],{"className":545,"code":67713,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class MensajeInformativo\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Informar inicio de proceso\n        new BaseException(\"Iniciando exportación de proyecto...\", MessageLevel.Message).FixMessage();\n\n        \u002F\u002F Simular procesamiento\n        System.Threading.Thread.Sleep(1000);\n\n        \u002F\u002F Informar finalización\n        new BaseException(\"Exportación completada correctamente\", MessageLevel.Message).FixMessage();\n    }\n}\n",[54,67715,67716,67720,67724,67728,67733,67737,67741,67745,67749,67754,67759,67763,67768,67773,67777,67782,67787,67791],{"__ignoreMap":228},[551,67717,67718],{"class":553,"line":554},[551,67719,1128],{},[551,67721,67722],{"class":553,"line":229},[551,67723,49898],{},[551,67725,67726],{"class":553,"line":670},[551,67727,1139],{"emptyLinePlaceholder":238},[551,67729,67730],{"class":553,"line":1136},[551,67731,67732],{},"public class MensajeInformativo\n",[551,67734,67735],{"class":553,"line":1142},[551,67736,1151],{},[551,67738,67739],{"class":553,"line":1148},[551,67740,1157],{},[551,67742,67743],{"class":553,"line":1154},[551,67744,57216],{},[551,67746,67747],{"class":553,"line":1160},[551,67748,1169],{},[551,67750,67751],{"class":553,"line":1166},[551,67752,67753],{},"        \u002F\u002F Informar inicio de proceso\n",[551,67755,67756],{"class":553,"line":1172},[551,67757,67758],{},"        new BaseException(\"Iniciando exportación de proyecto...\", MessageLevel.Message).FixMessage();\n",[551,67760,67761],{"class":553,"line":1178},[551,67762,1139],{"emptyLinePlaceholder":238},[551,67764,67765],{"class":553,"line":1184},[551,67766,67767],{},"        \u002F\u002F Simular procesamiento\n",[551,67769,67770],{"class":553,"line":1190},[551,67771,67772],{},"        System.Threading.Thread.Sleep(1000);\n",[551,67774,67775],{"class":553,"line":1472},[551,67776,1139],{"emptyLinePlaceholder":238},[551,67778,67779],{"class":553,"line":1477},[551,67780,67781],{},"        \u002F\u002F Informar finalización\n",[551,67783,67784],{"class":553,"line":1797},[551,67785,67786],{},"        new BaseException(\"Exportación completada correctamente\", MessageLevel.Message).FixMessage();\n",[551,67788,67789],{"class":553,"line":1802},[551,67790,1187],{},[551,67792,67793],{"class":553,"line":1808},[551,67794,1193],{},[13,67796,67797,67799],{},[16,67798,50790],{}," Proceso normal, todo va bien.",[331,67801,67803],{"id":67802},"_62-messagelevelwarning-advertencia","6.2 MessageLevel.Warning (Advertencia)",[13,67805,67806,67808],{},[16,67807,60943],{}," Algo inusual pero no crítico, el proceso puede continuar.",[543,67810,67812],{"className":545,"code":67811,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class MensajeAdvertencia\n{\n    [Start]\n    public void Function()\n    {\n        new BaseException(\n            \"Advertencia: Algunos artículos no tienen precio definido\",\n            MessageLevel.Warning\n        ).FixMessage();\n    }\n}\n",[54,67813,67814,67818,67822,67826,67831,67835,67839,67843,67847,67851,67856,67861,67865,67869],{"__ignoreMap":228},[551,67815,67816],{"class":553,"line":554},[551,67817,1128],{},[551,67819,67820],{"class":553,"line":229},[551,67821,49898],{},[551,67823,67824],{"class":553,"line":670},[551,67825,1139],{"emptyLinePlaceholder":238},[551,67827,67828],{"class":553,"line":1136},[551,67829,67830],{},"public class MensajeAdvertencia\n",[551,67832,67833],{"class":553,"line":1142},[551,67834,1151],{},[551,67836,67837],{"class":553,"line":1148},[551,67838,1157],{},[551,67840,67841],{"class":553,"line":1154},[551,67842,57216],{},[551,67844,67845],{"class":553,"line":1160},[551,67846,1169],{},[551,67848,67849],{"class":553,"line":1166},[551,67850,51279],{},[551,67852,67853],{"class":553,"line":1172},[551,67854,67855],{},"            \"Advertencia: Algunos artículos no tienen precio definido\",\n",[551,67857,67858],{"class":553,"line":1178},[551,67859,67860],{},"            MessageLevel.Warning\n",[551,67862,67863],{"class":553,"line":1184},[551,67864,51294],{},[551,67866,67867],{"class":553,"line":1190},[551,67868,1187],{},[551,67870,67871],{"class":553,"line":1472},[551,67872,1193],{},[13,67874,67875,67877],{},[16,67876,50790],{}," El script continúa pero el usuario debe revisar algo después.",[331,67879,67881],{"id":67880},"_63-messagelevelerror-error","6.3 MessageLevel.Error (Error)",[13,67883,67884,67886],{},[16,67885,60943],{}," Algo salió mal, operación fallida.",[543,67888,67890],{"className":545,"code":67889,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class MensajeError\n{\n    [Start]\n    public void Function()\n    {\n        new BaseException(\n            \"Error: No se pudo conectar a la base de datos\",\n            MessageLevel.Error\n        ).FixMessage();\n    }\n}\n",[54,67891,67892,67896,67900,67904,67909,67913,67917,67921,67925,67929,67934,67939,67943,67947],{"__ignoreMap":228},[551,67893,67894],{"class":553,"line":554},[551,67895,1128],{},[551,67897,67898],{"class":553,"line":229},[551,67899,49898],{},[551,67901,67902],{"class":553,"line":670},[551,67903,1139],{"emptyLinePlaceholder":238},[551,67905,67906],{"class":553,"line":1136},[551,67907,67908],{},"public class MensajeError\n",[551,67910,67911],{"class":553,"line":1142},[551,67912,1151],{},[551,67914,67915],{"class":553,"line":1148},[551,67916,1157],{},[551,67918,67919],{"class":553,"line":1154},[551,67920,57216],{},[551,67922,67923],{"class":553,"line":1160},[551,67924,1169],{},[551,67926,67927],{"class":553,"line":1166},[551,67928,51279],{},[551,67930,67931],{"class":553,"line":1172},[551,67932,67933],{},"            \"Error: No se pudo conectar a la base de datos\",\n",[551,67935,67936],{"class":553,"line":1178},[551,67937,67938],{},"            MessageLevel.Error\n",[551,67940,67941],{"class":553,"line":1184},[551,67942,51294],{},[551,67944,67945],{"class":553,"line":1190},[551,67946,1187],{},[551,67948,67949],{"class":553,"line":1472},[551,67950,1193],{},[13,67952,67953,67955],{},[16,67954,50790],{}," Falló algo importante, el usuario debe saber que hubo un problema.",[43,67957],{},[46,67959,67961],{"id":67960},"_7-combinando-messagebox-y-baseexception","7. Combinando MessageBox y BaseException",[331,67963,67965],{"id":67964},"_71-patrón-común-error-crítico","7.1 Patrón común: Error crítico",[13,67967,67968],{},"Para errores críticos que requieren atención inmediata:",[543,67970,67972],{"className":545,"code":67971,"language":547,"meta":228,"style":228},"using System;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class ErrorCritico\n{\n    [Start]\n    public void Function()\n    {\n        try\n        {\n            \u002F\u002F Intentar operación\n            \u002F\u002F ...operación que puede fallar...\n\n            \u002F\u002F Si falla, registrar en mensajes de sistema\n            new BaseException(\"Error al procesar archivo\", MessageLevel.Error).FixMessage();\n\n            \u002F\u002F Y TAMBIÉN mostrar al usuario inmediatamente\n            MessageBox.Show(\n                \"Error al procesar archivo.\\nRevisa 'Mensajes de sistema' para más detalles.\",\n                \"Error\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Error\n            );\n        }\n        catch (Exception ex)\n        {\n            \u002F\u002F Logging detallado\n            new BaseException(\"Error: \" + ex.Message, MessageLevel.Error).FixMessage();\n\n            \u002F\u002F Notificación al usuario\n            MessageBox.Show(\"Ocurrió un error. Ver 'Mensajes de sistema'.\", \"Error\");\n        }\n    }\n}\n",[54,67973,67974,67978,67982,67986,67990,67994,67999,68003,68007,68011,68015,68019,68023,68028,68033,68037,68042,68047,68051,68056,68060,68065,68069,68073,68077,68081,68085,68089,68093,68098,68103,68107,68112,68117,68121,68125],{"__ignoreMap":228},[551,67975,67976],{"class":553,"line":554},[551,67977,1123],{},[551,67979,67980],{"class":553,"line":229},[551,67981,50105],{},[551,67983,67984],{"class":553,"line":670},[551,67985,1128],{},[551,67987,67988],{"class":553,"line":1136},[551,67989,49898],{},[551,67991,67992],{"class":553,"line":1142},[551,67993,1139],{"emptyLinePlaceholder":238},[551,67995,67996],{"class":553,"line":1148},[551,67997,67998],{},"public class ErrorCritico\n",[551,68000,68001],{"class":553,"line":1154},[551,68002,1151],{},[551,68004,68005],{"class":553,"line":1160},[551,68006,1157],{},[551,68008,68009],{"class":553,"line":1166},[551,68010,57216],{},[551,68012,68013],{"class":553,"line":1172},[551,68014,1169],{},[551,68016,68017],{"class":553,"line":1178},[551,68018,41211],{},[551,68020,68021],{"class":553,"line":1184},[551,68022,9062],{},[551,68024,68025],{"class":553,"line":1190},[551,68026,68027],{},"            \u002F\u002F Intentar operación\n",[551,68029,68030],{"class":553,"line":1472},[551,68031,68032],{},"            \u002F\u002F ...operación que puede fallar...\n",[551,68034,68035],{"class":553,"line":1477},[551,68036,1139],{"emptyLinePlaceholder":238},[551,68038,68039],{"class":553,"line":1797},[551,68040,68041],{},"            \u002F\u002F Si falla, registrar en mensajes de sistema\n",[551,68043,68044],{"class":553,"line":1802},[551,68045,68046],{},"            new BaseException(\"Error al procesar archivo\", MessageLevel.Error).FixMessage();\n",[551,68048,68049],{"class":553,"line":1808},[551,68050,1139],{"emptyLinePlaceholder":238},[551,68052,68053],{"class":553,"line":1814},[551,68054,68055],{},"            \u002F\u002F Y TAMBIÉN mostrar al usuario inmediatamente\n",[551,68057,68058],{"class":553,"line":1820},[551,68059,53598],{},[551,68061,68062],{"class":553,"line":1826},[551,68063,68064],{},"                \"Error al procesar archivo.\\nRevisa 'Mensajes de sistema' para más detalles.\",\n",[551,68066,68067],{"class":553,"line":1832},[551,68068,53649],{},[551,68070,68071],{"class":553,"line":1838},[551,68072,53613],{},[551,68074,68075],{"class":553,"line":1844},[551,68076,53658],{},[551,68078,68079],{"class":553,"line":1850},[551,68080,53623],{},[551,68082,68083],{"class":553,"line":1855},[551,68084,9077],{},[551,68086,68087],{"class":553,"line":1861},[551,68088,41473],{},[551,68090,68091],{"class":553,"line":1867},[551,68092,9062],{},[551,68094,68095],{"class":553,"line":1873},[551,68096,68097],{},"            \u002F\u002F Logging detallado\n",[551,68099,68100],{"class":553,"line":1878},[551,68101,68102],{},"            new BaseException(\"Error: \" + ex.Message, MessageLevel.Error).FixMessage();\n",[551,68104,68105],{"class":553,"line":1883},[551,68106,1139],{"emptyLinePlaceholder":238},[551,68108,68109],{"class":553,"line":1888},[551,68110,68111],{},"            \u002F\u002F Notificación al usuario\n",[551,68113,68114],{"class":553,"line":4615},[551,68115,68116],{},"            MessageBox.Show(\"Ocurrió un error. Ver 'Mensajes de sistema'.\", \"Error\");\n",[551,68118,68119],{"class":553,"line":4620},[551,68120,9077],{},[551,68122,68123],{"class":553,"line":4626},[551,68124,1187],{},[551,68126,68127],{"class":553,"line":4631},[551,68128,1193],{},[13,68130,68131],{},[16,68132,68133],{},"Patrón:",[85,68135,68136,68141],{},[88,68137,68138,68140],{},[16,68139,50675],{},": Logging detallado con toda la información",[88,68142,68143,68145],{},[16,68144,50981],{},": Notificación breve para que el usuario sepa que debe revisar",[331,68147,68149],{"id":68148},"_72-patrón-común-progreso-de-lote","7.2 Patrón común: Progreso de lote",[13,68151,68152],{},"Para procesar múltiples elementos:",[543,68154,68156],{"className":545,"code":68155,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ProcesarLote\n{\n    [Start]\n    public void Function()\n    {\n        string[] archivos = { \"archivo1.xml\", \"archivo2.xml\", \"archivo3.xml\" };\n\n        \u002F\u002F Mensaje inicial (MessageBox)\n        MessageBox.Show(\"Procesando \" + archivos.Length + \" archivos...\");\n\n        \u002F\u002F Procesar cada archivo (BaseException para progreso)\n        for (int i = 0; i \u003C archivos.Length; i++)\n        {\n            new BaseException(\n                \"Procesando archivo \" + (i + 1) + \" de \" + archivos.Length + \": \" + archivos[i],\n                MessageLevel.Message\n            ).FixMessage();\n\n            \u002F\u002F Simular procesamiento\n            System.Threading.Thread.Sleep(500);\n        }\n\n        \u002F\u002F Mensaje final (MessageBox)\n        MessageBox.Show(\"Todos los archivos procesados. Revisa 'Mensajes de sistema' para detalles.\");\n    }\n}\n",[54,68157,68158,68162,68166,68170,68174,68179,68183,68187,68191,68195,68200,68204,68209,68214,68218,68223,68228,68232,68237,68242,68247,68252,68256,68261,68266,68270,68274,68279,68284,68288],{"__ignoreMap":228},[551,68159,68160],{"class":553,"line":554},[551,68161,1128],{},[551,68163,68164],{"class":553,"line":229},[551,68165,49898],{},[551,68167,68168],{"class":553,"line":670},[551,68169,50105],{},[551,68171,68172],{"class":553,"line":1136},[551,68173,1139],{"emptyLinePlaceholder":238},[551,68175,68176],{"class":553,"line":1142},[551,68177,68178],{},"public class ProcesarLote\n",[551,68180,68181],{"class":553,"line":1148},[551,68182,1151],{},[551,68184,68185],{"class":553,"line":1154},[551,68186,1157],{},[551,68188,68189],{"class":553,"line":1160},[551,68190,57216],{},[551,68192,68193],{"class":553,"line":1166},[551,68194,1169],{},[551,68196,68197],{"class":553,"line":1172},[551,68198,68199],{},"        string[] archivos = { \"archivo1.xml\", \"archivo2.xml\", \"archivo3.xml\" };\n",[551,68201,68202],{"class":553,"line":1178},[551,68203,1139],{"emptyLinePlaceholder":238},[551,68205,68206],{"class":553,"line":1184},[551,68207,68208],{},"        \u002F\u002F Mensaje inicial (MessageBox)\n",[551,68210,68211],{"class":553,"line":1190},[551,68212,68213],{},"        MessageBox.Show(\"Procesando \" + archivos.Length + \" archivos...\");\n",[551,68215,68216],{"class":553,"line":1472},[551,68217,1139],{"emptyLinePlaceholder":238},[551,68219,68220],{"class":553,"line":1477},[551,68221,68222],{},"        \u002F\u002F Procesar cada archivo (BaseException para progreso)\n",[551,68224,68225],{"class":553,"line":1797},[551,68226,68227],{},"        for (int i = 0; i \u003C archivos.Length; i++)\n",[551,68229,68230],{"class":553,"line":1802},[551,68231,9062],{},[551,68233,68234],{"class":553,"line":1808},[551,68235,68236],{},"            new BaseException(\n",[551,68238,68239],{"class":553,"line":1814},[551,68240,68241],{},"                \"Procesando archivo \" + (i + 1) + \" de \" + archivos.Length + \": \" + archivos[i],\n",[551,68243,68244],{"class":553,"line":1820},[551,68245,68246],{},"                MessageLevel.Message\n",[551,68248,68249],{"class":553,"line":1826},[551,68250,68251],{},"            ).FixMessage();\n",[551,68253,68254],{"class":553,"line":1832},[551,68255,1139],{"emptyLinePlaceholder":238},[551,68257,68258],{"class":553,"line":1838},[551,68259,68260],{},"            \u002F\u002F Simular procesamiento\n",[551,68262,68263],{"class":553,"line":1844},[551,68264,68265],{},"            System.Threading.Thread.Sleep(500);\n",[551,68267,68268],{"class":553,"line":1850},[551,68269,9077],{},[551,68271,68272],{"class":553,"line":1855},[551,68273,1139],{"emptyLinePlaceholder":238},[551,68275,68276],{"class":553,"line":1861},[551,68277,68278],{},"        \u002F\u002F Mensaje final (MessageBox)\n",[551,68280,68281],{"class":553,"line":1867},[551,68282,68283],{},"        MessageBox.Show(\"Todos los archivos procesados. Revisa 'Mensajes de sistema' para detalles.\");\n",[551,68285,68286],{"class":553,"line":1873},[551,68287,1187],{},[551,68289,68290],{"class":553,"line":1878},[551,68291,1193],{},[13,68293,68294,68296],{},[16,68295,56969],{}," El usuario no tiene que cerrar 3 MessageBox, puede seguir trabajando mientras se procesan los archivos.",[43,68298],{},[46,68300,68302],{"id":68301},"_8-ver-los-mensajes-en-eplan","8. Ver los mensajes en EPLAN",[331,68304,68306],{"id":68305},"_81-abrir-la-ventana-mensajes-de-sistema","8.1 Abrir la ventana \"Mensajes de sistema\"",[13,68308,68309,68312,68313,68316,68317,68320],{},[16,68310,68311],{},"Opción 1:"," Menú → Ver → Mensajes de sistema\n",[16,68314,68315],{},"Opción 2:"," Presionar F8\n",[16,68318,68319],{},"Opción 3:"," Ejecutar comando en script:",[543,68322,68324],{"className":545,"code":68323,"language":547,"meta":228,"style":228},"CommandLineInterpreter cli = new CommandLineInterpreter();\ncli.Execute(\"SystemErrDialog\");\n",[54,68325,68326,68330],{"__ignoreMap":228},[551,68327,68328],{"class":553,"line":554},[551,68329,52496],{},[551,68331,68332],{"class":553,"line":229},[551,68333,68334],{},"cli.Execute(\"SystemErrDialog\");\n",[331,68336,68338],{"id":68337},"_82-interpretar-los-mensajes","8.2 Interpretar los mensajes",[13,68340,68341],{},"En la ventana verás columnas:",[126,68343,68344,68349,68355],{},[88,68345,68346,68348],{},[16,68347,25],{}," (icono): Message (i), Warning (⚠), Error (✗)",[88,68350,68351,68354],{},[16,68352,68353],{},"Hora",": Cuándo se generó el mensaje",[88,68356,68357,68360],{},[16,68358,68359],{},"Texto",": El contenido del mensaje",[13,68362,68363,68366],{},[16,68364,68365],{},"Los mensajes se acumulan"," durante la sesión de EPLAN.",[43,68368],{},[46,68370,68372],{"id":68371},"_9-buenas-prácticas","9. Buenas prácticas",[331,68374,68376],{"id":68375},"_91-usar-el-nivel-apropiado","9.1 Usar el nivel apropiado",[543,68378,68380],{"className":545,"code":68379,"language":547,"meta":228,"style":228},"\u002F\u002F Bien - Nivel apropiado para cada situación\nnew BaseException(\"Iniciando proceso\", MessageLevel.Message).FixMessage();\nnew BaseException(\"Campo vacío, usando valor por defecto\", MessageLevel.Warning).FixMessage();\nnew BaseException(\"Archivo no encontrado\", MessageLevel.Error).FixMessage();\n\n\u002F\u002F Mal - Todo como Error\nnew BaseException(\"Iniciando proceso\", MessageLevel.Error).FixMessage();  \u002F\u002F ❌\n",[54,68381,68382,68387,68392,68397,68402,68406,68411],{"__ignoreMap":228},[551,68383,68384],{"class":553,"line":554},[551,68385,68386],{},"\u002F\u002F Bien - Nivel apropiado para cada situación\n",[551,68388,68389],{"class":553,"line":229},[551,68390,68391],{},"new BaseException(\"Iniciando proceso\", MessageLevel.Message).FixMessage();\n",[551,68393,68394],{"class":553,"line":670},[551,68395,68396],{},"new BaseException(\"Campo vacío, usando valor por defecto\", MessageLevel.Warning).FixMessage();\n",[551,68398,68399],{"class":553,"line":1136},[551,68400,68401],{},"new BaseException(\"Archivo no encontrado\", MessageLevel.Error).FixMessage();\n",[551,68403,68404],{"class":553,"line":1142},[551,68405,1139],{"emptyLinePlaceholder":238},[551,68407,68408],{"class":553,"line":1148},[551,68409,68410],{},"\u002F\u002F Mal - Todo como Error\n",[551,68412,68413],{"class":553,"line":1154},[551,68414,68415],{},"new BaseException(\"Iniciando proceso\", MessageLevel.Error).FixMessage();  \u002F\u002F ❌\n",[331,68417,68419],{"id":68418},"_92-mensajes-descriptivos","9.2 Mensajes descriptivos",[543,68421,68423],{"className":545,"code":68422,"language":547,"meta":228,"style":228},"\u002F\u002F Bien - Específico y útil\nnew BaseException(\"Error al exportar: Ruta 'C:\\\\temp' no existe\", MessageLevel.Error).FixMessage();\n\n\u002F\u002F Mal - Vago e inútil\nnew BaseException(\"Error\", MessageLevel.Error).FixMessage();\n",[54,68424,68425,68430,68435,68439,68444],{"__ignoreMap":228},[551,68426,68427],{"class":553,"line":554},[551,68428,68429],{},"\u002F\u002F Bien - Específico y útil\n",[551,68431,68432],{"class":553,"line":229},[551,68433,68434],{},"new BaseException(\"Error al exportar: Ruta 'C:\\\\temp' no existe\", MessageLevel.Error).FixMessage();\n",[551,68436,68437],{"class":553,"line":670},[551,68438,1139],{"emptyLinePlaceholder":238},[551,68440,68441],{"class":553,"line":1136},[551,68442,68443],{},"\u002F\u002F Mal - Vago e inútil\n",[551,68445,68446],{"class":553,"line":1142},[551,68447,68448],{},"new BaseException(\"Error\", MessageLevel.Error).FixMessage();\n",[331,68450,68452],{"id":68451},"_93-no-abusar-de-baseexception","9.3 No abusar de BaseException",[543,68454,68456],{"className":545,"code":68455,"language":547,"meta":228,"style":228},"\u002F\u002F Mal - Demasiado detallado para información trivial\nfor (int i = 0; i \u003C 1000; i++)\n{\n    new BaseException(\"Procesando elemento \" + i, MessageLevel.Message).FixMessage();\n}\n\n\u002F\u002F Bien - Solo mensajes importantes\nnew BaseException(\"Procesando 1000 elementos...\", MessageLevel.Message).FixMessage();\n\u002F\u002F ... procesamiento ...\nnew BaseException(\"Procesamiento completado\", MessageLevel.Message).FixMessage();\n",[54,68457,68458,68463,68467,68471,68476,68480,68484,68489,68494,68499],{"__ignoreMap":228},[551,68459,68460],{"class":553,"line":554},[551,68461,68462],{},"\u002F\u002F Mal - Demasiado detallado para información trivial\n",[551,68464,68465],{"class":553,"line":229},[551,68466,28511],{},[551,68468,68469],{"class":553,"line":670},[551,68470,1151],{},[551,68472,68473],{"class":553,"line":1136},[551,68474,68475],{},"    new BaseException(\"Procesando elemento \" + i, MessageLevel.Message).FixMessage();\n",[551,68477,68478],{"class":553,"line":1142},[551,68479,1193],{},[551,68481,68482],{"class":553,"line":1148},[551,68483,1139],{"emptyLinePlaceholder":238},[551,68485,68486],{"class":553,"line":1154},[551,68487,68488],{},"\u002F\u002F Bien - Solo mensajes importantes\n",[551,68490,68491],{"class":553,"line":1160},[551,68492,68493],{},"new BaseException(\"Procesando 1000 elementos...\", MessageLevel.Message).FixMessage();\n",[551,68495,68496],{"class":553,"line":1166},[551,68497,68498],{},"\u002F\u002F ... procesamiento ...\n",[551,68500,68501],{"class":553,"line":1172},[551,68502,68503],{},"new BaseException(\"Procesamiento completado\", MessageLevel.Message).FixMessage();\n",[43,68505],{},[46,68507,22685],{"id":22684},[13,68509,68510,68512],{},[16,68511,50675],{}," es tu herramienta de logging en EPLAN:",[13,68514,68515],{},[16,68516,66822],{},[126,68518,68519,68522,68534,68540],{},[88,68520,68521],{},"BaseException envía mensajes a \"Mensajes de sistema\" sin bloquear EPLAN",[88,68523,68524,68525,68527,68528,68530,68531,68533],{},"Tiene tres niveles principales: ",[16,68526,67400],{}," (info), ",[16,68529,67413],{}," (advertencia), ",[16,68532,453],{}," (error)",[88,68535,68536,68537,68539],{},"Requiere llamar a ",[16,68538,67641],{}," para enviar el mensaje",[88,68541,68542],{},"Los mensajes quedan registrados y se pueden revisar después",[13,68544,68545],{},[16,68546,68547],{},"Cuándo usar cada herramienta:",[126,68549,68550,68555],{},[88,68551,68552,68554],{},[16,68553,50981],{},": Requiere atención\u002Frespuesta inmediata del usuario",[88,68556,68557,68559],{},[16,68558,50675],{},": Logging, progreso, información que puede revisarse después",[13,68561,68562],{},[16,68563,68564],{},"Patrón común:",[126,68566,68567,68570,68573],{},[88,68568,68569],{},"BaseException para logging detallado",[88,68571,68572],{},"MessageBox para notificaciones críticas",[88,68574,68575],{},"Combinar ambos cuando sea necesario",[43,68577],{},[46,68579,5728],{"id":5727},[13,68581,68582],{},[16,68583,68584],{},"P: ¿BaseException lanza una excepción real de C#?",[13,68586,68587],{},"R: No, a pesar del nombre. Solo envía un mensaje. No interrumpe la ejecución del script.",[13,68589,68590],{},[16,68591,68592],{},"P: ¿Puedo usar BaseException sin FixMessage()?",[13,68594,68595],{},"R: No tiene sentido. Sin FixMessage() el mensaje no se envía a ninguna parte.",[13,68597,68598],{},[16,68599,68600],{},"P: ¿Los mensajes persisten después de cerrar EPLAN?",[13,68602,68603],{},"R: No. Se pierden al cerrar EPLAN. Para persistencia, escribe a un archivo de log.",[13,68605,68606],{},[16,68607,68608],{},"P: ¿Puedo personalizar el formato de los mensajes?",[13,68610,68611],{},"R: No directamente. EPLAN controla el formato en \"Mensajes de sistema\".",[43,68613],{},[46,68615,51782],{"id":36078},[331,68617,51786],{"id":51785},[13,68619,68620],{},[16,68621,65342],{},[331,68623,51795],{"id":51794},[13,68625,68626],{},[16,68627,68628],{},"Capítulo 22: Decider - Tomar decisiones",[13,68630,68631],{},"En el próximo capítulo aprenderás a crear métodos que devuelven valores y cómo organizar mejor tu código.",[43,68633],{},[13,68635,68636,10676,68638,68640,68641,93,68643,68646,93,68648],{},[31,68637,657],{},[31,68639,10679],{},": 20 minutos\n",[31,68642,10683],{},[54,68644,68645],{},"code\u002Fcap-21\u002F",[31,68647,51827],{},[54,68649,67514],{},[660,68651,662],{},{"title":228,"searchDepth":229,"depth":229,"links":68653},[68654,68655,68656,68657,68662,68666,68670,68675,68679,68684,68688,68692,68697,68698,68699],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":67085,"depth":229,"text":67086},{"id":67137,"depth":229,"text":67138,"children":68658},[68659,68660,68661],{"id":49680,"depth":670,"text":49681},{"id":58686,"depth":670,"text":58687},{"id":67197,"depth":670,"text":67198},{"id":67247,"depth":229,"text":67248,"children":68663},[68664,68665],{"id":67251,"depth":670,"text":67252},{"id":67313,"depth":670,"text":67314},{"id":67370,"depth":229,"text":67371,"children":68667},[68668,68669],{"id":67374,"depth":670,"text":67375},{"id":67433,"depth":670,"text":67434},{"id":67468,"depth":229,"text":67469,"children":68671},[68672,68673,68674],{"id":24173,"depth":670,"text":24174},{"id":67508,"depth":670,"text":67509},{"id":67613,"depth":670,"text":67614},{"id":67631,"depth":229,"text":67632,"children":68676},[68677,68678],{"id":67635,"depth":670,"text":67636},{"id":67679,"depth":670,"text":67680},{"id":67700,"depth":229,"text":67701,"children":68680},[68681,68682,68683],{"id":67704,"depth":670,"text":67705},{"id":67802,"depth":670,"text":67803},{"id":67880,"depth":670,"text":67881},{"id":67960,"depth":229,"text":67961,"children":68685},[68686,68687],{"id":67964,"depth":670,"text":67965},{"id":68148,"depth":670,"text":68149},{"id":68301,"depth":229,"text":68302,"children":68689},[68690,68691],{"id":68305,"depth":670,"text":68306},{"id":68337,"depth":670,"text":68338},{"id":68371,"depth":229,"text":68372,"children":68693},[68694,68695,68696],{"id":68375,"depth":670,"text":68376},{"id":68418,"depth":670,"text":68419},{"id":68451,"depth":670,"text":68452},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":68700},[68701,68702],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Muestra mensajes del sistema con BaseException en la API de EPLAN en C# y gestiona errores en tus scripts de EPLAN Electric P8.",{},"\u002Fguia\u002Fpathmap-mensajes\u002Fcap-21-baseexception-mensajes-sistema",{"title":67024,"description":68703},"guia\u002Fpathmap-mensajes\u002Fcap-21-baseexception-mensajes-sistema","luiEM5ihkSn0DjctqgWdIqPf3EAzGrz44_IIxP66xgI",{"id":68710,"title":68711,"body":68712,"description":69609,"extension":236,"meta":69610,"navigation":238,"path":69611,"seo":69612,"stem":69613,"tagline":242,"__hash__":69614},"guia\u002Fguia\u002Fflujo-control\u002Fcap-22-metodos-valor-retorno.md","Capítulo 22: Métodos con valor de retorno en C#",{"type":7,"value":68713,"toc":69588},[68714,68726,68728,68730,68732,68752,68754,68756,68768,68770,68776,68782,68787,68824,68829,68870,68876,68878,68882,68885,68889,68917,68921,68926,69112,69116,69129,69131,69135,69139,69167,69169,69178,69182,69210,69212,69216,69221,69226,69293,69298,69339,69341,69345,69348,69526,69528,69530,69566,69568,69570,69572,69576,69578,69583,69586],[10,68715,68716],{},[13,68717,68718,19,68721,19,68724,262],{},[16,68719,68720],{},"Parte IV: Flujo de control y decisiones",[16,68722,68723],{},"Sección 9: Métodos y organización",[16,68725,25],{},[43,68727],{},[46,68729,268],{"id":267},[13,68731,702],{},[126,68733,68734,68743,68746,68749],{},[88,68735,68736,68737,4000,68739,4000,68741,32897],{},"Crear métodos auxiliares que retornan valores (",[54,68738,6586],{},[54,68740,62464],{},[54,68742,4926],{},[88,68744,68745],{},"Refactorizar código complejo moviendo lógica a métodos separados",[88,68747,68748],{},"Usar el valor de retorno para tomar decisiones en el flujo del script",[88,68750,68751],{},"Escribir código más limpio y mantenible",[43,68753],{},[46,68755,320],{"id":319},[126,68757,68758,68761,68766],{},[88,68759,68760],{},"Conocimiento básico de métodos en C# (Parte I)",[88,68762,68763,68764],{},"Atributo ",[551,68765,1300],{},[88,68767,50981],{},[43,68769],{},[46,68771,68773,68774],{"id":68772},"introducción-limpiando-el-método-start","Introducción: Limpiando el método ",[551,68775,1300],{},[13,68777,68778,68779,68781],{},"A medida que tus scripts crecen, el método ",[54,68780,1644],{}," puede volverse enorme y difícil de leer.",[13,68783,68784],{},[16,68785,68786],{},"Código desordenado:",[543,68788,68790],{"className":545,"code":68789,"language":547,"meta":228,"style":228},"[Start]\npublic void Function()\n{\n    \u002F\u002F 50 líneas de validación\n    \u002F\u002F 30 líneas de cálculo\n    \u002F\u002F 20 líneas de exportación\n}\n",[54,68791,68792,68796,68801,68805,68810,68815,68820],{"__ignoreMap":228},[551,68793,68794],{"class":553,"line":554},[551,68795,1310],{},[551,68797,68798],{"class":553,"line":229},[551,68799,68800],{},"public void Function()\n",[551,68802,68803],{"class":553,"line":670},[551,68804,1151],{},[551,68806,68807],{"class":553,"line":1136},[551,68808,68809],{},"    \u002F\u002F 50 líneas de validación\n",[551,68811,68812],{"class":553,"line":1142},[551,68813,68814],{},"    \u002F\u002F 30 líneas de cálculo\n",[551,68816,68817],{"class":553,"line":1148},[551,68818,68819],{},"    \u002F\u002F 20 líneas de exportación\n",[551,68821,68822],{"class":553,"line":1154},[551,68823,1193],{},[13,68825,68826],{},[16,68827,68828],{},"Código limpio:",[543,68830,68832],{"className":545,"code":68831,"language":547,"meta":228,"style":228},"[Start]\npublic void Function()\n{\n    if (!ValidarProyecto()) return;\n    \n    int total = CalcularTotal();\n    Exportar(total);\n}\n",[54,68833,68834,68838,68842,68846,68851,68856,68861,68866],{"__ignoreMap":228},[551,68835,68836],{"class":553,"line":554},[551,68837,1310],{},[551,68839,68840],{"class":553,"line":229},[551,68841,68800],{},[551,68843,68844],{"class":553,"line":670},[551,68845,1151],{},[551,68847,68848],{"class":553,"line":1136},[551,68849,68850],{},"    if (!ValidarProyecto()) return;\n",[551,68852,68853],{"class":553,"line":1142},[551,68854,68855],{},"    \n",[551,68857,68858],{"class":553,"line":1148},[551,68859,68860],{},"    int total = CalcularTotal();\n",[551,68862,68863],{"class":553,"line":1154},[551,68864,68865],{},"    Exportar(total);\n",[551,68867,68868],{"class":553,"line":1160},[551,68869,1193],{},[13,68871,68872,68873,41],{},"Para lograr esto, necesitas métodos que ",[16,68874,68875],{},"retornen valores",[43,68877],{},[46,68879,68881],{"id":68880},"_1-métodos-con-retorno-en-eplan-scripts","1. Métodos con retorno en EPLAN Scripts",[13,68883,68884],{},"La sintaxis es C# estándar. Lo importante es cómo aplicarlo para interactuar con la API de EPLAN.",[331,68886,68888],{"id":68887},"_11-sintaxis-básica","1.1 Sintaxis básica",[543,68890,68892],{"className":545,"code":68891,"language":547,"meta":228,"style":228},"private TipoDeDato NombreDelMetodo(Parametros)\n{\n    \u002F\u002F Lógica\n    return valor;\n}\n",[54,68893,68894,68899,68903,68908,68913],{"__ignoreMap":228},[551,68895,68896],{"class":553,"line":554},[551,68897,68898],{},"private TipoDeDato NombreDelMetodo(Parametros)\n",[551,68900,68901],{"class":553,"line":229},[551,68902,1151],{},[551,68904,68905],{"class":553,"line":670},[551,68906,68907],{},"    \u002F\u002F Lógica\n",[551,68909,68910],{"class":553,"line":1136},[551,68911,68912],{},"    return valor;\n",[551,68914,68915],{"class":553,"line":1142},[551,68916,1193],{},[331,68918,68920],{"id":68919},"_12-ejemplo-validar-proyecto","1.2 Ejemplo: Validar proyecto",[13,68922,62193,68923,416],{},[54,68924,68925],{},"EPLAN-Scripting-4.0\u002F04_CodeFlow\u002F06_MethodReturnValue.cs",[543,68927,68929],{"className":545,"code":68928,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class MetodosConRetorno\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Llamar al método y usar su resultado\n        if (CheckProjectName())\n        {\n            MessageBox.Show(\"El proyecto es válido. Continuando...\");\n            \u002F\u002F Lógica principal aquí\n        }\n        else\n        {\n            MessageBox.Show(\"Operación cancelada.\");\n        }\n    }\n\n    \u002F\u002F Método auxiliar que retorna un booleano\n    private bool CheckProjectName()\n    {\n        string projectName = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n\n        if (string.IsNullOrEmpty(projectName) || projectName.StartsWith(\"$(\"))\n        {\n            MessageBox.Show(\"Error: No hay proyecto abierto.\");\n            return false;\n        }\n\n        if (projectName.Contains(\"DEMO\"))\n        {\n            MessageBox.Show(\"Advertencia: Es un proyecto DEMO.\");\n            \u002F\u002F Aun así permitimos continuar, pero avisamos\n            return true;\n        }\n\n        return true;\n    }\n}\n",[54,68930,68931,68935,68939,68943,68947,68952,68956,68960,68964,68968,68973,68978,68982,68987,68992,68996,69000,69004,69009,69013,69017,69021,69026,69031,69035,69039,69043,69048,69052,69057,69061,69065,69069,69074,69078,69083,69088,69092,69096,69100,69104,69108],{"__ignoreMap":228},[551,68932,68933],{"class":553,"line":554},[551,68934,50105],{},[551,68936,68937],{"class":553,"line":229},[551,68938,1128],{},[551,68940,68941],{"class":553,"line":670},[551,68942,49898],{},[551,68944,68945],{"class":553,"line":1136},[551,68946,1139],{"emptyLinePlaceholder":238},[551,68948,68949],{"class":553,"line":1142},[551,68950,68951],{},"public class MetodosConRetorno\n",[551,68953,68954],{"class":553,"line":1148},[551,68955,1151],{},[551,68957,68958],{"class":553,"line":1154},[551,68959,1157],{},[551,68961,68962],{"class":553,"line":1160},[551,68963,57216],{},[551,68965,68966],{"class":553,"line":1166},[551,68967,1169],{},[551,68969,68970],{"class":553,"line":1172},[551,68971,68972],{},"        \u002F\u002F Llamar al método y usar su resultado\n",[551,68974,68975],{"class":553,"line":1178},[551,68976,68977],{},"        if (CheckProjectName())\n",[551,68979,68980],{"class":553,"line":1184},[551,68981,9062],{},[551,68983,68984],{"class":553,"line":1190},[551,68985,68986],{},"            MessageBox.Show(\"El proyecto es válido. Continuando...\");\n",[551,68988,68989],{"class":553,"line":1472},[551,68990,68991],{},"            \u002F\u002F Lógica principal aquí\n",[551,68993,68994],{"class":553,"line":1477},[551,68995,9077],{},[551,68997,68998],{"class":553,"line":1797},[551,68999,9082],{},[551,69001,69002],{"class":553,"line":1802},[551,69003,9062],{},[551,69005,69006],{"class":553,"line":1808},[551,69007,69008],{},"            MessageBox.Show(\"Operación cancelada.\");\n",[551,69010,69011],{"class":553,"line":1814},[551,69012,9077],{},[551,69014,69015],{"class":553,"line":1820},[551,69016,1187],{},[551,69018,69019],{"class":553,"line":1826},[551,69020,1139],{"emptyLinePlaceholder":238},[551,69022,69023],{"class":553,"line":1832},[551,69024,69025],{},"    \u002F\u002F Método auxiliar que retorna un booleano\n",[551,69027,69028],{"class":553,"line":1838},[551,69029,69030],{},"    private bool CheckProjectName()\n",[551,69032,69033],{"class":553,"line":1844},[551,69034,1169],{},[551,69036,69037],{"class":553,"line":1850},[551,69038,65751],{},[551,69040,69041],{"class":553,"line":1855},[551,69042,1139],{"emptyLinePlaceholder":238},[551,69044,69045],{"class":553,"line":1861},[551,69046,69047],{},"        if (string.IsNullOrEmpty(projectName) || projectName.StartsWith(\"$(\"))\n",[551,69049,69050],{"class":553,"line":1867},[551,69051,9062],{},[551,69053,69054],{"class":553,"line":1873},[551,69055,69056],{},"            MessageBox.Show(\"Error: No hay proyecto abierto.\");\n",[551,69058,69059],{"class":553,"line":1878},[551,69060,39691],{},[551,69062,69063],{"class":553,"line":1883},[551,69064,9077],{},[551,69066,69067],{"class":553,"line":1888},[551,69068,1139],{"emptyLinePlaceholder":238},[551,69070,69071],{"class":553,"line":4615},[551,69072,69073],{},"        if (projectName.Contains(\"DEMO\"))\n",[551,69075,69076],{"class":553,"line":4620},[551,69077,9062],{},[551,69079,69080],{"class":553,"line":4626},[551,69081,69082],{},"            MessageBox.Show(\"Advertencia: Es un proyecto DEMO.\");\n",[551,69084,69085],{"class":553,"line":4631},[551,69086,69087],{},"            \u002F\u002F Aun así permitimos continuar, pero avisamos\n",[551,69089,69090],{"class":553,"line":4636},[551,69091,46730],{},[551,69093,69094],{"class":553,"line":4641},[551,69095,9077],{},[551,69097,69098],{"class":553,"line":4647},[551,69099,1139],{"emptyLinePlaceholder":238},[551,69101,69102],{"class":553,"line":4653},[551,69103,39719],{},[551,69105,69106],{"class":553,"line":4659},[551,69107,1187],{},[551,69109,69110],{"class":553,"line":4665},[551,69111,1193],{},[13,69113,69114],{},[16,69115,52776],{},[126,69117,69118,69124],{},[88,69119,69120,69123],{},[54,69121,69122],{},"CheckProjectName"," encapsula la lógica de obtener y validar el nombre.",[88,69125,59848,69126,69128],{},[54,69127,1644],{}," queda limpio: \"Si el proyecto es válido, continuar\".",[43,69130],{},[46,69132,69134],{"id":69133},"_2-retornar-strings-y-números","2. Retornar Strings y Números",[331,69136,69138],{"id":69137},"_21-método-para-obtener-rutas","2.1 Método para obtener rutas",[543,69140,69142],{"className":545,"code":69141,"language":547,"meta":228,"style":228},"private string GetExportPath(string fileName)\n{\n    string projectPath = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n    return System.IO.Path.Combine(projectPath, \"Export\", fileName);\n}\n",[54,69143,69144,69149,69153,69158,69163],{"__ignoreMap":228},[551,69145,69146],{"class":553,"line":554},[551,69147,69148],{},"private string GetExportPath(string fileName)\n",[551,69150,69151],{"class":553,"line":229},[551,69152,1151],{},[551,69154,69155],{"class":553,"line":670},[551,69156,69157],{},"    string projectPath = PathMap.SubstitutePath(\"$(PROJECTPATH)\");\n",[551,69159,69160],{"class":553,"line":1136},[551,69161,69162],{},"    return System.IO.Path.Combine(projectPath, \"Export\", fileName);\n",[551,69164,69165],{"class":553,"line":1142},[551,69166,1193],{},[13,69168,60943],{},[543,69170,69172],{"className":545,"code":69171,"language":547,"meta":228,"style":228},"string fullPath = GetExportPath(\"listado.txt\");\n",[54,69173,69174],{"__ignoreMap":228},[551,69175,69176],{"class":553,"line":554},[551,69177,69171],{},[331,69179,69181],{"id":69180},"_22-método-para-cálculos","2.2 Método para cálculos",[543,69183,69185],{"className":545,"code":69184,"language":547,"meta":228,"style":228},"private int CalcularPaginas(int esquematicas, int reportes)\n{\n    \u002F\u002F Lógica de negocio encapsulada\n    return esquematicas + reportes;\n}\n",[54,69186,69187,69192,69196,69201,69206],{"__ignoreMap":228},[551,69188,69189],{"class":553,"line":554},[551,69190,69191],{},"private int CalcularPaginas(int esquematicas, int reportes)\n",[551,69193,69194],{"class":553,"line":229},[551,69195,1151],{},[551,69197,69198],{"class":553,"line":670},[551,69199,69200],{},"    \u002F\u002F Lógica de negocio encapsulada\n",[551,69202,69203],{"class":553,"line":1136},[551,69204,69205],{},"    return esquematicas + reportes;\n",[551,69207,69208],{"class":553,"line":1142},[551,69209,1193],{},[43,69211],{},[46,69213,69215],{"id":69214},"_3-salida-temprana-early-return","3. Salida temprana (Early Return)",[13,69217,30790,69218,69220],{},[54,69219,22447],{}," no solo devuelve un valor, también termina la ejecución del método inmediatamente. Esto es muy útil para validaciones (Guards).",[13,69222,69223],{},[16,69224,69225],{},"Sin Early Return (Nested Ifs - \"Arrow Code\"):",[543,69227,69229],{"className":545,"code":69228,"language":547,"meta":228,"style":228},"public bool Validar()\n{\n    if (Condicion1)\n    {\n        if (Condicion2)\n        {\n            if (Condicion3)\n            {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n",[54,69230,69231,69236,69240,69245,69249,69254,69258,69263,69267,69272,69276,69280,69284,69289],{"__ignoreMap":228},[551,69232,69233],{"class":553,"line":554},[551,69234,69235],{},"public bool Validar()\n",[551,69237,69238],{"class":553,"line":229},[551,69239,1151],{},[551,69241,69242],{"class":553,"line":670},[551,69243,69244],{},"    if (Condicion1)\n",[551,69246,69247],{"class":553,"line":1136},[551,69248,1169],{},[551,69250,69251],{"class":553,"line":1142},[551,69252,69253],{},"        if (Condicion2)\n",[551,69255,69256],{"class":553,"line":1148},[551,69257,9062],{},[551,69259,69260],{"class":553,"line":1154},[551,69261,69262],{},"            if (Condicion3)\n",[551,69264,69265],{"class":553,"line":1160},[551,69266,12301],{},[551,69268,69269],{"class":553,"line":1166},[551,69270,69271],{},"                return true;\n",[551,69273,69274],{"class":553,"line":1172},[551,69275,12311],{},[551,69277,69278],{"class":553,"line":1178},[551,69279,9077],{},[551,69281,69282],{"class":553,"line":1184},[551,69283,1187],{},[551,69285,69286],{"class":553,"line":1190},[551,69287,69288],{},"    return false;\n",[551,69290,69291],{"class":553,"line":1472},[551,69292,1193],{},[13,69294,69295],{},[16,69296,69297],{},"Con Early Return (Cleaner):",[543,69299,69301],{"className":545,"code":69300,"language":547,"meta":228,"style":228},"public bool Validar()\n{\n    if (!Condicion1) return false;\n    if (!Condicion2) return false;\n    if (!Condicion3) return false;\n\n    return true;\n}\n",[54,69302,69303,69307,69311,69316,69321,69326,69330,69335],{"__ignoreMap":228},[551,69304,69305],{"class":553,"line":554},[551,69306,69235],{},[551,69308,69309],{"class":553,"line":229},[551,69310,1151],{},[551,69312,69313],{"class":553,"line":670},[551,69314,69315],{},"    if (!Condicion1) return false;\n",[551,69317,69318],{"class":553,"line":1136},[551,69319,69320],{},"    if (!Condicion2) return false;\n",[551,69322,69323],{"class":553,"line":1142},[551,69324,69325],{},"    if (!Condicion3) return false;\n",[551,69327,69328],{"class":553,"line":1148},[551,69329,1139],{"emptyLinePlaceholder":238},[551,69331,69332],{"class":553,"line":1154},[551,69333,69334],{},"    return true;\n",[551,69336,69337],{"class":553,"line":1160},[551,69338,1193],{},[43,69340],{},[46,69342,69344],{"id":69343},"_4-proyecto-del-capítulo-calculadora-de-nombres","4. Proyecto del capítulo: Calculadora de Nombres",[13,69346,69347],{},"Vamos a crear un script que genere nombres de archivo estandarizados usando métodos auxiliares.",[543,69349,69351],{"className":545,"code":69350,"language":547,"meta":228,"style":228},"using System;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class GeneradorDeNombres\n{\n    [Start]\n    public void Function()\n    {\n        string nombreBase = GetProjectName();\n        if (string.IsNullOrEmpty(nombreBase)) return;\n\n        string fecha = GetFormattedDate();\n        string nombreFinal = GenerateFileName(nombreBase, fecha, \"PDF\");\n\n        MessageBox.Show(\"Archivo generado será: \" + nombreFinal);\n    }\n\n    \u002F\u002F Método 1: Obtener nombre limpio\n    private string GetProjectName()\n    {\n        string pName = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n        if (pName.StartsWith(\"$(\")) return null;\n        return pName;\n    }\n\n    \u002F\u002F Método 2: Obtener fecha formato ISO\n    private string GetFormattedDate()\n    {\n        return DateTime.Now.ToString(\"yyyyMMdd\");\n    }\n\n    \u002F\u002F Método 3: Combinar partes\n    private string GenerateFileName(string project, string date, string extension)\n    {\n        return string.Format(\"{0}_{1}_Export.{2}\", project, date, extension);\n    }\n}\n",[54,69352,69353,69357,69361,69365,69369,69373,69378,69382,69386,69390,69394,69399,69404,69408,69413,69418,69422,69427,69431,69435,69440,69445,69449,69454,69459,69464,69468,69472,69477,69482,69486,69491,69495,69499,69504,69509,69513,69518,69522],{"__ignoreMap":228},[551,69354,69355],{"class":553,"line":554},[551,69356,1123],{},[551,69358,69359],{"class":553,"line":229},[551,69360,50105],{},[551,69362,69363],{"class":553,"line":670},[551,69364,1128],{},[551,69366,69367],{"class":553,"line":1136},[551,69368,49898],{},[551,69370,69371],{"class":553,"line":1142},[551,69372,1139],{"emptyLinePlaceholder":238},[551,69374,69375],{"class":553,"line":1148},[551,69376,69377],{},"public class GeneradorDeNombres\n",[551,69379,69380],{"class":553,"line":1154},[551,69381,1151],{},[551,69383,69384],{"class":553,"line":1160},[551,69385,1157],{},[551,69387,69388],{"class":553,"line":1166},[551,69389,57216],{},[551,69391,69392],{"class":553,"line":1172},[551,69393,1169],{},[551,69395,69396],{"class":553,"line":1178},[551,69397,69398],{},"        string nombreBase = GetProjectName();\n",[551,69400,69401],{"class":553,"line":1184},[551,69402,69403],{},"        if (string.IsNullOrEmpty(nombreBase)) return;\n",[551,69405,69406],{"class":553,"line":1190},[551,69407,1139],{"emptyLinePlaceholder":238},[551,69409,69410],{"class":553,"line":1472},[551,69411,69412],{},"        string fecha = GetFormattedDate();\n",[551,69414,69415],{"class":553,"line":1477},[551,69416,69417],{},"        string nombreFinal = GenerateFileName(nombreBase, fecha, \"PDF\");\n",[551,69419,69420],{"class":553,"line":1797},[551,69421,1139],{"emptyLinePlaceholder":238},[551,69423,69424],{"class":553,"line":1802},[551,69425,69426],{},"        MessageBox.Show(\"Archivo generado será: \" + nombreFinal);\n",[551,69428,69429],{"class":553,"line":1808},[551,69430,1187],{},[551,69432,69433],{"class":553,"line":1814},[551,69434,1139],{"emptyLinePlaceholder":238},[551,69436,69437],{"class":553,"line":1820},[551,69438,69439],{},"    \u002F\u002F Método 1: Obtener nombre limpio\n",[551,69441,69442],{"class":553,"line":1826},[551,69443,69444],{},"    private string GetProjectName()\n",[551,69446,69447],{"class":553,"line":1832},[551,69448,1169],{},[551,69450,69451],{"class":553,"line":1838},[551,69452,69453],{},"        string pName = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n",[551,69455,69456],{"class":553,"line":1844},[551,69457,69458],{},"        if (pName.StartsWith(\"$(\")) return null;\n",[551,69460,69461],{"class":553,"line":1850},[551,69462,69463],{},"        return pName;\n",[551,69465,69466],{"class":553,"line":1855},[551,69467,1187],{},[551,69469,69470],{"class":553,"line":1861},[551,69471,1139],{"emptyLinePlaceholder":238},[551,69473,69474],{"class":553,"line":1867},[551,69475,69476],{},"    \u002F\u002F Método 2: Obtener fecha formato ISO\n",[551,69478,69479],{"class":553,"line":1873},[551,69480,69481],{},"    private string GetFormattedDate()\n",[551,69483,69484],{"class":553,"line":1878},[551,69485,1169],{},[551,69487,69488],{"class":553,"line":1883},[551,69489,69490],{},"        return DateTime.Now.ToString(\"yyyyMMdd\");\n",[551,69492,69493],{"class":553,"line":1888},[551,69494,1187],{},[551,69496,69497],{"class":553,"line":4615},[551,69498,1139],{"emptyLinePlaceholder":238},[551,69500,69501],{"class":553,"line":4620},[551,69502,69503],{},"    \u002F\u002F Método 3: Combinar partes\n",[551,69505,69506],{"class":553,"line":4626},[551,69507,69508],{},"    private string GenerateFileName(string project, string date, string extension)\n",[551,69510,69511],{"class":553,"line":4631},[551,69512,1169],{},[551,69514,69515],{"class":553,"line":4636},[551,69516,69517],{},"        return string.Format(\"{0}_{1}_Export.{2}\", project, date, extension);\n",[551,69519,69520],{"class":553,"line":4641},[551,69521,1187],{},[551,69523,69524],{"class":553,"line":4647},[551,69525,1193],{},[43,69527],{},[46,69529,22685],{"id":22684},[126,69531,69532,69537,69548,69554],{},[88,69533,69534,69535,41],{},"Mueve la lógica compleja fuera de ",[54,69536,1644],{},[88,69538,69539,69540,69542,69543,4000,69545,69547],{},"Usa métodos ",[54,69541,42338],{}," con tipos de retorno (",[54,69544,6586],{},[54,69546,62464],{},", etc.).",[88,69549,69550,69551,69553],{},"Aprovecha el ",[54,69552,22447],{}," para salir temprano de validaciones fallidas.",[88,69555,69556,69557,4000,69560,4000,69563,154],{},"Nombra tus métodos con verbos que indiquen qué retornan (",[54,69558,69559],{},"Get...",[54,69561,69562],{},"Check...",[54,69564,69565],{},"Calculate...",[43,69567],{},[46,69569,51782],{"id":36078},[331,69571,51786],{"id":51785},[13,69573,69574],{},[16,69575,66941],{},[331,69577,51795],{"id":51794},[13,69579,69580],{},[16,69581,69582],{},"Capítulo 23: Sobrecarga de métodos",[13,69584,69585],{},"En el próximo capítulo aprenderás a crear múltiples versiones de un mismo método para manejar diferentes situaciones (polimorfismo estático).",[660,69587,662],{},{"title":228,"searchDepth":229,"depth":229,"links":69589},[69590,69591,69592,69594,69598,69602,69603,69604,69605],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":68772,"depth":229,"text":69593},"Introducción: Limpiando el método Start",{"id":68880,"depth":229,"text":68881,"children":69595},[69596,69597],{"id":68887,"depth":670,"text":68888},{"id":68919,"depth":670,"text":68920},{"id":69133,"depth":229,"text":69134,"children":69599},[69600,69601],{"id":69137,"depth":670,"text":69138},{"id":69180,"depth":670,"text":69181},{"id":69214,"depth":229,"text":69215},{"id":69343,"depth":229,"text":69344},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":69606},[69607,69608],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Aprende a crear métodos con valor de retorno en C# para organizar cálculos y reutilizar lógica en tus scripts EPLAN.",{},"\u002Fguia\u002Fflujo-control\u002Fcap-22-metodos-valor-retorno",{"title":68711,"description":69609},"guia\u002Fflujo-control\u002Fcap-22-metodos-valor-retorno","wav5wCzvlGh7D4LGzEd99Uo2z-LIkFjfrfUHi3PfX08",{"id":69616,"title":69617,"body":69618,"description":70243,"extension":236,"meta":70244,"navigation":238,"path":70245,"seo":70246,"stem":70247,"tagline":242,"__hash__":70248},"guia\u002Fguia\u002Fflujo-control\u002Fcap-23-sobrecarga-metodos.md","Capítulo 23: Sobrecarga de métodos en C#",{"type":7,"value":69619,"toc":70225},[69620,69630,69632,69634,69636,69650,69652,69654,69662,69664,69668,69671,69674,69688,69707,69709,69713,69720,69724,69779,69782,69784,69788,69795,69800,69943,69946,69968,69970,69974,69977,69982,69997,70002,70011,70014,70016,70020,70027,70184,70186,70188,70202,70204,70206,70208,70213,70215,70220,70223],[10,69621,69622],{},[13,69623,69624,19,69626,19,69628,56383],{},[16,69625,68720],{},[16,69627,68723],{},[16,69629,25],{},[43,69631],{},[46,69633,268],{"id":267},[13,69635,702],{},[126,69637,69638,69641,69644,69647],{},[88,69639,69640],{},"Entender qué es la sobrecarga de métodos (Method Overloading)",[88,69642,69643],{},"Crear múltiples versiones de un método con el mismo nombre",[88,69645,69646],{},"Simplificar el uso de tus funciones auxiliares proporcionando valores por defecto",[88,69648,69649],{},"Aplicar sobrecarga para logging y manejo de mensajes en EPLAN",[43,69651],{},[46,69653,320],{"id":319},[126,69655,69656,69659],{},[88,69657,69658],{},"Capítulo 22 (Métodos con valor de retorno)",[88,69660,69661],{},"Conceptos básicos de firmas de métodos",[43,69663],{},[46,69665,69667],{"id":69666},"introducción-por-qué-sobrecargar","Introducción: ¿Por qué sobrecargar?",[13,69669,69670],{},"A veces quieres realizar la misma acción, pero con diferentes niveles de detalle.",[13,69672,69673],{},"Por ejemplo, para enviar un mensaje:",[85,69675,69676,69682],{},[88,69677,69678,69681],{},[54,69679,69680],{},"Log(\"Hola\")"," -> Mensaje simple",[88,69683,69684,69687],{},[54,69685,69686],{},"Log(\"Error de conexión\", true)"," -> Mensaje que es un error",[13,69689,69690,69691,4000,69694,69697,69698,73,69701,69704,69705,41],{},"En lugar de crear métodos con nombres distintos (",[54,69692,69693],{},"LogSimple",[54,69695,69696],{},"LogError","), puedes usar ",[16,69699,69700],{},"el mismo nombre",[54,69702,69703],{},"Log"," para ambos. Esto se llama ",[16,69706,31132],{},[43,69708],{},[46,69710,69712],{"id":69711},"_1-concepto-de-sobrecarga","1. Concepto de Sobrecarga",[13,69714,69715,69716,69719],{},"La sobrecarga permite definir varios métodos con el mismo nombre, siempre que su ",[16,69717,69718],{},"firma"," (parámetros) sea diferente.",[331,69721,69723],{"id":69722},"_11-ejemplo-básico","1.1 Ejemplo básico",[543,69725,69727],{"className":545,"code":69726,"language":547,"meta":228,"style":228},"\u002F\u002F Versión 1: Solo mensaje\nprivate void Log(string message)\n{\n    \u002F\u002F Lógica básica\n}\n\n\u002F\u002F Versión 2: Mensaje y nivel\nprivate void Log(string message, bool isError)\n{\n    \u002F\u002F Lógica avanzada\n}\n",[54,69728,69729,69734,69739,69743,69748,69752,69756,69761,69766,69770,69775],{"__ignoreMap":228},[551,69730,69731],{"class":553,"line":554},[551,69732,69733],{},"\u002F\u002F Versión 1: Solo mensaje\n",[551,69735,69736],{"class":553,"line":229},[551,69737,69738],{},"private void Log(string message)\n",[551,69740,69741],{"class":553,"line":670},[551,69742,1151],{},[551,69744,69745],{"class":553,"line":1136},[551,69746,69747],{},"    \u002F\u002F Lógica básica\n",[551,69749,69750],{"class":553,"line":1142},[551,69751,1193],{},[551,69753,69754],{"class":553,"line":1148},[551,69755,1139],{"emptyLinePlaceholder":238},[551,69757,69758],{"class":553,"line":1154},[551,69759,69760],{},"\u002F\u002F Versión 2: Mensaje y nivel\n",[551,69762,69763],{"class":553,"line":1160},[551,69764,69765],{},"private void Log(string message, bool isError)\n",[551,69767,69768],{"class":553,"line":1166},[551,69769,1151],{},[551,69771,69772],{"class":553,"line":1172},[551,69773,69774],{},"    \u002F\u002F Lógica avanzada\n",[551,69776,69777],{"class":553,"line":1178},[551,69778,1193],{},[13,69780,69781],{},"C# sabe cuál ejecutar basándose en los parámetros que le pasas.",[43,69783],{},[46,69785,69787],{"id":69786},"_2-aplicación-en-eplan-wrapper-de-baseexception","2. Aplicación en EPLAN: Wrapper de BaseException",[13,69789,69790,69791,69794],{},"BaseException requiere siempre el nivel (",[54,69792,69793],{},"MessageLevel","). Podemos simplificar esto usando sobrecarga.",[13,69796,62193,69797,416],{},[54,69798,69799],{},"EPLAN-Scripting-4.0\u002F04_CodeFlow\u002F07_MethodOverloading.cs",[543,69801,69803],{"className":545,"code":69802,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class SobrecargaLogger\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Llamada simple (asume MessageLevel.Message)\n        Log(\"Inicio del proceso\");\n\n        \u002F\u002F Llamada detallada (especifica Warning)\n        Log(\"El archivo ya existe\", MessageLevel.Warning);\n\n        \u002F\u002F Llamada detallada (especifica Error)\n        Log(\"No se pudo escribir\", MessageLevel.Error);\n    }\n\n    \u002F\u002F Sobrecarga 1: Solo texto (Usa Message por defecto)\n    private void Log(string message)\n    {\n        \u002F\u002F Reutilizamos la lógica del método más complejo\n        Log(message, MessageLevel.Message);\n    }\n\n    \u002F\u002F Sobrecarga 2: Texto y Nivel (Implementación real)\n    private void Log(string message, MessageLevel level)\n    {\n        new BaseException(message, level).FixMessage();\n    }\n}\n",[54,69804,69805,69809,69813,69817,69822,69826,69830,69834,69838,69843,69848,69852,69857,69862,69866,69871,69876,69880,69884,69889,69894,69898,69903,69908,69912,69916,69921,69926,69930,69935,69939],{"__ignoreMap":228},[551,69806,69807],{"class":553,"line":554},[551,69808,1128],{},[551,69810,69811],{"class":553,"line":229},[551,69812,49898],{},[551,69814,69815],{"class":553,"line":670},[551,69816,1139],{"emptyLinePlaceholder":238},[551,69818,69819],{"class":553,"line":1136},[551,69820,69821],{},"public class SobrecargaLogger\n",[551,69823,69824],{"class":553,"line":1142},[551,69825,1151],{},[551,69827,69828],{"class":553,"line":1148},[551,69829,1157],{},[551,69831,69832],{"class":553,"line":1154},[551,69833,57216],{},[551,69835,69836],{"class":553,"line":1160},[551,69837,1169],{},[551,69839,69840],{"class":553,"line":1166},[551,69841,69842],{},"        \u002F\u002F Llamada simple (asume MessageLevel.Message)\n",[551,69844,69845],{"class":553,"line":1172},[551,69846,69847],{},"        Log(\"Inicio del proceso\");\n",[551,69849,69850],{"class":553,"line":1178},[551,69851,1139],{"emptyLinePlaceholder":238},[551,69853,69854],{"class":553,"line":1184},[551,69855,69856],{},"        \u002F\u002F Llamada detallada (especifica Warning)\n",[551,69858,69859],{"class":553,"line":1190},[551,69860,69861],{},"        Log(\"El archivo ya existe\", MessageLevel.Warning);\n",[551,69863,69864],{"class":553,"line":1472},[551,69865,1139],{"emptyLinePlaceholder":238},[551,69867,69868],{"class":553,"line":1477},[551,69869,69870],{},"        \u002F\u002F Llamada detallada (especifica Error)\n",[551,69872,69873],{"class":553,"line":1797},[551,69874,69875],{},"        Log(\"No se pudo escribir\", MessageLevel.Error);\n",[551,69877,69878],{"class":553,"line":1802},[551,69879,1187],{},[551,69881,69882],{"class":553,"line":1808},[551,69883,1139],{"emptyLinePlaceholder":238},[551,69885,69886],{"class":553,"line":1814},[551,69887,69888],{},"    \u002F\u002F Sobrecarga 1: Solo texto (Usa Message por defecto)\n",[551,69890,69891],{"class":553,"line":1820},[551,69892,69893],{},"    private void Log(string message)\n",[551,69895,69896],{"class":553,"line":1826},[551,69897,1169],{},[551,69899,69900],{"class":553,"line":1832},[551,69901,69902],{},"        \u002F\u002F Reutilizamos la lógica del método más complejo\n",[551,69904,69905],{"class":553,"line":1838},[551,69906,69907],{},"        Log(message, MessageLevel.Message);\n",[551,69909,69910],{"class":553,"line":1844},[551,69911,1187],{},[551,69913,69914],{"class":553,"line":1850},[551,69915,1139],{"emptyLinePlaceholder":238},[551,69917,69918],{"class":553,"line":1855},[551,69919,69920],{},"    \u002F\u002F Sobrecarga 2: Texto y Nivel (Implementación real)\n",[551,69922,69923],{"class":553,"line":1861},[551,69924,69925],{},"    private void Log(string message, MessageLevel level)\n",[551,69927,69928],{"class":553,"line":1867},[551,69929,1169],{},[551,69931,69932],{"class":553,"line":1873},[551,69933,69934],{},"        new BaseException(message, level).FixMessage();\n",[551,69936,69937],{"class":553,"line":1878},[551,69938,1187],{},[551,69940,69941],{"class":553,"line":1883},[551,69942,1193],{},[331,69944,124],{"id":69945},"ventajas",[126,69947,69948,69958],{},[88,69949,69950,73,69952,69954,69955,41],{},[16,69951,68828],{},[54,69953,69680],{}," es más fácil de leer que ",[54,69956,69957],{},"new BaseException(\"Hola\", MessageLevel.Message).FixMessage()",[88,69959,69960,69963,69964,69967],{},[16,69961,69962],{},"DRY (Don't Repeat Yourself):"," La lógica de ",[54,69965,69966],{},"FixMessage"," está en un solo lugar.",[43,69969],{},[46,69971,69973],{"id":69972},"_3-sobrecarga-vs-parámetros-opcionales","3. Sobrecarga vs Parámetros Opcionales",[13,69975,69976],{},"En C# moderno, también puedes usar parámetros opcionales.",[13,69978,69979],{},[16,69980,69981],{},"Sobrecarga (Estilo Clásico):",[543,69983,69985],{"className":545,"code":69984,"language":547,"meta":228,"style":228},"void Metodo(int a) { ... }\nvoid Metodo(int a, int b) { ... }\n",[54,69986,69987,69992],{"__ignoreMap":228},[551,69988,69989],{"class":553,"line":554},[551,69990,69991],{},"void Metodo(int a) { ... }\n",[551,69993,69994],{"class":553,"line":229},[551,69995,69996],{},"void Metodo(int a, int b) { ... }\n",[13,69998,69999],{},[16,70000,70001],{},"Parámetros Opcionales (Alternativa):",[543,70003,70005],{"className":545,"code":70004,"language":547,"meta":228,"style":228},"void Metodo(int a, int b = 0) { ... }\n",[54,70006,70007],{"__ignoreMap":228},[551,70008,70009],{"class":553,"line":554},[551,70010,70004],{},[13,70012,70013],{},"Ambos son válidos. La sobrecarga es útil cuando la lógica cambia drásticamente entre versiones, o para mantener compatibilidad con versiones antiguas de C# (aunque en scripts modernos de EPLAN se soportan características nuevas).",[43,70015],{},[46,70017,70019],{"id":70018},"_4-ejemplo-práctico-exportador-flexible","4. Ejemplo práctico: Exportador Flexible",[13,70021,70022,70023,70026],{},"Vamos a crear un helper ",[54,70024,70025],{},"Export"," que permita exportar con configuraciones por defecto o personalizadas.",[543,70028,70030],{"className":545,"code":70029,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class ExportadorFlexible\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Exportación rápida (solo nombre)\n        Export(\"ListadoSimple\");\n\n        \u002F\u002F Exportación detallada (nombre y formato)\n        Export(\"PlanoCompleto\", \"DWG\");\n    }\n\n    \u002F\u002F Versión 1: Solo nombre (asume PDF)\n    private void Export(string fileName)\n    {\n        Export(fileName, \"PDF\");\n    }\n\n    \u002F\u002F Versión 2: Nombre y formato (Implementación real)\n    private void Export(string fileName, string format)\n    {\n        ActionCallingContext ctx = new ActionCallingContext();\n        ctx.AddParameter(\"EXPORTFILE\", fileName);\n        ctx.AddParameter(\"TYPE\", format);\n        \n        new CommandLineInterpreter().Execute(\"export\", ctx);\n        \n        MessageBox.Show(\"Exportado: \" + fileName + \".\" + format);\n    }\n}\n",[54,70031,70032,70036,70040,70044,70048,70053,70057,70061,70065,70069,70074,70079,70083,70088,70093,70097,70101,70106,70111,70115,70120,70124,70128,70133,70138,70142,70147,70152,70157,70162,70167,70171,70176,70180],{"__ignoreMap":228},[551,70033,70034],{"class":553,"line":554},[551,70035,50105],{},[551,70037,70038],{"class":553,"line":229},[551,70039,1133],{},[551,70041,70042],{"class":553,"line":670},[551,70043,49898],{},[551,70045,70046],{"class":553,"line":1136},[551,70047,1139],{"emptyLinePlaceholder":238},[551,70049,70050],{"class":553,"line":1142},[551,70051,70052],{},"public class ExportadorFlexible\n",[551,70054,70055],{"class":553,"line":1148},[551,70056,1151],{},[551,70058,70059],{"class":553,"line":1154},[551,70060,1157],{},[551,70062,70063],{"class":553,"line":1160},[551,70064,57216],{},[551,70066,70067],{"class":553,"line":1166},[551,70068,1169],{},[551,70070,70071],{"class":553,"line":1172},[551,70072,70073],{},"        \u002F\u002F Exportación rápida (solo nombre)\n",[551,70075,70076],{"class":553,"line":1178},[551,70077,70078],{},"        Export(\"ListadoSimple\");\n",[551,70080,70081],{"class":553,"line":1184},[551,70082,1139],{"emptyLinePlaceholder":238},[551,70084,70085],{"class":553,"line":1190},[551,70086,70087],{},"        \u002F\u002F Exportación detallada (nombre y formato)\n",[551,70089,70090],{"class":553,"line":1472},[551,70091,70092],{},"        Export(\"PlanoCompleto\", \"DWG\");\n",[551,70094,70095],{"class":553,"line":1477},[551,70096,1187],{},[551,70098,70099],{"class":553,"line":1797},[551,70100,1139],{"emptyLinePlaceholder":238},[551,70102,70103],{"class":553,"line":1802},[551,70104,70105],{},"    \u002F\u002F Versión 1: Solo nombre (asume PDF)\n",[551,70107,70108],{"class":553,"line":1808},[551,70109,70110],{},"    private void Export(string fileName)\n",[551,70112,70113],{"class":553,"line":1814},[551,70114,1169],{},[551,70116,70117],{"class":553,"line":1820},[551,70118,70119],{},"        Export(fileName, \"PDF\");\n",[551,70121,70122],{"class":553,"line":1826},[551,70123,1187],{},[551,70125,70126],{"class":553,"line":1832},[551,70127,1139],{"emptyLinePlaceholder":238},[551,70129,70130],{"class":553,"line":1838},[551,70131,70132],{},"    \u002F\u002F Versión 2: Nombre y formato (Implementación real)\n",[551,70134,70135],{"class":553,"line":1844},[551,70136,70137],{},"    private void Export(string fileName, string format)\n",[551,70139,70140],{"class":553,"line":1850},[551,70141,1169],{},[551,70143,70144],{"class":553,"line":1855},[551,70145,70146],{},"        ActionCallingContext ctx = new ActionCallingContext();\n",[551,70148,70149],{"class":553,"line":1861},[551,70150,70151],{},"        ctx.AddParameter(\"EXPORTFILE\", fileName);\n",[551,70153,70154],{"class":553,"line":1867},[551,70155,70156],{},"        ctx.AddParameter(\"TYPE\", format);\n",[551,70158,70159],{"class":553,"line":1873},[551,70160,70161],{},"        \n",[551,70163,70164],{"class":553,"line":1878},[551,70165,70166],{},"        new CommandLineInterpreter().Execute(\"export\", ctx);\n",[551,70168,70169],{"class":553,"line":1883},[551,70170,70161],{},[551,70172,70173],{"class":553,"line":1888},[551,70174,70175],{},"        MessageBox.Show(\"Exportado: \" + fileName + \".\" + format);\n",[551,70177,70178],{"class":553,"line":4615},[551,70179,1187],{},[551,70181,70182],{"class":553,"line":4620},[551,70183,1193],{},[43,70185],{},[46,70187,22685],{"id":22684},[126,70189,70190,70196,70199],{},[88,70191,31129,70192,70195],{},[16,70193,70194],{},"Sobrecarga"," permite usar el mismo nombre para métodos similares.",[88,70197,70198],{},"Es ideal para crear \"Wrappers\" o funciones de utilidad que simplifican el código principal.",[88,70200,70201],{},"Puedes llamar a una versión desde otra para evitar duplicar código.",[43,70203],{},[46,70205,51782],{"id":36078},[331,70207,51786],{"id":51785},[13,70209,70210],{},[16,70211,70212],{},"Capítulo 22: Métodos con valor de retorno",[331,70214,51795],{"id":51794},[13,70216,70217],{},[16,70218,70219],{},"Capítulo 24: Decider - Preguntar al usuario",[13,70221,70222],{},"En la Parte V, nos centraremos en la interacción con el usuario, comenzando con diálogos de decisión.",[660,70224,662],{},{"title":228,"searchDepth":229,"depth":229,"links":70226},[70227,70228,70229,70230,70233,70236,70237,70238,70239],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":69666,"depth":229,"text":69667},{"id":69711,"depth":229,"text":69712,"children":70231},[70232],{"id":69722,"depth":670,"text":69723},{"id":69786,"depth":229,"text":69787,"children":70234},[70235],{"id":69945,"depth":670,"text":124},{"id":69972,"depth":229,"text":69973},{"id":70018,"depth":229,"text":70019},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":70240},[70241,70242],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Domina la sobrecarga de métodos en C# para escribir scripts EPLAN más flexibles y reutilizables al automatizar EPLAN Electric P8.",{},"\u002Fguia\u002Fflujo-control\u002Fcap-23-sobrecarga-metodos",{"title":69617,"description":70243},"guia\u002Fflujo-control\u002Fcap-23-sobrecarga-metodos","vlutDl_UDqfL2ETlBoCgigQkCB93YGgsNAxN5SppQGQ",{"id":70250,"title":70251,"body":70252,"description":72336,"extension":236,"meta":72337,"navigation":238,"path":72338,"seo":72339,"stem":72340,"tagline":242,"__hash__":72341},"guia\u002Fguia\u002Finteraccion-usuario\u002Fcap-24-decider-preguntar-usuario.md","Capítulo 24: Decider, preguntar al usuario en EPLAN",{"type":7,"value":70253,"toc":72299},[70254,70266,70268,70270,70272,70292,70294,70296,70309,70311,70315,70320,70370,70377,70391,70396,70398,70402,70404,70409,70414,70422,70426,70516,70520,70532,70534,70538,70540,70590,70599,70603,70608,70771,70775,70802,70804,70808,70812,70815,70909,70913,70956,70961,70965,71092,71097,71099,71103,71107,71160,71164,71167,71266,71270,71292,71294,71298,71302,71480,71484,71816,71821,71823,71827,71831,71912,71918,71922,72004,72008,72105,72107,72109,72114,72118,72141,72146,72173,72178,72188,72193,72204,72206,72208,72213,72216,72227,72232,72238,72245,72252,72257,72260,72262,72264,72266,72270,72272,72277,72280,72282,72297],[10,70255,70256],{},[13,70257,70258,19,70261,19,70264,262],{},[16,70259,70260],{},"Parte V: Interacción con usuario",[16,70262,70263],{},"Sección 10: Decisiones interactivas",[16,70265,25],{},[43,70267],{},[46,70269,268],{"id":267},[13,70271,702],{},[126,70273,70274,70277,70280,70283,70286,70289],{},[88,70275,70276],{},"Entender qué es Decider y por qué existe",[88,70278,70279],{},"Comprender la diferencia entre Decider y MessageBox",[88,70281,70282],{},"Usar Decider para hacer preguntas al usuario",[88,70284,70285],{},"Conocer los diferentes tipos de decisiones (OK, Yes\u002FNo, Yes to All\u002FNo to All, etc.)",[88,70287,70288],{},"Procesar la respuesta del usuario con switch",[88,70290,70291],{},"Aplicar Decider en flujos de trabajo EPLAN",[43,70293],{},[46,70295,320],{"id":319},[126,70297,70298,70300,70303,70306],{},[88,70299,67072],{},[88,70301,70302],{},"Entender if y switch",[88,70304,70305],{},"Saber usar enums",[88,70307,70308],{},"Conocer métodos con valor de retorno",[43,70310],{},[46,70312,70314],{"id":70313},"introducción-más-allá-de-messagebox","Introducción: Más allá de MessageBox",[13,70316,67089,70317,70319],{},[16,70318,1683],{}," para interactuar con el usuario:",[543,70321,70323],{"className":545,"code":70322,"language":547,"meta":228,"style":228},"DialogResult resultado = MessageBox.Show(\n    \"¿Continuar?\",\n    \"Pregunta\",\n    MessageBoxButtons.YesNo\n);\n\nif (resultado == DialogResult.Yes)\n{\n    \u002F\u002F Continuar\n}\n",[54,70324,70325,70329,70334,70339,70344,70348,70352,70357,70361,70366],{"__ignoreMap":228},[551,70326,70327],{"class":553,"line":554},[551,70328,55817],{},[551,70330,70331],{"class":553,"line":229},[551,70332,70333],{},"    \"¿Continuar?\",\n",[551,70335,70336],{"class":553,"line":670},[551,70337,70338],{},"    \"Pregunta\",\n",[551,70340,70341],{"class":553,"line":1136},[551,70342,70343],{},"    MessageBoxButtons.YesNo\n",[551,70345,70346],{"class":553,"line":1142},[551,70347,3967],{},[551,70349,70350],{"class":553,"line":1148},[551,70351,1139],{"emptyLinePlaceholder":238},[551,70353,70354],{"class":553,"line":1154},[551,70355,70356],{},"if (resultado == DialogResult.Yes)\n",[551,70358,70359],{"class":553,"line":1160},[551,70360,1151],{},[551,70362,70363],{"class":553,"line":1166},[551,70364,70365],{},"    \u002F\u002F Continuar\n",[551,70367,70368],{"class":553,"line":1172},[551,70369,1193],{},[13,70371,70372,70373,70376],{},"Esto funciona, pero ",[16,70374,70375],{},"Decider"," ofrece funcionalidades adicionales específicas de EPLAN:",[126,70378,70379,70382,70385,70388],{},[88,70380,70381],{},"Opciones \"Sí a todo\" y \"No a todo\" para procesamiento en lote",[88,70383,70384],{},"Checkbox \"No volver a mostrar este mensaje\"",[88,70386,70387],{},"Mejor integración con el sistema de settings de EPLAN",[88,70389,70390],{},"Iconos personalizables",[13,70392,70393],{},[16,70394,70395],{},"Decider es la forma nativa de EPLAN para hacer preguntas al usuario.",[43,70397],{},[46,70399,70401],{"id":70400},"_1-qué-es-decider","1. ¿Qué es Decider?",[331,70403,49681],{"id":49680},[13,70405,70406,70408],{},[16,70407,70375],{}," es una clase de EPLAN API que muestra diálogos de decisión al usuario y retorna su elección.",[13,70410,70411],{},[16,70412,70413],{},"¿Dónde se define?",[543,70415,70416],{"className":545,"code":1128,"language":547,"meta":228,"style":228},[54,70417,70418],{"__ignoreMap":228},[551,70419,70420],{"class":553,"line":554},[551,70421,1128],{},[331,70423,70425],{"id":70424},"_12-diferencias-con-messagebox","1.2 Diferencias con MessageBox",[6589,70427,70428,70438],{},[6592,70429,70430],{},[6595,70431,70432,70434,70436],{},[6598,70433,61347],{},[6598,70435,50981],{},[6598,70437,70375],{},[6611,70439,70440,70452,70465,70478,70490,70503],{},[6595,70441,70442,70447,70450],{},[6616,70443,70444],{},[16,70445,70446],{},"Origen",[6616,70448,70449],{},".NET Framework",[6616,70451,2064],{},[6595,70453,70454,70459,70462],{},[6616,70455,70456],{},[16,70457,70458],{},"Integración",[6616,70460,70461],{},"Windows genérico",[6616,70463,70464],{},"EPLAN específico",[6595,70466,70467,70472,70475],{},[6616,70468,70469],{},[16,70470,70471],{},"Opciones",[6616,70473,70474],{},"OK, Yes\u002FNo, Yes\u002FNo\u002FCancel",[6616,70476,70477],{},"+ Yes to All, No to All",[6595,70479,70480,70485,70487],{},[6616,70481,70482],{},[16,70483,70484],{},"Checkbox",[6616,70486,18787],{},[6616,70488,70489],{},"Sí (\"No volver a mostrar\")",[6595,70491,70492,70497,70500],{},[6616,70493,70494],{},[16,70495,70496],{},"Settings",[6616,70498,70499],{},"No persiste",[6616,70501,70502],{},"Puede persistir preferencias",[6595,70504,70505,70510,70513],{},[6616,70506,70507],{},[16,70508,70509],{},"Iconos",[6616,70511,70512],{},"Estándar Windows",[6616,70514,70515],{},"EPLAN personalizables",[13,70517,70518],{},[16,70519,66538],{},[126,70521,70522,70527],{},[88,70523,70524,70526],{},[16,70525,50981],{},": Mensajes simples, confirmaciones básicas",[88,70528,70529,70531],{},[16,70530,70375],{},": Procesos en lote, opciones \"para todo\", configuraciones persistentes",[43,70533],{},[46,70535,70537],{"id":70536},"_2-cómo-usar-decider","2. Cómo usar Decider",[331,70539,23267],{"id":23266},[543,70541,70543],{"className":545,"code":70542,"language":547,"meta":228,"style":228},"Decider decider = new Decider();\nEnumDecisionReturn respuesta = decider.Decide(\n    tipoDecision,       \u002F\u002F Tipo de diálogo (OK, Yes\u002FNo, etc.)\n    \"Mensaje\",          \u002F\u002F Texto a mostrar\n    \"Título\",           \u002F\u002F Título del diálogo\n    valorPorDefecto,    \u002F\u002F Qué botón está seleccionado por defecto\n    valorSiEscPressed   \u002F\u002F Qué retornar si se presiona Esc\n);\n",[54,70544,70545,70550,70555,70560,70568,70576,70581,70586],{"__ignoreMap":228},[551,70546,70547],{"class":553,"line":554},[551,70548,70549],{},"Decider decider = new Decider();\n",[551,70551,70552],{"class":553,"line":229},[551,70553,70554],{},"EnumDecisionReturn respuesta = decider.Decide(\n",[551,70556,70557],{"class":553,"line":670},[551,70558,70559],{},"    tipoDecision,       \u002F\u002F Tipo de diálogo (OK, Yes\u002FNo, etc.)\n",[551,70561,70562,70565],{"class":553,"line":1136},[551,70563,70564],{},"    \"Mensaje\",",[551,70566,70567],{},"          \u002F\u002F Texto a mostrar\n",[551,70569,70570,70573],{"class":553,"line":1142},[551,70571,70572],{},"    \"Título\",",[551,70574,70575],{},"           \u002F\u002F Título del diálogo\n",[551,70577,70578],{"class":553,"line":1148},[551,70579,70580],{},"    valorPorDefecto,    \u002F\u002F Qué botón está seleccionado por defecto\n",[551,70582,70583],{"class":553,"line":1154},[551,70584,70585],{},"    valorSiEscPressed   \u002F\u002F Qué retornar si se presiona Esc\n",[551,70587,70588],{"class":553,"line":1160},[551,70589,3967],{},[13,70591,70592,70594,70595,70598],{},[16,70593,65688],{}," Un enum ",[54,70596,70597],{},"EnumDecisionReturn"," que indica qué botón presionó el usuario.",[331,70600,70602],{"id":70601},"_22-ejemplo-básico-del-script-oficial","2.2 Ejemplo básico del script oficial",[13,70604,62193,70605,416],{},[54,70606,70607],{},"EPLAN-Scripting-4.0\u002F04_CodeFlow\u002F08_Decider.cs",[543,70609,70611],{"className":545,"code":70610,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class DeciderBasico\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Crear instancia de Decider\n        Decider decider = new Decider();\n\n        \u002F\u002F Mostrar diálogo Yes\u002FNo\n        EnumDecisionReturn respuesta = decider.Decide(\n            EnumDecisionType.eYesNoDecision,  \u002F\u002F Tipo: Yes\u002FNo\n            \"¿Desea continuar?\",               \u002F\u002F Mensaje\n            \"Confirmación\",                    \u002F\u002F Título\n            EnumDecisionReturn.eYES,           \u002F\u002F Botón por defecto: Yes\n            EnumDecisionReturn.eNO             \u002F\u002F Si presiona Esc: No\n        );\n\n        \u002F\u002F Procesar la respuesta\n        switch (respuesta)\n        {\n            case EnumDecisionReturn.eYES:\n                MessageBox.Show(\"Usuario eligió: Sí\");\n                break;\n\n            case EnumDecisionReturn.eNO:\n                MessageBox.Show(\"Usuario eligió: No\");\n                break;\n        }\n    }\n}\n",[54,70612,70613,70617,70621,70625,70629,70634,70638,70642,70646,70650,70655,70660,70664,70669,70674,70679,70687,70695,70700,70705,70709,70713,70718,70723,70727,70732,70737,70741,70745,70750,70755,70759,70763,70767],{"__ignoreMap":228},[551,70614,70615],{"class":553,"line":554},[551,70616,50105],{},[551,70618,70619],{"class":553,"line":229},[551,70620,1128],{},[551,70622,70623],{"class":553,"line":670},[551,70624,49898],{},[551,70626,70627],{"class":553,"line":1136},[551,70628,1139],{"emptyLinePlaceholder":238},[551,70630,70631],{"class":553,"line":1142},[551,70632,70633],{},"public class DeciderBasico\n",[551,70635,70636],{"class":553,"line":1148},[551,70637,1151],{},[551,70639,70640],{"class":553,"line":1154},[551,70641,1157],{},[551,70643,70644],{"class":553,"line":1160},[551,70645,57216],{},[551,70647,70648],{"class":553,"line":1166},[551,70649,1169],{},[551,70651,70652],{"class":553,"line":1172},[551,70653,70654],{},"        \u002F\u002F Crear instancia de Decider\n",[551,70656,70657],{"class":553,"line":1178},[551,70658,70659],{},"        Decider decider = new Decider();\n",[551,70661,70662],{"class":553,"line":1184},[551,70663,1139],{"emptyLinePlaceholder":238},[551,70665,70666],{"class":553,"line":1190},[551,70667,70668],{},"        \u002F\u002F Mostrar diálogo Yes\u002FNo\n",[551,70670,70671],{"class":553,"line":1472},[551,70672,70673],{},"        EnumDecisionReturn respuesta = decider.Decide(\n",[551,70675,70676],{"class":553,"line":1477},[551,70677,70678],{},"            EnumDecisionType.eYesNoDecision,  \u002F\u002F Tipo: Yes\u002FNo\n",[551,70680,70681,70684],{"class":553,"line":1797},[551,70682,70683],{},"            \"¿Desea continuar?\",",[551,70685,70686],{},"               \u002F\u002F Mensaje\n",[551,70688,70689,70692],{"class":553,"line":1802},[551,70690,70691],{},"            \"Confirmación\",",[551,70693,70694],{},"                    \u002F\u002F Título\n",[551,70696,70697],{"class":553,"line":1808},[551,70698,70699],{},"            EnumDecisionReturn.eYES,           \u002F\u002F Botón por defecto: Yes\n",[551,70701,70702],{"class":553,"line":1814},[551,70703,70704],{},"            EnumDecisionReturn.eNO             \u002F\u002F Si presiona Esc: No\n",[551,70706,70707],{"class":553,"line":1820},[551,70708,4758],{},[551,70710,70711],{"class":553,"line":1826},[551,70712,1139],{"emptyLinePlaceholder":238},[551,70714,70715],{"class":553,"line":1832},[551,70716,70717],{},"        \u002F\u002F Procesar la respuesta\n",[551,70719,70720],{"class":553,"line":1838},[551,70721,70722],{},"        switch (respuesta)\n",[551,70724,70725],{"class":553,"line":1844},[551,70726,9062],{},[551,70728,70729],{"class":553,"line":1850},[551,70730,70731],{},"            case EnumDecisionReturn.eYES:\n",[551,70733,70734],{"class":553,"line":1855},[551,70735,70736],{},"                MessageBox.Show(\"Usuario eligió: Sí\");\n",[551,70738,70739],{"class":553,"line":1861},[551,70740,20613],{},[551,70742,70743],{"class":553,"line":1867},[551,70744,1139],{"emptyLinePlaceholder":238},[551,70746,70747],{"class":553,"line":1873},[551,70748,70749],{},"            case EnumDecisionReturn.eNO:\n",[551,70751,70752],{"class":553,"line":1878},[551,70753,70754],{},"                MessageBox.Show(\"Usuario eligió: No\");\n",[551,70756,70757],{"class":553,"line":1883},[551,70758,20613],{},[551,70760,70761],{"class":553,"line":1888},[551,70762,9077],{},[551,70764,70765],{"class":553,"line":4615},[551,70766,1187],{},[551,70768,70769],{"class":553,"line":4620},[551,70770,1193],{},[13,70772,70773],{},[16,70774,1225],{},[85,70776,70777,70782,70785,70788,70797],{},[88,70778,70779,70780],{},"Crea una instancia de ",[54,70781,70375],{},[88,70783,70784],{},"Muestra un diálogo con botones \"Sí\" y \"No\"",[88,70786,70787],{},"El usuario elige",[88,70789,70790,70791,2854,70794],{},"Retorna ",[54,70792,70793],{},"EnumDecisionReturn.eYES",[54,70795,70796],{},"EnumDecisionReturn.eNO",[88,70798,70799,70800],{},"El código procesa la respuesta con ",[54,70801,15811],{},[43,70803],{},[46,70805,70807],{"id":70806},"_3-tipos-de-decisiones","3. Tipos de decisiones",[331,70809,70811],{"id":70810},"_31-enumdecisiontype","3.1 EnumDecisionType",[13,70813,70814],{},"EPLAN ofrece varios tipos de diálogos:",[6589,70816,70817,70829],{},[6592,70818,70819],{},[6595,70820,70821,70824,70827],{},[6598,70822,70823],{},"Tipo",[6598,70825,70826],{},"Botones que muestra",[6598,70828,67391],{},[6611,70830,70831,70844,70857,70870,70883,70896],{},[6595,70832,70833,70838,70841],{},[6616,70834,70835],{},[54,70836,70837],{},"eOkDecision",[6616,70839,70840],{},"OK",[6616,70842,70843],{},"Solo informar (sin decisión real)",[6595,70845,70846,70851,70854],{},[6616,70847,70848],{},[54,70849,70850],{},"eYesNoDecision",[6616,70852,70853],{},"Sí, No",[6616,70855,70856],{},"Pregunta simple con dos opciones",[6595,70858,70859,70864,70867],{},[6616,70860,70861],{},[54,70862,70863],{},"eYesNoCancelDecision",[6616,70865,70866],{},"Sí, No, Cancelar",[6616,70868,70869],{},"Tres opciones (guardar\u002Fno guardar\u002Fcancelar)",[6595,70871,70872,70877,70880],{},[6616,70873,70874],{},[54,70875,70876],{},"eYesAllNoAllDecision",[6616,70878,70879],{},"Sí, No, Sí a todo, No a todo",[6616,70881,70882],{},"Procesar múltiples elementos",[6595,70884,70885,70890,70893],{},[6616,70886,70887],{},[54,70888,70889],{},"eRetryCancelDecision",[6616,70891,70892],{},"Reintentar, Cancelar",[6616,70894,70895],{},"Después de un error",[6595,70897,70898,70903,70906],{},[6616,70899,70900],{},[54,70901,70902],{},"eOkCancelDecision",[6616,70904,70905],{},"OK, Cancelar",[6616,70907,70908],{},"Confirmación de acción",[331,70910,70912],{"id":70911},"_32-ejemplo-solo-ok-informativo","3.2 Ejemplo: Solo OK (informativo)",[543,70914,70916],{"className":545,"code":70915,"language":547,"meta":228,"style":228},"Decider decider = new Decider();\ndecider.Decide(\n    EnumDecisionType.eOkDecision,\n    \"El proceso se ha completado correctamente.\",\n    \"Información\",\n    EnumDecisionReturn.eOK,\n    EnumDecisionReturn.eOK\n);\n",[54,70917,70918,70922,70927,70932,70937,70942,70947,70952],{"__ignoreMap":228},[551,70919,70920],{"class":553,"line":554},[551,70921,70549],{},[551,70923,70924],{"class":553,"line":229},[551,70925,70926],{},"decider.Decide(\n",[551,70928,70929],{"class":553,"line":670},[551,70930,70931],{},"    EnumDecisionType.eOkDecision,\n",[551,70933,70934],{"class":553,"line":1136},[551,70935,70936],{},"    \"El proceso se ha completado correctamente.\",\n",[551,70938,70939],{"class":553,"line":1142},[551,70940,70941],{},"    \"Información\",\n",[551,70943,70944],{"class":553,"line":1148},[551,70945,70946],{},"    EnumDecisionReturn.eOK,\n",[551,70948,70949],{"class":553,"line":1154},[551,70950,70951],{},"    EnumDecisionReturn.eOK\n",[551,70953,70954],{"class":553,"line":1160},[551,70955,3967],{},[13,70957,70958,70960],{},[16,70959,60943],{}," Similar a MessageBox pero con estilo EPLAN.",[331,70962,70964],{"id":70963},"_33-ejemplo-yes-to-all-no-to-all","3.3 Ejemplo: Yes to All \u002F No to All",[543,70966,70968],{"className":545,"code":70967,"language":547,"meta":228,"style":228},"Decider decider = new Decider();\nEnumDecisionReturn respuesta = decider.Decide(\n    EnumDecisionType.eYesAllNoAllDecision,\n    \"¿Procesar este elemento?\",\n    \"Procesando lote\",\n    EnumDecisionReturn.eYES,\n    EnumDecisionReturn.eNO\n);\n\nswitch (respuesta)\n{\n    case EnumDecisionReturn.eYES:\n        \u002F\u002F Procesar este elemento solamente\n        break;\n\n    case EnumDecisionReturn.eNO:\n        \u002F\u002F Saltar este elemento solamente\n        break;\n\n    case EnumDecisionReturn.eYES_ALL:\n        \u002F\u002F Procesar este Y todos los siguientes sin preguntar\n        break;\n\n    case EnumDecisionReturn.eNO_ALL:\n        \u002F\u002F Saltar este Y todos los siguientes sin preguntar\n        break;\n}\n",[54,70969,70970,70974,70978,70983,70988,70993,70998,71003,71007,71011,71016,71020,71025,71030,71034,71038,71043,71048,71052,71056,71061,71066,71070,71074,71079,71084,71088],{"__ignoreMap":228},[551,70971,70972],{"class":553,"line":554},[551,70973,70549],{},[551,70975,70976],{"class":553,"line":229},[551,70977,70554],{},[551,70979,70980],{"class":553,"line":670},[551,70981,70982],{},"    EnumDecisionType.eYesAllNoAllDecision,\n",[551,70984,70985],{"class":553,"line":1136},[551,70986,70987],{},"    \"¿Procesar este elemento?\",\n",[551,70989,70990],{"class":553,"line":1142},[551,70991,70992],{},"    \"Procesando lote\",\n",[551,70994,70995],{"class":553,"line":1148},[551,70996,70997],{},"    EnumDecisionReturn.eYES,\n",[551,70999,71000],{"class":553,"line":1154},[551,71001,71002],{},"    EnumDecisionReturn.eNO\n",[551,71004,71005],{"class":553,"line":1160},[551,71006,3967],{},[551,71008,71009],{"class":553,"line":1166},[551,71010,1139],{"emptyLinePlaceholder":238},[551,71012,71013],{"class":553,"line":1172},[551,71014,71015],{},"switch (respuesta)\n",[551,71017,71018],{"class":553,"line":1178},[551,71019,1151],{},[551,71021,71022],{"class":553,"line":1184},[551,71023,71024],{},"    case EnumDecisionReturn.eYES:\n",[551,71026,71027],{"class":553,"line":1190},[551,71028,71029],{},"        \u002F\u002F Procesar este elemento solamente\n",[551,71031,71032],{"class":553,"line":1472},[551,71033,15907],{},[551,71035,71036],{"class":553,"line":1477},[551,71037,1139],{"emptyLinePlaceholder":238},[551,71039,71040],{"class":553,"line":1797},[551,71041,71042],{},"    case EnumDecisionReturn.eNO:\n",[551,71044,71045],{"class":553,"line":1802},[551,71046,71047],{},"        \u002F\u002F Saltar este elemento solamente\n",[551,71049,71050],{"class":553,"line":1808},[551,71051,15907],{},[551,71053,71054],{"class":553,"line":1814},[551,71055,1139],{"emptyLinePlaceholder":238},[551,71057,71058],{"class":553,"line":1820},[551,71059,71060],{},"    case EnumDecisionReturn.eYES_ALL:\n",[551,71062,71063],{"class":553,"line":1826},[551,71064,71065],{},"        \u002F\u002F Procesar este Y todos los siguientes sin preguntar\n",[551,71067,71068],{"class":553,"line":1832},[551,71069,15907],{},[551,71071,71072],{"class":553,"line":1838},[551,71073,1139],{"emptyLinePlaceholder":238},[551,71075,71076],{"class":553,"line":1844},[551,71077,71078],{},"    case EnumDecisionReturn.eNO_ALL:\n",[551,71080,71081],{"class":553,"line":1850},[551,71082,71083],{},"        \u002F\u002F Saltar este Y todos los siguientes sin preguntar\n",[551,71085,71086],{"class":553,"line":1855},[551,71087,15907],{},[551,71089,71090],{"class":553,"line":1861},[551,71091,1193],{},[13,71093,71094,71096],{},[16,71095,60943],{}," Procesar listas o lotes donde el usuario puede querer aplicar la misma decisión a todos.",[43,71098],{},[46,71100,71102],{"id":71101},"_4-parámetros-avanzados-de-decide","4. Parámetros avanzados de Decide()",[331,71104,71106],{"id":71105},"_41-versión-completa-con-todos-los-parámetros","4.1 Versión completa con todos los parámetros",[543,71108,71110],{"className":545,"code":71109,"language":547,"meta":228,"style":228},"EnumDecisionReturn respuesta = decider.Decide(\n    tipoDecision,              \u002F\u002F EnumDecisionType\n    mensaje,                   \u002F\u002F string: Texto a mostrar\n    titulo,                    \u002F\u002F string: Título del diálogo\n    valorPorDefecto,           \u002F\u002F EnumDecisionReturn: Botón seleccionado por defecto\n    valorSiEsc,                \u002F\u002F EnumDecisionReturn: Qué retornar si presiona Esc\n    nombreSetting,             \u002F\u002F string: Nombre del setting para persistir (opcional)\n    mostrarCheckbox,           \u002F\u002F bool: Mostrar checkbox \"No volver a mostrar\" (opcional)\n    icono                      \u002F\u002F EnumDecisionIcon: Icono a mostrar (opcional)\n);\n",[54,71111,71112,71116,71121,71126,71131,71136,71141,71146,71151,71156],{"__ignoreMap":228},[551,71113,71114],{"class":553,"line":554},[551,71115,70554],{},[551,71117,71118],{"class":553,"line":229},[551,71119,71120],{},"    tipoDecision,              \u002F\u002F EnumDecisionType\n",[551,71122,71123],{"class":553,"line":670},[551,71124,71125],{},"    mensaje,                   \u002F\u002F string: Texto a mostrar\n",[551,71127,71128],{"class":553,"line":1136},[551,71129,71130],{},"    titulo,                    \u002F\u002F string: Título del diálogo\n",[551,71132,71133],{"class":553,"line":1142},[551,71134,71135],{},"    valorPorDefecto,           \u002F\u002F EnumDecisionReturn: Botón seleccionado por defecto\n",[551,71137,71138],{"class":553,"line":1148},[551,71139,71140],{},"    valorSiEsc,                \u002F\u002F EnumDecisionReturn: Qué retornar si presiona Esc\n",[551,71142,71143],{"class":553,"line":1154},[551,71144,71145],{},"    nombreSetting,             \u002F\u002F string: Nombre del setting para persistir (opcional)\n",[551,71147,71148],{"class":553,"line":1160},[551,71149,71150],{},"    mostrarCheckbox,           \u002F\u002F bool: Mostrar checkbox \"No volver a mostrar\" (opcional)\n",[551,71152,71153],{"class":553,"line":1166},[551,71154,71155],{},"    icono                      \u002F\u002F EnumDecisionIcon: Icono a mostrar (opcional)\n",[551,71157,71158],{"class":553,"line":1172},[551,71159,3967],{},[331,71161,71163],{"id":71162},"_42-ejemplo-con-icono-y-checkbox","4.2 Ejemplo con icono y checkbox",[13,71165,71166],{},"Del script oficial:",[543,71168,71170],{"className":545,"code":71169,"language":547,"meta":228,"style":228},"Decider decider = new Decider();\nEnumDecisionReturn respuesta = decider.Decide(\n    EnumDecisionType.eRetryCancelDecision,\n    \"Se produjo un error al conectar.\\n\\n¿Reintentar?\",\n    \"Error de conexión\",\n    EnumDecisionReturn.eRETRY,\n    EnumDecisionReturn.eCANCEL,\n    \"ConexionErrorSetting\",        \u002F\u002F Nombre del setting\n    true,                          \u002F\u002F Mostrar checkbox\n    EnumDecisionIcon.eQUESTION     \u002F\u002F Icono de pregunta\n);\n\nif (respuesta == EnumDecisionReturn.eRETRY)\n{\n    \u002F\u002F Reintentar conexión\n}\nelse\n{\n    \u002F\u002F Cancelar operación\n}\n",[54,71171,71172,71176,71180,71185,71190,71195,71200,71205,71213,71218,71223,71227,71231,71236,71240,71245,71249,71253,71257,71262],{"__ignoreMap":228},[551,71173,71174],{"class":553,"line":554},[551,71175,70549],{},[551,71177,71178],{"class":553,"line":229},[551,71179,70554],{},[551,71181,71182],{"class":553,"line":670},[551,71183,71184],{},"    EnumDecisionType.eRetryCancelDecision,\n",[551,71186,71187],{"class":553,"line":1136},[551,71188,71189],{},"    \"Se produjo un error al conectar.\\n\\n¿Reintentar?\",\n",[551,71191,71192],{"class":553,"line":1142},[551,71193,71194],{},"    \"Error de conexión\",\n",[551,71196,71197],{"class":553,"line":1148},[551,71198,71199],{},"    EnumDecisionReturn.eRETRY,\n",[551,71201,71202],{"class":553,"line":1154},[551,71203,71204],{},"    EnumDecisionReturn.eCANCEL,\n",[551,71206,71207,71210],{"class":553,"line":1160},[551,71208,71209],{},"    \"ConexionErrorSetting\",",[551,71211,71212],{},"        \u002F\u002F Nombre del setting\n",[551,71214,71215],{"class":553,"line":1166},[551,71216,71217],{},"    true,                          \u002F\u002F Mostrar checkbox\n",[551,71219,71220],{"class":553,"line":1172},[551,71221,71222],{},"    EnumDecisionIcon.eQUESTION     \u002F\u002F Icono de pregunta\n",[551,71224,71225],{"class":553,"line":1178},[551,71226,3967],{},[551,71228,71229],{"class":553,"line":1184},[551,71230,1139],{"emptyLinePlaceholder":238},[551,71232,71233],{"class":553,"line":1190},[551,71234,71235],{},"if (respuesta == EnumDecisionReturn.eRETRY)\n",[551,71237,71238],{"class":553,"line":1472},[551,71239,1151],{},[551,71241,71242],{"class":553,"line":1477},[551,71243,71244],{},"    \u002F\u002F Reintentar conexión\n",[551,71246,71247],{"class":553,"line":1797},[551,71248,1193],{},[551,71250,71251],{"class":553,"line":1802},[551,71252,3704],{},[551,71254,71255],{"class":553,"line":1808},[551,71256,1151],{},[551,71258,71259],{"class":553,"line":1814},[551,71260,71261],{},"    \u002F\u002F Cancelar operación\n",[551,71263,71264],{"class":553,"line":1820},[551,71265,1193],{},[13,71267,71268],{},[16,71269,124],{},[126,71271,71272,71277,71283],{},[88,71273,71274,71276],{},[16,71275,70484],{},": Si el usuario marca \"No volver a mostrar\", EPLAN recuerda su elección",[88,71278,71279,71282],{},[16,71280,71281],{},"Icono",": Personaliza el icono (Question, Warning, Error, Information)",[88,71284,71285,71288,71289],{},[16,71286,71287],{},"Setting",": La preferencia se guarda con nombre ",[54,71290,71291],{},"ConexionErrorSetting",[43,71293],{},[46,71295,71297],{"id":71296},"_5-aplicación-práctica-en-eplan","5. Aplicación práctica en EPLAN",[331,71299,71301],{"id":71300},"_51-confirmar-antes-de-ejecutar-acción-destructiva","5.1 Confirmar antes de ejecutar acción destructiva",[543,71303,71305],{"className":545,"code":71304,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ConfirmarAccion\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Preguntar al usuario\n        Decider decider = new Decider();\n        EnumDecisionReturn respuesta = decider.Decide(\n            EnumDecisionType.eYesNoDecision,\n            \"Esta acción eliminará la numeración del proyecto.\\n\\n¿Desea continuar?\",\n            \"Confirmación\",\n            EnumDecisionReturn.eNO,  \u002F\u002F Por defecto: No (seguro)\n            EnumDecisionReturn.eNO\n        );\n\n        if (respuesta == EnumDecisionReturn.eYES)\n        {\n            \u002F\u002F Usuario confirmó, ejecutar acción\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n            cli.Execute(\"XPrjActionRemoveNumerations\");\n\n            MessageBox.Show(\n                \"Numeración eliminada correctamente\",\n                \"Éxito\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        else\n        {\n            \u002F\u002F Usuario canceló\n            MessageBox.Show(\"Acción cancelada por el usuario\");\n        }\n    }\n}\n",[54,71306,71307,71311,71315,71319,71323,71327,71332,71336,71340,71344,71348,71352,71356,71360,71365,71370,71375,71380,71385,71389,71393,71398,71402,71407,71411,71416,71420,71424,71429,71434,71438,71442,71446,71450,71454,71458,71463,71468,71472,71476],{"__ignoreMap":228},[551,71308,71309],{"class":553,"line":554},[551,71310,1128],{},[551,71312,71313],{"class":553,"line":229},[551,71314,1133],{},[551,71316,71317],{"class":553,"line":670},[551,71318,49898],{},[551,71320,71321],{"class":553,"line":1136},[551,71322,50105],{},[551,71324,71325],{"class":553,"line":1142},[551,71326,1139],{"emptyLinePlaceholder":238},[551,71328,71329],{"class":553,"line":1148},[551,71330,71331],{},"public class ConfirmarAccion\n",[551,71333,71334],{"class":553,"line":1154},[551,71335,1151],{},[551,71337,71338],{"class":553,"line":1160},[551,71339,1157],{},[551,71341,71342],{"class":553,"line":1166},[551,71343,57216],{},[551,71345,71346],{"class":553,"line":1172},[551,71347,1169],{},[551,71349,71350],{"class":553,"line":1178},[551,71351,55609],{},[551,71353,71354],{"class":553,"line":1184},[551,71355,70659],{},[551,71357,71358],{"class":553,"line":1190},[551,71359,70673],{},[551,71361,71362],{"class":553,"line":1472},[551,71363,71364],{},"            EnumDecisionType.eYesNoDecision,\n",[551,71366,71367],{"class":553,"line":1477},[551,71368,71369],{},"            \"Esta acción eliminará la numeración del proyecto.\\n\\n¿Desea continuar?\",\n",[551,71371,71372],{"class":553,"line":1797},[551,71373,71374],{},"            \"Confirmación\",\n",[551,71376,71377],{"class":553,"line":1802},[551,71378,71379],{},"            EnumDecisionReturn.eNO,  \u002F\u002F Por defecto: No (seguro)\n",[551,71381,71382],{"class":553,"line":1808},[551,71383,71384],{},"            EnumDecisionReturn.eNO\n",[551,71386,71387],{"class":553,"line":1814},[551,71388,4758],{},[551,71390,71391],{"class":553,"line":1820},[551,71392,1139],{"emptyLinePlaceholder":238},[551,71394,71395],{"class":553,"line":1826},[551,71396,71397],{},"        if (respuesta == EnumDecisionReturn.eYES)\n",[551,71399,71400],{"class":553,"line":1832},[551,71401,9062],{},[551,71403,71404],{"class":553,"line":1838},[551,71405,71406],{},"            \u002F\u002F Usuario confirmó, ejecutar acción\n",[551,71408,71409],{"class":553,"line":1844},[551,71410,55695],{},[551,71412,71413],{"class":553,"line":1850},[551,71414,71415],{},"            cli.Execute(\"XPrjActionRemoveNumerations\");\n",[551,71417,71418],{"class":553,"line":1855},[551,71419,1139],{"emptyLinePlaceholder":238},[551,71421,71422],{"class":553,"line":1861},[551,71423,53598],{},[551,71425,71426],{"class":553,"line":1867},[551,71427,71428],{},"                \"Numeración eliminada correctamente\",\n",[551,71430,71431],{"class":553,"line":1873},[551,71432,71433],{},"                \"Éxito\",\n",[551,71435,71436],{"class":553,"line":1878},[551,71437,53613],{},[551,71439,71440],{"class":553,"line":1883},[551,71441,53618],{},[551,71443,71444],{"class":553,"line":1888},[551,71445,53623],{},[551,71447,71448],{"class":553,"line":4615},[551,71449,9077],{},[551,71451,71452],{"class":553,"line":4620},[551,71453,9082],{},[551,71455,71456],{"class":553,"line":4626},[551,71457,9062],{},[551,71459,71460],{"class":553,"line":4631},[551,71461,71462],{},"            \u002F\u002F Usuario canceló\n",[551,71464,71465],{"class":553,"line":4636},[551,71466,71467],{},"            MessageBox.Show(\"Acción cancelada por el usuario\");\n",[551,71469,71470],{"class":553,"line":4641},[551,71471,9077],{},[551,71473,71474],{"class":553,"line":4647},[551,71475,1187],{},[551,71477,71478],{"class":553,"line":4653},[551,71479,1193],{},[331,71481,71483],{"id":71482},"_52-procesar-lote-con-yes-to-all","5.2 Procesar lote con \"Yes to All\"",[543,71485,71487],{"className":545,"code":71486,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\nusing System.Windows.Forms;\n\npublic class ProcesarLote\n{\n    [Start]\n    public void Function()\n    {\n        string[] paginas = { \"Página 1\", \"Página 2\", \"Página 3\", \"Página 4\", \"Página 5\" };\n\n        bool procesarTodas = false;\n        bool saltarTodas = false;\n\n        foreach (string pagina in paginas)\n        {\n            \u002F\u002F Si el usuario ya eligió \"Sí a todo\" o \"No a todo\", no preguntar más\n            if (!procesarTodas && !saltarTodas)\n            {\n                Decider decider = new Decider();\n                EnumDecisionReturn respuesta = decider.Decide(\n                    EnumDecisionType.eYesAllNoAllDecision,\n                    \"¿Procesar \" + pagina + \"?\",\n                    \"Procesando lote\",\n                    EnumDecisionReturn.eYES,\n                    EnumDecisionReturn.eNO\n                );\n\n                switch (respuesta)\n                {\n                    case EnumDecisionReturn.eYES:\n                        \u002F\u002F Procesar solo esta\n                        ProcesarPagina(pagina);\n                        break;\n\n                    case EnumDecisionReturn.eNO:\n                        \u002F\u002F Saltar solo esta\n                        break;\n\n                    case EnumDecisionReturn.eYES_ALL:\n                        \u002F\u002F Procesar esta y todas las siguientes\n                        procesarTodas = true;\n                        ProcesarPagina(pagina);\n                        break;\n\n                    case EnumDecisionReturn.eNO_ALL:\n                        \u002F\u002F Saltar esta y todas las siguientes\n                        saltarTodas = true;\n                        break;\n                }\n            }\n            else if (procesarTodas)\n            {\n                \u002F\u002F Usuario eligió \"Sí a todo\", procesar sin preguntar\n                ProcesarPagina(pagina);\n            }\n            \u002F\u002F Si saltarTodas == true, simplemente no hacer nada\n        }\n\n        MessageBox.Show(\"Procesamiento de lote completado\");\n    }\n\n    private void ProcesarPagina(string pagina)\n    {\n        new BaseException(\n            \"Procesando: \" + pagina,\n            MessageLevel.Message\n        ).FixMessage();\n\n        \u002F\u002F Aquí iría la lógica real de procesamiento\n        System.Threading.Thread.Sleep(500);\n    }\n}\n",[54,71488,71489,71493,71497,71501,71505,71509,71513,71517,71521,71525,71530,71534,71539,71544,71548,71553,71557,71562,71567,71571,71576,71581,71586,71591,71596,71601,71606,71610,71614,71619,71623,71628,71633,71638,71643,71647,71652,71657,71661,71665,71670,71675,71680,71684,71688,71692,71697,71702,71707,71711,71715,71719,71724,71728,71733,71738,71742,71747,71751,71755,71760,71764,71768,71773,71777,71781,71786,71790,71794,71798,71803,71808,71812],{"__ignoreMap":228},[551,71490,71491],{"class":553,"line":554},[551,71492,1128],{},[551,71494,71495],{"class":553,"line":229},[551,71496,49898],{},[551,71498,71499],{"class":553,"line":670},[551,71500,50105],{},[551,71502,71503],{"class":553,"line":1136},[551,71504,1139],{"emptyLinePlaceholder":238},[551,71506,71507],{"class":553,"line":1142},[551,71508,68178],{},[551,71510,71511],{"class":553,"line":1148},[551,71512,1151],{},[551,71514,71515],{"class":553,"line":1154},[551,71516,1157],{},[551,71518,71519],{"class":553,"line":1160},[551,71520,57216],{},[551,71522,71523],{"class":553,"line":1166},[551,71524,1169],{},[551,71526,71527],{"class":553,"line":1172},[551,71528,71529],{},"        string[] paginas = { \"Página 1\", \"Página 2\", \"Página 3\", \"Página 4\", \"Página 5\" };\n",[551,71531,71532],{"class":553,"line":1178},[551,71533,1139],{"emptyLinePlaceholder":238},[551,71535,71536],{"class":553,"line":1184},[551,71537,71538],{},"        bool procesarTodas = false;\n",[551,71540,71541],{"class":553,"line":1190},[551,71542,71543],{},"        bool saltarTodas = false;\n",[551,71545,71546],{"class":553,"line":1472},[551,71547,1139],{"emptyLinePlaceholder":238},[551,71549,71550],{"class":553,"line":1477},[551,71551,71552],{},"        foreach (string pagina in paginas)\n",[551,71554,71555],{"class":553,"line":1797},[551,71556,9062],{},[551,71558,71559],{"class":553,"line":1802},[551,71560,71561],{},"            \u002F\u002F Si el usuario ya eligió \"Sí a todo\" o \"No a todo\", no preguntar más\n",[551,71563,71564],{"class":553,"line":1808},[551,71565,71566],{},"            if (!procesarTodas && !saltarTodas)\n",[551,71568,71569],{"class":553,"line":1814},[551,71570,12301],{},[551,71572,71573],{"class":553,"line":1820},[551,71574,71575],{},"                Decider decider = new Decider();\n",[551,71577,71578],{"class":553,"line":1826},[551,71579,71580],{},"                EnumDecisionReturn respuesta = decider.Decide(\n",[551,71582,71583],{"class":553,"line":1832},[551,71584,71585],{},"                    EnumDecisionType.eYesAllNoAllDecision,\n",[551,71587,71588],{"class":553,"line":1838},[551,71589,71590],{},"                    \"¿Procesar \" + pagina + \"?\",\n",[551,71592,71593],{"class":553,"line":1844},[551,71594,71595],{},"                    \"Procesando lote\",\n",[551,71597,71598],{"class":553,"line":1850},[551,71599,71600],{},"                    EnumDecisionReturn.eYES,\n",[551,71602,71603],{"class":553,"line":1855},[551,71604,71605],{},"                    EnumDecisionReturn.eNO\n",[551,71607,71608],{"class":553,"line":1861},[551,71609,21424],{},[551,71611,71612],{"class":553,"line":1867},[551,71613,1139],{"emptyLinePlaceholder":238},[551,71615,71616],{"class":553,"line":1873},[551,71617,71618],{},"                switch (respuesta)\n",[551,71620,71621],{"class":553,"line":1878},[551,71622,28010],{},[551,71624,71625],{"class":553,"line":1883},[551,71626,71627],{},"                    case EnumDecisionReturn.eYES:\n",[551,71629,71630],{"class":553,"line":1888},[551,71631,71632],{},"                        \u002F\u002F Procesar solo esta\n",[551,71634,71635],{"class":553,"line":4615},[551,71636,71637],{},"                        ProcesarPagina(pagina);\n",[551,71639,71640],{"class":553,"line":4620},[551,71641,71642],{},"                        break;\n",[551,71644,71645],{"class":553,"line":4626},[551,71646,1139],{"emptyLinePlaceholder":238},[551,71648,71649],{"class":553,"line":4631},[551,71650,71651],{},"                    case EnumDecisionReturn.eNO:\n",[551,71653,71654],{"class":553,"line":4636},[551,71655,71656],{},"                        \u002F\u002F Saltar solo esta\n",[551,71658,71659],{"class":553,"line":4641},[551,71660,71642],{},[551,71662,71663],{"class":553,"line":4647},[551,71664,1139],{"emptyLinePlaceholder":238},[551,71666,71667],{"class":553,"line":4653},[551,71668,71669],{},"                    case EnumDecisionReturn.eYES_ALL:\n",[551,71671,71672],{"class":553,"line":4659},[551,71673,71674],{},"                        \u002F\u002F Procesar esta y todas las siguientes\n",[551,71676,71677],{"class":553,"line":4665},[551,71678,71679],{},"                        procesarTodas = true;\n",[551,71681,71682],{"class":553,"line":4671},[551,71683,71637],{},[551,71685,71686],{"class":553,"line":4677},[551,71687,71642],{},[551,71689,71690],{"class":553,"line":4683},[551,71691,1139],{"emptyLinePlaceholder":238},[551,71693,71694],{"class":553,"line":4689},[551,71695,71696],{},"                    case EnumDecisionReturn.eNO_ALL:\n",[551,71698,71699],{"class":553,"line":4695},[551,71700,71701],{},"                        \u002F\u002F Saltar esta y todas las siguientes\n",[551,71703,71704],{"class":553,"line":4701},[551,71705,71706],{},"                        saltarTodas = true;\n",[551,71708,71709],{"class":553,"line":4707},[551,71710,71642],{},[551,71712,71713],{"class":553,"line":4713},[551,71714,28025],{},[551,71716,71717],{"class":553,"line":4719},[551,71718,12311],{},[551,71720,71721],{"class":553,"line":4725},[551,71722,71723],{},"            else if (procesarTodas)\n",[551,71725,71726],{"class":553,"line":4731},[551,71727,12301],{},[551,71729,71730],{"class":553,"line":4737},[551,71731,71732],{},"                \u002F\u002F Usuario eligió \"Sí a todo\", procesar sin preguntar\n",[551,71734,71735],{"class":553,"line":4743},[551,71736,71737],{},"                ProcesarPagina(pagina);\n",[551,71739,71740],{"class":553,"line":4749},[551,71741,12311],{},[551,71743,71744],{"class":553,"line":4755},[551,71745,71746],{},"            \u002F\u002F Si saltarTodas == true, simplemente no hacer nada\n",[551,71748,71749],{"class":553,"line":4761},[551,71750,9077],{},[551,71752,71753],{"class":553,"line":4766},[551,71754,1139],{"emptyLinePlaceholder":238},[551,71756,71757],{"class":553,"line":4771},[551,71758,71759],{},"        MessageBox.Show(\"Procesamiento de lote completado\");\n",[551,71761,71762],{"class":553,"line":4777},[551,71763,1187],{},[551,71765,71766],{"class":553,"line":4782},[551,71767,1139],{"emptyLinePlaceholder":238},[551,71769,71770],{"class":553,"line":4787},[551,71771,71772],{},"    private void ProcesarPagina(string pagina)\n",[551,71774,71775],{"class":553,"line":4793},[551,71776,1169],{},[551,71778,71779],{"class":553,"line":4799},[551,71780,51279],{},[551,71782,71783],{"class":553,"line":4805},[551,71784,71785],{},"            \"Procesando: \" + pagina,\n",[551,71787,71788],{"class":553,"line":4811},[551,71789,51289],{},[551,71791,71792],{"class":553,"line":4817},[551,71793,51294],{},[551,71795,71796],{"class":553,"line":4822},[551,71797,1139],{"emptyLinePlaceholder":238},[551,71799,71800],{"class":553,"line":4827},[551,71801,71802],{},"        \u002F\u002F Aquí iría la lógica real de procesamiento\n",[551,71804,71805],{"class":553,"line":9183},[551,71806,71807],{},"        System.Threading.Thread.Sleep(500);\n",[551,71809,71810],{"class":553,"line":9188},[551,71811,1187],{},[551,71813,71814],{"class":553,"line":9193},[551,71815,1193],{},[13,71817,71818,71820],{},[16,71819,56969],{}," El usuario puede procesar todo el lote sin tener que confirmar cada elemento individualmente.",[43,71822],{},[46,71824,71826],{"id":71825},"_6-buenas-prácticas","6. Buenas prácticas",[331,71828,71830],{"id":71829},"_61-valor-por-defecto-seguro","6.1 Valor por defecto seguro",[543,71832,71834],{"className":545,"code":71833,"language":547,"meta":228,"style":228},"\u002F\u002F ✅ Bien - Acción destructiva: Por defecto NO\ndecider.Decide(\n    EnumDecisionType.eYesNoDecision,\n    \"¿Eliminar todos los datos?\",\n    \"Advertencia\",\n    EnumDecisionReturn.eNO,  \u002F\u002F Por defecto: No\n    EnumDecisionReturn.eNO\n);\n\n\u002F\u002F ❌ Mal - Acción destructiva: Por defecto SÍ (peligroso)\ndecider.Decide(\n    EnumDecisionType.eYesNoDecision,\n    \"¿Eliminar todos los datos?\",\n    \"Advertencia\",\n    EnumDecisionReturn.eYES,  \u002F\u002F ⚠️ Peligroso\n    EnumDecisionReturn.eYES\n);\n",[54,71835,71836,71841,71845,71850,71855,71860,71865,71869,71873,71877,71882,71886,71890,71894,71898,71903,71908],{"__ignoreMap":228},[551,71837,71838],{"class":553,"line":554},[551,71839,71840],{},"\u002F\u002F ✅ Bien - Acción destructiva: Por defecto NO\n",[551,71842,71843],{"class":553,"line":229},[551,71844,70926],{},[551,71846,71847],{"class":553,"line":670},[551,71848,71849],{},"    EnumDecisionType.eYesNoDecision,\n",[551,71851,71852],{"class":553,"line":1136},[551,71853,71854],{},"    \"¿Eliminar todos los datos?\",\n",[551,71856,71857],{"class":553,"line":1142},[551,71858,71859],{},"    \"Advertencia\",\n",[551,71861,71862],{"class":553,"line":1148},[551,71863,71864],{},"    EnumDecisionReturn.eNO,  \u002F\u002F Por defecto: No\n",[551,71866,71867],{"class":553,"line":1154},[551,71868,71002],{},[551,71870,71871],{"class":553,"line":1160},[551,71872,3967],{},[551,71874,71875],{"class":553,"line":1166},[551,71876,1139],{"emptyLinePlaceholder":238},[551,71878,71879],{"class":553,"line":1172},[551,71880,71881],{},"\u002F\u002F ❌ Mal - Acción destructiva: Por defecto SÍ (peligroso)\n",[551,71883,71884],{"class":553,"line":1178},[551,71885,70926],{},[551,71887,71888],{"class":553,"line":1184},[551,71889,71849],{},[551,71891,71892],{"class":553,"line":1190},[551,71893,71854],{},[551,71895,71896],{"class":553,"line":1472},[551,71897,71859],{},[551,71899,71900],{"class":553,"line":1477},[551,71901,71902],{},"    EnumDecisionReturn.eYES,  \u002F\u002F ⚠️ Peligroso\n",[551,71904,71905],{"class":553,"line":1797},[551,71906,71907],{},"    EnumDecisionReturn.eYES\n",[551,71909,71910],{"class":553,"line":1802},[551,71911,3967],{},[13,71913,71914,71917],{},[16,71915,71916],{},"Regla:"," Para acciones destructivas o irreversibles, el botón por defecto debe ser el más seguro (No\u002FCancelar).",[331,71919,71921],{"id":71920},"_62-mensajes-claros-y-concisos","6.2 Mensajes claros y concisos",[543,71923,71925],{"className":545,"code":71924,"language":547,"meta":228,"style":228},"\u002F\u002F ✅ Bien - Mensaje claro y específico\ndecider.Decide(\n    EnumDecisionType.eYesNoDecision,\n    \"Se eliminarán 15 páginas sin componentes.\\n\\n¿Continuar?\",\n    \"Confirmar eliminación\",\n    EnumDecisionReturn.eNO,\n    EnumDecisionReturn.eNO\n);\n\n\u002F\u002F ❌ Mal - Mensaje vago\ndecider.Decide(\n    EnumDecisionType.eYesNoDecision,\n    \"¿Continuar?\",  \u002F\u002F ¿Continuar con qué?\n    \"Pregunta\",\n    EnumDecisionReturn.eYES,\n    EnumDecisionReturn.eNO\n);\n",[54,71926,71927,71932,71936,71940,71945,71950,71955,71959,71963,71967,71972,71976,71980,71988,71992,71996,72000],{"__ignoreMap":228},[551,71928,71929],{"class":553,"line":554},[551,71930,71931],{},"\u002F\u002F ✅ Bien - Mensaje claro y específico\n",[551,71933,71934],{"class":553,"line":229},[551,71935,70926],{},[551,71937,71938],{"class":553,"line":670},[551,71939,71849],{},[551,71941,71942],{"class":553,"line":1136},[551,71943,71944],{},"    \"Se eliminarán 15 páginas sin componentes.\\n\\n¿Continuar?\",\n",[551,71946,71947],{"class":553,"line":1142},[551,71948,71949],{},"    \"Confirmar eliminación\",\n",[551,71951,71952],{"class":553,"line":1148},[551,71953,71954],{},"    EnumDecisionReturn.eNO,\n",[551,71956,71957],{"class":553,"line":1154},[551,71958,71002],{},[551,71960,71961],{"class":553,"line":1160},[551,71962,3967],{},[551,71964,71965],{"class":553,"line":1166},[551,71966,1139],{"emptyLinePlaceholder":238},[551,71968,71969],{"class":553,"line":1172},[551,71970,71971],{},"\u002F\u002F ❌ Mal - Mensaje vago\n",[551,71973,71974],{"class":553,"line":1178},[551,71975,70926],{},[551,71977,71978],{"class":553,"line":1184},[551,71979,71849],{},[551,71981,71982,71985],{"class":553,"line":1190},[551,71983,71984],{},"    \"¿Continuar?\",",[551,71986,71987],{},"  \u002F\u002F ¿Continuar con qué?\n",[551,71989,71990],{"class":553,"line":1472},[551,71991,70338],{},[551,71993,71994],{"class":553,"line":1477},[551,71995,70997],{},[551,71997,71998],{"class":553,"line":1797},[551,71999,71002],{},[551,72001,72002],{"class":553,"line":1802},[551,72003,3967],{},[331,72005,72007],{"id":72006},"_63-usar-switch-para-múltiples-opciones","6.3 Usar switch para múltiples opciones",[543,72009,72011],{"className":545,"code":72010,"language":547,"meta":228,"style":228},"\u002F\u002F ✅ Bien - Switch completo\nswitch (respuesta)\n{\n    case EnumDecisionReturn.eYES:\n        \u002F\u002F ...\n        break;\n    case EnumDecisionReturn.eNO:\n        \u002F\u002F ...\n        break;\n    case EnumDecisionReturn.eYES_ALL:\n        \u002F\u002F ...\n        break;\n    case EnumDecisionReturn.eNO_ALL:\n        \u002F\u002F ...\n        break;\n}\n\n\u002F\u002F ❌ Mal - Solo if (puede olvidar casos)\nif (respuesta == EnumDecisionReturn.eYES)\n{\n    \u002F\u002F ¿Qué pasa con YES_ALL?\n}\n",[54,72012,72013,72018,72022,72026,72030,72034,72038,72042,72046,72050,72054,72058,72062,72066,72070,72074,72078,72082,72087,72092,72096,72101],{"__ignoreMap":228},[551,72014,72015],{"class":553,"line":554},[551,72016,72017],{},"\u002F\u002F ✅ Bien - Switch completo\n",[551,72019,72020],{"class":553,"line":229},[551,72021,71015],{},[551,72023,72024],{"class":553,"line":670},[551,72025,1151],{},[551,72027,72028],{"class":553,"line":1136},[551,72029,71024],{},[551,72031,72032],{"class":553,"line":1142},[551,72033,22204],{},[551,72035,72036],{"class":553,"line":1148},[551,72037,15907],{},[551,72039,72040],{"class":553,"line":1154},[551,72041,71042],{},[551,72043,72044],{"class":553,"line":1160},[551,72045,22204],{},[551,72047,72048],{"class":553,"line":1166},[551,72049,15907],{},[551,72051,72052],{"class":553,"line":1172},[551,72053,71060],{},[551,72055,72056],{"class":553,"line":1178},[551,72057,22204],{},[551,72059,72060],{"class":553,"line":1184},[551,72061,15907],{},[551,72063,72064],{"class":553,"line":1190},[551,72065,71078],{},[551,72067,72068],{"class":553,"line":1472},[551,72069,22204],{},[551,72071,72072],{"class":553,"line":1477},[551,72073,15907],{},[551,72075,72076],{"class":553,"line":1797},[551,72077,1193],{},[551,72079,72080],{"class":553,"line":1802},[551,72081,1139],{"emptyLinePlaceholder":238},[551,72083,72084],{"class":553,"line":1808},[551,72085,72086],{},"\u002F\u002F ❌ Mal - Solo if (puede olvidar casos)\n",[551,72088,72089],{"class":553,"line":1814},[551,72090,72091],{},"if (respuesta == EnumDecisionReturn.eYES)\n",[551,72093,72094],{"class":553,"line":1820},[551,72095,1151],{},[551,72097,72098],{"class":553,"line":1826},[551,72099,72100],{},"    \u002F\u002F ¿Qué pasa con YES_ALL?\n",[551,72102,72103],{"class":553,"line":1832},[551,72104,1193],{},[43,72106],{},[46,72108,22685],{"id":22684},[13,72110,72111,72113],{},[16,72112,70375],{}," es la forma nativa de EPLAN para mostrar diálogos de decisión al usuario.",[13,72115,72116],{},[16,72117,66822],{},[126,72119,72120,72123,72129,72135],{},[88,72121,72122],{},"Alternativa a MessageBox con funcionalidades EPLAN-específicas",[88,72124,72125,72126],{},"Creas una instancia: ",[54,72127,72128],{},"Decider decider = new Decider();",[88,72130,72131,72132],{},"Muestras diálogo: ",[54,72133,72134],{},"EnumDecisionReturn respuesta = decider.Decide(...);",[88,72136,72137,72138],{},"Procesas respuesta con ",[54,72139,72140],{},"switch (respuesta)",[13,72142,72143],{},[16,72144,72145],{},"Tipos de decisiones:",[126,72147,72148,72153,72158,72163,72168],{},[88,72149,72150,72152],{},[54,72151,70837],{},": Solo OK (informativo)",[88,72154,72155,72157],{},[54,72156,70850],{},": Sí \u002F No",[88,72159,72160,72162],{},[54,72161,70876],{},": Sí \u002F No \u002F Sí a todo \u002F No a todo (para lotes)",[88,72164,72165,72167],{},[54,72166,70889],{},": Reintentar \u002F Cancelar",[88,72169,72170,72172],{},[54,72171,70902],{},": OK \u002F Cancelar",[13,72174,72175],{},[16,72176,72177],{},"Parámetros avanzados:",[126,72179,72180,72183,72185],{},[88,72181,72182],{},"Checkbox \"No volver a mostrar\"",[88,72184,70390],{},[88,72186,72187],{},"Persistencia en settings de EPLAN",[13,72189,72190],{},[16,72191,72192],{},"Uso típico en EPLAN:",[126,72194,72195,72198,72201],{},[88,72196,72197],{},"Confirmar acciones destructivas",[88,72199,72200],{},"Procesar lotes con \"Sí a todo\" \u002F \"No a todo\"",[88,72202,72203],{},"Preguntas con opciones persistentes",[43,72205],{},[46,72207,5728],{"id":5727},[13,72209,72210],{},[16,72211,72212],{},"P: ¿Decider reemplaza completamente a MessageBox?",[13,72214,72215],{},"R: No. Para mensajes simples y confirmaciones básicas, MessageBox sigue siendo válido. Usa Decider cuando necesites:",[126,72217,72218,72221,72224],{},[88,72219,72220],{},"Opciones \"a todo\"",[88,72222,72223],{},"Checkbox de persistencia",[88,72225,72226],{},"Mejor integración con settings de EPLAN",[13,72228,72229],{},[16,72230,72231],{},"P: ¿Qué pasa si el usuario cierra el diálogo con la X?",[13,72233,72234,72235,41],{},"R: Retorna el valor especificado en el parámetro ",[54,72236,72237],{},"valorSiEsc",[13,72239,72240],{},[16,72241,72242,72243,36151],{},"P: ¿Puedo usar Decider en scripts ",[551,72244,51803],{},[13,72246,72247,72248,4842,72250,41],{},"R: Sí, funciona igual en ",[54,72249,1644],{},[54,72251,49919],{},[13,72253,72254],{},[16,72255,72256],{},"P: ¿Cómo funciona el checkbox \"No volver a mostrar\"?",[13,72258,72259],{},"R: Si proporcionas un nombre de setting, EPLAN guarda la preferencia del usuario. La próxima vez, no mostrará el diálogo y retornará directamente la elección guardada.",[43,72261],{},[46,72263,51782],{"id":36078},[331,72265,51786],{"id":51785},[13,72267,72268],{},[16,72269,69582],{},[331,72271,51795],{"id":51794},[13,72273,72274],{},[16,72275,72276],{},"Capítulo 25: ListSelectDecisionContext - Selección de lista",[13,72278,72279],{},"En el próximo capítulo aprenderás a mostrar listas de opciones al usuario para que seleccione una o varias.",[43,72281],{},[13,72283,72284,10676,72286,68640,72288,93,72290,72293,93,72295],{},[31,72285,657],{},[31,72287,10679],{},[31,72289,10683],{},[54,72291,72292],{},"code\u002Fcap-24\u002F",[31,72294,51827],{},[54,72296,70607],{},[660,72298,662],{},{"title":228,"searchDepth":229,"depth":229,"links":72300},[72301,72302,72303,72304,72308,72312,72317,72321,72325,72330,72331,72332],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":70313,"depth":229,"text":70314},{"id":70400,"depth":229,"text":70401,"children":72305},[72306,72307],{"id":49680,"depth":670,"text":49681},{"id":70424,"depth":670,"text":70425},{"id":70536,"depth":229,"text":70537,"children":72309},[72310,72311],{"id":23266,"depth":670,"text":23267},{"id":70601,"depth":670,"text":70602},{"id":70806,"depth":229,"text":70807,"children":72313},[72314,72315,72316],{"id":70810,"depth":670,"text":70811},{"id":70911,"depth":670,"text":70912},{"id":70963,"depth":670,"text":70964},{"id":71101,"depth":229,"text":71102,"children":72318},[72319,72320],{"id":71105,"depth":670,"text":71106},{"id":71162,"depth":670,"text":71163},{"id":71296,"depth":229,"text":71297,"children":72322},[72323,72324],{"id":71300,"depth":670,"text":71301},{"id":71482,"depth":670,"text":71483},{"id":71825,"depth":229,"text":71826,"children":72326},[72327,72328,72329],{"id":71829,"depth":670,"text":71830},{"id":71920,"depth":670,"text":71921},{"id":72006,"depth":670,"text":72007},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":72333},[72334,72335],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Usa Decider para preguntar al usuario durante la ejecución de un script EPLAN en C# y crea automatizaciones interactivas en EPLAN Electric P8.",{},"\u002Fguia\u002Finteraccion-usuario\u002Fcap-24-decider-preguntar-usuario",{"title":70251,"description":72336},"guia\u002Finteraccion-usuario\u002Fcap-24-decider-preguntar-usuario","C2zwpZLePchvLNd5rw4pptE3qeNJJwjeJiKlPMt4jzE",{"id":72343,"title":72344,"body":72345,"description":74567,"extension":236,"meta":74568,"navigation":238,"path":74569,"seo":74570,"stem":74571,"tagline":242,"__hash__":74572},"guia\u002Fguia\u002Finteraccion-usuario\u002Fcap-25-listselect-seleccion-lista.md","Capítulo 25: ListSelect, selección de lista en EPLAN",{"type":7,"value":72346,"toc":74527},[72347,72357,72359,72361,72363,72380,72382,72384,72398,72400,72404,72410,72447,72457,72461,72467,72473,72480,72482,72486,72488,72493,72497,72511,72515,72578,72582,72594,72596,72600,72602,72735,72737,72742,72932,72936,72953,72955,72959,72963,73011,73020,73024,73093,73102,73104,73108,73112,73515,73519,73814,73816,73820,73824,73853,73857,73886,73905,73907,73911,73915,74067,74071,74178,74180,74182,74186,74234,74238,74275,74279,74319,74321,74323,74328,74332,74357,74362,74380,74385,74399,74404,74406,74408,74413,74419,74451,74456,74459,74464,74477,74482,74485,74487,74489,74491,74495,74497,74502,74508,74510,74525],[10,72348,72349],{},[13,72350,72351,19,72353,19,72355,262],{},[16,72352,70260],{},[16,72354,70263],{},[16,72356,25],{},[43,72358],{},[46,72360,268],{"id":267},[13,72362,702],{},[126,72364,72365,72368,72371,72374,72377],{},[88,72366,72367],{},"Entender qué es ListSelectDecisionContext y para qué sirve",[88,72369,72370],{},"Crear listas de opciones para que el usuario seleccione",[88,72372,72373],{},"Configurar selección simple vs selección múltiple",[88,72375,72376],{},"Procesar la selección del usuario",[88,72378,72379],{},"Aplicar ListSelectDecisionContext en flujos EPLAN",[43,72381],{},[46,72383,320],{"id":319},[126,72385,72386,72389,72392,72395],{},[88,72387,72388],{},"Conocer Decider",[88,72390,72391],{},"Entender StringCollection",[88,72393,72394],{},"Saber usar if y switch",[88,72396,72397],{},"Conocer bucles foreach",[43,72399],{},[46,72401,72403],{"id":72402},"introducción-más-allá-de-síno","Introducción: Más allá de Sí\u002FNo",[13,72405,72406,72407,72409],{},"En el capítulo anterior usaste ",[16,72408,70375],{}," para preguntas Sí\u002FNo:",[543,72411,72413],{"className":545,"code":72412,"language":547,"meta":228,"style":228},"Decider decider = new Decider();\nEnumDecisionReturn respuesta = decider.Decide(\n    EnumDecisionType.eYesNoDecision,\n    \"¿Continuar?\",\n    \"Pregunta\",\n    EnumDecisionReturn.eYES,\n    EnumDecisionReturn.eNO\n);\n",[54,72414,72415,72419,72423,72427,72431,72435,72439,72443],{"__ignoreMap":228},[551,72416,72417],{"class":553,"line":554},[551,72418,70549],{},[551,72420,72421],{"class":553,"line":229},[551,72422,70554],{},[551,72424,72425],{"class":553,"line":670},[551,72426,71849],{},[551,72428,72429],{"class":553,"line":1136},[551,72430,70333],{},[551,72432,72433],{"class":553,"line":1142},[551,72434,70338],{},[551,72436,72437],{"class":553,"line":1148},[551,72438,70997],{},[551,72440,72441],{"class":553,"line":1154},[551,72442,71002],{},[551,72444,72445],{"class":553,"line":1160},[551,72446,3967],{},[13,72448,72449,72450,72453,72454,36151],{},"Esto funciona para ",[16,72451,72452],{},"dos opciones",", pero ¿qué pasa si necesitas que el usuario elija entre ",[16,72455,72456],{},"múltiples opciones",[13,72458,72459],{},[16,72460,65501],{},[543,72462,72465],{"className":72463,"code":72464,"language":847},[845],"Opciones: PDF, DWG, DXF, XML, CSV\n",[54,72466,72464],{"__ignoreMap":228},[13,72468,72469,72470,41],{},"No puedes poner 5 botones en un Decider. Necesitas una ",[16,72471,72472],{},"lista",[13,72474,72475,73,72477],{},[16,72476,51401],{},[16,72478,72479],{},"ListSelectDecisionContext",[43,72481],{},[46,72483,72485],{"id":72484},"_1-qué-es-listselectdecisioncontext","1. ¿Qué es ListSelectDecisionContext?",[331,72487,49681],{"id":49680},[13,72489,72490,72492],{},[16,72491,72479],{}," es una clase que crea un contexto de decisión con una lista de opciones para que el usuario seleccione.",[13,72494,72495],{},[16,72496,70413],{},[543,72498,72500],{"className":545,"code":72499,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing System.Collections.Specialized;  \u002F\u002F Para StringCollection\n",[54,72501,72502,72506],{"__ignoreMap":228},[551,72503,72504],{"class":553,"line":554},[551,72505,1128],{},[551,72507,72508],{"class":553,"line":229},[551,72509,72510],{},"using System.Collections.Specialized;  \u002F\u002F Para StringCollection\n",[331,72512,72514],{"id":72513},"_12-diferencias-con-decider-normal","1.2 Diferencias con Decider normal",[6589,72516,72517,72527],{},[6592,72518,72519],{},[6595,72520,72521,72523,72525],{},[6598,72522,61347],{},[6598,72524,70375],{},[6598,72526,72479],{},[6611,72528,72529,72541,72553,72565],{},[6595,72530,72531,72535,72538],{},[6616,72532,72533],{},[16,72534,70471],{},[6616,72536,72537],{},"Botones fijos (Sí\u002FNo\u002FOK\u002Fetc.)",[6616,72539,72540],{},"Lista personalizada de strings",[6595,72542,72543,72547,72550],{},[6616,72544,72545],{},[16,72546,54879],{},[6616,72548,72549],{},"Limitada (2-4 botones)",[6616,72551,72552],{},"Ilimitada (cualquier cantidad)",[6595,72554,72555,72560,72562],{},[6616,72556,72557],{},[16,72558,72559],{},"Selección múltiple",[6616,72561,18787],{},[6616,72563,72564],{},"Sí (opcional)",[6595,72566,72567,72572,72575],{},[6616,72568,72569],{},[16,72570,72571],{},"Interfaz",[6616,72573,72574],{},"Botones",[6616,72576,72577],{},"Lista desplegable o checkboxes",[13,72579,72580],{},[16,72581,66538],{},[126,72583,72584,72589],{},[88,72585,72586,72588],{},[16,72587,70375],{},": Preguntas simples con opciones fijas (Sí\u002FNo, OK\u002FCancel)",[88,72590,72591,72593],{},[16,72592,72479],{},": Elegir de una lista de opciones personalizadas",[43,72595],{},[46,72597,72599],{"id":72598},"_2-cómo-usar-listselectdecisioncontext","2. Cómo usar ListSelectDecisionContext",[331,72601,23267],{"id":23266},[543,72603,72605],{"className":545,"code":72604,"language":547,"meta":228,"style":228},"\u002F\u002F 1. Crear la lista de opciones\nStringCollection opciones = new StringCollection();\nopciones.Add(\"Opción 1\");\nopciones.Add(\"Opción 2\");\nopciones.Add(\"Opción 3\");\n\n\u002F\u002F 2. Crear el contexto\nListSelectDecisionContext contexto = new ListSelectDecisionContext(\n    opciones,           \u002F\u002F Lista de opciones\n    \"Opción 1\",         \u002F\u002F Opción seleccionada por defecto\n    \"Título del diálogo\"  \u002F\u002F Título\n);\n\n\u002F\u002F 3. Configurar (opcional)\ncontexto.AllowMultiSelect = false;  \u002F\u002F Selección simple\n\n\u002F\u002F 4. Mostrar el diálogo\nDecider decider = new Decider();\nEnumDecisionReturn resultado = decider.Decide(contexto);\n\n\u002F\u002F 5. Procesar la selección\nif (resultado == EnumDecisionReturn.eOK)\n{\n    string seleccionado = contexto.SelectedEntry;  \u002F\u002F Opción elegida\n    MessageBox.Show(\"Usuario eligió: \" + seleccionado);\n}\n",[54,72606,72607,72612,72617,72622,72627,72632,72636,72641,72646,72651,72659,72667,72671,72675,72680,72685,72689,72694,72698,72703,72707,72712,72717,72721,72726,72731],{"__ignoreMap":228},[551,72608,72609],{"class":553,"line":554},[551,72610,72611],{},"\u002F\u002F 1. Crear la lista de opciones\n",[551,72613,72614],{"class":553,"line":229},[551,72615,72616],{},"StringCollection opciones = new StringCollection();\n",[551,72618,72619],{"class":553,"line":670},[551,72620,72621],{},"opciones.Add(\"Opción 1\");\n",[551,72623,72624],{"class":553,"line":1136},[551,72625,72626],{},"opciones.Add(\"Opción 2\");\n",[551,72628,72629],{"class":553,"line":1142},[551,72630,72631],{},"opciones.Add(\"Opción 3\");\n",[551,72633,72634],{"class":553,"line":1148},[551,72635,1139],{"emptyLinePlaceholder":238},[551,72637,72638],{"class":553,"line":1154},[551,72639,72640],{},"\u002F\u002F 2. Crear el contexto\n",[551,72642,72643],{"class":553,"line":1160},[551,72644,72645],{},"ListSelectDecisionContext contexto = new ListSelectDecisionContext(\n",[551,72647,72648],{"class":553,"line":1166},[551,72649,72650],{},"    opciones,           \u002F\u002F Lista de opciones\n",[551,72652,72653,72656],{"class":553,"line":1172},[551,72654,72655],{},"    \"Opción 1\",",[551,72657,72658],{},"         \u002F\u002F Opción seleccionada por defecto\n",[551,72660,72661,72664],{"class":553,"line":1178},[551,72662,72663],{},"    \"Título del diálogo\"",[551,72665,72666],{},"  \u002F\u002F Título\n",[551,72668,72669],{"class":553,"line":1184},[551,72670,3967],{},[551,72672,72673],{"class":553,"line":1190},[551,72674,1139],{"emptyLinePlaceholder":238},[551,72676,72677],{"class":553,"line":1472},[551,72678,72679],{},"\u002F\u002F 3. Configurar (opcional)\n",[551,72681,72682],{"class":553,"line":1477},[551,72683,72684],{},"contexto.AllowMultiSelect = false;  \u002F\u002F Selección simple\n",[551,72686,72687],{"class":553,"line":1797},[551,72688,1139],{"emptyLinePlaceholder":238},[551,72690,72691],{"class":553,"line":1802},[551,72692,72693],{},"\u002F\u002F 4. Mostrar el diálogo\n",[551,72695,72696],{"class":553,"line":1808},[551,72697,70549],{},[551,72699,72700],{"class":553,"line":1814},[551,72701,72702],{},"EnumDecisionReturn resultado = decider.Decide(contexto);\n",[551,72704,72705],{"class":553,"line":1820},[551,72706,1139],{"emptyLinePlaceholder":238},[551,72708,72709],{"class":553,"line":1826},[551,72710,72711],{},"\u002F\u002F 5. Procesar la selección\n",[551,72713,72714],{"class":553,"line":1832},[551,72715,72716],{},"if (resultado == EnumDecisionReturn.eOK)\n",[551,72718,72719],{"class":553,"line":1838},[551,72720,1151],{},[551,72722,72723],{"class":553,"line":1844},[551,72724,72725],{},"    string seleccionado = contexto.SelectedEntry;  \u002F\u002F Opción elegida\n",[551,72727,72728],{"class":553,"line":1850},[551,72729,72730],{},"    MessageBox.Show(\"Usuario eligió: \" + seleccionado);\n",[551,72732,72733],{"class":553,"line":1855},[551,72734,1193],{},[331,72736,65699],{"id":65698},[13,72738,62193,72739,416],{},[54,72740,72741],{},"EPLAN-Scripting-4.0\u002F04_CodeFlow\u002F09_ListSelectDecisionContext.cs",[543,72743,72745],{"className":545,"code":72744,"language":547,"meta":228,"style":228},"using System.Collections.Specialized;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class ListSelectBasico\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Definir opciones\n        string title = \"¿Qué píldora eliges?\";\n        string redPill = \"Píldora roja\";\n        string bluePill = \"Píldora azul\";\n\n        \u002F\u002F Crear lista de opciones\n        StringCollection entries = new StringCollection();\n        entries.Add(redPill);\n        entries.Add(bluePill);\n\n        \u002F\u002F Crear contexto de decisión\n        ListSelectDecisionContext listSelectDecision =\n            new ListSelectDecisionContext(entries, redPill, title);\n\n        \u002F\u002F Configurar selección simple (no múltiple)\n        listSelectDecision.AllowMultiSelect = false;\n\n        \u002F\u002F Mostrar diálogo\n        var result = new Decider().Decide(listSelectDecision);\n\n        \u002F\u002F Procesar resultado\n        if (result == EnumDecisionReturn.eOK)\n        {\n            MessageBox.Show(\"Elegiste: \" + listSelectDecision.SelectedEntry);\n        }\n        else\n        {\n            MessageBox.Show(\"No se seleccionó nada (usuario canceló)\");\n        }\n    }\n}\n",[54,72746,72747,72752,72756,72760,72764,72768,72773,72777,72781,72785,72789,72794,72799,72804,72809,72813,72818,72823,72828,72833,72837,72842,72847,72852,72856,72861,72866,72870,72875,72880,72884,72889,72894,72898,72903,72907,72911,72915,72920,72924,72928],{"__ignoreMap":228},[551,72748,72749],{"class":553,"line":554},[551,72750,72751],{},"using System.Collections.Specialized;\n",[551,72753,72754],{"class":553,"line":229},[551,72755,50105],{},[551,72757,72758],{"class":553,"line":670},[551,72759,1128],{},[551,72761,72762],{"class":553,"line":1136},[551,72763,49898],{},[551,72765,72766],{"class":553,"line":1142},[551,72767,1139],{"emptyLinePlaceholder":238},[551,72769,72770],{"class":553,"line":1148},[551,72771,72772],{},"public class ListSelectBasico\n",[551,72774,72775],{"class":553,"line":1154},[551,72776,1151],{},[551,72778,72779],{"class":553,"line":1160},[551,72780,1157],{},[551,72782,72783],{"class":553,"line":1166},[551,72784,57216],{},[551,72786,72787],{"class":553,"line":1172},[551,72788,1169],{},[551,72790,72791],{"class":553,"line":1178},[551,72792,72793],{},"        \u002F\u002F Definir opciones\n",[551,72795,72796],{"class":553,"line":1184},[551,72797,72798],{},"        string title = \"¿Qué píldora eliges?\";\n",[551,72800,72801],{"class":553,"line":1190},[551,72802,72803],{},"        string redPill = \"Píldora roja\";\n",[551,72805,72806],{"class":553,"line":1472},[551,72807,72808],{},"        string bluePill = \"Píldora azul\";\n",[551,72810,72811],{"class":553,"line":1477},[551,72812,1139],{"emptyLinePlaceholder":238},[551,72814,72815],{"class":553,"line":1797},[551,72816,72817],{},"        \u002F\u002F Crear lista de opciones\n",[551,72819,72820],{"class":553,"line":1802},[551,72821,72822],{},"        StringCollection entries = new StringCollection();\n",[551,72824,72825],{"class":553,"line":1808},[551,72826,72827],{},"        entries.Add(redPill);\n",[551,72829,72830],{"class":553,"line":1814},[551,72831,72832],{},"        entries.Add(bluePill);\n",[551,72834,72835],{"class":553,"line":1820},[551,72836,1139],{"emptyLinePlaceholder":238},[551,72838,72839],{"class":553,"line":1826},[551,72840,72841],{},"        \u002F\u002F Crear contexto de decisión\n",[551,72843,72844],{"class":553,"line":1832},[551,72845,72846],{},"        ListSelectDecisionContext listSelectDecision =\n",[551,72848,72849],{"class":553,"line":1838},[551,72850,72851],{},"            new ListSelectDecisionContext(entries, redPill, title);\n",[551,72853,72854],{"class":553,"line":1844},[551,72855,1139],{"emptyLinePlaceholder":238},[551,72857,72858],{"class":553,"line":1850},[551,72859,72860],{},"        \u002F\u002F Configurar selección simple (no múltiple)\n",[551,72862,72863],{"class":553,"line":1855},[551,72864,72865],{},"        listSelectDecision.AllowMultiSelect = false;\n",[551,72867,72868],{"class":553,"line":1861},[551,72869,1139],{"emptyLinePlaceholder":238},[551,72871,72872],{"class":553,"line":1867},[551,72873,72874],{},"        \u002F\u002F Mostrar diálogo\n",[551,72876,72877],{"class":553,"line":1873},[551,72878,72879],{},"        var result = new Decider().Decide(listSelectDecision);\n",[551,72881,72882],{"class":553,"line":1878},[551,72883,1139],{"emptyLinePlaceholder":238},[551,72885,72886],{"class":553,"line":1883},[551,72887,72888],{},"        \u002F\u002F Procesar resultado\n",[551,72890,72891],{"class":553,"line":1888},[551,72892,72893],{},"        if (result == EnumDecisionReturn.eOK)\n",[551,72895,72896],{"class":553,"line":4615},[551,72897,9062],{},[551,72899,72900],{"class":553,"line":4620},[551,72901,72902],{},"            MessageBox.Show(\"Elegiste: \" + listSelectDecision.SelectedEntry);\n",[551,72904,72905],{"class":553,"line":4626},[551,72906,9077],{},[551,72908,72909],{"class":553,"line":4631},[551,72910,9082],{},[551,72912,72913],{"class":553,"line":4636},[551,72914,9062],{},[551,72916,72917],{"class":553,"line":4641},[551,72918,72919],{},"            MessageBox.Show(\"No se seleccionó nada (usuario canceló)\");\n",[551,72921,72922],{"class":553,"line":4647},[551,72923,9077],{},[551,72925,72926],{"class":553,"line":4653},[551,72927,1187],{},[551,72929,72930],{"class":553,"line":4659},[551,72931,1193],{},[13,72933,72934],{},[16,72935,1225],{},[85,72937,72938,72941,72944,72947,72950],{},[88,72939,72940],{},"Crea una lista con dos opciones",[88,72942,72943],{},"Crea un contexto con esa lista",[88,72945,72946],{},"Muestra un diálogo con las opciones",[88,72948,72949],{},"Si el usuario elige una y presiona OK, muestra cuál eligió",[88,72951,72952],{},"Si cancela, no hace nada",[43,72954],{},[46,72956,72958],{"id":72957},"_3-selección-simple-vs-selección-múltiple","3. Selección simple vs selección múltiple",[331,72960,72962],{"id":72961},"_31-selección-simple-por-defecto","3.1 Selección simple (por defecto)",[543,72964,72966],{"className":545,"code":72965,"language":547,"meta":228,"style":228},"listSelectDecision.AllowMultiSelect = false;\n\n\u002F\u002F Al mostrar:\n\u002F\u002F ○ Opción 1\n\u002F\u002F ○ Opción 2\n\u002F\u002F ● Opción 3  ← Solo una seleccionada\n\n\u002F\u002F Obtener selección:\nstring seleccionado = listSelectDecision.SelectedEntry;\n",[54,72967,72968,72973,72977,72982,72987,72992,72997,73001,73006],{"__ignoreMap":228},[551,72969,72970],{"class":553,"line":554},[551,72971,72972],{},"listSelectDecision.AllowMultiSelect = false;\n",[551,72974,72975],{"class":553,"line":229},[551,72976,1139],{"emptyLinePlaceholder":238},[551,72978,72979],{"class":553,"line":670},[551,72980,72981],{},"\u002F\u002F Al mostrar:\n",[551,72983,72984],{"class":553,"line":1136},[551,72985,72986],{},"\u002F\u002F ○ Opción 1\n",[551,72988,72989],{"class":553,"line":1142},[551,72990,72991],{},"\u002F\u002F ○ Opción 2\n",[551,72993,72994],{"class":553,"line":1148},[551,72995,72996],{},"\u002F\u002F ● Opción 3  ← Solo una seleccionada\n",[551,72998,72999],{"class":553,"line":1154},[551,73000,1139],{"emptyLinePlaceholder":238},[551,73002,73003],{"class":553,"line":1160},[551,73004,73005],{},"\u002F\u002F Obtener selección:\n",[551,73007,73008],{"class":553,"line":1166},[551,73009,73010],{},"string seleccionado = listSelectDecision.SelectedEntry;\n",[13,73012,73013,73015,73016,73019],{},[16,73014,60943],{}," Cuando el usuario debe elegir ",[16,73017,73018],{},"exactamente una"," opción.",[331,73021,73023],{"id":73022},"_32-selección-múltiple","3.2 Selección múltiple",[543,73025,73027],{"className":545,"code":73026,"language":547,"meta":228,"style":228},"listSelectDecision.AllowMultiSelect = true;\n\n\u002F\u002F Al mostrar:\n\u002F\u002F ☐ Opción 1\n\u002F\u002F ☑ Opción 2  ← Múltiples seleccionadas\n\u002F\u002F ☑ Opción 3\n\n\u002F\u002F Obtener selecciones (plural):\nStringCollection seleccionados = listSelectDecision.SelectedEntries;\n\nforeach (string item in seleccionados)\n{\n    MessageBox.Show(\"Seleccionado: \" + item);\n}\n",[54,73028,73029,73034,73038,73042,73047,73052,73057,73061,73066,73071,73075,73080,73084,73089],{"__ignoreMap":228},[551,73030,73031],{"class":553,"line":554},[551,73032,73033],{},"listSelectDecision.AllowMultiSelect = true;\n",[551,73035,73036],{"class":553,"line":229},[551,73037,1139],{"emptyLinePlaceholder":238},[551,73039,73040],{"class":553,"line":670},[551,73041,72981],{},[551,73043,73044],{"class":553,"line":1136},[551,73045,73046],{},"\u002F\u002F ☐ Opción 1\n",[551,73048,73049],{"class":553,"line":1142},[551,73050,73051],{},"\u002F\u002F ☑ Opción 2  ← Múltiples seleccionadas\n",[551,73053,73054],{"class":553,"line":1148},[551,73055,73056],{},"\u002F\u002F ☑ Opción 3\n",[551,73058,73059],{"class":553,"line":1154},[551,73060,1139],{"emptyLinePlaceholder":238},[551,73062,73063],{"class":553,"line":1160},[551,73064,73065],{},"\u002F\u002F Obtener selecciones (plural):\n",[551,73067,73068],{"class":553,"line":1166},[551,73069,73070],{},"StringCollection seleccionados = listSelectDecision.SelectedEntries;\n",[551,73072,73073],{"class":553,"line":1172},[551,73074,1139],{"emptyLinePlaceholder":238},[551,73076,73077],{"class":553,"line":1178},[551,73078,73079],{},"foreach (string item in seleccionados)\n",[551,73081,73082],{"class":553,"line":1184},[551,73083,1151],{},[551,73085,73086],{"class":553,"line":1190},[551,73087,73088],{},"    MessageBox.Show(\"Seleccionado: \" + item);\n",[551,73090,73091],{"class":553,"line":1472},[551,73092,1193],{},[13,73094,73095,73097,73098,73101],{},[16,73096,60943],{}," Cuando el usuario puede elegir ",[16,73099,73100],{},"cero, una o varias"," opciones.",[43,73103],{},[46,73105,73107],{"id":73106},"_4-ejemplo-seleccionar-formato-de-exportación","4. Ejemplo: Seleccionar formato de exportación",[331,73109,73111],{"id":73110},"_41-selección-simple-un-formato","4.1 Selección simple (un formato)",[543,73113,73115],{"className":545,"code":73114,"language":547,"meta":228,"style":228},"using System.Collections.Specialized;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.ApplicationFramework;\nusing Eplan.EplApi.Scripting;\n\npublic class SeleccionarFormato\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Crear lista de formatos disponibles\n        StringCollection formatos = new StringCollection();\n        formatos.Add(\"PDF\");\n        formatos.Add(\"DWG\");\n        formatos.Add(\"DXF\");\n        formatos.Add(\"XML\");\n        formatos.Add(\"CSV\");\n\n        \u002F\u002F Crear contexto\n        ListSelectDecisionContext contexto = new ListSelectDecisionContext(\n            formatos,\n            \"PDF\",  \u002F\u002F Por defecto: PDF\n            \"Seleccione el formato de exportación\"\n        );\n\n        \u002F\u002F Selección simple\n        contexto.AllowMultiSelect = false;\n\n        \u002F\u002F Mostrar diálogo\n        Decider decider = new Decider();\n        EnumDecisionReturn resultado = decider.Decide(contexto);\n\n        if (resultado == EnumDecisionReturn.eOK)\n        {\n            string formatoElegido = contexto.SelectedEntry;\n\n            new BaseException(\n                \"Formato seleccionado: \" + formatoElegido,\n                MessageLevel.Message\n            ).FixMessage();\n\n            \u002F\u002F Ejecutar exportación según el formato\n            ExportarEnFormato(formatoElegido);\n        }\n        else\n        {\n            MessageBox.Show(\"Exportación cancelada\");\n        }\n    }\n\n    private void ExportarEnFormato(string formato)\n    {\n        \u002F\u002F Obtener nombre del proyecto\n        string nombreProyecto = PathMap.SubstitutePath(\"$(PROJECTNAME)\");\n        string rutaSalida = @\"C:\\temp\\\" + nombreProyecto + \".\" + formato.ToLower();\n\n        new BaseException(\n            \"Exportando a \" + formato + \": \" + rutaSalida,\n            MessageLevel.Message\n        ).FixMessage();\n\n        \u002F\u002F Preparar exportación\n        ActionCallingContext ctx = new ActionCallingContext();\n        ctx.AddParameter(\"EXPORTFILE\", rutaSalida);\n        ctx.AddParameter(\"TYPE\", formato);\n\n        try\n        {\n            CommandLineInterpreter cli = new CommandLineInterpreter();\n            cli.Execute(\"export\", ctx);\n\n            MessageBox.Show(\n                \"Proyecto exportado a:\\n\\n\" + rutaSalida,\n                \"Exportación completada\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        catch (System.Exception ex)\n        {\n            new BaseException(\n                \"Error al exportar: \" + ex.Message,\n                MessageLevel.Error\n            ).FixMessage();\n\n            MessageBox.Show(\"Error al exportar. Ver 'Mensajes de sistema'.\");\n        }\n    }\n}\n",[54,73116,73117,73121,73125,73129,73133,73137,73141,73146,73150,73154,73158,73162,73167,73172,73177,73182,73187,73192,73197,73201,73206,73211,73216,73224,73229,73233,73237,73242,73247,73251,73255,73259,73264,73268,73273,73277,73282,73286,73290,73295,73299,73303,73307,73312,73317,73321,73325,73329,73334,73338,73342,73346,73351,73355,73359,73363,73368,73372,73376,73381,73385,73389,73393,73398,73402,73407,73412,73416,73420,73424,73428,73433,73437,73441,73446,73451,73455,73459,73463,73467,73472,73476,73480,73485,73490,73494,73498,73503,73507,73511],{"__ignoreMap":228},[551,73118,73119],{"class":553,"line":554},[551,73120,72751],{},[551,73122,73123],{"class":553,"line":229},[551,73124,50105],{},[551,73126,73127],{"class":553,"line":670},[551,73128,1128],{},[551,73130,73131],{"class":553,"line":1136},[551,73132,1133],{},[551,73134,73135],{"class":553,"line":1142},[551,73136,49898],{},[551,73138,73139],{"class":553,"line":1148},[551,73140,1139],{"emptyLinePlaceholder":238},[551,73142,73143],{"class":553,"line":1154},[551,73144,73145],{},"public class SeleccionarFormato\n",[551,73147,73148],{"class":553,"line":1160},[551,73149,1151],{},[551,73151,73152],{"class":553,"line":1166},[551,73153,1157],{},[551,73155,73156],{"class":553,"line":1172},[551,73157,57216],{},[551,73159,73160],{"class":553,"line":1178},[551,73161,1169],{},[551,73163,73164],{"class":553,"line":1184},[551,73165,73166],{},"        \u002F\u002F Crear lista de formatos disponibles\n",[551,73168,73169],{"class":553,"line":1190},[551,73170,73171],{},"        StringCollection formatos = new StringCollection();\n",[551,73173,73174],{"class":553,"line":1472},[551,73175,73176],{},"        formatos.Add(\"PDF\");\n",[551,73178,73179],{"class":553,"line":1477},[551,73180,73181],{},"        formatos.Add(\"DWG\");\n",[551,73183,73184],{"class":553,"line":1797},[551,73185,73186],{},"        formatos.Add(\"DXF\");\n",[551,73188,73189],{"class":553,"line":1802},[551,73190,73191],{},"        formatos.Add(\"XML\");\n",[551,73193,73194],{"class":553,"line":1808},[551,73195,73196],{},"        formatos.Add(\"CSV\");\n",[551,73198,73199],{"class":553,"line":1814},[551,73200,1139],{"emptyLinePlaceholder":238},[551,73202,73203],{"class":553,"line":1820},[551,73204,73205],{},"        \u002F\u002F Crear contexto\n",[551,73207,73208],{"class":553,"line":1826},[551,73209,73210],{},"        ListSelectDecisionContext contexto = new ListSelectDecisionContext(\n",[551,73212,73213],{"class":553,"line":1832},[551,73214,73215],{},"            formatos,\n",[551,73217,73218,73221],{"class":553,"line":1838},[551,73219,73220],{},"            \"PDF\",",[551,73222,73223],{},"  \u002F\u002F Por defecto: PDF\n",[551,73225,73226],{"class":553,"line":1844},[551,73227,73228],{},"            \"Seleccione el formato de exportación\"\n",[551,73230,73231],{"class":553,"line":1850},[551,73232,4758],{},[551,73234,73235],{"class":553,"line":1855},[551,73236,1139],{"emptyLinePlaceholder":238},[551,73238,73239],{"class":553,"line":1861},[551,73240,73241],{},"        \u002F\u002F Selección simple\n",[551,73243,73244],{"class":553,"line":1867},[551,73245,73246],{},"        contexto.AllowMultiSelect = false;\n",[551,73248,73249],{"class":553,"line":1873},[551,73250,1139],{"emptyLinePlaceholder":238},[551,73252,73253],{"class":553,"line":1878},[551,73254,72874],{},[551,73256,73257],{"class":553,"line":1883},[551,73258,70659],{},[551,73260,73261],{"class":553,"line":1888},[551,73262,73263],{},"        EnumDecisionReturn resultado = decider.Decide(contexto);\n",[551,73265,73266],{"class":553,"line":4615},[551,73267,1139],{"emptyLinePlaceholder":238},[551,73269,73270],{"class":553,"line":4620},[551,73271,73272],{},"        if (resultado == EnumDecisionReturn.eOK)\n",[551,73274,73275],{"class":553,"line":4626},[551,73276,9062],{},[551,73278,73279],{"class":553,"line":4631},[551,73280,73281],{},"            string formatoElegido = contexto.SelectedEntry;\n",[551,73283,73284],{"class":553,"line":4636},[551,73285,1139],{"emptyLinePlaceholder":238},[551,73287,73288],{"class":553,"line":4641},[551,73289,68236],{},[551,73291,73292],{"class":553,"line":4647},[551,73293,73294],{},"                \"Formato seleccionado: \" + formatoElegido,\n",[551,73296,73297],{"class":553,"line":4653},[551,73298,68246],{},[551,73300,73301],{"class":553,"line":4659},[551,73302,68251],{},[551,73304,73305],{"class":553,"line":4665},[551,73306,1139],{"emptyLinePlaceholder":238},[551,73308,73309],{"class":553,"line":4671},[551,73310,73311],{},"            \u002F\u002F Ejecutar exportación según el formato\n",[551,73313,73314],{"class":553,"line":4677},[551,73315,73316],{},"            ExportarEnFormato(formatoElegido);\n",[551,73318,73319],{"class":553,"line":4683},[551,73320,9077],{},[551,73322,73323],{"class":553,"line":4689},[551,73324,9082],{},[551,73326,73327],{"class":553,"line":4695},[551,73328,9062],{},[551,73330,73331],{"class":553,"line":4701},[551,73332,73333],{},"            MessageBox.Show(\"Exportación cancelada\");\n",[551,73335,73336],{"class":553,"line":4707},[551,73337,9077],{},[551,73339,73340],{"class":553,"line":4713},[551,73341,1187],{},[551,73343,73344],{"class":553,"line":4719},[551,73345,1139],{"emptyLinePlaceholder":238},[551,73347,73348],{"class":553,"line":4725},[551,73349,73350],{},"    private void ExportarEnFormato(string formato)\n",[551,73352,73353],{"class":553,"line":4731},[551,73354,1169],{},[551,73356,73357],{"class":553,"line":4737},[551,73358,66316],{},[551,73360,73361],{"class":553,"line":4743},[551,73362,55600],{},[551,73364,73365],{"class":553,"line":4749},[551,73366,73367],{},"        string rutaSalida = @\"C:\\temp\\\" + nombreProyecto + \".\" + formato.ToLower();\n",[551,73369,73370],{"class":553,"line":4755},[551,73371,1139],{"emptyLinePlaceholder":238},[551,73373,73374],{"class":553,"line":4761},[551,73375,51279],{},[551,73377,73378],{"class":553,"line":4766},[551,73379,73380],{},"            \"Exportando a \" + formato + \": \" + rutaSalida,\n",[551,73382,73383],{"class":553,"line":4771},[551,73384,51289],{},[551,73386,73387],{"class":553,"line":4777},[551,73388,51294],{},[551,73390,73391],{"class":553,"line":4782},[551,73392,1139],{"emptyLinePlaceholder":238},[551,73394,73395],{"class":553,"line":4787},[551,73396,73397],{},"        \u002F\u002F Preparar exportación\n",[551,73399,73400],{"class":553,"line":4793},[551,73401,70146],{},[551,73403,73404],{"class":553,"line":4799},[551,73405,73406],{},"        ctx.AddParameter(\"EXPORTFILE\", rutaSalida);\n",[551,73408,73409],{"class":553,"line":4805},[551,73410,73411],{},"        ctx.AddParameter(\"TYPE\", formato);\n",[551,73413,73414],{"class":553,"line":4811},[551,73415,1139],{"emptyLinePlaceholder":238},[551,73417,73418],{"class":553,"line":4817},[551,73419,41211],{},[551,73421,73422],{"class":553,"line":4822},[551,73423,9062],{},[551,73425,73426],{"class":553,"line":4827},[551,73427,55695],{},[551,73429,73430],{"class":553,"line":9183},[551,73431,73432],{},"            cli.Execute(\"export\", ctx);\n",[551,73434,73435],{"class":553,"line":9188},[551,73436,1139],{"emptyLinePlaceholder":238},[551,73438,73439],{"class":553,"line":9193},[551,73440,53598],{},[551,73442,73443],{"class":553,"line":9198},[551,73444,73445],{},"                \"Proyecto exportado a:\\n\\n\" + rutaSalida,\n",[551,73447,73448],{"class":553,"line":9204},[551,73449,73450],{},"                \"Exportación completada\",\n",[551,73452,73453],{"class":553,"line":9209},[551,73454,53613],{},[551,73456,73457],{"class":553,"line":9214},[551,73458,53618],{},[551,73460,73461],{"class":553,"line":9219},[551,73462,53623],{},[551,73464,73465],{"class":553,"line":9224},[551,73466,9077],{},[551,73468,73469],{"class":553,"line":9230},[551,73470,73471],{},"        catch (System.Exception ex)\n",[551,73473,73474],{"class":553,"line":9236},[551,73475,9062],{},[551,73477,73478],{"class":553,"line":9242},[551,73479,68236],{},[551,73481,73482],{"class":553,"line":9247},[551,73483,73484],{},"                \"Error al exportar: \" + ex.Message,\n",[551,73486,73487],{"class":553,"line":9253},[551,73488,73489],{},"                MessageLevel.Error\n",[551,73491,73492],{"class":553,"line":9258},[551,73493,68251],{},[551,73495,73496],{"class":553,"line":9264},[551,73497,1139],{"emptyLinePlaceholder":238},[551,73499,73500],{"class":553,"line":9270},[551,73501,73502],{},"            MessageBox.Show(\"Error al exportar. Ver 'Mensajes de sistema'.\");\n",[551,73504,73505],{"class":553,"line":9275},[551,73506,9077],{},[551,73508,73509],{"class":553,"line":9281},[551,73510,1187],{},[551,73512,73513],{"class":553,"line":9287},[551,73514,1193],{},[331,73516,73518],{"id":73517},"_42-selección-múltiple-varios-formatos","4.2 Selección múltiple (varios formatos)",[543,73520,73522],{"className":545,"code":73521,"language":547,"meta":228,"style":228},"using System.Collections.Specialized;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\n\npublic class SeleccionarMultiplesFormatos\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F Crear lista de formatos disponibles\n        StringCollection formatos = new StringCollection();\n        formatos.Add(\"PDF\");\n        formatos.Add(\"DWG\");\n        formatos.Add(\"DXF\");\n        formatos.Add(\"XML\");\n        formatos.Add(\"CSV\");\n\n        \u002F\u002F Crear contexto\n        ListSelectDecisionContext contexto = new ListSelectDecisionContext(\n            formatos,\n            \"PDF\",\n            \"Seleccione uno o más formatos de exportación\"\n        );\n\n        \u002F\u002F Selección MÚLTIPLE\n        contexto.AllowMultiSelect = true;\n\n        \u002F\u002F Mostrar diálogo\n        Decider decider = new Decider();\n        EnumDecisionReturn resultado = decider.Decide(contexto);\n\n        if (resultado == EnumDecisionReturn.eOK)\n        {\n            \u002F\u002F Obtener TODAS las selecciones (plural: SelectedEntries)\n            StringCollection formatosElegidos = contexto.SelectedEntries;\n\n            if (formatosElegidos.Count == 0)\n            {\n                MessageBox.Show(\"No se seleccionó ningún formato\");\n                return;\n            }\n\n            \u002F\u002F Exportar en cada formato seleccionado\n            foreach (string formato in formatosElegidos)\n            {\n                new BaseException(\n                    \"Exportando en formato: \" + formato,\n                    MessageLevel.Message\n                ).FixMessage();\n\n                \u002F\u002F Aquí iría la lógica de exportación para cada formato\n                System.Threading.Thread.Sleep(500);  \u002F\u002F Simular trabajo\n            }\n\n            MessageBox.Show(\n                \"Exportación completada en \" + formatosElegidos.Count + \" formato(s)\",\n                \"Éxito\",\n                MessageBoxButtons.OK,\n                MessageBoxIcon.Information\n            );\n        }\n        else\n        {\n            MessageBox.Show(\"Exportación cancelada\");\n        }\n    }\n}\n",[54,73523,73524,73528,73532,73536,73540,73544,73549,73553,73557,73561,73565,73569,73573,73577,73581,73585,73589,73593,73597,73601,73605,73609,73614,73619,73623,73627,73632,73637,73641,73645,73649,73653,73657,73661,73665,73670,73675,73679,73684,73688,73693,73697,73701,73705,73710,73715,73719,73724,73729,73734,73739,73743,73748,73753,73757,73761,73765,73770,73774,73778,73782,73786,73790,73794,73798,73802,73806,73810],{"__ignoreMap":228},[551,73525,73526],{"class":553,"line":554},[551,73527,72751],{},[551,73529,73530],{"class":553,"line":229},[551,73531,50105],{},[551,73533,73534],{"class":553,"line":670},[551,73535,1128],{},[551,73537,73538],{"class":553,"line":1136},[551,73539,49898],{},[551,73541,73542],{"class":553,"line":1142},[551,73543,1139],{"emptyLinePlaceholder":238},[551,73545,73546],{"class":553,"line":1148},[551,73547,73548],{},"public class SeleccionarMultiplesFormatos\n",[551,73550,73551],{"class":553,"line":1154},[551,73552,1151],{},[551,73554,73555],{"class":553,"line":1160},[551,73556,1157],{},[551,73558,73559],{"class":553,"line":1166},[551,73560,57216],{},[551,73562,73563],{"class":553,"line":1172},[551,73564,1169],{},[551,73566,73567],{"class":553,"line":1178},[551,73568,73166],{},[551,73570,73571],{"class":553,"line":1184},[551,73572,73171],{},[551,73574,73575],{"class":553,"line":1190},[551,73576,73176],{},[551,73578,73579],{"class":553,"line":1472},[551,73580,73181],{},[551,73582,73583],{"class":553,"line":1477},[551,73584,73186],{},[551,73586,73587],{"class":553,"line":1797},[551,73588,73191],{},[551,73590,73591],{"class":553,"line":1802},[551,73592,73196],{},[551,73594,73595],{"class":553,"line":1808},[551,73596,1139],{"emptyLinePlaceholder":238},[551,73598,73599],{"class":553,"line":1814},[551,73600,73205],{},[551,73602,73603],{"class":553,"line":1820},[551,73604,73210],{},[551,73606,73607],{"class":553,"line":1826},[551,73608,73215],{},[551,73610,73611],{"class":553,"line":1832},[551,73612,73613],{},"            \"PDF\",\n",[551,73615,73616],{"class":553,"line":1838},[551,73617,73618],{},"            \"Seleccione uno o más formatos de exportación\"\n",[551,73620,73621],{"class":553,"line":1844},[551,73622,4758],{},[551,73624,73625],{"class":553,"line":1850},[551,73626,1139],{"emptyLinePlaceholder":238},[551,73628,73629],{"class":553,"line":1855},[551,73630,73631],{},"        \u002F\u002F Selección MÚLTIPLE\n",[551,73633,73634],{"class":553,"line":1861},[551,73635,73636],{},"        contexto.AllowMultiSelect = true;\n",[551,73638,73639],{"class":553,"line":1867},[551,73640,1139],{"emptyLinePlaceholder":238},[551,73642,73643],{"class":553,"line":1873},[551,73644,72874],{},[551,73646,73647],{"class":553,"line":1878},[551,73648,70659],{},[551,73650,73651],{"class":553,"line":1883},[551,73652,73263],{},[551,73654,73655],{"class":553,"line":1888},[551,73656,1139],{"emptyLinePlaceholder":238},[551,73658,73659],{"class":553,"line":4615},[551,73660,73272],{},[551,73662,73663],{"class":553,"line":4620},[551,73664,9062],{},[551,73666,73667],{"class":553,"line":4626},[551,73668,73669],{},"            \u002F\u002F Obtener TODAS las selecciones (plural: SelectedEntries)\n",[551,73671,73672],{"class":553,"line":4631},[551,73673,73674],{},"            StringCollection formatosElegidos = contexto.SelectedEntries;\n",[551,73676,73677],{"class":553,"line":4636},[551,73678,1139],{"emptyLinePlaceholder":238},[551,73680,73681],{"class":553,"line":4641},[551,73682,73683],{},"            if (formatosElegidos.Count == 0)\n",[551,73685,73686],{"class":553,"line":4647},[551,73687,12301],{},[551,73689,73690],{"class":553,"line":4653},[551,73691,73692],{},"                MessageBox.Show(\"No se seleccionó ningún formato\");\n",[551,73694,73695],{"class":553,"line":4659},[551,73696,47614],{},[551,73698,73699],{"class":553,"line":4665},[551,73700,12311],{},[551,73702,73703],{"class":553,"line":4671},[551,73704,1139],{"emptyLinePlaceholder":238},[551,73706,73707],{"class":553,"line":4677},[551,73708,73709],{},"            \u002F\u002F Exportar en cada formato seleccionado\n",[551,73711,73712],{"class":553,"line":4683},[551,73713,73714],{},"            foreach (string formato in formatosElegidos)\n",[551,73716,73717],{"class":553,"line":4689},[551,73718,12301],{},[551,73720,73721],{"class":553,"line":4695},[551,73722,73723],{},"                new BaseException(\n",[551,73725,73726],{"class":553,"line":4701},[551,73727,73728],{},"                    \"Exportando en formato: \" + formato,\n",[551,73730,73731],{"class":553,"line":4707},[551,73732,73733],{},"                    MessageLevel.Message\n",[551,73735,73736],{"class":553,"line":4713},[551,73737,73738],{},"                ).FixMessage();\n",[551,73740,73741],{"class":553,"line":4719},[551,73742,1139],{"emptyLinePlaceholder":238},[551,73744,73745],{"class":553,"line":4725},[551,73746,73747],{},"                \u002F\u002F Aquí iría la lógica de exportación para cada formato\n",[551,73749,73750],{"class":553,"line":4731},[551,73751,73752],{},"                System.Threading.Thread.Sleep(500);  \u002F\u002F Simular trabajo\n",[551,73754,73755],{"class":553,"line":4737},[551,73756,12311],{},[551,73758,73759],{"class":553,"line":4743},[551,73760,1139],{"emptyLinePlaceholder":238},[551,73762,73763],{"class":553,"line":4749},[551,73764,53598],{},[551,73766,73767],{"class":553,"line":4755},[551,73768,73769],{},"                \"Exportación completada en \" + formatosElegidos.Count + \" formato(s)\",\n",[551,73771,73772],{"class":553,"line":4761},[551,73773,71433],{},[551,73775,73776],{"class":553,"line":4766},[551,73777,53613],{},[551,73779,73780],{"class":553,"line":4771},[551,73781,53618],{},[551,73783,73784],{"class":553,"line":4777},[551,73785,53623],{},[551,73787,73788],{"class":553,"line":4782},[551,73789,9077],{},[551,73791,73792],{"class":553,"line":4787},[551,73793,9082],{},[551,73795,73796],{"class":553,"line":4793},[551,73797,9062],{},[551,73799,73800],{"class":553,"line":4799},[551,73801,73333],{},[551,73803,73804],{"class":553,"line":4805},[551,73805,9077],{},[551,73807,73808],{"class":553,"line":4811},[551,73809,1187],{},[551,73811,73812],{"class":553,"line":4817},[551,73813,1193],{},[43,73815],{},[46,73817,73819],{"id":73818},"_5-propiedades-útiles-de-listselectdecisioncontext","5. Propiedades útiles de ListSelectDecisionContext",[331,73821,73823],{"id":73822},"_51-allowmultiselect","5.1 AllowMultiSelect",[543,73825,73827],{"className":545,"code":73826,"language":547,"meta":228,"style":228},"\u002F\u002F Selección simple (default)\ncontexto.AllowMultiSelect = false;\n\n\u002F\u002F Selección múltiple\ncontexto.AllowMultiSelect = true;\n",[54,73828,73829,73834,73839,73843,73848],{"__ignoreMap":228},[551,73830,73831],{"class":553,"line":554},[551,73832,73833],{},"\u002F\u002F Selección simple (default)\n",[551,73835,73836],{"class":553,"line":229},[551,73837,73838],{},"contexto.AllowMultiSelect = false;\n",[551,73840,73841],{"class":553,"line":670},[551,73842,1139],{"emptyLinePlaceholder":238},[551,73844,73845],{"class":553,"line":1136},[551,73846,73847],{},"\u002F\u002F Selección múltiple\n",[551,73849,73850],{"class":553,"line":1142},[551,73851,73852],{},"contexto.AllowMultiSelect = true;\n",[331,73854,73856],{"id":73855},"_52-selectedentry-vs-selectedentries","5.2 SelectedEntry vs SelectedEntries",[543,73858,73860],{"className":545,"code":73859,"language":547,"meta":228,"style":228},"\u002F\u002F Para selección SIMPLE (una opción)\nstring seleccionado = contexto.SelectedEntry;\n\n\u002F\u002F Para selección MÚLTIPLE (varias opciones)\nStringCollection seleccionados = contexto.SelectedEntries;\n",[54,73861,73862,73867,73872,73876,73881],{"__ignoreMap":228},[551,73863,73864],{"class":553,"line":554},[551,73865,73866],{},"\u002F\u002F Para selección SIMPLE (una opción)\n",[551,73868,73869],{"class":553,"line":229},[551,73870,73871],{},"string seleccionado = contexto.SelectedEntry;\n",[551,73873,73874],{"class":553,"line":670},[551,73875,1139],{"emptyLinePlaceholder":238},[551,73877,73878],{"class":553,"line":1136},[551,73879,73880],{},"\u002F\u002F Para selección MÚLTIPLE (varias opciones)\n",[551,73882,73883],{"class":553,"line":1142},[551,73884,73885],{},"StringCollection seleccionados = contexto.SelectedEntries;\n",[13,73887,73888,5755,73890,73893,73894,73897,73898,73901,73902,41],{},[16,73889,50964],{},[54,73891,73892],{},"SelectedEntry"," (singular) si ",[54,73895,73896],{},"AllowMultiSelect = false",", y ",[54,73899,73900],{},"SelectedEntries"," (plural) si ",[54,73903,73904],{},"AllowMultiSelect = true",[43,73906],{},[46,73908,73910],{"id":73909},"_6-casos-de-uso-prácticos","6. Casos de uso prácticos",[331,73912,73914],{"id":73913},"_61-menú-de-opciones","6.1 Menú de opciones",[543,73916,73918],{"className":545,"code":73917,"language":547,"meta":228,"style":228},"StringCollection opciones = new StringCollection();\nopciones.Add(\"Generar numeración\");\nopciones.Add(\"Validar proyecto\");\nopciones.Add(\"Exportar a PDF\");\nopciones.Add(\"Limpiar datos temporales\");\n\nListSelectDecisionContext menu = new ListSelectDecisionContext(\n    opciones,\n    \"Generar numeración\",\n    \"Seleccione una acción\"\n);\nmenu.AllowMultiSelect = false;\n\nvar resultado = new Decider().Decide(menu);\nif (resultado == EnumDecisionReturn.eOK)\n{\n    switch (menu.SelectedEntry)\n    {\n        case \"Generar numeración\":\n            GenerarNumeracion();\n            break;\n        case \"Validar proyecto\":\n            ValidarProyecto();\n            break;\n        case \"Exportar a PDF\":\n            ExportarPDF();\n            break;\n        case \"Limpiar datos temporales\":\n            LimpiarDatos();\n            break;\n    }\n}\n",[54,73919,73920,73924,73929,73934,73939,73944,73948,73953,73958,73963,73968,73972,73977,73981,73986,73990,73994,73999,74003,74008,74013,74017,74022,74027,74031,74036,74041,74045,74050,74055,74059,74063],{"__ignoreMap":228},[551,73921,73922],{"class":553,"line":554},[551,73923,72616],{},[551,73925,73926],{"class":553,"line":229},[551,73927,73928],{},"opciones.Add(\"Generar numeración\");\n",[551,73930,73931],{"class":553,"line":670},[551,73932,73933],{},"opciones.Add(\"Validar proyecto\");\n",[551,73935,73936],{"class":553,"line":1136},[551,73937,73938],{},"opciones.Add(\"Exportar a PDF\");\n",[551,73940,73941],{"class":553,"line":1142},[551,73942,73943],{},"opciones.Add(\"Limpiar datos temporales\");\n",[551,73945,73946],{"class":553,"line":1148},[551,73947,1139],{"emptyLinePlaceholder":238},[551,73949,73950],{"class":553,"line":1154},[551,73951,73952],{},"ListSelectDecisionContext menu = new ListSelectDecisionContext(\n",[551,73954,73955],{"class":553,"line":1160},[551,73956,73957],{},"    opciones,\n",[551,73959,73960],{"class":553,"line":1166},[551,73961,73962],{},"    \"Generar numeración\",\n",[551,73964,73965],{"class":553,"line":1172},[551,73966,73967],{},"    \"Seleccione una acción\"\n",[551,73969,73970],{"class":553,"line":1178},[551,73971,3967],{},[551,73973,73974],{"class":553,"line":1184},[551,73975,73976],{},"menu.AllowMultiSelect = false;\n",[551,73978,73979],{"class":553,"line":1190},[551,73980,1139],{"emptyLinePlaceholder":238},[551,73982,73983],{"class":553,"line":1472},[551,73984,73985],{},"var resultado = new Decider().Decide(menu);\n",[551,73987,73988],{"class":553,"line":1477},[551,73989,72716],{},[551,73991,73992],{"class":553,"line":1797},[551,73993,1151],{},[551,73995,73996],{"class":553,"line":1802},[551,73997,73998],{},"    switch (menu.SelectedEntry)\n",[551,74000,74001],{"class":553,"line":1808},[551,74002,1169],{},[551,74004,74005],{"class":553,"line":1814},[551,74006,74007],{},"        case \"Generar numeración\":\n",[551,74009,74010],{"class":553,"line":1820},[551,74011,74012],{},"            GenerarNumeracion();\n",[551,74014,74015],{"class":553,"line":1826},[551,74016,24904],{},[551,74018,74019],{"class":553,"line":1832},[551,74020,74021],{},"        case \"Validar proyecto\":\n",[551,74023,74024],{"class":553,"line":1838},[551,74025,74026],{},"            ValidarProyecto();\n",[551,74028,74029],{"class":553,"line":1844},[551,74030,24904],{},[551,74032,74033],{"class":553,"line":1850},[551,74034,74035],{},"        case \"Exportar a PDF\":\n",[551,74037,74038],{"class":553,"line":1855},[551,74039,74040],{},"            ExportarPDF();\n",[551,74042,74043],{"class":553,"line":1861},[551,74044,24904],{},[551,74046,74047],{"class":553,"line":1867},[551,74048,74049],{},"        case \"Limpiar datos temporales\":\n",[551,74051,74052],{"class":553,"line":1873},[551,74053,74054],{},"            LimpiarDatos();\n",[551,74056,74057],{"class":553,"line":1878},[551,74058,24904],{},[551,74060,74061],{"class":553,"line":1883},[551,74062,1187],{},[551,74064,74065],{"class":553,"line":1888},[551,74066,1193],{},[331,74068,74070],{"id":74069},"_62-seleccionar-páginas-del-proyecto","6.2 Seleccionar páginas del proyecto",[543,74072,74074],{"className":545,"code":74073,"language":547,"meta":228,"style":228},"\u002F\u002F Obtener lista de páginas (simulado)\nStringCollection paginas = new StringCollection();\npaginas.Add(\"=001-Hoja principal\");\npaginas.Add(\"=002-Alimentación\");\npaginas.Add(\"=003-Control\");\npaginas.Add(\"=004-Bornes\");\n\nListSelectDecisionContext seleccionPaginas = new ListSelectDecisionContext(\n    paginas,\n    paginas[0],\n    \"Seleccione las páginas a procesar\"\n);\nseleccionPaginas.AllowMultiSelect = true;  \u002F\u002F Permitir varias\n\nvar resultado = new Decider().Decide(seleccionPaginas);\nif (resultado == EnumDecisionReturn.eOK)\n{\n    foreach (string pagina in seleccionPaginas.SelectedEntries)\n    {\n        ProcesarPagina(pagina);\n    }\n}\n",[54,74075,74076,74081,74086,74091,74096,74101,74106,74110,74115,74120,74125,74130,74134,74139,74143,74148,74152,74156,74161,74165,74170,74174],{"__ignoreMap":228},[551,74077,74078],{"class":553,"line":554},[551,74079,74080],{},"\u002F\u002F Obtener lista de páginas (simulado)\n",[551,74082,74083],{"class":553,"line":229},[551,74084,74085],{},"StringCollection paginas = new StringCollection();\n",[551,74087,74088],{"class":553,"line":670},[551,74089,74090],{},"paginas.Add(\"=001-Hoja principal\");\n",[551,74092,74093],{"class":553,"line":1136},[551,74094,74095],{},"paginas.Add(\"=002-Alimentación\");\n",[551,74097,74098],{"class":553,"line":1142},[551,74099,74100],{},"paginas.Add(\"=003-Control\");\n",[551,74102,74103],{"class":553,"line":1148},[551,74104,74105],{},"paginas.Add(\"=004-Bornes\");\n",[551,74107,74108],{"class":553,"line":1154},[551,74109,1139],{"emptyLinePlaceholder":238},[551,74111,74112],{"class":553,"line":1160},[551,74113,74114],{},"ListSelectDecisionContext seleccionPaginas = new ListSelectDecisionContext(\n",[551,74116,74117],{"class":553,"line":1166},[551,74118,74119],{},"    paginas,\n",[551,74121,74122],{"class":553,"line":1172},[551,74123,74124],{},"    paginas[0],\n",[551,74126,74127],{"class":553,"line":1178},[551,74128,74129],{},"    \"Seleccione las páginas a procesar\"\n",[551,74131,74132],{"class":553,"line":1184},[551,74133,3967],{},[551,74135,74136],{"class":553,"line":1190},[551,74137,74138],{},"seleccionPaginas.AllowMultiSelect = true;  \u002F\u002F Permitir varias\n",[551,74140,74141],{"class":553,"line":1472},[551,74142,1139],{"emptyLinePlaceholder":238},[551,74144,74145],{"class":553,"line":1477},[551,74146,74147],{},"var resultado = new Decider().Decide(seleccionPaginas);\n",[551,74149,74150],{"class":553,"line":1797},[551,74151,72716],{},[551,74153,74154],{"class":553,"line":1802},[551,74155,1151],{},[551,74157,74158],{"class":553,"line":1808},[551,74159,74160],{},"    foreach (string pagina in seleccionPaginas.SelectedEntries)\n",[551,74162,74163],{"class":553,"line":1814},[551,74164,1169],{},[551,74166,74167],{"class":553,"line":1820},[551,74168,74169],{},"        ProcesarPagina(pagina);\n",[551,74171,74172],{"class":553,"line":1826},[551,74173,1187],{},[551,74175,74176],{"class":553,"line":1832},[551,74177,1193],{},[43,74179],{},[46,74181,57526],{"id":57525},[331,74183,74185],{"id":74184},"_71-validar-que-hay-selección-para-allowmultiselect-true","7.1 Validar que hay selección (para AllowMultiSelect = true)",[543,74187,74189],{"className":545,"code":74188,"language":547,"meta":228,"style":228},"if (resultado == EnumDecisionReturn.eOK)\n{\n    if (contexto.SelectedEntries.Count == 0)\n    {\n        MessageBox.Show(\"Debe seleccionar al menos una opción\");\n        return;\n    }\n\n    \u002F\u002F Procesar selecciones...\n}\n",[54,74190,74191,74195,74199,74204,74208,74213,74217,74221,74225,74230],{"__ignoreMap":228},[551,74192,74193],{"class":553,"line":554},[551,74194,72716],{},[551,74196,74197],{"class":553,"line":229},[551,74198,1151],{},[551,74200,74201],{"class":553,"line":670},[551,74202,74203],{},"    if (contexto.SelectedEntries.Count == 0)\n",[551,74205,74206],{"class":553,"line":1136},[551,74207,1169],{},[551,74209,74210],{"class":553,"line":1142},[551,74211,74212],{},"        MessageBox.Show(\"Debe seleccionar al menos una opción\");\n",[551,74214,74215],{"class":553,"line":1148},[551,74216,45390],{},[551,74218,74219],{"class":553,"line":1154},[551,74220,1187],{},[551,74222,74223],{"class":553,"line":1160},[551,74224,1139],{"emptyLinePlaceholder":238},[551,74226,74227],{"class":553,"line":1166},[551,74228,74229],{},"    \u002F\u002F Procesar selecciones...\n",[551,74231,74232],{"class":553,"line":1172},[551,74233,1193],{},[331,74235,74237],{"id":74236},"_72-usar-nombres-descriptivos-en-la-lista","7.2 Usar nombres descriptivos en la lista",[543,74239,74241],{"className":545,"code":74240,"language":547,"meta":228,"style":228},"\u002F\u002F ✅ Bien - Descriptivo\nopciones.Add(\"Exportar proyecto a PDF con marcas de agua\");\nopciones.Add(\"Exportar proyecto a PDF sin marcas de agua\");\n\n\u002F\u002F ❌ Mal - Vago\nopciones.Add(\"Opción 1\");\nopciones.Add(\"Opción 2\");\n",[54,74242,74243,74248,74253,74258,74262,74267,74271],{"__ignoreMap":228},[551,74244,74245],{"class":553,"line":554},[551,74246,74247],{},"\u002F\u002F ✅ Bien - Descriptivo\n",[551,74249,74250],{"class":553,"line":229},[551,74251,74252],{},"opciones.Add(\"Exportar proyecto a PDF con marcas de agua\");\n",[551,74254,74255],{"class":553,"line":670},[551,74256,74257],{},"opciones.Add(\"Exportar proyecto a PDF sin marcas de agua\");\n",[551,74259,74260],{"class":553,"line":1136},[551,74261,1139],{"emptyLinePlaceholder":238},[551,74263,74264],{"class":553,"line":1142},[551,74265,74266],{},"\u002F\u002F ❌ Mal - Vago\n",[551,74268,74269],{"class":553,"line":1148},[551,74270,72621],{},[551,74272,74273],{"class":553,"line":1154},[551,74274,72626],{},[331,74276,74278],{"id":74277},"_73-ordenar-alfabéticamente-si-tiene-sentido","7.3 Ordenar alfabéticamente si tiene sentido",[543,74280,74282],{"className":545,"code":74281,"language":547,"meta":228,"style":228},"StringCollection formatos = new StringCollection();\nformatos.Add(\"CSV\");\nformatos.Add(\"DWG\");\nformatos.Add(\"DXF\");\nformatos.Add(\"PDF\");\nformatos.Add(\"XML\");\n\u002F\u002F Más fácil de encontrar si está ordenado\n",[54,74283,74284,74289,74294,74299,74304,74309,74314],{"__ignoreMap":228},[551,74285,74286],{"class":553,"line":554},[551,74287,74288],{},"StringCollection formatos = new StringCollection();\n",[551,74290,74291],{"class":553,"line":229},[551,74292,74293],{},"formatos.Add(\"CSV\");\n",[551,74295,74296],{"class":553,"line":670},[551,74297,74298],{},"formatos.Add(\"DWG\");\n",[551,74300,74301],{"class":553,"line":1136},[551,74302,74303],{},"formatos.Add(\"DXF\");\n",[551,74305,74306],{"class":553,"line":1142},[551,74307,74308],{},"formatos.Add(\"PDF\");\n",[551,74310,74311],{"class":553,"line":1148},[551,74312,74313],{},"formatos.Add(\"XML\");\n",[551,74315,74316],{"class":553,"line":1154},[551,74317,74318],{},"\u002F\u002F Más fácil de encontrar si está ordenado\n",[43,74320],{},[46,74322,22685],{"id":22684},[13,74324,74325,74327],{},[16,74326,72479],{}," permite mostrar una lista de opciones personalizada para que el usuario seleccione.",[13,74329,74330],{},[16,74331,66822],{},[126,74333,74334,74341,74347,74354],{},[88,74335,74336,74337,74340],{},"Creas una ",[54,74338,74339],{},"StringCollection"," con las opciones",[88,74342,74343,74344,74346],{},"Creas un ",[54,74345,72479],{}," con esa lista",[88,74348,74349,74350,74353],{},"Usas ",[54,74351,74352],{},"Decider.Decide(contexto)"," para mostrar el diálogo",[88,74355,74356],{},"Si el usuario confirma (OK), obtienes su selección",[13,74358,74359],{},[16,74360,74361],{},"Selección simple vs múltiple:",[126,74363,74364,74372],{},[88,74365,74366,74368,74369,74371],{},[54,74367,73896],{},": El usuario elige UNA opción → usa ",[54,74370,73892],{}," (singular)",[88,74373,74374,74376,74377,74379],{},[54,74375,73904],{},": El usuario elige VARIAS opciones → usa ",[54,74378,73900],{}," (plural)",[13,74381,74382],{},[16,74383,74384],{},"Casos de uso típicos:",[126,74386,74387,74390,74393,74396],{},[88,74388,74389],{},"Menús de opciones",[88,74391,74392],{},"Seleccionar formato de exportación",[88,74394,74395],{},"Elegir páginas\u002Fcomponentes a procesar",[88,74397,74398],{},"Cualquier escenario con 3+ opciones",[13,74400,74401],{},[16,74402,74403],{},"ListSelectDecisionContext es ideal cuando Decider con botones fijos (Sí\u002FNo\u002FOK) no es suficiente.",[43,74405],{},[46,74407,5728],{"id":5727},[13,74409,74410],{},[16,74411,74412],{},"P: ¿Puedo agregar opciones dinámicamente (por ejemplo, desde archivos)?",[13,74414,74415,74416,74418],{},"R: Sí. Puedes llenar la ",[54,74417,74339],{}," desde cualquier fuente:",[543,74420,74422],{"className":545,"code":74421,"language":547,"meta":228,"style":228},"string[] archivos = Directory.GetFiles(@\"C:\\temp\", \"*.xml\");\nStringCollection opciones = new StringCollection();\nforeach (string archivo in archivos)\n{\n    opciones.Add(Path.GetFileName(archivo));\n}\n",[54,74423,74424,74429,74433,74438,74442,74447],{"__ignoreMap":228},[551,74425,74426],{"class":553,"line":554},[551,74427,74428],{},"string[] archivos = Directory.GetFiles(@\"C:\\temp\", \"*.xml\");\n",[551,74430,74431],{"class":553,"line":229},[551,74432,72616],{},[551,74434,74435],{"class":553,"line":670},[551,74436,74437],{},"foreach (string archivo in archivos)\n",[551,74439,74440],{"class":553,"line":1136},[551,74441,1151],{},[551,74443,74444],{"class":553,"line":1142},[551,74445,74446],{},"    opciones.Add(Path.GetFileName(archivo));\n",[551,74448,74449],{"class":553,"line":1148},[551,74450,1193],{},[13,74452,74453],{},[16,74454,74455],{},"P: ¿Qué pasa si la lista está vacía?",[13,74457,74458],{},"R: El diálogo se mostrará vacío. Es buena práctica validar que hay al menos una opción antes de mostrar.",[13,74460,74461],{},[16,74462,74463],{},"P: ¿Puedo usar objetos en lugar de strings?",[13,74465,74466,74467,74469,74470,74472,74473,74476],{},"R: No. ",[54,74468,72479],{}," solo acepta ",[54,74471,74339],{},". Si tienes objetos, convierte a string (por ejemplo, ",[54,74474,74475],{},"objeto.ToString()",") y luego mapea de vuelta.",[13,74478,74479],{},[16,74480,74481],{},"P: ¿Puedo cambiar el estilo del diálogo (colores, tamaño)?",[13,74483,74484],{},"R: No directamente. El estilo lo controla EPLAN. Para mayor personalización, considera crear tu propio Form con Windows.Forms.",[43,74486],{},[46,74488,51782],{"id":36078},[331,74490,51786],{"id":51785},[13,74492,74493],{},[16,74494,70219],{},[331,74496,51795],{"id":51794},[13,74498,74499],{},[16,74500,74501],{},"Ver capítulos siguientes",[13,74503,74504,74505,74507],{},"En el próximo capítulo aprenderás a crear acciones ",[54,74506,49919],{}," que retornan valores, lo que permite usar tus scripts desde otros scripts o desde la línea de comandos de EPLAN.",[43,74509],{},[13,74511,74512,10676,74514,68640,74516,93,74518,74521,93,74523],{},[31,74513,657],{},[31,74515,10679],{},[31,74517,10683],{},[54,74519,74520],{},"code\u002Fcap-25\u002F",[31,74522,51827],{},[54,74524,72741],{},[660,74526,662],{},{"title":228,"searchDepth":229,"depth":229,"links":74528},[74529,74530,74531,74532,74536,74540,74544,74548,74552,74556,74561,74562,74563],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":72402,"depth":229,"text":72403},{"id":72484,"depth":229,"text":72485,"children":74533},[74534,74535],{"id":49680,"depth":670,"text":49681},{"id":72513,"depth":670,"text":72514},{"id":72598,"depth":229,"text":72599,"children":74537},[74538,74539],{"id":23266,"depth":670,"text":23267},{"id":65698,"depth":670,"text":65699},{"id":72957,"depth":229,"text":72958,"children":74541},[74542,74543],{"id":72961,"depth":670,"text":72962},{"id":73022,"depth":670,"text":73023},{"id":73106,"depth":229,"text":73107,"children":74545},[74546,74547],{"id":73110,"depth":670,"text":73111},{"id":73517,"depth":670,"text":73518},{"id":73818,"depth":229,"text":73819,"children":74549},[74550,74551],{"id":73822,"depth":670,"text":73823},{"id":73855,"depth":670,"text":73856},{"id":73909,"depth":229,"text":73910,"children":74553},[74554,74555],{"id":73913,"depth":670,"text":73914},{"id":74069,"depth":670,"text":74070},{"id":57525,"depth":229,"text":57526,"children":74557},[74558,74559,74560],{"id":74184,"depth":670,"text":74185},{"id":74236,"depth":670,"text":74237},{"id":74277,"depth":670,"text":74278},{"id":22684,"depth":229,"text":22685},{"id":5727,"depth":229,"text":5728},{"id":36078,"depth":229,"text":51782,"children":74564},[74565,74566],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Permite al usuario elegir de una lista con ListSelect en un script EPLAN en C# para crear automatizaciones interactivas en EPLAN Electric P8.",{},"\u002Fguia\u002Finteraccion-usuario\u002Fcap-25-listselect-seleccion-lista",{"title":72344,"description":74567},"guia\u002Finteraccion-usuario\u002Fcap-25-listselect-seleccion-lista","7cqug3KGt6Ob3d2gEP1ekZ62-PPg7ebpIQ3g387ctn0",{"id":74574,"title":74575,"body":74576,"description":75235,"extension":236,"meta":75236,"navigation":238,"path":75237,"seo":75238,"stem":75239,"tagline":242,"__hash__":75240},"guia\u002Fguia\u002Fbarras-progreso\u002Fcap-26-simple-progress.md","Capítulo 26: Barra de progreso en EPLAN (SimpleProgress)",{"type":7,"value":74577,"toc":75215},[74578,74590,74592,74594,74596,74620,74622,74624,74643,74645,74649,74652,74660,74662,74666,74670,74678,74686,74688,74770,74772,74776,74852,74854,74858,74861,75058,75062,75083,75085,75089,75105,75108,75121,75123,75127,75136,75153,75155,75157,75187,75189,75191,75193,75197,75199,75204,75213],[10,74579,74580],{},[13,74581,74582,19,74585,19,74588,56383],{},[16,74583,74584],{},"Parte VII: Barras de progreso",[16,74586,74587],{},"Sección 15: Progress",[16,74589,25],{},[43,74591],{},[46,74593,268],{"id":267},[13,74595,702],{},[126,74597,74598,74603,74606,74617],{},[88,74599,74600,74601,32897],{},"Implementar la barra de progreso nativa de EPLAN (",[54,74602,56162],{},[88,74604,74605],{},"Mostrar el avance de tareas largas para evitar que EPLAN parezca congelado",[88,74607,55068,74608,4000,74611,4842,74614],{},[54,74609,74610],{},"BeginPart",[54,74612,74613],{},"EndPart",[54,74615,74616],{},"Step",[88,74618,74619],{},"Configurar opciones de cancelación (permitir al usuario abortar)",[43,74621],{},[46,74623,320],{"id":319},[126,74625,74626,74629,74636],{},[88,74627,74628],{},"Haber completado el Capítulo 22 (Decider)",[88,74630,74631,74632,4000,74634,32897],{},"Entender bucles (",[54,74633,23258],{},[54,74635,23717],{},[88,74637,74638,74639,74642],{},"Conocer ",[54,74640,74641],{},"System.Threading.Thread.Sleep"," (para simular carga en ejemplos)",[43,74644],{},[46,74646,74648],{"id":74647},"introducción-el-problema-del-eplan-congelado","Introducción: El problema del \"EPLAN congelado\"",[13,74650,74651],{},"Cuando ejecutas un script que tarda mucho tiempo (ej. procesar 500 páginas), la interfaz de EPLAN se congela. El usuario no sabe si el programa está trabajando o si se bloqueó.",[13,74653,74654,74656,74657,74659],{},[16,74655,51401],{}," EPLAN proporciona la clase ",[54,74658,56162],{}," para mostrar una barra de carga estándar.",[43,74661],{},[46,74663,74665],{"id":74664},"_1-la-clase-progress","1. La clase Progress",[331,74667,74669],{"id":74668},"_11-definición-y-namespace","1.1 Definición y Namespace",[13,74671,74672,74673,74675,74676,41],{},"La clase ",[54,74674,56162],{}," se encuentra en ",[54,74677,1248],{},[543,74679,74680],{"className":545,"code":1128,"language":547,"meta":228,"style":228},[54,74681,74682],{"__ignoreMap":228},[551,74683,74684],{"class":553,"line":554},[551,74685,1128],{},[331,74687,52047],{"id":52046},[543,74689,74691],{"className":545,"code":74690,"language":547,"meta":228,"style":228},"\u002F\u002F 1. Crear instancia\nProgress progress = new Progress(\"SimpleProgress\");\n\n\u002F\u002F 2. Configurar (título y máximo)\nprogress.BeginPart(100, \"Procesando datos...\");\n\n\u002F\u002F 3. Mostrar inmediatamente\nprogress.ShowImmediately();\n\n\u002F\u002F 4. Actualizar en un bucle\nfor (int i = 0; i \u003C 100; i++)\n{\n    progress.Step(1); \u002F\u002F Avanzar 1 paso\n}\n\n\u002F\u002F 5. Finalizar\nprogress.EndPart();\n",[54,74692,74693,74698,74702,74706,74711,74716,74720,74725,74729,74733,74738,74743,74747,74752,74756,74760,74765],{"__ignoreMap":228},[551,74694,74695],{"class":553,"line":554},[551,74696,74697],{},"\u002F\u002F 1. Crear instancia\n",[551,74699,74700],{"class":553,"line":229},[551,74701,55859],{},[551,74703,74704],{"class":553,"line":670},[551,74705,1139],{"emptyLinePlaceholder":238},[551,74707,74708],{"class":553,"line":1136},[551,74709,74710],{},"\u002F\u002F 2. Configurar (título y máximo)\n",[551,74712,74713],{"class":553,"line":1142},[551,74714,74715],{},"progress.BeginPart(100, \"Procesando datos...\");\n",[551,74717,74718],{"class":553,"line":1148},[551,74719,1139],{"emptyLinePlaceholder":238},[551,74721,74722],{"class":553,"line":1154},[551,74723,74724],{},"\u002F\u002F 3. Mostrar inmediatamente\n",[551,74726,74727],{"class":553,"line":1160},[551,74728,55879],{},[551,74730,74731],{"class":553,"line":1166},[551,74732,1139],{"emptyLinePlaceholder":238},[551,74734,74735],{"class":553,"line":1172},[551,74736,74737],{},"\u002F\u002F 4. Actualizar en un bucle\n",[551,74739,74740],{"class":553,"line":1178},[551,74741,74742],{},"for (int i = 0; i \u003C 100; i++)\n",[551,74744,74745],{"class":553,"line":1184},[551,74746,1151],{},[551,74748,74749],{"class":553,"line":1190},[551,74750,74751],{},"    progress.Step(1); \u002F\u002F Avanzar 1 paso\n",[551,74753,74754],{"class":553,"line":1472},[551,74755,1193],{},[551,74757,74758],{"class":553,"line":1477},[551,74759,1139],{"emptyLinePlaceholder":238},[551,74761,74762],{"class":553,"line":1797},[551,74763,74764],{},"\u002F\u002F 5. Finalizar\n",[551,74766,74767],{"class":553,"line":1802},[551,74768,74769],{},"progress.EndPart();\n",[43,74771],{},[46,74773,74775],{"id":74774},"_2-métodos-principales","2. Métodos principales",[6589,74777,74778,74787],{},[6592,74779,74780],{},[6595,74781,74782,74785],{},[6598,74783,74784],{},"Método",[6598,74786,65966],{},[6611,74788,74789,74799,74809,74819,74829,74842],{},[6595,74790,74791,74796],{},[6616,74792,74793],{},[54,74794,74795],{},"BeginPart(total, título)",[6616,74797,74798],{},"Inicia la barra con un valor máximo (total) y un título.",[6595,74800,74801,74806],{},[6616,74802,74803],{},[54,74804,74805],{},"ShowImmediately()",[6616,74807,74808],{},"Fuerza que la barra aparezca instantáneamente (si no, puede tardar un poco).",[6595,74810,74811,74816],{},[6616,74812,74813],{},[54,74814,74815],{},"SetActionText(texto)",[6616,74817,74818],{},"Cambia el texto descriptivo debajo de la barra.",[6595,74820,74821,74826],{},[6616,74822,74823],{},[54,74824,74825],{},"Step(cantidad)",[6616,74827,74828],{},"Incrementa el progreso en la cantidad especificada.",[6595,74830,74831,74836],{},[6616,74832,74833],{},[54,74834,74835],{},"EndPart(bool)",[6616,74837,74838,74839,74841],{},"Cierra la barra. Pasar ",[54,74840,2853],{}," para limpiar.",[6595,74843,74844,74849],{},[6616,74845,74846],{},[54,74847,74848],{},"SetAllowCancel(bool)",[6616,74850,74851],{},"Permite que el usuario cancele el proceso con el botón \"Cancelar\".",[43,74853],{},[46,74855,74857],{"id":74856},"_3-ejemplo-práctico-procesamiento-simulado","3. Ejemplo práctico: Procesamiento simulado",[13,74859,74860],{},"Vamos a crear un script que simule una tarea larga (como exportar archivos) usando una barra de progreso.",[543,74862,74864],{"className":545,"code":74863,"language":547,"meta":228,"style":228},"using Eplan.EplApi.Base;\nusing Eplan.EplApi.Scripting;\nusing System.Threading; \u002F\u002F Para Sleep\n\npublic class EjemploProgress\n{\n    [Start]\n    public void Function()\n    {\n        int totalPasos = 20;\n\n        \u002F\u002F 1. Iniciar Progress\n        Progress progress = new Progress(\"SimpleProgress\");\n        progress.SetAllowCancel(true); \u002F\u002F Permitir cancelar\n        progress.BeginPart(totalPasos, \"Iniciando proceso...\");\n        progress.ShowImmediately();\n\n        try\n        {\n            for (int i = 0; i \u003C totalPasos; i++)\n            {\n                \u002F\u002F 2. Verificar si el usuario canceló\n                if (progress.Canceled())\n                {\n                    new BaseException(\"Proceso cancelado por usuario\", MessageLevel.Warning).FixMessage();\n                    break;\n                }\n\n                \u002F\u002F 3. Actualizar texto y barra\n                progress.SetActionText(\"Procesando elemento \" + (i + 1) + \" de \" + totalPasos);\n                progress.Step(1);\n\n                \u002F\u002F IMPORTANTE: Simular trabajo\n                Thread.Sleep(200); \u002F\u002F 0.2 segundos por paso\n            }\n        }\n        finally\n        {\n            \u002F\u002F 4. Siempre finalizar la barra\n            progress.EndPart();\n        }\n    }\n}\n",[54,74865,74866,74870,74874,74879,74883,74888,74892,74896,74900,74904,74909,74913,74918,74923,74928,74933,74938,74942,74946,74950,74955,74959,74964,74969,74973,74978,74983,74987,74991,74996,75001,75006,75010,75015,75020,75024,75028,75032,75036,75041,75046,75050,75054],{"__ignoreMap":228},[551,74867,74868],{"class":553,"line":554},[551,74869,1128],{},[551,74871,74872],{"class":553,"line":229},[551,74873,49898],{},[551,74875,74876],{"class":553,"line":670},[551,74877,74878],{},"using System.Threading; \u002F\u002F Para Sleep\n",[551,74880,74881],{"class":553,"line":1136},[551,74882,1139],{"emptyLinePlaceholder":238},[551,74884,74885],{"class":553,"line":1142},[551,74886,74887],{},"public class EjemploProgress\n",[551,74889,74890],{"class":553,"line":1148},[551,74891,1151],{},[551,74893,74894],{"class":553,"line":1154},[551,74895,1157],{},[551,74897,74898],{"class":553,"line":1160},[551,74899,57216],{},[551,74901,74902],{"class":553,"line":1166},[551,74903,1169],{},[551,74905,74906],{"class":553,"line":1172},[551,74907,74908],{},"        int totalPasos = 20;\n",[551,74910,74911],{"class":553,"line":1178},[551,74912,1139],{"emptyLinePlaceholder":238},[551,74914,74915],{"class":553,"line":1184},[551,74916,74917],{},"        \u002F\u002F 1. Iniciar Progress\n",[551,74919,74920],{"class":553,"line":1190},[551,74921,74922],{},"        Progress progress = new Progress(\"SimpleProgress\");\n",[551,74924,74925],{"class":553,"line":1472},[551,74926,74927],{},"        progress.SetAllowCancel(true); \u002F\u002F Permitir cancelar\n",[551,74929,74930],{"class":553,"line":1477},[551,74931,74932],{},"        progress.BeginPart(totalPasos, \"Iniciando proceso...\");\n",[551,74934,74935],{"class":553,"line":1797},[551,74936,74937],{},"        progress.ShowImmediately();\n",[551,74939,74940],{"class":553,"line":1802},[551,74941,1139],{"emptyLinePlaceholder":238},[551,74943,74944],{"class":553,"line":1808},[551,74945,41211],{},[551,74947,74948],{"class":553,"line":1814},[551,74949,9062],{},[551,74951,74952],{"class":553,"line":1820},[551,74953,74954],{},"            for (int i = 0; i \u003C totalPasos; i++)\n",[551,74956,74957],{"class":553,"line":1826},[551,74958,12301],{},[551,74960,74961],{"class":553,"line":1832},[551,74962,74963],{},"                \u002F\u002F 2. Verificar si el usuario canceló\n",[551,74965,74966],{"class":553,"line":1838},[551,74967,74968],{},"                if (progress.Canceled())\n",[551,74970,74971],{"class":553,"line":1844},[551,74972,28010],{},[551,74974,74975],{"class":553,"line":1850},[551,74976,74977],{},"                    new BaseException(\"Proceso cancelado por usuario\", MessageLevel.Warning).FixMessage();\n",[551,74979,74980],{"class":553,"line":1855},[551,74981,74982],{},"                    break;\n",[551,74984,74985],{"class":553,"line":1861},[551,74986,28025],{},[551,74988,74989],{"class":553,"line":1867},[551,74990,1139],{"emptyLinePlaceholder":238},[551,74992,74993],{"class":553,"line":1873},[551,74994,74995],{},"                \u002F\u002F 3. Actualizar texto y barra\n",[551,74997,74998],{"class":553,"line":1878},[551,74999,75000],{},"                progress.SetActionText(\"Procesando elemento \" + (i + 1) + \" de \" + totalPasos);\n",[551,75002,75003],{"class":553,"line":1883},[551,75004,75005],{},"                progress.Step(1);\n",[551,75007,75008],{"class":553,"line":1888},[551,75009,1139],{"emptyLinePlaceholder":238},[551,75011,75012],{"class":553,"line":4615},[551,75013,75014],{},"                \u002F\u002F IMPORTANTE: Simular trabajo\n",[551,75016,75017],{"class":553,"line":4620},[551,75018,75019],{},"                Thread.Sleep(200); \u002F\u002F 0.2 segundos por paso\n",[551,75021,75022],{"class":553,"line":4626},[551,75023,12311],{},[551,75025,75026],{"class":553,"line":4631},[551,75027,9077],{},[551,75029,75030],{"class":553,"line":4636},[551,75031,48402],{},[551,75033,75034],{"class":553,"line":4641},[551,75035,9062],{},[551,75037,75038],{"class":553,"line":4647},[551,75039,75040],{},"            \u002F\u002F 4. Siempre finalizar la barra\n",[551,75042,75043],{"class":553,"line":4653},[551,75044,75045],{},"            progress.EndPart();\n",[551,75047,75048],{"class":553,"line":4659},[551,75049,9077],{},[551,75051,75052],{"class":553,"line":4665},[551,75053,1187],{},[551,75055,75056],{"class":553,"line":4671},[551,75057,1193],{},[331,75059,75061],{"id":75060},"notas-sobre-el-ejemplo","Notas sobre el ejemplo:",[126,75063,75064,75073],{},[88,75065,75066,75069,75070,75072],{},[54,75067,75068],{},"progress.Canceled()",": Devuelve ",[54,75071,2853],{}," si el usuario presionó Cancelar. Es vital comprobarlo dentro del bucle.",[88,75074,75075,75078,75079,75082],{},[54,75076,75077],{},"try-finally",": Asegura que ",[54,75080,75081],{},"progress.EndPart()"," se llame incluso si ocurre un error, para que la barra no se quede \"pegada\" en pantalla.",[43,75084],{},[46,75086,75088],{"id":75087},"_4-patrón-recomendado-progress-en-bloques-using","4. Patrón recomendado: Progress en bloques using",[13,75090,75091,75092,75095,75096,75098,75099,75101,75102,75104],{},"Aunque C# usa ",[54,75093,75094],{},"IDisposable",", la clase ",[54,75097,56162],{}," de EPLAN API no implementa ",[54,75100,75094],{}," de forma tradicional en versiones antiguas, por lo que el patrón ",[54,75103,75077],{}," es el más seguro.",[13,75106,75107],{},"Sin embargo, si quieres encapsular la lógica, asegúrate siempre de cerrar la barra.",[13,75109,75110,75112,75113,75116,75117,75120],{},[16,75111,54349],{}," Olvidar llamar a ",[54,75114,75115],{},"EndPart()",".\n",[16,75118,75119],{},"Consecuencia:"," La barra de progreso sigue visible sobre EPLAN aunque el script haya terminado.",[43,75122],{},[46,75124,75126],{"id":75125},"_5-progress-vs-commandlineinterpreter","5. Progress vs CommandLineInterpreter",[13,75128,75129,75130,75132,75133,75135],{},"Algunos comandos de ",[54,75131,53274],{}," (como ",[54,75134,59506],{},") muestran su propia barra de progreso.",[126,75137,75138,75144],{},[88,75139,50352,75140,75143],{},[54,75141,75142],{},"Execute(\"export\")",", EPLAN manejará su propia barra.",[88,75145,75146,75147,75150,75151,41],{},"Si tu script hace un bucle que llama muchas veces a comandos rápidos, o procesa lógica propia (leer archivos, cálculos), ",[16,75148,75149],{},"tú"," debes crear la barra ",[54,75152,56162],{},[43,75154],{},[46,75156,22685],{"id":22684},[126,75158,75159,75164,75175,75182],{},[88,75160,10479,75161,75163],{},[16,75162,56162],{}," para tareas que tomen más de 1-2 segundos.",[88,75165,75166,75167,75169,75170,75172,75173,41],{},"Inicia con ",[54,75168,74610],{},", avanza con ",[54,75171,74616],{},", finaliza con ",[54,75174,74613],{},[88,75176,75177,75178,75181],{},"Comprueba ",[54,75179,75180],{},"Canceled()"," si quieres permitir que el usuario aborte.",[88,75183,49324,75184,75186],{},[54,75185,75077],{}," para garantizar que la barra se cierre.",[43,75188],{},[46,75190,51782],{"id":36078},[331,75192,51786],{"id":51785},[13,75194,75195],{},[16,75196,68628],{},[331,75198,51795],{"id":51794},[13,75200,75201],{},[16,75202,75203],{},"Capítulo 24: Diálogos simples (Select)",[13,75205,75206,75207,4842,75210,41],{},"En la próxima parte (Parte V), aprenderemos a usar diálogos de selección estándar de EPLAN, como ",[54,75208,75209],{},"SelectSimple",[54,75211,75212],{},"SelectFile",[660,75214,662],{},{"title":228,"searchDepth":229,"depth":229,"links":75216},[75217,75218,75219,75220,75224,75225,75228,75229,75230,75231],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":74647,"depth":229,"text":74648},{"id":74664,"depth":229,"text":74665,"children":75221},[75222,75223],{"id":74668,"depth":670,"text":74669},{"id":52046,"depth":670,"text":52047},{"id":74774,"depth":229,"text":74775},{"id":74856,"depth":229,"text":74857,"children":75226},[75227],{"id":75060,"depth":670,"text":75061},{"id":75087,"depth":229,"text":75088},{"id":75125,"depth":229,"text":75126},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":75232},[75233,75234],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Crea barras de progreso con SimpleProgress en tus scripts EPLAN para informar al usuario durante operaciones largas en C#.",{},"\u002Fguia\u002Fbarras-progreso\u002Fcap-26-simple-progress",{"title":74575,"description":75235},"guia\u002Fbarras-progreso\u002Fcap-26-simple-progress","hC1mFD18gsmzxalQOxROYOEbjbfwdUMyHawZ1xrpyB4",{"id":75242,"title":75243,"body":75244,"description":75725,"extension":236,"meta":75726,"navigation":238,"path":75727,"seo":75728,"stem":75729,"tagline":242,"__hash__":75730},"guia\u002Fguia\u002Fwindows-forms\u002Fcap-27-template-forms.md","Capítulo 27: Windows Forms en EPLAN con C#",{"type":7,"value":75245,"toc":75709},[75246,75258,75260,75262,75264,75289,75291,75293,75302,75304,75308,75315,75326,75333,75335,75339,75342,75363,75367,75372,75534,75536,75540,75564,75566,75570,75577,75624,75654,75656,75660,75663,75665,75667,75686,75688,75690,75692,75697,75699,75704,75707],[10,75247,75248],{},[13,75249,75250,19,75253,19,75256,56383],{},[16,75251,75252],{},"Parte VIII: Windows Forms",[16,75254,75255],{},"Sección 16: Interfaces gráficas",[16,75257,25],{},[43,75259],{},[46,75261,268],{"id":267},[13,75263,702],{},[126,75265,75266,75273,75276,75286],{},[88,75267,75268,75269,75272],{},"Crear una ventana básica (",[54,75270,75271],{},"Form",") desde cero en un script de EPLAN",[88,75274,75275],{},"Entender la estructura estándar de una clase Windows Forms",[88,75277,54633,75278,75281,75282,75285],{},[54,75279,75280],{},"Show()"," (no modal) y ",[54,75283,75284],{},"ShowDialog()"," (modal)",[88,75287,75288],{},"Configurar propiedades básicas como título, tamaño y posición",[43,75290],{},[46,75292,320],{"id":319},[126,75294,75295,75298],{},[88,75296,75297],{},"Conceptos de Clases (Capítulo 8)",[88,75299,68763,75300],{},[551,75301,1300],{},[43,75303],{},[46,75305,75307],{"id":75306},"introducción-interfaces-gráficas-gui","Introducción: Interfaces Gráficas (GUI)",[13,75309,75310,75311,75314],{},"Hasta ahora, tus scripts han sido \"invisibles\" o usaban mensajes simples.\nPara herramientas profesionales, necesitas una ",[16,75312,75313],{},"Interfaz Gráfica de Usuario (GUI)"," donde el usuario pueda:",[126,75316,75317,75320,75323],{},[88,75318,75319],{},"Escribir texto",[88,75321,75322],{},"Seleccionar opciones de listas",[88,75324,75325],{},"Pulsar botones",[13,75327,75328,75329,75332],{},"EPLAN soporta nativamente ",[16,75330,75331],{},"Windows Forms"," (WinForms), la tecnología estándar de interfaz de usuario de .NET Framework.",[43,75334],{},[46,75336,75338],{"id":75337},"_1-estructura-de-un-script-con-interfaz","1. Estructura de un Script con interfaz",[13,75340,75341],{},"Un script con interfaz tiene dos partes:",[85,75343,75344,75354],{},[88,75345,75346,75349,75350,75353],{},[16,75347,75348],{},"La clase del Formulario",": Hereda de ",[54,75351,75352],{},"System.Windows.Forms.Form",". Define cómo se ve la ventana.",[88,75355,75356,75359,75360,75362],{},[16,75357,75358],{},"La clase del Script",": Contiene el método ",[54,75361,1644],{}," que crea y muestra el formulario.",[331,75364,75366],{"id":75365},"_11-el-template-básico","1.1 El \"Template\" Básico",[13,75368,62193,75369,416],{},[54,75370,75371],{},"EPLAN-Scripting-4.0\u002F09_Forms\u002F01_Template.cs",[543,75373,75375],{"className":545,"code":75374,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\n\u002F\u002F PARTE 1: La clase del Script\npublic class ScriptConInterfaz\n{\n    [Start]\n    public void Function()\n    {\n        \u002F\u002F 1. Crear instancia del formulario\n        MiVentana frm = new MiVentana();\n\n        \u002F\u002F 2. Mostrarlo de forma MODAL (bloquea EPLAN hasta cerrar)\n        frm.ShowDialog();\n    }\n}\n\n\u002F\u002F PARTE 2: La clase del Formulario\npublic class MiVentana : Form\n{\n    public MiVentana()\n    {\n        \u002F\u002F 1. Inicializar componentes (obligatorio)\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        \u002F\u002F 2. Configurar propiedades de la ventana\n        this.Text = \"Mi Primera Ventana EPLAN\";\n        this.StartPosition = FormStartPosition.CenterScreen;\n        this.Width = 400;\n        this.Height = 300;\n    }\n}\n",[54,75376,75377,75381,75385,75389,75394,75399,75403,75407,75411,75415,75420,75425,75429,75434,75439,75443,75447,75451,75456,75461,75465,75470,75474,75479,75484,75488,75492,75497,75501,75506,75511,75516,75521,75526,75530],{"__ignoreMap":228},[551,75378,75379],{"class":553,"line":554},[551,75380,50105],{},[551,75382,75383],{"class":553,"line":229},[551,75384,49898],{},[551,75386,75387],{"class":553,"line":670},[551,75388,1139],{"emptyLinePlaceholder":238},[551,75390,75391],{"class":553,"line":1136},[551,75392,75393],{},"\u002F\u002F PARTE 1: La clase del Script\n",[551,75395,75396],{"class":553,"line":1142},[551,75397,75398],{},"public class ScriptConInterfaz\n",[551,75400,75401],{"class":553,"line":1148},[551,75402,1151],{},[551,75404,75405],{"class":553,"line":1154},[551,75406,1157],{},[551,75408,75409],{"class":553,"line":1160},[551,75410,57216],{},[551,75412,75413],{"class":553,"line":1166},[551,75414,1169],{},[551,75416,75417],{"class":553,"line":1172},[551,75418,75419],{},"        \u002F\u002F 1. Crear instancia del formulario\n",[551,75421,75422],{"class":553,"line":1178},[551,75423,75424],{},"        MiVentana frm = new MiVentana();\n",[551,75426,75427],{"class":553,"line":1184},[551,75428,1139],{"emptyLinePlaceholder":238},[551,75430,75431],{"class":553,"line":1190},[551,75432,75433],{},"        \u002F\u002F 2. Mostrarlo de forma MODAL (bloquea EPLAN hasta cerrar)\n",[551,75435,75436],{"class":553,"line":1472},[551,75437,75438],{},"        frm.ShowDialog();\n",[551,75440,75441],{"class":553,"line":1477},[551,75442,1187],{},[551,75444,75445],{"class":553,"line":1797},[551,75446,1193],{},[551,75448,75449],{"class":553,"line":1802},[551,75450,1139],{"emptyLinePlaceholder":238},[551,75452,75453],{"class":553,"line":1808},[551,75454,75455],{},"\u002F\u002F PARTE 2: La clase del Formulario\n",[551,75457,75458],{"class":553,"line":1814},[551,75459,75460],{},"public class MiVentana : Form\n",[551,75462,75463],{"class":553,"line":1820},[551,75464,1151],{},[551,75466,75467],{"class":553,"line":1826},[551,75468,75469],{},"    public MiVentana()\n",[551,75471,75472],{"class":553,"line":1832},[551,75473,1169],{},[551,75475,75476],{"class":553,"line":1838},[551,75477,75478],{},"        \u002F\u002F 1. Inicializar componentes (obligatorio)\n",[551,75480,75481],{"class":553,"line":1844},[551,75482,75483],{},"        InitializeComponent();\n",[551,75485,75486],{"class":553,"line":1850},[551,75487,1187],{},[551,75489,75490],{"class":553,"line":1855},[551,75491,1139],{"emptyLinePlaceholder":238},[551,75493,75494],{"class":553,"line":1861},[551,75495,75496],{},"    private void InitializeComponent()\n",[551,75498,75499],{"class":553,"line":1867},[551,75500,1169],{},[551,75502,75503],{"class":553,"line":1873},[551,75504,75505],{},"        \u002F\u002F 2. Configurar propiedades de la ventana\n",[551,75507,75508],{"class":553,"line":1878},[551,75509,75510],{},"        this.Text = \"Mi Primera Ventana EPLAN\";\n",[551,75512,75513],{"class":553,"line":1883},[551,75514,75515],{},"        this.StartPosition = FormStartPosition.CenterScreen;\n",[551,75517,75518],{"class":553,"line":1888},[551,75519,75520],{},"        this.Width = 400;\n",[551,75522,75523],{"class":553,"line":4615},[551,75524,75525],{},"        this.Height = 300;\n",[551,75527,75528],{"class":553,"line":4620},[551,75529,1187],{},[551,75531,75532],{"class":553,"line":4626},[551,75533,1193],{},[43,75535],{},[46,75537,75539],{"id":75538},"_2-show-vs-showdialog","2. Show() vs ShowDialog()",[126,75541,75542,75553],{},[88,75543,75544,75548,75549,75552],{},[16,75545,75546],{},[54,75547,75280],{},": Abre la ventana y el script ",[31,75550,75551],{},"continúa inmediatamente",". La ventana se queda flotando pero el usuario puede seguir interactuando con EPLAN. (No recomendado para scripts simples).",[88,75554,75555,75559,75560,75563],{},[16,75556,75557],{},[54,75558,75284],{},": Abre la ventana y ",[16,75561,75562],{},"detiene la ejecución del script"," hasta que la ventana se cierra. Bloquea EPLAN (Modal). Esta es la forma correcta para cuadros de diálogo donde esperas que el usuario introduzca datos y pulse \"Aceptar\".",[43,75565],{},[46,75567,75569],{"id":75568},"_3-configuración-básica-del-form","3. Configuración básica del Form",[13,75571,75572,75573,75576],{},"Dentro de ",[54,75574,75575],{},"InitializeComponent()",", puedes configurar:",[126,75578,75579,75599,75618],{},[88,75580,75581,75584,75585],{},[16,75582,75583],{},"StartPosition",":\n",[126,75586,75587,75593],{},[88,75588,75589,75592],{},[54,75590,75591],{},"CenterScreen",": Centrado en el monitor.",[88,75594,75595,75598],{},[54,75596,75597],{},"CenterParent",": Centrado en la ventana padre (EPLAN).",[88,75600,75601,75584,75604],{},[16,75602,75603],{},"FormBorderStyle",[126,75605,75606,75612],{},[88,75607,75608,75611],{},[54,75609,75610],{},"Sizable",": El usuario puede redimensionar (default).",[88,75613,75614,75617],{},[54,75615,75616],{},"FixedDialog",": Tamaño fijo, ideal para diálogos.",[88,75619,75620,75623],{},[16,75621,75622],{},"Text",": El título de la ventana.",[543,75625,75627],{"className":545,"code":75626,"language":547,"meta":228,"style":228},"this.Text = \"Configuración de Proyecto\";\nthis.StartPosition = FormStartPosition.CenterScreen;\nthis.FormBorderStyle = FormBorderStyle.FixedDialog;\nthis.MaximizeBox = false; \u002F\u002F Sin botón de maximizar\nthis.MinimizeBox = false; \u002F\u002F Sin botón de minimizar\n",[54,75628,75629,75634,75639,75644,75649],{"__ignoreMap":228},[551,75630,75631],{"class":553,"line":554},[551,75632,75633],{},"this.Text = \"Configuración de Proyecto\";\n",[551,75635,75636],{"class":553,"line":229},[551,75637,75638],{},"this.StartPosition = FormStartPosition.CenterScreen;\n",[551,75640,75641],{"class":553,"line":670},[551,75642,75643],{},"this.FormBorderStyle = FormBorderStyle.FixedDialog;\n",[551,75645,75646],{"class":553,"line":1136},[551,75647,75648],{},"this.MaximizeBox = false; \u002F\u002F Sin botón de maximizar\n",[551,75650,75651],{"class":553,"line":1142},[551,75652,75653],{},"this.MinimizeBox = false; \u002F\u002F Sin botón de minimizar\n",[43,75655],{},[46,75657,75659],{"id":75658},"_4-práctica-ventana-vacía","4. Práctica: Ventana vacía",[13,75661,75662],{},"Copia el template anterior y ejecútalo en EPLAN. Verás una ventana vacía en el centro de la pantalla. El script \"se pausa\" mientras la ventana está abierta y termina cuando la cierras (X).",[43,75664],{},[46,75666,22685],{"id":22684},[126,75668,75669,75675,75681],{},[88,75670,75671,75672,75674],{},"Hereda de ",[54,75673,75352],{}," para crear ventanas.",[88,75676,10479,75677,75680],{},[54,75678,75679],{},"InitializeComponent"," para configurar la visual.",[88,75682,10479,75683,75685],{},[54,75684,75284],{}," para mostrar la ventana y esperar al usuario.",[43,75687],{},[46,75689,51782],{"id":36078},[331,75691,51786],{"id":51785},[13,75693,75694],{},[16,75695,75696],{},"Ver capítulos anteriores",[331,75698,51795],{"id":51794},[13,75700,75701],{},[16,75702,75703],{},"Capítulo 28: Formulario completo",[13,75705,75706],{},"En el próximo capítulo llenaremos esa ventana vacía con botones, cajas de texto y etiquetas.",[660,75708,662],{},{"title":228,"searchDepth":229,"depth":229,"links":75710},[75711,75712,75713,75714,75717,75718,75719,75720,75721],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":75306,"depth":229,"text":75307},{"id":75337,"depth":229,"text":75338,"children":75715},[75716],{"id":75365,"depth":670,"text":75366},{"id":75538,"depth":229,"text":75539},{"id":75568,"depth":229,"text":75569},{"id":75658,"depth":229,"text":75659},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":75722},[75723,75724],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Plantilla base de Windows Forms para crear interfaces gráficas en tus scripts EPLAN con C# desde cero.",{},"\u002Fguia\u002Fwindows-forms\u002Fcap-27-template-forms",{"title":75243,"description":75725},"guia\u002Fwindows-forms\u002Fcap-27-template-forms","He5gVA6vPFi-eRgOsrKXSzWpNjQEVjITrJ0HCimQ6Uo",{"id":75732,"title":75733,"body":75734,"description":76591,"extension":236,"meta":76592,"navigation":238,"path":76593,"seo":76594,"stem":76595,"tagline":242,"__hash__":76596},"guia\u002Fguia\u002Fwindows-forms\u002Fcap-28-formulario-completo.md","Capítulo 28: Formulario completo en EPLAN con C#",{"type":7,"value":75735,"toc":76574},[75736,75746,75748,75750,75752,75784,75786,75788,75793,75795,75799,75802,75805,75827,75834,75836,75840,75844,75848,75870,75874,75949,75951,75955,75960,76002,76004,76008,76011,76022,76027,76490,76492,76496,76530,76532,76534,76551,76553,76555,76557,76562,76564,76569,76572],[10,75737,75738],{},[13,75739,75740,19,75742,19,75744,56383],{},[16,75741,75252],{},[16,75743,75255],{},[16,75745,25],{},[43,75747],{},[46,75749,268],{"id":267},[13,75751,702],{},[126,75753,75754,75769,75778,75781],{},[88,75755,75756,75757,4000,75760,4000,75763,4000,75766,32897],{},"Agregar controles básicos (",[54,75758,75759],{},"Button",[54,75761,75762],{},"Label",[54,75764,75765],{},"TextBox",[54,75767,75768],{},"CheckBox",[88,75770,75771,75772,4000,75775,32897],{},"Manejar eventos (",[54,75773,75774],{},"Click",[54,75776,75777],{},"CheckedChanged",[88,75779,75780],{},"Diseñar un formulario funcional para solicitar datos al usuario",[88,75782,75783],{},"Validar la entrada del usuario antes de cerrar",[43,75785],{},[46,75787,320],{"id":319},[126,75789,75790],{},[88,75791,75792],{},"Capítulo 27 (Template Forms)",[43,75794],{},[46,75796,75798],{"id":75797},"introducción-llenando-el-vacío","Introducción: Llenando el vacío",[13,75800,75801],{},"Una ventana vacía no sirve de mucho. Necesitamos \"controles\" (widgets) para interactuar.",[13,75803,75804],{},"Los controles más comunes son:",[85,75806,75807,75812,75817,75822],{},[88,75808,75809,75811],{},[16,75810,75762],{},": Texto estático (etiquetas).",[88,75813,75814,75816],{},[16,75815,75765],{},": Campo de entrada de texto.",[88,75818,75819,75821],{},[16,75820,75768],{},": Opción Sí\u002FNo.",[88,75823,75824,75826],{},[16,75825,75759],{},": Acción al hacer clic.",[13,75828,75829,75830,75833],{},"En Windows Forms, cada control es una clase que debes instanciar, configurar y ",[16,75831,75832],{},"agregar"," a la colección de controles del formulario.",[43,75835],{},[46,75837,75839],{"id":75838},"_1-agregando-controles","1. Agregando controles",[331,75841,75843],{"id":75842},"_11-el-proceso-de-3-pasos","1.1 El proceso de 3 pasos",[13,75845,75572,75846,416],{},[54,75847,75575],{},[85,75849,75850,75856,75862],{},[88,75851,75852,75855],{},[16,75853,75854],{},"Instanciar",": Crear el objeto.",[88,75857,75858,75861],{},[16,75859,75860],{},"Configurar",": Propiedades (Texto, Tamaño, Posición).",[88,75863,75864,75866,75867,41],{},[16,75865,35341],{},": Añadirlo al formulario con ",[54,75868,75869],{},"this.Controls.Add()",[331,75871,75873],{"id":75872},"_12-ejemplo-agregar-un-botón","1.2 Ejemplo: Agregar un Botón",[543,75875,75877],{"className":545,"code":75876,"language":547,"meta":228,"style":228},"\u002F\u002F 1. Instanciar (variable miembro de la clase)\nprivate Button btnAction;\n\nprivate void InitializeComponent()\n{\n    this.btnAction = new Button();\n\n    \u002F\u002F 2. Configurar\n    this.btnAction.Text = \"Ejecutar\";\n    this.btnAction.Location = new System.Drawing.Point(50, 50); \u002F\u002F X, Y\n    this.btnAction.Size = new System.Drawing.Size(100, 30); \u002F\u002F Ancho, Alto\n\n    \u002F\u002F 3. Agregar\n    this.Controls.Add(this.btnAction);\n}\n",[54,75878,75879,75884,75889,75893,75898,75902,75907,75911,75916,75921,75926,75931,75935,75940,75945],{"__ignoreMap":228},[551,75880,75881],{"class":553,"line":554},[551,75882,75883],{},"\u002F\u002F 1. Instanciar (variable miembro de la clase)\n",[551,75885,75886],{"class":553,"line":229},[551,75887,75888],{},"private Button btnAction;\n",[551,75890,75891],{"class":553,"line":670},[551,75892,1139],{"emptyLinePlaceholder":238},[551,75894,75895],{"class":553,"line":1136},[551,75896,75897],{},"private void InitializeComponent()\n",[551,75899,75900],{"class":553,"line":1142},[551,75901,1151],{},[551,75903,75904],{"class":553,"line":1148},[551,75905,75906],{},"    this.btnAction = new Button();\n",[551,75908,75909],{"class":553,"line":1154},[551,75910,1139],{"emptyLinePlaceholder":238},[551,75912,75913],{"class":553,"line":1160},[551,75914,75915],{},"    \u002F\u002F 2. Configurar\n",[551,75917,75918],{"class":553,"line":1166},[551,75919,75920],{},"    this.btnAction.Text = \"Ejecutar\";\n",[551,75922,75923],{"class":553,"line":1172},[551,75924,75925],{},"    this.btnAction.Location = new System.Drawing.Point(50, 50); \u002F\u002F X, Y\n",[551,75927,75928],{"class":553,"line":1178},[551,75929,75930],{},"    this.btnAction.Size = new System.Drawing.Size(100, 30); \u002F\u002F Ancho, Alto\n",[551,75932,75933],{"class":553,"line":1184},[551,75934,1139],{"emptyLinePlaceholder":238},[551,75936,75937],{"class":553,"line":1190},[551,75938,75939],{},"    \u002F\u002F 3. Agregar\n",[551,75941,75942],{"class":553,"line":1472},[551,75943,75944],{},"    this.Controls.Add(this.btnAction);\n",[551,75946,75947],{"class":553,"line":1477},[551,75948,1193],{},[43,75950],{},[46,75952,75954],{"id":75953},"_2-manejando-eventos-hacer-que-funcione","2. Manejando Eventos (Hacer que funcione)",[13,75956,75957,75958,41],{},"Un botón no hace nada si no \"escuchas\" su evento ",[54,75959,75774],{},[543,75961,75963],{"className":545,"code":75962,"language":547,"meta":228,"style":228},"\u002F\u002F Suscribirse al evento\nthis.btnAction.Click += new System.EventHandler(this.BtnAction_Click);\n\n\u002F\u002F El método que se ejecuta\nprivate void BtnAction_Click(object sender, System.EventArgs e)\n{\n    MessageBox.Show(\"¡Hiciste clic!\");\n}\n",[54,75964,75965,75970,75975,75979,75984,75989,75993,75998],{"__ignoreMap":228},[551,75966,75967],{"class":553,"line":554},[551,75968,75969],{},"\u002F\u002F Suscribirse al evento\n",[551,75971,75972],{"class":553,"line":229},[551,75973,75974],{},"this.btnAction.Click += new System.EventHandler(this.BtnAction_Click);\n",[551,75976,75977],{"class":553,"line":670},[551,75978,1139],{"emptyLinePlaceholder":238},[551,75980,75981],{"class":553,"line":1136},[551,75982,75983],{},"\u002F\u002F El método que se ejecuta\n",[551,75985,75986],{"class":553,"line":1142},[551,75987,75988],{},"private void BtnAction_Click(object sender, System.EventArgs e)\n",[551,75990,75991],{"class":553,"line":1148},[551,75992,1151],{},[551,75994,75995],{"class":553,"line":1154},[551,75996,75997],{},"    MessageBox.Show(\"¡Hiciste clic!\");\n",[551,75999,76000],{"class":553,"line":1160},[551,76001,1193],{},[43,76003],{},[46,76005,76007],{"id":76006},"_3-ejemplo-completo-configurador-de-exportación","3. Ejemplo Completo: Configurador de Exportación",[13,76009,76010],{},"Vamos a crear un formulario que pregunte:",[126,76012,76013,76016,76019],{},[88,76014,76015],{},"Nombre del archivo (TextBox)",[88,76017,76018],{},"Si comprimir (CheckBox)",[88,76020,76021],{},"Botón Aceptar (Ejecuta y Cierra)",[13,76023,62193,76024,416],{},[54,76025,76026],{},"EPLAN-Scripting-4.0\u002F09_Forms\u002F02_FormsExample.cs",[543,76028,76030],{"className":545,"code":76029,"language":547,"meta":228,"style":228},"using System;\nusing System.Drawing;\nusing System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class FormularioCompleto\n{\n    [Start]\n    public void Function()\n    {\n        ExportForm frm = new ExportForm();\n        frm.ShowDialog();\n    }\n}\n\npublic class ExportForm : Form\n{\n    private Label lblName;\n    private TextBox txtName;\n    private CheckBox chkCompress;\n    private Button btnOk;\n    private Button btnCancel;\n\n    public ExportForm()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        this.Text = \"Configurar Exportación\";\n        this.Size = new Size(300, 200);\n        this.StartPosition = FormStartPosition.CenterScreen;\n\n        \u002F\u002F 1. Label\n        lblName = new Label();\n        lblName.Text = \"Nombre archivo:\";\n        lblName.Location = new Point(20, 20);\n        lblName.AutoSize = true;\n\n        \u002F\u002F 2. TextBox\n        txtName = new TextBox();\n        txtName.Location = new Point(20, 45);\n        txtName.Size = new Size(240, 20);\n        txtName.Text = \"Export_01\"; \u002F\u002F Valor por defecto\n\n        \u002F\u002F 3. CheckBox\n        chkCompress = new CheckBox();\n        chkCompress.Text = \"Comprimir ZIP\";\n        chkCompress.Location = new Point(20, 80);\n        chkCompress.Checked = true; \u002F\u002F Por defecto marcado\n\n        \u002F\u002F 4. Botón OK\n        btnOk = new Button();\n        btnOk.Text = \"Exportar\";\n        btnOk.Location = new Point(100, 120);\n        btnOk.Click += new EventHandler(BtnOk_Click);\n\n        \u002F\u002F 5. Botón Cancel\n        btnCancel = new Button();\n        btnCancel.Text = \"Cancelar\";\n        btnCancel.Location = new Point(190, 120);\n        btnCancel.Click += new EventHandler(BtnCancel_Click);\n\n        \u002F\u002F AGREGAR CONTROLES\n        this.Controls.Add(lblName);\n        this.Controls.Add(txtName);\n        this.Controls.Add(chkCompress);\n        this.Controls.Add(btnOk);\n        this.Controls.Add(btnCancel);\n\n        \u002F\u002F Configuración extra\n        this.AcceptButton = btnOk; \u002F\u002F Enter dispara OK\n        this.CancelButton = btnCancel; \u002F\u002F Esc dispara Cancel\n    }\n\n    private void BtnOk_Click(object sender, EventArgs e)\n    {\n        \u002F\u002F Validación\n        if (string.IsNullOrEmpty(txtName.Text))\n        {\n            MessageBox.Show(\"El nombre no puede estar vacío.\");\n            return; \u002F\u002F No cerramos\n        }\n\n        \u002F\u002F Simular lógica\n        string mensaje = \"Exportando: \" + txtName.Text;\n        if (chkCompress.Checked) mensaje += \" (ZIP)\";\n        \n        MessageBox.Show(mensaje);\n\n        \u002F\u002F Cerrar formulario\n        this.Close();\n    }\n\n    private void BtnCancel_Click(object sender, EventArgs e)\n    {\n        this.Close();\n    }\n}\n",[54,76031,76032,76036,76041,76045,76049,76053,76058,76062,76066,76070,76074,76079,76083,76087,76091,76095,76100,76104,76109,76114,76119,76124,76129,76133,76138,76142,76146,76150,76154,76158,76162,76167,76172,76176,76180,76185,76190,76195,76200,76205,76209,76214,76219,76224,76229,76234,76238,76243,76248,76253,76258,76263,76267,76272,76277,76282,76287,76292,76296,76301,76306,76311,76316,76321,76325,76330,76335,76340,76345,76350,76355,76359,76364,76369,76374,76378,76382,76387,76391,76396,76401,76405,76410,76415,76419,76423,76428,76433,76438,76442,76447,76451,76456,76461,76465,76469,76474,76478,76482,76486],{"__ignoreMap":228},[551,76033,76034],{"class":553,"line":554},[551,76035,1123],{},[551,76037,76038],{"class":553,"line":229},[551,76039,76040],{},"using System.Drawing;\n",[551,76042,76043],{"class":553,"line":670},[551,76044,50105],{},[551,76046,76047],{"class":553,"line":1136},[551,76048,49898],{},[551,76050,76051],{"class":553,"line":1142},[551,76052,1139],{"emptyLinePlaceholder":238},[551,76054,76055],{"class":553,"line":1148},[551,76056,76057],{},"public class FormularioCompleto\n",[551,76059,76060],{"class":553,"line":1154},[551,76061,1151],{},[551,76063,76064],{"class":553,"line":1160},[551,76065,1157],{},[551,76067,76068],{"class":553,"line":1166},[551,76069,57216],{},[551,76071,76072],{"class":553,"line":1172},[551,76073,1169],{},[551,76075,76076],{"class":553,"line":1178},[551,76077,76078],{},"        ExportForm frm = new ExportForm();\n",[551,76080,76081],{"class":553,"line":1184},[551,76082,75438],{},[551,76084,76085],{"class":553,"line":1190},[551,76086,1187],{},[551,76088,76089],{"class":553,"line":1472},[551,76090,1193],{},[551,76092,76093],{"class":553,"line":1477},[551,76094,1139],{"emptyLinePlaceholder":238},[551,76096,76097],{"class":553,"line":1797},[551,76098,76099],{},"public class ExportForm : Form\n",[551,76101,76102],{"class":553,"line":1802},[551,76103,1151],{},[551,76105,76106],{"class":553,"line":1808},[551,76107,76108],{},"    private Label lblName;\n",[551,76110,76111],{"class":553,"line":1814},[551,76112,76113],{},"    private TextBox txtName;\n",[551,76115,76116],{"class":553,"line":1820},[551,76117,76118],{},"    private CheckBox chkCompress;\n",[551,76120,76121],{"class":553,"line":1826},[551,76122,76123],{},"    private Button btnOk;\n",[551,76125,76126],{"class":553,"line":1832},[551,76127,76128],{},"    private Button btnCancel;\n",[551,76130,76131],{"class":553,"line":1838},[551,76132,1139],{"emptyLinePlaceholder":238},[551,76134,76135],{"class":553,"line":1844},[551,76136,76137],{},"    public ExportForm()\n",[551,76139,76140],{"class":553,"line":1850},[551,76141,1169],{},[551,76143,76144],{"class":553,"line":1855},[551,76145,75483],{},[551,76147,76148],{"class":553,"line":1861},[551,76149,1187],{},[551,76151,76152],{"class":553,"line":1867},[551,76153,1139],{"emptyLinePlaceholder":238},[551,76155,76156],{"class":553,"line":1873},[551,76157,75496],{},[551,76159,76160],{"class":553,"line":1878},[551,76161,1169],{},[551,76163,76164],{"class":553,"line":1883},[551,76165,76166],{},"        this.Text = \"Configurar Exportación\";\n",[551,76168,76169],{"class":553,"line":1888},[551,76170,76171],{},"        this.Size = new Size(300, 200);\n",[551,76173,76174],{"class":553,"line":4615},[551,76175,75515],{},[551,76177,76178],{"class":553,"line":4620},[551,76179,1139],{"emptyLinePlaceholder":238},[551,76181,76182],{"class":553,"line":4626},[551,76183,76184],{},"        \u002F\u002F 1. Label\n",[551,76186,76187],{"class":553,"line":4631},[551,76188,76189],{},"        lblName = new Label();\n",[551,76191,76192],{"class":553,"line":4636},[551,76193,76194],{},"        lblName.Text = \"Nombre archivo:\";\n",[551,76196,76197],{"class":553,"line":4641},[551,76198,76199],{},"        lblName.Location = new Point(20, 20);\n",[551,76201,76202],{"class":553,"line":4647},[551,76203,76204],{},"        lblName.AutoSize = true;\n",[551,76206,76207],{"class":553,"line":4653},[551,76208,1139],{"emptyLinePlaceholder":238},[551,76210,76211],{"class":553,"line":4659},[551,76212,76213],{},"        \u002F\u002F 2. TextBox\n",[551,76215,76216],{"class":553,"line":4665},[551,76217,76218],{},"        txtName = new TextBox();\n",[551,76220,76221],{"class":553,"line":4671},[551,76222,76223],{},"        txtName.Location = new Point(20, 45);\n",[551,76225,76226],{"class":553,"line":4677},[551,76227,76228],{},"        txtName.Size = new Size(240, 20);\n",[551,76230,76231],{"class":553,"line":4683},[551,76232,76233],{},"        txtName.Text = \"Export_01\"; \u002F\u002F Valor por defecto\n",[551,76235,76236],{"class":553,"line":4689},[551,76237,1139],{"emptyLinePlaceholder":238},[551,76239,76240],{"class":553,"line":4695},[551,76241,76242],{},"        \u002F\u002F 3. CheckBox\n",[551,76244,76245],{"class":553,"line":4701},[551,76246,76247],{},"        chkCompress = new CheckBox();\n",[551,76249,76250],{"class":553,"line":4707},[551,76251,76252],{},"        chkCompress.Text = \"Comprimir ZIP\";\n",[551,76254,76255],{"class":553,"line":4713},[551,76256,76257],{},"        chkCompress.Location = new Point(20, 80);\n",[551,76259,76260],{"class":553,"line":4719},[551,76261,76262],{},"        chkCompress.Checked = true; \u002F\u002F Por defecto marcado\n",[551,76264,76265],{"class":553,"line":4725},[551,76266,1139],{"emptyLinePlaceholder":238},[551,76268,76269],{"class":553,"line":4731},[551,76270,76271],{},"        \u002F\u002F 4. Botón OK\n",[551,76273,76274],{"class":553,"line":4737},[551,76275,76276],{},"        btnOk = new Button();\n",[551,76278,76279],{"class":553,"line":4743},[551,76280,76281],{},"        btnOk.Text = \"Exportar\";\n",[551,76283,76284],{"class":553,"line":4749},[551,76285,76286],{},"        btnOk.Location = new Point(100, 120);\n",[551,76288,76289],{"class":553,"line":4755},[551,76290,76291],{},"        btnOk.Click += new EventHandler(BtnOk_Click);\n",[551,76293,76294],{"class":553,"line":4761},[551,76295,1139],{"emptyLinePlaceholder":238},[551,76297,76298],{"class":553,"line":4766},[551,76299,76300],{},"        \u002F\u002F 5. Botón Cancel\n",[551,76302,76303],{"class":553,"line":4771},[551,76304,76305],{},"        btnCancel = new Button();\n",[551,76307,76308],{"class":553,"line":4777},[551,76309,76310],{},"        btnCancel.Text = \"Cancelar\";\n",[551,76312,76313],{"class":553,"line":4782},[551,76314,76315],{},"        btnCancel.Location = new Point(190, 120);\n",[551,76317,76318],{"class":553,"line":4787},[551,76319,76320],{},"        btnCancel.Click += new EventHandler(BtnCancel_Click);\n",[551,76322,76323],{"class":553,"line":4793},[551,76324,1139],{"emptyLinePlaceholder":238},[551,76326,76327],{"class":553,"line":4799},[551,76328,76329],{},"        \u002F\u002F AGREGAR CONTROLES\n",[551,76331,76332],{"class":553,"line":4805},[551,76333,76334],{},"        this.Controls.Add(lblName);\n",[551,76336,76337],{"class":553,"line":4811},[551,76338,76339],{},"        this.Controls.Add(txtName);\n",[551,76341,76342],{"class":553,"line":4817},[551,76343,76344],{},"        this.Controls.Add(chkCompress);\n",[551,76346,76347],{"class":553,"line":4822},[551,76348,76349],{},"        this.Controls.Add(btnOk);\n",[551,76351,76352],{"class":553,"line":4827},[551,76353,76354],{},"        this.Controls.Add(btnCancel);\n",[551,76356,76357],{"class":553,"line":9183},[551,76358,1139],{"emptyLinePlaceholder":238},[551,76360,76361],{"class":553,"line":9188},[551,76362,76363],{},"        \u002F\u002F Configuración extra\n",[551,76365,76366],{"class":553,"line":9193},[551,76367,76368],{},"        this.AcceptButton = btnOk; \u002F\u002F Enter dispara OK\n",[551,76370,76371],{"class":553,"line":9198},[551,76372,76373],{},"        this.CancelButton = btnCancel; \u002F\u002F Esc dispara Cancel\n",[551,76375,76376],{"class":553,"line":9204},[551,76377,1187],{},[551,76379,76380],{"class":553,"line":9209},[551,76381,1139],{"emptyLinePlaceholder":238},[551,76383,76384],{"class":553,"line":9214},[551,76385,76386],{},"    private void BtnOk_Click(object sender, EventArgs e)\n",[551,76388,76389],{"class":553,"line":9219},[551,76390,1169],{},[551,76392,76393],{"class":553,"line":9224},[551,76394,76395],{},"        \u002F\u002F Validación\n",[551,76397,76398],{"class":553,"line":9230},[551,76399,76400],{},"        if (string.IsNullOrEmpty(txtName.Text))\n",[551,76402,76403],{"class":553,"line":9236},[551,76404,9062],{},[551,76406,76407],{"class":553,"line":9242},[551,76408,76409],{},"            MessageBox.Show(\"El nombre no puede estar vacío.\");\n",[551,76411,76412],{"class":553,"line":9247},[551,76413,76414],{},"            return; \u002F\u002F No cerramos\n",[551,76416,76417],{"class":553,"line":9253},[551,76418,9077],{},[551,76420,76421],{"class":553,"line":9258},[551,76422,1139],{"emptyLinePlaceholder":238},[551,76424,76425],{"class":553,"line":9264},[551,76426,76427],{},"        \u002F\u002F Simular lógica\n",[551,76429,76430],{"class":553,"line":9270},[551,76431,76432],{},"        string mensaje = \"Exportando: \" + txtName.Text;\n",[551,76434,76435],{"class":553,"line":9275},[551,76436,76437],{},"        if (chkCompress.Checked) mensaje += \" (ZIP)\";\n",[551,76439,76440],{"class":553,"line":9281},[551,76441,70161],{},[551,76443,76444],{"class":553,"line":9287},[551,76445,76446],{},"        MessageBox.Show(mensaje);\n",[551,76448,76449],{"class":553,"line":9292},[551,76450,1139],{"emptyLinePlaceholder":238},[551,76452,76453],{"class":553,"line":9297},[551,76454,76455],{},"        \u002F\u002F Cerrar formulario\n",[551,76457,76458],{"class":553,"line":9302},[551,76459,76460],{},"        this.Close();\n",[551,76462,76463],{"class":553,"line":9308},[551,76464,1187],{},[551,76466,76467],{"class":553,"line":9313},[551,76468,1139],{"emptyLinePlaceholder":238},[551,76470,76471],{"class":553,"line":9318},[551,76472,76473],{},"    private void BtnCancel_Click(object sender, EventArgs e)\n",[551,76475,76476],{"class":553,"line":9323},[551,76477,1169],{},[551,76479,76480],{"class":553,"line":9328},[551,76481,76460],{},[551,76483,76484],{"class":553,"line":9334},[551,76485,1187],{},[551,76487,76488],{"class":553,"line":9339},[551,76489,1193],{},[43,76491],{},[46,76493,76495],{"id":76494},"_4-buenas-prácticas","4. Buenas prácticas",[85,76497,76498,76510,76515,76521],{},[88,76499,76500,93,76503,76506,76507,41],{},[16,76501,76502],{},"Nombres Claros",[54,76504,76505],{},"btnOk"," es mejor que ",[54,76508,76509],{},"button1",[88,76511,76512,76514],{},[16,76513,49165],{},": Valida los datos en el evento del botón Aceptar antes de cerrar.",[88,76516,76517,76520],{},[16,76518,76519],{},"AcceptButton \u002F CancelButton",": Configúralos para mejorar la usabilidad (Enter\u002FEsc).",[88,76522,76523,1068,76526,76529],{},[16,76524,76525],{},"TabIndex",[54,76527,76528],{},"tabIndex"," si tienes muchos controles para ordenar la navegación con la tecla TAB.",[43,76531],{},[46,76533,22685],{"id":22684},[126,76535,76536,76539,76545],{},[88,76537,76538],{},"Una GUI se construye componiendo controles simples.",[88,76540,76541,76542,41],{},"Cada control debe ser instanciado, configurado y agregado a ",[54,76543,76544],{},"this.Controls",[88,76546,76547,76548,154],{},"La lógica del negocio va dentro de los manejadores de eventos (ej. ",[54,76549,76550],{},"BtnOk_Click",[43,76552],{},[46,76554,51782],{"id":36078},[331,76556,51786],{"id":51785},[13,76558,76559],{},[16,76560,76561],{},"Capítulo 27: Template de Windows Forms",[331,76563,51795],{"id":51794},[13,76565,76566],{},[16,76567,76568],{},"Capítulo 29: Cambiar cursor durante operaciones",[13,76570,76571],{},"En el próximo capítulo veremos cómo dar feedback visual cambiando el cursor a \"Espera\" cuando el script está ocupado.",[660,76573,662],{},{"title":228,"searchDepth":229,"depth":229,"links":76575},[76576,76577,76578,76579,76583,76584,76585,76586,76587],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":75797,"depth":229,"text":75798},{"id":75838,"depth":229,"text":75839,"children":76580},[76581,76582],{"id":75842,"depth":670,"text":75843},{"id":75872,"depth":670,"text":75873},{"id":75953,"depth":229,"text":75954},{"id":76006,"depth":229,"text":76007},{"id":76494,"depth":229,"text":76495},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":76588},[76589,76590],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Crea un formulario completo de Windows Forms con controles y validación para automatizar EPLAN Electric P8 con C#.",{},"\u002Fguia\u002Fwindows-forms\u002Fcap-28-formulario-completo",{"title":75733,"description":76591},"guia\u002Fwindows-forms\u002Fcap-28-formulario-completo","u7JUmZ_bjX4HgBV4PU6iOS2KX9MIdI-7pP6oaNSloD0",{"id":76598,"title":76599,"body":76600,"description":77222,"extension":236,"meta":77223,"navigation":238,"path":77224,"seo":77225,"stem":77226,"tagline":242,"__hash__":77227},"guia\u002Fguia\u002Fwindows-forms\u002Fcap-29-cambiar-cursor.md","Capítulo 29: Cambiar el cursor en formularios EPLAN",{"type":7,"value":76601,"toc":77206},[76602,76612,76614,76616,76618,76635,76637,76639,76647,76649,76653,76660,76662,76666,76676,76713,76715,76719,76726,76735,76739,76833,76835,76839,76842,76847,77121,77123,77127,77152,77154,77156,77185,77187,77189,77191,77195,77197,77201,77204],[10,76603,76604],{},[13,76605,76606,19,76608,19,76610,56383],{},[16,76607,75252],{},[16,76609,75255],{},[16,76611,25],{},[43,76613],{},[46,76615,268],{"id":267},[13,76617,702],{},[126,76619,76620,76626,76632],{},[88,76621,55068,76622,76625],{},[54,76623,76624],{},"Cursors.WaitCursor"," para indicar que el sistema está ocupado",[88,76627,76628,76629,76631],{},"Entender el patrón ",[54,76630,75077],{}," aplicado a interfaces gráficas",[88,76633,76634],{},"Mejorar la experiencia de usuario (UX) en operaciones de duración media",[43,76636],{},[46,76638,320],{"id":319},[126,76640,76641,76644],{},[88,76642,76643],{},"Capítulo 28 (Formulario completo)",[88,76645,76646],{},"Concepto de Try-Finally (Capítulo 11)",[43,76648],{},[46,76650,76652],{"id":76651},"introducción-feedback-visual","Introducción: Feedback Visual",[13,76654,76655,76656,76659],{},"Si el usuario hace clic en \"Procesar\" y el programa se congela por 3 segundos sin feedback, pensará que se bloqueó.\nPara operaciones cortas (1-4 segundos), una barra de progreso es excesiva.\n",[16,76657,76658],{},"La solución estándar:"," Cambiar el cursor del mouse a un reloj de arena (o círculo giratorio).",[43,76661],{},[46,76663,76665],{"id":76664},"_1-la-clase-cursor","1. La clase Cursor",[13,76667,76668,76669,76672,76673,41],{},"Windows Forms proporciona la clase estática ",[54,76670,76671],{},"Cursor"," y la propiedad ",[54,76674,76675],{},"Current",[543,76677,76679],{"className":545,"code":76678,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\n\n\u002F\u002F Cambiar a \"Cargando\"\nCursor.Current = Cursors.WaitCursor;\n\n\u002F\u002F Volver a \"Flecha normal\"\nCursor.Current = Cursors.Default;\n",[54,76680,76681,76685,76689,76694,76699,76703,76708],{"__ignoreMap":228},[551,76682,76683],{"class":553,"line":554},[551,76684,50105],{},[551,76686,76687],{"class":553,"line":229},[551,76688,1139],{"emptyLinePlaceholder":238},[551,76690,76691],{"class":553,"line":670},[551,76692,76693],{},"\u002F\u002F Cambiar a \"Cargando\"\n",[551,76695,76696],{"class":553,"line":1136},[551,76697,76698],{},"Cursor.Current = Cursors.WaitCursor;\n",[551,76700,76701],{"class":553,"line":1142},[551,76702,1139],{"emptyLinePlaceholder":238},[551,76704,76705],{"class":553,"line":1148},[551,76706,76707],{},"\u002F\u002F Volver a \"Flecha normal\"\n",[551,76709,76710],{"class":553,"line":1154},[551,76711,76712],{},"Cursor.Current = Cursors.Default;\n",[43,76714],{},[46,76716,76718],{"id":76717},"_2-el-patrón-try-finally-crítico","2. El patrón Try-Finally (CRÍTICO)",[13,76720,76721,76722,76725],{},"Si cambias el cursor y tu código falla antes de restaurarlo, el usuario se quedará con el reloj de arena ",[16,76723,76724],{},"para siempre"," (o hasta que reinicie EPLAN).",[13,76727,76728,76729,76732,76733,41],{},"Por eso, ",[16,76730,76731],{},"SIEMPRE"," debes usar ",[54,76734,75077],{},[331,76736,76738],{"id":76737},"_21-estructura-correcta","2.1 Estructura correcta",[543,76740,76742],{"className":545,"code":76741,"language":547,"meta":228,"style":228},"private void BtnProcesar_Click(object sender, EventArgs e)\n{\n    try\n    {\n        \u002F\u002F 1. Cambiar cursor\n        Cursor.Current = Cursors.WaitCursor;\n        \n        \u002F\u002F 2. Operación pesada\n        RealizarTrabajo();\n    }\n    catch (Exception ex)\n    {\n        MessageBox.Show(\"Error: \" + ex.Message);\n    }\n    finally\n    {\n        \u002F\u002F 3. Restaurar cursor (SIEMPRE se ejecuta)\n        Cursor.Current = Cursors.Default;\n    }\n}\n",[54,76743,76744,76749,76753,76757,76761,76766,76771,76775,76780,76785,76789,76793,76797,76802,76806,76811,76815,76820,76825,76829],{"__ignoreMap":228},[551,76745,76746],{"class":553,"line":554},[551,76747,76748],{},"private void BtnProcesar_Click(object sender, EventArgs e)\n",[551,76750,76751],{"class":553,"line":229},[551,76752,1151],{},[551,76754,76755],{"class":553,"line":670},[551,76756,42869],{},[551,76758,76759],{"class":553,"line":1136},[551,76760,1169],{},[551,76762,76763],{"class":553,"line":1142},[551,76764,76765],{},"        \u002F\u002F 1. Cambiar cursor\n",[551,76767,76768],{"class":553,"line":1148},[551,76769,76770],{},"        Cursor.Current = Cursors.WaitCursor;\n",[551,76772,76773],{"class":553,"line":1154},[551,76774,70161],{},[551,76776,76777],{"class":553,"line":1160},[551,76778,76779],{},"        \u002F\u002F 2. Operación pesada\n",[551,76781,76782],{"class":553,"line":1166},[551,76783,76784],{},"        RealizarTrabajo();\n",[551,76786,76787],{"class":553,"line":1172},[551,76788,1187],{},[551,76790,76791],{"class":553,"line":1178},[551,76792,43071],{},[551,76794,76795],{"class":553,"line":1184},[551,76796,1169],{},[551,76798,76799],{"class":553,"line":1190},[551,76800,76801],{},"        MessageBox.Show(\"Error: \" + ex.Message);\n",[551,76803,76804],{"class":553,"line":1472},[551,76805,1187],{},[551,76807,76808],{"class":553,"line":1477},[551,76809,76810],{},"    finally\n",[551,76812,76813],{"class":553,"line":1797},[551,76814,1169],{},[551,76816,76817],{"class":553,"line":1802},[551,76818,76819],{},"        \u002F\u002F 3. Restaurar cursor (SIEMPRE se ejecuta)\n",[551,76821,76822],{"class":553,"line":1808},[551,76823,76824],{},"        Cursor.Current = Cursors.Default;\n",[551,76826,76827],{"class":553,"line":1814},[551,76828,1187],{},[551,76830,76831],{"class":553,"line":1820},[551,76832,1193],{},[43,76834],{},[46,76836,76838],{"id":76837},"_3-ejemplo-práctico-script-con-feedback","3. Ejemplo práctico: Script con feedback",[13,76840,76841],{},"Vamos a mejorar nuestro formulario anterior. Cuando el usuario exporta, cambiamos el cursor.",[13,76843,62193,76844,416],{},[54,76845,76846],{},"EPLAN-Scripting-4.0\u002F09_Forms\u002F03_Cursor.cs",[543,76848,76850],{"className":545,"code":76849,"language":547,"meta":228,"style":228},"using System;\nusing System.Drawing;\nusing System.Threading; \u002F\u002F Para simular delay\nusing System.Windows.Forms;\nusing Eplan.EplApi.Scripting;\n\npublic class FormularioCursor : Form\n{\n    private Button btnProcess;\n\n    public FormularioCursor()\n    {\n        InitializeComponent();\n    }\n\n    private void InitializeComponent()\n    {\n        this.Text = \"Ejemplo de Cursor\";\n        this.Size = new Size(300, 150);\n        this.StartPosition = FormStartPosition.CenterScreen;\n\n        btnProcess = new Button();\n        btnProcess.Text = \"Procesar Datos\";\n        btnProcess.Location = new Point(80, 40);\n        btnProcess.Size = new Size(120, 30);\n        btnProcess.Click += new EventHandler(BtnProcess_Click);\n\n        this.Controls.Add(btnProcess);\n    }\n\n    private void BtnProcess_Click(object sender, EventArgs e)\n    {\n        \u002F\u002F Deshabilitar botón para evitar doble clic\n        btnProcess.Enabled = false;\n\n        try\n        {\n            \u002F\u002F CAMBIAR CURSOR\n            Cursor.Current = Cursors.WaitCursor;\n\n            \u002F\u002F Simular trabajo pesado (3 segundos)\n            \u002F\u002F En la vida real, aquí iría tu lógica de EPLAN\n            Thread.Sleep(3000); \n\n            MessageBox.Show(\"Proceso terminado correctamente.\");\n        }\n        finally\n        {\n            \u002F\u002F RESTAURAR CURSOR Y BOTÓN\n            Cursor.Current = Cursors.Default;\n            btnProcess.Enabled = true;\n        }\n    }\n\n    [Start]\n    public void Function()\n    {\n        FormularioCursor frm = new FormularioCursor();\n        frm.ShowDialog();\n    }\n}\n",[54,76851,76852,76856,76860,76865,76869,76873,76877,76882,76886,76891,76895,76900,76904,76908,76912,76916,76920,76924,76929,76934,76938,76942,76947,76952,76957,76962,76967,76971,76976,76980,76984,76989,76993,76998,77003,77007,77011,77015,77020,77025,77029,77034,77039,77044,77048,77053,77057,77061,77065,77070,77075,77080,77084,77088,77092,77096,77100,77104,77109,77113,77117],{"__ignoreMap":228},[551,76853,76854],{"class":553,"line":554},[551,76855,1123],{},[551,76857,76858],{"class":553,"line":229},[551,76859,76040],{},[551,76861,76862],{"class":553,"line":670},[551,76863,76864],{},"using System.Threading; \u002F\u002F Para simular delay\n",[551,76866,76867],{"class":553,"line":1136},[551,76868,50105],{},[551,76870,76871],{"class":553,"line":1142},[551,76872,49898],{},[551,76874,76875],{"class":553,"line":1148},[551,76876,1139],{"emptyLinePlaceholder":238},[551,76878,76879],{"class":553,"line":1154},[551,76880,76881],{},"public class FormularioCursor : Form\n",[551,76883,76884],{"class":553,"line":1160},[551,76885,1151],{},[551,76887,76888],{"class":553,"line":1166},[551,76889,76890],{},"    private Button btnProcess;\n",[551,76892,76893],{"class":553,"line":1172},[551,76894,1139],{"emptyLinePlaceholder":238},[551,76896,76897],{"class":553,"line":1178},[551,76898,76899],{},"    public FormularioCursor()\n",[551,76901,76902],{"class":553,"line":1184},[551,76903,1169],{},[551,76905,76906],{"class":553,"line":1190},[551,76907,75483],{},[551,76909,76910],{"class":553,"line":1472},[551,76911,1187],{},[551,76913,76914],{"class":553,"line":1477},[551,76915,1139],{"emptyLinePlaceholder":238},[551,76917,76918],{"class":553,"line":1797},[551,76919,75496],{},[551,76921,76922],{"class":553,"line":1802},[551,76923,1169],{},[551,76925,76926],{"class":553,"line":1808},[551,76927,76928],{},"        this.Text = \"Ejemplo de Cursor\";\n",[551,76930,76931],{"class":553,"line":1814},[551,76932,76933],{},"        this.Size = new Size(300, 150);\n",[551,76935,76936],{"class":553,"line":1820},[551,76937,75515],{},[551,76939,76940],{"class":553,"line":1826},[551,76941,1139],{"emptyLinePlaceholder":238},[551,76943,76944],{"class":553,"line":1832},[551,76945,76946],{},"        btnProcess = new Button();\n",[551,76948,76949],{"class":553,"line":1838},[551,76950,76951],{},"        btnProcess.Text = \"Procesar Datos\";\n",[551,76953,76954],{"class":553,"line":1844},[551,76955,76956],{},"        btnProcess.Location = new Point(80, 40);\n",[551,76958,76959],{"class":553,"line":1850},[551,76960,76961],{},"        btnProcess.Size = new Size(120, 30);\n",[551,76963,76964],{"class":553,"line":1855},[551,76965,76966],{},"        btnProcess.Click += new EventHandler(BtnProcess_Click);\n",[551,76968,76969],{"class":553,"line":1861},[551,76970,1139],{"emptyLinePlaceholder":238},[551,76972,76973],{"class":553,"line":1867},[551,76974,76975],{},"        this.Controls.Add(btnProcess);\n",[551,76977,76978],{"class":553,"line":1873},[551,76979,1187],{},[551,76981,76982],{"class":553,"line":1878},[551,76983,1139],{"emptyLinePlaceholder":238},[551,76985,76986],{"class":553,"line":1883},[551,76987,76988],{},"    private void BtnProcess_Click(object sender, EventArgs e)\n",[551,76990,76991],{"class":553,"line":1888},[551,76992,1169],{},[551,76994,76995],{"class":553,"line":4615},[551,76996,76997],{},"        \u002F\u002F Deshabilitar botón para evitar doble clic\n",[551,76999,77000],{"class":553,"line":4620},[551,77001,77002],{},"        btnProcess.Enabled = false;\n",[551,77004,77005],{"class":553,"line":4626},[551,77006,1139],{"emptyLinePlaceholder":238},[551,77008,77009],{"class":553,"line":4631},[551,77010,41211],{},[551,77012,77013],{"class":553,"line":4636},[551,77014,9062],{},[551,77016,77017],{"class":553,"line":4641},[551,77018,77019],{},"            \u002F\u002F CAMBIAR CURSOR\n",[551,77021,77022],{"class":553,"line":4647},[551,77023,77024],{},"            Cursor.Current = Cursors.WaitCursor;\n",[551,77026,77027],{"class":553,"line":4653},[551,77028,1139],{"emptyLinePlaceholder":238},[551,77030,77031],{"class":553,"line":4659},[551,77032,77033],{},"            \u002F\u002F Simular trabajo pesado (3 segundos)\n",[551,77035,77036],{"class":553,"line":4665},[551,77037,77038],{},"            \u002F\u002F En la vida real, aquí iría tu lógica de EPLAN\n",[551,77040,77041],{"class":553,"line":4671},[551,77042,77043],{},"            Thread.Sleep(3000); \n",[551,77045,77046],{"class":553,"line":4677},[551,77047,1139],{"emptyLinePlaceholder":238},[551,77049,77050],{"class":553,"line":4683},[551,77051,77052],{},"            MessageBox.Show(\"Proceso terminado correctamente.\");\n",[551,77054,77055],{"class":553,"line":4689},[551,77056,9077],{},[551,77058,77059],{"class":553,"line":4695},[551,77060,48402],{},[551,77062,77063],{"class":553,"line":4701},[551,77064,9062],{},[551,77066,77067],{"class":553,"line":4707},[551,77068,77069],{},"            \u002F\u002F RESTAURAR CURSOR Y BOTÓN\n",[551,77071,77072],{"class":553,"line":4713},[551,77073,77074],{},"            Cursor.Current = Cursors.Default;\n",[551,77076,77077],{"class":553,"line":4719},[551,77078,77079],{},"            btnProcess.Enabled = true;\n",[551,77081,77082],{"class":553,"line":4725},[551,77083,9077],{},[551,77085,77086],{"class":553,"line":4731},[551,77087,1187],{},[551,77089,77090],{"class":553,"line":4737},[551,77091,1139],{"emptyLinePlaceholder":238},[551,77093,77094],{"class":553,"line":4743},[551,77095,1157],{},[551,77097,77098],{"class":553,"line":4749},[551,77099,57216],{},[551,77101,77102],{"class":553,"line":4755},[551,77103,1169],{},[551,77105,77106],{"class":553,"line":4761},[551,77107,77108],{},"        FormularioCursor frm = new FormularioCursor();\n",[551,77110,77111],{"class":553,"line":4766},[551,77112,75438],{},[551,77114,77115],{"class":553,"line":4771},[551,77116,1187],{},[551,77118,77119],{"class":553,"line":4777},[551,77120,1193],{},[43,77122],{},[46,77124,77126],{"id":77125},"_4-tipos-de-cursores-útiles","4. Tipos de Cursores útiles",[126,77128,77129,77134,77140,77146],{},[88,77130,77131,77133],{},[54,77132,76624],{},": Reloj de arena. Sistema bloqueado.",[88,77135,77136,77139],{},[54,77137,77138],{},"Cursors.AppStarting",": Flecha + Reloj. Trabajando en segundo plano, pero interactivo.",[88,77141,77142,77145],{},[54,77143,77144],{},"Cursors.Hand",": Mano. Usar sobre enlaces o botones especiales.",[88,77147,77148,77151],{},[54,77149,77150],{},"Cursors.Help",": Flecha + Interrogación. Para modo de ayuda.",[43,77153],{},[46,77155,22685],{"id":22684},[126,77157,77158,77164,77170,77178],{},[88,77159,10479,77160,77163],{},[54,77161,77162],{},"Cursor.Current = Cursors.WaitCursor"," para operaciones de 1 a 4 segundos.",[88,77165,77166,77167,77169],{},"Para operaciones más largas, usa ",[54,77168,56162],{}," (Capítulo 26).",[88,77171,77172,77175,77176,41],{},[16,77173,77174],{},"Siempre"," restaura el cursor en un bloque ",[54,77177,43665],{},[88,77179,77180,77181,77184],{},"Deshabilitar el botón que inició la acción (",[54,77182,77183],{},"Enabled = false",") es una buena práctica complementaria.",[43,77186],{},[46,77188,51782],{"id":36078},[331,77190,51786],{"id":51785},[13,77192,77193],{},[16,77194,75703],{},[331,77196,51795],{"id":51794},[13,77198,77199],{},[16,77200,74501],{},[13,77202,77203],{},"Pondremos todo en práctica con una aplicación real para buscar y abrir proyectos.",[660,77205,662],{},{"title":228,"searchDepth":229,"depth":229,"links":77207},[77208,77209,77210,77211,77212,77215,77216,77217,77218],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":76651,"depth":229,"text":76652},{"id":76664,"depth":229,"text":76665},{"id":76717,"depth":229,"text":76718,"children":77213},[77214],{"id":76737,"depth":670,"text":76738},{"id":76837,"depth":229,"text":76838},{"id":77125,"depth":229,"text":77126},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":77219},[77220,77221],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Cambia el cursor durante operaciones largas en tus formularios EPLAN para mejorar la experiencia del usuario en C#.",{},"\u002Fguia\u002Fwindows-forms\u002Fcap-29-cambiar-cursor",{"title":76599,"description":77222},"guia\u002Fwindows-forms\u002Fcap-29-cambiar-cursor","fRYwS7PKgS2fGyw9i5GSp1jk9DO8Zz0BVH4Xbf22VmY",{"id":77229,"title":77230,"body":77231,"description":77608,"extension":236,"meta":77609,"navigation":238,"path":77610,"seo":77611,"stem":77612,"tagline":242,"__hash__":77613},"guia\u002Fguia\u002Farchivos-carpetas\u002Fcap-30-verificar-carpeta.md","Capítulo 30: Archivos y carpetas en scripts EPLAN",{"type":7,"value":77232,"toc":77589},[77233,77245,77247,77249,77251,77271,77273,77275,77286,77288,77292,77295,77300,77302,77306,77312,77360,77370,77372,77376,77382,77388,77403,77405,77409,77414,77543,77545,77547,77568,77570,77572,77574,77578,77580,77584,77587],[10,77234,77235],{},[13,77236,77237,19,77240,19,77243,56383],{},[16,77238,77239],{},"Parte IX: Archivos y Carpetas",[16,77241,77242],{},"Sección 17: Operaciones con archivos",[16,77244,25],{},[43,77246],{},[46,77248,268],{"id":267},[13,77250,702],{},[126,77252,77253,77259,77265],{},[88,77254,77255,77256],{},"Usar la clase ",[54,77257,77258],{},"System.IO.Directory",[88,77260,77261,77262],{},"Verificar la existencia de directorios con ",[54,77263,77264],{},"Exists",[88,77266,77267,77268],{},"Crear nuevas carpetas automáticamente con ",[54,77269,77270],{},"CreateDirectory",[43,77272],{},[46,77274,320],{"id":319},[126,77276,77277,77280],{},[88,77278,77279],{},"Conceptos básicos de Rutas (Strings)",[88,77281,77282,77283],{},"Namespace ",[54,77284,77285],{},"System.IO",[43,77287],{},[46,77289,77291],{"id":77290},"introducción-gestión-de-directorios","Introducción: Gestión de Directorios",[13,77293,77294],{},"Antes de exportar un PDF o guardar un Backup, debes asegurarte de que la carpeta de destino existe. Si no, EPLAN podría dar un error.",[13,77296,77297,77298,41],{},"En .NET, la clase para manejar carpetas es ",[54,77299,77258],{},[43,77301],{},[46,77303,77305],{"id":77304},"_1-verificar-existencia","1. Verificar existencia",[331,77307,77309,77310],{"id":77308},"_11-método-exists","1.1 Método ",[54,77311,77264],{},[543,77313,77315],{"className":545,"code":77314,"language":547,"meta":228,"style":228},"using System.IO;\n\nif (Directory.Exists(@\"C:\\Temp\"))\n{\n    \u002F\u002F La carpeta existe\n}\nelse\n{\n    \u002F\u002F No existe\n}\n",[54,77316,77317,77321,77325,77330,77334,77339,77343,77347,77351,77356],{"__ignoreMap":228},[551,77318,77319],{"class":553,"line":554},[551,77320,45756],{},[551,77322,77323],{"class":553,"line":229},[551,77324,1139],{"emptyLinePlaceholder":238},[551,77326,77327],{"class":553,"line":670},[551,77328,77329],{},"if (Directory.Exists(@\"C:\\Temp\"))\n",[551,77331,77332],{"class":553,"line":1136},[551,77333,1151],{},[551,77335,77336],{"class":553,"line":1142},[551,77337,77338],{},"    \u002F\u002F La carpeta existe\n",[551,77340,77341],{"class":553,"line":1148},[551,77342,1193],{},[551,77344,77345],{"class":553,"line":1154},[551,77346,3704],{},[551,77348,77349],{"class":553,"line":1160},[551,77350,1151],{},[551,77352,77353],{"class":553,"line":1166},[551,77354,77355],{},"    \u002F\u002F No existe\n",[551,77357,77358],{"class":553,"line":1172},[551,77359,1193],{},[13,77361,77362,77363,77366,77367,154],{},"Es importante recordar que las rutas en C# suelen requerir el ",[54,77364,77365],{},"@"," antes de las comillas para interpretar correctamente las barras invertidas (",[54,77368,77369],{},"\\",[43,77371],{},[46,77373,77375],{"id":77374},"_2-crear-carpetas","2. Crear carpetas",[331,77377,77379,77380],{"id":77378},"_12-método-createdirectory","1.2 Método ",[54,77381,77270],{},[13,77383,77384,77385,41],{},"Si la carpeta no existe, podemos crearla. Lo genial de este método es que crea ",[16,77386,77387],{},"toda la ruta necesaria",[543,77389,77391],{"className":545,"code":77390,"language":547,"meta":228,"style":228},"\u002F\u002F Crea C:\\Proyectos, luego 2025, luego Enero\nDirectory.CreateDirectory(@\"C:\\Proyectos\\2025\\Enero\");\n",[54,77392,77393,77398],{"__ignoreMap":228},[551,77394,77395],{"class":553,"line":554},[551,77396,77397],{},"\u002F\u002F Crea C:\\Proyectos, luego 2025, luego Enero\n",[551,77399,77400],{"class":553,"line":229},[551,77401,77402],{},"Directory.CreateDirectory(@\"C:\\Proyectos\\2025\\Enero\");\n",[43,77404],{},[46,77406,77408],{"id":77407},"_3-ejemplo-práctico-asegurar-ruta-de-exportación","3. Ejemplo práctico: Asegurar ruta de exportación",[13,77410,62193,77411,416],{},[54,77412,77413],{},"EPLAN-Scripting-4.0\u002F12_FilesFolders\u002F01_CheckFolder.cs",[543,77415,77417],{"className":545,"code":77416,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing System.IO; \u002F\u002F Importante\nusing Eplan.EplApi.Scripting;\n\npublic class VerificarCarpeta\n{\n    [Start]\n    public void Function()\n    {\n        string rutaObjetivo = @\"C:\\EPLAN_Export\\PDFs\\\";\n\n        try\n        {\n            if (Directory.Exists(rutaObjetivo))\n            {\n                MessageBox.Show(\"La carpeta ya existe.\");\n            }\n            else\n            {\n                Directory.CreateDirectory(rutaObjetivo);\n                MessageBox.Show(\"Carpeta creada correctamente.\");\n            }\n        }\n        catch (System.Exception ex)\n        {\n            MessageBox.Show(\"Error al manejar carpeta: \" + ex.Message);\n        }\n    }\n}\n",[54,77418,77419,77423,77428,77432,77436,77441,77445,77449,77453,77457,77462,77466,77470,77474,77479,77483,77488,77492,77496,77500,77505,77510,77514,77518,77522,77526,77531,77535,77539],{"__ignoreMap":228},[551,77420,77421],{"class":553,"line":554},[551,77422,50105],{},[551,77424,77425],{"class":553,"line":229},[551,77426,77427],{},"using System.IO; \u002F\u002F Importante\n",[551,77429,77430],{"class":553,"line":670},[551,77431,49898],{},[551,77433,77434],{"class":553,"line":1136},[551,77435,1139],{"emptyLinePlaceholder":238},[551,77437,77438],{"class":553,"line":1142},[551,77439,77440],{},"public class VerificarCarpeta\n",[551,77442,77443],{"class":553,"line":1148},[551,77444,1151],{},[551,77446,77447],{"class":553,"line":1154},[551,77448,1157],{},[551,77450,77451],{"class":553,"line":1160},[551,77452,57216],{},[551,77454,77455],{"class":553,"line":1166},[551,77456,1169],{},[551,77458,77459],{"class":553,"line":1172},[551,77460,77461],{},"        string rutaObjetivo = @\"C:\\EPLAN_Export\\PDFs\\\";\n",[551,77463,77464],{"class":553,"line":1178},[551,77465,1139],{"emptyLinePlaceholder":238},[551,77467,77468],{"class":553,"line":1184},[551,77469,41211],{},[551,77471,77472],{"class":553,"line":1190},[551,77473,9062],{},[551,77475,77476],{"class":553,"line":1472},[551,77477,77478],{},"            if (Directory.Exists(rutaObjetivo))\n",[551,77480,77481],{"class":553,"line":1477},[551,77482,12301],{},[551,77484,77485],{"class":553,"line":1797},[551,77486,77487],{},"                MessageBox.Show(\"La carpeta ya existe.\");\n",[551,77489,77490],{"class":553,"line":1802},[551,77491,12311],{},[551,77493,77494],{"class":553,"line":1808},[551,77495,15260],{},[551,77497,77498],{"class":553,"line":1814},[551,77499,12301],{},[551,77501,77502],{"class":553,"line":1820},[551,77503,77504],{},"                Directory.CreateDirectory(rutaObjetivo);\n",[551,77506,77507],{"class":553,"line":1826},[551,77508,77509],{},"                MessageBox.Show(\"Carpeta creada correctamente.\");\n",[551,77511,77512],{"class":553,"line":1832},[551,77513,12311],{},[551,77515,77516],{"class":553,"line":1838},[551,77517,9077],{},[551,77519,77520],{"class":553,"line":1844},[551,77521,73471],{},[551,77523,77524],{"class":553,"line":1850},[551,77525,9062],{},[551,77527,77528],{"class":553,"line":1855},[551,77529,77530],{},"            MessageBox.Show(\"Error al manejar carpeta: \" + ex.Message);\n",[551,77532,77533],{"class":553,"line":1861},[551,77534,9077],{},[551,77536,77537],{"class":553,"line":1867},[551,77538,1187],{},[551,77540,77541],{"class":553,"line":1873},[551,77542,1193],{},[43,77544],{},[46,77546,22685],{"id":22684},[126,77548,77549,77553,77559,77565],{},[88,77550,10479,77551,41],{},[54,77552,77258],{},[88,77554,77555,77558],{},[54,77556,77557],{},"Directory.Exists()"," para verificar.",[88,77560,77561,77564],{},[54,77562,77563],{},"Directory.CreateDirectory()"," para crear.",[88,77566,77567],{},"Este patrón \"Check-Create\" es fundamental antes de cualquier operación de escritura.",[43,77569],{},[46,77571,51782],{"id":36078},[331,77573,51786],{"id":51785},[13,77575,77576],{},[16,77577,75696],{},[331,77579,51795],{"id":51794},[13,77581,77582],{},[16,77583,74501],{},[13,77585,77586],{},"Ahora veremos lo mismo, pero para archivos individuales.",[660,77588,662],{},{"title":228,"searchDepth":229,"depth":229,"links":77590},[77591,77592,77593,77594,77598,77602,77603,77604],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":77290,"depth":229,"text":77291},{"id":77304,"depth":229,"text":77305,"children":77595},[77596],{"id":77308,"depth":670,"text":77597},"1.1 Método Exists",{"id":77374,"depth":229,"text":77375,"children":77599},[77600],{"id":77378,"depth":670,"text":77601},"1.2 Método CreateDirectory",{"id":77407,"depth":229,"text":77408},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":77605},[77606,77607],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Verifica y crea archivos y carpetas con System.IO desde tus scripts EPLAN para automatizar EPLAN Electric P8 con C#.",{},"\u002Fguia\u002Farchivos-carpetas\u002Fcap-30-verificar-carpeta",{"title":77230,"description":77608},"guia\u002Farchivos-carpetas\u002Fcap-30-verificar-carpeta","AuvZOa4tvs0SnxlLyVeqj3rrfXC9QfFy3qZr6edYw5g",{"id":77615,"title":77616,"body":77617,"description":78052,"extension":236,"meta":78053,"navigation":238,"path":78054,"seo":78055,"stem":78056,"tagline":242,"__hash__":78057},"guia\u002Fguia\u002Fmaster-data\u002Fcap-31-contar-articulos.md","Capítulo 31: Contar artículos en EPLAN con C#",{"type":7,"value":77618,"toc":78035},[77619,77631,77633,77635,77637,77654,77656,77658,77666,77668,77672,77683,77686,77697,77699,77708,77713,77719,77726,77731,77783,77785,77789,77800,77824,77826,77830,77835,77995,77997,77999,78014,78016,78018,78020,78024,78026,78030,78033],[10,77620,77621],{},[13,77622,77623,19,77626,19,77629,56383],{},[16,77624,77625],{},"Parte XII: Master Data",[16,77627,77628],{},"Sección 22: Trabajar con artículos",[16,77630,25],{},[43,77632],{},[46,77634,268],{"id":267},[13,77636,702],{},[126,77638,77639,77645,77651],{},[88,77640,77641,77642,32897],{},"Conectar con la base de datos de artículos de EPLAN (",[54,77643,77644],{},"MDPartsManagement",[88,77646,77647,77648,77650],{},"Usar el patrón ",[54,77649,49117],{}," para conexiones seguras a bases de datos",[88,77652,77653],{},"Filtrar y contar artículos usando LINQ",[43,77655],{},[46,77657,320],{"id":319},[126,77659,77660,77663],{},[88,77661,77662],{},"LINQ (Capítulo 11)",[88,77664,77665],{},"Master Data Basics",[43,77667],{},[46,77669,77671],{"id":77670},"introducción-la-parte-2-de-eplan","Introducción: La Parte 2 de EPLAN",[13,77673,77674,77675,77678,77679,77682],{},"Hasta ahora todo era sobre el Proyecto (",[54,77676,77677],{},".elk","). Pero EPLAN tiene otra mitad vital: La ",[16,77680,77681],{},"Base de Datos de Artículos"," (Parts Database).",[13,77684,77685],{},"Como scripter, puedes querer:",[126,77687,77688,77691,77694],{},[88,77689,77690],{},"Contar cuántos artículos hay de un fabricante.",[88,77692,77693],{},"Buscar artículos obsoletos.",[88,77695,77696],{},"Modificar descripciones masivamente.",[43,77698],{},[46,77700,77702,77703,4842,77705],{"id":77701},"_1-clases-mdpartsmanagement-y-mdpartsdatabase","1. Clases ",[54,77704,77644],{},[54,77706,77707],{},"MDPartsDatabase",[13,77709,77710,77711,41],{},"Para abrir la base de datos, usamos ",[54,77712,77644],{},[331,77714,77716,77717,32897],{"id":77715},"_11-conexión-segura-using","1.1 Conexión Segura (",[54,77718,49117],{},[13,77720,77721,77722,77725],{},"Es ",[16,77723,77724],{},"crítico"," cerrar la conexión a la base de datos cuando termines. Si no, EPLAN puede bloquearse o corromper datos.",[13,77727,18153,77728,77730],{},[54,77729,49117],{}," se encarga de esto automáticamente.",[543,77732,77734],{"className":545,"code":77733,"language":547,"meta":228,"style":228},"using Eplan.EplApi.MasterData;\n\nMDPartsManagement pm = new MDPartsManagement();\n\n\u002F\u002F Abre la DB configurada actualmente en EPLAN\nusing (MDPartsDatabase db = pm.OpenDatabase())\n{\n    \u002F\u002F Aquí trabajamos\n    MessageBox.Show(\"DB Abierta\");\n} \u002F\u002F Aquí se cierra sola\n",[54,77735,77736,77741,77745,77750,77754,77759,77764,77768,77773,77778],{"__ignoreMap":228},[551,77737,77738],{"class":553,"line":554},[551,77739,77740],{},"using Eplan.EplApi.MasterData;\n",[551,77742,77743],{"class":553,"line":229},[551,77744,1139],{"emptyLinePlaceholder":238},[551,77746,77747],{"class":553,"line":670},[551,77748,77749],{},"MDPartsManagement pm = new MDPartsManagement();\n",[551,77751,77752],{"class":553,"line":1136},[551,77753,1139],{"emptyLinePlaceholder":238},[551,77755,77756],{"class":553,"line":1142},[551,77757,77758],{},"\u002F\u002F Abre la DB configurada actualmente en EPLAN\n",[551,77760,77761],{"class":553,"line":1148},[551,77762,77763],{},"using (MDPartsDatabase db = pm.OpenDatabase())\n",[551,77765,77766],{"class":553,"line":1154},[551,77767,1151],{},[551,77769,77770],{"class":553,"line":1160},[551,77771,77772],{},"    \u002F\u002F Aquí trabajamos\n",[551,77774,77775],{"class":553,"line":1166},[551,77776,77777],{},"    MessageBox.Show(\"DB Abierta\");\n",[551,77779,77780],{"class":553,"line":1172},[551,77781,77782],{},"} \u002F\u002F Aquí se cierra sola\n",[43,77784],{},[46,77786,77788],{"id":77787},"_2-consultas-con-linq","2. Consultas con LINQ",[13,77790,77791,77792,77795,77796,77799],{},"Para obtener los artículos usamos el método ",[54,77793,77794],{},"db.GetParts()",". Pasándole un filtro vacío (",[54,77797,77798],{},"new MDPartsDatabaseItemPropertyList()",") nos devuelve un array con todos los artículos de la BD. Sobre este array, LINQ es perfecto.",[543,77801,77803],{"className":545,"code":77802,"language":547,"meta":228,"style":228},"MDPart[] parts = db.GetParts(new MDPartsDatabaseItemPropertyList());\n\n\u002F\u002F ¿Cuántos artículos de SIEMENS tengo (leyendo desde Properties)?\nint cantidad = parts.Count(p => p.Properties.ARTICLE_MANUFACTURER.ToString() == \"SIEMENS\");\n",[54,77804,77805,77810,77814,77819],{"__ignoreMap":228},[551,77806,77807],{"class":553,"line":554},[551,77808,77809],{},"MDPart[] parts = db.GetParts(new MDPartsDatabaseItemPropertyList());\n",[551,77811,77812],{"class":553,"line":229},[551,77813,1139],{"emptyLinePlaceholder":238},[551,77815,77816],{"class":553,"line":670},[551,77817,77818],{},"\u002F\u002F ¿Cuántos artículos de SIEMENS tengo (leyendo desde Properties)?\n",[551,77820,77821],{"class":553,"line":1136},[551,77822,77823],{},"int cantidad = parts.Count(p => p.Properties.ARTICLE_MANUFACTURER.ToString() == \"SIEMENS\");\n",[43,77825],{},[46,77827,77829],{"id":77828},"_3-ejemplo-práctico-estadísticas-de-artículos","3. Ejemplo Práctico: Estadísticas de Artículos",[13,77831,62193,77832,416],{},[54,77833,77834],{},"EPLAN-Scripting-4.0\u002F17_Parts\u002F01_CountParts.cs",[543,77836,77838],{"className":545,"code":77837,"language":547,"meta":228,"style":228},"using System.Windows.Forms;\nusing System.Linq; \u002F\u002F Necesario para Count()\nusing Eplan.EplApi.MasterData;\nusing Eplan.EplApi.Scripting;\n\npublic class ContarArticulos\n{\n    [Start]\n    public void Function()\n    {\n        MDPartsManagement pm = new MDPartsManagement();\n\n        try\n        {\n            using (MDPartsDatabase db = pm.OpenDatabase())\n            {\n                MDPart[] parts = db.GetParts(new MDPartsDatabaseItemPropertyList());\n                int total = parts.Length;\n                int cables = parts.Count(p => p.ProductGroup == MDPartsDatabaseItem.Enums.ProductGroup.ElectricalCableConnection);\n                \n                string mensaje = string.Format(\n                    \"Estadísticas de la Base de Datos:\\n\\n\" +\n                    \"Total de artículos: {0}\\n\" +\n                    \"Total de cables: {1}\", \n                    total, cables);\n\n                MessageBox.Show(mensaje);\n            }\n        }\n        catch (System.Exception ex)\n        {\n            MessageBox.Show(\"Error al leer base de datos: \" + ex.Message);\n        }\n    }\n}\n",[54,77839,77840,77844,77849,77853,77857,77861,77866,77870,77874,77878,77882,77887,77891,77895,77899,77904,77908,77913,77918,77923,77928,77933,77938,77943,77948,77953,77957,77962,77966,77970,77974,77978,77983,77987,77991],{"__ignoreMap":228},[551,77841,77842],{"class":553,"line":554},[551,77843,50105],{},[551,77845,77846],{"class":553,"line":229},[551,77847,77848],{},"using System.Linq; \u002F\u002F Necesario para Count()\n",[551,77850,77851],{"class":553,"line":670},[551,77852,77740],{},[551,77854,77855],{"class":553,"line":1136},[551,77856,49898],{},[551,77858,77859],{"class":553,"line":1142},[551,77860,1139],{"emptyLinePlaceholder":238},[551,77862,77863],{"class":553,"line":1148},[551,77864,77865],{},"public class ContarArticulos\n",[551,77867,77868],{"class":553,"line":1154},[551,77869,1151],{},[551,77871,77872],{"class":553,"line":1160},[551,77873,1157],{},[551,77875,77876],{"class":553,"line":1166},[551,77877,57216],{},[551,77879,77880],{"class":553,"line":1172},[551,77881,1169],{},[551,77883,77884],{"class":553,"line":1178},[551,77885,77886],{},"        MDPartsManagement pm = new MDPartsManagement();\n",[551,77888,77889],{"class":553,"line":1184},[551,77890,1139],{"emptyLinePlaceholder":238},[551,77892,77893],{"class":553,"line":1190},[551,77894,41211],{},[551,77896,77897],{"class":553,"line":1472},[551,77898,9062],{},[551,77900,77901],{"class":553,"line":1477},[551,77902,77903],{},"            using (MDPartsDatabase db = pm.OpenDatabase())\n",[551,77905,77906],{"class":553,"line":1797},[551,77907,12301],{},[551,77909,77910],{"class":553,"line":1802},[551,77911,77912],{},"                MDPart[] parts = db.GetParts(new MDPartsDatabaseItemPropertyList());\n",[551,77914,77915],{"class":553,"line":1808},[551,77916,77917],{},"                int total = parts.Length;\n",[551,77919,77920],{"class":553,"line":1814},[551,77921,77922],{},"                int cables = parts.Count(p => p.ProductGroup == MDPartsDatabaseItem.Enums.ProductGroup.ElectricalCableConnection);\n",[551,77924,77925],{"class":553,"line":1820},[551,77926,77927],{},"                \n",[551,77929,77930],{"class":553,"line":1826},[551,77931,77932],{},"                string mensaje = string.Format(\n",[551,77934,77935],{"class":553,"line":1832},[551,77936,77937],{},"                    \"Estadísticas de la Base de Datos:\\n\\n\" +\n",[551,77939,77940],{"class":553,"line":1838},[551,77941,77942],{},"                    \"Total de artículos: {0}\\n\" +\n",[551,77944,77945],{"class":553,"line":1844},[551,77946,77947],{},"                    \"Total de cables: {1}\", \n",[551,77949,77950],{"class":553,"line":1850},[551,77951,77952],{},"                    total, cables);\n",[551,77954,77955],{"class":553,"line":1855},[551,77956,1139],{"emptyLinePlaceholder":238},[551,77958,77959],{"class":553,"line":1861},[551,77960,77961],{},"                MessageBox.Show(mensaje);\n",[551,77963,77964],{"class":553,"line":1867},[551,77965,12311],{},[551,77967,77968],{"class":553,"line":1873},[551,77969,9077],{},[551,77971,77972],{"class":553,"line":1878},[551,77973,73471],{},[551,77975,77976],{"class":553,"line":1883},[551,77977,9062],{},[551,77979,77980],{"class":553,"line":1888},[551,77981,77982],{},"            MessageBox.Show(\"Error al leer base de datos: \" + ex.Message);\n",[551,77984,77985],{"class":553,"line":4615},[551,77986,9077],{},[551,77988,77989],{"class":553,"line":4620},[551,77990,1187],{},[551,77992,77993],{"class":553,"line":4626},[551,77994,1193],{},[43,77996],{},[46,77998,22685],{"id":22684},[126,78000,78001,78006,78011],{},[88,78002,10479,78003,78005],{},[54,78004,77644],{}," para abrir la DB.",[88,78007,10479,78008,78010],{},[54,78009,49117],{}," para asegurar el cierre.",[88,78012,78013],{},"Usa LINQ para obtener reportes instantáneos.",[43,78015],{},[46,78017,51782],{"id":36078},[331,78019,51786],{"id":51785},[13,78021,78022],{},[16,78023,75696],{},[331,78025,51795],{"id":51794},[13,78027,78028],{},[16,78029,74501],{},[13,78031,78032],{},"Leer es seguro. Escribir en la base de datos maestra requiere más cuidado.",[660,78034,662],{},{"title":228,"searchDepth":229,"depth":229,"links":78036},[78037,78038,78039,78040,78045,78046,78047,78048],{"id":267,"depth":229,"text":268},{"id":319,"depth":229,"text":320},{"id":77670,"depth":229,"text":77671},{"id":77701,"depth":229,"text":78041,"children":78042},"1. Clases MDPartsManagement y MDPartsDatabase",[78043],{"id":77715,"depth":670,"text":78044},"1.1 Conexión Segura (using)",{"id":77787,"depth":229,"text":77788},{"id":77828,"depth":229,"text":77829},{"id":22684,"depth":229,"text":22685},{"id":36078,"depth":229,"text":51782,"children":78049},[78050,78051],{"id":51785,"depth":670,"text":51786},{"id":51794,"depth":670,"text":51795},"Cuenta artículos y exporta la lista de materiales de tus proyectos con un script EPLAN en C# sin licencias premium.",{},"\u002Fguia\u002Fmaster-data\u002Fcap-31-contar-articulos",{"title":77616,"description":78052},"guia\u002Fmaster-data\u002Fcap-31-contar-articulos","xOdGEi6i7q0YhbI-cW1gt-TI093D67a9sHesu2Mza5w",{"id":78059,"title":78060,"body":78061,"description":78290,"extension":236,"meta":78291,"navigation":238,"path":78292,"seo":78293,"stem":78294,"tagline":242,"__hash__":78295},"guia\u002Fguia\u002Fcasos-reales\u002Fcap-32-selection-set.md","Capítulo 32: SelectionSet en la API de EPLAN",{"type":7,"value":78062,"toc":78282},[78063,78075,78088,78090,78096,78105,78137,78173,78175,78182,78198,78227,78229,78233,78253,78255,78257,78274,78280],[10,78064,78065],{},[13,78066,78067,19,78069,19,78072,78074],{},[16,78068,18],{},[16,78070,78071],{},"Sección 26",[16,78073,25],{},": Avanzado",[13,78076,78077,78078,78081,78082,78087],{},"La mayoría de los scripts de la API de Objetos (",[54,78079,78080],{},"Selection.SelectedPages",") funcionan perfectos cuando tienes una licencia completa de API. Pero si estás restringido a acciones CLI o necesitas interactuar con selectores más complejos como la Gestión de Proyectos, la acción ",[16,78083,78084],{},[54,78085,78086],{},"selectionset"," es tu aliada.",[43,78089],{},[46,78091,78093,78094],{"id":78092},"_1-la-acción-selectionset","1. La Acción ",[54,78095,78086],{},[13,78097,78098,78099,78102,78103,41],{},"Esta acción es única porque ",[16,78100,78101],{},"no ejecuta nada",". Su propósito es leer el estado actual de la interfaz de usuario y devolverlo al script a través del ",[54,78104,59770],{},[6589,78106,78107,78116],{},[6592,78108,78109],{},[6595,78110,78111,78114],{},[6598,78112,78113],{},"Parámetro (Input)",[6598,78115,65966],{},[6611,78117,78118],{},[6595,78119,78120,78124],{},[6616,78121,78122],{},[54,78123,55932],{},[6616,78125,78126,4000,78129,78132,78133,78136],{},[54,78127,78128],{},"PAGES",[54,78130,78131],{},"PROJECTS"," (Gestión), ",[54,78134,78135],{},"TESTRESULTS"," (Gestión de mensajes).",[6589,78138,78139,78148],{},[6592,78140,78141],{},[6595,78142,78143,78146],{},[6598,78144,78145],{},"Parámetro (Output)",[6598,78147,65966],{},[6611,78149,78150,78162],{},[6595,78151,78152,78156],{},[6616,78153,78154],{},[54,78155,78128],{},[6616,78157,78158,78159,78161],{},"String separado por ",[54,78160,2017],{}," con nombres de páginas.",[6595,78163,78164,78168],{},[6616,78165,78166],{},[54,78167,78131],{},[6616,78169,78158,78170,78172],{},[54,78171,2017],{}," con rutas de proyectos.",[43,78174],{},[46,78176,78178,78179],{"id":78177},"_2-patrón-de-uso-getparameter","2. Patrón de Uso: ",[54,78180,78181],{},"GetParameter",[13,78183,78184,78185,78188,78189,73,78191,78194,78195,41],{},"A diferencia de otras acciones donde solo hacemos ",[54,78186,78187],{},"AddParameter",", aquí es crítico el uso de ",[54,78190,78181],{},[16,78192,78193],{},"después"," del ",[54,78196,78197],{},"Execute",[543,78199,78201],{"className":545,"code":78200,"language":547,"meta":228,"style":228},"cli.Execute(\"selectionset\", acc);\n\nstring resultado = \"\";\nacc.GetParameter(\"PAGES\", ref resultado); \n\u002F\u002F resultado ahora contiene \"E1.01;E1.02;...\"\n",[54,78202,78203,78208,78212,78217,78222],{"__ignoreMap":228},[551,78204,78205],{"class":553,"line":554},[551,78206,78207],{},"cli.Execute(\"selectionset\", acc);\n",[551,78209,78210],{"class":553,"line":229},[551,78211,1139],{"emptyLinePlaceholder":238},[551,78213,78214],{"class":553,"line":670},[551,78215,78216],{},"string resultado = \"\";\n",[551,78218,78219],{"class":553,"line":1136},[551,78220,78221],{},"acc.GetParameter(\"PAGES\", ref resultado); \n",[551,78223,78224],{"class":553,"line":1142},[551,78225,78226],{},"\u002F\u002F resultado ahora contiene \"E1.01;E1.02;...\"\n",[43,78228],{},[46,78230,78232],{"id":78231},"_3-casos-de-uso","3. Casos de Uso",[85,78234,78235,78241],{},[88,78236,78237,78240],{},[16,78238,78239],{},"Validación Previa",": Antes de lanzar un script pesado, verifica cuántos objetos ha seleccionado el usuario.",[88,78242,78243,78246,78247,21817,78249,78252],{},[16,78244,78245],{},"Multiselección en Gestión",": Si quieres hacer un backup de 3 proyectos específicos seleccionados en la lista de gestión, ",[54,78248,78086],{},[54,78250,78251],{},"TYPE:PROJECTS"," te da sus rutas exactas.",[43,78254],{},[46,78256,22685],{"id":22684},[126,78258,78259,78266,78271],{},[88,78260,78261,78265],{},[16,78262,78263],{},[54,78264,78086],{}," lee la selección actual de la GUI.",[88,78267,10479,78268,78270],{},[54,78269,78181],{}," para extraer la información.",[88,78272,78273],{},"Es vital para scripts interactivos que responden a \"lo que el usuario está viendo\".",[13,78275,78276,78277,41],{},"En el próximo capítulo, veremos una técnica muy potente: ",[16,78278,78279],{},"Filtros de Páginas",[660,78281,662],{},{"title":228,"searchDepth":229,"depth":229,"links":78283},[78284,78286,78288,78289],{"id":78092,"depth":229,"text":78285},"1. La Acción selectionset",{"id":78177,"depth":229,"text":78287},"2. Patrón de Uso: GetParameter",{"id":78231,"depth":229,"text":78232},{"id":22684,"depth":229,"text":22685},"Usa SelectionSet en la API de EPLAN para interactuar con la selección y automatizar tareas masivas con un script en C#.",{},"\u002Fguia\u002Fcasos-reales\u002Fcap-32-selection-set",{"title":78060,"description":78290},"guia\u002Fcasos-reales\u002Fcap-32-selection-set","3WaRzryK0b0NXqcvHBNmyAkQy-CTwJbimQdZUdkSBvA",{"id":78297,"title":78298,"body":78299,"description":78481,"extension":236,"meta":78482,"navigation":238,"path":78483,"seo":78484,"stem":78485,"tagline":242,"__hash__":78486},"guia\u002Fguia\u002Fcasos-reales\u002Fcap-33-http-server-basico.md","Capítulo 33: Consumir una API REST desde EPLAN",{"type":7,"value":78300,"toc":78474},[78301,78311,78321,78328,78330,78337,78348,78363,78365,78369,78383,78398,78405,78414,78416,78420,78427,78441,78443,78445,78465,78472],[10,78302,78303],{},[13,78304,78305,19,78307,19,78309,78074],{},[16,78306,18],{},[16,78308,22],{},[16,78310,25],{},[13,78312,78313,78314,78317,78318,41],{},"Entramos en la era de la ",[16,78315,78316],{},"Industria 4.0",". Nuestros esquema eléctricos ya no son islas; necesitan conectar con ERPs, sistemas MES, o bases de datos en la nube.\nEl protocolo estándar para esto es ",[16,78319,78320],{},"HTTP",[13,78322,78323,78324,78327],{},"En este capítulo, aprenderemos a convertir a EPLAN en un ",[16,78325,78326],{},"Cliente HTTP"," capaz de consumir APIs REST.",[43,78329],{},[46,78331,78333,78334,42622],{"id":78332},"_1-httpclient-en-c","1. ",[54,78335,78336],{},"HttpClient",[13,78338,78339,78340,78343,78344,78347],{},"La clase moderna para esto en .NET es ",[54,78341,78342],{},"System.Net.Http.HttpClient",".\nPara usarla en scripts de EPLAN, a veces es necesario asegurar que el ensamblado ",[54,78345,78346],{},"System.Net.Http.dll"," está accesible, aunque en versiones modernas de EPLAN (basadas en .NET 4.7.2+) suele estarlo por defecto.",[10,78349,78350],{},[13,78351,78352,78354,78355,78358,78359,78362],{},[16,78353,1920],{},": Si tu script falla al compilar, asegúrate de que tienes ",[54,78356,78357],{},"using System.Net.Http;"," y añade la referencia al assembly con ",[54,78360,78361],{},"\u002F\u002F #r \"System.Net.Http.dll\""," al inicio del script.",[43,78364],{},[46,78366,78368],{"id":78367},"_2-peticiones-síncronas-vs-asíncronas","2. Peticiones Síncronas vs Asíncronas",[13,78370,78371,78372,6060,78375,78378,78379,78382],{},"Los scripts de EPLAN son inherentemente síncronos. Si lanzamos una petición HTTP que tarda 10 segundos, EPLAN se congelará 10 segundos.\nPara evitar complicaciones de hilos (",[54,78373,78374],{},"async",[54,78376,78377],{},"await"," no siempre funciona directo en scripts antiguos), usamos ",[54,78380,78381],{},".Result"," para forzar la espera:",[543,78384,78386],{"className":545,"code":78385,"language":547,"meta":228,"style":228},"\u002F\u002F Bloqueante\nvar respuesta = client.GetAsync(url).Result;\n",[54,78387,78388,78393],{"__ignoreMap":228},[551,78389,78390],{"class":553,"line":554},[551,78391,78392],{},"\u002F\u002F Bloqueante\n",[551,78394,78395],{"class":553,"line":229},[551,78396,78397],{},"var respuesta = client.GetAsync(url).Result;\n",[13,78399,78400,78401,78404],{},"Para scripts de producción, considera poner un ",[54,78402,78403],{},"Timeout"," breve al cliente:",[543,78406,78408],{"className":545,"code":78407,"language":547,"meta":228,"style":228},"client.Timeout = TimeSpan.FromSeconds(3);\n",[54,78409,78410],{"__ignoreMap":228},[551,78411,78412],{"class":553,"line":554},[551,78413,78407],{},[43,78415],{},[46,78417,78419],{"id":78418},"_3-ejemplo-zen-of-github","3. Ejemplo: \"Zen of Github\"",[13,78421,78422,78423,78426],{},"El script ",[54,78424,78425],{},"01_ClienteHTTP.cs"," conecta a una API pública simple que devuelve una frase aleatoria.\nEsto demuestra el ciclo completo:",[85,78428,78429,78432,78435,78438],{},[88,78430,78431],{},"Crear cliente.",[88,78433,78434],{},"Configurar cabeceras (User-Agent).",[88,78436,78437],{},"Lanzar GET.",[88,78439,78440],{},"Leer cuerpo de respuesta.",[43,78442],{},[46,78444,22685],{"id":22684},[126,78446,78447,78450,78458],{},[88,78448,78449],{},"EPLAN puede consumir datos de Internet\u002FIntranet.",[88,78451,10479,78452,78454,78455,78457],{},[54,78453,78336],{}," con bloqueos síncronos ",[54,78456,78381],{}," controlados.",[88,78459,78460,78461,78464],{},"Maneja siempre ",[54,78462,78463],{},"try\u002Fcatch"," para errores de red.",[13,78466,78467,78468,78471],{},"En el próximo capítulo, haremos lo contrario: ",[16,78469,78470],{},"Enviar datos"," (POST) a un servidor para registrar eventos o errores.",[660,78473,662],{},{"title":228,"searchDepth":229,"depth":229,"links":78475},[78476,78478,78479,78480],{"id":78332,"depth":229,"text":78477},"1. HttpClient en C#",{"id":78367,"depth":229,"text":78368},{"id":78418,"depth":229,"text":78419},{"id":22684,"depth":229,"text":22685},"Conecta EPLAN con ERPs y sistemas externos consumiendo APIs REST por HTTP desde un script EPLAN en C#.",{},"\u002Fguia\u002Fcasos-reales\u002Fcap-33-http-server-basico",{"title":78298,"description":78481},"guia\u002Fcasos-reales\u002Fcap-33-http-server-basico","D8_Sin0qXx3O0C6Au_-2UgStxJ7cFc4Mb_NsvJ9g4Kg",{"id":78488,"title":78489,"body":78490,"description":78642,"extension":236,"meta":78643,"navigation":238,"path":78644,"seo":78645,"stem":78646,"tagline":242,"__hash__":78647},"guia\u002Fguia\u002Fcasos-reales\u002Fcap-34-logger-remoto.md","Capítulo 34: Logger remoto para scripts EPLAN",{"type":7,"value":78491,"toc":78636},[78492,78502,78509,78520,78526,78528,78532,78542,78557,78559,78563,78577,78587,78589,78593,78604,78606,78608,78627,78634],[10,78493,78494],{},[13,78495,78496,19,78498,19,78500,78074],{},[16,78497,18],{},[16,78499,22],{},[16,78501,25],{},[13,78503,78504,78505,78508],{},"Leer datos es útil, pero ",[16,78506,78507],{},"enviar datos"," abre la puerta a la telemetría y monitoreo centralizado.\nImagina un Dashboard web donde el Jefe de Ingeniería puede ver:",[126,78510,78511,78514,78517],{},[88,78512,78513],{},"Cuántos planos se han exportado hoy.",[88,78515,78516],{},"Qué errores de sistema están ocurriendo en las 20 estaciones de trabajo.",[88,78518,78519],{},"Tiempos de ejecución de scripts.",[13,78521,78522,78523,41],{},"Esto se logra con peticiones ",[16,78524,78525],{},"HTTP POST",[43,78527],{},[46,78529,78531],{"id":78530},"_1-estructura-de-un-post-json","1. Estructura de un POST JSON",[13,78533,78534,78535,78538,78539,416],{},"Para enviar datos estructurados, el estándar es JSON (",[54,78536,78537],{},"application\u002Fjson",").\nEn C# nativo (sin usar Newtonsoft.Json para no depender de DLLs externas en el script), podemos crear el JSON manualmente con ",[54,78540,78541],{},"String.Format",[543,78543,78545],{"className":545,"code":78544,"language":547,"meta":228,"style":228},"string json = \"{ \\\"usuario\\\": \\\"Juan\\\", \\\"accion\\\": \\\"Login\\\" }\";\nvar content = new StringContent(json, Encoding.UTF8, \"application\u002Fjson\");\n",[54,78546,78547,78552],{"__ignoreMap":228},[551,78548,78549],{"class":553,"line":554},[551,78550,78551],{},"string json = \"{ \\\"usuario\\\": \\\"Juan\\\", \\\"accion\\\": \\\"Login\\\" }\";\n",[551,78553,78554],{"class":553,"line":229},[551,78555,78556],{},"var content = new StringContent(json, Encoding.UTF8, \"application\u002Fjson\");\n",[43,78558],{},[46,78560,78562],{"id":78561},"_2-eventos-http-telemetría","2. Eventos + HTTP = Telemetría",[13,78564,78565,78566,78569,78570,78572,78573,78576],{},"La verdadera potencia surge al combinar los ",[16,78567,78568],{},"EventHandlers"," (que vimos en Cap 20) con ",[54,78571,78336],{},".\nPodemos suscribirnos al evento ",[54,78574,78575],{},"onActionEnd.String.print"," y, cada vez que alguien imprima, enviar un POST silencioso al servidor.",[13,78578,78579,78580,78583,78584,154],{},"El ejemplo ",[54,78581,78582],{},"01_LoggerRemoto.cs"," muestra la mecánica básica de envío a un endpoint de prueba (",[54,78585,78586],{},"httpbin.org",[43,78588],{},[46,78590,78592],{"id":78591},"_3-servidor-de-recepción","3. Servidor de Recepción",[13,78594,78595,78596,78599,78600,78603],{},"Del lado del servidor, necesitarías un pequeño script en Python (Flask), NodeJS (Express) o .NET Core para recibir estos mensajes.\nEn los ejemplos oficiales de scripting de EPLAN (",[54,78597,78598],{},"EPLAN-Scripting-4.0\u002F99_AdditionalExamples\u002F","), encontrarás scripts de Python (",[54,78601,78602],{},"_server.py",") que demuestran cómo levantar un \"listener\" simple para tus pruebas locales.",[43,78605],{},[46,78607,22685],{"id":22684},[126,78609,78610,78616,78624],{},[88,78611,10479,78612,78615],{},[54,78613,78614],{},"PostAsync"," para enviar datos.",[88,78617,78618,78621,78622,41],{},[54,78619,78620],{},"StringContent"," permite definir el tipo ",[54,78623,78537],{},[88,78625,78626],{},"Esta técnica permite auditoría y monitoreo remoto de licencias y flujos de trabajo de EPLAN.",[13,78628,78629,78630,78633],{},"En el próximo capítulo, veremos la evolución de esto: ",[16,78631,78632],{},"SignalR",", para comunicación en tiempo real bidireccional.",[660,78635,662],{},{"title":228,"searchDepth":229,"depth":229,"links":78637},[78638,78639,78640,78641],{"id":78530,"depth":229,"text":78531},{"id":78561,"depth":229,"text":78562},{"id":78591,"depth":229,"text":78592},{"id":22684,"depth":229,"text":22685},"Implementa un logger remoto con HTTP POST en tus scripts EPLAN para telemetría y monitoreo centralizado en C#.",{},"\u002Fguia\u002Fcasos-reales\u002Fcap-34-logger-remoto",{"title":78489,"description":78642},"guia\u002Fcasos-reales\u002Fcap-34-logger-remoto","CoWJvvyVMPk779WPH8bIWQFWZVn8vNpHbtIHi377AYw",{"id":78649,"title":78650,"body":78651,"description":78809,"extension":236,"meta":78810,"navigation":238,"path":78811,"seo":78812,"stem":78813,"tagline":242,"__hash__":78814},"guia\u002Fguia\u002Fcasos-reales\u002Fcap-35-signalr.md","Capítulo 35: SignalR en tiempo real con EPLAN",{"type":7,"value":78652,"toc":78803},[78653,78663,78666,78677,78681,78684,78701,78707,78711,78721,78730,78733,78737,78740,78778,78780,78791,78801],[10,78654,78655],{},[13,78656,78657,19,78659,19,78661,26],{},[16,78658,18],{},[16,78660,22],{},[16,78662,25],{},[13,78664,78665],{},"Una de las demandas más \"modernas\" en la industria es tener dashboards en planta que muestren en tiempo real qué está haciendo cada estación de ingeniería.",[13,78667,78668,78669,78672,78673,78676],{},"SignalR (de Microsoft) es la tecnología estándar para esto, permitiendo WebSockets bidireccionales.\nSin embargo, integrar el cliente nativo de SignalR en un Script de EPLAN (que corre bajo versiones antiguas de .NET Framework con referencias limitadas) es un dolor de cabeza de dependencias (",[54,78670,78671],{},"Newtonsoft.Json",", versiones de ",[54,78674,78675],{},"System.Threading",", etc).",[46,78678,78680],{"id":78679},"_1-la-arquitectura-bridge-puente","1. La Arquitectura \"Bridge\" (Puente)",[13,78682,78683],{},"La solución elegante que usan los arquitectos de software es desacoplar:",[85,78685,78686,78695],{},[88,78687,78688,78691,78692,78694],{},[16,78689,78690],{},"EPLAN (Script)",": No sabe nada de WebSockets. Solo sabe hacer ",[16,78693,78525],{}," (que es nativo y fácil).",[88,78696,78697,78700],{},[16,78698,78699],{},"Servidor Intermedio (API)",": Recibe el POST y lo retransmite vía SignalR a los navegadores conectados.",[543,78702,78705],{"className":78703,"code":78704,"language":847},[845],"[EPLAN Script]  --POST-->  [ASP.NET Core Server]  --WebSockets-->  [Navegador Dashboard]\n",[54,78706,78704],{"__ignoreMap":228},[46,78708,78710],{"id":78709},"_2-el-código-en-eplan","2. El Código en EPLAN",[13,78712,78713,78714,78717,78718,41],{},"Como vemos en ",[54,78715,78716],{},"01_SignalR_Bridge.cs",", el código en EPLAN es notablemente simple. Solo enviamos un JSON a un endpoint como ",[54,78719,78720],{},"\u002Fapi\u002Fbroadcast",[543,78722,78724],{"className":545,"code":78723,"language":547,"meta":228,"style":228},"client.PostAsync(\"http:\u002F\u002Fserver\u002Fapi\u002Fbroadcast\", content).Result;\n",[54,78725,78726],{"__ignoreMap":228},[551,78727,78728],{"class":553,"line":554},[551,78729,78723],{},[13,78731,78732],{},"Esto hace que nuestros scripts sean ligeros y no se rompan cuando Microsoft actualice las librerías de SignalR.",[46,78734,78736],{"id":78735},"_3-el-servidor-concepto","3. El Servidor (Concepto)",[13,78738,78739],{},"Aunque no entraremos en código de servidor detallado (se sale del alcance de scripting de EPLAN), un controlador simple en .NET Core recibiría el mensaje:",[543,78741,78743],{"className":545,"code":78742,"language":547,"meta":228,"style":228},"[HttpPost(\"broadcast\")]\npublic async Task\u003CIActionResult> Post([FromBody] MsgPayload payload) \n{\n    \u002F\u002F Reenviar a todos los clientes conectados\n    await _hubContext.Clients.All.SendAsync(\"ReceiveMessage\", payload.Message);\n    return Ok();\n}\n",[54,78744,78745,78750,78755,78759,78764,78769,78774],{"__ignoreMap":228},[551,78746,78747],{"class":553,"line":554},[551,78748,78749],{},"[HttpPost(\"broadcast\")]\n",[551,78751,78752],{"class":553,"line":229},[551,78753,78754],{},"public async Task\u003CIActionResult> Post([FromBody] MsgPayload payload) \n",[551,78756,78757],{"class":553,"line":670},[551,78758,1151],{},[551,78760,78761],{"class":553,"line":1136},[551,78762,78763],{},"    \u002F\u002F Reenviar a todos los clientes conectados\n",[551,78765,78766],{"class":553,"line":1142},[551,78767,78768],{},"    await _hubContext.Clients.All.SendAsync(\"ReceiveMessage\", payload.Message);\n",[551,78770,78771],{"class":553,"line":1148},[551,78772,78773],{},"    return Ok();\n",[551,78775,78776],{"class":553,"line":1154},[551,78777,1193],{},[46,78779,22685],{"id":22684},[126,78781,78782,78785,78788],{},[88,78783,78784],{},"No intentes cargar DLLs complejas de NuGet en scripts de EPLAN si puedes evitarlo.",[88,78786,78787],{},"Usa HTTP como \"lengua franca\" para comunicar EPLAN con sistemas modernos.",[88,78789,78790],{},"El patrón Bridge permite dashboards en tiempo real sin modificar el núcleo de EPLAN.",[13,78792,78793,78794,78797,78798,41],{},"En el ",[16,78795,78796],{},"último capítulo",", veremos la inversión de control: Cómo una aplicación externa maneja a EPLAN como una marioneta usando ",[16,78799,78800],{},"Remoting",[660,78802,662],{},{"title":228,"searchDepth":229,"depth":229,"links":78804},[78805,78806,78807,78808],{"id":78679,"depth":229,"text":78680},{"id":78709,"depth":229,"text":78710},{"id":78735,"depth":229,"text":78736},{"id":22684,"depth":229,"text":22685},"Integra SignalR con el patrón Bridge para dashboards en tiempo real desde tus scripts EPLAN en C#.",{},"\u002Fguia\u002Fcasos-reales\u002Fcap-35-signalr",{"title":78650,"description":78809},"guia\u002Fcasos-reales\u002Fcap-35-signalr","bFSKpOn0CnjRGJL9ISOjh3PxdfWhGPwd5UwsZSKMG-4",{"id":4,"title":5,"body":78816,"description":235,"extension":236,"meta":78964,"navigation":238,"path":239,"seo":78965,"stem":241,"tagline":242,"__hash__":243},{"type":7,"value":78817,"toc":78958},[78818,78828,78832,78836,78838,78840,78844,78846,78848,78850,78858,78860,78880,78882,78884,78888,78896,78900,78910,78912,78914,78916,78946,78950,78952,78954],[10,78819,78820],{},[13,78821,78822,19,78824,19,78826,26],{},[16,78823,18],{},[16,78825,22],{},[16,78827,25],{},[13,78829,29,78830,34],{},[31,78831,33],{},[13,78833,37,78834,41],{},[16,78835,40],{},[43,78837],{},[46,78839,49],{"id":48},[13,78841,52,78842,57],{},[54,78843,56],{},[13,78845,60],{},[43,78847],{},[46,78849,66],{"id":65},[13,78851,69,78852,73,78854,77,78856,41],{},[54,78853,72],{},[16,78855,76],{},[54,78857,80],{},[13,78859,83],{},[85,78861,78862,78868,78874],{},[88,78863,78864,93,78866,97],{},[16,78865,92],{},[54,78867,96],{},[88,78869,78870,93,78872,41],{},[16,78871,102],{},[54,78873,105],{},[88,78875,78876,93,78878,41],{},[16,78877,110],{},[54,78879,113],{},[43,78881],{},[46,78883,119],{"id":118},[13,78885,78886],{},[16,78887,124],{},[126,78889,78890,78892,78894],{},[88,78891,130],{},[88,78893,133],{},[88,78895,136],{},[13,78897,78898],{},[16,78899,141],{},[126,78901,78902,78908],{},[88,78903,146,78904,150,78906,154],{},[16,78905,149],{},[54,78907,153],{},[88,78909,157],{},[43,78911],{},[46,78913,163],{"id":162},[13,78915,166],{},[85,78917,78918,78922,78926,78930,78934,78938,78942],{},[88,78919,78920],{},[16,78921,173],{},[88,78923,78924,179],{},[16,78925,178],{},[88,78927,78928,185],{},[16,78929,184],{},[88,78931,78932,191],{},[16,78933,190],{},[88,78935,78936,197],{},[16,78937,196],{},[88,78939,78940,203],{},[16,78941,202],{},[88,78943,78944,209],{},[16,78945,208],{},[13,78947,212,78948,216],{},[16,78949,215],{},[13,78951,219],{},[43,78953],{},[13,78955,78956],{},[16,78957,226],{},{"title":228,"searchDepth":229,"depth":229,"links":78959},[78960,78961,78962,78963],{"id":48,"depth":229,"text":49},{"id":65,"depth":229,"text":66},{"id":118,"depth":229,"text":119},{"id":162,"depth":229,"text":163},{},{"title":5,"description":235},1786138190567]