Tutorial Webservice i API w C#
Artykuł o tematyce technicznej
Nasz serwis internetowy oferuje użytkownikom takim jak Ty możliwość komunikowania się z programami RFEM 6 i RSTAB 9 przy użyciu różnych języków programowania. Funkcje wysokiego poziomu (HLF) firmy Dlubal umożliwiają rozszerzenie i uproszczenie funkcjonalności WebService. Korzystanie z naszego WebService w połączeniu z programami RFEM 6 i RSTAB 9 ułatwia i przyspiesza pracę inżynierów. 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

Dipl.-Ing. Rebecca Göbel
Product Engineering & Customer Support
Pani Göbel opiekuje się użytkownikami produktów Dlubal w dziale obsługi klienta
Słowa kluczowe
WebService i API RFEM 6 RSTAB 9 Oprogramowanie do analizy statyczno-wytrzymałościowej Analiza metodą elementów skończonych BIM Programowanie C#
Linki
Skomentuj...
Skomentuj...
- Odwiedziny 1350x
- Zaktualizowane 17. sierpnia 2023
Kontakt
Masz dodatkowe pytania lub potrzebujesz porady? Zachęcamy do bezpłatnego kontaktu z nami drogą mailową, poprzez czat lub forum lub odwiedzenia naszej strony (FAQ).

Nowy
AISC 341-16 Obliczenia sejsmiczne w RFEM 6
Rozszerzenie Projektowanie konstrukcji stalowych w RFEM 6 oferuje teraz możliwość przeprowadzania obliczeń sejsmicznych zgodnie z AISC 341-16. Obecnie dostępnych jest pięć typów systemów sejsmicznych (SFRS).