SlideShare una empresa de Scribd logo
1 de 11
Descargar para leer sin conexión
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 1
CREACION DE ENTIDADES DE DIBUJO DE AUTOCAD CON VBA.
El VBA de AutoCAD dispone de una estructura que define las entidades individuales de dibujo de
Autocad (línea, circulo, cara, etc.) que se refleja en el Modelo de Objetos de la figura 1.
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.
Figura 1: Modelo de datos y estructura de objetos de VBA
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 2
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.
1. USO DEL MODELO DE OBJETO EN UNA APLICACION
Hay una serie de declaraciones que tienen que hacerse en toda aplicación que pretenda trabajar con
alguno de los elementos de AutoCAD.Application. Por ejemplo, si se quiere trabajar con un
circulo, este será un elemento del Espacio Papel o Modelo, que a su vez forma parte del objeto
Document. Por esta razón se debe declarar ese documento concreto con el que se va a trabajar. A
su vez Document es un objeto que pertenece a AutoCAD.Application; por tanto, también este
objeto debe ser declarado.
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
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 3
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
Podrían reescribirse como
Set AcadDoc = ThisDrawing.ActiveDocument
Set AcadDocEM = ThisDrawing.ModelSpace
Set AcadDocEP = ThisDrawing.PaperSpace
Set AcadDocBlocks = ThisDrawing.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
Set ObjGrafico = ObjColeccion.AddLine(PtoInicial, PtoFinal)
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()
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 4
Set AcadDoc = ThisDrawing.ActiveDocument
Set AcadDocEM = ThisDrawing.ModelSpace
PtoIn(1)=50 : PtoIn(2)=50 :PtoIn(3)=0
PtoFin (1)=100 : PtoFin (2)=100 : PtoFin (3)=0
Set ObjLinea = AcadDocEM .AddLine(PtoIn, PtoFin)
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:
Set NuevoObj = ObjGrafico.Copy
Erase: Elimina la entidad a la que se aplica el método. Su sintaxis es:
Call ObjGrafico.Erase
GetBoundingBox: Calcula las coordenadas de la esquina inferior izquierda y superior derecha de la
caja de inclusión (mínimo rectángulo que la encierra por completo) del objeto gráfico. Su sintaxis es:
Set NuevoObj = ObjGrafico. GetBoundingBox
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.
ObjGrafico.Color = NumColor ß Para asignar un color
NumColor= ObjGrafico.Color ß Para obtener un color
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
ObjLinea.EndPoint = PtoFinal ß Para asignar un punto final solo en
líneas
PtoFinal = ObjGrafico.EndPoint (Para obtener el punto final)
2.2 CÍRCULO
Set ObjCirculo = ObjColeccion.AddCircle (Centro, Radio)
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
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 5
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:
ObjGrafico.Center = PtoCentro ß Para asignar un centro
PtoCentro= ObjGrafico.Center ß Para obtener un centro
Radius: Obtiene y asigna el radio de un círculo o de un arco. Es de tipo Double . Su sintaxis es:
ObjGrafico.Radius = Radio ß Para asignar un radio
Radio = ObjGrafico.Radius ß Para obtener un radio
2.3 ARCO
Set ObjArco = ObjColeccion.AddArc (Centro, Radio, AngInic, AngFinal)
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
Set ObjPunto = ObjColeccion.AddPoint (Pto)
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:
ObjGrafico.Coordinates = MatrizVertices ß Para asignar coords.
MatrizVertices = ObjGrafico.Coordinates ß Para obtener coords
2.5 POLILÍNEA
Set ObjPol = ObjColeccion.AddPolyline (MatrizVertices)
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:
AppendVertex: Añade vértices a polilíneas 2D y 3D y a mallas poligonales. Su sintaxis es:
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
GetBulge: Obtiene el valor de curvatura de un vértice de la polilínea. Su sintaxis es:
Curvatura = ObjGrafico.GetBulge (Indice)
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 6
SetBulge: Asigna el valor de curvatura de un vértice de la polilínea. Su sintaxis es:
ObjGrafico.SetBulge (Indice, Curvatura)
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:
ObjGrafico.Coordinates = MatrizVertices ß Para asignar coords.
MatrizVertices = ObjGrafico.Coordinates ß Para obtener coords
2.6 POLIÍNEA OPTIMIZADA
Set ObjPol = ObjColeccion.AddWeightPolyline (MatrizVertices)
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:
AddVertex: Añade vértices a polilíneas optimizadas. Su sintaxis es:
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:
Figura 2: Formulario de la aplicación ‘Puerta Parametrizada
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 7
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
Dim MarcoIns As Object
Dim MarcoOtro As Object
Dim Hoja As Object
Dim Arco As Object
Dim MarcoInsS As Object
Dim MarcoOtroS As Object
Dim HojaS As Object
Dim ArcoS As Object
Dim PtoGiro(0 To 2) As Double
Dim PtosMarcoIns(0 To 9) As Double
Dim PtosMarcoOtro(0 To 9) As Double
Dim PtosHoja(0 To 9) As Double
Dim Matriz1(0 To 2) As Double
Dim Matriz2(0 To 2) As Double
Dim giro As Integer
Dim Sentido As Integer
Dim Sentido2 As Integer
Dim AnguloInclinacion As Double
Dim AnguloAux As Double
Const Pi As Double = 3.14159265359
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:
Private Sub UserForm_Initialize()
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
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 8
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.
Private Sub PuntoIns_Click()
UserForm1.hide oculta la ventana para que podamos marcar el punto
PtoIns = ThisDrawing.Utility.GetPoint(, "Indicar el punto de
inserción de la puerta:")
UserForm1.Show ‘vuelve a mostrar el formulario
End Sub
Para establecer la dirección de la puerta será necesario especificar un segundo punto:
Private Sub OtroPunto_Click()
UserForm1.hide ‘oculta la ventana para que podamos marcar el punto
PtoOp = ThisDrawing.Utility.GetPoint(PtoIns, "Indicar un segundo
punto que indique la dirección de la puerta:")
UserForm1.Show ‘vuelve a mostrar el formulario
End Sub
La aplicación terminará cuando se haga click sobre el botón Cancelar:
Private Sub Cancelar_Click()
End
End Sub
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.
Private Sub Aceptar_Click()
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
Private Sub CalcularPtoGiro()
If PtoOp(0) < PtoIns(0) Then
Sentido = 1
Else
Sentido = -1
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 9
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.
Private Sub DibujarMarcos()
PtosMarcoIns(0) = PtoIns(0) :
PtosMarcoIns(1) = PtoIns(1)
PtosMarcoIns(2) = PtoIns(0) - Val(Ancho) * Sentido
PtosMarcoIns(3) = PtoIns(1)
PtosMarcoIns(4) = PtoIns(0) - Val(Ancho) * Sentido
PtosMarcoIns(5) = PtoIns(1) - Val(Fondo)
PtosMarcoIns(6) = PtoIns(0)
PtosMarcoIns(7) = PtoIns(1) - Val(Fondo)
PtosMarcoIns(8) = PtoIns(0)
PtosMarcoIns(9) = PtoIns(1)
Set MarcoIns =ThisDrawing.ModelSpace.AddLightWeightPolyline(PtosMarcoIns)
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
El procedimiento DibujarHoja dibuja un rectángulo que representa la hoja de la puerta. Se dibuja
inicialmente en sentido vertical positivo o negativo, en función del ángulo positivo o negativo indicado
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 10
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.
Private Sub DibujarHoja()
If Val(Angulo) > 0 Then
giro = 1
Else
giro = -1
End If
If Not (SobreLadoIns Xor Sentido = 1) Then
Sentido2 = 1
Else
Sentido2 = -1
End If
PtosHoja(0) = PtoGiro(0)
PtosHoja(1) = PtoGiro(1)
PtosHoja(2) = PtoGiro(0)
PtosHoja(3) = PtoGiro(1) + Val(AnchoHoja) * giro
PtosHoja(4) = PtoGiro(0) - Val(GrosorHoja) * Sentido2
PtosHoja(5) = PtoGiro(1) + Val(AnchoHoja) * giro
PtosHoja(6) = PtoGiro(0) - Val(GrosorHoja) * Sentido2
PtosHoja(7) = PtoGiro(1)
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)
AnguloAux = Val(Angulo) * 2 * Pi / 360
If Not (SobreLadoIns Xor Sentido = 1) Then
AnguloAux = Pi - AnguloAux
End If
Call Hoja.Rotate(Matriz1, AnguloAux + (-Pi / 2 * giro))
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.
Private Sub DibujarArco()
If Val(Angulo) > 0 Then
If SobreLadoIns Xor Sentido = 1 Then
Set Arco =ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),0,AnguloAux)
Else
Set Arco =ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),AnguloAux,Pi)
Universitat Jaume I Diseño y Fabricación Asistido por Ordenador
Práctica 10 Pág: 11
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
A- Ampliar la macro parta que permita la inserción de puertas de doble hoja.
B- Agregar las sentencias necesarias para realizar el control de errores para controlar que se
introduzcan todos los valores y que estos sean correctos.

