Logo Studenta

Curso_de_programación_para_Civil_3D_y_AutoCAD_Spanish_Edition

¡Este material tiene más páginas!

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:

Continuar navegando