civil-tools-v 0.0.2__py3-none-any.whl → 0.0.4__py3-none-any.whl

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.
@@ -2,6 +2,33 @@ from typing import List
2
2
  import matplotlib.pyplot as plt
3
3
  from matplotlib.axes import Axes
4
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
5
32
 
6
33
 
7
34
  class BasicPltPlotter:
@@ -11,6 +38,9 @@ class BasicPltPlotter:
11
38
  self.axes = [_axes]
12
39
  else:
13
40
  self.axes = _axes
41
+ self.fig.patch.set_facecolor("none")
42
+ for ax in self.axes:
43
+ ax.patch.set_facecolor("none")
14
44
  self.axes: List[Axes]
15
45
  self.__remove_border()
16
46
 
@@ -22,7 +52,7 @@ class BasicPltPlotter:
22
52
  def save_to_stream(self):
23
53
  # 将图片保存到内存中的 BytesIO 对象
24
54
  img_buffer = io.BytesIO()
25
- self.fig.savefig(img_buffer, format="png", dpi=300) # 保存为 PNG 格式
55
+ self.fig.savefig(img_buffer, format="png", dpi=150) # 保存为 PNG 格式
26
56
  plt.close() # 关闭图形,释放内存
27
57
  # 将指针重置到流的开头,以便后续读取
28
58
  img_buffer.seek(0)
@@ -38,21 +68,50 @@ class SeismicPlotter(BasicPltPlotter):
38
68
  else:
39
69
  fig_size = (6, 5)
40
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
+ }
41
85
  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)]
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)]
47
94
 
48
95
  def test_plot(self):
49
96
  self.__plot()
50
97
 
51
98
  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}
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)
54
107
 
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)
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)
@@ -0,0 +1,3 @@
1
+ from .ShearMassRatio import ShearMassRatioPlotter
2
+ from .ShearMoment import ShearMomentPlotter
3
+ from .Drift import DriftPlotter
@@ -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 = None,
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,2 +1,9 @@
1
- from .SeismicResult import SinglePeriod, Period, ValuePeer, FloorSeismicResult, SeismicResult
1
+ from .SeismicResult import (
2
+ SinglePeriod,
3
+ Period,
4
+ ValuePeer,
5
+ FloorSeismicResult,
6
+ SeismicResult,
7
+ FloorDrift,
8
+ )
2
9
  from .BasicResult import SingleMassResult, MassResult
@@ -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
@@ -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:
@@ -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, 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])
@@ -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 temp_floor in row_data:
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, tower_num, force, shear, moment
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"
@@ -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.4
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)
@@ -9,9 +9,13 @@ CivilTools/DXFGenerator/DrawingAttribs.py,sha256=F3CElw80JVKxh9zYMAeQDKJSsmq-GRq
9
9
  CivilTools/DXFGenerator/LayerManager.py,sha256=_FelBJNUsnDn66ZdVqBdnfYHvQ7roAO6irgFf2mDkjQ,664
10
10
  CivilTools/DXFGenerator/__init__.py,sha256=0jtyx5QnPbhauFfgjj4I5uqCwTy-nSuKtT-tbyEUiwQ,147
11
11
  CivilTools/FigureGenerator/BasicPNGPlotter.py,sha256=7PjRuArFc4y-NYy6WQCyfkpCahVCwtipJYEKk1My1D4,1982
12
- CivilTools/FigureGenerator/BasicPltPlotter.py,sha256=4Fup44jHQfzlfsLX4PQWcitcp-nEOFeyNLxLqR79oa0,2210
12
+ CivilTools/FigureGenerator/BasicPltPlotter.py,sha256=DNuBgg5qwi0kbttrNLcnAr1G1rYNunNCOaLwc5_8dzk,4002
13
13
  CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py,sha256=iVOEY3MXu7x9D1d3W6fofPCUOHaR06lT9CsssNGqeBI,200
14
14
  CivilTools/FigureGenerator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ CivilTools/FigureGenerator/SeismicReport/Drift.py,sha256=aYzTm2hDcnpLQ_I-EPctQ2MIdjLHRE9Lr89Ns9mRYBQ,2437
