3310x
001806
2023-07-19

Tutorial sobre Serviço web e API em C#

O nosso Serviço web oferece ao utilizador a possibilidade de comunicar com o RFEM 6 e o RSTAB 9 utilizando diversas linguagens de programação. As funções de alto nível (HLF) da Dlubal permitem expandir e simplificar a funcionalidade do Serviço web. Em linha com o RFEM 6 e o RSTAB 9, a utilização do nosso serviço web torna o trabalho do engenheiro mais fácil e rápido. Veja por si mesmo! Este tutorial mostra como utilizar a #library C com um exemplo simples.

A biblioteca HLF para C#oferece inúmeras funções úteis para criar estruturas no RFEM e no RSTAB, algumas das quais serão utilizadas no exemplo a seguir.

Para implementar o código programado, é necessária primeiro uma ligação ao programa. Uma das portas disponíveis tem de ser especificada como endereço. O endereço predefinido do RFEM é http://localhost:8081 . Se necessário, pode ser alterado nas opções do programa.

No próximo passo, vários objetos podem ser criados, tais como nós, linhas e barras, utilizando as funções disponíveis na biblioteca C#. A biblioteca inclui classes para todos os objetos disponíveis. Com base nos parâmetros, as propriedades' dos objetos podem ser definidas e especificadas. O número de parâmetros pode variar dependendo do caso de utilização.

A seguir é demonstrado como os objetos podem ser definidos utilizando o exemplo de um nó:

  1. code.csharp#

nó novoNó = novo()
{

  1. no = noId,
  2. coordenadas = novo vector_3d () { x = xVector, y = 0,0, z = 0,0 },
  3. Coordenada_system_type = node_coordinate_system_type.COUNDINATE_SYSTEM_Cartesian,
  4. Coordenada_system_typeSpecified = verdadeiro,
  5. comentário = "nó para viga"

};

  1. /código#

Linhas, superfícies e outros objetos são definidos da mesma forma. Tenha em atenção que um atributo "especificado" correspondente tem de ser definido e definido como "verdadeiro" para determinados atributos.

Exemplo prático

Este exemplo mostra como criar uma viga contínua com uma carga de linha constante. O número de vãos, o vão da viga e a magnitude da carga de linha podem ser definidos de forma variável através da entrada do utilizador.

Primeiro, as variáveis necessárias são definidas pelo utilizador na consola. O programa verifica se a entrada do utilizador é compatível com o tipo de dados da respetiva variável. Se a entrada estiver incorreta ou vazia, aparece uma mensagem de erro na consola. Durante a programação, foi necessário assegurar que as casas decimais possam ser introduzidas utilizando a notação de ponto e vírgula para minimizar a suscetibilidade a erros durante a introdução de dados.

Ligação ao RFEM/RSTAB

O seguinte código tenta estabelecer uma ligação com o RFEM/RSTAB dentro de um blocotry-catch:

  1. code.csharp#

var logger = Log Manager.GetCurrentClassLogger ()
cadeia de caracteres CurrentDirectory = Diretório.GetCurrentDirectory ()
try
{

  1. aplicação_informacaoInformação da aplicação;
  1. try
  2. {
  3. ://ligar à aplicação RFEM6 ou RSTAB9
  4. aplicação =new AplicaçãoCliente(ligação, endereço);
  5. }
  6. captura (exceção de exceção)
  7. {
  8. if (aplicação != zero)
  9. {
  10. if (application.State != CommunicationState.Faulted)
  11. {
  12. aplicação.Fechar();
  13. logger.Error(exceção, "Ocorreu algo:" + exceção.Message);
  14. }
  15. else
  16. {
  17. aplicação.Abort();
  18. logger.Error(exceção, "Falha na comunicação com o RFEM:" + excessão.Message);
  19. }
  20. }
  21. Consola.WsiteLine(exsection.ToString());
  22. }
  23. finally
  24. {
  25. AplicaçãoInfo = aplicação.get_information();
  26. registo.Info("Nome: {0}, Versão:{1}, Tipo: {2}, idioma: {3} ", AplicaçãoInfo.name, AplicaçãoInfo.version, AplicaçãoInfo.type, AplicaçãoInfo.language_name);
  27. Consola.WiteLine("Nome: {0}, Versão:{1}, Tipo: {2}, idioma: {3} ", AplicaçãoInfo.name, AplicaçãoInfo.version, AplicaçãoInfo.type, AplicaçãoInfo.language_name);
  28. }

}

