3310x
001806
19.7.2023

Tutoriál Webová služba a API v C#

Naše Webová služba vám nabízí možnost komunikovat s programy RFEM 6 a RSTAB 9 pomocí různých programovacích jazyků. Knihovny vysoce užitečných funkcí (HLF) společnosti Dlubal umožňují použití Webové služby rozšířit a zjednodušit. Použití naší Webové služby ve spojení s programy RFEM 6 a RSTAB 9 usnadňuje a urychluje inženýrům práci. Přesvědčte se sami! V tomto tutoriálu vám na jednoduchém příkladu ukážeme, jak používat knihovnu pro C#.

Knihovna HLF pro C# nabízí pro vytváření konstrukcí v programech RFEM a RSTAB řadu užitečných funkcí, z nichž některé použijeme v následujícím příkladu.

Aby bylo možné naprogramovaný kód použít, je nejprve nutné připojení k programu. Za tímto účelem musí být jako adresa uveden jeden z dostupných portů. Výchozí adresa programu RFEM/RSTAB je http://localhost:8081 . V případě potřeby ji lze změnit v možnostech programu.

V dalším kroku můžeme pomocí funkcí dostupných v knihovně C # vytvořit různé objekty, jako jsou uzly, linie a pruty. Knihovna obsahuje třídy pro všechny dostupné objekty. Pomocí parametrů lze definovat a specifikovat vlastnosti objektů. Počet parametrů se může lišit v závislosti na použití.

Níže uvádíme na příkladu uzlu, jak lze objekty definovat:

  1. code.csharp#

node newNode = new()
{

  1. no = nodeId,
  2. coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
  3. coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
  4. coordinate_system_typeSpecified = true,
  5. comment = "node for beam"

};

  1. /kód#

Linie, plochy a další objekty se definují stejným způsobem. Je třeba dát pozor, že pro určité parametry musí být definovaná ještě příslušná proměnná "Specified" a nastavena na hodnotu "true".

Praktický příklad

Tento příklad ukazuje, jak vytvořit spojitý nosník s konstantním zatížením na linii. Počet polí, rozpětí a velikost zatížení na linii lze nastavit proměnně pomocí uživatelského zadání.

Nejdříve se pomocí uživatelského zadání v příkazovém řádku definují potřebné proměnné. Přitom se kontroluje, zda je uživatelské zadání kompatibilní s datovým typem příslušné proměnné. Pokud je zadání nesprávné nebo prázdné, zobrazí se v příkazovém řádku chybové hlášení. Při programování bylo dbáno na to, aby bylo možné zadávat desetinná čísla jak s desetinnými tečkami, tak s čárkami, a tím se minimalizovala možnost chyb.

Napojení na program RFEM/RSTAB

Následující kód se pokusí navázat spojení s programem RFEM/RSTAB v rámci bloku try-catch:

  1. code.csharp#

var logger = LogManager.GetCurrentClassLogger();
string CurrentDirectory = Directory.GetCurrentDirectory();
try
{

  1. application_information ApplicationInfo;
  1. try
  2. {
  3. // connect to RFEM6 or RSTAB9 application
  4. application = new ApplicationClient(Binding, Address);
  5. }
  6. catch (Exception exception)
  7. {
  8. if (application != null)
  9. {
  10. if (application.State != CommunicationState.Faulted)
  11. {
  12. application.Close();
  13. logger.Error(exception, "Something happened:" + exception.Message);
  14. }
  15. else
  16. {
  17. application.Abort();
  18. logger.Error(exception, "Communication with RFEM faulted:" + exception.Message);
  19. }
  20. }
  21. Console.WriteLine(exception.ToString());
  22. }
  23. finally
  24. {
  25. ApplicationInfo = application.get_information();
  26. logger.Info("Name: {0}, Version:{1}, Type: {2}, language: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
  27. Console.WriteLine("Name: {0}, Version:{1}, Type: {2}, language: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
  28. }

}

string modelName = "MyTestModel";
string modelUrl ="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));

  1. /kód#

Aby bylo možné navázat spojení, musí být program před spuštěním kódu otevřen. Po úspěšném připojení se v příkazovém řádku zobrazí informace o programu a v programu RFEM/RSTAB se vytvoří nový model s uživatelským názvem.

Zadání základních objektů

V dalším kroku lze zadat materiál a průřez spojitého nosníku. Je důležité, aby označení odpovídalo označení v databázi materiálů a průřezů v programu RFEM.

  1. code.csharp#

material materialConcrete = new material
{

  1. no = 1,
  2. name = "C20/25 | EN 1992-1-1:2004/A1:2014"

};

section sectionRectangle = new section
{

  1. no = 1,
  2. material = materialConcrete.no,
  3. materialSpecified = true,
  4. type = section_type.TYPE_PARAMETRIC_MASSIVE_I,
  5. typeSpecified = true,
  6. parametrization_type = section_parametrization_type.PARAMETRIC_MASSIVE_I__MASSIVE_RECTANGLE__R_M1,
  7. parametrization_typeSpecified = true,
  8. name = "R_M1 0.5/1.0"

};

  1. /kód#

Pomocí cyklů se vytvářejí různé objekty (uzly, linie, pruty) a řadí se do seznamů. Uzly se zadávají v závislosti na zadaném počtu polí a řadí se do seznamu "lineDefinitionNodes". Tento seznam bude později použit při vytváření linií na základě jejich definičních uzlů. Pokud má být vytvořen model v programu RSTAB, slouží pak tento seznam k definici prutů na základě definičních uzlů. V programu RFEM se naproti tomu pruty definují na základě linií.

  1. code.sharp#

SortedList<int, node> nodes = new SortedList<int, node>();
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeId = 1;
double xVector = 0.0;

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

  1. node newNode = new()
  2. {
  3. no = nodeId,
  4. coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
  5. coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
  6. coordinate_system_typeSpecified = true,
  7. comment = "concrete part"
  8. };
  9. nodes.Add(nodeId, newNode);
  10. lineDefinitionNodes[i] = nodeId;
  11. xVector = xVector + span;
  12. nodeId++;

}

// create lines
int lineId = 1;
SortedList<int, line> lines = new SortedList<int, line>();

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

  1. line newLine = new()
  2. {
  3. no = lineId,
  4. definition_nodes = new int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
  5. comment = "lines for beams",
  6. type = line_type.TYPE_POLYLINE,
  7. typeSpecified = true,
  8. };
  9. lines.Add(lineId, newLine);
  10. lineId++;

}

  1. /kód#

