2455x
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ů. 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);


Shrnutí

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