string modelName = "MyTestModel"
string modelUrl=""
Modelo do clienteModelo = novo ModelClient(Binding, novo EndpointAdwww(modelUrl));

  1. /código#

Para configurar uma ligação, o programa tem de estar aberto antes de executar o código. Após uma ligação bem-sucedida, são apresentadas informações sobre o programa na consola e é criado um novo modelo com um nome definido pelo utilizador no RFEM/RSTAB.

Definição de objetos de base

No próximo passo, pode definir o material e a secção da viga contínua. É importante que a descrição corresponda ao nome guardado na biblioteca de materiais ou secções do RFEM.

  1. code.csharp#

material materialConcrete = novo material
{

  1. nº = 1,
  2. nome = "C20/25 | EN 1992-1-1:2004/A1:2014"

};

secção secçãoRectângulo = nova secção
{

  1. nº = 1,
  2. material = materialConcrete.no,
  3. materialspecificado = verdadeiro,
  4. tipo = "section_type.TYPE_Paramétricas_MASSIVE_I,
  5. tipoEspecificado = verdadeiro,
  6. parametrization_type =section_parametrization_type.Parametrização_MASSIVE_I__MASSIVE_RECTANGLE__R_M1,
  7. parametrização_typeSpecified = verdadeiro,
  8. nome = "R_M1 0,5/1,0"

};

  1. /código#

Com a ajuda dos laços, vários objetos (nós, linhas, barras) são criados e organizados em listas. Os nós são definidos dependendo do número de vãos definido pelo utilizador e transferidos para a lista "lineDefinitionNodes". A lista será posteriormente utilizada para criar linhas baseadas nos seus nós de definição. Ao criar um modelo no RSTAB, a lista é utilizada para definir as barras com base nos seus nós de definição. No RFEM, as barras são definidas através de linhas.

  1. code.sharp#

OrdenadoList nós = novo OrdenadoList();
int[] linearDefinitionNodes = novo int[spanNumber + 1];
int nóId = 1;
duplo xVetor = 0,0;

for (int i = 0; i < spanNumber + 1; i++)
{

  1. nó novoNó = novo()
  2. {
  3. no = noId,
  4. coordenadas = novo vector_3d () { x = xVector, y = 0,0, z = 0,0 },
  5. Coordenada_system_type = node_coordinate_system_type.COUNDINATE_SYSTEM_Cartesian,
  6. Coordenada_system_typeSpecified = verdadeiro,
  7. comentário = "parte de betão"
  8. };
  9. nós.Add(nodeId, novoNode);
  10. linearDefinitionNodes[i] = nodeId;
  11. xVetor = xVetor + vão;
  12. nóId++;

}

https://www.dlubal.com/pt
int ID dalinha = 1;
OrdenadoList linhas = novo OrdenadoList();

for (int i = 0; i < spanNumber; i++)
{

  1. linha novaLinha = nova()
  2. {
  3. no = linearId,
  4. definição_nodes = novo int[] { linearDefinitionNodes[i], linearDefinitionNodes[i + 1] },
  5. comentário = "linhas para vigas",
  6. tipo = linear_type.TYPE_POLYLINE,
  7. tipoEspecificado = verdadeiro,
  8. };
  9. linhas.Add(lineId, novaLinha);
  10. iddelinha++;

}

  1. /código#

Após a criação de todos os objetos de base, são definidos dois apoios de nós diferentes. O apoio nodal no primeiro nó deve ser fixo; os restantes apoios devem ser dimensionados como rolos na direção X. Os nós de definição para os vários tipos de apoio estão resumidos numa lista separada.

  1. code.csharp#

apoio_nodal apoio1 = novo ()
{

  1. nº = 1,
  2. nós = suportadoNodes1.ToArray(),
  3. mola = novo vector_3d() { x = duplo.PositiveInfinity, y = duplo.PositiveInfinity, z = duplo.PositiveInfinity },
  4. rotaal_restraint = novo vector_3d() { x = duplo.PositiveInfinity, y = 0,0, z = duplo.PositiveInfinity }

};

