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.
Files changed (66) hide show
  1. civil_tools_v-0.0.3/CivilTools/FigureGenerator/BasicPltPlotter.py +117 -0
  2. civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py +73 -0
  3. civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/ShearMoment.py +71 -0
  4. civil_tools_v-0.0.3/CivilTools/FigureGenerator/SeismicReport/__init__.py +2 -0
  5. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +15 -4
  6. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +19 -0
  7. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/YDBLoader.py +2 -3
  8. {civil_tools_v-0.0.2/civil_tools_v.egg-info → civil_tools_v-0.0.3}/PKG-INFO +1 -1
  9. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3/civil_tools_v.egg-info}/PKG-INFO +1 -1
  10. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/SOURCES.txt +3 -0
  11. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/setup.py +1 -1
  12. civil_tools_v-0.0.2/CivilTools/FigureGenerator/BasicPltPlotter.py +0 -58
  13. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/CAD.py +0 -0
  14. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/Concrete.py +0 -0
  15. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/Steel.py +0 -0
  16. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/Const/__init__.py +0 -0
  17. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/BasicDXF.py +0 -0
  18. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/DetailDXF.py +0 -0
  19. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/DrawingAttribs.py +0 -0
  20. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/LayerManager.py +0 -0
  21. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/DXFGenerator/__init__.py +0 -0
  22. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/BasicPNGPlotter.py +0 -0
  23. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +0 -0
  24. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/FigureGenerator/__init__.py +0 -0
  25. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/BasicGenerator.py +0 -0
  26. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocParagraph.py +0 -0
  27. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocPicture.py +0 -0
  28. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/DocTable.py +0 -0
  29. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/SeismicReport.py +0 -0
  30. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/SeismicReportTemplate.py +0 -0
  31. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/StairCalculationReport.py +0 -0
  32. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/UtilFunctions.py +0 -0
  33. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/ReportGenerator/__init__.py +0 -0
  34. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +0 -0
  35. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +0 -0
  36. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py +0 -0
  37. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +0 -0
  38. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py +0 -0
  39. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +0 -0
  40. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +0 -0
  41. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +0 -0
  42. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +0 -0
  43. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +0 -0
  44. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py +0 -0
  45. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +0 -0
  46. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +0 -0
  47. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +0 -0
  48. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +0 -0
  49. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +0 -0
  50. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +0 -0
  51. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +0 -0
  52. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +0 -0
  53. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/BuildingDefine/__init__.py +0 -0
  54. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/Connector.py +0 -0
  55. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +0 -0
  56. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +0 -0
  57. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/SQLiteConnector/__init__.py +0 -0
  58. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/YDBType.py +0 -0
  59. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/YDBLoader/__init__.py +0 -0
  60. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/CivilTools/__init__.py +0 -0
  61. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/LICENSE +0 -0
  62. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/README.md +0 -0
  63. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/dependency_links.txt +0 -0
  64. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/requires.txt +0 -0
  65. {civil_tools_v-0.0.2 → civil_tools_v-0.0.3}/civil_tools_v.egg-info/top_level.txt +0 -0
  66. {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)
@@ -0,0 +1,2 @@
1
+ from .ShearMassRatio import ShearMassRatioPlotter
2
+ from .ShearMoment import ShearMomentPlotter
@@ -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, 0)
157
- tower_num = RowDataFactory.convert_to_int(temp_mass, 1)
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
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: civil_tools_v
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: A powerful tool for civil engineer in their work.
5
5
  Home-page: https://github.com/VincentXGao/civil-tools
6
6
  Author: Xinyu Gao (Vincent)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: civil_tools_v
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: A powerful tool for civil engineer in their work.
5
5
  Home-page: https://github.com/VincentXGao/civil-tools
6
6
  Author: Xinyu Gao (Vincent)
@@ -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.2", # 包的版本号
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