Ayuda en Programacion Vba Autocad PDF
Ayuda en Programacion Vba Autocad PDF
Cada objeto dispone de un conjunto de propiedades como color, tipo de línea, capa, radio (en los
círculos), etc., y métodos como añadir, copiar, mover, escalar, borrar, modificar, etc. Un dibujo de
AutoCAD dispone también de otros elementos que están definidos como son el Espacio Papel, el
Espacio Modelo y los bloques. Estos objetos son colecciones de objetos gráficos que contienen
entidades individuales de dibujo. Estas colecciones disponen a su vez de propiedades y métodos
para conocer, por ejemplo, cuantos elementos componen la colección o añadir elementos (entidades
gráficas) a cada colección.
Estas tres colecciones Espacio Papel, Espacio Modelo y bloques pertenecen a su vez a un
documento o dibujo de AutoCAD. El propio documento de AutoCAD esta definido como objeto y
también tiene definidas sus propiedades y métodos. Entre sus propiedades están su nombre, su path,
o sus limites. Entre los métodos están regenerar, limpiar, guardar, etc., es decir, todas las
operaciones que pueden llevarse a cabo sobre un documento de AutoCAD.
Práctica 10 Pág: 1
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Un documento de AutoCAD consta también de una serie de elementos definidos como colecciones,
como la colección de capas, de estilos de texto, de SCP’s, de vistas, de ventanas, etc. Como en
todos los objetos del modelo de la figura 1, cada una de estas colecciones tiene sus propios métodos
y propiedades.
Por ultimo cabe resaltar que todos los elementos de la figura 1 forman parte de un objeto que los
contiene a todos ellos; la propia aplicación de AutoCAD, que aparece definida como
AutoCAD.Application. para comprender mejor esta estructura se dispone en la ayuda de una
representación gráfica de todos ellos. Al hacer click sobre cualquiera de ellos aparece una pantalla
que los describe, junto con una lista de todos sus métodos y otra con sus propiedades. Se puede
acceder a dicha lista a través de Temas de ayuda de AutoCAD, VBA y ActiveX Automation, ActiveX
and VBA Reference, Model Object.
El motivo de estas declaraciones es que hay que indicar a Visual Basic que se va a trabajar con el
Modelo de Objeto de AutoCAD. Las siguientes sentencias deben incluirse en el código de las
aplicaciones. Las definiciones de variables se incluirán en (General)(Declaraciones) y las
sentencias de asignación en un evento o procedimiento que se ejecute al iniciarse la aplicación; por
ejemplo en el evento UserForm_Initialize().
Option Explicit
Dim AcadDoc As Object
Dim AcadDocEM As Object
Private Sub UserForm_Initialize()
Set AcadDoc = GetObject (, “AutoCAD.Application”). ActiveDocument
Set AcadDocEM = AcadDoc .ModelSpace
End Sub
Los nombres empleados para las dos variables AcadDoc y AcadDocEM pueden ser cualquier otro.
Conviene asignarles nombres que describan su contenido. Su tipo debe ser Object. Para asignar
valores a variables de tipo Object se debe utilizar la sentencia de asignación Set además del signo
=. Se emplea la función GetObject cuyo finalidad es devolver el una referencia al objeto que se
solicita, en este caso AutoCAD.Application, que engloba a todo el Modelo de Objetos. Para que
esta función responda correctamente es necesario que AutoCAD este cargado y con un dibujo abierto
que será referenciado como ActiveDocument.
En la primera instrucción Set, se asigna a AcadDoc el documento de AutoCAD que esta abierto y
activo en ese momento. En la segunda, se asigna a AcadDocEM una referencia al Espacio Modelo
del dibujo actual . A partir de este momento, en la aplicación se puede trabajar con AcadDoc y
AcadDocEM como el dibujo de AutoCAD y su Espacio Modelo respectivamente. Si además se desea
trabajar con el Espacio Papel, las sentencias empleadas deberían ser:
Option Explicit
Dim AcadDoc As Object
Dim AcadDocEM As Object
Dim AcadDocEP As Object
Private Sub UserForm_Initialize()
Set AcadDoc = GetObject (, “AutoCAD.Application”).ActiveDocument
Set AcadDocEM = AcadDoc .ModelSpace
Set AcadDocEP = AcadDoc .PaperSpace
End Sub
Práctica 10 Pág: 2
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Si se desea trabajar con bloque, además de las anteriores, hay que usar las siguientes instrucciones:
En las declaraciones
Dim AcadDocBlocks As Object
Dim Bloque1 as Object
Dim PtoIns(1 to 3) As Double
En la inicialización
Set AcadDocBlocks = AcadDoc .Blocks
PtoIns(1)=50
PtoIns(2)=50
PtoIns(3)=0
Set Bloque1 = AcadDocBlocks.Add(PtoIns,”BloqueA”)
End Sub
Todos los documentos (dibujos) de AutoCAD disponen de la colección Espacio Papel, Espacio
Modelo y también de la colección Blocks que contiene todas las definiciones de bloques del dibujo.
En la variable AcadBlocks se almacena la referencia a esta colección de bloques con la propiedad
Blocks del objeto Document. En la variable Bloque1 se almacena un bloque que se va a crear en
la colección Blocks mediante el método Add de esta misma colección. El nuevo bloque aparecerá
definido, de momento, sin ninguna entidad, con el nombre de BloqueA en el dibujo de AutoCAD. Su
punto de inserción será el 50,50,0. Si se quieren añadir entidades a ese bloque, los métodos son los
mismos que para el Espacio Papel y Espacio Modelo y que se describen más adelante.
En los tres casos comentados, para cada una de las tres colecciones, se puede sustituir la definición
de AcadDoc por el elemento ThisDrawing que esta predefinido en VBA y que representa al mismo
objeto. Por tanto las sentencias
Set AcadDoc = GetObject (, “AutoCAD.Application”).ActiveDocument
Set AcadDocEM = AcadDoc .ModelSpace
Set AcadDocEP = AcadDoc .PaperSpace
Set AcadDocBlocks = AcadDoc .Blocks
2. CREACION DE ENTIDADES
Vamos a revisar unas pocas entidades gráficas y algunos de sus métodos y propiedades. También se
presentara el método Add que es propio del Espacio Papel, del Espacio Modelo y bloques y que
sirve para crear entidades desde VBA. En el apéndice de VBA y en la ayuda de AutoCAD podéis
encontrar toda la información necesaria sobre todos los objetos, propiedades y métodos existentes.
2.1 LÍNEA
El objeto gráfico al que se aplica este método debe representar las colecciones de Espacio Modelo,
espacio Papel o un bloque, todos dentro del dibujo actual. Se deben suministrar dos puntos, o sea,
dos arrays de tres elementos cada uno de tipo Double . Para poder trabajar después con la línea
resultante lo lógico es almacenarla en una variable de tipo Objeto.
Option Explicit
Dim AcadDoc as Object
Dim AcadDocEM As Object
Dim ObjLinea As Object
Dim PtoIn (1 to 3) As Double
Dim PtoFin (1 to 3) As Double
Private Sub Dibujar_Click()
Práctica 10 Pág: 3
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Métodos:
Copy: Copia la entidad a la que se aplica el método en la misma posición en que se encuentra la
entidad original. Su sintaxis es:
Call ObjGrafico.Erase
Move: Desplaza la entidad desde un punto Pt1 hasta un punto Pto2. Su sintaxis es:
Call ObjGrafico.Erase
Propiedades:
Color: Obtiene y asigna el color de la entidad. El color se representa por un entero entra 0 y 255 y se
pueden emplear constantes predefinidas como AcByBlock, AcByLayer, AcCyan, AcRed,
AcBlue, etc.
EndPoint: Obtiene el punto final de un objeto Line, Arc o Ellipse. En el caso de los arcos y
elipses es de solo lectura, pero en el caso de las líneas puede modificarse. La variable de punto es de
tipo Variant
2.2 CÍRCULO
Crea un circulo en una colección de objetos (Espacio Modelo, Espacio Papel o como parte de un
bloque). El centro es un array de tres elementos de tipo Double y el radio es de tipo Double.
Los métodos y propiedades de la entidad Line son también aplicables a la entidad circle.
Propiedades:
Area: Obtiene el área incluida en la entidad (arco, círculo, elipse, polilínea, región o spline). Es de tipo
Double . Su sintaxis es:
ValorArea = ObjGrafico.Area
Práctica 10 Pág: 4
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Center: Obtiene y asigna el centro de la entidad. Es de tipo Variant y almacena un array de tres
elementos de tipo Double . Su sintaxis es:
Radius: Obtiene y asigna el radio de un círculo o de un arco. Es de tipo Double . Su sintaxis es:
2.3 ARCO
Crea un arco de circunferencia. Como en los demás casos este método se utiliza desde una
colección de Espacio Modelo, Espacio Papel o como parte de un bloque. El arco se dibuja en el
sentido contrario a las agujas del reloj. Los ángulos se expresan en radianes y se almacenan en las
propiedades StartAngle y EndAngle.
2.4 PUNTO
Crea una entidad de tipo punto en el Espacio Modelo, Espacio Papel o como parte de un bloque. Los
métodos y propiedades vistos para las entidades anteriores se aplican también a esta. Tiene algunas
propiedades que aun no se ha presentado como
Coordinates: Obtiene y asigna una matriz con las coordenadas de cada uno de los vértices de la
entidad. En el caso del punto solo hay un vértice. La variable se declara con la sentencia Dim
Vértices (1 to n*3) As Double, donde n es el número de vértices. . Los elementos del array
de puntos son de tipo Double . Su sintaxis es:
2.5 POLILÍNEA
Crea una entidad de tipo polilínea en el Espacio Modelo, Espacio Papel o como parte de un bloque. A
partir de la versión 14 se introduce una nueva entidad LightweightPolyline que ahorra memoria y
espacio en disco. Para crear una polilínea que contenga arcos primero se crea una polilínea con
segmentos rectos y la continuación, con el método SetBugle se curvan los segmentos deseados. Los
métodos y propiedades vistos para las entidades anteriores se aplican también a esta. Tiene algunos
métodos y propiedades que aun no se ha presentado como.
Métodos:
ObjGrafico.AppendVertex (Punto)
Explode: Descompone una entidad compuesta en entidades simples. El resultado es un array de
objetos que se almacena como una variable de tipo Variant. Su sintaxis es:
MatrizObjetos= ObjGrafico.Explode
Práctica 10 Pág: 5
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Coordinates: Obtiene y asigna una matriz con las coordenadas de cada uno de los vértices de la
entidad. En el caso del punto solo hay un vértice. LA variable se declara con la sentencia Dim
Vértices (1 to n*3) As Double , donde n es el número de vértices. . Los elementos del array de
puntos son de tipo Double . Su sintaxis es:
Crea una entidad de tipo polilínea optimizada en el Espacio Modelo, Espacio Papel o como parte de
un bloque. Sustituyen a las polilíneas ya que ahorran memoria y disco. Para crear una polilínea que
contenga arcos primero se crea una polilínea con segmentos rectos y la continuación, con el método
SetBugle se curvan los segmentos deseados. Solo tiene un método especifico:
Métodos:
ObjPolOptimizada.AddVertex (Indice,Punto)
Hay muchas entidades, propiedades y métodos que no se han revisado. Se puede encontrar la lista
completa en el apéndice de VBA y en la ayuda de AutoCAD.
EJERCICIO 1
Para practicar el manejo de entidades realizar un ejercicio consistente en una macro que permita
especificar los parámetros de una puerta y genere las entidades correspondientes en el dibujo de
AutoCAD. El aspecto del formulario a desarrollar es el siguiente:
Práctica 10 Pág: 6
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Crea el formulario de la figura 2 con todos los controles que aparecen en la misma. Deja el nombre
por defecto UserForm1 para dicho formulario. El nombre del resto de los controles debe coincidir con
el que se utiliza en las sentencias que aparecen a continuación. Copia y pega dichas sentencias:
(General) (Declaraciones)
Option Explicit
Dim PtoIns As Variant
Dim PtoOp As Variant
En esta sección se definen todas las variables que intervienen en el proceso. Las Variables de tipo
Object se emplean para almacenar las entidades que van a ser creadas. Algunas de las variables
se crean solo por razones técnicas. Por ejemplo, Matriz1 y Matriz2, arrays de tipo Double , tiene a
menudo el mismo contenido que PtoIns y PtoOp, de tipo Variant. La razón es que cuando el
usuario lee esos puntos deben ser almacenados en variables de tipo Variant; sin embargo, para
poder utilizar dichos puntos, por ejemplo en una orden AddArc, deben ser de tipo Double .
Lo primero que se debe hacer es inicializar la aplicación. En este caso rellenaremos los valores de las
listas desplegables que se utilizan para establecer los parámetros de la puerta:
AnchoHoja.AddItem "0.625", 0
AnchoHoja.AddItem "0.725", 1
AnchoHoja.AddItem "0.825", 2
AnchoHoja.AddItem "0.925", 3
Angulo.AddItem "-135", 0
Angulo.AddItem "-090", 1
Angulo.AddItem "-045", 2
Angulo.AddItem "0", 3
Angulo.AddItem "045", 4
Angulo.AddItem "090", 5
Angulo.AddItem "135", 6
GrosorHoja.AddItem "0.035", 0
Práctica 10 Pág: 7
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
GrosorHoja.AddItem "0.040", 1
Ancho.AddItem "0.05", 0
Ancho.AddItem "0.07", 1
Fondo.AddItem "0.05", 0
Fondo.AddItem "0.07", 1
End Sub
Después habrá que determinar en que punto se insertará la puerta. Para ello utilizaremos el método
GetPoint del objeto Utility. El punto se almacena en una variable de tipo Variant PtoIns.
Cuando se pulse en el botón de Aceptar se dibujara la puerta según los parámetros que se hayan
establecido. En principio la puerta se dibuja horizontal y luego la rutina posicionar la orienta
adecuadamente. Una vez dibujada la puerta, la aplicación no termina por si el usuario quiere seguir
insertando mas puertas.
CalcularPtoGiro
DibujarMarcos
DibujarHoja
DibujarArco
Posicionar
End Sub
La rutina CalcularPtoGiro calcula cual es el punto de giro de la puerta, es decir, la posición exacta de
las bisagras. Para ello se examinan las coordenadas x de los dos puntos y se determina si el PtoIns
está más a la derecha que PtoOp o al revés y se guarda el resultado en la variable Sentido. A
continuación se establece el valor del punto de giro, según lo que el usuario haya establecido en
pantalla. Si el usuario ha determinado un ángulo negativo, el punto de giro se traslada al otro lado de
la puerta, variando su coordenada y
Práctica 10 Pág: 8
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
End If
If SobreLadoIns Then
PtoGiro(0) = PtoIns(0) + (-Val(Ancho) * Sentido)
PtoGiro(1) = PtoIns(1)
PtoGiro(2) = PtoIns(2)
Else
PtoGiro(0) = PtoIns(0) + (-Val(Ancho) - Val(AnchoHoja)) * Sentido
PtoGiro(1) = PtoIns(1)
PtoGiro(2) = PtoIns(2)
End If
If Val(Angulo) < 0 Then
PtoGiro(1) = PtoGiro(1) - Val(Fondo)
End If
End Sub
La rutina DibujarMarcos calcula cada uno de los cuatro vértices de los dos rectángulos que
representan el marco, teniendo en cuenta el valor de Sentido calculado anteriormente. Una vez
guardados los puntos 2D en una matriz de tipo Double para cada caso, se dibujan las polilíneas.
PtosMarcoIns(0) = PtoIns(0) :
PtosMarcoIns(1) = PtoIns(1)
PtosMarcoIns(6) = PtoIns(0)
PtosMarcoIns(7) = PtoIns(1) - Val(Fondo)
PtosMarcoIns(8) = PtoIns(0)
PtosMarcoIns(9) = PtoIns(1)
PtosMarcoOtro(0) = PtoIns(0)+(-Val(AnchoHoja)-Val(Ancho))*Sentido
PtosMarcoOtro(1) = PtoIns(1)
PtosMarcoOtro(2) =PtoIns(0)+(-Val(AnchoHoja)-2*Val(Ancho))*Sentido
PtosMarcoOtro(3) = PtoIns(1)
PtosMarcoOtro(4) = PtoIns(0)+(-Val(AnchoHoja)-2*Val(Ancho))*Sentido
PtosMarcoOtro(5) = PtoIns(1) - Val(Fondo)
PtosMarcoOtro(6) = PtoIns(0)+(-Val(AnchoHoja)-Val(Ancho))*Sentido
PtosMarcoOtro(7) = PtoIns(1) - Val(Fondo)
PtosMarcoOtro(8) = PtoIns(0)+(-Val(AnchoHoja)-Val(Ancho))*Sentido
PtosMarcoOtro(9) = PtoIns(1)
Set MarcoOtro=ThisDrawing.ModelSpace.AddLightWeightPolyline(PtosMarcoOtro)
End Sub
Práctica 10 Pág: 9
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
por el usuario. A continuación se examina la variable Sentido para saber si PtoIns está a la derecha o
la izquierda de PtoOp. También se tiene que tener en cuenta si el usuario ha elegido el punto de giro
sobre el de inserción o sobre el lado opuesto. El resultado se guarda en Sentido2. Según su valor se
calculan los cuatro puntos 2D que componen la entidad. Una vez dibujada la hoja se calcula el ángulo
que se debe girar y se almacena en AnguloAux. Con este ángulo y el punto de giro como centro se
realiza la rotación.
PtosHoja(2) = PtoGiro(0)
PtosHoja(3) = PtoGiro(1) + Val(AnchoHoja) * giro
PtosHoja(8) = PtoGiro(0)
PtosHoja(9) = PtoGiro(1)
Set Hoja=ThisDrawing.ModelSpace.AddLightWeightPolyline(PtosHoja)
Matriz1(0) = PtoGiro(0)
Matriz1(1) = PtoGiro(1)
Matriz1(2) = PtoGiro(2)
End Sub
La rutina Dibujar arco dibuja el arco de la puerta según uno de los cuatro casos posibles, en función
de si PtoIns esta a la derecha o a la izquierda de PtoOp y de si punto de giro esta en el lado del punto
de inserción o en el opuesto.
Práctica 10 Pág: 10
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
End If
Else
If SobreLadoIns Xor Sentido = 1 Then
Set Arco = ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),AnguloAux,2*Pi)
Else
Set Arco = ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),Pi,AnguloAux)
End If
End If
End Sub
La rutina Posicionar se encarga de girar la puerta, una vez dibujada, para colocarla en la dirección
especificada por el usuario. La puerta ha sido dibujada horizontalmente apoyada sobre PtoIns. Este
ha de ser el punto de giro en la rotación. La variable AnguloInclinacion almacena el valor del ángulo
que forma la línea que une PtoIns y OtoOp con la parte positiva del eje X
Private Sub Posicionar()
If Sentido = 1 Then
Matriz1(0) = PtoIns(0)
Matriz1(1) = PtoIns(1)
Matriz1(2) = PtoIns(2)
Matriz2(0) = PtoOp(0)
Matriz2(1) = PtoOp(1)
Matriz2(2) = PtoOp(2)
Else
Matriz1(0) = PtoOp(0)
Matriz1(1) = PtoOp(1)
Matriz1(2) = PtoOp(2)
Matriz2(0) = PtoIns(0)
Matriz2(1) = PtoIns(1)
Matriz2(2) = PtoIns(2)
End If
AnguloInclinacion = ThisDrawing.Utility.AngleFromXAxis(Matriz2,
Matriz1)
Matriz1(0) = PtoIns(0)
Matriz1(1) = PtoIns(1)
Matriz1(2) = PtoIns(2)
Call MarcoIns.Rotate(Matriz1, AnguloInclinacion)
Call MarcoOtro.Rotate(Matriz1, AnguloInclinacion)
Call Hoja.Rotate(Matriz1, AnguloInclinacion)
Call Arco.Rotate(Matriz1, AnguloInclinacion)
End Sub
Finalmente, para enlazar el formulario desarrollado con el documento de AutoCAD será necesario
incluir las siguientes sentencias en el objeto ThisDrawing:
Sub Puerta()
UserForm1.Show
End Sub
EJERCICIO 2
B- Agregar las sentencias necesarias para realizar el control de errores para controlar que se
introduzcan todos los valores y que estos sean correctos.
Práctica 10 Pág: 11