7235x
001738
2022-03-23

Servicio web API en el tutorial de VBA

El servicio web es una comunicación entre máquinas y programas. Esta comunicación se proporciona a través de la red y, por lo tanto, puede ser utilizada por cualquier programa que pueda enviar y recibir cadenas de caracteres a través del protocolo HTTP. RFEM 6 y RSTAB 9 proporcionan una interfaz basada en estos servicios web multiplataforma. Este tutorial muestra los conceptos básicos utilizando el lenguaje de programación VBA.

Conceptos básicos de la API del servicio web utilizando el ejemplo de VBA

Para el formato de la cadena, se utiliza el formato XML según las especificaciones del protocolo SOAP. La siguiente consulta sirve como ejemplo:

  1. código.vba#

http://schemas.xmlsoap.org/soap/envelope/"> #/code#

Un elemento típico del formato XML es el inicio de una sección con el carácter "<". Luego, sigue un identificador y, si no hay otros subelementos presentes, la sección se cierra con "/>". Un ejemplo es la tercera línea:

  1. código.vba#

http://www.dlubal.com/rfem.xsd"/> #/code#

Si hay subelementos, comienza con "<", el comando y ">" y termina con "". El ejemplo apropiado es la sección "Cuerpo":

  1. código.vba#

#/code# El formato con espacios y saltos de línea se usa aquí solo con fines ilustrativos. Esto no es necesario para la transferencia. Los elementos "Cuerpo" y "Envolvente" son elementos estándar para la transferencia y se utilizan para cada comando. Todos los comandos disponibles se pueden leer utilizando la interfaz WSDL. Hay software disponible que se puede usar para crear listas. Un ejemplo de este tipo de software es SoapUI. Hay dos listas para la API de RFEM 6; los comandos para la aplicación y los del modelo. Ambas listas se pueden descargar al final de este artículo. Dado que los comandos se envían a través de HTTP, se requieren direcciones URL para el direccionamiento. La dirección predeterminada de las aplicaciones de RSTAB/RFEM es "http://localhost:8081/" y se puede cambiar en la configuración del programa. A los modelos abiertos se les asignan direcciones en orden ascendente para que el primer modelo abierto tenga la dirección "http://localhost:8082/". Para obtener la dirección del modelo activo, se envía el comando "get_active_model". Una respuesta correspondiente de RFEM 6 se ve así: #código.vba# http://127.0.0.1:8082/ #/code# Los detalles adicionales de la sección "Envolvente" así como la línea anterior "" debería mostrar primero las normas utilizadas y no se tratarán más aquí. En cualquier caso, puede ver que los elementos "Envolvente" y "Cuerpo" se utilizan de nuevo. La respuesta de RFEM 6 está contenida dentro del "Cuerpo" por el nombre del comando "get_active_model" y la palabra "Response" añadida. El contenido de esta respuesta es un "valor", es decir, la dirección del modelo activo. Además, RFEM ahora está bloqueado para un acceso posterior. En el siguiente ejemplo, queremos crear una barra con dos apoyos en nudos y una carga. Para poder comunicarse con RFEM a través de VBA, se requieren los siguientes objetos: #código.vba# solicitud como MSXML2.XMLHTTP60 respuesta como MSXML2.DOMDocument #/code# El objeto XMLHTTP60 tiene una función integrada para enviar una solicitud HTTP a una URL y, por lo tanto, se usa para la solicitud. La respuesta se puede evaluar utilizando el DOMDocument. El siguiente ejemplo combina la solicitud "get_active_model" mostrada anteriormente con los comandos utilizados en VBA: #código.vba# ' obtener la URL del modelo activo con el comando "get_active_model" str_envelope = "" & _ " " & _ " " & _ " " & _ "" ' abrir solicitud y enviarla solicitud.Abrir "Publicar", "http://localhost:8081/", Falso solicitud.Enviar (str_envelope) ' obtiene la respuesta y la transforma en un objeto xml respuesta.LoadXML (solicitud.responseText) #/code# Primero, la solicitud se guarda en formato XML en la variable "str_envelope" y la solicitud se abre en RFEM utilizando el método "Abrir" de la variable "solicitud". El contenido de la variable "str_envelope" ahora se puede enviar utilizando el método "Enviar". Se puede acceder a la respuesta utilizando el método "ResponseText". En este caso específico, esto se importa directamente a través del método "LoadXML" de la variable "response". La variable "Respuesta" de tipo DOMDocuments tiene el método LoadXML y, por lo tanto, puede reconocer el formato XML. La ventaja es que el tipo DOMDocuments también proporciona el método GetElementsByTagName. Esto le permite extraer elementos directamente del código. A continuación, se amplía el código anterior para que la dirección URL del modelo esté disponible: #código.vba# ' obtener http-status status = request.status Si el estado <> "200" Entonces MsgBox "get_active_model: El envío no se ha realizado correctamente - " & answer.Text Exit Sub End If url_model = respuesta.GetElementsByTagName("valor"))(0).Text #/code# Antes de leer la URL, se puede comprobar el estado de la respuesta. Son códigos de estado HTTP estandarizados. El estado "200" significa que la transferencia fue "OK". Después de esta consulta, la URL del modelo se guarda en la cadena url_model. Para esto, se busca el elemento "valor" en la respuesta XML. Si una respuesta contiene varios elementos, todos los valores se guardan dentro de la sección "Valor", de modo que no es posible una evaluación con el identificador "Valor", pero se abordan los subelementos de "Valor". Se proporcionará más información en el ejemplo práctico. En el caso de la dirección del modelo, el único valor devuelto es la URL, por lo que el "valor" es correcto aquí. == Ejemplo práctico en VBA == Ahora que conocemos todos los elementos básicos, sigue un ejemplo simple. Queremos crear una viga en dos pilares a los que se pueda aplicar una carga en barra.

