De estas dos colecciones vistas hasta ahora los objetos componentes simples son todos los ya estudiados: líneas, círculos, arcos, referencias de bloque...

 

DOCE.8.3. Colección de bloques y el objeto bloque

La colección de bloques (Blocks) la constituyen todos los bloques del documento actual activo. Las propiedades y métodos de esta colección las vemos seguidamente.

Propiedades de la colección de bloques:

Application
Count

Métodos de la colección de bloques:

Add
Item

Sólo un nuevo método hemos de explicar:

· Add. Este método añade un nuevo objeto a la colección indicada. Su sintaxis específica para la colección de bloques es:

Set ObjBloque = ObjColBloques.Add(DblPtoIns, StrNombre)

DblPtoIns es un valor Double para el punto de inserción (matriz de tres valores Double) y StrNombre es una cadena (String) para el nombre del bloque.

El objeto resultante de esta operación es un objeto de bloque, esto es, un bloque. Los objetos de bloque poseen las siguientes propiedades y métodos:

Propiedades de los objetos de bloque:

Application
Name
Origin

Métodos de los objetos de bloque:

Add3DFace
Add3DMesh
Add3DPoly
AddArc
AddAttribute
AddBox
AddCircle
AddCone
AddCustomObject
AddCylinder
AddDimAligned
AddDimAngular
AddDimDiametric
AddDimOrdinate
AddDimRadial
AddDimRotated
AddEllipse
AddEllipticalCone
AddEllipticalCylinder
AddExtrudedSolid
AddExtrudedSolidAlongPath
AddHatch
AddLeader
AddLightWeightPolyline
AddLine
AddMText
AddPoint
AddPolyline
AddRaster
AddRay
AddRegion
AddRevolvedSolid
AddShape
AddSolid
AddSphere
AddSpline
AddText
AddTolerance
AddTorus
AddTrace
AddWedge
AddXLine
Delete
InsertBlock
Item

Veamos un ejemplo de macro VBA en el que se crea un bloque con una sola línea:

Option Explicit

Dim Acad As Object
Dim AcadDoc As Object
Dim AcadModel As Object
Dim AcadBloq As Object
Dim Lin As Object


Sub Macro()
  Set Acad = GetObject(, "AutoCAD.Application")
  Set AcadDoc = Acad.ActiveDocument
  Set AcadModel = AcadDoc.ModelSpace
  Set AcadBloq = AcadDoc.Blocks

  Dim Bloq As Object
  Dim PtoIns(1 To 3) As Double
  Dim Pto2(1 To 3) As Double
  
  PtoIns(1) = 10: PtoIns(2) = 10: PtoIns(3) = 0
  Pto2(1) = 100: Pto2(2) = 100: Pto2(3) = 0
  Set Bloq = AcadBloq.Add(PtoIns, "pqpq")
  Set Bloq = Bloq.AddLine(PtoIns, Pto2)
End Sub

Lo que se debe hacer en primera instancia es crear el objeto de bloque en la colección de bloques (Set Bloq = AcadBloq.Add(PtoIns, "pqpq")); es como si creáramos un bloque vacío. Después se le añaden entidades de dibujo, como en este caso una línea (Set Bloq = Bloq.AddLine(PtoIns, Pto2)) con los métodos ya estudiados, ya que estos métodos, como hemos visto, son propios también de la colección de objetos de bloque.

El nuevo método no estudiado aún de los objetos que son bloques es:

· Delete. Delete borra o elimina el objeto indicado. Hemos de indicar el nombre de dicho objeto (bloque, estilo de acotación, SCP...) como una cadena (String), pero esto no es necesario más que para la colección de ventanas:

ObjNoGrafico.Delete(StrNombreObj)

 

DOCE.8.4. Colección de diccionarios y el objeto
diccionario

La colección de diccionarios (Dictionaries) la constituyen todos los objetos de diccionario del documento actual activo.

Propiedades de la colección de diccionarios:

Application
Count

Métodos de la colección de diccionarios:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

NOTA: El método Add hemos visto que tenía una sintaxis especial para la colección de bloques. Pues bien, para ella y para la colección de SCPs existen estas sintaxis especiales (esta última ya se verá en su momento). Para el resto de las colecciones la sintaxis del método Add es la siguiente:

Set ObjComponenteCol = ObjColección.Add(StrNombre)

StrNombre es el nombre (String) del objeto que se añadirá a la colección.

Sigamos. El objeto simple de la colección de diccionarios es un objeto de diccionario. Los objetos de diccionario poseen las siguientes propiedades y métodos:

Propiedades de los objetos de diccionario:

Application
Name

Métodos de los objetos de diccionario:

AddObject
Delete
GetName
GetObject
GetXData
Remove
Rename
Replace
SetXData

Un diccionario es un sistema para almacenar y recuperar objetos con una cadena de palabras clave asociada. El objeto puede ser referenciado en un diccionario mediante su palabra clave. Un diccionario puede contener cualquier tipo de objeto, incluso otro diccionario.

NOTA: Este objeto de diccionario no tiene nada que ver con el diccionario ortográfico de corrección de AutoCAD.

Los nuevos métodos de los objetos de diccionario que hemos de estudiar son los que siguen a continuación.

· AddObject. Añade un nuevo objeto a un diccionario. Si la entrada ya existe es sustituida por el nuevo objeto, si no simplemente se agrega. Los dos argumentos para este método (nombre de objeto y palabra clave) han de ser cadenas (String). Veamos la sintaxis:

Set ObjNoGráfico = ObjDiccionario.AddObject(StrPalClave, StrNomObjeto)

· GetName. Devuelve el nombre (palabra clave) de un objeto de un diccionario:

StrNombre = ObjDiccionario.GetName(ObjEnDiccionario)

· GetObject. Devuelve el objeto que se corresponde con una palabra clave en un diccionario:

ObjEnDiccionario = ObjDiccionario.GetObject(StrPalClave)

· Remove. Elimina el objeto de un diccionario indicado por su palabra clave:

