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.