Vous êtes sur la page 1sur 11

Universitat Jaume I

Diseo y Fabricacin 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 (lnea, 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 lnea, capa, radio (en los crculos), etc., y mtodos como aadir, copiar, mover, escalar, borrar, modificar, etc. Un dibujo de AutoCAD dispone tambin de otros elementos que estn definidos como son el Espacio Papel, el Espacio Modelo y los bloques. Estos objetos son colecciones de objetos grficos que contienen entidades individuales de dibujo. Estas colecciones disponen a su vez de propiedades y mtodos para conocer, por ejemplo, cuantos elementos componen la coleccin o aadir elementos (entidades grficas) a cada coleccin. 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 tambin tiene definidas sus propiedades y mtodos. Entre sus propiedades estn su nombre, su path, o sus limites. Entre los mtodos estn 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

Prctica 10

Pg: 1

Universitat Jaume I

Diseo y Fabricacin Asistido por Ordenador

Un documento de AutoCAD consta tambin de una serie de elementos definidos como colecciones, como la coleccin de capas, de estilos de texto, de SCPs, de vistas, de ventanas, etc. Como en todos los objetos del modelo de la figura 1, cada una de estas colecciones tiene sus propios mtodos 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 aplicacin de AutoCAD, que aparece definida como AutoCAD.Application. para comprender mejor esta estructura se dispone en la ayuda de una representacin grfica de todos ellos. Al hacer click sobre cualquiera de ellos aparece una pantalla que los describe, junto con una lista de todos sus mtodos y otra con sus propiedades. Se puede acceder a dicha lista a travs 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 aplicacin 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 razn 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, tambin 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 cdigo de las aplicaciones. Las definiciones de variables se incluirn en (General)(Declaraciones) y las sentencias de asignacin en un evento o procedimiento que se ejecute al iniciarse la aplicacin; 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 asignacin Set adems del signo =. Se emplea la funcin 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 funcin responda correctamente es necesario que AutoCAD este cargado y con un dibujo abierto que ser referenciado como ActiveDocument. En la primera instruccin 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 aplicacin se puede trabajar con AcadDoc y AcadDocEM como el dibujo de AutoCAD y su Espacio Modelo respectivamente. Si adems se desea trabajar con el Espacio Papel, las sentencias empleadas deberan 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

Prctica 10

Pg: 2

Universitat Jaume I

Diseo y Fabricacin Asistido por Ordenador

Si se desea trabajar con bloque, adems 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 inicializacin 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 coleccin Espacio Papel, Espacio Modelo y tambin de la coleccin Blocks que contiene todas las definiciones de bloques del dibujo. En la variable AcadBlocks se almacena la referencia a esta coleccin de bloques con la propiedad Blocks del objeto Document. En la variable Bloque1 se almacena un bloque que se va a crear en la coleccin Blocks mediante el mtodo Add de esta misma coleccin. El nuevo bloque aparecer definido, de momento, sin ninguna entidad, con el nombre de BloqueA en el dibujo de AutoCAD. Su punto de insercin ser el 50,50,0. Si se quieren aadir entidades a ese bloque, los mtodos son los mismos que para el Espacio Papel y Espacio Modelo y que se describen ms adelante. En los tres casos comentados, para cada una de las tres colecciones, se puede sustituir la definicin 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 Podran 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 grficas y algunos de sus mtodos y propiedades. Tambin se presentara el mtodo Add que es propio del Espacio Papel, del Espacio Modelo y bloques y que sirve para crear entidades desde VBA. En el apndice de VBA y en la ayuda de AutoCAD podis encontrar toda la informacin necesaria sobre todos los objetos, propiedades y mtodos existentes. 2.1 LNEA Set ObjGrafico = ObjColeccion.AddLine(PtoInicial, PtoFinal) El objeto grfico al que se aplica este mtodo 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 despus con la lnea resultante lo lgico 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()

Prctica 10

Pg: 3

Universitat Jaume I

Diseo y Fabricacin 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) Mtodos: Copy: Copia la entidad a la que se aplica el mtodo en la misma posicin en que se encuentra la entidad original. Su sintaxis es: Set NuevoObj = ObjGrafico.Copy Erase: Elimina la entidad a la que se aplica el mtodo. Su sintaxis es: Call ObjGrafico.Erase GetBoundingBox: Calcula las coordenadas de la esquina inferior izquierda y superior derecha de la caja de inclusin (mnimo rectngulo que la encierra por completo) del objeto grfico. 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 lneas puede modificarse. La variable de punto es de tipo Variant ObjLinea.EndPoint = PtoFinal Para asignar un punto final solo en lneas PtoFinal = ObjGrafico.EndPoint (Para obtener el punto final) 2.2 CRCULO Set ObjCirculo = ObjColeccion.AddCircle (Centro, Radio) Crea un circulo en una coleccin 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 mtodos y propiedades de la entidad Line son tambin aplicables a la entidad circle. Propiedades: Area: Obtiene el rea incluida en la entidad (arco, crculo, elipse, polilnea, regin o spline). Es de tipo Double . Su sintaxis es: ValorArea = ObjGrafico.Area

Prctica 10

Pg: 4

Universitat Jaume I