Call ObjDiccionario.Remove(StrPalClave)

· Rename. Cambia el nombre (palabra clave) del objeto de un diccionario indicado por su palabra clave:

Call ObjDiccionario.Rename(StrNombreAntiguo, StrNombreNuevo)

· Replace. Cambia una entrada en un diccionario por otra dada:

Call ObjDiccionario.Replace(StrPalClave, ObjObjetoNuevo)

 

DOCE.8.5. Colección de estilos de acotación y el
objeto estilo de acotación

La colección de estilos de acotación (DimStyles) la constituyen todos los objetos de estilos de cota del documento actual activo, es decir, los estilos de acotación que todos conocemos.

Propiedades de la colección de estilos de acotación:

Application
Count

Métodos de la colección de estilos de acotación:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de estilo de acotación. Los objetos de estilo de acotación poseen las siguientes propiedades y métodos:

Propiedades de los objetos de estilo de acotación:

Application
Name

Métodos de los objetos de estilo de acotación:

Delete
GetXData
SetXData

Las propiedades y métodos expuestos están ya estudiados.

 

DOCE.8.6. Colección de grupos y el objeto grupo

La colección de grupos (Groups) la constituyen todos los objetos de grupo del documento actual activo.

Propiedades de la colección de grupos:

Application
Count

Métodos de la colección de grupos:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de grupo. Los objetos de grupo son conjuntos de selección con nombre y poseen las siguientes propiedades y métodos:

Propiedades de los objetos de grupo:

Application
Color
Count
EntityName
EntityType
Handle
Layer
LineType
LinetypeScale
Name
ObjectID
Visible

Métodos de los objetos de grupo:

AppendItems
Delete
GetXData
Highlight
Item
RemoveItems
SetXData
Update

Los métodos nuevos son:

· AppendItems. Añade una o más entidades gráficas al grupo:

Call ObjGrupo.AppendItems(ObjGráficos)

ObjGráficos es una matriz de objetos gráficos de AutoCAD.

· RemoveItems. Elimina los objetos especificados de un grupo (o también de un conjunto de selección):

Call ObjGrupo.RemoveItems(ObjGráficos)

ObjGráficos es una matriz de objetos gráficos de AutoCAD.

 

DOCE.8.7. Colección de capas y el objeto capa

La colección de capas (Layers) la constituyen todos los objetos de capa del documento actual activo, es decir, las capas del dibujo.

Propiedades de la colección de capas:

Application
Count

Métodos de la colección de capas:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

Por ejemplo, la siguiente macro crearía una nueva capa llamadas EJES:

Option Explicit

Dim AcadDoc As Object
Dim AcadModel As Object


Sub Macro()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  Set AcadModel = AcadDoc.ModelSpace
  Call AcadDoc.Layers.Add("ejes")
End Sub

El objeto simple de esta colección es un objeto de capa. Los objetos de capa poseen las siguientes propiedades y métodos:

Propiedades de los objetos de capa:

Application
Color
Freeze
LayerOn
LineType
Lock
Name

Métodos de los objetos de capa:

Delete
GetXData
SetXData

Las nuevas propiedades se explican a continuación.

· Freeze. La propiedad Freeze congela o descongela una capa. Es lo que se denomina en la versión castellana de AutoCAD 14 la inutilización y reutilización de capas (representado por un Sol o un símbolo de hielo, dependiendo de la condición, en el cuadro de diálogo de capas). También nos permite obtener el estado en que se encuentra una capa —con respecto a este aspecto—.

La sintaxis para asignar un estado con Freeze a una capa es:

ObjCapa.Freeze = BooEstadoUtilización

BooEstadoUtilización es un valor Boolean que puesto a True indica que la capa se inutiliza (se congela) y puesto a False indica que la capa se reutiliza o utiliza (se descongela).

La sintaxis para obtener un estado con Freeze de una capa es:

BooEstadoUtilización = ObjCapa.Freeze

BooEstadoUtilización es un valor Boolean que si almacena True indica que la capa está inutilizada y si almacena False indica que la capa está reutilizada o utilizada.

Recordemos que la ventaja de inutilizar o congelar una capa es que es excluida de la regeneración, lo que no ocurre por ejemplo al desactivarla simplemente. También decir que una capa inutilizada no es trazada (por plotter o impresora).

· LayerOn. La propiedad LayerOn activa o desactiva una capa (representado por una bombilla encendida o apagada, dependiendo de la condición, en el cuadro de diálogo de capas). También nos permite obtener el estado en que se encuentra una capa —con respecto a este aspecto—.

La sintaxis para asignar un estado con LayerOn a una capa es:

ObjCapa.LayerOn = BooEstadoActivación

BooEstadoActivación es un valor Boolean que puesto a True indica que la capa se activa y puesto a False indica que la capa de desactiva.

La sintaxis para obtener un estado con LayerOn de una capa es:

BooEstadoActivación = ObjCapa.LayerOn

BooEstadoActivación es un valor Boolean que si almacena True indica que la capa está activada y si almacena False indica que la capa está desactivada.

Al desactivar un capa no aparecerá en pantalla ni en trazador, pero sus objetos seguirán respondiendo a las regeneraciones del dibujo.

· Lock. La propiedad Lock bloquea o desbloquea una capa (representado por un candado abierto o cerrado, dependiendo de la condición, en el cuadro de diálogo de capas). También nos permite obtener el estado en que se encuentra una capa —con respecto a este aspecto—.

La sintaxis para asignar un estado con Lock a una capa es:

ObjCapa.Lock = BooEstadoBloqueo

BooEstadoBloqueo es un valor Boolean que puesto a True indica que la capa se bloquea y puesto a False indica que la capa de desbloquea.

La sintaxis para obtener un estado con Lock de una capa es:

BooEstadoBloqueo = ObjCapa.Lock

BooEstadoBloqueo es un valor Boolean que si almacena True indica que la capa está bloqueada y si almacena False indica que la capa está desbloqueada.

Al bloquear una capa no se podrá modificar, pero seguirá visible y respondiendo a acciones como, por ejemplo, la utilización de modos de referencia en ella.

