8809x
001738
2025-06-09

Web Service API no tutorial VBA

O Webservice é uma comunicação entre máquinas e programas. Esta comunicação é fornecida através da rede e, portanto, pode ser utilizada por qualquer programa que possa enviar e receber strings através do protocolo HTTP. O RFEM 6 e o RSTAB 9 oferecem uma interface baseada nestes webservices multiplataforma. Este tutorial apresenta os fundamentos básicos utilizando a linguagem de programação VBA.

Fundamentos básicos da webservice API utilizando um exemplo da VBA

Para a formatação da string, é utilizado o formato XML conforme as especificações do protocolo SOAP. A questão seguinte serve como exemplo:


    <Body>
        
    </Body>

Um elemento típico da formatação XML é o início de uma seção com o caractere "<". Depois segue-se um identificador e, se não forem apresentados mais elementos subordinados, a seção é encerrada com "/>". Um exemplo é a terceira linha:

Quando existem subelementos, começa-se com "<", o comando e ">" e finaliza-se com "</", o comando e ">". O exemplo apropriado é a seção "Body":

<Body>
    
</Body>

A formatação com espaços em branco e quebras de linha são utilizados apenas para ilustração. Para a transmissão, isso não é necessário. Os elementos "Body" e "Envelope" são elementos padrão para a transferência e são usados para cada comando.

Todos os comandos disponíveis podem ser lidos usando a interface WSDL. Existem softwares que podem ser utilizados para criar listas. Um exemplo desse software é o SoapUI. Para a API do RFEM 6, existem duas listas, os comandos para a aplicação e os para o modelo. Ambas as listas podem ser descarregadas no final deste artigo.

Como os comandos são enviados via HTTP, são necessários endereços URL para comunicação. O endereço padrão das aplicações RSTAB/RFEM é "localhost:8081" e pode ser alterado nas configurações do programa.


São atribuídos enderessos aos modelos abertos de forma ascendente, de modo que o primeiro modelo aberto tem o endereço "localhost:8082".

Para obter o endereço do modelo ativo, é enviado o comando "get_active_model". Uma resposta correspondente do RFEM 6 assemelha-se ao seguinte:


    
        
            
                http://127.0.0.1:8082/
            
        
    

Os detalhes adicionais da seção "Envelope" (envelope), bem como da linha anterior "<?xml version="1.0"?>" devem em primeiro lugar apresebtar as normas utilizadas e não serão discutidos mais a fundo aqui. Em qualquer caso, é evidente que os elementos "Envelope" e "Body" são usados novamente. Dentro de "Body" está a resposta do RFEM 6 pelo nome do comando "get_active_model" e a palavra "Response" anexada. O conteúdo dessa resposta é um valor ("value") e, especificamente, o endereço do modelo ativo. Além disso, o RFEM agora está bloqueado para outros acessos.

No exemplo a seguir, pretende-se criar uma barra com dois apoios nodais e uma carga. Para se comunicar com o RFEM via VBA, são necessários os seguintes objetos:

request As MSXML2.XMLHTTP60
response As MSXML2.DOMDocument

O objeto XMLHTTP60 tem uma função integrada para enviar um pedido HTTP para um URL e, portanto, é usado para a solicitação. A resposta pode então ser avaliada usando o DOMDocument. O exemplo a seguir combina a solicitação "get_active_model" mostrada anteriormente com os comandos usados em VBA:

'   obter o URL do modelo ativo com o comando "get_active_model"
str_envelope = 
    "" & _
    "   <Body>" & _
    "       " & _
    "   </Body>" & _
    ""

'   abrir pedido e enviá-lo
request.Open "Post", "http://localhost:8081/", False
request.Send (str_envelope)

'   obter resposta e transformá-la em um objeto xml
response.LoadXML (request.responseText)

Primeiro, a solicitação no formato XML é armazenada na variável "str_envelope" e, através do método "Open", o pedido é aberto no RFEM. Com o método "Send", o conteúdo da variável "str_envelope" agora pode ser enviado. A resposta pode então ser obtida através do método "ResponseText". Neste caso específico, ela é importada diretamente pelo método "LoadXML" da variável "response".

A variável "response" do tipo DOMDocuments tem o método LoadXML e pode reconhecer a formatação XML. A vantagem é que o tipo DOMDocuments também oferece o método GetElementsByTagName. Isso permite a extração direta de elementos do código. A seguir, o código anterior será estendido para que o endereço URL do modelo fique disponível:

'   obter status http
status = request.status
If status <> "200" Then
    MsgBox "get_active_model: Envio sem sucesso - " & response.Text
    Exit Sub
End If

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

Antes de ler o URL, o estado da resposta pode ser verificado. Trata-se de códigos de estados HTTP padronizados. O estado "200" significa que a transferência foi "OK". Após essa verificação, a URL do modelo é armazenada na string url_model. Para isso, o elemento "value" é procurado na resposta XML. Se uma resposta contiver vários elementos, todos os valores são armazenados na seção "value", de modo que não é possível fazer uma avaliação com o identificador "value", mas sim os subelementos de "value" são abordados. Mais sobre isso no exemplo prático. No caso do endereço do modelo, o único valor retornado é o URL, de modo que "value" aqui leva ao sucesso.

Exemplo prático em VBA

Agora que todos os elementos básicos são conhecidos, segue um exemplo simples. Pretende-se criar uma viga em dois apoios sobre a qual uma carga de barra pode ser aplicada.

Primeiro, as variáveis descritas acima são definidas e inicializadas:

'   definir variáveis
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

'   iniciar variáveis
Set request = New MSXML2.XMLHTTP60

Set response = New MSXML2.DOMDocument60
With response
    .async = False
    .preserveWhiteSpace = False
    .validateOnParse = False
    .resolveExternals = False
    '   Utilizar funcionalidade completa do XPath
    .SetProperty "SelectionLanguage", "XPath"
    '   Adicionar Namespaces específicos para trabalhar com 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/"

Além das variáveis "request" e "response", é criada a string "str_envelope" para a solicitação e "url_app" e "url_model" para os endereços da aplicação e do modelo. Na inicialização, as especificações conhecidas do protocolo SOAP podem ser passadas para a avaliação da formatação XML da resposta. O endereço do modelo será obtido mais tarde, mas o endereço da aplicação deve ser especificado. Como mencionado anteriormente, o endereço definido por defeito deve ser introduzido:

No próximo passo, a conexão com a aplicação deve ser testada. Para este teste, a informação padrão da aplicação é requerida utilizando o comando "get_information":

'   verificar url da aplicação com o comando "get_information"
str_envelope = "" & _
                "   " & _
                ""

'   abrir pedido e enviá-lo
request.Open "Post", url_app, False
request.Send (str_envelope)

'   obter resposta e transformá-la em um objeto xml
response.LoadXML (request.responseText)

'   obter status http
status = request.Status
If status <> "200" Then
    MsgBox "get_information: Envio não bem-sucedido - " & response.Text
    Exit Sub
End If

'   ler informações da aplicação
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, "Resposta para o pedido ""get_information"""

Como descrito na primeira parte, a solicitação da formatação em XML é preparada e armazenada em "str_envelope". "request.Open" abre a ligação com a aplicação. A palavra-chave "Post" representa o envio da solicitação. O terceiro parâmetro está configurado como "true", o que faz com que uma transmissão síncrona seja realizada. Em seguida, "request.Send" envia a string preparada.

Após a transferência, a resposta é armazenada em "response" e verificada com "request.Status", se a solicitação foi bem-sucedida. O estado é atribuído pelo RFEM, é retornado um erro no caso de uma solicitação incorreta; por exemplo um comando desconhcido. Se o estado não for "200", o programa é interrompido e o erro é exibido em uma janela (MsgBox).

Se não existirem erros, é possível agora ler as diversas informações transferidas usando "GetElementsByTagName". No exemplo específico, as informações são apresentadas numa janela.

Os elementos seguintes têm muitas semelhanças, portanto, apenas funcionalidades especiais serão descritas (o código-fonte completo está disponível para download). Para construir uma viga sobre dois apoios com uma carga de barra, são necessárias as seguintes funções:

  1. Nó – set_node
  2. Linha – set_line
  3. Material – set_material
  4. Seção – set_section
  5. Membro – set_member
  6. Apoio nodal – 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

A função "set_node" tem, como a maioria das outras, muitos parâmetros, que normalmente não são necessários. Na já mencionada lista de comandos do modelo RFEM é possível ver a variedade de parâmetros. Acima de tudo os parâmetros que não estão marcados como "opcionais" são importantes, pois esses devem ser completos e cada caso. No exemplo, os seguintes parâmetros são traansferidos:

begin_modification (url_model)

'   definir nó 1 em [0,0,0] com o comando "set_node"
str_envelope =
    "" & _
        "<Body>" & _
            "" & _
                "" & _
                    "1" & _
                    "TYPE_STANDARD" & _
                    "0" & _
                    "0" & _
                    "0" & _
                "" & _
            "" & _
        "</Body>>" & _
    ""

Apenas o número do nó não é opcional, e o restante pode ser atribuído, mas não tem de ser realizado. Além dos parâmetros possíveis, a lista de comandos também apresenta as listas de tipos. No caso específico, existem atualmente cinco tipos possíveis. Foi selecionado o tipo definido por defeito "TYPE_STANDARD". O primeiro nó aqui mostrado é criado no ponto (0;0;0), o segundo nó em (5,5;0,0). Os valores para os números decimais são os seguintes:

…
"" & _
        "2" & _
        "TYPE_STANDARD" & _
        "5.5" & _
        "0" & _
        "0" & _
    "" & _
…

Outra funcionalidade especial são as listas. A linha requer dois nós cujos números podem ser transferidos como lista. Os elementos de uma lista, tais como "definition_nodes", são separados por espaços:

…
    "" & _
        "" & _
            "1" & _
            "TYPE_POLYLINE" & _
            "1 2" & _
        "" & _
    "" & _
…

Para ser capaz de criar a barra, é necessário definir uma seção, que por sua vez requer um material. As secções e materiais podem ser usados a partir da base de dados interna. Assim, basta especificar um identificador conhecido. Para o material, o identificador é "S235" e a seção tem o nome "IPE 300":

…
    "" & _
        "" & _
            "1" & _
            "1" & _
            "TYPE_STANDARDIZED_STEEL" & _
            "IPE 300" & _
        "" & _
    "" & _
…

Para verificar se um nome como "IPE 300" é válido, pode-se usar a entrada na interface gráfica.

Para introduzir a barra em si, não são necessários conhecimentos adicionais, mas para a introdução de um apoio fixo é preciso definir uma rigidez "infinita" da mola. Para a transferência é utilizada a palavra-chave "INF":

…
    "" & _
        "" & _
            "1" & _
            "1" & _
            "INF" & _
            "INF" & _
            "INF" & _
            "INF" & _
            "0" & _
            "INF" & _
        "" & _
    "" & _
…

A criação do caso de carga e dos parâmetros de cálculo não requer conhecimentos adicionais. A última particularidade é um valor adicional ao criar a carga, pois ele precisa ser especificado fora da área "". No caso de uma carga de barra, o caso de carga correspondente deve ser transferido ali:

…
    "" & _
        "1" & _
        "" & _
            "1" & _
            "LOAD_TYPE_FORCE" & _
            "1" & _
            "LOAD_DISTRIBUTION_UNIFORM" & _
            "LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE" & _
            "1000" & _
        "" & _
    "" & _
…
Adicionalmente, deve ser mencionado que a ordem dos elementos dentro da área "value" é irrelevante, mas fora já não o é. O caso de carga especificado deve por isso, vir antes da área "value". Além das funções anteriores para a criação e exportação de dados, existem duas funções especiais que são apresentadas. Se os elementos são transferidos para o programa, este entra automaticamente em um modo de "Modificação". O programa verifica os novos elementos e integra-os. Se tiverem de ser criados diversos novos elementos, é aconselhável manter o programa neste modo de edição durante esse tempo para processamento mais rápido. Para esse propósito, existem as funções "begin_modification" e "finish_modification". No exemplo, "begin_modification" é evocado antes de criar o primeiro nó e "finish_modification" no final, após criar o caso de carga. As duas funções também foram criadas como funções VBA no programa. As funções são independentes e, portanto, as variáveis "request" e "response" são novamente criadas dentro das funções. No entanto, uma vez que não são necessários novos elementos para isso, estas funções não serão descritas aqui em maior detalhe. Interessante é a comparação com e sem o uso dessas funções, da qual resultará sempre uma diferença de velocidade. == Resumo == O Webservice API é uma ferramenta poderosa para o RFEM e RSTAB. A simples transferência com base em HTTP permite a implementação da interface em diversas linguagens de programação, não apenas em VBA como apresentado aqui, tornando possível a programação multiplataforma.


Autor

O Eng. Günthel opera na área do apoio técnico para clientes.

Ligações
Downloads


;