2455x
001806
2023-07-19

Tutorial dla Webservice & API w C#

Nasza usługa sieciowa oferuje użytkownikom możliwość komunikacji z programami RFEM 6 i RSTAB 9 za pomocą różnych języków programowania. Funkcje wysokiego poziomu (HLF) firmy Dlubal umożliwiają rozszerzenie i uproszczenie funkcjonalności usługi sieciowej. Zgodnie z RFEM 6 i RSTAB 9, korzystanie z naszego webservice sprawia, że praca inżyniera jest łatwiejsza i szybsza. Wypróbuj teraz! Ten samouczek pokazuje, jak korzystać z biblioteki C #na prostym przykładzie.

Biblioteka HLF dla języka C#udostępnia wiele przydatnych funkcji do tworzenia konstrukcji w programach RFEM i RSTAB, z których część zostanie wykorzystana w poniższym przykładzie.

Aby wprowadzić w życie zaprogramowany kod, należy najpierw połączyć się z programem. Jeden z dostępnych portów musi być określony jako adres. Domyślny adres programu RFEM/RSTAB to http://localhost:8081. W razie potrzeby można to zmienić w opcjach programu.

W kolejnym kroku można tworzyć różne obiekty, takie jak węzły, linie i pręty, korzystając z funkcji dostępnych w bibliotece C#. W bibliotece znajdują się klasy dla wszystkich dostępnych obiektów. Na podstawie parametrów można definiować i określać właściwości obiektu'. Liczba parametrów może się różnić w zależności od przypadku użycia.
Poniżej przedstawiono sposób definiowania obiektów na przykładzie węzła:


            

węzeł nowywęzeł = nowy()
{
    no = nodeId,
    współrzędne = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
    typ_układu_współrzędnych = typ_układu_współrzędnych_węzła.WSPÓŁRZĘDNYCH_WSPÓŁRZĘDNYCH,
    typ_układu_współrzędnychSpecified = prawda,
    komentarz = "węzeł dla belki"
};


W ten sam sposób definiuje się linie, powierzchnie i inne obiekty. Należy pamiętać, że odpowiedni atrybut „Określony” musi być zdefiniowany i ustawiony jako „prawda” dla niektórych atrybutów.

Przykład praktyczny

W tym przykładzie pokazano, jak utworzyć belkę ciągłą ze stałym obciążeniem liniowym. Liczbę przęseł, rozpiętość belki i wielkość obciążenia liniowego można ustawić za pomocą danych wprowadzonych przez użytkownika.
Najpierw wymagane zmienne są definiowane przez użytkownika w konsoli. Program sprawdza, czy dane wprowadzone przez użytkownika są zgodne z typem danych odpowiedniej zmiennej. Jeżeli wpis jest nieprawidłowy lub pusty, w konsoli pojawia się komunikat o błędzie. Podczas programowania zwrócono szczególną uwagę na to, aby miejsca dziesiętne mogły być wprowadzane zarówno za pomocą kropek, jak i przecinków, aby zminimalizować podatność na błędy.

Połączenie z RFEM/RSTAB