Veamos un programa de ejemplo de manejo de capas. Este ejercicio maneja el cuadro de diálogo que se puede observar en esta misma página. Su misión es únicamente informativa, es decir, sólo informa del nombre y propiedades de las diferente capas del dibujo actual.

Al ejecutar el programa deberá rellenar la lista desplegable con las capas de la sesión de AutoCAD en curso y mostrará la primera de ellas (siempre la capa 0) escribiendo en los distintos cuadros de edición sus respectivas propiedades.

Al actuar sobre la lista desplegable eligiendo una capa, las casillas de edición se actualizarán con los nuevos valores.

Veamos pues el letrero de diálogo comentado y, a continuación, el listado del programa propiamente dicho.

El listado es el que sigue:

Option Explicit

Dim AcadDoc As Object
Dim AcadModel As Object
Dim AcadCapas As Object
Dim NumCapas As Integer


Private Sub cbSalir_Click()
  End
End Sub


Private Sub cbCapas_Change()
  Dim Índice As Integer

  Índice = cbCapas.ListIndex
  tbColor.Text = AcadCapas.Item(Índice).Color
  tbTipolin.Text = AcadCapas.Item(Índice).Linetype
  If AcadCapas.Item(Índice).LayerOn = True Then
    tbAD.Text = "Activada"
  Else
    tbAD.Text = "Desactivada"
  End If
  If AcadCapas.Item(Índice).Freeze = True Then
    tbIR.Text = "Inutilizada"
  Else
    tbIR.Text = "Utilizada"
  End If
  If AcadCapas.Item(Índice).Lock = True Then
    tbBD.Text = "Bloqueada"
  Else
    tbBD.Text = "Desbloqueada"
  End If
End Sub


Private Sub UserForm_Initialize()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  Set AcadModel = AcadDoc.ModelSpace
  Set AcadCapas = AcadDoc.Layers

  NumCapas = AcadCapas.Count
  Dim i As Integer
  For i = 0 To Val(NumCapas - 1)
    cbCapas.AddItem AcadCapas.Item(i).Name
  Next i
  cbCapas.Text = AcadCapas.Item(0).Name
End Sub

Vemos como en cuanto se corre el programa se hace una llamada al procedimiento cbCapas_Change. Esto es debido a la línea cbCapas.Text = AcadCapas.Item(0).Name, que en sí ya realiza un cambio en la lista desplegable, por eso se ejecuta el procedimiento anteriormente dicho. Esta línea escribe en la casilla de la lista desplegable el primero de los elementos (la primera capa, la capa 0).

Antes de esto se introducen todos los nombres de capas en la lista. Vemos que no tiene ningún misterio y que simplemente es limitarse a seguir las pautas y diversas sintaxis de uso que vamos estudiando.

Con las extracción del color, tipo de línea y demás propiedades, vemos que el proceso es similar. La única variante es que se ha introducido un control para averiguar cuando determinados valores son True o False y escribir textos en las casillas que resulten más lógicos al usuario que Verdadero y/o Falso.

NOTA: Como el cuadro es sólo informativo no nos olvidemos de establecer la propiedad Style de la lista desplegable a 2 (fmStyleDropDownList) y las propiedades Locked de las casillas de edición a True. Todo ello para no poder editar valores manualmente. Si quisiéramos que el usuario pudiera entrar en las casillas y variar los valores para cambiar las propiedades de las capas, únicamente habríamos de dejar estas propiedades especificadas como están y añadir algo más de código al programa con las diferentes sintaxis para asignar —en lugar de obtener— las propiedades de las capas.

 

DOCE.8.8. Colección de tipos de línea y el objeto
tipo de línea

La colección de tipos de línea (Linetypes) la constituyen todos los objetos de tipo de línea del documento actual activo, es decir, los tipos de línea cargados en el dibujo.

Propiedades de la colección de tipos de línea:

Application
Count

Métodos de la colección de tipos de línea:

Add
Item
Load

Como vemos hay un nuevo método:

· Load. Carga en el dibujo actual el tipo de línea especificado (String) del archivo de definición de tipos de línea (.LIN) especificado (String):

Call ObjColTiposDeLínea.Load(StrNombreTipoLínea, StrNombreArchivo)

NOTA: Si utilizamos el método Add se creará un nuevo tipo de línea con las propiedades por defecto.

El objeto simple de esta colección es un objeto de tipo de línea. Los objetos de tipo de línea poseen las siguientes propiedades y métodos:

Propiedades de los objetos de tipo de línea:

Application
Description
Name

Métodos de los objetos de tipo de línea:

Delete
GetXData
SetXData

La nueva propiedad es:

· Description. Asigna u obtiene una descripción (String) para el tipo de línea. Esta descripción es la que aparece en el archivo de definición .LIN y en el cuadro de gestión de tipos de línea, es la representación de la línea con caracteres ASCII (puntos, guiones, texto, etc...). Como máximo puede tener 47 caracteres.

La sintaxis para asignar una descripción es:

ObjTipoLínea.Description = StrDescripción

La sintaxis para obtener una descripción es:

StrDescripción = ObjTipoLínea.Description

Veamos la siguiente macro de ejemplo en la que se carga un tipo de línea y se obtiene su descripción:

Option Explicit

Dim AcadDoc As Object


Sub Macro()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  
  If IsEmpty(AcadDoc.Linetypes.Item("trazo_y_punto")) Then 
    Call AcadDoc.Linetypes.Load("trazo_y_punto", "acadiso.lin")
  End If

  Dim TipoLin As Object
  Set TipoLin = AcadDoc.Linetypes.Item("trazo_y_punto")
  Dim Descr As String
  Descr = TipoLin.Description
  MsgBox Descr
End Sub

NOTA: Podemos comprobar que con la única definición de AcadDoc nos sirve para este programa; no hay por qué declarar más variables de objeto de AutoCAD si no es necesario.

