Autodesk Inventor‎ > ‎Autodesk Inventor VBA.‎ > ‎5. Proyecto de la Aplicación‎ > ‎

5.5. Interacción Integrada al Código del Formulario.

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.

Reinaldo Togores Fernández,
15 mar 2011, 13:05
v.1