Po vytvoření všech základních objektů se zadají dvě různé uzlové podpory. Uzlová podpora v prvním uzlu by měla být pevná, ostatní podpory by měly být posuvné ve směru X. Definiční uzly pro různé typy podpor jsou uvedeny v samostatném seznamu.

  1. code.csharp#

nodal_support support1 = new()
{

  1. no = 1,
  2. nodes = supportedNodes1.ToArray(),
  3. spring = new vector_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
  4. rotational_restraint = new vector_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }

};

nodal_support support2 = new()
{

  1. no = 2,
  2. nodes = supportedNodes2.ToArray(),
  3. spring = new vector_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
  4. rotational_restraint = new vector_3d() { x = 0.0, y = 0.0, z = double.PositiveInfinity }

};

nodalSupports.Add(support1);
nodalSupports.Add(support2);

  1. /kód#

Přenos objektů do programu RFEM

Aby byly vytvořené objekty k dispozici v programu RFEM/RSTAB, je třeba je nejprve přenést do programu. To se provádí mezi dvěma funkcemi "model.begin_modification" a "model.end_modification" pomocí objektově specifických funkcí knihovny HLF. Pomocí cyklů foreach se předají všechny objekty určitého typu do programu.

  1. code.csharp#

try
{

  1. model.begin_modification("Geometry");
  2. model.set_material(materialConcrete);
  3. model.set_section(sectionRectangle);
  1. foreach (KeyValuePair<int, node> nodeItem in nodes)
  2. {
  3. model.set_node(nodeItem.Value);
  4. }
  5. foreach (KeyValuePair<int, line> lineItem in lines)
  6. {
  7. model.set_line(lineItem.Value);
  8. }
  9. foreach (KeyValuePair<int, member> memberItem in members)
  10. {
  11. model.set_member(memberItem.Value);
  12. }
  13. foreach (var nodalSupport in nodalSupports)
  14. {
  15. model.set_nodal_support(nodalSupport);
  16. }

}
catch (Exception exception)
{

  1. model.cancel_modification();
  2. logger.Error(exception, "Something happened while creation of geometry" + exception.Message);
  3. throw;

}
finally
{

  1. try
  2. {
  3. model.finish_modification();
  4. }
  5. catch (Exception exception)
  6. {
  7. logger.Error(exception, "Something went wrong while finishing modification of geometry\n" + exception.Message + "\n");
  8. model.reset();
  9. }

}

  1. /kód#

Zadání zatížení

Zatěžovací stavy, kombinace zatížení a návrhové situace se vytvoří stejným způsobem jako základní objekty a poté se přenesou do programu.

Poté lze vytvořit zatížení na prut, které bylo předem zadáno uživatelem:

  1. code.csharp#

SortedList<int, member_load> member_loads = new SortedList<int, member_load>();
int member_load_id = 1;

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

  1. member_load newMemberLoad = new()
  2. {
  3. no = i + 1,
  4. members_string = (i + 1).ToString(),
  5. members = new int[] { i + 1 },
  6. load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
  7. load_distributionSpecified = true,
  8. magnitude = memberLoad * 1000,
  9. magnitudeSpecified = true,
  10. load_is_over_total_length = true,
  11. load_is_over_total_lengthSpecified = true,
  12. };
  13. member_loads.Add(i + 1, newMemberLoad);
  14. member_load_id++;

}

  1. /kód#

Kromě rovnoměrně rozložených zatížení jsou možná také lichoběžníková a parabolická zatížení.

Výpočet a výsledky

Všechny výpočty v programu RFEM se spustí pomocí funkce model.calculate(all).

Po úspěšném výpočtu se výsledky pro tento příklad zobrazí v příkazovém řádku. Knihovna HLF pro C# také umožňuje export výsledků do souborů XML nebo CSV.

Nakonec lze pomocí funkce model.save() uložit model na adresu souboru uvedenou v závorkách:

  1. code.csharp#

//save the model before closing
model.save(CurrentDirectory + @"\testmodels\");
application.close_model(0, true);

  1. /kód#

Závěr a výhled

V uvedeném příkladu jsou zřejmé výhody a snadná použitelnost knihovny pro C#. Konstrukci lze rychle přizpůsobit pomocí uživatelských zadání, což ušetří mnoho času při zadávání statických systémů v programech RFEM 6 a RSTAB 9. Knihovna HLF pro C# nabízí také mnoho dalších funkcí, které umožňují vytvářet složité systémy.


Autor

Paní Göbel zajišťuje technickou podporu zákazníkům společnosti Dlubal Software

Odkazy


;