Si intentamos cargar un tipo de línea y este ya está cargado (o crear un capa que ya existe, un estilo de texto, etcétera), VBA devuelve un error. Para evitar esto hemos de comprobar primero si dicho tipo de línea —en este caso— está ya cargado. Para estos menesteres utilizamos la función de Visual Basic IsEmpty como se puede observar en el listado.

Tras cargar el tipo de línea, si no estaba ya cargado, se extrae su descripción y se muestra con un MsgBox. El resultado es el siguiente:

 
NOTA: Si el archivo
ACADISO.LIN no hubiera estado en uno de los directorios de soporte de AutoCAD 14, habríamos de haber indicado la ruta completa al fichero; al igual que ocurría con los programas en AutoLISP, si recordamos.

 

DOCE.8.9. Colección de aplicaciones registradas y el
objeto aplicación registrada

La colección de aplicaciones registradas (RegisteredApplications) la constituyen todos los objetos de aplicación registrada del documento actual activo.

Propiedades de la colección de aplicaciones registradas:

Application
Count

Métodos de la colección de aplicaciones registradas:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de aplicación registrada. Los objetos de aplicación registrada poseen las siguientes propiedades y métodos:

Propiedades de los objetos de aplicación registrada:

Application
Name

Métodos de los objetos de tipo de aplicación registrada:

Delete
GetXData
SetXData

Las propiedades y métodos expuestos están ya estudiados.

 

DOCE.8.10. Colección de conjuntos de selección y el
objeto conjunto de selección

La colección de conjuntos de selección (SelectionSets) la constituyen todos los objetos de conjunto de selección del documento actual activo, o sea, los conjuntos actuales.

Propiedades de la colección de conjuntos de selección:

Application
Count

Métodos de la colección de conjuntos de selección:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de conjunto de selección. Los objetos de conjunto de selección poseen las siguientes propiedades y métodos:

Propiedades de los objetos de conjunto de selección:

Application
Count
Name

Métodos de los objetos de conjunto de selección:

AddItems
Clear
Delete
Erase
Highlight
Item
RemoveItems
ScaleEntity
Select
SelectAtPoint
SelectByPolygon

SelectOnScreen
Update

Veamos estos nuevos métodos aplicables únicamente a conjuntos de selección.

· AddItems. Añade objetos al conjunto de selección:

Call ObjConjuntoSel.AddItems(ObjGráficos)

ObjGráficos es una matriz de objetos gráficos.

NOTA: No confundir AddItems con el método AppendItems de los objetos de grupo ni con el método AddItem de las listas desplegables y cuadros de lista de Visual Basic.

El siguiente ejemplo de macro dibuja una línea, un círculo, crea un conjunto de selección y le añade ambos objetos creados:

Option Explicit

Dim AcadDoc As Object
Dim AcadModel As Object
Dim Línea As Object
Dim Círculo As Object
Dim Grupo1 As Object


Sub Macro()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  Set AcadModel = AcadDoc.ModelSpace

  Dim Pto1(2) As Double
  Dim Pto2(2) As Double

  Pto1(0) = 100: Pto1(1) = 100: Pto1(2) = 0
  Pto2(0) = 200: Pto2(1) = 200: Pto2(2) = 0
  Set Línea = AcadModel.AddLine(Pto1, Pto2)
  Set Círculo = AcadModel.AddCircle(Pto1, 10)
  Set Grupo1 = AcadDoc.SelectionSets.Add("Prueba")
  Dim Objeto(1) As Object
  Set Objeto(0) = Línea: Set Objeto(1) = Círculo
  Call Grupo1.AddItems(Objeto)
End Sub

Si ahora yo quisiera eliminar —por ejemplo— ambos objetos guardados en el conjunto de selección Grupo1, simplemente haría:

Grupo1.Erase

· Clear. Elimina todos los elementos de un conjunto de selección:

Call ObjConjuntoSel.Clear

Esto es, vacía el conjunto.

· Select. Selecciona los objetos designados por el modo indicado y los introduce en un conjunto de selección. Su sintaxis de utilización es:

Call ObjConjuntoSel.Select(IntModo, DblPto1, DblPto2, VarTipoFiltro, VarDatoFiltro)

El argumento IntModo es un valor Integer que define el tipo o modo de selección que se ejecutará sobre los objetos. Admite también las siguientes constantes:


acSelectionSetAll
acSelectionSetCrossing
acSelectionSetCrossingPolygon
acSelectionSetFence
acSelectionSetLast
acSelectionSetPrevious
acSelectionSetWindows
acSelectionSetWindowPolygon

Las cuales se corresponden con los diferentes modos de designación de entidades de AutoCAD 14, esto es: Todo, Captura, Polígono-Captura, Borde, Último, Previo, Ventana y Polígono-Ventana.

Los dos argumentos de punto siguientes (matriz de tres valores Double) son obligatorios. En el caso de Captura y Ventana representan las dos esquinas opuestas por la diagonal. En el caso de Polígono (Captura o Ventana) y Borde, el primer argumento DblPto1 debe contener una matriz con todos los puntos que definen el polígono o el borde, y se debe suministrar un argumento DblPto2 ficticio; en este caso resulta preferible utilizar el método SelectByPolygon (que luego veremos). En el caso de modos que no necesitan puntos, como Todo, Último y Previo, los dos puntos se deben suministrar como argumentos ficticios que luego no se van a utilizar.

El argumento VarTipoFiltro (Variant) permite especificar un filtro de selección, de manera similar a la función de AutoLISP SSGET. El último argumento permite especificar filtros para los datos extendidos.

· SelectAtPoint. Selecciona el objeto que pasa por el punto indicado y lo añade a un conjunto de selección. Su sintaxis de utilización es:

Call ObjConjuntoSel.SelectAtPoint(DblPto, VarTipoFiltro, VarDatoFiltro)

DblPto es una matriz de tres valores Double. Los dos últimos argumentos como en el método Select.

· SelectByPolygon. Selecciona entidades incluidas dentro de un polígono definido por una lista de puntos suministrada (y las añade a un conjunto de selección). Su sintaxis de utilización es:

Call ObjConjuntoSel.SelectByPolygon(IntModo, DblListaPtos, VarTipoFiltro, VarDatoFiltro)

El argumento IntModo es un valor Integer que define el tipo o modo de selección que se ejecutará sobre los objetos. Admite también las siguientes constantes:

acSelectionSetCrossing
acSelectionSetCrossingPolygon
acSelectionSetFence

DblListaPtos es una matriz de puntos con las esquinas del polígono. Los dos últimos argumentos como en el método Select.

· SelectOnScreen. Permite seleccionar objetos en pantalla (tras el prompt Designar objetos:, o Select objects: en inglés) que serán añadidos a un conjunto de selección. Su sintaxis de utilización es:

Call ObjConjuntoSel.SelectOnScreen(VarTipoFiltro, VarDatoFiltro)

Los dos argumentos como en el método Select.

NOTA: En todos estos métodos de selección, los argumentos VarTipoFiltro y VarDatoFiltro son opcionales.

Veamos el siguiente ejemplo:

Option Explicit

Dim AcadDoc As Object
Dim AcadModel As Object
Dim Línea As Object
Dim Círculo As Object
Dim Grupo1 As Object


Sub Macro()
Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
Set AcadModel = AcadDoc.ModelSpace
Dim Pto1(2) As Double
Dim Pto2(2) As Double
Pto1(0) = 100: Pto1(1) = 100: Pto1(2) = 0
Pto2(0) = 200: Pto2(1) = 200: Pto2(2) = 0
Set Línea = AcadModel.AddLine(Pto1, Pto2)
Set Círculo = AcadModel.AddCircle(Pto1, 10)
Set Grupo1 = AcadDoc.SelectionSets.Add("Prueba")
Call Grupo1.SelectOnScreen
Grupo1.Erase
End Sub

Esta macro dibuja una línea y un círculo en pantalla. Tras crear un nuevo conjunto de selección (Grupo1) se permite seleccionar en pantalla los objetos que se insertarán en él. Después de esta designación los objetos se borran.

NOTA: Más adelante veremos como seleccionar también en pantalla puntos, ángulos, distancias, etcétera.

 

DOCE.8.11. Colección de estilos de texto y el objeto
estilo de texto

La colección de estilos de texto (TextStyles) la constituyen todos los objetos de estilo de texto del documento actual activo, o sea, los estilos de texto creados actualmente.

Propiedades de la colección de estilos de texto:

Application
Count

Métodos de la colección de estilos de texto:

Add Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de estilo de texto. Los objetos de estilo de texto poseen las siguientes propiedades y métodos:

Propiedades de los objetos de estilo de texto:

Application
BigFontFile
FontFile
Height
LastHeight
Name
ObliqueAngle
TextGenerationFlag
Width

Métodos de los objetos de estilo de texto:

Delete
GetXData
SetXData

Veamos estas nuevas propiedades aplicables únicamente a estilos de texto.

· BigFontFile. Permite especificar u obtener el nombre de archivo de fuente grande (para tipos de letra asiáticos, por ejemplo) asociado con el estilo de texto. La sintaxis para asignar un archivo es:

ObjEstiloTexto.BigFontFile = StrNombreArch

donde StrNombreArch es una cadena (tipo de dato String).

La sintaxis para obtener o extraer el archivo de texto de fuente grande de un estilo de texto es:

StrNombreArch = ObjEstiloTexto.BigFontFile

donde StrNombreArch es una cadena (tipo de dato String).

NOTA: El único tipo de archivo válido es el de extensión .SHX.

· FontFile. Permite especificar u obtener el nombre de archivo de fuente principal o primario asociado con el estilo de texto. La sintaxis para asignar un archivo es:

ObjEstiloTexto.FontFile = StrNombreArch

donde StrNombreArch es una cadena (tipo de dato String).

La sintaxis para obtener o extraer el archivo de texto de fuente principal de un estilo de texto es:

StrNombreArch = ObjEstiloTexto.FontFile

donde StrNombreArch es una cadena (tipo de dato String).

NOTA: Los tipos de archivo válidos son .PFA, .PFB, .SHX, .TTF.

· LastHeight. Asigna u obtiene la última altura de texto utilizada. Para asignar:

ObjEstiloTexto.LastHeight = DblÚltimaAltura

donde DblÚltimaAltura es un valor Double.

La sintaxis para obtener:

DblÚltimaAltura = ObjEstiloTexto.LastHeight

donde DblÚltimaAltura es un valor Double.

 

DOCE.8.12. Colección de SCPs y el objeto SCP

La colección de SCPs (UserCoordinateSystems) la constituyen todos los objetos de SCP del documento actual activo, esto es, los SCPs guardados.

Propiedades de la colección de SCPs:


Application
Count

Métodos de la colección de SCPs:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

NOTA: El método Add hemos visto que tenía una sintaxis especial para la colección de bloques. Veremos ahora la sintaxis especial para la colección de SCPs.

Set ObjSCP = ObjColección.Add(DblOrigen, DblPtoEjeX, DblPtoEjeX, StrNombre)

DblOrigen es una coordenada 3D (matriz de tres valores Double) en el SCU que especifica dónde se añadirá el SCP. DblPtoEjeX y DblPtoEjeY son dos coordenadas 3D también (matrices de tres valores Double cada una) en el SCU que indican sendos puntos en la parte positiva de los ejes X e Y para el SCP; la dirección positiva del eje Z queda definida por la regla de la "mano derecha". StrNombre es el nombre (String) del SCP que se añadirá a la colección.

Si nos damos cuenta lo que hacemos es definir un SCP mediante tres puntos: el punto de origen, un punto en el eje X y un punto en el eje Y.

El objeto simple de la colección de SCPs es un objeto de SCP. Los objetos de SCP poseen las siguientes propiedades y métodos:

Propiedades de los objetos de SCP:


Application
Name
Origin
XVector
YVector

Métodos de los objetos de SCP:

Delete
GetUCSMatrix
GetXData
SetXData

