5.1. Creación de una Herramienta de Diseño

Una vez conseguida, en los ejercicios anteriores, la funcionalidad de selección nos proponemos crear una herramienta propia que permita ahorrar pasos en la realización de piezas mecánicas. El problema propuesto es el siguiente:

Se desea crear una herramienta que permita seleccionar una cara circular en una pieza que se está diseñando y que cree en torno a su centro una matriz de agujeros cuyas características se definirán mediante la interfaz de usuario diseñada al efecto.

Los requisitos que debe cumplir el programa son:

  1. Requerir la selección de una cara, y comprobar que esta cara sea realmente circular. Para ello se deben estudiar las propiedades del objeto Cara (Face) para encontrar cuáles de ellas nos permiten determinar sus características geométricas. En caso de que el usuario elija otro tipo de cara, se le comunicará que su selección ha sido errónea y se le pedirá que continúe intentando la selección. Como es lógico, para la acción de esta herramienta sólo se seleccionará una cara. Debe preverse algún medio para que el usuario pueda interrumpir la ejecución del programa en caso de desistir de esta operación durante el proceso de selección.
  2. Permitir al usuario determinar, mediante casillas de texto u otros tipos de control que el alumno puede explorar libremente, el número de agujeros a realizar, su diámetro y la distancia al centro de la cara. Se deben realizar las comprobaciones mínimas para que los datos sean coherentes, por ejemplo que los agujeros no se solapen y que no se salgan de la superficie de la cara.
  3. Una vez decididos los parámetros el usuario deberá pulsar e botón de Aceptar, con lo cual se ejecutarán las operaciones necesarias para crear los agujeros.

Propiedades del objeto FACE.

La manera más efectiva de estudiar las propiedades de cualquier objeto consiste en establecer una referencia al mismo como variable local y abrir la ventana Locales del entorno de desarrollo VBA (ver Figura 1). Aquí se muestra una estructura de árbol con sus propiedades en tiempo de ejecución del programa.

Para comprobar si la cara seleccionada es realmente circular debemos examinar su propiedad Edges, que nos devuelve las aristas que definen su contorno. De entrada si la cara es circular, el número de aristas será 1, lo que puede comprobarse mediante la propiedad Count:

If oCara.Edges.Count = 1 Then
    'Seguir adelante…
Else
    'Rechazar la selección…
End If

Pero esto no nos asegura que sea una arista circular, por lo que debemos comprobar su tipo. Este dato está contenido en la propiedad CurveType que deberá corresponder a la constante de enumeración kCircleCurve.

If oCara.Edges.Item(1).CurveType = kCircleCurve Then…

Como podemos ver en la Figura 1, la propiedad Geometry de la arista contiene todos los datos necesarios para las comprobaciones que deberá hacer nuestro programa en su interfaz de usuario, y que no es más que el radio:

Radio: oCara.Edges.Item(1).Geometry.Radius
Figura 1. Propiedades de una cara circular seleccionada tal como se muestra en la ventana Locales.

5.1.1. La Interfaz de Usuario.

Se propone como objetivo inicial la preparación de la interfaz de usuario con los controles necesarios para:

  1. Seleccionar la cara circular. Mientras esta cara no esté seleccionada los demás controles estarán deshabilitados.
  2. Una vez seleccionada la cara, se habilitarán los controles para la entrada de datos (radio de la matriz de agujeros, número de agujeros, diámetro y profundidad de los agujeros) y se mostrará en una etiqueta de texto los siguientes datos:
    Coordenadas X, Y, Z de su centro.
    Radio de la cara seleccionada.
  3. Se sugiere la posibilidad de mostrar inicialmente datos por defecto que serán calculados a partir del radio de la cara.
  4. Programar la funcionalidad para los eventos de los controles de entrada de datos de manera que se aseguren resultados adecuados.
  5. La interfaz de usuario debe incorporar un botón para aplicar y otro para cancelar el comando.
Figura 2. Interfaz de usuario.

Crearemos un UserForm (que en nuestro código identificamos como frmMatrizAg). En ese formulario colocaremos cuatro controles TextBox:

 Name  Caption  Enabled
 txtCant  Número de agujeros
 True
 txtRadio  Radio de la matriz
 True
 txtDiam  Diámetro de  los agujeros
 True
 txtProf  Profundidad de  los agujeros
 True

Además colocaremos cuatro botones de comando (CommandButton) con las siguientes propiedades:

 Name  Caption  Enabled
cmdSeleccionar  Seleccción Cara
 True
cmdConfirmar  Comprobar
 True
