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:
- code.csharp#
node newNode = new()
{
- no = nodeId,
- coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
- coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
- coordinate_system_typeSpecified = true,
- comment = "node for beam"
};
- /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:
- code.csharp#
var logger = LogManager.GetCurrentClassLogger();
string CurrentDirectory = Directory.GetCurrentDirectory();
try
{
- application_information ApplicationInfo;
- try
- {
- // connect to RFEM6 or RSTAB9 application
- application = new ApplicationClient(Binding, Address);
- }
- catch (Exception exception)
- {
- if (application != null)
- {
- if (application.State != CommunicationState.Faulted)
- {
- application.Close();
- logger.Error(exception, "Something happened:" + exception.Message);
- }
- else
- {
- application.Abort();
- logger.Error(exception, "Communication with RFEM faulted:" + exception.Message);
- }
- }
- Console.WriteLine(exception.ToString());
- }
- finally
- {
- ApplicationInfo = application.get_information();
- logger.Info("Name: {0}, Version:{1}, Type: {2}, language: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
- Console.WriteLine("Name: {0}, Version:{1}, Type: {2}, language: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
- }
}
string modelName = "MyTestModel";
string modelUrl ="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));
- /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.
- code.csharp#
material materialConcrete = new material
{
- no = 1,
- name = "C20/25 | EN 1992-1-1:2004/A1:2014"
};
section sectionRectangle = new section
{
- no = 1,
- material = materialConcrete.no,
- materialSpecified = true,
- type = section_type.TYPE_PARAMETRIC_MASSIVE_I,
- typeSpecified = true,
- parametrization_type = section_parametrization_type.PARAMETRIC_MASSIVE_I__MASSIVE_RECTANGLE__R_M1,
- parametrization_typeSpecified = true,
- name = "R_M1 0.5/1.0"
};
- /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í.
- 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++)
{
- node newNode = new()
- {
- no = nodeId,
- coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
- coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
- coordinate_system_typeSpecified = true,
- comment = "concrete part"
- };
- nodes.Add(nodeId, newNode);
- lineDefinitionNodes[i] = nodeId;
- xVector = xVector + span;
- nodeId++;
}
// create lines
int lineId = 1;
SortedList<int, line> lines = new SortedList<int, line>();
for (int i = 0; i < spanNumber; i++)
{
- line newLine = new()
- {
- no = lineId,
- definition_nodes = new int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
- comment = "lines for beams",
- type = line_type.TYPE_POLYLINE,
- typeSpecified = true,
- };
- lines.Add(lineId, newLine);
- lineId++;
}
- /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.
- code.csharp#
nodal_support support1 = new()
{
- no = 1,
- nodes = supportedNodes1.ToArray(),
- spring = new vector_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
- rotational_restraint = new vector_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }
};
nodal_support support2 = new()
{
- no = 2,
- nodes = supportedNodes2.ToArray(),
- spring = new vector_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
- rotational_restraint = new vector_3d() { x = 0.0, y = 0.0, z = double.PositiveInfinity }
};
nodalSupports.Add(support1);
nodalSupports.Add(support2);
- /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.
- code.csharp#
try
{
- model.begin_modification("Geometry");
- model.set_material(materialConcrete);
- model.set_section(sectionRectangle);
- foreach (KeyValuePair<int, node> nodeItem in nodes)
- {
- model.set_node(nodeItem.Value);
- }
- foreach (KeyValuePair<int, line> lineItem in lines)
- {
- model.set_line(lineItem.Value);
- }
- foreach (KeyValuePair<int, member> memberItem in members)
- {
- model.set_member(memberItem.Value);
- }
- foreach (var nodalSupport in nodalSupports)
- {
- model.set_nodal_support(nodalSupport);
- }
}
catch (Exception exception)
{
- model.cancel_modification();
- logger.Error(exception, "Something happened while creation of geometry" + exception.Message);
- throw;
}
finally
{
- try
- {
- model.finish_modification();
- }
- catch (Exception exception)
- {
- logger.Error(exception, "Something went wrong while finishing modification of geometry\n" + exception.Message + "\n");
- model.reset();
- }
}
- /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:
- 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++)
{
- member_load newMemberLoad = new()
- {
- no = i + 1,
- members_string = (i + 1).ToString(),
- members = new int[] { i + 1 },
- load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
- load_distributionSpecified = true,
- magnitude = memberLoad * 1000,
- magnitudeSpecified = true,
- load_is_over_total_length = true,
- load_is_over_total_lengthSpecified = true,
- };
- member_loads.Add(i + 1, newMemberLoad);
- member_load_id++;
}
- /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:
- code.csharp#
//save the model before closing
model.save(CurrentDirectory + @"\testmodels\");
application.close_model(0, true);
- /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.