Observamos que existen dos nuevas propiedades y un método nuevo que aún no conocemos. Pasaremos pues a estudiar esto.

Primero las propiedades:

· XVector. Asigna u obtiene la dirección X del SCP. Para asignar:

ObjSCP.XVector = DblVectorX

donde DblVectorX es un array de tres valores Double. Esta característica está controlada también por la variable de sistema de AutoCAD UCSXDIR.

Para obtener:

VarVectorX = ObjSCP.XVector

· YVector. Asigna u obtiene la dirección Y del SCP. Para asignar:

ObjSCP.YVector = DblVectorY

donde DblVectorY es un array de tres valores Double. Esta característica está controlada por la variable de sistema de AutoCAD UCSYDIR.

Para obtener:

VarVectorY = ObjSCP.YVector

Ahora el método:

· GetUCSMatrix. Obtiene la matriz de transformación del objeto de SCP al que se aplica el método. Esta matriz de 4 Ž 4 define las rotaciones y traslaciones de cada eje del SCP respecto al Sistema Universal. Sintaxis:

VarMatriz = ObjSCP.GetUCSMatrix

donde VarMatriz es una variable que habrá sido declarada como Variant, aunque recogerá una matriz de 4 Ž 4 elementos Double. Después podremos acceder a cada valor por medio de índices, como hemos hecho otras veces.

 

DOCE.8.13. Colección de vistas y el objeto vista

La colección de vistas (Views) la constituyen todos los objetos de vista del documento actual activo, esto es, las vistas guardadas.

Propiedades de la colección de vistas:

Application
Count

Métodos de la colección de vistas:

Add
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de vista. Los objetos de vista poseen las siguientes propiedades y métodos:

Propiedades de los objetos de vista:

Application
Center
Direction
Height
Name
Target
Width 

Métodos de los objetos de vista:

Delete
GetXData
SetXData

Las nuevas propiedades Direction y Target se explican a continuación.

· Direction. Asigna u obtiene la dirección de la vista para una visualización tridimensional. Para asignar:

ObjNoGráfico.Direction = DblVector

Para obtener:

VarVector = ObjNoGráfico.Direction

donde DblVector es un array de tres valores Double. Es un vector de dirección desde donde el dibujo se verá. Esta propiedad es similar al comando PTOVISTA (VPOINT en inglés) de AutoCAD.

· Target. Asigna u obtiene el punto objetivo de una vista (en este caso). Para asignar:

ObjNoGráfico.Target = DblPuntoObjetivo

Para obtener:

VarPuntoObjetivo = ObjNoGráfico.Target

donde DblPuntoObjetivo es un array de tres valores Double. Como siempre, pare recoger utilizaremos una variable declarada como Variant.

 

DOCE.8.14. Colección de ventanas y el objeto ventana

La colección de ventanas (Viewports) la constituyen todos los objetos de ventana del documento actual activo en el Espacio Modelo, esto es, las ventanas gráficas en mosaico activas actualmente.

Propiedades de la colección de ventanas:

Application
Count

Métodos de la colección de ventanas:

Add
Delete
Item

Las propiedades y métodos expuestos están ya estudiados.

El objeto simple de esta colección es un objeto de ventana gráfica. Los objetos de ventana gráfica poseen las siguientes propiedades y métodos:

Propiedades de los objetos de ventana:

Application
Center
Direction
GridOn
Height
LowerLeftCorner
Name
OrthoOn
SnapBasePoint

SnapOn
SnapRotationAngle
StatusID
Target
UCSIconAtOrigin
UCSIconOn
UpperRightCorner
Width

Métodos de los objetos de ventana:

GetGridSpacing
GetSnapSpacing
GetXData
SetGridSpacing
SetSnapSpacing

SetView
SetXData
Split
ZoomAll
ZoomCenter
ZoomExtents
ZoomPickWindow
ZoomScaled
ZoomWindow

Comencemos por las nuevas propiedades.

· GridOn. Obtiene y asigna el valor de estado de la rejilla en una ventana. Es un valor booleano (Boolean) que si es True especifica que la rejilla está activada y si, por el contrario, es False, especifica que la rejilla está desactivada.

La sintaxis para asignar este valor es:

ObjVentana.GridOn = BooRejilla

Y la sintaxis para obtenerlo:

BooRejilla = ObjVentana.GridOn

· LowerLeftCorner. Obtiene el vértice inferior izquierdo de la ventana gráfica, en porcentaje de ancho y alto de pantalla, tal como se almacenan las configuraciones de ventanas mosaico en AutoCAD. Sintaxis:

VarEsquinaII = ObjVentana.LowerLeftCorner

VarEsquinaII recogerá una matriz de valores Double.

· OrthoOn. Obtiene y asigna la condición del modo Orto en la ventana activa actualmente. Sintaxis para asignar:

ObjVentana.OrthoOn = BooModoOrto

Sintaxis para obtener:

BooModoOrto = ObjVentana.OrthoOn

BooModoOrto tomará el valor True si el modo Orto está activado —o se quiere activar—; tomará el valor False si el modo Orto está desactivado o se quiere desactivar.

· SnapBasePoint. Especifica el punto base para el forzado de cursor/rejilla en la ventana actual.

La sintaxis para asignar este valor es:

ObjVentana.SnapBasePoint = DblPtoBase


Y la sintaxis para obtenerlo:

VarPtoBase = ObjVentana.SnapBasePoint

Evidentemente, DblPtoBase, al ser un punto, será una matriz de tres valores Double. Si es para obtener, recordar que habremos de guardarlo en una variable Variant.

· SnapOn. Especifica el estado del forzado de cursor.

La sintaxis para asignar este valor es:

ObjVentana.SnapOn = BooEstadoForzcursor

Y la sintaxis para obtenerlo:

BooEstadoForzcursor = ObjVentana.SnapOn

BooEstadoForzcursor será un valor Boolean que además admite las siguientes constantes:

acOn
acOff

que especifican la activación (acOn) o no activación (acOff) del Forzcursor.