16
+ CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py,sha256=XpmPA9PeRED4Xzl_5LgJVgm9jEHuTda2GAFs5zMfVP8,2731
17
+ CivilTools/FigureGenerator/SeismicReport/ShearMoment.py,sha256=dYa4SK20u6MJXDsLAkpGk8t2U2tu3bEmBheu5D5nHek,2660
18
+ CivilTools/FigureGenerator/SeismicReport/__init__.py,sha256=QPYbo9DvhHmTwccgcZfsV7_TWephS_F44xbWgry9WXg,129
15
19
  CivilTools/ReportGenerator/BasicGenerator.py,sha256=h5FDZvk0X0BozZrLFWxdvcUd2JjERIVUauTscdpi8zw,11329
16
20
  CivilTools/ReportGenerator/DocParagraph.py,sha256=xJ9VWbi3IFu5nwJAS56ooQ49bCk4EBvme6IaY46DRP4,428
17
21
  CivilTools/ReportGenerator/DocPicture.py,sha256=9bJ6Zjw7Z6yB_h_H1_2wL9KZxA14zW-jmsKb_EEGxAc,246
@@ -21,11 +25,11 @@ CivilTools/ReportGenerator/SeismicReportTemplate.py,sha256=TxgRBCT0vW25AMYvuAtrV
21
25
  CivilTools/ReportGenerator/StairCalculationReport.py,sha256=gr2fafvYjTJCM4_JIiE9G5xbiy4W30TfmEjj3DW882Q,21566
22
26
  CivilTools/ReportGenerator/UtilFunctions.py,sha256=7qvAsZvoJN9pakENjBMYhrqP73xj5T4FuhSHa1t8lSA,9398
23
27
  CivilTools/ReportGenerator/__init__.py,sha256=1FVcNtNFstmE8zEFABs9oVw7rHiulvUKx0tD1GNFJ58,332
24
- CivilTools/YDBLoader/YDBLoader.py,sha256=zwd7TBbo4UR2JsP60XON7gGkhCASjoaRlGoxqBGqBPc,11111
28
+ CivilTools/YDBLoader/YDBLoader.py,sha256=4-s4qvdB5gp1SF0nchOYEYJId9dqgfXgPyVaJ89J4jw,20634
25
29
  CivilTools/YDBLoader/YDBType.py,sha256=KVk_qpOwp4yAsHn96L5PAVTMMO8SU4lFOnnTMsH_qP0,109
26
30
  CivilTools/YDBLoader/__init__.py,sha256=dOomroeul9yiQQ3FZQVhnfYav43sDv1hUltoA0BrmLw,144
27
31
  CivilTools/YDBLoader/BuildingDefine/ComponentType.py,sha256=soUKmSeeY6dCO4IMrLuaF3GcOj8HgzeCQOtudTSqhno,146
28
- CivilTools/YDBLoader/BuildingDefine/__init__.py,sha256=er4GVwvtqOI0G-vzARApPVkS1ntbUiA2d5oa8BsBTq0,343
32
+ CivilTools/YDBLoader/BuildingDefine/__init__.py,sha256=QKph7vyA64vRrb7ZIYCdGJE4KWOiwMbYsyd6ztmT10M,359
29
33
  CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py,sha256=h84shEe7Pg8k32-2ifgpKg8IqNDKxb58kKdsMflistg,673
30
34
  CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py,sha256=3H9M7yiiio2q4SfdfUv2I2uhokFZv_IOkivE1PRWXus,24
31
35
  CivilTools/YDBLoader/BuildingDefine/Column/Column.py,sha256=Sqt_IiaiAgsDTR-TLF3bGiJ4KvFsFW0y7RlXCVqkEi0,423
@@ -34,9 +38,9 @@ CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py,sha256=BVhmbu8DndZYprVATKp7
34
38
  CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py,sha256=MjJ2CkNOgnQYCbmOeauiwW63ooHwHZlGzib1v2nPnE0,725
35
39
  CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py,sha256=lxh5l_H9dl4udvt0zjsWVkF1JLgURC5dfisfEenHnrY,29
36
40
  CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py,sha256=8eX2KQlOvtqnJqZ8QTc8HTCEuTv6xk1JeIeFdBoGpYQ,86
