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ů. Standardní 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:
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"
};
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:
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));
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.
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"
};
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í.
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++;
}
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.
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);
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.
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();
}
}
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:
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++;
}
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:
//save the model before closing
model.save(CurrentDirectory + @"\testmodels\");
application.close_model(0, true);
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.