4.1. Selección Previa

Selección de Entidades.

El API de Autodesk Inventor proporciona dos maneras para la selección de entidades: el conjunto de selección (SelectSet) y la selección interactiva.

Conjunto de selección (SelectSet).

Este es el procedimiento más sencillo pero a la vez el menos flexible. El conjunto de selección (SelectSet) es el conjunto de entidades que el usuario ha seleccionado mediante el comando Selección de la interfaz de usuario de Autodesk Inventor.

La utilización de este comando por el usuario es totalmente independiente del API. El programador puede, a través del API inspeccionar los contenidos del conjunto seleccionado. Los comandos que emplean el conjunto de selección funcionan en modo objeto->acción. Esto quiere decir que el usuario primero selecciona los objetos adecuados y después invoca la macro que se aplicará a los objetos previamente seleccionados.

En estos casos el programador no se involucra en el proceso de selección. Se presupone que el usuario entiende lo que debe seleccionar para ejecutar correctamente la macro. Ésta se limita a inspeccionar lo seleccionado para comprobar si se han seleccionado entidades válidas y en ese caso las emplea. El objeto SelectSet se encuentra disponible para todos los documentos a través de la propiedad SelectSet.

Procedimiento.

El procedimiento usual sería como se describe a continuación:

  1. Establecer una referencia al SelectSet del documento activo.
    Dim oSelectSet As SelectSet
    Set oSelectSet = ThisApplication.ActiveDocument.SelectSet
  2. Comprobar que se haya seleccionado algo y/o que la cantidad de entidades seleccionadas sea la correcta. Para esto se recurre a la propiedad Count del objeto SelectSet. Si nada ha sido seleccionado oSelectSet.Count es igual a 0.
  3. Comprobar que se haya seleccionado el tipo de entidad que se desea. Para ello se recorre el SelectSet a partir de su propiedad Item. Para comprobar el tipo de entidad se recurre a la propiedad Type cuyo valor corresponde a la enumeración ObjectTypeEnum (buscar en la ayuda los valores posibles). Por ejemplo una cara corresponde al tipo kFaceObject. Para comprobar la naturaleza de cara (Face) valdría la expresión:
    If oSelectSet.Item(1).Type = kFaceObject Then

    Else MsgBox "Lo seleccionado debe ser una Cara."
    End If
    Otra posibilidad es la de utilizar una expresión Visual Basic de la forma TypeOf nombreObjeto Is tipoObjeto. Esta expresión devuelve Verdadero si nombreObjeto es del tipo de objeto especificado en tipoObjeto. Por ejemplo:
    If TypeOf oSelectSet.Item(1) Is Face Then

    Else
    MsgBox "Lo seleccionado debe ser una Cara."
    End If
  4. Para facilitar la escritura del código que utilizará el objeto seleccionado es conveniente establecer una referencia directa a ese objeto, por ejemplo si se trata de un objeto Face:
    Dim oFace As Face
    Set oFace = oSelectSet.Item(1)
  5. Ejecutar cualquier operación que se desee sobre ese objeto.

Objetos BRep.

Las caras y aristas delimitan el interior de un sólido del exterior definiendo así su forma. Esta delimitación es lo que se conoce como el Boundary Representation o de manera más concisa, BRep. El API BRep permite acceder a esta información.

El modelo de objetos BRep se muestra en la siguiente figura.

Espacio Paramétrico.

Al trabajar con objetos planos se suelen definir en términos de su propio plano. El objeto se divide de una manera conceptualmente conveniente para referenciar un punto determinado de la superficie. Una superficie, por ejemplo puede ser parametrizada como muestra el siguiente esquema:

Las superficies se parametrizan en su espacio 2D. Las aristas (curvas) se parametrizan linealmente. Pero es posible evaluarlas para obtener coordenadas XYZ del espacio del modelo.

Para obtener las coordenadas XYZ del espacio del modelo de un punto de una superficie será necesario suministrar las coordenadas 2D de su espacio paramétrico. Para las de un punto sobre una arista se suministrará un único valor correspondiente a su parámetro. El API BRep incluye varios objetos Evaluator, a través de los cuales se realiza la conversión entre el espacio paramétrico y espacio del modélico.

El siguiente ejemplo muestra la manera de informar al usuario el área de la cara referenciada por oFace:

Dim oSurfEval As SurfaceEvaluator
Set oSurfEval = oFace.Evaluator
MsgBox "Área de la superficie: " & oSurfEval.Area & " cm^2"

Ejercicio.

Crear una macro que informe al usuario del área de una cara preseleccionada. En caso de no haber nada seleccionado debe informar que debe existir una selección previa a ejecutar la macro.

