
Файл .prmt представляет собой текстовый контейнер, в котором перечислены конструктивные и архитектурные объекты, которые PromCore должен воссоздать в сцене. Каждый объект записывается в одну строку в виде записи, разделенной точкой с запятой:
WallConcrete20250512182627832827;-2880;200;2820;4010.815;70616.5;14072.54;69680.07;20;6;20;6;-370
CombinePlane20250512182307463272;-2880;300;-2248;58320;10687;22510;78783;9155;42374;
Тип | Индекс параметра (после первого ; ) | Значение | Пример |
CombinePlane | hl | Level of the slab soffit | -2880 |
thk | Slab thickness | 300 | |
... | Even-length list of polygon vertices on the X-Z plane (x1;y1;x2;y2;…;xn;yn;) | -2248 58320 10687 22510 78783 9155 42374 |
CombinePylon202505121823105796484;17362;47416;-2880;1200;210;2820;20;269.3489;5;12;6;200;-152.9;
Тип | Индекс параметра (после первого ; ) | Значение | Пример |
CombinePylon | X | Centre X | 17362 |
Y | Centre Y | 47416 | |
hl | Base level (Z) | -2880 | |
Введите текст | W | Section width (local X) | 1200 |
D | Section depth (local Y) | 210 | |
H | Total height | 2820 | |
Pl | Protective layer | 20 | |
Rot | Rotation around global Z (deg) | 269.3489 | |
Nz | Rebar count in Z direction | 5 | |
Dz | Rebar Ø (mm) | 12 | |
Dxy | Transverse rebar Ø (mm) | 6 | |
S | Reinforcement pitch | 200 | |
N | Design axial force (- comp., + tension) | -152.9 |
public void SaveData()
{
List<List<string>> stats = new List<List<string>>();
List<string> planes = floors(doc, structuralFloorSlabs, conv);
List<string> colomns = Columns(doc, structuralColumns, conv, form);
List<string> WallsConcret= Walls(doc, structuralWalls, conv, form, "WallConcrete");
List<string> WallsArch = Walls(doc, ArchWalls, conv, form, "WallArchitec");
stats.Add(planes);
stats.Add(WallsConcret);
stats.Add(colomns);
stats.Add(WallsArch);
form.saveFileDialog1.ShowDialog();
string path = form.saveFileDialog1.FileName;
using FileStream stream1 = new FileStream(path, FileMode.Create);
new BinaryFormatter().Serialize(stream1, stats);
}
Все стены, опоры и перекрытия записываются в одномерные списки с использованием соответствующих методов в выбранной вами программе моделирования. Пример реализации на C#:
Элемент | Правило |
Десятичный разделитель | “ . ” (точка) — устанавливает CultureInfo.InvariantCulture при сериализации |
Координатные пары | Список вершин для CombinePlane должен содержать четное количество координат (минимум 3 пары). |
Уникальный IDs | Они не обязательно должны быть уникальными во всем мире, только в пределах одного файла; это могут быть метки времени или GUID размером с метку времени. |
Тип | Индекс параметра (после первого ; ) | Значение | Пример |
WallConcrete | name | Object name | WallConcrete202511162209490913764 |
WallArchitec | hl | Base level (Z) of the wall | -2880 |
thk | Wall thickness | 200 | |
h | Wall height | 2820 | |
Введите текст | Ax | Start-point X | 4010.815 |
Ay | Start-point Y | 70616.5 | |
Bx | End-point X | 14072.54 | |
Введите текст | By | End-point Y | 69680.07 |
Dz | Rebar Ø (mm) | 20 | |
Nz | Rebar count in Z direction | 6 | |
Введите текст | Dxy | Rebar Ø (mm) | 20 |
Nxy | Rebar count in X0Y direction | 6 | |
N | Design axial force (- comp., + tension) | -370 |
Файл .dat инструмента FEMnet или SmartPylon представляют собой файлы результатов расчёта каждой модели.
Структура файла:
Поле | Тип | Описание |
magic | int32 | Константа 0x46454D4E (ASCII "FEMN") |
version | int32 | Версия формата |
kind | int32 | Тип данных: 0 = Dz, 1 = Mx, 2 = My |
count | int32 | Количество точек |
В каждой новой строчке файла хранятся:
Поле | Тип | Описание |
х | float32 | Координата по Х (метры) |
у | float32 | Координата по У (метры) |
value | float32 | Значение Dz в мм, Мх и Му в Т/м |
- | - | - |
Пример чтения результатов расчёта нейросети FEMnet на Python:
import struct
import numpy as np
MAGIC = 0x46454D4E # 'FEMN'
KIND_MAP = {
0: "Dz",
1: "Mx",
2: "My",
}
def read_femnet_dat(path):
"""
Возвращает словарь:
- version, kind, kind_name, count
- numpy-массивы x, z, value (float32)
"""
with open(path, "rb") as f:
hdr = f.read(16) # magic, version, kind, count
if len(hdr) < 16:
raise ValueError("Файл слишком короткий: нет заголовка 16 байт")
magic, version, kind, count = struct.unpack("<iiii", hdr)
if magic != MAGIC:
raise ValueError(f"Неверный magic: {hex(magic)} (ожидался {hex(MAGIC)})")
data = np.fromfile(f, dtype="<f4", count=count * 3)
if data.size != count * 3:
raise ValueError("Оборванные данные: размер меньше ожидаемого")
data = data.reshape((count, 3))
x = data[:, 0]
z = data[:, 1]
val = data[:, 2]
return {
"path": path,
"version": version,
"kind": kind,
"kind_name": KIND_MAP.get(kind, f"unknown({kind})"),
"count": count,
"x": x,
"z": z,
"value": val,
}
if __name__ == "__main__":
dat_path = r"C:\path\to\test_Mx.dat" # поменяйте на свой путь
res = read_femnet_dat(dat_path)
print("version:", res["version"])
print("kind:", res["kind"], res["kind_name"])
print("count:", res["count"])
print("first point:", res["x"][0], res["z"][0], res["value"][0])