Poniższy kod próbuje nawiązać połączenie z programem RFEM/RSTAB w ramach bloku try-catch:


            

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

    try
    {
        //połącz się z aplikacją RFEM6 lub RSTAB9
        application = new ApplicationClient(Powiązanie, Adres);
    }
    catch (wyjątek od wyjątku)
    {
        if (zastosowanie != zero)
        {
            if (application.State != CommunicationState.Faulted)
            {
                aplikacja.Zamknij();
                logger.Error(exception, "Coś się stało:" +except.Message);
            }
            else
            {
                application.Abort();
                logger.Error(Exception, "Komunikacja z RFEM nie powiodła się:" +except.Message);
            }
        }
        Console.WriteLine(wyjątek.ToString());
    }
    finally
    {
        ApplicationInfo = application.get_information();
        logger.Info("Nazwa: {0}, Wersja:{1}, Typ: {2}, język: {3} ”, ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
        Console.WriteLine("Nazwa: {0}, Wersja:{1}, Typ: {2}, język: {3} ”, ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
    }
}

string modelName = "MójTestModel";
string modelUrl ="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));



Aby nawiązać połączenie, program musi być otwarty przed uruchomieniem kodu. Po pomyślnym nawiązaniu połączenia informacje o programie są wyświetlane w konsoli, aw programie RFEM/RSTAB tworzony jest nowy model o nazwie zdefiniowanej przez użytkownika.

Definicja obiektów podstawowych

W kolejnym kroku można zdefiniować materiał i przekrój belki ciągłej. Ważne jest, aby opis odpowiadał nazwie zapisanej w bibliotece materiałów lub przekrojów programu RFEM.


            

materiał materiałBeton = nowy materiał
{
    nie = 1,
    nazwa = "C20/25 | EN 1992-1-1:2004/A1:2014"
};

przekrój przekrojuProstokąt = nowy przekrój
{
    nie = 1,
    materiał = materialBeton.no,
    materialSpecified = true,
    typ = typ_przekroju.TYPE_PARAMETRIC_MASSIVE_I,
    typeSpecified = prawda,
    typ_parametryzacji = typ_parametryzacji_przekroju.PARAMETRIC_MASSIVE_I__MASSIVE_RECTANGLE__R_M1,
    parametrization_typeSpecified = true,
    nazwa = "R_M1 0,5/1,0"
};


Za pomocą pętli tworzone są i porządkowane w listy różne obiekty (węzły, linie, pręty). Węzły są definiowane w zależności od liczby przęseł zdefiniowanej przez użytkownika i przenoszone na listę "lineDefinitionNodes". Lista ta posłuży później do tworzenia linii na podstawie ich węzłów definicji. Podczas tworzenia modelu w programie RSTAB lista służy do definiowania prętów na podstawie ich węzłów definicji. W programie RFEM pręty definiowane są za pomocą linii.


            

SortedList nodes = new SortedList();
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeId = 1;
podwójny wektor x = 0,0;

for (int i = 0; i < spanNumber + 1; i++)
{
    węzeł nowywęzeł = nowy()
    {
        no = nodeId,
        współrzędne = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
        typ_układu_współrzędnych = typ_układu_współrzędnych_węzła.WSPÓŁRZĘDNYCH_WSPÓŁRZĘDNYCH,
        typ_układu_współrzędnychSpecified = prawda,
        komentarz = "część betonowa"
    };
    nodes.Add(nodeId, nowyNode);
    lineDefinitionNodes[i] = nodeId;
    xWektor = xWektor + rozpiętość;
    węzełId++;
}

//utwórz linie
int lineId = 1;
SortedList lines = new SortedList();

for (int i = 0; i < spanNumber; i++)
{
    linia nowaLinia = nowa()
    {
        no = lineId,
        węzły_definicji = new int[] { węzły_definicji_linii[i], węzły_definicji_linii[i + 1] },
        komentarz = "linie dla belek",
        typ = typ_linii.TYP_POLYLINE,
        typeSpecified = prawda,
    };
    lines.Add(lineId, newLine);
    liniaId++;
}


Po utworzeniu wszystkich obiektów bazowych definiowane są dwie różne podpory węzłowe. Podpora węzłowa w pierwszym węźle powinna być zamocowana, pozostałe podpory należy zaprojektować jako rolki w kierunku X. Węzły definicji dla różnych typów podpór są podsumowane na osobnej liście.


            

nodal_support support1 = new()
{
    nie = 1,
    węzły = obsługiwaneWęzły1.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()
{
    nie = 2,
    węzły = obsługiwaneWęzły2.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 }
};

węzłySupports.Add(podpora1);
nodealSupports.Add(support2);


Transfer obiektów do RFEM

Aby utworzone obiekty były dostępne w programie RFEM/RSTAB, należy je najpierw przenieść do programu. Odbywa się to między dwiema funkcjami, tj. "model.begin_modification" i "model.end_modification", za pomocą funkcji specyficznych dla obiektu z biblioteki HLF. Pętle foreach służą do przekazywania do programu wszystkich obiektów danego typu.


            

try
{
    model.begin_modification("Geometria");
    model.set_material(materialConcrete);
    model.set_section(sectionRectangle);

    foreach (KeyValuePair nodeItem w węzłach)
    {
        model.set_node(nodeItem.Value);
    }
    foreach (KeyValuePair lineItem in lines)
    {
        model.set_line(lineItem.Value);
    }
    foreach (KeyValuePair memberItem w members)
    {
       	model.set_member(memberItem.Value);
    }
    foreach (var nodalSupport in nodalSupports)
    {
        model.set_nodal_support(nodalSupport);
    }
}
catch (wyjątek od wyjątku)
{
    model.cancel_modification();
    logger.Error(Exception, "Coś się stało podczas tworzenia geometrii" +except.Message);
    rzut;
}
finally
{
    try
    {
       	model.finish_modification();
    }
    catch (wyjątek od wyjątku)
    {
        logger.Error(exception, "Coś poszło nie tak podczas kończenia modyfikacji geometrii\n" +except.Message + "\n");
         model.reset();
    }
}


Określanie obciążeń

Przypadki obciążeń, kombinacje obciążeń i sytuacje obliczeniowe tworzone są podobnie jak obiekty podstawowe, a następnie przenoszone do programu.
Następnie można utworzyć obciążenie prętowe, które zostało wcześniej określone przez użytkownika:


            

SortedList member_loads = new SortedList();
int member_load_id = 1;

for (int i = 0; i < spanNumber; i++)
{
    member_load newMemberLoad = new()
    {
        nie = i + 1,
        ciąg_elementów = (i + 1).ToString(),
        pręty = nowy int[] { i + 1 },
        load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
        load_distributionSpecified = prawda,
        wielkość = MemberLoad * 1000,
        wielkośćSpecified = prawda,
        load_is_over_całkowita_długość = prawda,
        load_is_over_total_lengthSpecified = true,
    };
    member_loads.Add(i + 1, newMemberLoad);
    id_obciążenia_elementu++;
}


Oprócz obciążeń równomiernie rozłożonych możliwe są również obciążenia trapezowe i paraboliczne.

Obliczanie i przedstawianie wyników

Za pomocą funkcji model.calculate(all) wszystkie obliczenia są przeprowadzane w programie RFEM.
Po pomyślnym zakończeniu obliczeń wyniki z tego przykładu są wyświetlane w konsoli. Biblioteka HLF dla C#umożliwia również eksport wyników w postaci plików XML lub CSV.
Za pomocą funkcji model.save() można zapisać model pod ścieżką do pliku wskazaną w nawiasach:


            

//zapisz model przed zamknięciem
model.save(CurrentDirectory +@"\testmodels\");
application.close_model(0, prawda);


Podsumowanie

W przedstawionym przykładzie zalety i łatwa obsługa biblioteki C#są wyraźnie widoczne. Konstrukcję można szybko dostosować za pomocą wpisów zdefiniowanych przez użytkownika, co pozwala zaoszczędzić dużo czasu podczas wprowadzania układów konstrukcyjnych do programu RFEM 6 i RSTAB 9. Biblioteka HLF dla C#oferuje również wiele innych funkcji, umożliwiających tworzenie złożonych systemów.


Autor

Pani Göbel zapewnia wsparcie techniczne klientom firmy Dlubal Software.

Odnośniki