Más contenido relacionado

La actualidad más candente

11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()Clara Patricia Avella Ibañez
 
Análisis de imágenes: reconocimiento de letras
Análisis de imágenes: reconocimiento de letrasAnálisis de imágenes: reconocimiento de letras
Análisis de imágenes: reconocimiento de letrasSandra Lucia
 
Clase 10_ programacion
Clase 10_ programacionClase 10_ programacion
Clase 10_ programaciondiego MC
 
Métodos constructores, método toString()
Métodos constructores, método toString()Métodos constructores, método toString()
Métodos constructores, método toString()Pablo Macon
 
Inføяmǻticǻ ii objetivo 1.2.5
Inføяmǻticǻ ii objetivo 1.2.5Inføяmǻticǻ ii objetivo 1.2.5
Inføяmǻticǻ ii objetivo 1.2.5Yaz Cahuantzi
 
9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetosClara Patricia Avella Ibañez
 
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones coleccionesluis freddy
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
Exposicion Capitulo 10,11,12
Exposicion Capitulo 10,11,12Exposicion Capitulo 10,11,12
Exposicion Capitulo 10,11,12jack_corvil
 

La actualidad más candente (15)

11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()11 Curso de POO en java - métodos constructores y toString()
11 Curso de POO en java - métodos constructores y toString()
 