Diseo y Fabricacin 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 crculo 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 dems casos este mtodo se utiliza desde una coleccin 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 mtodos y propiedades vistos para las entidades anteriores se aplican tambin 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 vrtices de la entidad. En el caso del punto solo hay un vrtice. La variable se declara con la sentencia Dim Vrtices (1 to n*3) As Double, donde n es el nmero de vrtices. . 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 POLILNEA Set ObjPol = ObjColeccion.AddPolyline (MatrizVertices) Crea una entidad de tipo polilnea en el Espacio Modelo, Espacio Papel o como parte de un bloque. A partir de la versin 14 se introduce una nueva entidad LightweightPolyline que ahorra memoria y espacio en disco. Para crear una polilnea que contenga arcos primero se crea una polilnea con segmentos rectos y la continuacin, con el mtodo SetBugle se curvan los segmentos deseados. Los mtodos y propiedades vistos para las entidades anteriores se aplican tambin a esta. Tiene algunos mtodos y propiedades que aun no se ha presentado como. Mtodos: AppendVertex: Aade vrtices a polilneas 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 vrtice de la polilnea. Su sintaxis es: Curvatura = ObjGrafico.GetBulge (Indice)

Prctica 10

Pg: 5

Universitat Jaume I

Diseo y Fabricacin Asistido por Ordenador

SetBulge: Asigna el valor de curvatura de un vrtice de la polilnea. Su sintaxis es: ObjGrafico.SetBulge (Indice, Curvatura) Coordinates: Obtiene y asigna una matriz con las coordenadas de cada uno de los vrtices de la entidad. En el caso del punto solo hay un vrtice. LA variable se declara con la sentencia Dim Vrtices (1 to n*3) As Double , donde n es el nmero de vrtices. . 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 POLINEA OPTIMIZADA Set ObjPol = ObjColeccion.AddWeightPolyline (MatrizVertices) Crea una entidad de tipo polilnea optimizada en el Espacio Modelo, Espacio Papel o como parte de un bloque. Sustituyen a las polilneas ya que ahorran memoria y disco. Para crear una polilnea que contenga arcos primero se crea una polilnea con segmentos rectos y la continuacin, con el mtodo SetBugle se curvan los segmentos deseados. Solo tiene un mtodo especifico: Mtodos: AddVertex: Aade vrtices a polilneas optimizadas. Su sintaxis es: ObjPolOptimizada.AddVertex (Indice,Punto) Hay muchas entidades, propiedades y mtodos que no se han revisado. Se puede encontrar la lista completa en el apndice 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 parmetros 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 aplicacin Puerta Parametrizada

Prctica 10

Pg: 6

Universitat Jaume I

Diseo y Fabricacin 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 continuacin. 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 Dim Dim Dim 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 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 giro As Integer Sentido As Integer Sentido2 As Integer AnguloInclinacion As Double AnguloAux As Double

Const Pi As Double = 3.14159265359 En esta seccin 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 tcnicas. Por ejemplo, Matriz1 y Matriz2, arrays de tipo Double , tiene a menudo el mismo contenido que PtoIns y PtoOp, de tipo Variant. La razn 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 aplicacin. En este caso rellenaremos los valores de las listas desplegables que se utilizan para establecer los parmetros 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

Prctica 10

Pg: 7

Universitat Jaume I

Diseo y Fabricacin Asistido por Ordenador

GrosorHoja.AddItem "0.040", 1 Ancho.AddItem Ancho.AddItem Fondo.AddItem Fondo.AddItem End Sub Despus habr que determinar en que punto se insertar la puerta. Para ello utilizaremos el mtodo 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 insercin de la puerta:") UserForm1.Show vuelve a mostrar el formulario End Sub Para establecer la direccin 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 direccin de la puerta:") UserForm1.Show vuelve a mostrar el formulario End Sub La aplicacin terminar cuando se haga click sobre el botn Cancelar: Private Sub Cancelar_Click() End End Sub Cuando se pulse en el botn de Aceptar se dibujara la puerta segn los parmetros 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 aplicacin 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 posicin exacta de las bisagras. Para ello se examinan las coordenadas x de los dos puntos y se determina si el PtoIns est ms a la derecha que PtoOp o al revs y se guarda el resultado en la variable Sentido. A continuacin se establece el valor del punto de giro, segn 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 "0.05", "0.07", "0.05", "0.07", 0 1 0 1

Prctica 10

Pg: 8

Universitat Jaume I

Diseo y Fabricacin 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 vrtices de los dos rectngulos 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 polilneas. 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 rectngulo que representa la hoja de la puerta. Se dibuja inicialmente en sentido vertical positivo o negativo, en funcin del ngulo positivo o negativo indicado

Prctica 10

Pg: 9

Universitat Jaume I

Diseo y Fabricacin Asistido por Ordenador

por el usuario. A continuacin se examina la variable Sentido para saber si PtoIns est a la derecha o la izquierda de PtoOp. Tambin se tiene que tener en cuenta si el usuario ha elegido el punto de giro sobre el de insercin o sobre el lado opuesto. El resultado se guarda en Sentido2. Segn 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 rotacin. 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 segn uno de los cuatro casos posibles, en funcin 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 insercin 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)

Prctica 10

Pg: 10

Universitat Jaume I

Diseo y Fabricacin 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 direccin especificada por el usuario. La puerta ha sido dibujada horizontalmente apoyada sobre PtoIns. Este ha de ser el punto de giro en la rotacin. La variable AnguloInclinacion almacena el valor del ngulo que forma la lnea 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 insercin 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.

Prctica 10

Pg: 11