Fundamentos de la API de Webservice con el ejemplo de VBA
Se utiliza el formato XML según las especificaciones del protocolo SOAP para la formateo de la cadena de texto. El siguiente ejemplo sirve como una consulta:
<Body>
</Body>
Un elemento típico del formateo XML es el inicio de una sección con el símbolo "<". Posteriormente se sigue con un identificador y, si no hay otros elementos secundarios, la sección se cierra con "/>". Un ejemplo es la tercera línea:
Cuando hay subelementos, se comienza con "<", el comando y ">"; el cierre consiste de "</", el comando y ">". El ejemplo apropiado es la sección "Body":
<Body>
</Body>
El formateo con espacios y saltos de línea aquí sólo sirve para ilustrar y no es necesario para la transferencia. Los elementos "Body" y "Envelope" son elementos estándares para la transmisión y se utilizan en cada comando.
Todos los comandos disponibles pueden ser leídos utilizando la interfaz WSDL. Hay software que puede proporcionar listas a partir de ellos. Un ejemplo de dicho software es SoapUI. Para la API de RFEM 6 hay dos listas: una para los comandos aplicables en la aplicación y otra para los comandos del modelo. Ambas listas pueden descargarse al final de este artículo.
Dado que los comandos se envían a través de HTTP, se requieren direcciones URL para dirigirlos. La dirección estándar de las aplicaciones RSTAB/RFEM es "localhost:8081" y puede modificarse en la configuración del programa.
Los modelos abiertos reciben direcciones en orden ascendente, por lo que el primer modelo abierto tiene la dirección "localhost:8082". Para obtener la dirección del modelo activo se envía el comando "get_active_model". Una respuesta correspondiente de RFEM 6 podría verse así:
http://127.0.0.1:8082/
Los detalles adicionales en la sección "Envelope" (en español: Sobre o Sobrecarta) así como la línea inicial "<?xml version="1.0"?>" pretenden mostrar los estándares utilizados y no serán discutidos más aquí. En cualquier caso, se puede reconocer que se utilizan nuevamente los elementos "Envelope" y "Body". Dentro de "Body" se encuentra la respuesta de RFEM 6 con el nombre del comando "get_active_model" y la palabreja "Response" adjunta. El contenido de esta respuesta es un valor ("value"), concretamente la dirección del modelo activo. Además, a partir de este momento RFEM se bloqueará para concretar accesos futuros.
En el siguiente ejemplo se va a crear una barra con dos apoyos de nodos y una carga. Para comunicarse con RFEM a través de VBA, se requieren los siguientes objetos:
request As MSXML2.XMLHTTP60
response As MSXML2.DOMDocument
El objeto XMLHTTP60 tiene una función integrada para enviar una solicitud HTTP a una URL y por lo tanto se utiliza para la solicitud. La respuesta puede luego ser evaluada mediante el DOMDocument. El siguiente ejemplo combina la solicitud "get_active_model" mostrada anteriormente con los comandos utilizados en VBA:
' get active model url with "get_active_model" command
str_envelope =
"" & _
" <Body>" & _
" " & _
" </Body>" & _
" "
' open request and send it
request.Open "Post", "http://localhost:8081/", False
request.Send (str_envelope)
' get response and transform it to an xml-object
response.LoadXML (request.responseText)
Primero, la solicitud en formato XML es almacenada en la variable "str_envelope" y a través del método "Open" de la variable "request" la solicitud se abre para RFEM. A través del método "Send" ahora puede enviarse el contenido de la variable "str_envelope". La respuesta puede luego ser obtenida a través del método "ResponseText". En el caso concreto, ésta se lee directamente con el método "LoadXML" de la variable "response".
La variable "response" de tipo DOMDocuments tiene el método LoadXML y puede por tanto reconocer el formato XML. La ventaja es que el tipo DOMDocuments también proporciona el método GetElementsByTagName. Esto permite extraer directamente elementos del código. A continuación, se amplía el código anterior de manera que la dirección URL del modelo esté disponible:
' get http-status
status = request.status
If status <> "200" Then
MsgBox "get_active_model: Sending not successful - " & response.Text
Exit Sub
End If
url_model = response.GetElementsByTagName("value")(0).Text
Antes de leer la URL, aún puede verificarse el estado de la respuesta. Se trata de códigos de estado HTTP estandarizados. El estado "200" significa que la transferencia fue "OK". Tras esta verificación, la URL del modelo se guarda en la cadena de texto url_model. Para ello, se busca el elemento "value" en la respuesta XML. Si una respuesta contiene varios elementos, todos los valores dentro de la sección "value" se almacenan de forma que aquí no es posible una evaluación por el identificador "value", sino que se debe involucrar a los subelementos de "value". Más sobre esto en el ejemplo práctico. En el caso de la dirección del modelo, el único valor devuelto es la URL, por lo que "value" es suficiente aquí.
Ejemplo práctico en VBA
Ya que ahora se conocen todos los elementos básicos, sigue un ejemplo sencillo. Se debe crear una viga sobre dos soportes en los que se puede aplicar una carga de barra.
Primero se definen e inicializan las variables ya presentadas:
' define variables
Dim request As MSXML2.XMLHTTP60
Dim response As MSXML2.DOMDocument60
Dim str_envelope As String
Dim url_app As String
Dim url_model As String
' init variables
Set request = New MSXML2.XMLHTTP60
Set response = New MSXML2.DOMDocument60
With response
.async = False
.preserveWhiteSpace = False
.validateOnParse = False
.resolveExternals = False
' Use full XPath functionality
.SetProperty "SelectionLanguage", "XPath"
' Add specific Namespaces to work with Paths
.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"" "
End With
url_app = "http://localhost:8081/"
Además de las variables "request" y "response" se crean las cadenas de texto "str_envelope" para la solicitud y "url_app" y "url_model" para las direcciones de la aplicación y el modelo. En la inicialización pueden proporcionarse especificaciones conocidas del protocolo SOAP para evaluar el formato XML de la respuesta. La dirección del modelo se obtendrá más tarde, pero es necesario proporcionar la dirección de la aplicación. Como se ha mencionado anteriormente, se debe indicar la dirección estándar:
En el siguiente paso debe verificarse la conexión con la aplicación. Para esta verificación se solicitarán las informaciones estándar de la aplicación utilizando el comando "get_information":
' check application url with command "get_information"
str_envelope = "" & _
" " & _
" "
' open request and send it
request.Open "Post", url_app, False
request.Send (str_envelope)
' get response and transform it to an xml-object
response.LoadXML (request.responseText)
' get http-status
status = request.Status
If status <> "200" Then
MsgBox "get_information: Sending not successful - " & response.Text
Exit Sub
End If
' read application information
Dim str1 As String
str1 = ""
str1 = str1 & response.GetElementsByTagName("name")(0).Text & vbLf
str1 = str1 & response.GetElementsByTagName("type")(0).Text & vbLf
str1 = str1 & response.GetElementsByTagName("version")(0).Text & vbLf
str1 = str1 & response.GetElementsByTagName("language_name")(0).Text & vbLf
str1 = str1 & response.GetElementsByTagName("language_id")(0).Text
MsgBox str1, vbInformation, "Response to ""get_information"" request"
Como se describió en la primera parte, primero se prepara la solicitud formateada en XML y se almacena en "str_envelope". "request.Open" abre la conexión a la aplicación. La palabra clave "Post" representa enviar la solicitud. El tercer parámetro se establece en "true" permitiendo así una transferencias sincronizadas. Posteriormente, "request.Send" envía la cadena de texto preparada.
Tras la transferencia, la respuesta se guarda en "response" y se verifica con "request.Status" si la solicitud fue exitosa. El estado es asignado por RFEM, de modo que en caso de una solicitud errónea, como un comando desconocido, devuelve un error. Si el estado no es "200", el programa se detiene y el error se muestra en una ventana (MsgBox).
Si no se producen errores, ahora pueden leerse las diversas informaciones transferidas mediante "GetElementsByTagName". En el ejemplo concreto, se muestran entonces las informaciones en una ventana.
Los siguientes elementos son muy similares, por lo que sólo se harán comentarios sobre peculiaridades (el código fuente completo está disponible para descargar). Para construir una viga sobre dos soportes con una carga de barra se necesitan las siguientes funciones:
- Nodo – set_node
- Línea – set_line
- Material – set_material
- Sección – set_section
- Barra – set_member
- Soporte de nodos – set_nodal_support
- Parámetros de cálculo – set_static_analysis_settings
- Caso de carga – set_load_case
- Carga de barra – set_member_load
La función "set_node" tiene, como la mayoría de las otras, muchos parámetros, que normalmente no se necesitan. En la lista de comandos del modelo RFEM ya mencionada, puede observarse la variedad de los parámetros. Son especialmente importantes los parámetros que no tienen la mención "opcional", ya que estos deben rellenarse necesariamente. En el ejemplo se pasan los siguientes parámetros:
begin_modification (url_model)
' set node 1 on [0,0,0] with "set_node" command
str_envelope =
"" & _
"<Body>" & _
"" & _
"" & _
"1 " & _
"TYPE_STANDARD " & _
"0 " & _
"0 " & _
"0 " & _
" " & _
" " & _
"</Body>>" & _
" "
Lo único que no es opcional aquí es el número de nodo y el resto se puede asignar. En la lista de comandos se muestran listados de tipos además de los posibles parámetros. En el caso concreto, actualmente existen cinco tipos diferentes posibles. Se eligió el tipo estándar "TYPE_STANDARD". El primer nodo mostrado aquí se crea en la ubicación (0;0;0), el segundo nodo en (5,5;0;0). Los valores de punto decimal se presentan así:
…
"" & _
"2 " & _
"TYPE_STANDARD " & _
"5.5 " & _
"0 " & _
"0 " & _
" " & _
…
Una particularidad son las listas. La línea necesita dos nodos, cuyos números pueden pasarse como lista. Los elementos de una lista, como "definition_nodes", se separan con espacios:
…
"" & _
"" & _
"1 " & _
"TYPE_POLYLINE " & _
"1 2 " & _
" " & _
" " & _
…
Para poder crear la barra, aún se debe asignar una sección, la cual a su vez requiere un material. Se pueden usar secciones y materiales de la base de datos interna. Por lo tanto, basta con proporcionar un identificador conocido. Para el material, el identificador es "S235" y la sección tiene el nombre "IPE 300":
…
"" & _
"" & _
"1 " & _
"1 " & _
"TYPE_STANDARDIZED_STEEL " & _
"IPE 300 " & _
" " & _
" " & _
…
Para verificar si un nombre como "IPE 300" es válido, se puede utilizar la entrada en la interfaz gráfica.
Para entrar en la barra en sí no se necesitan conocimientos adicionales, pero para introducir un soporte fijo se debe definir una rigidez de resorte "infinita". Para la transferencia se utiliza la palabra clave "INF":
…
"" & _
"" & _
"1 " & _
"1 " & _
"INF " & _
"INF " & _
"INF " & _
"INF " & _
"0 " & _
"INF " & _
" " & _
" " & _
…
El establecimiento del caso de carga y los parámetros de cálculo no requiere conocimientos adicionales. La última peculiaridad es un valor adicional al establecer la carga, ya que debe especificarse fuera del área "
…
"
Base de datos de conocimientos