cmdAceptar  Aplicar
 False
cmdCancelar  Profundidad de  los agujeros
 True

Incluiremos un control Label de nombre lblInfo destinado a enviar mensajes al usuario. El formulario de la Figura 2 incluye un control de imagen (Image) y un control Frame que son opcionales y cuyo fin es exclusivamente el mejorar el aspecto de la interfaz gráfica de usuario.

Declararemos dos variables globales, en el código del formulario:

Option Explicit
Public oCara As Face
Public oUOM As UnitsOfMeasure

5.1.2. Selección de la Cara.

La primera operación a implementar será la selección de la cara al pulsar el botón Selección Cara (cmdSeleccionar). La selección deberá utilizar el módulo de clase que desarrollamos en el ejercicio 4.2. Selección Interactiva. Para ello podemos simplemente exportar el módulo de clase desde aquél royecto e importarlo en el nuevo proyecto (ver Figura 3).

Figura 3. Exportación del módulo de clase.
Una vez disponible este módulo en nuestro proyecto implementaremos el procedimiento de respuesta al evento Click del botón cmdSeleccionar.
La selección implica la creación de una nueva instancia de la clase, establecer los valores de sus propiedades Filtro y Mensaje e invocar a continuación el método Designa, que devolverá el objeto Face seleccionado por el usuario. Para permitir la selección el formulario, en este caso definido como modal, se ocultará.

Private Sub cmdSeleccionar_Click()
    Dim oSelecc As New clsSeleccionar

    oSelecc.Filtro = kPartFaceFilter
    oSelecc.Mensaje = "seleccione una cara"
    Me.Hide
    Set oCara = oSelecc.Designa(1)

Una vez devuelta la selección se deberá comprobar que se trate de una cara plana circular, según se explica más arriba. Ya con esto bastaría, pero haremos algo más, que será calcular una serie de valores predefinidos de acuerdo con las dimensiones de la cara que sirvan de orientación al usuario.
Estas opciones serán las siguientes:

 Número de agujeros:  6 agujeros
 Radio de la matriz (a centros de agujero):
 2/3 del radio de la cara.
 Diámetro del agujero:
 1/12 de la circunferencia
 Profundidad del agujero:
 el doble del diámetro

Una vez hecha la selección y comprobado que se trate de una cara circular, se calculan los valores por defecto según los criterios expuestos:

If oCara.Edges.Count = 1 And oCara.Edges.Item(1).CurveType = kCircleCurve Then
    Dim dblRadio As Double

    Dim dblRadMat As Double
    Dim dblDiam As Double

 ' se calculan valores por defecto a partir de las dimensiones de la cara.

    txtCant.Value = 6                                ' número de agujeros
    dblRadio = oCara.Edges.Item(1).Geometry.Radius   ' radio de la cara
    dblRadMat = dblRadio * 2 / 3                     ' radio de la matriz
    dblDiam = 3.1416 * dblRadMat / 6                 ' diámetro del agujero
    If dblDiam > 1 Then
          dblDiam = Fix(dblDiam)                     ' diámetro a entero
    End If

Ahora, para pasar los valores a los cuadros de texto será necesario convertirlos a las unidades del documento recurriendo al objeto UnitsOfMeasure (ver lo explicado en el ejercicio 2.4. Expresión de las unidades en los valores predeterminados del dibujo). El objeto UnitsOfMeasure estará referenciado por la variable oUOM, declarada como global y a la que se puede asignar su valor en el evento Initialize del formulario.

txtRadio.Text = oUOM.GetStringFromValue(dblRadMat, kDefaultDisplayLengthUnits)
txtDiam.Text = oUOM.GetStringFromValue(dblDiam, kDefaultDisplayLengthUnits)
txtProf.Text = oUOM.GetStringFromValue(dblDiam * 2, kDefaultDisplayLengthUnits)

Y se presentarán los datos de la cara seleccionada en la etiqueta lblInfo. EStos datos serán el radio y las coordenadas del centro de la cara.

Dim dblCentroX As Double
Dim dblCentroY As Double

dblCentroX = oCara.Edges.Item(1).Geometry.Center.X
dblCentroY = oCara.Edges.Item(1).Geometry.Center.Y

lblInfo.Caption = "Radio de la cara seleccionada: " & _
   oUOM.GetStringFromValue(dblRadio, kDefaultDisplayLengthUnits) & _
   vbCrLf & "Coordenadas locales del centro: (" & _
   oUOM.GetValueFromExpression(dblCentroX, kDefaultDisplayLengthUnits) & "," & _
   oUOM.GetValueFromExpression(dblCentroY, kDefaultDisplayLengthUnits) & ")"