apoio_nodal support2 =new()
{

  1. no = 2,
  2. nós = suportadoNodes2.ToArray(),
  3. mola = novo vector_3d() { x = 0,0, y = duplo.PositiveInfinity, z = duplo.PositiveInfinity },
  4. rotaal_restraint = novo vector_3d() { x = 0,0, y = 0,0, z = duplo.PositiveInfinity }

};

nodalSupports.Add(apoio1);
nodalSupports.Add(apoio2);

  1. /código#

Transferência de objetos para o RFEM

Para que os objetos criados estejam disponíveis no RFEM/RSTAB, estes devem primeiro ser transferidos para o programa. Isto é realizado entre as duas funções "model.begin_modification" e "model.end_modification" utilizando funções específicas do objeto da biblioteca HLF. Todos os objetos de um tipo são transferidos para o programa através de loops folearning.

  1. code.csharp#

try
{

  1. model.begin_modification("Geometria");
  2. model.set_material(materialConcrete);
  3. model.set_section(sectionRectangle);
  1. folearning (KeyValuePair nodeItem em nós)
  2. {
  3. model.set_node(nodeItem.Value);
  4. }
  5. fo Construção (KeyValuePair LineItem em linhas)
  6. {
  7. model.set_line(lineItem.Value);
  8. }
  9. folearning (KeyValuePair MemberItem em barras)
  10. {
  11. model.set_member(memberItem.Value)
  12. }
  13. folearning (var nodalSupport em nodalSupports)
  14. {
  15. model.set_nodal_support(nodalSupport);
  16. }

}
captura (exceção de exceção)
{

  1. model.cancel_modification();
  2. logger.Error(exceção, "Ocorreu um problema ao criar a geometria" + excessão.Message);
  3. arrasto;

}
finally
{

  1. try
  2. {
  3. model.finish_modification();
  4. }
  5. captura (exceção de exceção)
  6. {
  7. logger.Error(exceção, "Ocorreu um erro ao terminar a modificação da geometria\n" + excessão.Message + "\n");
  8. model.reset();
  9. }

}

  1. /código#

Definição de cargas

Os casos de carga, as combinações de carga e as situações de dimensionamento são criados de forma semelhante aos objetos básicos e depois transferidos para o programa.

Em seguida, a carga da barra especificada anteriormente pelo utilizador pode ser criada:

  1. code.csharp#

Classificação

int Member_load_id = 1;

for (int i = 0; i < spanNumber; i++)
{

  1. Member_loadnewMemberLoad =new()
  2. {
  3. no = i + 1,
  4. Members_string = (i + 1).ToString(),
  5. Members = novo int[] { i + 1 },
  6. load_distribution = Member_load_load_distribution.LOAD_Distribution_UNIFORM,
  7. carga_distribuiçãoEspecificada = verdadeiro,
  8. Valor = MemberCarga * 1000,
  9. magnitudeEspecificada = verdadeiro,
  10. load_is_over_total_length = verdadeiro,
  11. load_is_over_total_lengthSpecified = verdadeiro,
  12. };
  13. Member_loads.Add(i + 1,newMemberLoad);
  14. Member_load_id++;

}

  1. /código#

Além de cargas uniformemente distribuídas, também são possíveis cargas trapezoidais e parabólicas.

Cálculo e saída de resultados

A função model.calculate(all) é utilizada para realizar todos os cálculos no RFEM.

Após um cálculo bem-sucedido, os resultados deste exemplo são apresentados na consola. A biblioteca HLF para C#também permite exportar os resultados em ficheiros XML ou CSV.

Finalmente, a função model.save() pode ser utilizada para guardar o modelo no caminho do ficheiro indicado entre parênteses:

  1. code.csharp#

Guardar modelo antes de fechar
model.save(CurrentDirectory +@"\testmodels");
aplicação.close_model(0, verdadeiro);

  1. /código#

Conclusão

No exemplo apresentado, as vantagens e a facilidade de utilização da biblioteca C#são tornadas claras. A estrutura pode ser adaptada rapidamente através de entradas definidas pelo utilizador, o que poupa muito tempo ao introduzir sistemas estruturais no RFEM 6 e no RSTAB 9. A biblioteca HLF para C#também oferece muitas outras funções, permitindo a criação de sistemas complexos.


Autor

A Eng.ª Göbel presta apoio técnico a clientes da Dlubal Software.

Ligações


;