Lab2-POO
Lab2-POOLab2-POO
Lab2-POO
 
Video 1 metodos y arreglos
Video 1 metodos y arreglosVideo 1 metodos y arreglos
Video 1 metodos y arreglos
 
Modulo Algorítmica III - Julio Vasquez
Modulo Algorítmica III - Julio VasquezModulo Algorítmica III - Julio Vasquez
Modulo Algorítmica III - Julio Vasquez
 
Análisis de imágenes: reconocimiento de letras
Análisis de imágenes: reconocimiento de letrasAnálisis de imágenes: reconocimiento de letras
Análisis de imágenes: reconocimiento de letras
 
Arreglos
ArreglosArreglos
Arreglos
 
Clase 10_ programacion
Clase 10_ programacionClase 10_ programacion
Clase 10_ programacion
 
Métodos constructores, método toString()
Métodos constructores, método toString()Métodos constructores, método toString()
Métodos constructores, método toString()
 
Inføяmǻticǻ ii objetivo 1.2.5
Inføяmǻticǻ ii objetivo 1.2.5Inføяmǻticǻ ii objetivo 1.2.5
Inføяmǻticǻ ii objetivo 1.2.5
 
9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos
 
Dd lxaas
Dd lxaasDd lxaas
Dd lxaas
 
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
Diseño oo
Diseño ooDiseño oo
Diseño oo
 
Exposicion Capitulo 10,11,12
Exposicion Capitulo 10,11,12Exposicion Capitulo 10,11,12
Exposicion Capitulo 10,11,12
 

Similar a Programacion cad vba

Similar a Programacion cad vba (20)

DATA AUTOMATION.pdf
DATA AUTOMATION.pdfDATA AUTOMATION.pdf
DATA AUTOMATION.pdf
 
Macros Excel
Macros ExcelMacros Excel
Macros Excel
 
Excel con macros
Excel con macrosExcel con macros
Excel con macros
 
Manual de macros2 pre
Manual de macros2 preManual de macros2 pre
Manual de macros2 pre
 
Excel macros
Excel macrosExcel macros
Excel macros
 
Excel macros
Excel macrosExcel macros
Excel macros
 
Gran tutorial-de-macros
Gran tutorial-de-macrosGran tutorial-de-macros
Gran tutorial-de-macros
 
1. manual macrosexcel
1. manual macrosexcel1. manual macrosexcel
1. manual macrosexcel
 
Macros en excel [106 paginas en español]
Macros en excel [106 paginas   en español]Macros en excel [106 paginas   en español]
Macros en excel [106 paginas en español]
 
Macros en excel
Macros en excelMacros en excel
Macros en excel
 
Separata java script
Separata java scriptSeparata java script
Separata java script
 
clases y objetos
clases y objetosclases y objetos
clases y objetos
 
Gráficos en MATLAB
Gráficos en MATLABGráficos en MATLAB
Gráficos en MATLAB
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetos
 
