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 proyecto 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()   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:
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 dblRadMat As Double   Dim dblDiam As Double ' se calculan valores por defecto a partir de las dimensiones de la cara. ' el número de agujeros predeterminado será 6   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 IfAhora, 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. Antes de actualizar los datos debemos aactivar las casillas de texto y sus etiquetas identificadoras: txtCant.Enabled = TruetxtCant.Value = 6     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 DoubleDim dblCentroY As DoubledblCentroX = oCara.Edges.Item(1).Geometry.Center.XdblCentroY = oCara.Edges.Item(1).Geometry.Center.YlblInfo.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 IfMe.ShowEnd SubHabrá que tener en cuenta la diferencia entre las unidades visualizadas en los cuadros de texto y las internas del sistema para cuando se realicen cambios en dichas casillas. Para ello será necesario tener en cuenta la sucesión de eventos que se producen al entrar a editar uno de los cuadros, al cambiar los valores y al salir para editar otro cuadro o pulsar algún botón. Como ejemplo indicaremos los procedimientos de respuesta a dichos eventos para el botón cmdRadio. Evento Enter.Al entrar a editar la casilla de texto eliminaremos los caracteres " mm" del texto: Private Sub txtRadio_Enter()  txtRadio.Text = Left(txtRadio.Text, Len(txtRadio.Text) - 3)End SubEvento Change.Este evento se dispara cada vez que se hace un cambio en el texto de la casilla, carácter a carácter. Lo aprovechamos para advertir si se introduce algún valor ilegal (letras o números negativos). Observe que en caso de error se escribe un mensaje en color rojo en la etiqueta lblInfo. Private Sub txtRadio_Change()   If IsNumeric(txtRadio.Value) Then       txtRadio.ForeColor = vbBlack       If txtRadio.Value <= 0 Then           lblInfo.Caption = "El valor debe ser mayor que cero"           txtRadio.ForeColor = vbRed       End If   Else       lblInfo.Caption = "El valor debe ser numérico"       txtRadio.ForeColor = vbRed   End IfEnd SubEvento BeforeUpdate.Recurrimos al evento BeforeUpdate para evitar que se salga de la casilla habiendo insertado un valor erróneo. En este caso se recurre a detectar el error que se producirÃa en caso de que la expresión no fuera válida para detectar valores no numéricos. Establecer el argumento Cancel en True impide salir del cuadro que se está editando. Private Sub txtRadio_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)   Err.Clear   On Error Resume Next   If (oUOM.GetValueFromExpression(txtRadio, kDefaultDisplayLengthUnits) _       txtRadio.ForeColor = vbRed       lblInfo.Caption = "El valor debe ser un número mayor que cero"       Cancel = True   Else       txtRadio.ForeColor = vbBlack       lblInfo.Caption = ""       Cancel = False   End IfEnd SubEvento Exit.Este evento se produce al cambiar el foco a otro control del formulario. Este procedimiento actualiza la cadena de caracteres en el cuadro de texto y elimina cualquier mensaje de error en lblInfo. Private Sub txtRadio_Exit(ByVal Cancel As MSForms.ReturnBoolean)   txtRadio.Text = _   txtRadio.ForeColor = vbBlack   lblInfo.Caption = ""End SubComprobar Datos.Las dimensiones que introduzca el usuario pueden hacer que los agujeros queden situados total o parcialmente fuera de la cara, o que se solapen entre ellos. Aunque casi nunca esto provocarÃa un error de la aplicación, los resultados no serÃan los que se pretende alcanzar con la herramienta. Para evitar esto se ha incluÃdo en el formulario un botón para comprobar la coherencia de los datos. Solo cuando se comprueben los mismos se activará el botón Aplicar.Los datos a comprobar serán:
Private Sub cmdConfirmar_Click()   Dim strMsj As String   strMsj = ""   Dim dblDiaTotal As Double   dblDiaTotal = _       oUOM.GetValueFromExpression _       (2 * oUOM.GetValueFromExpression _   Dim dblDistCtr As Double   dblDistCtr = 2 * (oUOM.GetValueFromExpression _               Sin(3.1416 / frmMatrizAg.txtCant.Value))   Dim dblDiaAgujero As Double   dblDiaAgujero = oUOM.GetValueFromExpression _   If (dblDiaTotal > oCara.Edges.Item(1).Geometry.Radius * 2) Then           strMsj = "Los agujeros se saldrán de la pieza," & vbCrLf & _           "Diámetro externo de la matriz propuesta:" & _           oUOM.GetStringFromValue(dblDiaTotal, kDefaultDisplayLengthUnits) _"Diámetro de la Pieza: " & _   End If   If dblDistCtr <= dblDiaAgujero Then           strMsj = strMsj & vbCrLf & _           "Los agujeros se solaparán." & vbCrLf & "Datos:" & vbCrLf & _           "Distancia entre agujeros:" & dblDistCtr & vbCrLf & _           "Diámetro de los agujeros: " & frmMatrizAg.txtDiam.Text   End If   If strMsj = "" Then       cmdAceptar.Enabled = True   Else       cmdAceptar.Enabled = False   End If   lblInfo.Caption = strMsjEnd Sub |



