CREACION DE ENTIDADES DE DIBUJO DE AUTOCAD CON VBA.

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