En caso de que la selección no sea de una cara plana circular se deberá advertir de ello al usuario mediante un mensaje en la etiqueta lblInfo. Para llamar la atención se podrá colorear de rojo el texto, lo que habrá que tener en cuenta posteriormente para restituir el color original.

Else
         lblInfo.ForeColor = vbRed
         lblInfo.Caption = "ERROR: Debe seleccionar una cara plana circular"
End If
Me.Show
End Sub

Parte 2. Creación del Boceto.

Para crear las operaciones será necesaria la creación de un boceto sobre la cara seleccionada. Pero se debe tener en cuenta que los sistemas de coordenadas del boceto y del modelo no son los mismos. El alumno deberá estudiar los métodos para la conversión entre ambos sistemas de coordenadas (ModelToSketchSpace y SketchToModelSpace).

Independientemente de esta posibilidad, la definición de las operaciones se facilita si se controla el origen y la orientación del boceto. Esto se logra mediante el método AddWithOrientation de la colección Sketches.

AddWithOrientation

Método que crea un nuevo boceto a partir de una entidad plana e información sobre la orientación.

Sintaxis:

Public Function AddWithOrientation( _
    ByVal EntidadPlana As Object, _
    ByVal EntidadEje As Object, _
    ByVal DireccionNatualDelEje As Boolean, _
    ByVal EjeEsX As Boolean, _
    ByVal Origen As Object, _
    Opcional ByVal UsarAristasDeCara As Boolean = False _
) As PlanarSketch

Parámetros:

EntidadPlana :
Objeto plano sobre el cual se construirá el boceto. Son entradas válidas las caras planas y los planos de trabajo.
EntidadEje :
Objeto que define el eje X o el eje Y del plano del boceto (el argumento EjeEsX define cuál). Las entradas válidas incluyen las aristas lineales, líneas tomadas de otro boceto y ejes de trabajo. A continuación se muestra la manera de establecer una variable de objeto para un eje de trabajo que será empleado como eje X para la creación de un boceto con orientación. El ítem 1 de la colección predeterminada de ejes corresponde al eje X del modelo.
Dim oDoc As PartDocument
Set oDoc = ThisApplication.ActiveDocument
Dim oEjeX As WorkAxis
Set oEjeX = oDoc.ComponentDefinition.WorkAxes.Item(1)
DireccionNatualDelEje :
Argumento Booleano que define si el eje X o Y del boceto posee la misma dirección que la definida por EntidadEje. Verdadero (True) indica que la dirección es la misma.
EjeEsX :
Argumento Booleano que especifica si la entidad eje define el eje X o el eje Y. Verdadero (True) indica que el eje definido es el X.
Origen :
Objeto que define el origen del Plano del Boceto. Puede emplearse para ello un vértice (Vertex), un punto de trabajo (WorkPoint) o un punto de boceto (SketchPoint) tomado de otro boceto. A continuación se muestra la manera de crear un WorkPoint en el centro de la cara para utilizarla como origen del nuevo boceto. Observe que las coordenadas del centro obtenidas a partir de la geometría de la cara corresponden al espacio del modelo, por lo que no es necesaria su transformación.
Dim oWPoints As WorkPoints
Set oWPoints = oDoc.ComponentDefinition.WorkPoints
Dim oWPt As WorkPoint
Set oWPt = oWPoints.AddFixed(oCara.Edges.Item(1).Geometry.Center)
Obsérvese que utilizamos el método AddFixed para añadir el WorkPoint ya que otros métodos no aceptan un punto genérico, sino que exigen un objeto SketchPoint o un objeto Vertex.
UsarAristasDeCara :
Argumento Booleano opcional que especifica si deben incorporarse como geometría del boceto las aristas de la cara tomada como base. Esto reproduce el comportamiento usual al crear un boceto de manera interactiva en Autodesk Inventor. Este argumento no se toma en cuenta si EntidadPlana es un plano de trabajo. El valor predeterminado es Falso, lo que indica que no se creará la geometría a partir de las aristas de la cara base.

A continuación se muestra la manera de invocar el método AddWithOrientation empleando la cara seleccionada (oCara) y los objetos eje (oEjeX) y origen (oWPt) definidos más arriba.

Dim oBoceto As PlanarSketch
Set oBoceto = oDoc.ComponentDefinition.Sketches. _
AddWithOrientation(oCara, oEjeX, True, True, oWPt, False)