civil-tools-v 0.0.2__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/BasicPltPlotter.py +117 -0
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/SeismicReport/Drift.py +66 -0
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py +73 -0
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/SeismicReport/ShearMoment.py +71 -0
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/SeismicReport/__init__.py +3 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +15 -4
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +54 -1
- civil_tools_v-0.0.4/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +9 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/__init__.py +2 -2
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/Connector.py +16 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +81 -1
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/YDBLoader.py +219 -6
- {civil_tools_v-0.0.2/civil_tools_v.egg-info → civil_tools_v-0.0.4}/PKG-INFO +1 -1
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4/civil_tools_v.egg-info}/PKG-INFO +1 -1
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/civil_tools_v.egg-info/SOURCES.txt +4 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/setup.py +1 -1
- civil_tools_v-0.0.2/CivilTools/FigureGenerator/BasicPltPlotter.py +0 -58
- civil_tools_v-0.0.2/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +0 -2
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/Const/CAD.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/Const/Concrete.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/Const/Steel.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/Const/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/DXFGenerator/BasicDXF.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/DXFGenerator/DetailDXF.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/DXFGenerator/DrawingAttribs.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/DXFGenerator/LayerManager.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/DXFGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/FigureGenerator/BasicPNGPlotter.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/FigureGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/BasicGenerator.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/DocParagraph.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/DocPicture.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/DocTable.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/SeismicReport.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/SeismicReportTemplate.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/StairCalculationReport.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/UtilFunctions.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/YDBType.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/LICENSE +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/README.md +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/civil_tools_v.egg-info/dependency_links.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/civil_tools_v.egg-info/requires.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/civil_tools_v.egg-info/top_level.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/setup.cfg +0 -0
@@ -0,0 +1,117 @@
|
|
1
|
+
from typing import List
|
2
|
+
import matplotlib.pyplot as plt
|
3
|
+
from matplotlib.axes import Axes
|
4
|
+
import io
|
5
|
+
import numpy as np
|
6
|
+
|
7
|
+
plt.rcParams["font.sans-serif"] = ["SimHei"] # 用来正常显示中文标签
|
8
|
+
plt.rcParams["axes.unicode_minus"] = False
|
9
|
+
plt.rcParams["font.size"] = 14
|
10
|
+
|
11
|
+
|
12
|
+
def GetTicks(n_max=1):
|
13
|
+
if n_max == 0:
|
14
|
+
n_max = 100
|
15
|
+
m = int(np.log10(n_max))
|
16
|
+
if m <= 0 and n_max <= 1:
|
17
|
+
m -= 1
|
18
|
+
p = n_max / (10**m)
|
19
|
+
if p <= 2.2:
|
20
|
+
result = [i * 1 * 10**m for i in range(3)]
|
21
|
+
elif p <= 3.5:
|
22
|
+
result = [i * 2 * 10**m for i in range(3)]
|
23
|
+
elif p <= 5:
|
24
|
+
result = [i * 2.5 * 10**m for i in range(3)]
|
25
|
+
elif p <= 6.9:
|
26
|
+
result = [i * 3 * 10**m for i in range(4)]
|
27
|
+
elif p <= 8:
|
28
|
+
result = [i * 2 * 10**m for i in range(5)]
|
29
|
+
else:
|
30
|
+
result = [i * 2 * 10**m for i in range(6)]
|
31
|
+
return result
|
32
|
+
|
33
|
+
|
34
|
+
class BasicPltPlotter:
|
35
|
+
def __init__(self, fig_num: int = 1, fig_size=(10, 10)):
|
36
|
+
self.fig, _axes = plt.subplots(1, fig_num, figsize=fig_size)
|
37
|
+
if fig_num == 1:
|
38
|
+
self.axes = [_axes]
|
39
|
+
else:
|
40
|
+
self.axes = _axes
|
41
|
+
self.fig.patch.set_facecolor("none")
|
42
|
+
for ax in self.axes:
|
43
|
+
ax.patch.set_facecolor("none")
|
44
|
+
self.axes: List[Axes]
|
45
|
+
self.__remove_border()
|
46
|
+
|
47
|
+
def __remove_border(self):
|
48
|
+
for ax in self.axes:
|
49
|
+
ax.spines["right"].set_color("none")
|
50
|
+
ax.spines["top"].set_color("none")
|
51
|
+
|
52
|
+
def save_to_stream(self):
|
53
|
+
# 将图片保存到内存中的 BytesIO 对象
|
54
|
+
img_buffer = io.BytesIO()
|
55
|
+
self.fig.savefig(img_buffer, format="png", dpi=150) # 保存为 PNG 格式
|
56
|
+
plt.close() # 关闭图形,释放内存
|
57
|
+
# 将指针重置到流的开头,以便后续读取
|
58
|
+
img_buffer.seek(0)
|
59
|
+
return img_buffer
|
60
|
+
|
61
|
+
|
62
|
+
class SeismicPlotter(BasicPltPlotter):
|
63
|
+
def __init__(self, fig_num=2, floor_num: int = 8):
|
64
|
+
if fig_num != 1 and fig_num != 2:
|
65
|
+
raise ValueError("Only 1 or 2 is accepted for fig_num.")
|
66
|
+
if fig_num == 1:
|
67
|
+
fig_size = (3, 5)
|
68
|
+
else:
|
69
|
+
fig_size = (6, 5)
|
70
|
+
super().__init__(fig_num, fig_size)
|
71
|
+
self.kwargs_x = {
|
72
|
+
"label": "X",
|
73
|
+
"ls": "-",
|
74
|
+
"color": "k",
|
75
|
+
"marker": "o",
|
76
|
+
"ms": 3,
|
77
|
+
}
|
78
|
+
self.kwargs_y = {
|
79
|
+
"label": "X",
|
80
|
+
"ls": "-",
|
81
|
+
"color": "r",
|
82
|
+
"marker": "o",
|
83
|
+
"ms": 3,
|
84
|
+
}
|
85
|
+
self.floor_num = floor_num
|
86
|
+
self.y_label = "层号"
|
87
|
+
self._y_values = [i + 1 for i in range(self.floor_num)]
|
88
|
+
self._y_major_ticks = self.__create_y_ticks()
|
89
|
+
self._y_minor_ticks = [i + 1 for i in range(self.floor_num)]
|
90
|
+
self._ax1_x = [i for i in range(self.floor_num)]
|
91
|
+
self._ax1_y = [i * 0.5 for i in range(self.floor_num)]
|
92
|
+
self._ax2_x = [i for i in range(self.floor_num)]
|
93
|
+
self._ax2_y = [i * 0.5 for i in range(self.floor_num)]
|
94
|
+
|
95
|
+
def test_plot(self):
|
96
|
+
self.__plot()
|
97
|
+
|
98
|
+
def __plot(self):
|
99
|
+
self.axes[0].plot(self._ax1_x, self._y_values, **self.kwargs_x)
|
100
|
+
self.axes[0].plot(self._ax1_y, self._y_values, **self.kwargs_y)
|
101
|
+
self.axes[1].plot(self._ax2_x, self._y_values, **self.kwargs_x)
|
102
|
+
self.axes[1].plot(self._ax2_y, self._y_values, **self.kwargs_y)
|
103
|
+
|
104
|
+
def __create_y_ticks(self):
|
105
|
+
floor_num = self.floor_num
|
106
|
+
return range(0, int(floor_num) + 1, int(floor_num // 5) + 1)
|
107
|
+
|
108
|
+
def _validate_list_length(self, data_list, name):
|
109
|
+
"""
|
110
|
+
验证列表长度是否与楼层数相等
|
111
|
+
:param data_list: 待验证的列表
|
112
|
+
:param name: 列表的名称,用于异常信息
|
113
|
+
"""
|
114
|
+
if len(data_list) != self.floor_num:
|
115
|
+
raise ValueError(
|
116
|
+
f"Length of {name} is not equal to floor number: {self.floor_num}!"
|
117
|
+
)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
from ..BasicPltPlotter import SeismicPlotter, GetTicks
|
2
|
+
from typing import List
|
3
|
+
import numpy as np
|
4
|
+
import matplotlib.pyplot as plt
|
5
|
+
|
6
|
+
|
7
|
+
class DriftPlotter(SeismicPlotter):
|
8
|
+
def __init__(self, floor_num=8, fig_num=2):
|
9
|
+
super().__init__(fig_num, floor_num)
|
10
|
+
self.__limit = None
|
11
|
+
self.type = "层间位移角"
|
12
|
+
|
13
|
+
def set_data(
|
14
|
+
self,
|
15
|
+
wind_x: List[float],
|
16
|
+
wind_y: List[float],
|
17
|
+
seismic_x: List[float],
|
18
|
+
seismic_y: List[float],
|
19
|
+
):
|
20
|
+
# 验证数据长度
|
21
|
+
data_dict = {
|
22
|
+
"wind_x": wind_x,
|
23
|
+
"wind_y": wind_y,
|
24
|
+
"seismic_x": seismic_x,
|
25
|
+
"seismic_y": seismic_y,
|
26
|
+
}
|
27
|
+
for name, data_list in data_dict.items():
|
28
|
+
self._validate_list_length(data_list, name)
|
29
|
+
|
30
|
+
self._ax1_x = 1 / np.array(wind_x)
|
31
|
+
self._ax1_y = 1 / np.array(wind_y)
|
32
|
+
self._ax2_x = 1 / np.array(seismic_x)
|
33
|
+
self._ax2_y = 1 / np.array(seismic_y)
|
34
|
+
|
35
|
+
def plot(self):
|
36
|
+
if self.__limit:
|
37
|
+
self.__plot_limit()
|
38
|
+
kwargs_x = self.kwargs_x.copy()
|
39
|
+
kwargs_x["label"] = "X风"
|
40
|
+
kwargs_y = self.kwargs_y.copy()
|
41
|
+
kwargs_y["label"] = "Y风"
|
42
|
+
self.axes[0].plot(self._ax1_x, self._y_values, **kwargs_x)
|
43
|
+
self.axes[0].plot(self._ax1_y, self._y_values, **kwargs_y)
|
44
|
+
kwargs_x["label"] = "X小震"
|
45
|
+
kwargs_y["label"] = "Y小震"
|
46
|
+
self.axes[1].plot(self._ax2_x, self._y_values, **kwargs_x)
|
47
|
+
self.axes[1].plot(self._ax2_y, self._y_values, **kwargs_y)
|
48
|
+
self.__adjust_lim()
|
49
|
+
self.__add_titles()
|
50
|
+
|
51
|
+
def __adjust_lim(self):
|
52
|
+
xmaxs = [self._ax1_x.max(), self._ax2_x.max()]
|
53
|
+
for i in range(2):
|
54
|
+
self.axes[i].set_xlim(left=0, right=xmaxs[i] * 1.2)
|
55
|
+
self.axes[i].set_yticks(self._y_major_ticks)
|
56
|
+
self.axes[i].set_yticks(self._y_minor_ticks, minor=True)
|
57
|
+
x_ticks = GetTicks(xmaxs[i])
|
58
|
+
self.axes[i].set_xticks(x_ticks)
|
59
|
+
# self.axes[i].set_xticklabels([f"{i*100:.1f}%" for i in x_ticks])
|
60
|
+
|
61
|
+
def __add_titles(self):
|
62
|
+
self.axes[0].set_ylabel(self.y_label)
|
63
|
+
self.axes[0].set_xlabel(f"风下{self.type}")
|
64
|
+
self.axes[1].set_xlabel(f"小震下{self.type}")
|
65
|
+
self.axes[0].legend(framealpha=0, fontsize=12, loc=1)
|
66
|
+
self.axes[1].legend(framealpha=0, fontsize=12, loc=1)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
from ..BasicPltPlotter import SeismicPlotter, GetTicks
|
2
|
+
from typing import List
|
3
|
+
import numpy as np
|
4
|
+
import matplotlib.pyplot as plt
|
5
|
+
|
6
|
+
|
7
|
+
class ShearMassRatioPlotter(SeismicPlotter):
|
8
|
+
def __init__(self, fig_num=2, floor_num=8):
|
9
|
+
super().__init__(fig_num, floor_num)
|
10
|
+
self.__limit = None
|
11
|
+
self.type = "剪重比"
|
12
|
+
|
13
|
+
def set_data(self, shear_x: List[float], shear_y: List[float], mass: List[float]):
|
14
|
+
if len(shear_x) != self.floor_num:
|
15
|
+
raise ValueError(
|
16
|
+
f"Lenght of shear_x is not equal to floor number: {self.floor_num}!"
|
17
|
+
)
|
18
|
+
if len(shear_y) != self.floor_num:
|
19
|
+
raise ValueError(
|
20
|
+
f"Lenght of shear_y is not equal to floor number: {self.floor_num}!"
|
21
|
+
)
|
22
|
+
if len(mass) != self.floor_num:
|
23
|
+
raise ValueError(
|
24
|
+
f"Lenght of mass is not equal to floor number: {self.floor_num}!"
|
25
|
+
)
|
26
|
+
|
27
|
+
self._ax1_x = np.array(shear_x) / np.array(mass)
|
28
|
+
self._ax2_x = np.array(shear_y) / np.array(mass)
|
29
|
+
|
30
|
+
def set_limit(self, limit: float):
|
31
|
+
self.__limit = limit
|
32
|
+
|
33
|
+
def plot(self):
|
34
|
+
if self.__limit:
|
35
|
+
self.__plot_limit()
|
36
|
+
kwargs_x = self.kwargs_x.copy()
|
37
|
+
kwargs_x["label"] = "X"
|
38
|
+
kwargs_y = self.kwargs_x.copy()
|
39
|
+
kwargs_y["label"] = "Y"
|
40
|
+
self.axes[0].plot(self._ax1_x, self._y_values, **kwargs_x)
|
41
|
+
self.axes[1].plot(self._ax2_x, self._y_values, **kwargs_y)
|
42
|
+
self.__adjust_lim()
|
43
|
+
self.__add_titles()
|
44
|
+
|
45
|
+
def __plot_limit(self):
|
46
|
+
limitation = self.__limit
|
47
|
+
for ax in self.axes:
|
48
|
+
ax.vlines(
|
49
|
+
x=limitation,
|
50
|
+
ymin=0,
|
51
|
+
ymax=self.floor_num,
|
52
|
+
color="r",
|
53
|
+
linewidth=3,
|
54
|
+
ls="--",
|
55
|
+
label=f"限值{limitation*100:.1f}%",
|
56
|
+
)
|
57
|
+
|
58
|
+
def __adjust_lim(self):
|
59
|
+
xmaxs = [self._ax1_x.max(), self._ax2_x.max()]
|
60
|
+
for i in range(2):
|
61
|
+
self.axes[i].set_xlim(left=0, right=xmaxs[i] * 1.2)
|
62
|
+
self.axes[i].set_yticks(self._y_major_ticks)
|
63
|
+
self.axes[i].set_yticks(self._y_minor_ticks, minor=True)
|
64
|
+
x_ticks = GetTicks(xmaxs[i])
|
65
|
+
self.axes[i].set_xticks(x_ticks)
|
66
|
+
self.axes[i].set_xticklabels([f"{i*100:.1f}%" for i in x_ticks])
|
67
|
+
|
68
|
+
def __add_titles(self):
|
69
|
+
self.axes[0].set_ylabel(self.y_label)
|
70
|
+
self.axes[0].set_xlabel(f"X小震下{self.type}")
|
71
|
+
self.axes[1].set_xlabel(f"Y小震下{self.type}")
|
72
|
+
self.axes[0].legend(framealpha=0, fontsize=12, loc=4)
|
73
|
+
self.axes[1].legend(framealpha=0, fontsize=12, loc=4)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
from ..BasicPltPlotter import SeismicPlotter, GetTicks
|
2
|
+
from typing import List
|
3
|
+
import numpy as np
|
4
|
+
import matplotlib.pyplot as plt
|
5
|
+
|
6
|
+
|
7
|
+
class ShearMomentPlotter(SeismicPlotter):
|
8
|
+
def __init__(self, floor_num=8, type="Shear", fig_num=2):
|
9
|
+
super().__init__(fig_num, floor_num)
|
10
|
+
self.__limit = None
|
11
|
+
if type.lower() == "shear":
|
12
|
+
self.type = "楼层剪力 kN"
|
13
|
+
elif type.lower() == "moment":
|
14
|
+
self.type = "倾覆力矩 MN·m"
|
15
|
+
else:
|
16
|
+
raise ValueError("Only shear or moment is supported for type.")
|
17
|
+
|
18
|
+
def set_data(
|
19
|
+
self,
|
20
|
+
wind_x: List[float],
|
21
|
+
wind_y: List[float],
|
22
|
+
seismic_x: List[float],
|
23
|
+
seismic_y: List[float],
|
24
|
+
):
|
25
|
+
# 验证数据长度
|
26
|
+
data_dict = {
|
27
|
+
"wind_x": wind_x,
|
28
|
+
"wind_y": wind_y,
|
29
|
+
"seismic_x": seismic_x,
|
30
|
+
"seismic_y": seismic_y,
|
31
|
+
}
|
32
|
+
for name, data_list in data_dict.items():
|
33
|
+
self._validate_list_length(data_list, name)
|
34
|
+
|
35
|
+
self._ax1_x = np.array(wind_x)
|
36
|
+
self._ax1_y = np.array(wind_y)
|
37
|
+
self._ax2_x = np.array(seismic_x)
|
38
|
+
self._ax2_y = np.array(seismic_y)
|
39
|
+
|
40
|
+
def plot(self):
|
41
|
+
if self.__limit:
|
42
|
+
self.__plot_limit()
|
43
|
+
kwargs_x = self.kwargs_x.copy()
|
44
|
+
kwargs_x["label"] = "X风"
|
45
|
+
kwargs_y = self.kwargs_y.copy()
|
46
|
+
kwargs_y["label"] = "Y风"
|
47
|
+
self.axes[0].plot(self._ax1_x, self._y_values, **kwargs_x)
|
48
|
+
self.axes[0].plot(self._ax1_y, self._y_values, **kwargs_y)
|
49
|
+
kwargs_x["label"] = "X小震"
|
50
|
+
kwargs_y["label"] = "Y小震"
|
51
|
+
self.axes[1].plot(self._ax2_x, self._y_values, **kwargs_x)
|
52
|
+
self.axes[1].plot(self._ax2_y, self._y_values, **kwargs_y)
|
53
|
+
self.__adjust_lim()
|
54
|
+
self.__add_titles()
|
55
|
+
|
56
|
+
def __adjust_lim(self):
|
57
|
+
xmaxs = [self._ax1_x.max(), self._ax2_x.max()]
|
58
|
+
for i in range(2):
|
59
|
+
self.axes[i].set_xlim(left=0, right=xmaxs[i] * 1.2)
|
60
|
+
self.axes[i].set_yticks(self._y_major_ticks)
|
61
|
+
self.axes[i].set_yticks(self._y_minor_ticks, minor=True)
|
62
|
+
x_ticks = GetTicks(xmaxs[i])
|
63
|
+
self.axes[i].set_xticks(x_ticks)
|
64
|
+
# self.axes[i].set_xticklabels([f"{i*100:.1f}%" for i in x_ticks])
|
65
|
+
|
66
|
+
def __add_titles(self):
|
67
|
+
self.axes[0].set_ylabel(self.y_label)
|
68
|
+
self.axes[0].set_xlabel(f"风下{self.type}")
|
69
|
+
self.axes[1].set_xlabel(f"小震下{self.type}")
|
70
|
+
self.axes[0].legend(framealpha=0, fontsize=12, loc=1)
|
71
|
+
self.axes[1].legend(framealpha=0, fontsize=12, loc=1)
|
@@ -12,17 +12,25 @@ class SingleMassResult:
|
|
12
12
|
):
|
13
13
|
self.floor_num = floor_num
|
14
14
|
self.tower_num = tower_num
|
15
|
-
self.dead_load = dead_load
|
15
|
+
self.dead_load = round(dead_load, 4)
|
16
16
|
"""单层恒载,单位kN,没有折减"""
|
17
|
-
self.live_load = live_load
|
17
|
+
self.live_load = round(live_load, 4) * 2
|
18
18
|
"""单层活载,单位kN,没有折减"""
|
19
|
-
self.slab_area = slab_area
|
19
|
+
self.slab_area = round(slab_area)
|
20
20
|
"""单层楼板面积,单位m2"""
|
21
21
|
|
22
22
|
@property
|
23
23
|
def total_load(self):
|
24
24
|
"""单层质量,恒+0.5活"""
|
25
|
-
return self.dead_load + 0.5 * self.live_load
|
25
|
+
return round(self.dead_load + 0.5 * self.live_load, 4)
|
26
|
+
|
27
|
+
def to_json(self):
|
28
|
+
return {
|
29
|
+
"floor_num": self.floor_num,
|
30
|
+
"tower_num": self.tower_num,
|
31
|
+
"dead_load": self.dead_load,
|
32
|
+
"live_load": self.live_load,
|
33
|
+
}
|
26
34
|
|
27
35
|
|
28
36
|
class MassResult:
|
@@ -52,3 +60,6 @@ class MassResult:
|
|
52
60
|
mass_list.append(SingleMassResult(i + 1, 1, 5000, 2000, 350))
|
53
61
|
|
54
62
|
return MassResult(mass_list)
|
63
|
+
|
64
|
+
def to_json(self):
|
65
|
+
return {"mass_list": [i.to_json() for i in self.mass_list]}
|
@@ -64,6 +64,9 @@ class SinglePeriod:
|
|
64
64
|
def __repr__(self):
|
65
65
|
return str(self)
|
66
66
|
|
67
|
+
def to_json(self):
|
68
|
+
return {"index": self.index, "time": self.time}
|
69
|
+
|
67
70
|
|
68
71
|
class Period:
|
69
72
|
def __init__(self, periods: List[SinglePeriod], model_type=None):
|
@@ -144,6 +147,9 @@ class Period:
|
|
144
147
|
)
|
145
148
|
return Period(single_period_list)
|
146
149
|
|
150
|
+
def to_json(self):
|
151
|
+
return {"periods": [i.to_json() for i in self.periods]}
|
152
|
+
|
147
153
|
|
148
154
|
class ValuePeer:
|
149
155
|
def __init__(self, x: float, y: float):
|
@@ -158,6 +164,41 @@ class ValuePeer:
|
|
158
164
|
else:
|
159
165
|
return f"X:{self.x:.3f}\tY:{self.y:.3f}"
|
160
166
|
|
167
|
+
def to_json(self):
|
168
|
+
return {"X": self.x, "Y": self.y}
|
169
|
+
|
170
|
+
|
171
|
+
class FloorDrift:
|
172
|
+
def __init__(
|
173
|
+
self,
|
174
|
+
floor_height: float,
|
175
|
+
drift_max_disp_x: float,
|
176
|
+
drift_max_disp_y: float,
|
177
|
+
drift_min_disp_x: float,
|
178
|
+
drift_min_disp_y: float,
|
179
|
+
max_disp_x: float,
|
180
|
+
ave_disp_x: float,
|
181
|
+
max_disp_y: float,
|
182
|
+
ave_disp_y: float,
|
183
|
+
):
|
184
|
+
self.floor_height = floor_height
|
185
|
+
self.drift_max_disp_x = drift_max_disp_x
|
186
|
+
self.drift_max_disp_y = drift_max_disp_y
|
187
|
+
self.drift_min_disp_x = drift_min_disp_x
|
188
|
+
self.drift_min_disp_y = drift_min_disp_y
|
189
|
+
self.max_disp_x = max_disp_x
|
190
|
+
self.ave_disp_x = ave_disp_x
|
191
|
+
self.max_disp_y = max_disp_y
|
192
|
+
self.ave_disp_y = ave_disp_y
|
193
|
+
|
194
|
+
@property
|
195
|
+
def drift_x(self):
|
196
|
+
return round(self.floor_height / self.drift_max_disp_x)
|
197
|
+
|
198
|
+
@property
|
199
|
+
def drift_y(self):
|
200
|
+
return round(self.floor_height / self.drift_max_disp_y)
|
201
|
+
|
161
202
|
|
162
203
|
class FloorSeismicResult:
|
163
204
|
def __init__(
|
@@ -168,8 +209,9 @@ class FloorSeismicResult:
|
|
168
209
|
shear: ValuePeer = None,
|
169
210
|
moment: ValuePeer = None,
|
170
211
|
disp: ValuePeer = None,
|
171
|
-
stiffness: ValuePeer =
|
212
|
+
stiffness: List[ValuePeer] = [],
|
172
213
|
shear_capacity: ValuePeer = None,
|
214
|
+
drifts: List[FloorDrift] = [],
|
173
215
|
):
|
174
216
|
self.floor_num = floor_num
|
175
217
|
self.tower_num = tower_num
|
@@ -179,6 +221,7 @@ class FloorSeismicResult:
|
|
179
221
|
self.disp = disp
|
180
222
|
self.stiffness = stiffness
|
181
223
|
self.shear_capacity = shear_capacity
|
224
|
+
self.drifts = drifts
|
182
225
|
|
183
226
|
def __str__(self):
|
184
227
|
return f"Flr.{self.floor_num}:Fx={self.force.x};Fy={self.force.y}"
|
@@ -186,6 +229,13 @@ class FloorSeismicResult:
|
|
186
229
|
def __repr__(self):
|
187
230
|
return self.__str__()
|
188
231
|
|
232
|
+
def to_json(self):
|
233
|
+
return {
|
234
|
+
"floor_num": self.floor_num,
|
235
|
+
"tower_num": self.tower_num,
|
236
|
+
"shear": self.shear.to_json(),
|
237
|
+
}
|
238
|
+
|
189
239
|
|
190
240
|
class SeismicResult:
|
191
241
|
def __init__(self, floor_result: List[FloorSeismicResult]):
|
@@ -214,6 +264,9 @@ class SeismicResult:
|
|
214
264
|
def __repr__(self):
|
215
265
|
return self.__str__()
|
216
266
|
|
267
|
+
def to_json(self):
|
268
|
+
return {"floor_result": [i.to_json() for i in self.floor_result]}
|
269
|
+
|
217
270
|
|
218
271
|
if __name__ == "__main__":
|
219
272
|
p_list = []
|
@@ -1,9 +1,9 @@
|
|
1
1
|
from .Beam import Beam
|
2
2
|
from .Section import Section
|
3
|
-
from .Geometry import Joint,Grid,StandFloor
|
3
|
+
from .Geometry import Joint, Grid, StandFloor
|
4
4
|
from .Column import Column
|
5
5
|
from .Slab import Slab
|
6
6
|
|
7
7
|
from .ComponentType import ComponentType
|
8
8
|
from .GlobalResult import SingleMassResult, MassResult, Period, SinglePeriod
|
9
|
-
from .GlobalResult import ValuePeer, FloorSeismicResult, SeismicResult
|
9
|
+
from .GlobalResult import ValuePeer, FloorSeismicResult, SeismicResult, FloorDrift
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/Connector.py
RENAMED
@@ -65,6 +65,22 @@ class Connector:
|
|
65
65
|
print(f"从表 {table_name} 提取数据时出错: {e}")
|
66
66
|
return []
|
67
67
|
|
68
|
+
def extract_table_by_columns_and_filter(
|
69
|
+
self, table_name, column_list: List[str], limit_column: str, target_value
|
70
|
+
):
|
71
|
+
if self.cursor is None:
|
72
|
+
self.connect()
|
73
|
+
try:
|
74
|
+
column_list_sql = ",".join(column_list)
|
75
|
+
self.cursor.execute(
|
76
|
+
f"SELECT {column_list_sql} FROM {table_name} WHERE {limit_column}=={target_value}"
|
77
|
+
)
|
78
|
+
rows = self.cursor.fetchall()
|
79
|
+
return rows
|
80
|
+
except sqlite3.Error as e:
|
81
|
+
print(f"从表 {table_name} 提取数据时出错: {e}")
|
82
|
+
return []
|
83
|
+
|
68
84
|
def is_table_in_db(self, table_name: str):
|
69
85
|
|
70
86
|
if self.cursor is None:
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py
RENAMED
@@ -15,6 +15,7 @@ ROTATION = "Rotation"
|
|
15
15
|
|
16
16
|
FLOOR_NUM = "FlrNo"
|
17
17
|
TOWER_NUM = "TowNo"
|
18
|
+
LOAD_CASE_ID = "LDCase"
|
18
19
|
|
19
20
|
|
20
21
|
class YDBTableName:
|
@@ -84,7 +85,7 @@ class YDBTableName:
|
|
84
85
|
"""
|
85
86
|
|
86
87
|
RESULT_FLOOR_DATA_TABLE = "dsnStatFlrData"
|
87
|
-
"""
|
88
|
+
"""包含了大多数楼层计算结果,包括风、地震的各类外力、承载力、刚度等等"""
|
88
89
|
RESULT_FLOOR_DATA_USEFUL_COLUMNS_SEISMIC = [
|
89
90
|
FLOOR_NUM,
|
90
91
|
TOWER_NUM,
|
@@ -94,6 +95,8 @@ class YDBTableName:
|
|
94
95
|
"FlrVYInf",
|
95
96
|
"FlrMXInf",
|
96
97
|
"FlrMYInf", # 4 5 6 7
|
98
|
+
"CZLXInf",
|
99
|
+
"CZLYInf",
|
97
100
|
]
|
98
101
|
"""
|
99
102
|
0-floor_num ,
|
@@ -104,4 +107,81 @@ class YDBTableName:
|
|
104
107
|
5-Y方向地震层间剪力,
|
105
108
|
6-X方向地震倾覆力矩,
|
106
109
|
7-Y方向地震倾覆力矩,
|
110
|
+
8-X方向抗剪承载力,
|
111
|
+
9-Y方向抗剪承载力,
|
112
|
+
"""
|
113
|
+
|
114
|
+
RESULT_FLOOR_DATA_USEFUL_COLUMNS_STIFFNESS = [
|
115
|
+
"StiffShearCutXInf",
|
116
|
+
"StiffShearCutYInf",
|
117
|
+
"StiffShearDisXInf",
|
118
|
+
"StiffShearDisYInf",
|
119
|
+
"StiffBendXInf",
|
120
|
+
"StiffBendYInf",
|
121
|
+
]
|
122
|
+
"""
|
123
|
+
包含了楼层的各类刚度,剪切刚度、剪力位移计算刚度、剪弯刚度
|
124
|
+
0-剪切刚度X ,
|
125
|
+
1-剪切刚度Y ,
|
126
|
+
2-剪力位移计算刚度X,
|
127
|
+
3-剪力位移计算刚度Y,
|
128
|
+
4-剪弯刚度X,
|
129
|
+
5-剪弯刚度Y,
|
130
|
+
"""
|
131
|
+
|
132
|
+
RESULT_FLOOR_DATA_USEFUL_COLUMNS_WIND = [
|
133
|
+
FLOOR_NUM,
|
134
|
+
TOWER_NUM,
|
135
|
+
"FlrWindFInf",
|
136
|
+
"FlrWindVInf", # 0 1 2 3
|
137
|
+
"FlrWindMInf",
|
138
|
+
]
|
139
|
+
"""
|
140
|
+
0-floor_num ,
|
141
|
+
1-tower_num ,
|
142
|
+
2-XY方向顺风外力,
|
143
|
+
3-XY方向顺风剪力,
|
144
|
+
4-XY方向顺风弯矩,
|
145
|
+
"""
|
146
|
+
|
147
|
+
DISP_FLOOR_DATA_TABLE = "dsnStatDis"
|
148
|
+
"""包含了楼层在不同工况下的楼层位移"""
|
149
|
+
|
150
|
+
DISP_FLOOR_DATA_USEFUL_COLUMNS_WIND = [
|
151
|
+
FLOOR_NUM,
|
152
|
+
TOWER_NUM,
|
153
|
+
LOAD_CASE_ID,
|
154
|
+
"MaxFlrAngleDis",
|
155
|
+
"MinFlrAngleDis",
|
156
|
+
"MaxD",
|
157
|
+
"MassAveD",
|
158
|
+
]
|
159
|
+
"""
|
160
|
+
0-floor_num ,
|
161
|
+
1-tower_num ,
|
162
|
+
2-loadCaseID,需要做筛选
|
163
|
+
3-最大层间位移,
|
164
|
+
4-最小层间位移,
|
165
|
+
5-最大位移,
|
166
|
+
6-平均位移,
|
167
|
+
"""
|
168
|
+
|
169
|
+
ADJUST_COEF_TABLE = "dsnStatFlrAdjCoe"
|
170
|
+
"""楼层调整系数表格"""
|
171
|
+
ADJUST_COEF_USEFUL_COLUMN = [FLOOR_NUM, TOWER_NUM, "JZBCoeXInf", "JZBCoeYInf"]
|
172
|
+
"""
|
173
|
+
0-floor_num ,
|
174
|
+
1-tower_num ,
|
175
|
+
2-X方向剪重比调整系数
|
176
|
+
3-Y方向剪重比调整系数
|
177
|
+
"""
|
178
|
+
|
179
|
+
REAL_FLOOR_TABLE = "pmFlrAssembly"
|
180
|
+
"""楼层调整系数表格"""
|
181
|
+
REAL_FLOOR_USEFUL_COLUMN = ["No", STD_FLR_ID, "Level", "Height"]
|
182
|
+
"""
|
183
|
+
0-楼层编号 ,
|
184
|
+
1-标准层ID ,
|
185
|
+
2-层底高度
|
186
|
+
3-楼层高度
|
107
187
|
"""
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from .BuildingDefine import Beam, Column, Joint, ComponentType, Grid
|
2
2
|
from .BuildingDefine import SinglePeriod, Period, MassResult, SingleMassResult
|
3
|
-
from .BuildingDefine import ValuePeer, FloorSeismicResult, SeismicResult
|
3
|
+
from .BuildingDefine import ValuePeer, FloorSeismicResult, SeismicResult, FloorDrift
|
4
4
|
from .BuildingDefine.Section import Section, ShapeEnum
|
5
5
|
from .SQLiteConnector import Connector, YDBTableName, RowDataFactory
|
6
6
|
from .YDBType import YDBType
|
@@ -153,8 +153,8 @@ class YDBLoader:
|
|
153
153
|
row_data = self.connector.extract_table_by_columns(table_name, useful_columns)
|
154
154
|
mass_list = []
|
155
155
|
for temp_mass in row_data:
|
156
|
-
floor_num = RowDataFactory.convert_to_int(temp_mass
|
157
|
-
tower_num = RowDataFactory.convert_to_int(temp_mass
|
156
|
+
floor_num = RowDataFactory.convert_to_int(temp_mass[0])
|
157
|
+
tower_num = RowDataFactory.convert_to_int(temp_mass[1])
|
158
158
|
mass_info = RowDataFactory.extract_list(temp_mass, 2)
|
159
159
|
dead_load = RowDataFactory.convert_to_float(mass_info[1])
|
160
160
|
live_load = RowDataFactory.convert_to_float(mass_info[2])
|
@@ -199,9 +199,33 @@ class YDBLoader:
|
|
199
199
|
self.__check_result_model("seismic")
|
200
200
|
table_name = YDBTableName.RESULT_FLOOR_DATA_TABLE
|
201
201
|
useful_columns = YDBTableName.RESULT_FLOOR_DATA_USEFUL_COLUMNS_SEISMIC
|
202
|
+
useful_columns_stiffness = (
|
203
|
+
YDBTableName.RESULT_FLOOR_DATA_USEFUL_COLUMNS_STIFFNESS
|
204
|
+
)
|
202
205
|
row_data = self.connector.extract_table_by_columns(table_name, useful_columns)
|
206
|
+
stiffness_row_data = self.connector.extract_table_by_columns(
|
207
|
+
table_name, useful_columns_stiffness
|
208
|
+
)
|
209
|
+
|
210
|
+
table_disp_name = YDBTableName.DISP_FLOOR_DATA_TABLE
|
211
|
+
useful_columns_disp = YDBTableName.DISP_FLOOR_DATA_USEFUL_COLUMNS_WIND
|
212
|
+
|
213
|
+
seismic_load_cases = self.__get_seismic_loadcase_numbers()
|
214
|
+
|
215
|
+
seismic_disp_x_row_data = self.connector.extract_table_by_columns_and_filter(
|
216
|
+
table_disp_name, useful_columns_disp, "LDCase", seismic_load_cases[0]
|
217
|
+
)
|
218
|
+
seismic_disp_y_row_data = self.connector.extract_table_by_columns_and_filter(
|
219
|
+
table_disp_name, useful_columns_disp, "LDCase", seismic_load_cases[1]
|
220
|
+
)
|
221
|
+
jzb_coeff = self.__get_JZBCoe()
|
222
|
+
floor_height = self.__get_floor_height()
|
203
223
|
floor_result_list = []
|
204
|
-
for
|
224
|
+
for i in range(len(row_data)):
|
225
|
+
temp_floor = row_data[i]
|
226
|
+
temp_floor_stiffness = stiffness_row_data[i]
|
227
|
+
temp_disp_x = seismic_disp_x_row_data[i]
|
228
|
+
temp_disp_y = seismic_disp_y_row_data[i]
|
205
229
|
floor_num = RowDataFactory.extract_int(temp_floor, 0)
|
206
230
|
tower_num = RowDataFactory.extract_int(temp_floor, 1)
|
207
231
|
force_x = RowDataFactory.convert_to_float(
|
@@ -222,17 +246,206 @@ class YDBLoader:
|
|
222
246
|
moment_y = RowDataFactory.convert_to_float(
|
223
247
|
RowDataFactory.extract_list(temp_floor, 7)[1]
|
224
248
|
)
|
249
|
+
shear_cap_x = RowDataFactory.convert_to_float(
|
250
|
+
RowDataFactory.extract_list(temp_floor, 8)[1]
|
251
|
+
)
|
252
|
+
shear_cap_y = RowDataFactory.convert_to_float(
|
253
|
+
RowDataFactory.extract_list(temp_floor, 9)[1]
|
254
|
+
)
|
255
|
+
stiff_x_shear_cut = RowDataFactory.convert_to_float(
|
256
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 0)[1]
|
257
|
+
)
|
258
|
+
stiff_y_shear_cut = RowDataFactory.convert_to_float(
|
259
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 1)[1]
|
260
|
+
)
|
261
|
+
stiff_x_shear_dis = RowDataFactory.convert_to_float(
|
262
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 2)[1]
|
263
|
+
)
|
264
|
+
stiff_y_shear_dis = RowDataFactory.convert_to_float(
|
265
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 3)[1]
|
266
|
+
)
|
267
|
+
stiff_x_shear_bend = RowDataFactory.convert_to_float(
|
268
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 4)[1]
|
269
|
+
)
|
270
|
+
stiff_y_shear_bend = RowDataFactory.convert_to_float(
|
271
|
+
RowDataFactory.extract_list(temp_floor_stiffness, 5)[1]
|
272
|
+
)
|
273
|
+
|
274
|
+
max_drift_disp_x = RowDataFactory.convert_to_float(temp_disp_x[3])
|
275
|
+
max_drift_disp_y = RowDataFactory.convert_to_float(temp_disp_y[3])
|
276
|
+
|
277
|
+
min_drift_disp_x = RowDataFactory.convert_to_float(temp_disp_x[4])
|
278
|
+
min_drift_disp_y = RowDataFactory.convert_to_float(temp_disp_y[4])
|
279
|
+
|
280
|
+
max_disp_x = RowDataFactory.convert_to_float(temp_disp_x[5])
|
281
|
+
max_disp_y = RowDataFactory.convert_to_float(temp_disp_y[5])
|
282
|
+
|
283
|
+
ave_disp_x = RowDataFactory.convert_to_float(temp_disp_x[6])
|
284
|
+
ave_disp_y = RowDataFactory.convert_to_float(temp_disp_y[6])
|
285
|
+
|
225
286
|
force = ValuePeer(force_x, force_y)
|
226
287
|
shear = ValuePeer(shear_x, shear_y)
|
227
288
|
moment = ValuePeer(moment_x, moment_y)
|
228
|
-
|
289
|
+
disp = ValuePeer(
|
290
|
+
max_disp_x * jzb_coeff[floor_num][0],
|
291
|
+
max_disp_y * jzb_coeff[floor_num][1],
|
292
|
+
)
|
293
|
+
stiffness_list = [
|
294
|
+
ValuePeer(stiff_x_shear_cut, stiff_y_shear_cut),
|
295
|
+
ValuePeer(stiff_x_shear_dis, stiff_y_shear_dis),
|
296
|
+
ValuePeer(stiff_x_shear_bend, stiff_y_shear_bend),
|
297
|
+
]
|
298
|
+
shear_capacity = ValuePeer(shear_cap_x, shear_cap_y)
|
299
|
+
drifts = [
|
300
|
+
FloorDrift(
|
301
|
+
floor_height[floor_num],
|
302
|
+
max_drift_disp_x * jzb_coeff[floor_num][0],
|
303
|
+
max_drift_disp_y * jzb_coeff[floor_num][1],
|
304
|
+
min_drift_disp_x * jzb_coeff[floor_num][0],
|
305
|
+
min_drift_disp_y * jzb_coeff[floor_num][1],
|
306
|
+
max_disp_x * jzb_coeff[floor_num][0],
|
307
|
+
max_disp_y * jzb_coeff[floor_num][1],
|
308
|
+
ave_disp_x * jzb_coeff[floor_num][0],
|
309
|
+
ave_disp_y * jzb_coeff[floor_num][1],
|
310
|
+
)
|
311
|
+
]
|
229
312
|
temp_floor_result = FloorSeismicResult(
|
230
|
-
floor_num,
|
313
|
+
floor_num,
|
314
|
+
tower_num,
|
315
|
+
force,
|
316
|
+
shear,
|
317
|
+
moment,
|
318
|
+
disp,
|
319
|
+
stiffness_list,
|
320
|
+
shear_capacity,
|
321
|
+
drifts,
|
231
322
|
)
|
232
323
|
floor_result_list.append(temp_floor_result)
|
233
324
|
|
234
325
|
return SeismicResult(floor_result_list)
|
235
326
|
|
327
|
+
def get_wind_result(self) -> SeismicResult:
|
328
|
+
self.__check_result_model("wind")
|
329
|
+
table_name = YDBTableName.RESULT_FLOOR_DATA_TABLE
|
330
|
+
useful_columns = YDBTableName.RESULT_FLOOR_DATA_USEFUL_COLUMNS_WIND
|
331
|
+
row_data = self.connector.extract_table_by_columns(table_name, useful_columns)
|
332
|
+
|
333
|
+
table_disp_name = YDBTableName.DISP_FLOOR_DATA_TABLE
|
334
|
+
useful_columns_disp = YDBTableName.DISP_FLOOR_DATA_USEFUL_COLUMNS_WIND
|
335
|
+
|
336
|
+
wind_load_cases = self.__get_wind_loadcase_numbers()
|
337
|
+
|
338
|
+
wind_disp_x_row_data = self.connector.extract_table_by_columns_and_filter(
|
339
|
+
table_disp_name, useful_columns_disp, "LDCase", wind_load_cases[0]
|
340
|
+
)
|
341
|
+
wind_disp_y_row_data = self.connector.extract_table_by_columns_and_filter(
|
342
|
+
table_disp_name, useful_columns_disp, "LDCase", wind_load_cases[1]
|
343
|
+
)
|
344
|
+
|
345
|
+
floor_result_list = []
|
346
|
+
floor_height = self.__get_floor_height()
|
347
|
+
|
348
|
+
for i in range(len(row_data)):
|
349
|
+
temp_floor = row_data[i]
|
350
|
+
temp_disp_x = wind_disp_x_row_data[i]
|
351
|
+
temp_disp_y = wind_disp_y_row_data[i]
|
352
|
+
floor_num = RowDataFactory.extract_int(temp_floor, 0)
|
353
|
+
tower_num = RowDataFactory.extract_int(temp_floor, 1)
|
354
|
+
force_x = RowDataFactory.convert_to_float(
|
355
|
+
RowDataFactory.extract_list(temp_floor, 2)[1]
|
356
|
+
)
|
357
|
+
force_y = RowDataFactory.convert_to_float(
|
358
|
+
RowDataFactory.extract_list(temp_floor, 2)[3]
|
359
|
+
)
|
360
|
+
shear_x = RowDataFactory.convert_to_float(
|
361
|
+
RowDataFactory.extract_list(temp_floor, 3)[1]
|
362
|
+
)
|
363
|
+
shear_y = RowDataFactory.convert_to_float(
|
364
|
+
RowDataFactory.extract_list(temp_floor, 3)[3]
|
365
|
+
)
|
366
|
+
moment_x = RowDataFactory.convert_to_float(
|
367
|
+
RowDataFactory.extract_list(temp_floor, 4)[1]
|
368
|
+
)
|
369
|
+
moment_y = RowDataFactory.convert_to_float(
|
370
|
+
RowDataFactory.extract_list(temp_floor, 4)[3]
|
371
|
+
)
|
372
|
+
|
373
|
+
max_drift_disp_x = RowDataFactory.convert_to_float(temp_disp_x[3])
|
374
|
+
max_drift_disp_y = RowDataFactory.convert_to_float(temp_disp_y[3])
|
375
|
+
|
376
|
+
min_drift_disp_x = RowDataFactory.convert_to_float(temp_disp_x[4])
|
377
|
+
min_drift_disp_y = RowDataFactory.convert_to_float(temp_disp_y[4])
|
378
|
+
|
379
|
+
max_disp_x = RowDataFactory.convert_to_float(temp_disp_x[5])
|
380
|
+
max_disp_y = RowDataFactory.convert_to_float(temp_disp_y[5])
|
381
|
+
|
382
|
+
ave_disp_x = RowDataFactory.convert_to_float(temp_disp_x[6])
|
383
|
+
ave_disp_y = RowDataFactory.convert_to_float(temp_disp_y[6])
|
384
|
+
|
385
|
+
force = ValuePeer(abs(force_x), abs(force_y))
|
386
|
+
shear = ValuePeer(abs(shear_x), abs(shear_y))
|
387
|
+
moment = ValuePeer(abs(moment_x), abs(moment_y))
|
388
|
+
disp = ValuePeer(123, 245)
|
389
|
+
drifts = [
|
390
|
+
FloorDrift(
|
391
|
+
floor_height[floor_num],
|
392
|
+
max_drift_disp_x,
|
393
|
+
max_drift_disp_y,
|
394
|
+
min_drift_disp_x,
|
395
|
+
min_drift_disp_y,
|
396
|
+
max_disp_x,
|
397
|
+
max_disp_y,
|
398
|
+
ave_disp_x,
|
399
|
+
ave_disp_y,
|
400
|
+
)
|
401
|
+
]
|
402
|
+
temp_floor_result = FloorSeismicResult(
|
403
|
+
floor_num, tower_num, force, shear, moment, disp, drifts=drifts
|
404
|
+
)
|
405
|
+
|
406
|
+
floor_result_list.append(temp_floor_result)
|
407
|
+
return SeismicResult(floor_result_list)
|
408
|
+
|
409
|
+
def __get_wind_loadcase_numbers(self):
|
410
|
+
return [2, 4]
|
411
|
+
|
412
|
+
def __get_seismic_loadcase_numbers(self):
|
413
|
+
return [9, 10]
|
414
|
+
|
415
|
+
def __get_JZBCoe(self):
|
416
|
+
if hasattr(self, "jzb_coeff"):
|
417
|
+
return self.jzb_coeff
|
418
|
+
table_name = YDBTableName.ADJUST_COEF_TABLE
|
419
|
+
useful_column = YDBTableName.ADJUST_COEF_USEFUL_COLUMN
|
420
|
+
row_data = self.connector.extract_table_by_columns(table_name, useful_column)
|
421
|
+
jzb_coeff = {}
|
422
|
+
for temp_data in row_data:
|
423
|
+
floor_num = RowDataFactory.extract_int(temp_data, 0)
|
424
|
+
# tower_num = RowDataFactory.extract_int(temp_data, 1)
|
425
|
+
coeff_x = RowDataFactory.convert_to_float(
|
426
|
+
RowDataFactory.extract_list(temp_data, 2)[1]
|
427
|
+
)
|
428
|
+
coeff_y = RowDataFactory.convert_to_float(
|
429
|
+
RowDataFactory.extract_list(temp_data, 3)[1]
|
430
|
+
)
|
431
|
+
jzb_coeff[floor_num] = [coeff_x, coeff_y]
|
432
|
+
self.jzb_coeff = jzb_coeff
|
433
|
+
return self.jzb_coeff
|
434
|
+
|
435
|
+
def __get_floor_height(self):
|
436
|
+
if hasattr(self, "floor_height"):
|
437
|
+
return self.floor_height
|
438
|
+
table_name = YDBTableName.REAL_FLOOR_TABLE
|
439
|
+
useful_column = YDBTableName.REAL_FLOOR_USEFUL_COLUMN
|
440
|
+
row_data = self.connector.extract_table_by_columns(table_name, useful_column)
|
441
|
+
floor_height = {}
|
442
|
+
for temp_data in row_data:
|
443
|
+
floor_num = RowDataFactory.extract_int(temp_data, 0)
|
444
|
+
height = RowDataFactory.extract_float(temp_data, 3)
|
445
|
+
floor_height[floor_num] = height
|
446
|
+
self.floor_height = floor_height
|
447
|
+
return self.floor_height
|
448
|
+
|
236
449
|
|
237
450
|
if __name__ == "__main__":
|
238
451
|
file_path = "testfiles/dtlmodel1.ydb"
|
@@ -15,6 +15,10 @@ CivilTools/FigureGenerator/BasicPNGPlotter.py
|
|
15
15
|
CivilTools/FigureGenerator/BasicPltPlotter.py
|
16
16
|
CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py
|
17
17
|
CivilTools/FigureGenerator/__init__.py
|
18
|
+
CivilTools/FigureGenerator/SeismicReport/Drift.py
|
19
|
+
CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py
|
20
|
+
CivilTools/FigureGenerator/SeismicReport/ShearMoment.py
|
21
|
+
CivilTools/FigureGenerator/SeismicReport/__init__.py
|
18
22
|
CivilTools/ReportGenerator/BasicGenerator.py
|
19
23
|
CivilTools/ReportGenerator/DocParagraph.py
|
20
24
|
CivilTools/ReportGenerator/DocPicture.py
|
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|
2
2
|
|
3
3
|
setup(
|
4
4
|
name="civil_tools_v", # 包的名称
|
5
|
-
version="0.0.
|
5
|
+
version="0.0.4", # 包的版本号
|
6
6
|
author="Xinyu Gao (Vincent)", # 作者姓名
|
7
7
|
author_email="just_gxy@163.com", # 作者邮箱
|
8
8
|
description="A powerful tool for civil engineer in their work.", # 包的简短描述
|
@@ -1,58 +0,0 @@
|
|
1
|
-
from typing import List
|
2
|
-
import matplotlib.pyplot as plt
|
3
|
-
from matplotlib.axes import Axes
|
4
|
-
import io
|
5
|
-
|
6
|
-
|
7
|
-
class BasicPltPlotter:
|
8
|
-
def __init__(self, fig_num: int = 1, fig_size=(10, 10)):
|
9
|
-
self.fig, _axes = plt.subplots(1, fig_num, figsize=fig_size)
|
10
|
-
if fig_num == 1:
|
11
|
-
self.axes = [_axes]
|
12
|
-
else:
|
13
|
-
self.axes = _axes
|
14
|
-
self.axes: List[Axes]
|
15
|
-
self.__remove_border()
|
16
|
-
|
17
|
-
def __remove_border(self):
|
18
|
-
for ax in self.axes:
|
19
|
-
ax.spines["right"].set_color("none")
|
20
|
-
ax.spines["top"].set_color("none")
|
21
|
-
|
22
|
-
def save_to_stream(self):
|
23
|
-
# 将图片保存到内存中的 BytesIO 对象
|
24
|
-
img_buffer = io.BytesIO()
|
25
|
-
self.fig.savefig(img_buffer, format="png", dpi=300) # 保存为 PNG 格式
|
26
|
-
plt.close() # 关闭图形,释放内存
|
27
|
-
# 将指针重置到流的开头,以便后续读取
|
28
|
-
img_buffer.seek(0)
|
29
|
-
return img_buffer
|
30
|
-
|
31
|
-
|
32
|
-
class SeismicPlotter(BasicPltPlotter):
|
33
|
-
def __init__(self, fig_num=2, floor_num: int = 8):
|
34
|
-
if fig_num != 1 and fig_num != 2:
|
35
|
-
raise ValueError("Only 1 or 2 is accepted for fig_num.")
|
36
|
-
if fig_num == 1:
|
37
|
-
fig_size = (3, 5)
|
38
|
-
else:
|
39
|
-
fig_size = (6, 5)
|
40
|
-
super().__init__(fig_num, fig_size)
|
41
|
-
self.floor_num = floor_num
|
42
|
-
self.__y_values = [i + 1 for i in range(self.floor_num)]
|
43
|
-
self.__ax1_x = [i for i in range(self.floor_num)]
|
44
|
-
self.__ax1_y = [i * 0.5 for i in range(self.floor_num)]
|
45
|
-
self.__ax2_x = [i for i in range(self.floor_num)]
|
46
|
-
self.__ax2_y = [i * 0.5 for i in range(self.floor_num)]
|
47
|
-
|
48
|
-
def test_plot(self):
|
49
|
-
self.__plot()
|
50
|
-
|
51
|
-
def __plot(self):
|
52
|
-
kwargs_x = {"label": "X", "ls": "-", "color": "k", "marker": "o", "ms": 3}
|
53
|
-
kwargs_y = {"label": "X", "ls": "-", "color": "r", "marker": "o", "ms": 3}
|
54
|
-
|
55
|
-
self.axes[0].plot(self.__ax1_x, self.__y_values, **kwargs_x)
|
56
|
-
self.axes[0].plot(self.__ax1_y, self.__y_values, **kwargs_y)
|
57
|
-
self.axes[1].plot(self.__ax2_x, self.__y_values, **kwargs_x)
|
58
|
-
self.axes[1].plot(self.__ax2_y, self.__y_values, **kwargs_y)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/SeismicReportTemplate.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/ReportGenerator/StairCalculationReport.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py
RENAMED
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.4}/CivilTools/YDBLoader/SQLiteConnector/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|