Creacion de Entidades de Dibujo de Autocad Con Vba.

11
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

description

CREACION DE ENTIDADES DE DIBUJO DE AUTOCAD CON VBA.

Transcript of Creacion de Entidades de Dibujo de Autocad Con Vba.

Page 1: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 2: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 3: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 4: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 5: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 6: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 7: Creacion de Entidades de Dibujo de Autocad Con Vba.

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 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

Práctica 10 Pág: 7

Page 8: Creacion de Entidades de Dibujo de Autocad Con Vba.

Universitat Jaume I Diseño y Fabricación Asistido por Ordenador

GrosorHoja.AddItem "0.040", 1 Ancho.AddItem "0.05", 0 Ancho.AddItem "0.07", 1 Fondo.AddItem "0.05", 0 Fondo.AddItem "0.07", 1 End Sub

Después habrá que determinar en que punto se insertará la puerta. Para ello utilizaremos el método GetPoint del objeto Utility. El punto se almacena en una variable de tipo Variant PtoIns.

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

Page 9: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 10: Creacion de Entidades de Dibujo de Autocad Con Vba.

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

Page 11: Creacion de Entidades de Dibujo de Autocad Con Vba.

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