Universitat Jaume I Diseño y Fabricación Asistido por Ordenador 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 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. 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 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 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() Práctica 10 Pág: 3 Universitat Jaume I Diseño y Fabricación Asistido por Ordenador 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 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: 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) Práctica 10 Pág: 5 Universitat Jaume I Diseño y Fabricación Asistido por Ordenador 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 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 Dim Dim Dim Dim Dim Dim Dim Dim MarcoIns As Object MarcoOtro As Object Hoja As Object Arco As Object MarcoInsS As Object MarcoOtroS As Object HojaS As Object ArcoS As Object Dim Dim Dim Dim Dim Dim PtoGiro(0 To 2) As Double PtosMarcoIns(0 To 9) As Double PtosMarcoOtro(0 To 9) As Double PtosHoja(0 To 9) As Double Matriz1(0 To 2) As Double Matriz2(0 To 2) As Double Dim Dim Dim Dim Dim giro As Integer Sentido As Integer Sentido2 As Integer AnguloInclinacion As Double 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 AnchoHoja.AddItem AnchoHoja.AddItem AnchoHoja.AddItem Angulo.AddItem Angulo.AddItem Angulo.AddItem Angulo.AddItem Angulo.AddItem Angulo.AddItem Angulo.AddItem "0.625", "0.725", "0.825", "0.925", 0 1 2 3 "-135", 0 "-090", 1 "-045", 2 "0", 3 "045", 4 "090", 5 "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 Ancho.AddItem Fondo.AddItem Fondo.AddItem "0.05", "0.07", "0.05", "0.07", 0 1 0 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 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. 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 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. 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) 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 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. Práctica 10 Pág: 11