Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Curso de programación para Civil 3D y AutoCAD Curitiba, 2020 Curso de programación para Civil 3D y AutoCAD Autor: Neyton Luiz Dalle Molle Ingeniero Civil Crea-PR 62.324/D neyton@yahoo.com WhatsApp: +55 41 98884 3044 https://tbn2net.com https://tbn2.blogspot.com Este material, en su totalidad o en partes, está protegido por la ley de derechos de autor LEY N.º 9.610, DE FEBRERO 1998 (http://www.planalto.gov.br/ccivil_03/leis/l9610.htm). La reproducción, total o parcial, está expresamente prohibida sin el consentimiento expreso del autor. Todo el material es de autoría propria, excepto cuando se indique lo contrario con un enlace al material original. mailto:neyton@yahoo.com https://tbn2net.com https://tbn2.blogspot.com http://www.planalto.gov.br/ccivil_03/leis/l9610.htm Sumario Introducción Estructuras de programación Instrucción Sub Instrucción Function If For While DO Case/Switch Try Requisitos Civil 3D Visual Studio Excel HTML Help WorkShop Referenciar DLLs Comprensión de la orientación a objetos Tipagen Público/Privado/Distribuido Clase/Módulos/Estructuras Fields (campos) Properties (Propriedades) Métodos Instancia Herencia Atributos Enumeradores Constantes Hello World Crear Comando Acceda a AutoCAD Acceda al documento actual Poniendo todo junto... Importaciones Entrada de datos Distancias Número entero Número real Texto Palabras clave (Keywords) Coordenadas Entidades (líneas, textos etc.) Selecciones Crear filtros para la selección. Transacciones Crear Nido Finalizar Abortar Acceder la base de datos de AutoCAD Documentos Crear Documento Actual Abrir Salvar Model Space Objetos ObjectID DBObject Entity Leer propriedades Escribir propriedades Nociones de reflexión Listar todas las propriedades Listar todos los atributos Creando objetos Punto Línea Polilínea Texto Bloque Nociones de ergonomía del software a) Definición b) Ventajas: c) Desventajas: d) Principios Básicos: 1 – Esfuerzo mínimo del Usuario: 2 - Menoria Mínima de Usuário: 3 - Frustración Mínima: 4 – maximice el uso de patrones y hábitos: 5 - Máxima tolerancia para diferencias humanas: 6 - Máxima tolerancia a los cambios ambientales: 7 - Notificación inmediata de los problemas: 8 – Máximo control de tareas por parte del usuario: 9 – Máximo suporte para tareas: Nociones de Windows.Forms Crear Form Diagramación Controles Eventos Ok / Cancel / Help Poniendo todo junto: Comando CRIARPERFIS PropertyGrid TreeView DataGridView Manipular Form Interactua con la línea de comando Windows Excel Aplicación Libro de trabajo, hoja de cálculo Células Civil 3D Documento actual Prospector Cogo Points Point Groups Surfaces Alignments Sites Pipenetworks Corridors Settings Drawing Settings CUIX Toolbars Menus Ribbon Html Help WorkShop AutoLOAD Compilación en otras versiones Autodesk Exchange Apps / TBN2NET Programas de ejemplos Dudas Cierre Introducción Figura 1 - NCC-1701-A “El espacio, la frontera final. Estos son los viajes de la nave espacial Enterprise, en su misión de cinco años para la exploración de nuevos mundos, para buscar nuevas vidas, nuevas civilizaciones, valientemente yendo a donde ¡ningún hombre ha estado nunca!” Claro, mentalmente, ¡también escuchaste la canción de apertura!!! Ahora reflexiona: Programación, automatización, Estas son los viajes de un ingeniero, En su misión de 20 años (en mi caso) de ingeniaría, para buscar nuevas soluciones, formas más eficientes de trabajar, valientemente yendo a donde ningún ingeniero ha estado nunca. Comienzo con esta cita da la serie Star Trek y la razón es simple, soy ingeniero civil, programo porque me gusta y todo lo que sé me aventure al oráculo (Google). No tengo la pretensión de ser un maestro en esta cuestión, entonces no tomé ningún curso enfocado en esto; sin embargo, la ingeniaría tiene sentido común y hacer lo mismo durante horas o incluso días. Mi motivación para aprender a programar ocurrió en 1994, cuando estudiaba electromecánica en CEFET. Recuerdo que un profesor tenía una de estas calculadoras, HP48, modelo SX en ese momento. Figura 2-Droid48, Emulador de la HP48 para Android Para aquellos que no saben, el HP48, se lanzó 1993. Justo en el año que yo, a la edad de 14 años me uní a CEFET. El profesor en cuestión había publicado un libro sobre matemáticas y quería difundirlo entre sus alumnos. Yo fui uno de ellos. Con este fin, lanzó 5 desafíos matemáticos y el premio para aquellos que lograron resolverlos fue esta calculadora. Nota: ¡era lo último en tecnología! El problema que decidí resolver fue algo como esto: “Tengo una inversión bancaria, donde a intervalos predeterminantes hago un depósito de una cantidad constante y a intervalos más grandes y constantes retiro una tasa constante. Esta inversión tiene un rendimiento constante y compuesto. Cree una expresión matemática que proporcione la cantidad disponible en cualquier momento. Mira, este es un interés compuesto, de hecho, bastante simple. El fator que complica es la tasa de retiro. Bueno, gasté unas 20hojas de mi cuaderno para deducir la fórmula de interés compuesto. Recuerda que tenía 14 años, no tenía idea de qué era eso. Otras 10 hojas y logre poner en la fórmula la parte de “tarifa de retiro” Pero había un problema. Mi fórmula solo funciono para divisiones enteras entre el intervalo de retiro y el intervalo de ingresos. Por lo demás, está bien. Unos cuantos viajes a la oficina del profesor, y él verificaba mis resultados en su HP48SX y decía: estás en el camino correcto, pero queda por resolver que la división es un numero entero y redondeado hacia abajo. Luego dio el consejo: busca mi libro en la biblioteca. Hay una función matemática que hace lo que necesitas. Entonces fui a la biblioteca. Tomé prestado el libro, que por cierto era enorme dos días después encontré la llamada función de número entero más grande menor que el número real dado. ¡Era lo que necesitaba! reescribí la fórmula y corrí a la sala de profesores con mi solución, hasta” ¡pasé a limpio!” pero ya era demasiado tarde... otro estudiante de otra unidad de CEFET había entregado la solución por la mañana. ¡Me enoje de verdad! Pero el profesor me advirtió: ¡hay CINCO desafíos! Este otro estudiante solo tuvo la suerte y entregar la solución antes. Luego mire este otro problema (señalándolo en el folleto). Es idéntico. Realmente fue, la declaración fue: “Tengo un tanque de agua que recibe un flujo constante. De vez en cuando, abro el registro y dejo que el flujo fluya constantemente. Proporcione una expresión matemática que devuelva el volumen de agua dentro de la cajá en cualquier momento.” Tenga en cuenta, simple interés. Nada más Corrí a un banco en el hall de entrada y reescribí mi expresión de interés compuesto para una versión de interés simple, adaptando el nombre de las variables. MEDIA HOJA DE CUADERNO y tuve la fórmula y su demostración... usando la bendita función de Máximo Entero ... Esta vez fui más rápido, rasgué esa mitad de la hoja, con el dorso aún garabateado de las deducciones del otro problema, ¡y corrí hacia el profesor ¡Él sonrió y dijo: ¡Sí! ¡es eso mismo! ¡ganaste una calculadora! ¡Felicidades! Una lástima que no tenía una cámara en ese momento.... Al día siguiente, falté a la clase, mi padre me llevó hasta NUESTRA PARÍS (el Paraguay) para comprar la bendita. Una HP48G, modelo más actual que la 48S. el manual de ella: Figura 3 - Manual de la HP48G Mi manual estaba en español. Leí y releí tantas veces que no había más hojas limpias. Le pedí al profesor que me diera el programa en el que él verificó mis soluciones. Esto fue incomprensible. Pero eventualmente tuve la epifanía... Mi primer programa, escrito por mí, hacía media aritmética. ¿Dijiste que el manual estaba en español? Solo descubrí lo que era la “estructura de bucle” años después, jejejejejejeje. Después de eso, había un gestor para hacer trampas (¿lo qué?, ¿nunca has hecho una prueba en español con calculadora? ¡Lo hice!), agenda (no existían celulares), un juego de PIFE... En 1996, finalmente ingresé a UFPR y fui el únicoen la sala que sabía cómo programar un HP48, a pesar de que este era un elemento que figuraba en la lista de materiales, justo después de una baraja de cartas En este momento, ya había juegos geniales para HP48. Y había un sitio web, https://www.hpcalc.org/, que traía muchos programas para la HP, no solo la 48, sino varios modelos. Pero había un problema. ¿Como descárgalos en la calculadora? En esta época, no había cable de conexión en Brasil y la importación estaba fuera de discusión, costaba más que la calculadora. Luego vinieron los cables hecho a mano http://www.area48.com/makeacableport.html). Yo mismo hice el mío. ¡Un conector de mouse en serie, un pequeño terminal de cable que sacaba de los teclados rotos y eso fue todo, tenía un cable! Un día finalmente encontré el “Joe Horn’s Goodies Disk” (https://www.hpcalc.org/hp48/compilations/horn/) en este sitio. Ellos eran mencionados en los manuales de la calculadora, pero en 94/95 internet era algo para los ricos... https://www.hpcalc.org/ http://www.area48.com/makeacableport.html https://www.hpcalc.org/hp48/compilations/horn/ Encontré un manual de programación avanzado, que enseñaba como crear la “Biblioteca”, cómo hacer esos programas que no pudiéramos ver el código (External External External” si tuviera un HP, lo entenderá) 3 horas dentro del laboratorio de computación de la UFPR y había impreso el manual en una impresora matricial.... Me dieron una bronca ese día... ¿Impresión de 120 páginas? ¿estás loco? ¡Ni tesis de disertación tiene todo eso! Recuerda: el año era 1996. Bueno, HP48G. 32KB de memoria disponible. O usted programaba de forma eficiente o no cabría en la memoria.... Un día finalmente creé un email (neyton@yahoo.com) en 1996. Pronto me sorprendió recibir un mail de los EUA. De repente, estaba tomando una clase de dibujo técnico en UFPR y me presentaron AutoCAD. Ah, el AutoCAD... Dibujé con coordenadas absolutas hasta 1998, cuando obtuve una pasantía en Caixa económica. Nuestro profesor había hecho que los ejercicios y las clases de AutoCAD estuvieran disponible en Internet y allí estaba yo dentro de Caixa Económica, con internet por DISCADO a las dos de la tarde aprendiendo a dibujar en el R14. Algunas broncas más del jefe, por gastar la cuota de internet y finalmente aprendí a usar la “@” (coordenadas relativas) En 1999, un compañero de clase me enseñó ORTO, ¡es cierto ORTO! En el año 2000 estaba haciendo unas prácticas en una empresa en Curitiba que estaba haciendo proyectos de parcelación y vuelta y media aparecían matrículas de inmuebles para que se hicieran estudios para parcelación “En el año de la gracia de nuestro Señor Jesucristo...” era así como algunas comenzaban... Y venía entonces aquellas colecciones de rumbos y distancias, a veces con docenas de lados... Ya tenía algunas habilidades con M$ Excel, por lo tanto, crear una expresión que calcule las coordenadas para luego hacer un SCRIPT (archivo SRC, para ejecutar en AutoCAD) era pan comido.... Pero ahí tenía que colocar POINT, TEXT en los vértices, cotizar con AZIMUT (o RUMBO) a poligonal.... 10, 12 lados hasta se puede hacer “a mano”. Pero un día me aparece un poligonal ya dibujada con 243 lados. Trabajo para todo el día, cotizar, numerar, crear tabla.... De alguna manera me presentaron a Auto LISP. No me recuerdo cómo ni quién, pero sé que después de mucho romperme la cabeza. Logré crear algunos códigos para numerar, poner punto y citar los poligonales (están en mi blog: https://tbn2.blogspot.com/2012/04/visual-lisp-tabela-de-distancias-e.html https://tbn2net.com/plh para crear la tabla de coordenadas, algunas en la página de mi programa: https://tbn2net.com/pln , para numerar, https://tbn2net.com/ppt, para colocar el punto, https://tbn2net.com/autocota, para cotizar con azimut y distancia)… mailto:neyton@yahoo.com https://tbn2.blogspot.com/2012/04/visual-lisp-tabela-de-distancias-e.html https://tbn2net.com/plh https://tbn2net.com/pln https://tbn2net.com/ppt https://tbn2net.com/autocota Y así comencé a programar para AutoCAD. La programación para el HP48 me hizo comprender las estructuras de programación (if/then/else, while, for...) me enseñó a ser “racional” n el código, es decir, a ser eficiente, porque la memoria era baja y la capacidad de procesamiento también 4MHz... Aprender Auto LISP fue un desafío, primero porque la notación esta prefijada: Figura 4 – Programación en AutoLISP, notación prefijada En notación prefijada, la función viene ANTES de los argumentos. Y en el caso de AutoLISP, debe poner los paréntesis infames: Figura 5 - Hola Mundo en AutoLISP Notación posfija de la HP48: Figura 6 - HP48: Notación posfijada En notación posfija, los argumentos (1 y 2 en este ejemplo van antes de la función (+) El ejemplo de hola mundo: Figura 7- Hola Mundo en HP48 Tenga en cuenta que ahora la función MSGBOX viene después del argumento, “Hello World” Si hacemos una fórmula M$ Excel: Figura 8 - Excel, notación fija En la notación fija, colocamos la función (+) entre los argumentos. ¿Dije que era complicado aprender a programar en AutoLISP (Visual Lisp se lo prefiere)? Si. Pero no porque fuera difícil, sino porque la ayuda de AutoCAD me pareció un poco confusa y muchos “trucos” solo se pueden aprender cometiendo errores. Entonces, un día, encontré el foro de AutoLISP en internet (https://www.AutoLISP.com.br/). El primer post en este foro es mío: Figura 9 - Foro AutoLISP No preguntes... no sé por qué lo estaba buscando en día de Navidad, en fin… AutoLISP me ha dado otro concepto importante: ¿por qué programas? La programación para HP 48 fue un pasatiempo, lo hice por diversión. Pero programar en Visual Lisp era una necesidad. En cualquier momento había algún tipo de servicio en la prisión y mi sustento salió de eso. Al principio eran poligonales, pero pronto tuve que hacer otras cosas, como memoriales descriptivos y una de las subdivisiones tenía cientos de lotes. Luego vino el programa memoriales (https://tbn2net.com/menoriais). Soy ingeniero y pronto tuve la tarea de hacer proyectos complementarios, drenaje y alcantarillado, por ejemplo. La primera versión de C3DRENESG (https://tbn2net.com/C3DRENESG4) fue escrita en Visual Lisp, créeme: https://www.autolisp.com.br/ https://tbn2net.com/memoriais https://tbn2net.com/C3DRENESG4 Figura 10 - Programa de Drenaje escrito y Visual Lisp Y fui caprichoso, tenía hasta perfil: Figura 11 - Preview del perfil Cualquiera que programa en Visual Lisp sabe que dibujar en un DCL no es para todos, es muy “oscuro” por decir lo menos. Entonces comencé a aventurarme en DOTNET. Era muy malo para escribir DCL porque no es nada visual. LISP es bueno para muchas cosas, pero después de este programa, necesitaba algo más… En ese momento, quería entender como funcionaban las diapositivas de AutoCAD y me ayudó incluso a explicar el formato del archivo. eso fue mucho poco. Realmente quería entender cómo usar Windows Forms y eventualmente alió: Figura 12 - Primer programa de Windows Form que hice Era un visor de diapositivas de AutoCAD. Puede leer y mostrar la vista previa de este tipo de archivo, así como las bibliotecas de diapositivas (archivo de extensión SLB): Figura 13 - SlideViewer, biblioteca de visualización de slides En el ejemplo anterior, utilicé el complemento plugin SlideViewer para abrir una biblioteca con las letras escritas verticalmente. Estas letras se usaron para crear los textos dentro de la vista de perfil del plugin de drenaje, versión Lisp. A partir de entonces, empecé a tomar gusto. Empecé un blog (https://tbn2.blogspot.com/, ¡clic, clic, clic!). Un buen día, descargué Civil 3D 2007. ¡Ah, Civil 3D! Entre 2008 y 2010 escribí docenas de tutoriales sobre Civil 3D y empecé a dar consultorías sobre él por todo Brasil... Porté el programa de drenaje en Visual Lisp a DOTNET: Figura 14 - C3DRENESG Versión 1 ¡Ahí nació C3DRENESG versión 1, totalmente escrito en VB.NET, con M$ Visual Studio 2008 el programa que vamos a abordar en este curso! El 2010 fue un muy buen año para mí. Comencé aser reconocido en internet debido a esos tutoriales de Civil 3d (https://tbn2net.com/TUTORIAIS) y ese pequeño programa que a todos les gusta, EXPGE (https://tbn2.blogspot.com/2008/04/expge-exportar-para- o-google-earth.html, versión actual: https://tbn2net.com/EXPGE): https://tbn2.blogspot.com/ https://tbn2net.com/TUTORIAIS https://tbn2.blogspot.com/2008/04/expge-exportar-para-o-google-earth.html https://tbn2net.com/EXPGE Figura 15 - EXPGE versión 2.50 en Visual Lisp Aunque este programa existe desde 2008, fue solo en 2010 que ele comenzó a dar sus frutos. Hasta entonces vendió algunas licencias al mes. Hoy hace parte de TBN2CAD (https://tbn2net.com/TBN2CAD), junto con otros plugins: Figura 16 - TBN2CAD, lista de plugins Aún en 2010, fui contratado para dar una consultoría del Civil 3D en Campinas-SP, donde me pidieron que hiciera un programa que tomara notas de servicio de Civil 3D y fuera personalizable, ya que los reports de Civil 3D eran muy insuficientes. Entonces https://tbn2net.com/TBN2CAD nació NOTASERV (https://tbn2net.com/NOTASERV2): Figura 17 – Notaserv, versión 1 Este programa resolvió la mayoría de los problemas con las notas de servicios de Civil 3D y se vendió muy bien, gracias, jejejeje. Antes de que este programa me enseñara a leer API do Civil 3D, que, por cierto, se usa ampliamente en ella, me permitió aprender más sobre Windows Forms. Gracias a Notaserv aprendí a crear controles de usuario Controles de Usuario, para poder hacer este TreeGridView (que es la unión de un TreeView con un DataGridView) para poder tener, además del árbol de nodos, las columnas para llenar otra información. Gradualmente, se agregaron otros comandos a Notaserv. Algunos fueron para o AutoCAD puro (raíz mismo) y otros para Civil 3D. Luego surgió la necesidad de separar los programas que se ejecutan en Civil 3D en un paquete y los que se ejecutan en AutoCAD en otro paquete. Así surgió el TBN2C3D (https://tbn2net.com/TBN2C3D): https://tbn2net.com/NOTASERV2 https://tbn2net.com/TBN2C3D Figura 18 - TBN2C3D, plugins para Civil 3D Por supuesto, no todos aparecieron al mismo tiempo. Algunos se agregaron hace unos meses Siempre he recibido sugerencias de mis clientes sobre nuevos comandos para incluir en estos paquetes. Eventualmente, fui llamado para una Consultoría sobre Civil 3D en São Luis - MA, en una empresa que participo en los proyectos de duplicación de la Estrada de ferro Carajás (EFC) y el Terminal de Grãos do Maranhão (TEGRAM). Cualquiera que haya tenido el placer de hacer un proyecto de movimiento de tierras en Civil 3D para un proyecto ferroviario, sabe que el diagrama de Brückner no es tan simple, especialmente cuando tiene varios tipos de materiales de corte y necesita clasificarlos para diferentes tipos de relleno sanitarios que tendrán a lo largo del proyecto: Figura 19 - Material List de Civil 3D En el ejemplo anterior, el Material List para un proyecto de movimiento de tierras ferroviario. Vea, no es solo cortar y llenar y prestar / tirar (Borrow Pit y Dump Site). Hacer esta distribución con el diagrama (Mass Haul) del Civil 3D estaba fuera de discusión, no hay forma de combinar las características de los materiales y hacer la distribución. ¡Necesitabas hacer un programa para eso, no! Y lo hice, se llama DDM (https://tbn2net.com/DDM): Figura 20 - Programa DDM, para distribución de movimiento de tierras Este programa lee las áreas de las escotillas de corte y relleno de la Section Views del Civil 3D, clasifica los materiales de origen por sus características (CBR, expansión y permeabilidad) y los destina a los diferentes tipos de vertederos (cuerpo, capa final, relleno) según sus características mínimas. Este programa me “obligó” a revisar los conceptos que había aprendido en Ingeniería Económica, cuando se aprende un básico de investigación operacional (https://pt.wikipedia.org/wiki/Investiga%C3%A7%C3%A3o_operacional). Para resolver la distribución de los volúmenes de movimiento de tierras, utilicé el algoritmo Sleeping Stone, o Método de Transportes (https://tbn2net.com/help/DDM/steppingstone.html), cuyo objetivo es minimizar el momento del transporte. Bueno, además de ejercitar mucho los conceptos matemáticos, este programa me obligó a revisar mucho los conceptos de Orientación a objetos. (https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos). Internamente necesita modelar un documento, con las funciones abrir, guardar, deshacer y rehacer, por ejemplo. Necesita crear formas eficientes de manejar grandes cantidades de información y estas deben estar vinculadas, porque si cambio el área de corte de una estaca en particular, esto tiene que desencadenar una serie de eventos que me adviertan que la distribución necesita ser rehecho. No solo eso, necesito acceder a API del Civil 3D para obtener las áreas, acceder a https://tbn2net.com/DDM https://pt.wikipedia.org/wiki/Investiga%C3%A7%C3%A3o_operacional https://tbn2net.com/help/DDM/steppingstone.html https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos Windows para guardar el archivo y cosas simples como copiar y pegar deben programarse dentro del código. Extrañamente este programa casi no vende… ¿Sería él, demasiado complejo? ¿la ayuda es confusa? Otro concepto tuvo que ser muy bien ejercitado aquí, el arte de escribir una ayuda. Haga así, visite la tienda de aplicaciones de Autodesk (https://apps.autodesk.com/). Haga clic en un programa y lea su descripción. Descárguelo. Intente instalar, usar, leer ayuda, si hay. ¡hay ayuda? Bueno, diría que la mayoría tiene al menos una descripción mejorada, porque sin ella ni siquiera puedes publicar allí. Pero ayuda de verdad, ¿tiene? ¿tienes un escenario de uso, un ejemplo? Si. Trabajo duro para que estos programas que desarrollo tenga una ayuda decente incluso si el usuario (ahhhh, el usuario) no mira. En 2014, ante la inasistencia de algunos clientes, decidí crear C3DMENO (https://tbn2.blogspot.com/2014/10/c3dmeno-programa-para-criar-menoriais.html) para generar memoriales descriptivos. Figura 21 - C3DMENO, para la generación de memoriales descriptivos O C3DMENO está disponible en (https://tbn2net.com/C3DMENO). Inicialmente, este programa se ejecutó solo en Civil #D y pronto comenzaron las solicitudes para que funcione también con la raíz de AutoCAD (AutoCAD puro, Vanilla, aff). Y un día recibí un pedido de un revendedor de Gstarsoft, desarrollador de GstarCAD. Para aquellos que no saben, GstarCAD es otro sabor de Intellicad, así como ZWCAD, BricsCAD, Cadian y otros. Otra vez, no es solo el programa. No es solo publicidad. Para hacer este programa, tuve https://apps.autodesk.com/ https://tbn2.blogspot.com/2014/10/c3dmemo-programa-para-criar-memoriais.html https://tbn2net.com/C3DMEMO que aprender a portar el código fuente a otros tipos de CAD. Luego, tuve que implementar algunas de las funciones que no admiten. Finalmente, tuve que tratar con el usuario. Ah el usuario, esto no se entiende. ¿Por qué simplemente hacer clic en el mismo vértice una vez, si puede hacer clic dos veces, o incluso tres veces? ¿Por qué dibujar siempre en sentido horario los lotes, si se puede dejar que “AutoCaRd” lo haga solo? Ah, pero la prefectura de ese lugar se describe desde el interior del lote, desde ese lugar, desde el exterior .... Bueno, tuve que crear tantos “ajustes técnicos” dentro de ese programa para corregir posibles “errores de lanzamiento” que la unidad de prueba tuvo que ser hecha fuera del AutoCAD. Es por eso por lo que tiene un ¨preview” de la subdivisión. El preview fue otro desafío. Necesitaba ser hermoso. “se puede hacer clic”, personalizar, hacer zoom, y aun así ser lo suficientemente rápido para renderizar el proyecto. Inicialmente hice una clase (ya veremos más adelante) que dibujaba un BITMAP. Tan simple como eso, era solo una imagen. Pero siempre está el usuario. Tan mal entendido jejejejeje. Aparece un proyecto con más de 600 lotes. No es que BITMAP fuera lento, por el contrario, fue incluso rápido, pero ZOOM era casi imposible y como la subdivisión segeorreferenciaba, las coordenadas UTM tienen números grandes y eso terminó distorsionando las cosas. De todos modos, reescribí esta clase para dibujar SVG (https://pt.wikipedia.org/wiki/SVG). Con eso, ejercité mis nociones de Orientación de Objetos aún más, ya que creé clases para dibujar líneas, textos, círculos, polilíneas…en SVG. Y para las polilíneas aún ejercía mucho los conceptos de geometría, porque tenía que implantar cosas como “IntersectWith”, “GetFirstDerivate” o “GetClosestPointTo” que están disponible en AutoCAD. https://pt.wikipedia.org/wiki/SVG Figura 22 - Clases para dibujar SVG Sé que he ido demasiado lejos aquí. El propósito de esto es justificar por qué aprender a programar. Está aprendiendo que, por mucho que sepa lo que hace el programa, el usuario no podrá usarlo si no tiene el tiempo para brindar ayuda, una interface hermosa y agradable. No tiene sentido que su programa haga lo que tiene que hacer. Si espera que alguien más lo use, ponerse en su lugar es esencial. Estructuras de programación Bueno, ¡entonces comencemos el curso! ¿te he convencido para que aprendas más sobre programación? ¿Sí? ¿No? ¡Envíame un email (neyton@yahoo.com)¡, ¡Deja un comentario en mi página! Primero, ¿Que es un programa? De Wikipedia: (https://pt.wikipedia.org/wiki/Programa_de_computador) Un programa de computadora o programa de computadora es un conjunto de instrucciones que escriben una tarea que debe realizar una computadora. El término puede ser una referencial al código fuente, escrito en algún lenguaje de programación, o al archivo que contiene la forma ejecutable de este código fuente. Es eso. No quiero enseñar una licenciatura aquí. El objetivo es llevar este mundo a los ingenieros, que en este caso usan AutoCAD y Civil 3D. Diría que lo más importante para nosotros es no saber cómo escribir un C#, VB, Lisp, C++... lo más importante es saber cómo crear una receta de pastel. Si sabe cómo crear una receta de pastel, no importa en qué idioma estará su libro de cocina. Inglés, portugués, realmente no importa. Pero hay una pregunta. ¿Para AutoCAD, puedo / debo programar en qué idioma? Depende. Primera respuesta: 1. ¿Qué quieres hacer? 2. ¿Puedes escribir una “receta de pastel” para esto? 3. Ahora, ¿puedes “traducir” esto a la computadora? Correcto. Veamos un ejemplo muy común para quienes trabajan con Civil 3D. debe hacer un MDT (modelo digital del terreno) utilizando los Cogo Points y las líneas obligatorias. Su pasante (que se las arregla para ser más incomprendido que el usuario) conectó los puntos con 3D Polilínea para que pueda hacer el MDT. Pero él falló en algunos lugares polilínea obtuvo la Z incorrecta en algunos lugares: mailto:neyton@yahoo.com https://pt.wikipedia.org/wiki/Programa_de_computador Figura 23 – Líneas obligatorias con un problema Antes de agregar estas líneas obligatorias a su superficie, debe corregir estos puntos colocando el valor de Z correcto, en función de los Cogo Points en el dibujo. Mira la receta de este pastel: 1) Seleccione las polilíneas 2) Mira cada uno de sus vértices y 3) Si te equivocas, encuentra un punto y 4) Si encuentra el punto, corrija vértice ¿Simple, no es así? Vea la solución en Visual Lisp aquí: https://tbn2.blogspot.com/2019/02/civil-3d-breaklines-standard-e-z-igual.html Ahora vamos a complicarlo un poco más. Muchas veces ya henos recibido el levantamiento topográfico con las líneas ya dibujadas. Eje de calle, por ejemplo. El eje está allí, pero no podemos usarlo como una línea obligatoria, porque no hay Z, o incluso sí, pero no pasa por los puntos elevados en el eje u tenemos una situación como esta: Figura 24 – Eje sin puntos conectados https://tbn2.blogspot.com/2019/02/civil-3d-breaklines-standard-e-z-igual.html Para que podamos usarlo, queremos que los puntos estén conectados, así: Figura 25 – polilíneas con puntos conectados Practiquemos la creación de la receta del pastel. 1. Solicite la selección Cogo Points 2. Solicite selección de polilínea 3. Solicite una distancia de referencia para comprobar si el punto es válido 4. En cada punto, haga: 1. Obtenga la coordenada Cogo Points 2. Si la distancia desde el punto de la polilínea es mayor que la distancia solicitada, salte al siguiente punto 3. Calcule la posición relativa del punto en la polilínea 4. Almacene esta posición y la coordenada de los Cogo Points 5. Ordene los puntos de la lista que se obtuvo en el looping anterior 6. Redefina los vértices de la polilínea, utilizando estos puntos. ¿Sencillo? ¿Te das cuenta de que saber cómo escribir esto en español ya es programación? Vea la solución AutoLISP aquí: https://tbn2.blogspot.com/2015/04/civil-3d-ligar-cogo- points.html Date cuenta de que tienes un problema: mejora una polilínea, en base a los Cogo Points cercanos. Primero, dividimos este problema en partes más pequeñas: 1) Crear un “comando” para llamar 2) Solicite la selección de puntos 3) Solicite la selección de polilínea… Ahora, pegue cada uno de estos subproblemas y divídalos en problemas aún más pequeños “Crear un comando para llamar”: https://tbn2.blogspot.com/2015/04/civil-3d-ligar-cogo-points.html Figura 26, Jean Luc, activar!!! En Visual Lisp: Figura 27 - Comando de usuario en lisp En VB.NET: Figura 28 - Comando del usuario en VB.NET En C#: Figura 29 - Comando del usuario en C# Colorido ¿verdad? Sí, VLIDE (editor de Visual Lisp integrado en AutoCAD) y Visual Studio son editores geniales. La coloración del código ayuda mucho en la lectura y facilita la comprensión Ahora mire bien los tres ejemplos. En azul, funciones nativas En verde (C# e VB) y gris (AutoLISP) son comentarios En negro, símbolos o nombres de variables o funciones creadas por el usuario Resuelto el primer problema, pasemos as siguiente: ¿Cómo se selecciona una polilínea? Entonces, ¿cómo seleccionas múltiples Cogo Points? ¿Cómo se obtiene la coordenada del enésimo vértice de una polilínea? Ver viernes, en Figura 30, ver viernes, en el mundo periodista!!! Ok, nos reímos un poco. Dijiste que el curso sería en C# e VB, no en Visual Lisp. Sí dijo. Estos son los primeros DOS ejercicios que harás en C# o VB. Antes de comenzar, necesitamos actualizar algunos conceptos para poder escribir estos programas. Instrucción Sub El primer elemento que veremos es precisamente lo que inicia los comandos que vamos a crear. En VB s la Instrucción Sub. De Microsoft: https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/statenents/sub- statenent Sí, hay muchas cosas juntas. Para nosotros, ingenieros sin un curso de informática, tomaremos la parte que hace que un SUB sea un comando. Para hacer un comando para AutoCAD, declaramos mínimo: Figura 31 - Declaración mínima de un comando Explicando: Debe estar dentro de un módulo (palabra Module n la imagen) o clase (veremos más adelante) El módulo debe ser declarado público (palabra Public en la imagen) El módulo debe tener un nombre (palabra Civil3D, en el ejemplo) El comando debe ser un Sub El comando debe tener el atributo CommandMethod (le dice a AutoCAD qué es ejecutar esta “macro” cuando se llama al comando ATIVAR) No voy a decir que SUB es como “VOID” en C#, pero por ahora piense así. SUB y VOID no devuelven valor. Entonces en C#, haríamos así: Figura 32 - Declaración mínima de un comando en C# https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/statements/sub-statement Solo para estas llaves “{“e”}” no me gusta C# de todos modos. De la misma manera Debe estar dentro de una clase (palabra class) La clase debe declararse pública (palabra public en la imagen) La clase necesita un nombre (palabra Civil3D, en el ejemplo) El comando debe ser declarado public void El comando debe tener el CommandMethod (le dice a AutoCAD qué es ejecutar esta “macro”, cuando se llama al comando ATIVAR) Sí hay muchos otros argumentos que podemos y, a veces, debemos hacer. Por ejemplo, es posible poner un parámetro en el atributo CommandMethod, que evita que el comando se ejecutesi está en PaperSpace (muchos de los comandos de Civil 3D solo funcionan en ModelSpace) o incluso si algo está preseleccionado, esta selección se puede usar si el programa va a pedir esta selección. Ah, antes de preguntar, el nombre del módulo puede ser cualquier cosa, no tiene que ser Civil3D. por supuesto, hay algunas reglas: no puede comenzar con un número y no puede tener un espacio y evitar caracteres especiales. Intenta hacer que la cosa sea legible por humanos. Averigüe sobre: Instrucciones VB Métodos C# NameSpaces Public, Private, Friend, Static Recordando que el curso no entrará en estos detalles. Instrucción Function Una function devuelve un valor. Será útil crear subrutinas. Si alguna vez te vuelves loco y quieres crear nuevas funciones para AutoLISP, usarás Function. De ayuda M$: (https://docs.microsoft.com/pt-br/dotnet/visual-basic/language- reference/statenents/function-statenent) Sí, hay toneladas de cosas por ahí. Aquí en el curso, acepto que entiendas esto Figura 33 - Crear una function en VB Sé que aún no sabemos cómo activar Visual Studio, así que solo echa un vistazo a la función que acabo de definir. Suma Ella espera dos argumentos y devuelve un valor numérico real. ¿Entiendes la diferencia para SUB? ¿Qué pasa si estaba en C#? Figura 34 - Crear una Function en C# Solo por diversión, ¿cómo lo haría la versión Visual Lisp de esta función? Figura 35 - Crear una Función en Visual Lisp Ahora NO venos algo en Visual Lisp que venos en VB y C#. El tipo. ¿Cómo sabemos que los argumentos “a” y “b” son números reales? ¿y cómo sabemos que devuelve un número real? Respuesta. No lo sabemos https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/statements/function-statement En programas pequeños, realmente no importa tanto. Pero en programas grandes, esto puede traer muchas complicaciones. Inadvertidamente puede escribir un valor no numérico en la variable “valorA” y al agregar valorA con valorB, puede recibir un error o algo inesperado. En C++ esto a menudo es fatal... Primer consejo: Establece el tipo de la variable. Segundo concejo: Usa nombres que puedas entender. “valorA” solo no dice mucho. Prefiere nombres más “explicativos”, por ejemplo, si estamos hablando de un rectángulo, “valorA” puede referirse al ancho y “valor” puede referirse al largo. De esta manera, daría los nombres de las variables ancho y largo: Figura 36- Dar nombres que se explican por sí mismo en VB Figura 37 - Dé nombres autoexplicativos en C # Figura 38 – Dé nombres autoexplicativos en Visual Lisp Tercer concejo: Poner comentarios en los códigos. Explica qué hace la función, cuáles son sus parámetros y cuál es su salida. Créeme: mantendrás tu código y recordarás lo que hace cada cosa no será una tarea fácil si le pones algunos comentarios Si sigue estos consejos, le garantizo que más adelante estará agradecido por escribir un código hermoso. Una cosa muy importante: al pasar variables en una función, pueden pasar de dos maneras: 1. ByVal (predeterminado si no está escrito de otra manera, es ByVal) 2. ByRef (pasa la variable hacia adelante, para ser modificada en el método que la recibe) ByVal Especifica que un argumento se pasa por valor, de modo que el procedimiento llamado o la propiedad no pueden cambiar el valor de una variable subyacente al argumento en el código de llamada. Si no se especifica ningún modificador, ByVal es el valor predeterminado. https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/modifiers/byval ByRef Especifica que un argumento se pasa de tal manera que el procedimiento llamado puede cambiar el valor de una variable subyacente al argumento en el código de llamada https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/modifiers/byref Figura 39 - Diferencias entre BYVAL y BYREF en VB https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/modifiers/byval https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/modifiers/byref Figura 40 - Diferencias entre BYVAL y BYREF en C# Figura 41 - Diferencias entre BYVAL y BYREF en AutoLISP Ejercicios: 1. Abra los ejemplos en la clase 01 y vea como agregar comentarios en C# y VB. 2. Explique SET y SETQ en el código en AutoLISP, BYREF y BYVAL en VB y REF en C# If El IF evalúa una expresión y cambia el flujo a una ruta si la expresión resulta ser verdadera, o a otra ruta si la expresión resulta hablar Figura – 42 OR ELSE Sé que esperabas esos UML (https://www.devmedia.com.br/o-que-e-uml-e-diagramas- de-caso-de-uso-introducao-pratica-a-uml/23408) para la función IF y para los demás. ¡Tómalo! Figura 43 – IF THEN ELSE Realmente no tiene mucho que decir al respecto. Entonces, haz un poco de ejercicio. En el ejemplo del área del rectángulo, coloque un IF que evalúe si el área calculada es mayor que 1.5x la suma de los lados del mismo https://www.devmedia.com.br/o-que-e-uml-e-diagramas-de-caso-de-uso-introducao-pratica-a-uml/23408 rectángulo y haga que el programa muestre diferentes mensajes para las dos situaciones. For El FOR es un looping. En general, predefine el número de veces que sucederá un conjunto de acciones. Ver, predeterminado no significa que se ejecutará exactamente ese número de veces, ya que puede interrumpirse en el medio de la ejecución. La ventaja del looping FOR es que normalmente ya tiene un índice autoincrementado, pero es posible hacer iteraciones “Para Todos” (FOREACH). Figura 44 - Looping FOR En Visual Lisp: Figura 45 - Factorial en Lisp Mira, Lisp no tiene un FOR, pero sí tiene REPEAT que es esencialmente lo mismo. Ejercicio: poner comentario en el código Figura 46 - Factorial en VB Ejercicio: explique qué es ULong. Sí, puedes mirar en el oráculo. (Google) Figura 47 - Looping en C# Ejercicio: Explique i++ ¿Y For each? Mira, en VLISP, es así: Figura 48 - Foreach en Visual Lisp Ejercicio: explique los argumentos de FOREACH En C# es así: Figura 49 -Foreach en C# Ejercicio: Explicar los parámetros (var c in new [] {5, 66, 67, 68}) Finalmente, VB: Figura 50 - For each en VB Ejercicio: Explica qué hace el carácter “&” hace en el código VB. While ¿Y While? Es solo otro looping. Figura 51 - Looping perder de vista Correcto, UML... Figura 52 - Looping While El looping while evalúa primero una condición y luego, si la condición es verdadera, realiza una acción. Hay una diferencia en relación con el looping DO: DO Figura 53 - Looping DO El looping DO realiza la acción por primera vez y luego evalúa la condición de detención. Cuando no sabemos cuántas veces debes ocurrir un ciclo, es porque la acción en sí misma influye en la evaluación de su condición de detención. Ejemplo del uso de WHILE: Lista = CreaUnaListaEnarticulos() Mientras ListaContieneElementos() TiraUltimoElementoListaHaceAlgunaCosaConEl() FinMientras En este ejemplo puede ser que la función CreaUnaListaEnArticulos() devuelva una lista vacía. Por lo tanto, es recomendable poner ListaContieneElementos() antes de TiraUltimoElementoListaHaceAlgunaCosaConEl() Ejercicio: escriba esto en C#, VB o Lisp. Piense que la lista contiene coordenadas y que dibujará POINTs en AutoCAD. ¿qué, todavía no sabes dibujar? No hay problema, hazlo un problema menor: TiraUltimoElementoListaHaceAlgunaCosaConEl() Coordenada = TomaUltimaCoordenada() Lista = RenovaUltimoArticulo DibujaUnPunto(Coordenada) Fin En VB o C#, suponiendo que la lista es una lista, para obtener el último elemento, simplemente haga: Coordenada = Lista.Last() ¿Te das cuenta de que el problema se ha vuelto tan pequeño que se reduce a UNA PALABRA? (Last) Es eso. El código amarillo en sí mismo es completamente comprensible, casi como una lectura natural. Esta es la “receta del pastel”. Es natural que lo leas y lo entiendas. Ejercicio: Ahora traduzca eso para la computadora. Case/Switch Digamos que Case es una forma menos fea de hacer varios IF. En ausencia de una imagen más interesante: Figura 54 - Case Switch Imagina la siguiente situación.Hiciste un buen comando di el MPEDIT: Figura 55 - MPEDIT, utilizando el case switch Se conoce la cantidad de opciones, pero no se limita a Verdadero o Falso. Luego debe poder tomar las medidas apropiadas para la opción elegida. Considere el siguiente código: Figura 56 - Select Case El código en un buen ejemplo de lo que quise decir con “romper en problemas menores”. Cada pequeño “Sub” con ese Throw New NotImplenentedException() solo muestra un error por ahora, porque todavía no sabemos cómo hacer lo que necesitamos. Sin embargo, ya sabemos que son métodos que modifican una polilínea de alguna manera. También henos implementado la estructura que elige qué hacer dada la opción. Ver el mismo código en C#: Figura 57 - Case Switch en C# Figura 58 – “Cond” en Visual Lisp Ejercicio: Incluya una comprobación con IF en caso de que la función ObterPolilinea() no devuelva una polilínea. Vea que, si no hace esta verificación, cualquiera de las funciones dentro del Switch fallará y puede pasar de un simple error, a un error fatal, de esos “Object reference not set an instance of an object” Figura 59 - Object reference not set an instance of an object Este error es aburrido y, a veces, es muy difícil encontrar dónde ocurre. Try Figura 60 - Mestre Yoda Afortunadamente, esto se aplica a la FUERZA. En programación, podemos hacer un TRY. ¡Y ni siquiera duele nada! Pero ¿por qué hacer un try? Bueno, hay muchas situaciones en las que puede que tenga que hacer esto debido a la incertidumbre de lo que está llegando al punto en el que lo colocamos. Por ejemplo, creó ese Report increíble en Civil 3D, con una hermosa nota de servicio y desea guardar el resultado en un archivo. Inocentemente haces esa llamada inteligente en el “OpenSaveDialog” y hasta ahora todo está bien, pero el usuario eligió guardar el archivo en una carpeta de solo lectura y no lo probaste hasta que llegaste al punto de guardarlo. ¿Qué pasa? ¡ERROR! ¡No se puedes guardar, así de simple! Luego puede mostrar un mensaje de error o tomar alguna otra acción. Y si realizo una llamada en la línea de comando, por ejemplo, solicitando cualquier número, y este mismo usuario ingresó el valor CERO. ¿Qué sucede si divides un número entre CERO? Tiene un vector lleno de cosas y necesita obtener el elemento número 15, pero la lista solo tiene 14 elementos. ¡Error! Entonces, o agrega todas las pruebas que necesita para validar la entrada del usuario, o agrega un poco de TRY para que al menos no se bloquee en AutoCAD. Ah, y no es 100% seguro de que TRY lo resuelva todo. Vámonos. Revise este código: Figura 61 - sin TRY ¿Qué garantiza que el usuario realmente haya hecho clic en algo? Nada, por lo que la primera posibilidad de error ya puede ocurrir en: GetEntity("haga clic en la polilínea").ObjectId Debido a que la función GetEntity puede proporcionar el ObjectId del objeto seleccionado o un valor nulo. Suponiendo que no hizo clic en nada, el programa intentará obtener un objeto que no existe y puede dar un error aquí: plId.GetObject(OpenMode.ForRead) pero suponiendo que el usuario (¡ahh!) haya hecho clic en un círculo o un texto, dará un error aquí. Dim pl As Polyline = plId.GetObject(OpenMode.ForRead) Porque un círculo no es una polilínea. Santo Dios, ¡tres posibilidades de error en tres líneas de código y ni siquiera hice demasiado ¡ Incluiremos el TRY: Figura 62 - Try en VB Bueno, ya henos logrado evitar algunos errores. Algunos inclusos fatales. Pero todavía no es la situación ideal para lo siguiente. El usuario no siempre comete errores por negligencia. A veces, la polilínea esta debajo de una línea y el Draw Order puede interferir. Luego terminas haciendo clic en LINE en lugar de POLYLINE. Podríamos agregar un filtro a la selección. También puede hacer un clic deliberadamente en ESC e interrumpir al comando. En este caso la función GetEntity tendría un Estatus de cancelación. Si no agregamos el filtro, aún podríamos INTENTAR convertir la respuesta de GetObject a Polyline. Esto se llama Cast. Figura 63 - Try con mensaje de error En esta solución tendrá que haber una M* con un a “m” mayúscula, en negrita y parpadeante para que el código bloquee su AutoCAD, al menos en la función anterior. Y vea, si ocurre un error imprevisto, mostrará un mensaje que dice cuál es el error. Para todas las demás situaciones, se muestra un mensaje amigable y la función devuelve “Nothing”. Así que pedí que agregue una prueba IF si la polilínea existía. ¿lo hiciste? ¿no? ¡corre que aún da tiempo! Ejercicios: 1. Escribe TRY en C#. puedes ser la sintaxis básica por ahora. 2. ¿Hay cómo hacer TRY en Visual Lisp? (busque vl-catch-all-apply) Requisitos ¡Vamos a empezar! Primero asegúrese de tener los programas necesarios. Primero los links Civil 3D - https://www.autodesk.com.br/products/civil-3d/overview Sin duda, un excelente programa para proyectos de infraestructura. Actualmente está en la versión 2020. Si no tiene una licencia, use la versión para estudiantes o incluso la versión de TRIAL. Visual Studio - https://visualstudio.microsoft.com/pt-br/ Programa que crea programas. Utilizaremos la versión Community, que es gratuita para proyectos pequeños y medianos. La versión actual es 2019. HTML Help Workshop - https://www.microsoft.com/en-us/download/details.aspx? id=21138 Organiza y crea al archivo de Ayuda. Es gratis. Simplemente acceda al LINK y descárguela. Solo tenga en cuenta que separa el archivo ejecutado de su ayuda, por lo que debe descargar ambos por separado, comprenderá. Tener en mente: Los programas que vamos a crear para AutoCAD / Civil 3D en general deben tener pantallas, ya sea para informar cosas o hacer preguntas. Así que ten en cuenta esta palabra: Form. Estos programas ejecutarán DENTRO de AutoCAD, por lo no son ejecutables sino DLLs, que cargamos con el comando NETLOAD. DLL es una biblioteca de clases y módulos, que contendrá los programas que usaremos DENTRO de AutoCAD. ¿Puedes hacer un ejecutable y descargarlo con NETLOAD? Si y no. Primero, no parece y la lista NETLOAD. Pero puedes forzarlo. En segundo lugar, la API DOTNET de AutoCAD esperará que se ejecute DENTRO de AutoCAD, por lo que, si realiza las funciones de llamada ejecutables desde esta API, sin estar dentro de AutoCAD, dará un error. A API COM puede crear un ejecutable y ejecutar AutoCAD EXTERIOR, pero no funcionará si se combina con la API DOTNET. https://www.autodesk.com.br/products/civil-3d/overview https://visualstudio.microsoft.com/pt-br/ https://www.microsoft.com/en-us/download/details.aspx?id=21138 Civil 3D Primero, necesitamos saber dónde buscar las cosas. Sí en el oráculo (¿qué, no dije quién es el oráculo? Google, por supuesto. AutoCAD API Reference https://www.autodesk.com/developer-network/platform-technologies/autocad http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html Recomiendo ver el segundo link. Necesitas tener esta imagen en tu cabeza: Figura 64 - AutoCAD Object Hierarchy Esta imagen nos muestra cómo se relacionan las cosas dentro de AutoCAD. En él, Application es el proprio AutoCAD. Él maneja una serie de DWGs, ¿verdad? Es el DocumentManager, responsable de abrir, guardar y crear otros DWGs (documentos o Document). El Document es uno de los DWGs en la lista, si estamos hablando del documento actual, en VBA sería como “ThisDrawing” (guarde este nombre) Dentro del Document, hay una base de datos (base de datos en la figura), que contiene tablas (Tables en la figura) Las Tables pueden tener varios tipos: BlockTable – Tabla de Bloques LayerTable – Tabla de Layers https://www.autodesk.com/developer-network/platform-technologies/autocad http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html DimStyleTable – Tabla de estilos de dimensión El ModelSpace, por ejemplo, es solo un bloque. ¿qué es un bloque de todos modos? Es una colección de objetos (líneas, textos, puntos, otros bloques…) Civil 3D API Reference: http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/http://docs.autodesk.com/CIV3D/2013/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2014/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2015/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2016/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2017/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/ http://help.autodesk.com/view/CIV3D/2018/ENU/ http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/ http://help.autodesk.com/view/CIV3D/2019/ENU/ Tenga en cuenta que tiene hasta 2019. Sin embargo, esta lista cambia de vez en cuando, como nuevas clases, funciones, métodos, etc. Se agregan, otros se modifican o incluso se eliminan. No me gusta particularmente usar la API COM (ActiveX, la que usa en VBA), porque depende demasiado de la versión Civil 3D, además de requerir algunas líneas de código más y obligarlo a mezclar la API COM y la API DOTNET. Pero, por supuesto, a veces no hay forma, porque algunas cosas solo tienen una y otras solo tiene la otra. Ah, este curso utilizará exclusivamente la API DOTNET y API COM. No compilaremos para ARX. Incluso puede preguntar: ¿cómo elijo donde se escribirá mi programa? C#, VB, AutoLISP, C++? http://docs.autodesk.com/CIV3D/2012/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2013/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2014/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2015/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2016/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2017/ENU/API_Reference_Guide/ http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/ http://help.autodesk.com/view/CIV3D/2018/ENU/ http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/ http://help.autodesk.com/view/CIV3D/2019/ENU/ Figura 65 -Ferrari para ir a la panadería Visual Lisp es simple, resuelve mucho. Úselo cuando necesite automatizar pequeñas acciones con aproximadamente 100 líneas de código, por ejemplo, o si su TI crea un caso para instalar Visual Studio (tuve y pido bendición en Francia para instalar en la última oficina en la que trabajé Figura 66 - caso de creación de TI instalar o Visual Studio ¿VBA? ¿Puro así? Primero tendrá que instalar VBA en AutoCAD, que ya no viene en la instalación de forma predeterminada y todavía tendrá que combinar algunas líneas de Visual Lisp para poder crear los comandos, de lo contrario tendrá que estar ejecutando macros. Puedes hacerlo con Visual Studio, es mejor y menos molesto, créeme, jejejeje mucho “_”. Figura 67 - VBA ya no está instalado en AutoCAD VB o C#. Cuestión de gusto. Claro que cada lenguaje tiene sus particularidades, pero para mí no cambia en nada entre uno y otro, por lo que prefiero VB, tiene menos “{“, “}”, ”;” C++? Una grande cantidad de “*”, “&”, “{“, “}”, “;”, no me gustó. Los programas que he hecho hasta ahora se han resuelto muy bien con VB. Siempre le digo eso a cualquiera que me pregunte: ARX es un Ferrari para ir a la panadería. Visual Studio El Visual Studio tiene varias versiones, para diferentes propósitos. En este curso utilizaremos la versión comunitaria, que actualmente se encuentra en la versión 2019. Figura 68 – Pantalla de inicio de Visual Studio ¿Puedes usar otras versiones? Sí, siempre que instale los paquetes de .NET Framework para la versión de Civil 3D que va a utilizar. Civil 3D / AutoCAD .NET Framework 2011 3.5 2012 3.5, 4.0 en la mayoría de las veces 2013 4.0 2014 4.0 2015 4.5 2016 4.5 2017 4.5.2 2018 4.6 2019 4.6, 4.7.2 2020 4.7.2 Figura 69 - Visiones do .NET Framework compatibles Esta tabla no es exactamente rígida. También dependerá de si está compilando para sistemas de 64 bits o 32 bits o ambos. Y si va a mantener las referencias DLL por más tiempo. La mayoría de los programas exclusivos de AutoCAD que se han compilado para AutoCAD 2013 se ejecutan hasta 2020 sin cambios de códigos. TBN2CAD (https://tbn2net.com/TBN2CAD) es un ejemplo. En cuanto a los programas creados para Civil 3D, a veces necesitan hacer referencia a versiones mínimas de la DLL y, como se compilan en versiones específicas de Framework, debe seguir las mismas versiones. Ejemplo: TBN2C3D (https://tbn2net.com/TBN2C3D). En general, hay un gran cambio cada 3 versiones de AutoCAD. Por ejemplo, para Civil 3D, solo era posible programar en la API COM hasta la versión 2010/2011. Luego, la API DOTNET comenzó a funcionar en la versión 2011, pero aún un poco aburrida. en 2012 fue bueno. 2013 inventó que gran parte de la API debería estar dentro de otra DLL, con los NameSpaces cambiados, una zona, en fin. 2014 como que dejaron de f* y desde entonces casi no ha cambiado En AutoCAD, se compila con referencias de AutoCAD 2007 “Any CPU” funcionará bien hasta 2010compilado para 2010, se ejecutará solo hasta 2012. ¡compilado para 2013, se ejecutará hasta 2020, al menos!!! Visual Studio incluso le advertirá sobre problemas de 32/64 bits, pero diría que la mayoría de las veces puede ignorarlo. Ahora, cambia la figura si tiene la intención de hacer ARX. Luego, primero ve a aprender C++. Oh enserio. Luego, deberá instalar varias versiones de Visual studio, desde OBJECT ARX. (https://www.autodesk.com/developer-network/platform-technologies/autocad/objectarx) Los programas realizados en C++ para AutoCAD / Civil 3D (compilación en la extensión ARX, DBX) dependen de la versión del compilador en el que se escribió originalmente la API. Para estos casos, consulte la ayuda del paquete de instalación de OBJECT ARX que descargó. Este curso no hará programa ARX Es difícil convencer a los clientes de que tiene que pagar por las actualizaciones de la versión… https://tbn2net.com/TBN2CAD https://tbn2net.com/TBN2C3D https://www.autodesk.com/developer-network/platform-technologies/autocad/objectarx Figura 70 - Cliente insatisfecho con tener que PAGAR por las actualizaciones Excel Excel, en realidad todo el paquete office, tiene una API ACTIVEX y usted puede escribir programas en él que acceden a AutoCAD, dibujan cosas etc. Figura 71 - Excel trabajando en AutoCAD Incluso publique un pequeño programa en mi blog en el que Excel maneja AutoCAD. Ver aquí: https://tbn2.blogspot.com/2008/09/excel-escravizando-o-autocad.html No hay ningún secreto, si ya ha creado un macro en Excel, le irá bien para trabajar con AutoCAD. ¿haremos un ejercicio? Copie el código del enlace de arriba y péguelo en el editor de Excel de Visual Basic: https://tbn2.blogspot.com/2008/09/excel-escravizando-o-autocad.html Figura 72 - VBA de Excel El truco es agregar la referencia correcta de AutoCAD. Figura 73 - referencia a AutoCAD Type Library Nuestro objetivo aquí en este curso es lo contrario. AutoCAD accederá a Excel y hará cosas con él (eso sonó mal, jejeje). Veremos cómo hacer referencia a Excel en Visual Studio más adelante. HTML Help WorkShop Vamos a hacer un programa de verdad, ¿verdad? Esto supone que tendrá ayuda. Hay varias formas de hacer esto: un PDF (¡muere PDF!), un documento WORD (no me gusta la idea), archivos HTML. Me gusta la idea de HTML, porque puedes insertar links, insertar un “poquito” de Java script, estilos, links. No es que no puedas poner eso en Word, pero si piensas en hacer que esta ayuda esté disponible en línea (ejemplo: https://tbn2net.com/help/TBN2NET/), HTML es bueno. Particularmente, prefiero que la ayuda se concentre en un solo archivo y que crear docenas de HTML para que el usuario las busques no es legal. Más adelante, verá que para “Linkar” un tema específico a un comando será aún más simple con el archivo generado por este programa La interfaz del programa es muy simple. Básicamente creará el esquema e incluso puede poner una lista de palabras clave en el “Índex”. Hay otras soluciones, sí, puedes elegir más tarde. https://tbn2net.com/help/TBN2NET/ Referenciar DLLs Ahora que sabemos qué programa vamos a utilizar, abramos Visual Studio y hagamos referencia a / Civil 3D / Excel. Primero, abra Visual Studio: Figura 74 - Abra Visual Studio Crea un proyecto haciendo clic: Figura 75 - VS,crie un proyecto Ahora, tomate un momento y piensa qué tipo de programa quieres hacer y en qué lenguaje ¿Lo pensaste? DLL, ¿verdad? Así es, elija DLL. Ah, observe qué versión de AutoCAD / Civil 3D tiene. Tendremos que elegir la versión de .NET Framework más adelante. Verifique las opciones en la pantalla: Figura 76 - Criar DLL C# o VB, Elige como prefieras. Enseñe la carpeta donde guardará y configure la versión de .NET Framework de acuerdo con la versión en AutoCAD: Figura 77 - .NET Framework y versión de AutoCAD Vea la tabla completa en la tena anterior de Visual Studio si es necesario, Ahora, agreguemos referencias. Figura 78 - Adicionar referencias Para trabajar solo con AutoCAD utilizando la API DOTNET, debe elegir las siguientes DLLs: accorengd.dll (solo AutoCAD 2013 en delante) acdbmgd.dll acmgd.dll Estas DLLs están en la carpeta de instalación de AutoCAD: C:\Program Files\Autodesk\AutoCAD 2020 En mi caso. Vea que marqué accorengd.dll. Esta DLL aparece solo en la versión 2013 en delante y contiene una serie de NameSpaces que estaban previamente en las otras dos DLLs. Hay toda una historia detrás de esto. Buscar en Google. Algunos programas pueden usar otras DLLs que terminan en “*mgd.dll” que están en la carpeta de AutoCAD. Un ejemplo es AdWindows.dll, que le permite crear PalletSet (esas pantallas que pueden caber, como Properties) entre otras cosas. Para trabajar con Civil 3D, necesitará, además de los ya mencionados para AutoCAD, los siguientes: AecBasengd.dll AeccDbMgd.dll También están en la carpeta de instalación de AutoCAD. Para trabajar con la API COM en AutoCAD, consulte: Autodesk.AutoCAD.Interop.Common.dll Autodesk.AutoCAD.Interop.dll En AutoCAD 2020 está en la carpeta de instalación, pero recuerdo que estaban ocultos en versiones como 2012. Nada que una búsqueda en Explorer no resuelva. Para trabajar con la API COM no Civil 3D, consulte: Autodesk.AEC.Interop.Base.dll Autodesk.AECC.Interop.Land.dll Autodesk.AECC.Interop.Pipe.dll Autodesk.AEC.Interop.UIBase.dll Autodesk.AECC.Interop.UiLand.dll Autodesk.AECC.Interop.UiPipe.dll Autodesk.AECC.Interop.Roadway.dll Autodesk.AECC.Interop.UiRoadway.dll Los nombres son muy sugerentes, ¿no? Bueno, en la versión 2020, estas DLL están en: C:\Program Files\Autodesk\AutoCAD 2020\C3D Particularmente prefiero evitar el uso API COM, porque está obligado a compilar para cada versión de AutoCAD de forma independiente. Con la API DOTNET, puede “omitir” algunas versiones Y ¿Excel? El Excel lo encuentra aquí: Figura 79 - Excel Type Library Curiosamente, Excel no me aparece en esta lista. Puede ser que para usted aparezca. Si está instalado y no aparece, haga clic en Procurar: Figura 80 – EXCEL no GAC Lo encontrará en el GAC (Global Assenby Cache). Luego, elija la versión más pequeña si tiene más de una. Aquí encontré la versión 15. ¿Un descanso? Figura 81 - Hora del almuerzo Comprensión de la orientación a objetos Ya sabemos cómo activar Visual Studio y sabemos qué archivos DLL usar para crear nuestros programas. Tratemos de entender un poco de Orientación de objetos, esto lo ayudará a leer la ayuda que se encuentra en esos links que pasé de la API de Civil 3D. Da Wikipedia: La Programación Orientada a Objetos (también conocida por sus siglas POO) es un modelo de análisis, diseño y programación de software basado en la composición e interacción entre varias unidades llamadas “objetos”. Ver más en https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos Del texto completo de este enlace, la frase que más me llama la atención es “Empaque los datos con sus operaciones naturales / intrínsecas”.”. Particularmente me gusta esta idea porque sé lo que hace una clase. Pero no necesito saber cómo lo hace. También me gusta el hecho de que ella organiza las ideas como objetos. Y estos tienen sus propriedades, funciones. Programación Estructurada versus Programación Orientada a Objetos A continuación, venos una comparación entre la programación estructurada y la programación orientada a objetos con respecto a los datos. Tenga en cuenta que en la programación estructurada tenemos procedimientos (o funciones) que se aplican globalmente en nuestra aplicación. En el caso de la orientación a objetos, tenemos métodos que se aplican a los datos de cada objeto. https://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos Figura 82 - Programación Estructurada versus Programación Orientada a Objetos La programación estructurada, cuando se hace bien, funciona mejor que la programación orientada a objetos. Sin embargo, la programación orientada a objetos trae otros puntos que terminan siendo más interesantes en el contexto de las aplicaciones modernas. Dado que el rendimiento de las aplicaciones no es una preocupación importante, la programación orientada a objetos se ha generalizado. Esta difusión se debe en gran medida al problema de la reutilización del código y la capacidad de representar el sistema mucho más acerca de lo que veríamos en el mundo real. Para comprender exactamente de qué se trata la orientación a objetos: 1) Abstracción Vamos a tratar con una representación de un objeto real, así que tenemos que imaginar qué va a hacer ese objeto. Hay tres puntos que deben tenerse en cuenta en esta abstracción. Este objeto debe tener: a) Identidad: para ser único, es decir, su tipo solo se puede definir una vez b) Características: son las propriedades c) Acciones: son las funciones o métodos Si creáramos el tipo “Auto” podría tener: a) Identidad: automóvil b) Características: color, potencia, puertas, modelo c) Acciones: Estacionar(), autopiloto (), encender luces() 2) Encapsulación Agrega seguridad a la aplicación orientada a objetos porque oculta propriedades o acciones, creando una especie de recuadro negro. ¿Cómo conduce el auto solo? Ver: Public, Private, Shared 3) Herencia Esta característica optimiza la producción de la aplicación en tiempo y líneas de código. Tiene un prototipo de automóvil y tiene el sistema Autopiloto (). Ahora crea modelos derivados de él y comienzan a tener el mismo sistema, por haber heredado esta característica. 4) Polimorfismo Imagine que creó un nuevo modelo de automóvil, derivado de su prototipo original, pero por alguna razón, necesita hacer adaptaciones en el sistema Autopiloto (). Para todos los afectos, el automóvil tiene esta función, pero internamente es diferente del original Tipagen Imagine este escenario: creó un programa para administrar un estacionamiento. Accede al sistema Autopiloto () de los automóviles y los estaciona. ¿Hermoso no? Entonces llega un cliente con una MOTOCICLETA. Motocicleta es un vehículo, al igual que el automóvil, pero no tiene el sistema Autopiloto () y eso es todo, su estacionamiento autónomo ya no funciona. Tipagen es declarar el tipo de cosas. Una variable declarada como un entero, por ejemplo, no deben aceptar nada más que un número. Al igual que una variable que es un texto, no se le debe dar un número. Visual Lisp no tiene Tipagen alguna. Entonces puedes hacer esto: Figura 83 - Visual Lisp no tiene Tipagen En el ejemplo de Visual Lisp, definí el valor de la variable “a” inicialmente como texto y luego con un valor numérico. Por supuesto, habrá situaciones que no importan, o incluso deseables, pero en general es una mala idea. Tomar el examen: Abra AutoCAD y escriba en la línea de comando: (setq a "este é un teste") Ahora, escribe: (alert a) Figura 84 - Alerta de AutoCAD Ahora escriba en la línea de comando: (setq a 12) Ahora, escribe: (alert a) Figura 85 - Error en la línea de comando ¿Se da cuenta? La función (ALERT “mensaje”) espera que “mensaje” sea texto. Pero proporcionamos un número y causó un error No C# y VB esto también sucede y también puede indicarle al compilador que verifique el código antes de compilar estos errores: Figura 86 - Option Strict On Público/Privado/Distribuido Allá atrás, dijo que una de las características de la Orientación de Objetos es el Encapsulación. Figura87 – Encapsulamiento Creemos un juego llamado Estacionamiento. El juego debe recibir autos y estacionarlos. También debe recoger el automóvil cuando el propietario lo solicite. Implementa este juego. Simple ¿No? ¿Qué, ni siquiera sabes por dónde empezar? ¿recuerdas el ejemplo del auto? Mira este pequeño código: Figura 88 - Clase coche ¿te das cuenta de que acabo de crear algunos nombres de funciones para el automóvil? Mira que el Autopiloto () está allí e incluso describí un código que dice cómo lo hace. ¿Y dónde está el resto del código? Bueno, ¿Recuerdas que hablé acerca de dividir un gran problema en pequeños problemas? Figura 89 - Como diría Jack, el Destripador: Vamos por partes Ahora, veamos cómo sería la clase de estacionamiento, suponiendo que solo tengas autos. Figura 90 – BusqueCarroCliente Mira, desde el punto de vista de Mac Donald’s, sé que el estacionamiento recoge el automóvil del cliente y le da un mensaje de si el automóvil está allí o no. Pero de ninguna manera Mac Donald’s sabe cuántos automóviles hay, o incluso quién los posee. ¿Cómo sé que no lo hace? Porque declare que la mesa del coche es Private. Solo eso. ¿Cómo sé que Mac Donald’s sabe que el estacionamiento solo busca al automóvil? Porque declaro que el método “BusqueCarroCliente()” es Public. Aumenta ligeramente la dificultad: Asumamos que el poder se ha vuelto relevante en nuestro negocio, por lo que necesitamos diferenciar los automóviles por poder. Cada automóvil del mismo modelo en principio tiene el mismo poder. Los autos de otros modelos tienen poderes diferentes, sin embargo, siguen siendo autos. Incluiremos esta propiedad en el auto. Figura 91 - Agregue la Propiedad Potencia Decir “Carro (coche)” es genérico. Decir Golf, Maverick no. Estoy especificando el modelo y con eso los estoy diferenciando por el poder. Sin embargo, como estos dos se derivan del mismo prototipo, ¡tanto el piloto como el estacionamiento solo! Y vea cuántas líneas necesitaba para crear diferentes modelos. Ejercicios: ahora suponga que solo Golf tendrá un techo solar. Incluya un botón en su panel con la acción “AbrirOCerrarTechoSolar()” dependiendo del estado del techo. Clase/Módulos/Estructuras En los ejemplos anteriores, solo vimos clases: automóvil, estacionamiento. ¿Cuándo debo usar el módulo? Para comenzar, el módulo es solo para VB: Public Module Genericos Sub MetodoQualquer() End Sub End Module En C# declaramos static class: public static class Genericos { public static void MetodoQualquer() { } } De la ayuda de Microsoft: Una clase static es básicamente lo mismo que una clase no estática, pero hay una diferencia: una clase estática no puede ser instanciada. En otras palabras, no puede usar el operador new para crear una variable de tipo de clase. Como no hay una variable de instancia, puede acceder a los miembros de una clase estática utilizando el nombre de la clase en sí. Esto significa que: instancia = new Genericos(); no se puede usar y dará error. Para acceder al método “MetodoQualquer()” simplemente haga: Genericos.MetodoQualquer(); ¿y en Visual Lisp? Olvídalo, no hay nada de eso allí. Hum... ¿cómo cambia eso la programación de AutoCAD que has estado promocionando? Bueno, para que el comando sea visible, tendrá que estar en: “Public module” o “Public Class” no VB “Public static”, “puplic class” en C# Y hay una pequeña diferencia allí: “Per Document”. Al cargar el archivo DLL en AutoCAD, los comandos que están en CLASE y no están en SHARED, cada documento do AutoCAD tendrá su propia instancia de la clase. Esto puede ser útil si no desea mezclar valores de variables globales entre documentos. ¿Qué hay de las estructuras? Las estructuras son una forma de organizar los datos. Las estructuras son útiles cuando desea que una solo variable contenga múltiples piezas de información relacionada. Por ejemplo, es posible que desee conservar el nombre, el número de teléfono y el salario del empleado. Puede usar varias variables para obtener esta información, o puede definir una estructura y usarla para una sola variable de empleados. La ventaja de la estructura se hace evidente cuando tiene muchos empleados y, por lo tanto, muchas instancias de la variable. En VB: Public Structure Funcionario Dim Nome As String Dim Telefone As Integer Dim Salario As Double End Structure En C# public struct Funcionario { public String Nome; public int Telefone; public double Salario; } Cuando tiene una serie de propiedades, comienza a ponerse feo pasar por las funciones una por una. Diría que una estructura es casi como una clase, pero suceden cosas interesantes cuando estos dos conceptos se mezclan. Considere el ejemplo “Executavel.sln” en el material: Figura 92 - Diferencia entre Clase y Estructura Hay dos botones. Uno de la clase FuncionarioClase y el otro usa la estructura FuncionarioStruct. Ambos modifican los datos después de instanciar. Figura 93 - ¿Dónde está Wally? ¿Puedes ver la sutileza de la diferencia? Ejercicio: explique por qué sucede esto Fields (campos) Los campos se utilizan para almacenar información dentro de la clase (Strings, número) o tipos complejos como otras clases. Sin embargo, la asignación o lectura de valores en ellos no causa ninguna acción en la clase. ¿Recuerdas qué es la acción? Son las funciones o métodos. Imagina la situación. Desea que la clase “carro” almacene algún valor. Este valor no necesita ser validado y puede que ni si quiera necesite guardarse externamente (en una base de datos o archivos XML), por ejemplo. Imagina la situación. Desea que la clase CARRO almacene algún valor. No es necesario validar este valor y es posible que ni siquiera sea necesario guardarlo externamente (en una base de datos o archivo XML, por ejemplo) Figura 94 - Fields Versus Property ¿Ves cómo usar la Property te permite verificar los datos internamente antes de guardarlos? ¿Viste que he declarado los campos que realmente reciben valores como Private? Properties (Propriedades) ¿Entendió la explicación de los Fields (Campos) anteriores? Para reforzar: Property funciona como la unión de los métodos SET y GET. Como son métodos, se le puede asignar más acciones que simplemente guardar o leer valores. En el ejemplo, utilicé los Métodos GET y SET para validar los valores ANTES de guardar: Figura 95 - Fields versus Property Métodos ¿Todavía recuerdas las clases de autos? ¿Puedes identificar un método? Ver, Auto piloto() Figura 96- Método AutoPilotar Tenga en cuenta que todos los automóviles deben proporcionar un MÉTODO AutoPilotar() para que el automóvil sea “piloto automático”. “Proporcionar” en este contexto, es hacer el método Public. Figura 97 – “Proporcionar” en este contexto, es hacer el método Public Ejercicio: Implementa un método que verifique si es hora de la revisión Este método debe responder con una oración, identificando por el kilometraje recorrido si necesita revisar los 10, 20, 30, 40 o 50 mil km. Tenga en cuenta que, si el propietario no realizo una revisión, el automóvil debe avisarle. Ah, no permita que nadie, ni siquiera el propietario, “cambie” el kilometraje. Esto solo se puede leer en la pantalla. Solo el método “SegueEnFrente()” puede actualizar el odómetro. Instancia Instancia. Me llevó años entender de qué se trataba. Enserio. Lo usaba y ni siquiera sabía de qué se trataba. Cuando creamos la clase coche, en realidad no creamos UM auto, sino la definición de qué es un auto. Tenga en cuenta que para Auto Pilot() CUALQUIER automóvil, este automóvil debe existir primero. Este se llama creación de instancias, creación de una instancia. Para instanciar, usamos NEW: En VB: Figura 98 – Uso de New en VB En C#: Figura 99 – Uso de New en C# En Visual Lisp: Figura 100 - usando New en Visual Lisp: ni siquiera lo intentes Herencia Ya lo había definido allí, pero reforcémoslo: una característica que optimiza la producción de la aplicación en tiempo y líneas de código AutoPilotar(). Ahora crea modelos derivados de él y comienzan a tener el mismo sistema,por haber heredado esta característica. Cuando creamos la clase de auto, inmediatamente agregué otras dos clases de niños: Golf y Maverick. Bueno, también son autos, pero tienen sus propias características. Incluso uno de los ejercicios le pide que implemente el método “AbrirOCerrarTechoSolar()”. ¿Hiciste eso? Bien, ahora imagina que Maverick tiene varias versiones: V4, V6 e V8 Figura 101 - Figura aleatoria de Maverick LDO Cada uno de ellos viene con su conjunto de opciones diferentes, además del motor (potencia), por supuesto. Ejemplo: V4 tiene asiento de tela, V6 tiene asiento de cuero y V8 tiene asiento de cuero y aire acondicionado. Tenga en cuenta que ahora la propriedad TipoDeBanco aparece en los Maverick y se puede cambiar, pero en Golf el modelo simple no se fabrica y el banco climatizado es estándar de serie. Todos tienen AutoPilotar(), pero solo el V8 tendrá StartStop, para ahorrar combustible, por supuesto. StartStop debe activarse durante. ¿Puedes implementar estas características? Primero, ¿Cómo heredas?: Figura 102 - Herencia en VB Figura 103 - Herencia en C# Bueno, la mitad del ejercicio está ahí. Implemente el MaverickV8 e incluya el asiento climatizado También implementa Golf y verifica el tipo de banco que el amigo puede instalar. Atributos Los Atributos son cosas que podemos colgar en propriedades, métodos, clases, módulos y se usan para muchas cosas. Un ejemplo: Hiciste un FORM (¿recuerdas esta palabra?), que muestra la característica del automóvil. Este FORM probablemente tiene un Controle (guarde esta palabra) del tipo PropertyGrid (¡guarde esta palabra!) Cuando el usuario del estacionamiento acede a su sistema, aparece este FORM. ¿Cómo crees que lee las propriedades del auto? “Potencia” OK, es fácil de leer. ¿pero en qué unidad está? “Bancos” y en el lado dice simple. Eso es todo. “Modelo” escribe sólo “MaverickV8” No sería más amigable si el Campo Potencia apareciera: Potencia (HP): 100 O entonces: Potencia: 100 HP Y en cuanto al modelo, se vería mejor así: Modelo: “Maverick V8 ¡hermano!” ¿Y debajo de eso vino una de esas descripciones que te hacen querer tener el auto? Si. Estas características están todas hechas en los atributos. Figura 104 - Atributos en VB Figura 105 - Atributos en C# Por supuesto, hay muchos otros usos para los atributos: definir el editor de un tipo determinado (guardas esta palabra: TypeEditor), definir cómo convertir cualquier valor en String y cómo recuperar el valor de un String (Guardar esta palabra: TypeConverter). Enumeradores De la ayuda de Microsoft: (https://docs.microsoft.com/pt-br/dotnet/visual-basic/language- reference/statenents/enum-statenent) Si tiene un conjunto de valores sin cambios que están relacionados lógicamente entre sí, puede definirlos juntos en una enumeración. Esto proporciona nombres significativos para enumeración y sus miembros, que son más fáciles de recordar que sus valores. Luego puede usar los miembros de enumeración en muchos lugares de su código. Los beneficios de usar enumeraciones incluyen lo siguiente: Reduce los errores causados por errores de transposición o tipeo. Facilita el cambio de valores en el futuro. Hace que el código sea más fácil de leer, lo que significa que es menos probable que se introduzcan errores. Garantiza la compatibilidad con versiones posteriores. Si usa enumeraciones, es menos probable que su código falle si alguien cambia valores correspondientes a los nombres de los miembros en el futuro. Una enumeración tiene un nombre, un tipo de datos subyacente y un conjunto de miembros. Cada miembro representa una constante. En el ejemplo de los automóviles, definí una enumeración para el tipo de banco ¿viste? Figura 106 - Enumeración en VB Figura 107 - Enumeración en C# En Visual Lisp, podría implementar enumeradores con variables globales: https://docs.microsoft.com/pt-br/dotnet/visual-basic/language-reference/statements/enum-statement Figura 108 – Uso de variables globales para enumeradores Constantes De la ayuda de Microsoft: (https://docs.microsoft.com/pt-br/dotnet/visual-basic/programming-guide/language- features/constants-enums/how-to-declare-a-constant) Utiliza Const para declarar una constante y establecer su significativo su valor. Al declarar una constante, puede asignar un nombre significativo a un valor. Una vez que se declara una constante, no se puede modificar ni darle un nuevo valor. A la constante debe tener un nombre simbólico válido (las reglas son las mismas para crear nombres de variables) y una expresión compuesta de caracteres numéricos o de cadena y operadores (pero no llamadas a funciones). Un ejemplo: suponga que desea declarar el valor PI: Figura 109 – uso de constantes en VB Figura 110 - Uso de constantes en C# Tenga en cuenta que hay mucho más en la ayuda de Microsoft, le sugiero que lea. https://docs.microsoft.com/pt-br/dotnet/visual-basic/programming-guide/language-features/constants-enums/how-to-declare-a-constant Hello World Ahora, finalmente, ¡digamos hola mundo en AutoCAD! Concepto que debes recordar: a) Clase b) Método c) Atributo d) Crear un proyecto Dll en Visual Studio e) Agregue referencias compatibles con AutoCAD / Civil3D f) Elija la versión de .NET Framework Solo estos. Ah, por supuesto, haber entendido mínimamente cómo programar.... Crear Comando Comencemos con Visual LISP, solo para variar. Escriba VLIDE en la línea de comando y haga clic en un nuevo documento y escriba esto: Figura 111 - Hola Mundo en Visual Lisp Seleccione TODO el texto y haga clic CTRL + SHIT + E Esto cargará el código sin necesidad de APPLOAD. Ahora, en la línea de comando, escriba HELLOWORLD e haga clic ENTER: Figura 112 - Hello world funciona en Visual Lisp Perfecto. Ahora la versión VB 1. Abra Visual Studio 2. Crear un proyecto de tipo DLL 3. Agregue referencias a las DLLs a) acdbmgd.dll b) acmgd.dll c) accorengd.dll 4. Crear un módulo público 5. Ingrese el código 6. Asegúrese de que .NET Framework es correcto Figura 113 - Crear Proyecto DLL en VB Figura 114 - Hello World en VB (archivo 01) Tenga en cuenta los colores: El verde es un comentario. No influirá en la ejecución e incluso puede eliminarse. En azul, son instrucciones nativas del lenguaje En marrón, funciones o métodos Rojo, Strings Vea, este es el mínimo que un programa necesita para ejecutar AutoCAD como un comando. Note la cantidad de conceptos involucrados. a) Imports, importa NameSpace para simplificar el uso de sus métodos. b) Public Module, define un módulo como público c) Public Sub, define un método como público d) MsgBox, método interno de VB que muestra un mensaje en pantalla e) CommandMethod, atributo que está en NameSpace Autodesk.AutoCAD.Runtime, que por su vez está en DLL accorengd.dll f) VBNewLine, constante de tipo String, que está en NameSpace Microsoft.VisualBasic, que por su vez está en DLL Microsoft.VisualBasic.dll Figura 115 – ¡la cantidad de conceptos puede ser aterradora! Bueno, ahora solo compila, pero primero, mira las propriedades de la solución: Figura 116 - Propiedades de la solución (DLL) Lo que necesita 20ver en esta pantalla: Nombre del assenbly (es el nombre que llevará DLL) NameSpace Raíz, así como cualquier biblioteca de clases, tenemos un NameSpace, para no mezclar nuestro comando con métodos del mismo nombre en otros DLL, métodos, etc. etc. Tipo de Aplicación: Biblioteca de Clases (DLL) Estructura de destino: .NET Framework 4.7.2, para AutoCAD 2020 Ahora mira esta pantalla: Figura 117 - Propriedades de compilación Aquí, elegirás El destino (donde guardar el dll) La Plataforma (prefiere Any CPU, para .NET Framework) El resto se va como en la pantalla (ejercicio: averigüe qué es “Opção Strict”) ¿Viste los dos? ¡Así que compila! Para hacer esto, haga clic en el menú compilación / solución de compilación Figura 118 – Compilar Ahora, abra AutoCAD y haga NETLOAD: Figura 119 – NETLOAD Sí no se producen errores, funcionó. Llame al comando HELLOWORLD:
Compartir