5285x
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 de servicio web usando el ejemplo de VBA

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

<Sobre xmlns = "http://schemas.xmlsoap.org/soap/envelope/">
<Cuerpo>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>
</sobre>

Un elemento típico del formato XML es el inicio de una sección con el carácter "<". A esto le sigue un identificador y, si no hay más elementos subordinados, la sección termina con "/>". Un ejemplo es la tercera línea:

<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>

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

<Cuerpo>
<get_active_model xmlns = "http://www.dlubal.com/rfem.xsd"/>
</Body>

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 un 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 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 de modo 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í:

<? xml version = "1.0"?>
<Sobre xmlns: soap = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns: soap-enc = "http://schemas.xmlsoap.org/soap/encoding/"
xmlns: xsd = "http://www.w3.org/2001/XMLSchema"
xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance">
<jabón: Cuerpo>
<n1: get_active_modelResponse
xmlns: n1 = "http://www.dlubal.com/rfem.xsd">
<valor>
http://127.0.0.1:8082/
</valor>
</n1: get_active_modelResponse>
</soap: Body>
</soap: Sobre>

Los detalles adicionales de la sección "Sobre" así como la línea anterior "<? xml version =" 1.0 "?>" debería mostrar primero los estándares utilizados y no se discutirá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 en "Cuerpo" con el nombre de comando "get_active_model" y la palabra "Respuesta" adjunta. El contenido de esta respuesta es un "valor", es decir, la dirección del modelo activo. Además, RFEM ahora está bloqueado para un mayor acceso.

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:

solicitud como MSXML2.XMLHTTP60
respuesta como MSXML2.DOMDocument

El objeto XMLHTTP60 tiene una función incorporada para enviar una solicitud HTTP a una URL y, por lo tanto, se usa para la solicitud. Luego, la respuesta se puede evaluar usando DOMDocument. El siguiente ejemplo combina la solicitud "get_active_model" mostrada anteriormente con los comandos usados en VBA:

"obtener la URL del modelo activo con el comando" get_active_model "
str_envelope =
"<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<get_active_model xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
"</Body>" & _
"</Envelope>"

'abrir solicitud y enviarla
request.Open "Publicar", "http://localhost: 8081/", Falso
request.Send (str_envelope)

'obtener respuesta y transformarla en un objeto xml
response.LoadXML (request.responseText)

Primero, la solicitud se guarda en formato XML en la variable "str_envelope" y la solicitud se abre en RFEM utilizando el método "Open" de la variable "request". El contenido de la variable "str_envelope" ahora se puede enviar utilizando el método "Enviar". A continuación, 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 "respuesta".

La variable "respuesta" del 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 esté disponible la dirección URL del modelo:

'obtener estado de http
status = request.status
Si el estado <> "200", entonces
MsgBox "get_active_model: El envío no se ha realizado correctamente - "& response.Text
Exit Sub
End If

url_model = response.GetElementsByTagName ("valor") (0) .Text

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 "correcta". Después de esta consulta, la URL del modelo se guarda en la cadena url_model. Para ello, 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 ninguna evaluación con el identificador "valor", pero se tratan 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 "valor" es correcto aquí.

Ejemplo práctico en VBA

Ahora que conocemos todos los elementos básicos, sigue un ejemplo sencillo. Queremos crear una viga en dos pilares a los que se pueda aplicar una carga en la barra.

Primero, se definen e inicializan las variables descritas anteriormente:

'definir variables
Solicitud de atenuación como MSXML2.XMLHTTP60
Atenuar la respuesta como MSXML2.DOMDocument60

Dim str_envelope como cadena
Atenuar url_app como cadena
Atenuar url_model como cadena

'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: conjunto de filas" "" & _
"xmlns =" "http://www.dlubal.com/rfem.xsd" ""
Terminar con

url_app = "http://localhost: 8081/"

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, se pueden transferir las especificaciones conocidas del protocolo SOAP 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 ingresar la dirección predeterminada "http://localhost: 8081/".

El siguiente paso es probar la conexión a la aplicación. Para esta prueba, se consulta la información estándar de la aplicación utilizando el comando "get_information":

"comprobar la URL de la aplicación con el comando" get_information "
str_envelope = "<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<get_information xmlns =" "http://www.dlubal.com/rfem.xsd" "/>" & _
"</Body>" & _
"</Envelope>"

'abrir solicitud y enviarla
request.Open "Publicar", url_app, False
request.Send (str_envelope)

'obtener respuesta y transformarla en un objeto xml
response.LoadXML (request.responseText)

'obtener estado de http
status = request.Status
Si el estado <> "200", entonces
MsgBox "get_information: El envío no se ha realizado correctamente - "& response.Text
Exit Sub
End If

'leer información de la aplicación
Dim str1 como cadena
str1 = ""
str1 = str1 & response.GetElementsByTagName ("nombre") (0) .Text & vbLf
str1 = str1 & response.GetElementsByTagName ("tipo") (0) .Text & vbLf
str1 = str1 & response.GetElementsByTagName ("versión") (0) .Text & vbLf
str1 = str1 & response.GetElementsByTagName ("language_name") (0) .Text & vbLf
str1 = str1 & response.GetElementsByTagName ("language_id") (0) .Text

MsgBox str1, vbInformation, "Respuesta a" "solicitud de get_information"