Primero, se definen e inicializan las variables descritas anteriormente: #código.vba# ' definir variables Solicitud de atenuación como MSXML2.XMLHTTP60 Dim respuesta As MSXML2.DOMDocument60 Dim str_envelope como cadena Dim url_app como cadena Dim url_model As String ' variables de inicio Establecer solicitud = Nuevo MSXML2.XMLHTTP60 Establecer respuesta = Nuevo MSXML2.DOMDocument60 Con respuesta .async = Falso .preserveWhiteSpace=Falso .validateOnParse = Falso .resolveExternals=Falso ' Usar la funcionalidad completa de XPath .SetProperty "SelectionLanguage", "XPath" ' Agregar espacios de nombres específicos para trabajar con rutas .SetProperty "SelectionNamespaces", "xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"" " & _ "xmlns:xsd=""http://www.dlubal.com/rfem.xsd"" " & _ "xmlns:n1=""urn:schemas-microsoft-com:rowset"" " & _ "xmlns=""http://www.dlubal.com/rfem.xsd"" " Terminar con url_app="http://localhost:8081/" #/code# Además de las variables "solicitud" y "respuesta", se crea la cadena "str_envelope" para la solicitud y "url_app" y "url_model" para las direcciones de la aplicación y el modelo. Durante la inicialización, las especificaciones conocidas del protocolo SOAP se pueden transferir para evaluar el formato XML de la respuesta. La dirección del modelo se tomará más tarde, pero se debe especificar la dirección de la aplicación. Como ya se mencionó, se debe introducir la dirección predeterminada "http://localhost:8081/". El siguiente paso es probar la conexión con la aplicación. Para esta prueba, se consulta la información estándar de la aplicación utilizando el comando "get_information": #código.vba# ' compruebe la URL de la aplicación con el comando "get_information" str_envelope = "" & _ " " & _ "" ' abrir solicitud y enviarla solicitud.Abrir "Publicar", url_app, Falso solicitud.Enviar (str_envelope) ' obtiene la respuesta y la transforma en un objeto xml respuesta.LoadXML (solicitud.responseText) ' obtener http-status estado = solicitud.Estado Si el estado <> "200" Entonces MsgBox "get_information: El envío no se ha realizado correctamente - " & answer.Text Exit Sub End If ' leer información de la aplicación Dim str1 como cadena str1 = "" str1 = str1 & respuesta.GetElementsByTagName("nombre"))(0).Text & vbLf str1 = str1 & respuesta.GetElementsByTagName("tipo"))(0).Text & vbLf str1 = str1 & response.GetElementsByTagName("version"))(0).Text & vbLf str1 = str1 & respuesta.GetElementsByTagName("language_name"))(0).Text & vbLf str1 = str1 & response.GetElementsByTagName("language_id") (0).Text MsgBox str1, vbInformation, "Respuesta a la solicitud ""get_information""" #/code# Como ya se describió en la primera parte, la solicitud con formato XML se prepara y se guarda en "str_envelope". "request.Open" abre la conexión con la aplicación. La palabra clave "Post" representa el envío de la solicitud. El tercer parámetro se establece en "verdadero" y, por lo tanto, se realiza una transmisión síncrona. Finalmente, "request.Send" envía la cadena preparada. Después de la transferencia, la respuesta se guarda en "response" y se comprueba con "request.Status" si la solicitud se ha realizado correctamente. RFEM asigna el estado para que devuelva un error en caso de una solicitud incorrecta; por ejemplo, un comando desconocido. Si el estado no es "200", se cancela el programa y se muestra el error en una ventana (MsgBox). Si no se han producido errores, ahora se pueden leer las diversas informaciones transferidas utilizando "GetElementsByTagName". En el ejemplo específico, la información se muestra en una ventana. Los siguientes elementos son muy similares, por lo que solo se describen las características especiales (se puede descargar el código fuente completo). Para configurar una viga en dos pilares con una carga en barra, se requieren las siguientes funciones: # Nudo – set_node # Línea – set_line # Material – set_material # Sección – set_section # Barra – set_member # Apoyo en nudo – set_nodal_support # Parámetros de cálculo – set_static_analysis_settings # Caso de carga – set_load_case # Carga en barra – set_member_load Como la mayoría de las otras funciones, la función "set_node" tiene muchos parámetros, pero generalmente no son necesarios. En la lista de comandos ya mencionada del modelo de RFEM, puede ver la variedad de parámetros. Sobre todo, los parámetros que no están marcados como "opcionales" son importantes, ya que se deben completar en cada caso. En el ejemplo, se transfieren los siguientes parámetros: #código.vba# begin_modification (url_model) ' establecer el nudo 1 en [0,0,0] con el comando "set_node" str_envelope = "" & _ " " & _ " " & _ "" & _ "1" & _ "TYPE_STANDARD" & _ " 0 " & _ "0" & _ "0" & _ "" & _ " " & _ " >" & _ "" #/code# Solo el número de nudo no es opcional; el resto se puede asignar, pero no tiene que ser así. Además de los posibles parámetros, la lista de comandos también muestra listas de tipos. En este caso específico, actualmente son posibles cinco tipos diferentes. Se ha seleccionado el tipo predeterminado "TYPE_STANDARD". El primer nudo que se muestra aquí se crea en la posición (0; 0; 0), el segundo nudo en (5.5; 0; 0). Los valores para los números decimales son los siguientes: #código.vba# … "" & _ "2" & _ "TYPE_STANDARD" & _ "5.5" & _ "0" & _ "0" & _ "" & _ … #/code# Las listas son otra característica especial. La línea necesita dos nudos de los cuales los números se pueden transferir como una lista. Los elementos de una lista, como "definition_nodes", están separados por espacios: #código.vba# … "" & _ "" & _ "1" & _ "TYPE_POLYLINE" & _ "1 2" & _ "" & _ "" & _ … #/code# Para poder crear la barra, se debe crear una sección, que a su vez requiere un material. Las secciones y materiales se pueden utilizar desde la base de datos interna. Por lo tanto, es suficiente especificar un identificador conocido. Para el material, el identificador es "S235" y la sección tiene el nombre "IPE 300": #código.vba# … "" & _ "" & _ "1" & _ "1" & _ "TYPE_STANDARDIZED_STEEL" y _ "IPE 300" & _ "" & _ "" & _ … #/code# Para comprobar si un nombre como "IPE 300" es válido, puede utilizar la entrada en la interfaz gráfica de usuario. Para introducir la barra en sí, no se requieren más conocimientos, pero para introducir un apoyo fijo, tiene que definir una rigidez elástica "infinita". La palabra clave "INF" se usa para la transferencia: #código.vba# … "" & _ "" & _ "1" & _ "1" & _ "INF" & _ "INF" & _ "INF" & _ "INF" & _ "0" & _ "INF" & _ "" & _ "" & _ … #/code# La creación del caso de carga y los parámetros de cálculo no requieren ningún conocimiento adicional. La última peculiaridad es un valor adicional al crear la carga, porque se debe especificar fuera del área "". En el caso de una carga en barra, el caso de carga correspondiente se debe transferir allí: #código.vba# … "" & _ "1" & _ "" & _ "1" & _ "LOAD_TYPE_FORCE" & _ "1" & _ "LOAD_DISTRIBUTION_UNIFORM" & _ "LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE" & _ "1000" & _ "" & _ "" & _ … #/code# Además, se debe mencionar que el orden de los elementos dentro del área de "valor" es irrelevante, pero fuera no lo es. Por lo tanto, el caso de carga especificado debe estar antes del área de "valor". Además de las funciones anteriores para crear y exportar datos, hay dos funciones especiales que se mostrarán aquí. Si se transfieren elementos al programa, el programa entra automáticamente en un modo de "Modificación". El programa comprueba los nuevos elementos y los integra. Si se van a crear varios elementos nuevos, es útil dejar el programa en este modo de edición durante este tiempo, para que el procesamiento sea más rápido. Las funciones "begin_modification" y "finish_modification" están disponibles para este propósito. En el ejemplo, se llama a "begin_modification" antes de crear el primer nudo y se llama a "finish_modification" al final después de crear el caso de carga. Ambas funciones también se crearon como funciones de VBA en el programa. Las funciones son independientes y, por lo tanto, las variables "solicitud" y "respuesta" se crean de nuevo dentro de las funciones. Sin embargo, dado que no se requieren nuevos elementos para esto, no se describirán más aquí. Una comparación interesante es con y sin el uso de estas funciones, que siempre dará como resultado una diferencia de velocidad. == Conclusión == La API del servicio web es una herramienta potente para RFEM y RSTAB. La transferencia simple basada en HTTP permite que la interfaz se implemente en muchos lenguajes de programación, no solo en VBA como se muestra aquí, y es posible la programación multiplataforma.


Autor

El Sr. Günthel proporciona soporte técnico para los clientes de Dlubal Software y se ocupa de sus solicitudes.

Enlaces
Descargas


;