Академический Документы
Профессиональный Документы
Культура Документы
Prctica 10
Pg: 1
Universitat Jaume I
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.
Prctica 10
Pg: 2
Universitat Jaume I
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
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
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
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:
Prctica 10
Pg: 6
Universitat Jaume I
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
GrosorHoja.AddItem "0.035", 0
Prctica 10
Pg: 7
Universitat Jaume I
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
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
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
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