En primer término crearemos un nuevo Proyecto de Usuario al que llamaremos ConsultaArea_1. Para esta primera aproximación no crearemos un formulario, sino que mostraremos los resultados empleando la ventana de mensajes (objeto MsgBox) standard de Windows.

Controlar la conversión de unidades.

Como hemos explicado en un tema anterior (Expresión de las Unidades en los Valores Predeterminados del Dibujo) las unidades en que trabaja internamente Inventor son centímetros, mientras que las unidades predeterminadas del dibujo suelen ser milímetros. Cuando se trata de valores de área tenemos una dificultad adicional, ya que en este caso no existe una constante de enumeración. En ocasiones como ésta tendremos que definir nosotros una en forma de cadena de caracteres. El procedimiento que seguiremos es el siguiente:

  1. Definir las variables a utilizar en el procedimiento:
    Dim oUOM As UnitsOfMeasure
    Dim eUnidadLongitud As UnitsTypeEnum
    Dim sUnidadLongitud As String
    Dim sUnidadArea As String
  2. Referenciar el objeto UnitsOfMeasure:
    Set oUOM = ThisApplication.ActiveDocument.UnitsOfMeasure
  3. Construir el especificador de unidades de área para la unidad actual del dibujo:
    eUnidadLongitud = oUOM.LengthUnits
    sUnidadLongitud = oUOM.GetStringFromType(eUnidadLongitud)
    sUnidadArea = sUnidadLongitud & "^2"

Obtener y procesar el conjunto de selección.

Esta macro requiere que el usuario haya seleccionado una o más caras del modelo para reportar su área. Lo seleccionado está contenido en el objeto SelectSet del documento. Pero pueden darse tres casos diferentes:

  • que no se haya seleccionado nada,
  • que el conjunto de selección contenga una o más caras
  • que ninguno de los objetos seleccionados sea una cara
Para ello será necesario comprobar si el número de objetos seleccionados es mayor que 0. Si lo fuera, se deberá emplear la instrucción For Each ... Next para recorrer el SelectSet comprobando en cada objeto si se trata de una cara para lo cual usaremos la expresión:
If TypeOf elem Is Face
En caso de que fuera una cara sumaremos el valor a la variable dblArea.
For Each elem In oSelectSet
' Comprueba que lo seleccionado sea una cara.
If TypeOf elem Is Face Then
dblArea = dblArea + elem.Evaluator.Area
End If
Next elem

Informe del los resultados.

Una vz concluido el recorrido examinamos el valor de dblArea. Si este valor aún fuera 0, eso querría decir que ninguno de los objetos seleccionados era una cara, lo que se deberá informar al usuario. En caso contrario se informará del valor total obtenido. Para ello convertiremos el valor obtenido a las unidades del dibujo, utilizando el espcificador de unidades de área que hab íamos configurado previamente:
Dim sArea As String
sArea = oUOM.GetStringFromValue(dblArea, sUnidadArea)
' Muestra el área de la cara seleccionada.
MsgBox "Área de la superficie: " & sArea

Código de la macro.

El código completo de la macro se muestra a continuación. Este código se incluirá en uno de los módulos del proyecto.
Public Sub MuestraAreaSuperficie()

' Establece la conversión de unidades
Dim oUOM As UnitsOfMeasure
Set oUOM = ThisApplication.ActiveDocument.UnitsOfMeasure
Dim eUnidadLongitud As UnitsTypeEnum
eUnidadLongitud = oUOM.LengthUnits
Dim sUnidadLongitud As String
sUnidadLongitud = oUOM.GetStringFromType(eUnidadLongitud)
Dim sUnidadArea As String
sUnidadArea = sUnidadLongitud & "^2"

' Establece una referencia al SelectSet del documento activo.
Dim oSelectSet As SelectSet
Set oSelectSet = ThisApplication.ActiveDocument.SelectSet

' Obtiene la cantidad de objetos seleccionados:

Dim numSel As Integer

numSel = oSelectSet.Count

' Actúa según la cantidad seleccionada:
Select Case numSel
Case 0
MsgBox "Ninguna Cara ha sido seleccionada."
Case Else
Dim elem As Variant
Dim dblArea As Double
dblArea = 0
Dim oFace As Face

For Each elem In oSelectSet
' Comprueba que lo seleccionado sea una cara.
If TypeOf elem Is Face Then
dblArea = dblArea + elem.Evaluator.Area
End If
Next elem
If dblArea > 0 Then
Dim sArea As String
sArea = oUOM.GetStringFromValue(dblArea, sUnidadArea)
' Muestra el área de la cara seleccionada.
MsgBox "Área de la superficie: " & sArea
Else
MsgBox "Ninguna Cara ha sido seleccionada."
End If
End Select
End Sub
El proyecto VBA para la selección previa puede descargarse delde el enlace al final de la página.
Reinaldo Togores Fernández,
14 mar 2011, 12:18
v.1