· SnapRotationAngle. Es el ángulo de rotación en radianes (valor Double de 0 a 6.28) del forzado de cursor en la ventana con respecto al SCU.

La sintaxis para asignar este valor es:

ObjVentana.SnapRotationAngle = DblÁnguloRotación

Y la sintaxis para obtenerlo:

DblÁnguloRotación = ObjVentana.SnapRotationAngle

· StatusID. Obtiene únicamente el estado de activación de una ventana. El valor se recoge en una variable declarada como Boolean: si guarda True la ventana está activada, si guarda False la ventana está desactivada:

BooEstadoActivación = ObjVentana.StatusID

· UCSIconAtOrigin. Especifica si el icono o símbolo del SCP se muestra en el origen de coordenadas o no. Todo ello es controlado por un valor Boolean que, si es True quiere decir que el SCP aparece en el origen y, si es False, que no.

La sintaxis para asignar este valor es:

ObjVentana.UCSIconAtOrigen = BooSimbSCPOrigen

Y la sintaxis para obtenerlo:

BooSimbSCPOrigen = ObjVentana.UCSIconAtOrigin

· UCSIconOn. Especifica si el icono o símbolo del SCP se visualiza o no. Todo ello es controlado por un valor Boolean que, si es True quiere decir que el SCP se visualiza y, si es False, que no se visualiza.

La sintaxis para asignar este valor es:

ObjVentana.UCSIconOn = BooSimbSCPActivo


Y la sintaxis para obtenerlo:

BooSimbSCPActivo = ObjVentana.UCSIconOn

· UpperRightCorner. Obtiene el vértice superior derecho de la ventana gráfica, en porcentaje de ancho y alto de pantalla, tal como se almacenan las configuraciones de ventanas mosaico en AutoCAD. Sintaxis:

VarEsquinaSD = ObjVentana.UpperRightCorner

VarEsquinaSD será una matriz de valores Double.

Veamos ahora los nuevos métodos.

· GetGridSpacing. Obtiene el espaciado de la rejilla para la ventana:

Call ObjVentana.GetGridSpacing(DblEspXRejilla, DblEspYRejilla)

DblEspXRejilla y DblEspYRejilla son dos variables declaradas como Double que guardarán el espaciado en X y en Y respectivamente.

· GetSnapSpacing. Obtiene el espaciado del forzado de cursor para la ventana:

Call ObjVentana.GetSnapSpacing(DblEspXForzcursor, DblEspYForzcursor)

DblEspXForzcursor y DblEspYForzcursor son dos variables declaradas como Double que guardarán el espaciado en X y en Y respectivamente.

· SetGridSpacing. Asigna el espaciado de la rejilla para la ventana:

Call ObjVentana.SetGridSpacing(DblEspXRejilla, DblEspYRejilla)

DblEspXRejilla y DblEspYRejilla son dos valores Double que representan el espaciado en X y en Y respectivamente.

· SetSnapSpacing. Asigna el espaciado del forzado de cursor para la ventana:

Call ObjVentana.SetSnapSpacing(DblEspXForzcursor, DblEspYForzcursor)

DblEspXForzcursor y DblEspYForzcursor son dos valores Double que representan el espaciado en X y en Y respectivamente. El valor inicial para X e Y es 1.0000.

· SetView. Establece en la ventana gráfica la visualización de un objeto de vista. El argumento suministrado deberá ser de tipo Object, conteniendo una vista existente en el dibujo:

Call ObjVentana.SetView(ObjVista)

ObjVista es un objeto de vista de los explicados en la sección anterior.

· Split. Divide la ventana gráfica actual en el número de partes indicado:

Call ObjVentana.Split(IntNúmVentanas)

IntNúmVentanas ha de ser un número entero, aunque también se admiten las siguientes constantes (las cuales dicen relación a las diferentes formas predeterminadas de AutoCAD de dividir una ventana):

acViewport2Horizontal
acViewport2Vertical
acViewport3Left
acViewport3Right
acViewport3Horizontal
acViewport3Vertical
acViewport3Above
acViewport3Below
acViewport4

La siguiente macro muestra la manera de dividir la ventana gráfica actual en tres ventanas con una posición predefinida de AutoCAD:

Option Explicit

Dim AcadDoc As Object
Dim AcadModel As Object
Dim Ventana1 As Object


Sub Macro()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  Set AcadModel = AcadDoc.ModelSpace

  Set Ventana1 = AcadDoc.Viewports.Add("Nueva")
  Call Ventana1.Split(acViewport3Left)
  Set AcadDoc.ActiveViewport = Ventana1
End Sub

Primero hemos de crear un nuevo objeto de ventana en la colección de ventanas, después dividirlo a nuestro gusto y, por último, definirlo como la ventana actual (recordemos la propiedad ActiveViewport del objeto de documento activo).

· ZoomAll. Realiza un Zoom Todo en la ventana actual:

ObjVentana.ZoomAll

· ZoomCenter. Realiza un Zoom Centro en la ventana actual. Hay que proporcionar el centro en cuestión (matriz de tres valores Double) y el factor de ampliación (Double).

Call ObjVentana.ZoomCenter(DblPtoCentro, DblFactorAmpl)

· ZoomExtens. Realiza un Zoom Extensión en la ventana actual:

ObjVentana.ZoomExtens

· ZoomPickWindow. Realiza un Zoom Ventana en la ventana actual. Los puntos diagonales de la ventana se marcan en pantalla con el dispositivo señalador al mensaje habitual:

ObjVentana.ZoomPickWindow

· ZoomScaled. Realiza un Zoom Factor en la ventana actual. Hay que proporcionar el factor de escala y el tipo de escala:

Call ObjVentana.ZoomScaled(DblFactorEscala, IntTipoEscala)

DblFactorEscala es un valor Double que representa el factor de escala. IntTipoEscala es un valor Integer que además admite las tres siguientes constantes (absoluta, relativa y relativa al Espacio Papel):

acZoomScaledAbsolute
acZoomScaledRelative
acZoomScaledRelativePSpace

