En las versiones más recientes de Autodesk Inventor es posible integrar la gestión de los eventos de interacción dentro de los procedimientos del mismo formulario. Aquà presentamos una versión de la misma aplicación desarrollada en capÃtulos anteriores en que se aprovecha esto prescindiendo del módulo de clase. En este caso también exploraremos la posibilidad de utilizar el formulario en manera "no modal", es decir, que se permita al usuario actuar fuera del formulario, sin necesidad de ocultarlo como hemos hecho hasta ahora.
Mostrar el formulario como No Modal.
Para mostrar el formulario como no modal emplearemos el argumento opcional vbModeless del método Show. Según esto, el código de la macro quedarÃa como sigue:
Sub MatrizAgujeros2011()
   If ThisApplication.ActiveDocument Is Nothing Then
       MsgBox "Debe haber un documento activo", vbCritical
   ElseIf ThisApplication.ActiveDocument.DocumentType = kPartDocumentObject Then
       frmMatrizAg.Show vbModeless
   Else
       MsgBox "El documento activo debe ser un documento de Parte(IPT)", vbExclamation
   End If
End Sub
Evento Initialize: Crear el objeto InteractionEvents.
Como veremos, el código que en los ejercicios anteriores estaban agrupados en un módulo de clase ahora se distribuyen en los procedimientos de respuesta a varios eventos del formulario. En respuesta al evento Initialize debemos crear el objeto InteractionEvents y conectar a los eventos de selección (
SelectEvents) asociados. Además estableceremos el filtro que asegure la selección de caras (
kPartFaceFilter) y para detener la selección cuando sea seleccionado el primer objeto estableceremos la propiedad booleana
SingleSelectEnabled de los
SelectEvents en
True.
Private Sub UserForm_Initialize()
   Set oDoc = ThisApplication.ActiveDocument
   Set oUOM = oDoc.UnitsOfMeasure
   ' Crear el objeto InteractionEvents
   Set oInteracc = ThisApplication.CommandManager.CreateInteractionEvents
   ' Conectar a los eventos de selección asociados
   Set oSelecc = oInteracc.SelectEvents
   ' Establecer el filtro de selección
   oSelecc.AddSelectionFilter kPartFaceFilter
   ' Establecer la selección única
   oSelecc.SingleSelectEnabled = True
   ' Establecer el mensaje a presentar en la lÃnea de estado
   oInteracc.StatusBarText = "Seleccione una cara."
End Sub
En el evento Initialize también creamos las referencias al objeto documento (
oDoc) y al objeto UnitsOfMeasure (
oUOM).
Evento Click del botón cmdSeleccionar.
Ahora al hacer clic sobre el botón cmdSeleccionar iniciaremos la interacción. El código para este evento se limita a ejecutar el método Start de los InteractionEvents:
Private Sub cmdSeleccionar_Click()
   ' Iniciar la interacción
   oInteracc.Start
End Sub
En la versión anterior de este ejercicio esperábamos a que se produjera la selección e inmediatamente llenábamos los cuadros de texto con los valores predeterminados. Esa funcionalidad ahora se traslada al evento OnSelect del objeto SelectEvents. Para crear la plantilla para el procedimiento de respuesta a este evento seleccionamos el objeto oSelecc en la lista desplegable izquierda del editor y el evento OnSelect en la ventana derecha. Esto nos crea el procedimiento oSelecc_OnSelect, que incluye el parámetro JustSelectedEntities, un ObjectsEnumerator que contiene las caras seleccionadas. Como hemos establecido previamente que la propiedad SingleSelectEnabled es True, sabemos que este conjunto de selección sólo contendrá un objeto Face.
Figura 1. Creación de la plantilla para el procedimiento de respuesta al evento OnSelect.
El código completo para este procedimiento se muestra a continuación.
Private Sub oSelecc_OnSelect(ByVal JustSelectedEntities As ObjectsEnumerator, _
                           ByVal SelectionDevice As SelectionDeviceEnum, _
                           ByVal ModelPosition As Point, _
                           ByVal ViewPosition As Point2d, _
                           ByVal View As View)
 Set oCara = JustSelectedEntities.Item(1)
 If oCara Is Nothing Then
   lblInfo.Caption = "Nada ha sido seleccionado"
 Else
   If oCara.Edges.Count = 1 And _
      oCara.Edges.Item(1).CurveType = kCircleCurve Then
      txtCant.Enabled = True
      lblCant.Enabled = True
      txtRad.Enabled = True
      lblRad.Enabled = True
      txtDiam.Enabled = True
      lblDiam.Enabled = True
      txtProf.Enabled = True
      lblProf.Enabled = True
          Â
      Dim dblRadio As Double
      Dim dblRadMat As Double
      Dim dblDiam As Double
      ' se establecen valores por defecto calculados a partir
      ' de las dimensiones de la cara.
      txtCant.Value = 6
      dblRadio = oCara.Edges.Item(1).Geometry.Radius
      dblRadMat = dblRadio * 2 / 3
      dblDiam = 3.1416 * dblRadMat / 6
      If dblDiam > 1 Then
         dblDiam = Fix(dblDiam)
      End If
      txtRad.Text = oUOM.GetStringFromValue(dblRadMat, _
                    kDefaultDisplayLengthUnits)
      txtDiam.Text = oUOM.GetStringFromValue(dblDiam, _
                    kDefaultDisplayLengthUnits)
      txtProf.Text = oUOM.GetStringFromValue(dblDiam * 2, _
                    kDefaultDisplayLengthUnits)
          Â
      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) & ")"
             Â
      lblInfo.ForeColor = vbBlack
      txtRad.ForeColor = vbBlack
      txtDiam.ForeColor = vbBlack
      txtProf.ForeColor = vbBlack
      cmdConfirmar.Enabled = True
   Else
      lblInfo.ForeColor = vbRed
      lblInfo.Caption = "ERROR: Debe seleccionar una cara plana circular"
      cmdConfirmar.Enabled = False
   End If
 End If
End Sub
De ahà en adelante el código es igual a lo expuesto en los capÃtulos anteriores. Es interesante el dinamismo que se obtiene al emplear el formulario a la manera no modal, ya que sin cerrar la ventana podemos aplicar la transformación a varias caras circulares sucesivamente.
El proyecto completo puede descargarse desde el enlace situado al final de la página.