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: Una vez conseguida, 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:
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:
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.
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:
![]() |
 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).
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.
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.Dim oWPoints As WorkPoints
Set oWPoints = oDoc.ComponentDefinition.WorkPoints
Dim oWPt As WorkPoint
Set oWPt = oWPoints.AddFixed(oCara.Edges.Item(1).Geometry.Center) 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)