· ZoomWindow. Realiza un Zoom Ventana en el que se proporcionan los puntos diagonales como argumentos del método:

Call ObjVentana.ZoomWindow(DblPtoInfIzq, DblPtoSupDcha)

DblPtoInfIzq y DblPtoSupDcha son los puntos (matriz de tres valores Double) inferior izquierda y superior derecha, respectivamente, de la ventana.

 

DOCE.8.14.1. Ventanas del Espacio Papel

Todo lo visto hasta aquí en cuestión de ventanas se refiere a las ventanas del Espacio Modelo de AutoCAD 14. A la hora de crear y gestionar ventanas de Espacio Papel se recurre a un método exclusivo de la colección de objetos de Espacio Papel: AddPViewport. Si recordamos, emplazamos el estudio de este método a esta sección.

La sintaxis de AddPViewport es:

Set ObjVentanaPapel = ObjColEspacioPapel.AddPViewport (DblCentro, DblAltura, DblAnchura)

Propiedades de los objetos de ventana de Espacio Papel:

Application
Center
Direction
EntityName
EntityType
GridOn
Handle
Height
Layer
LensLength
Linetype
LinetypeScale
ObjectID
RemoveHiddenLines
SnapBasePoint
SnapOn
SnapRotationAngle
Target
TwistAngle
UCSIconAtOrigin
UCSIconOn
Visible
Width

Métodos de los objetos de ventana de Espacio Papel:

ArrayPolar
ArrayRectangular
Copy
Display
Erase
GetBoundingBox
GetGridSpacing
GetSnapSpacing
GetXData
Highlight
IntersectWith
Mirror
Mirror3D
Move
Rotate
Rotate3D
ScaleEntity
SetGridSpacing
SetSnapSpacing
SetXData
TransformBy
Update
ZoomAll
ZoomCenter
ZoomExtents
ZoomPickWindow
ZoomScaled
ZoomWindow

DblCentro es un valor que especifica el punto (array de tres valores Double) central de la ventana. DblAltura es un valor Double que especifica al altura de la ventana. DblAnchura es un valor Double que especifica al anchura de la ventana. Estos dos últimos valores han de ser positivos.

Pasemos a explicar las nuevas propiedades y el nuevo método.

· LensLength. Especifica la longitud de la lente (en milímetros) para la vista en perspectiva. Este valor Double está también controlado por la variable de sistema LENSLENGTH.

La sintaxis para asignar este valor es:

ObjVentanaPapel.LensLength = DblLongLente

Y la sintaxis para obtenerlo:

DblLongLente = ObjVentanaPapel.LensLength

· RemoveHiddenLines. Especifica si las líneas ocultas han de ser trazadas o imprimidas en determinada ventana. Su sintaxis para asignar un valor es la que sigue:

ObjVentanaPapel.RemoveHiddenLines = BooLíneasOcultas

Y la sintaxis para obtenerlo:

BooLíneasOcultas = ObjVentanaPapel.RemoveHiddenLines

BooLíneasOcultas es un valor Boolean; si es True las líneas ocultas no aparecen trazadas, si es False sí.

· TwistAngle. Obtiene el ángulo de ladeo de una ventana. Su sintaxis es la que sigue:

DblÁngLadeo = ObjVentanaPapel.TwistAngle

DblÁngLadeo es un valor Double.

El método Display a continuación.

· Display. Este método activa o desactiva una ventana de Espacio Papel:

ObjVentanaPapel.Display(BooEstado)

BooEstado es un valor Boolean; True activa la ventana, False la desactiva.

Veamos el ejemplo que sigue:

Option Explicit
Dim AcadDoc As Object
Dim AcadPapel As Object
Dim VentanaPapel As Object
Dim CentroVentana(1 To 3) As Double


Sub Macro()
  Set AcadDoc = GetObject(, "AutoCAD.Application").ActiveDocument
  Set AcadPapel = AcadDoc.PaperSpace

  CentroVentana(1) = 100: CentroVentana(2) = 100: CentroVentana(3) = 0
  Set VentanaPapel = AcadPapel.AddPViewport(CentroVentana, 100, 100)
  VentanaPapel.Display (True)
End Sub

Con esta macro creamos una ventana flotante de Espacio Papel. Al crearla, por defecto aparece desactivada. Para activarla utilizamos el método Display.

Hasta aquí todo lo referente a las colecciones de objetos. Hemos aprendido muchos detalles que ya nos harán programar medianamente bien. Sin embargo, para optar por una programación aceptable necesitamos conocer algunos mecanismos más, sobre todo los que veremos en la sección siguiente.

 

3ª fase intermedia de ejercicios

· Escribir una programa en el módulo VBA que permita cambiar el tipo de línea de uno o varios objetos. El letrero de diálogo que manejará el programa es el siguiente (por ejemplo):

 

El funcionamiento del programa es el siguiente. Al iniciar el letrero se rellenará la lista desplegable Tipo de línea: con los nombres de los tipos de línea actualmente cargados en el dibujo. La lista Tipo de objeto: permanecerá vacía por el momento.

Al pulsar el botón Designar< se cerrará el cuadro y se permitirá designar en pantalla uno o varios objetos. Tras el final de la designación o selección, se retornará al cuadro en el que se rellenará la lista desplegable Tipo de objeto: con el tipo (línea, círculo, spline...) y el número ID de identificación, entre paréntesis, de cada uno de los objetos seleccionados.

La manera de aplicar ahora tipos de línea a los objetos es escogiendo de la lista superior la entidad en concreto y, de la lista inferior, el tipo de línea que será asignado a ella. Tras esto se pulsa el botón Aplicar para aplicar los cambios. Los cambios deben ser evidentes de inmediato (al pulsar Aplicar) pero el letrero no ha de cerrarse; por si acaso se quieren realizar más modificaciones o cambios.

El botón Salir cierra el letrero de diálogo y termina la aplicación.

 

Autor: Jonathan Préstamo Rodríguez.
Para:
La Web del Programador.