37
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py,sha256=11ZxUPfHXOUsH1J4qfYApQKx3tkrK5_DoQpqnyYdbBY,1458
38
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py,sha256=pEPeTrzzZQX7Um5wmlN9Szwb5XqRy_DBeI7Azc-DCt0,6298
39
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py,sha256=cquJ_qevVkhpHRKKNJl8g_3WlmOhvejV4HthYhO0ZZI,150
41
+ CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py,sha256=5M6Y0k1pvrsC9HskmPkMvEbsIESbRkjMNUttU1Y5JBc,1817
42
+ CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py,sha256=SuTnjog98EnWtAy-SJA8xCEIDV_h0ZPNsOreNpvV2Lk,7848
43
+ CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py,sha256=aTlINh84E9QeiGXsehcnHGoJhO9OqdFGRTpyUPeH8VY,198
40
44
  CivilTools/YDBLoader/BuildingDefine/Section/Section.py,sha256=wFWHKbrf1VUeCM2fVbrCDERGvcaTqE6gmLiV2RO7cNs,1644
41
45
  CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py,sha256=hTHx2wnNp1hMhRDM5upxxhgTpYGFF23rolfPpUcJFiI,856
42
46
  CivilTools/YDBLoader/BuildingDefine/Section/__init__.py,sha256=lX7D2FvzQzzZ7B6F4MnXGpAxcwbyVdJreBOZMRmsQmQ,64
@@ -46,12 +50,12 @@ CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py,sha256=DYYjAlndN5J--
46
50
  CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py,sha256=E0VL9c0WC9CPVsf3ByXn49SExx6GKFalHRauhkawaLE,3066
47
51
  CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py,sha256=0HLLcQbjOECbWHPKtci4mNOWv7CcgO4UVrtUyPwfeQw,8537
48
52
  CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py,sha256=Z7tqd0HHG_Wg1qFTt4kiJxofz08DLBnTywpY5vtJmZk,145
49
- CivilTools/YDBLoader/SQLiteConnector/Connector.py,sha256=TWr8SNdYrL3WqMVC3NqLfk6JwZmEEGNwGkEKCeeQbYM,2882
53
+ CivilTools/YDBLoader/SQLiteConnector/Connector.py,sha256=Yw0A0buUfrQDEHYNfvUNy-NjXt80ZSFF3N1YPdtPAFc,3495
50
54
  CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py,sha256=CRStFrV9ac2bi_R1CB6LW4_MrXhMtfyOFWgrT31PkI4,1537
51
- CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py,sha256=X71ka_a4CU39_r6_jtW2BO9nQe_wiequ4ELE77rvfVA,2614
55
+ CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py,sha256=Ab5SdIx7v-gO_MfJmwSkp9HeATi3BK58zWuZi812qeI,4624
52
56
  CivilTools/YDBLoader/SQLiteConnector/__init__.py,sha256=0WWCCdLvlX0Rp-CjcVQc9oQ2b770Zd5TcMGxWBtToS4,116
53
- civil_tools_v-0.0.2.dist-info/LICENSE,sha256=nq3TNN3UrfULANUGIRvaZAI1jUn6HlYeLxIRjJvDxCc,1088
54
- civil_tools_v-0.0.2.dist-info/METADATA,sha256=sMxhmcA6TUQynwandSb3gkIJYYxd-vHsgC3Os4QvJ9U,6184
55
- civil_tools_v-0.0.2.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
56
- civil_tools_v-0.0.2.dist-info/top_level.txt,sha256=AP0ng4FJ3z78LnGOjUzZaGRMMp-lDtw91Rlia8z--wM,11
57
- civil_tools_v-0.0.2.dist-info/RECORD,,
57
+ civil_tools_v-0.0.4.dist-info/LICENSE,sha256=nq3TNN3UrfULANUGIRvaZAI1jUn6HlYeLxIRjJvDxCc,1088
58
+ civil_tools_v-0.0.4.dist-info/METADATA,sha256=73P0idnOtFmp17Fa8_ToenifeUIiLPfxaHbdN_LSD1I,6184
59
+ civil_tools_v-0.0.4.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
60
+ civil_tools_v-0.0.4.dist-info/top_level.txt,sha256=AP0ng4FJ3z78LnGOjUzZaGRMMp-lDtw91Rlia8z--wM,11
61
+ civil_tools_v-0.0.4.dist-info/RECORD,,