Como ya se describió en la primera parte, la solicitud en formato XML se prepara y se guarda en "str_envelope". "request.Open" abre la conexión a la aplicación. La palabra clave "Publicar" significa 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 "respuesta" y se verifica con "request.Status" para ver si la solicitud se ha realizado correctamente. RFEM asigna el estado para que devuelva un error en el caso de una solicitud incorrecta; por ejemplo, un comando desconocido. Si el estado no es "200", el programa se aborta y el error se muestra en una ventana (MsgBox).

Si no se han producido errores, ahora se pueden leer las distintas 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 instalar una viga en dos pilares con una carga en la barra, se requieren las siguientes funciones:

  1. Nodo - set_node
  2. Línea - set_line
  3. Material - set_material
  4. Sección - set_section
  5. Miembro - set_member
  6. Soporte en nudos - set_nodal_support
  7. Parámetros de cálculo - set_static_analysis_settings
  8. Caso de carga - set_load_case
  9. Carga de barra - set_member_load

Como la mayoría de los demás, la función "set_node" tiene muchos parámetros, pero normalmente no son necesarios. En la lista de comandos ya mencionada del modelo de RFEM, puede ver la variedad de parámetros. Sobre todo son importantes los parámetros que no están marcados como "opcionales", ya que se deben completar en cada caso. En el ejemplo, se transfieren los siguientes parámetros:

begin_modification (url_model)

'establece el nodo 1 en [0,0,0] con el comando "set_node"
str_envelope =
"<Sobre xmlns =" "http://schemas.xmlsoap.org/soap/envelope/" ">" & _
"<Cuerpo>" & _
"<set_node xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<tipo> TYPE_STANDARD </type>" & _
"<coordinate_1> 0 </coordinate_1>" & _
"<coordinate_2> 0 </coordinate_2>" & _
"<coordinate_3> 0 </coordinate_3>" & _
"</valor>" & _
"</set_node>" & _
"</Body>" & _
"</Envelope>"

Solo el número de nudo no es opcional; el resto se puede asignar, pero no es necesario. Además de los posibles parámetros, la lista de comandos también muestra listados 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 ubicación (0; 0; 0), el segundo nudo en (5.5; 0; 0). Los valores para los números decimales son los siguientes:

...
"<valor xmlns =" "" ">" & _
"<no> 2 </no>" & _
"<tipo> TYPE_STANDARD </type>" & _
"<coordinate_1> 5.5 </coordinate_1>" & _
"<coordinate_2> 0 </coordinate_2>" & _
"<coordinate_3> 0 </coordinate_3>" & _
"</valor>" & _
...

Las listas son otra característica especial. La línea necesita dos nudos de los cuales se pueden transferir los números como una lista. Los elementos de una lista, como "definition_nodes", están separados por espacios:

...
"<set_line xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<tipo> TYPE_POLYLINE </type>" & _
"<definition_nodes> 1 2 </definition_nodes>" & _
"</valor>" & _
"</set_line>" & _
...

Para poder crear la barra, se debe crear una sección, que a su vez requiere un material. Se pueden usar secciones y materiales 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":

...
"<set_section xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<material> 1 </material>" & _
"<tipo> TYPE_STANDARDIZED_STEEL </type>" & _
"<nombre> IPE 300 </nombre>" & _
"</valor>" & _
"</set_section>" & _
...

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 utiliza para la transferencia:

...
"<set_nodal_support xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<nodos> 1 </nodos>" & _
"<spring_x> INF </spring_x>" & _
"<spring_y> INF </spring_y>" & _
"<spring_z> INF </spring_z>" & _
"<restracción_rotacional_x> INF </marque_rotacional_x>" & _
"<restracción_rotacional_y> 0 </ajuste_rotacional_y>" & _
"<rotational_restraint_z> INF </rotational_restraint_z>" & _
"</valor>" & _
"</set_nodal_support>" & _
...

La creación del caso de carga y los parámetros de cálculo no requiere ningún conocimiento adicional. La última particularidad es un valor adicional a la hora de crear la carga, ya que se debe especificar fuera del área "<valor>". En el caso de una carga en barra, se debe transferir el caso de carga correspondiente:

...
"<set_member_load xmlns =" "http://www.dlubal.com/rfem.xsd" ">" & _
"<load_case_no xmlns =" "" "> 1 </load_case_no>" & _
"<valor xmlns =" "" ">" & _
"<no> 1 </no>" & _
"<load_type> LOAD_TYPE_FORCE </load_type>" & _
"<miembros> 1 </miembros>" & _
"<load_distribution> LOAD_DISTRIBUTION_UNIFORM </load_distribution>" & _
"<load_direction> LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE </load_direction>" & _
"<magnitud> 1000 </magnitud>" & _
"</valor>" & _
"</set_member_load>" & _
...

Además, se debe mencionar que el orden de los elementos dentro del área de "valor" es irrelevante, pero fuera de ella no lo es. Por lo tanto, el caso de carga especificado debe ir antes del área de "valor".

Además de las funciones anteriores para la creación y exportación de datos, hay dos funciones especiales que se mostrarán aquí. Si se transfieren elementos al programa, el programa pasa automáticamente al modo "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 "begin_modification" antes de crear el primer nudo y "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 con más detalle aquí. Una comparación interesante es aquella con y sin el uso de estas funciones, lo que siempre resultará en una diferencia de velocidad.

Resumen

La API del servicio web es una herramienta potente para RFEM y RSTAB. La simple transferencia 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