civil-tools-v 0.0.2__tar.gz → 0.0.3__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.3/CivilTools/FigureGenerator/BasicPltPlotter.py +117 -0
- civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py +73 -0
- civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/ShearMoment.py +71 -0
- civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/__init__.py +2 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +15 -4
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +19 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/YDBLoader.py +2 -3
- {civil_tools_v-0.0.2/civil_tools_v.egg-info → civil_tools_v-0.0.3}/PKG-INFO +1 -1
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3/civil_tools_v.egg-info}/PKG-INFO +1 -1
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/SOURCES.txt +3 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/setup.py +1 -1
- civil_tools_v-0.0.2/CivilTools/FigureGenerator/BasicPltPlotter.py +0 -58
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/CAD.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/Concrete.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/Steel.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/BasicDXF.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/DetailDXF.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/DrawingAttribs.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/LayerManager.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/BasicPNGPlotter.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/BasicGenerator.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocParagraph.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocPicture.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocTable.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/SeismicReport.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/SeismicReportTemplate.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/StairCalculationReport.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/UtilFunctions.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/Connector.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/YDBType.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/__init__.py +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/LICENSE +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/README.md +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/dependency_links.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/requires.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/top_level.txt +0 -0
- {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/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,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,9 @@ 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
|
+
|
161
170
|
|
162
171
|
class FloorSeismicResult:
|
163
172
|
def __init__(
|
@@ -186,6 +195,13 @@ class FloorSeismicResult:
|
|
186
195
|
def __repr__(self):
|
187
196
|
return self.__str__()
|
188
197
|
|
198
|
+
def to_json(self):
|
199
|
+
return {
|
200
|
+
"floor_num": self.floor_num,
|
201
|
+
"tower_num": self.tower_num,
|
202
|
+
"shear": self.shear.to_json(),
|
203
|
+
}
|
204
|
+
|
189
205
|
|
190
206
|
class SeismicResult:
|
191
207
|
def __init__(self, floor_result: List[FloorSeismicResult]):
|
@@ -214,6 +230,9 @@ class SeismicResult:
|
|
214
230
|
def __repr__(self):
|
215
231
|
return self.__str__()
|
216
232
|
|
233
|
+
def to_json(self):
|
234
|
+
return {"floor_result": [i.to_json() for i in self.floor_result]}
|
235
|
+
|
217
236
|
|
218
237
|
if __name__ == "__main__":
|
219
238
|
p_list = []
|
@@ -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])
|
@@ -225,7 +225,6 @@ class YDBLoader:
|
|
225
225
|
force = ValuePeer(force_x, force_y)
|
226
226
|
shear = ValuePeer(shear_x, shear_y)
|
227
227
|
moment = ValuePeer(moment_x, moment_y)
|
228
|
-
|
229
228
|
temp_floor_result = FloorSeismicResult(
|
230
229
|
floor_num, tower_num, force, shear, moment
|
231
230
|
)
|
@@ -15,6 +15,9 @@ 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/ShearMassRatio.py
|
19
|
+
CivilTools/FigureGenerator/SeismicReport/ShearMoment.py
|
20
|
+
CivilTools/FigureGenerator/SeismicReport/__init__.py
|
18
21
|
CivilTools/ReportGenerator/BasicGenerator.py
|
19
22
|
CivilTools/ReportGenerator/DocParagraph.py
|
20
23
|
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.3", # 包的版本号
|
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.3}/CivilTools/ReportGenerator/SeismicReportTemplate.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/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.3}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py
RENAMED
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py
RENAMED
File without changes
|
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py
RENAMED
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.3}/CivilTools/YDBLoader/SQLiteConnector/Connector.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py
RENAMED
File without changes
|
{civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/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
|