Unidad 10 Mad Diagrama De Clases
Unidad 10 Mad Diagrama De ClasesUnidad 10 Mad Diagrama De Clases
Unidad 10 Mad Diagrama De Clases
 
Java 2 d
Java 2 dJava 2 d
Java 2 d
 
Curso taller vba macros
Curso taller vba macrosCurso taller vba macros
Curso taller vba macros
 
Programacion VBA para AutoCad 2007 ejemplos
Programacion VBA para AutoCad 2007 ejemplosProgramacion VBA para AutoCad 2007 ejemplos
Programacion VBA para AutoCad 2007 ejemplos
 
parte 4 manual 2022.pdf
parte 4 manual 2022.pdfparte 4 manual 2022.pdf
parte 4 manual 2022.pdf
 
Capas en autocad
Capas en autocadCapas en autocad
Capas en autocad
 

Último

Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasSegundo Silva Maguiña
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfErikNivor
 
Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1victorrodrigues972054
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidasNelsonQuispeQuispitu
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Francisco Javier Mora Serrano
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)dianamateo1513
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidas
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidasSOLIDOS DE REVOLUCION, aplicaciones de integrales definidas
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidasLeonardoMendozaDvila
 
Descubrimiento de la penicilina en la segunda guerra mundial
Descubrimiento de la penicilina en la segunda guerra mundialDescubrimiento de la penicilina en la segunda guerra mundial
Descubrimiento de la penicilina en la segunda guerra mundialyajhairatapia
 
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...humberto espejo
 
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinación
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinaciónEstacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinación
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinaciónAlexisHernandez885688
 
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...Arquitecto Alejandro Gomez cornejo muñoz
 
Físicas 1: Ecuaciones Dimensionales y Vectores
Físicas 1: Ecuaciones Dimensionales y VectoresFísicas 1: Ecuaciones Dimensionales y Vectores
Físicas 1: Ecuaciones Dimensionales y VectoresSegundo Silva Maguiña
 
Fisiología del azufre en plantas S.S.pdf
Fisiología del azufre en plantas S.S.pdfFisiología del azufre en plantas S.S.pdf
Fisiología del azufre en plantas S.S.pdfJessLeonelVargasJimn
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosJeanCarlosLorenzo1
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEANDECE
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCANDECE
 
Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.ALEJANDROLEONGALICIA
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)ssuser6958b11
 
Diagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxDiagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxHarryArmandoLazaroBa
 

Último (20)

Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la Ingenierías
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
 
Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1
 
trabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidastrabajos en altura 2024, sistemas de contencion anticaidas
trabajos en altura 2024, sistemas de contencion anticaidas
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
 
Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)Sistema de Gestión de Freelancers (Base de Datos)
Sistema de Gestión de Freelancers (Base de Datos)
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidas
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidasSOLIDOS DE REVOLUCION, aplicaciones de integrales definidas
SOLIDOS DE REVOLUCION, aplicaciones de integrales definidas
 
Descubrimiento de la penicilina en la segunda guerra mundial
Descubrimiento de la penicilina en la segunda guerra mundialDescubrimiento de la penicilina en la segunda guerra mundial
Descubrimiento de la penicilina en la segunda guerra mundial
 
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...
594305198-OPCIONES-TARIFARIAS-Y-CONDICIONES-DE-APLICACION-DE-TARIFAS-A-USUARI...
 
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinación
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinaciónEstacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinación
Estacionamientos, Existen 3 tipos, y tienen diferentes ángulos de inclinación
 
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
MEC. FLUIDOS - Análisis Diferencial del Movimiento de un Fluido -GRUPO5 sergi...
 
Físicas 1: Ecuaciones Dimensionales y Vectores
Físicas 1: Ecuaciones Dimensionales y VectoresFísicas 1: Ecuaciones Dimensionales y Vectores
Físicas 1: Ecuaciones Dimensionales y Vectores
 
Fisiología del azufre en plantas S.S.pdf
Fisiología del azufre en plantas S.S.pdfFisiología del azufre en plantas S.S.pdf
Fisiología del azufre en plantas S.S.pdf
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
 
Fijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSEFijaciones de balcones prefabricados de hormigón - RECENSE
Fijaciones de balcones prefabricados de hormigón - RECENSE
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRC
 
Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
 
Diagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptxDiagrama de flujo metalurgia del cobre..pptx
Diagrama de flujo metalurgia del cobre..pptx
 

Programacion cad vba

  • 1. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 1 CREACION DE ENTIDADES DE DIBUJO DE AUTOCAD CON VBA. El VBA de AutoCAD dispone de una estructura que define las entidades individuales de dibujo de Autocad (línea, circulo, cara, etc.) que se refleja en el Modelo de Objetos de la figura 1. 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. Figura 1: Modelo de datos y estructura de objetos de VBA
  • 2. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 2 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. 1. USO DEL MODELO DE OBJETO EN UNA APLICACION Hay una serie de declaraciones que tienen que hacerse en toda aplicación que pretenda trabajar con alguno de los elementos de AutoCAD.Application. Por ejemplo, si se quiere trabajar con un circulo, este será un elemento del Espacio Papel o Modelo, que a su vez forma parte del objeto Document. Por esta razón se debe declarar ese documento concreto con el que se va a trabajar. A su vez Document es un objeto que pertenece a AutoCAD.Application; por tanto, también este objeto debe ser declarado. 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
  • 3. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 3 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 Podrían reescribirse como Set AcadDoc = ThisDrawing.ActiveDocument Set AcadDocEM = ThisDrawing.ModelSpace Set AcadDocEP = ThisDrawing.PaperSpace Set AcadDocBlocks = ThisDrawing.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 Set ObjGrafico = ObjColeccion.AddLine(PtoInicial, PtoFinal) 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()
  • 4. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 4 Set AcadDoc = ThisDrawing.ActiveDocument Set AcadDocEM = ThisDrawing.ModelSpace PtoIn(1)=50 : PtoIn(2)=50 :PtoIn(3)=0 PtoFin (1)=100 : PtoFin (2)=100 : PtoFin (3)=0 Set ObjLinea = AcadDocEM .AddLine(PtoIn, PtoFin) 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: Set NuevoObj = ObjGrafico.Copy Erase: Elimina la entidad a la que se aplica el método. Su sintaxis es: Call ObjGrafico.Erase GetBoundingBox: Calcula las coordenadas de la esquina inferior izquierda y superior derecha de la caja de inclusión (mínimo rectángulo que la encierra por completo) del objeto gráfico. Su sintaxis es: Set NuevoObj = ObjGrafico. GetBoundingBox 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. ObjGrafico.Color = NumColor ß Para asignar un color NumColor= ObjGrafico.Color ß Para obtener un color 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 ObjLinea.EndPoint = PtoFinal ß Para asignar un punto final solo en líneas PtoFinal = ObjGrafico.EndPoint (Para obtener el punto final) 2.2 CÍRCULO Set ObjCirculo = ObjColeccion.AddCircle (Centro, Radio) 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
  • 5. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 5 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: ObjGrafico.Center = PtoCentro ß Para asignar un centro PtoCentro= ObjGrafico.Center ß Para obtener un centro Radius: Obtiene y asigna el radio de un círculo o de un arco. Es de tipo Double . Su sintaxis es: ObjGrafico.Radius = Radio ß Para asignar un radio Radio = ObjGrafico.Radius ß Para obtener un radio 2.3 ARCO Set ObjArco = ObjColeccion.AddArc (Centro, Radio, AngInic, AngFinal) 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 Set ObjPunto = ObjColeccion.AddPoint (Pto) 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: ObjGrafico.Coordinates = MatrizVertices ß Para asignar coords. MatrizVertices = ObjGrafico.Coordinates ß Para obtener coords 2.5 POLILÍNEA Set ObjPol = ObjColeccion.AddPolyline (MatrizVertices) 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: AppendVertex: Añade vértices a polilíneas 2D y 3D y a mallas poligonales. Su sintaxis es: 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 GetBulge: Obtiene el valor de curvatura de un vértice de la polilínea. Su sintaxis es: Curvatura = ObjGrafico.GetBulge (Indice)
  • 6. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 6 SetBulge: Asigna el valor de curvatura de un vértice de la polilínea. Su sintaxis es: ObjGrafico.SetBulge (Indice, Curvatura) 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: ObjGrafico.Coordinates = MatrizVertices ß Para asignar coords. MatrizVertices = ObjGrafico.Coordinates ß Para obtener coords 2.6 POLIÍNEA OPTIMIZADA Set ObjPol = ObjColeccion.AddWeightPolyline (MatrizVertices) 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: AddVertex: Añade vértices a polilíneas optimizadas. Su sintaxis es: 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: Figura 2: Formulario de la aplicación ‘Puerta Parametrizada
  • 7. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 7 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 Dim MarcoIns As Object Dim MarcoOtro As Object Dim Hoja As Object Dim Arco As Object Dim MarcoInsS As Object Dim MarcoOtroS As Object Dim HojaS As Object Dim ArcoS As Object Dim PtoGiro(0 To 2) As Double Dim PtosMarcoIns(0 To 9) As Double Dim PtosMarcoOtro(0 To 9) As Double Dim PtosHoja(0 To 9) As Double Dim Matriz1(0 To 2) As Double Dim Matriz2(0 To 2) As Double Dim giro As Integer Dim Sentido As Integer Dim Sentido2 As Integer Dim AnguloInclinacion As Double Dim AnguloAux As Double Const Pi As Double = 3.14159265359 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: Private Sub UserForm_Initialize() 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
  • 8. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 8 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. Private Sub PuntoIns_Click() UserForm1.hide oculta la ventana para que podamos marcar el punto PtoIns = ThisDrawing.Utility.GetPoint(, "Indicar el punto de inserción de la puerta:") UserForm1.Show ‘vuelve a mostrar el formulario End Sub Para establecer la dirección de la puerta será necesario especificar un segundo punto: Private Sub OtroPunto_Click() UserForm1.hide ‘oculta la ventana para que podamos marcar el punto PtoOp = ThisDrawing.Utility.GetPoint(PtoIns, "Indicar un segundo punto que indique la dirección de la puerta:") UserForm1.Show ‘vuelve a mostrar el formulario End Sub La aplicación terminará cuando se haga click sobre el botón Cancelar: Private Sub Cancelar_Click() End End Sub 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. Private Sub Aceptar_Click() 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 Private Sub CalcularPtoGiro() If PtoOp(0) < PtoIns(0) Then Sentido = 1 Else Sentido = -1
  • 9. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 9 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. Private Sub DibujarMarcos() PtosMarcoIns(0) = PtoIns(0) : PtosMarcoIns(1) = PtoIns(1) PtosMarcoIns(2) = PtoIns(0) - Val(Ancho) * Sentido PtosMarcoIns(3) = PtoIns(1) PtosMarcoIns(4) = PtoIns(0) - Val(Ancho) * Sentido PtosMarcoIns(5) = PtoIns(1) - Val(Fondo) PtosMarcoIns(6) = PtoIns(0) PtosMarcoIns(7) = PtoIns(1) - Val(Fondo) PtosMarcoIns(8) = PtoIns(0) PtosMarcoIns(9) = PtoIns(1) Set MarcoIns =ThisDrawing.ModelSpace.AddLightWeightPolyline(PtosMarcoIns) 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 El procedimiento DibujarHoja dibuja un rectángulo que representa la hoja de la puerta. Se dibuja inicialmente en sentido vertical positivo o negativo, en función del ángulo positivo o negativo indicado
  • 10. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 10 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. Private Sub DibujarHoja() If Val(Angulo) > 0 Then giro = 1 Else giro = -1 End If If Not (SobreLadoIns Xor Sentido = 1) Then Sentido2 = 1 Else Sentido2 = -1 End If PtosHoja(0) = PtoGiro(0) PtosHoja(1) = PtoGiro(1) PtosHoja(2) = PtoGiro(0) PtosHoja(3) = PtoGiro(1) + Val(AnchoHoja) * giro PtosHoja(4) = PtoGiro(0) - Val(GrosorHoja) * Sentido2 PtosHoja(5) = PtoGiro(1) + Val(AnchoHoja) * giro PtosHoja(6) = PtoGiro(0) - Val(GrosorHoja) * Sentido2 PtosHoja(7) = PtoGiro(1) 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) AnguloAux = Val(Angulo) * 2 * Pi / 360 If Not (SobreLadoIns Xor Sentido = 1) Then AnguloAux = Pi - AnguloAux End If Call Hoja.Rotate(Matriz1, AnguloAux + (-Pi / 2 * giro)) 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. Private Sub DibujarArco() If Val(Angulo) > 0 Then If SobreLadoIns Xor Sentido = 1 Then Set Arco =ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),0,AnguloAux) Else Set Arco =ThisDrawing.ModelSpace.AddArc(Matriz1,Val(AnchoHoja),AnguloAux,Pi)
  • 11. Universitat Jaume I Diseño y Fabricación Asistido por Ordenador Práctica 10 Pág: 11 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 A- Ampliar la macro parta que permita la inserción de puertas de doble hoja. B- Agregar las sentencias necesarias para realizar el control de errores para controlar que se introduzcan todos los valores y que estos sean correctos.