civil-tools-v 0.0.1__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.
Files changed (50) hide show
  1. CivilTools/DXFGenerator/BasicDXF.py +3 -0
  2. CivilTools/DXFGenerator/__init__.py +0 -0
  3. CivilTools/FigureGenerator/BasicPNGPlotter.py +43 -0
  4. CivilTools/FigureGenerator/BasicPltPlotter.py +3 -0
  5. CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +16 -0
  6. CivilTools/FigureGenerator/__init__.py +0 -0
  7. CivilTools/ReportGenerator/BasicGenerator.py +267 -0
  8. CivilTools/ReportGenerator/DocParagraph.py +17 -0
  9. CivilTools/ReportGenerator/DocPicture.py +9 -0
  10. CivilTools/ReportGenerator/DocTable.py +41 -0
  11. CivilTools/ReportGenerator/SeismicReport.py +220 -0
  12. CivilTools/ReportGenerator/SeismicReportTemplate.py +240 -0
  13. CivilTools/ReportGenerator/StairCalculationReport.py +465 -0
  14. CivilTools/ReportGenerator/UtilFunctions.py +225 -0
  15. CivilTools/ReportGenerator/__init__.py +7 -0
  16. CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +26 -0
  17. CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +1 -0
  18. CivilTools/YDBLoader/BuildingDefine/Column/Column.py +16 -0
  19. CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +1 -0
  20. CivilTools/YDBLoader/BuildingDefine/ComponentType.py +10 -0
  21. CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +21 -0
  22. CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +25 -0
  23. CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +2 -0
  24. CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +3 -0
  25. CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +45 -0
  26. CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +128 -0
  27. CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +2 -0
  28. CivilTools/YDBLoader/BuildingDefine/Section/Section.py +49 -0
  29. CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +42 -0
  30. CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +2 -0
  31. CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +2 -0
  32. CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +1 -0
  33. CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +38 -0
  34. CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +95 -0
  35. CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +206 -0
  36. CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +3 -0
  37. CivilTools/YDBLoader/BuildingDefine/__init__.py +9 -0
  38. CivilTools/YDBLoader/SQLiteConnector/Connector.py +80 -0
  39. CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +45 -0
  40. CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +96 -0
  41. CivilTools/YDBLoader/SQLiteConnector/__init__.py +3 -0
  42. CivilTools/YDBLoader/YDBLoader.py +224 -0
  43. CivilTools/YDBLoader/YDBType.py +5 -0
  44. CivilTools/YDBLoader/__init__.py +4 -0
  45. CivilTools/__init__.py +1 -0
  46. civil_tools_v-0.0.1.dist-info/LICENSE +21 -0
  47. civil_tools_v-0.0.1.dist-info/METADATA +98 -0
  48. civil_tools_v-0.0.1.dist-info/RECORD +50 -0
  49. civil_tools_v-0.0.1.dist-info/WHEEL +5 -0
  50. civil_tools_v-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,465 @@
1
+ from .BasicGenerator import BasicGenerator,PageSize
2
+ from docx.shared import Inches, RGBColor, Pt, Cm
3
+ from CivilTools.YDBLoader.BuildingDefine.StairPart import Position, StairPart,LoadParams,StairLoad,LoadCalulateType
4
+ from .UtilFunctions import MatrixSolver
5
+ from .DocTable import DocTable
6
+ from .DocPicture import DocPicture
7
+ from .DocParagraph import DocParagraph
8
+
9
+
10
+ class StairCalculationReport(BasicGenerator):
11
+ def __init__(self):
12
+ super().__init__()
13
+ # 修改为A3图纸,横向,两栏
14
+ self.change_paper_size(PageSize.A4)
15
+ # 修改纸张Margin,单位mm
16
+ self.change_paper_margin(20,20,20,20)
17
+ # 格式统一修改
18
+ # self.body_style.paragraph_format.line_spacing = Pt(22)
19
+ self.set_const()
20
+
21
+ def set_const(self):
22
+ self.big_title = "现浇板式普通楼梯设计"
23
+ self.operate_code_title = "执行规范:"
24
+ self.operate_code_text_list = [
25
+ "《混凝土结构通用规范》(GB 55008-2021),本文简称《混凝土通用规范》;",
26
+ "《混凝土结构设计规范》(GB 50010-2010(2015年版)),本文简称《混凝土规范》;",
27
+ "《工程结构通用规范》(GB 55001-2021);",
28
+ "《建筑结构荷载规范》(GB 50009-2012),本文简称《荷载规范》;"
29
+ ]
30
+ self.symbol_explain = "钢筋:d-HPB300;D-HRB335;E-HRB400;F-RRB400;G-HRB500;Q-HRBF400;R-HRB550"
31
+ self.cut_line = "---------------------------------------------------------------------------------------------"
32
+ self.concrete_data = {
33
+ 30:[14.3, 1.43, 2.01, 30000], #// fc, ft, ftk, E
34
+ 35:[16.7, 1.57, 2.20, 31500], #// fc, ft, ftk, E
35
+ 40:[19.1, 1.71, 2.39, 32500], #// fc, ft, ftk, E
36
+ }
37
+ self.concrete_density = 25
38
+ self.rebar_level = "HRB400"
39
+ self.rebar_fy = 360
40
+ self.indent = 0.22
41
+ self.normal_font_size = 11
42
+
43
+
44
+ # 数据入口!!!!
45
+ def set_stair_data(self):
46
+ """这个函数需要重写!!!!!是数据流入的最主要的入口
47
+ """
48
+ position1 = Position(0,2180,0,1910,5030,6850)
49
+ sp1 = StairPart(position1,13)
50
+ sp1.left_thick = sp1.main_thick = sp1.right_thick = 130
51
+ position2 = Position(0,2180,0,1910,5030,6850)
52
+ sp2 = StairPart(position2,13)
53
+ sp2.set_beam_offset(1,500)
54
+ position3= Position(0,2180,0,1910,5030,6850)
55
+ sp3 = StairPart(position3,13)
56
+ sp3.set_beam_offset(2,500)
57
+ position4= Position(0,2180,0,1910,5030,6850)
58
+ sp4 = StairPart(position4,13)
59
+ sp4.set_beam_offset(1,500)
60
+ sp4.set_beam_offset(2,500)
61
+
62
+ self.stair_list =[sp1,sp2,sp3,sp4]
63
+
64
+ # 数据入口!!!!
65
+ def set_calculate_info(self):
66
+ self.load_param = LoadParams()
67
+ self.concrete_level = 30
68
+ self.rebar_area_adjust_coef = 1
69
+ self.cover_thickness = 15
70
+
71
+ self.displacement_limit = 200
72
+ self.crack_width_limit = 0.3
73
+
74
+ def load_calculate(self):
75
+ left_dead = self.current_stair.left_thick * self.concrete_density / 1000 + self.load_param.append_dead_load
76
+ self.left_slab_load = StairLoad(left_dead,self.load_param.live_load,self.load_param)
77
+
78
+ right_dead = self.current_stair.right_thick * self.concrete_density / 1000 + self.load_param.append_dead_load
79
+ self.right_slab_load = StairLoad(right_dead,self.load_param.live_load,self.load_param)
80
+
81
+ main_dead = self.current_stair.equivlent_main_slab_thick * self.concrete_density / 1000 + self.load_param.append_dead_load
82
+ self.main_slab_load = StairLoad(main_dead,self.load_param.live_load,self.load_param)
83
+
84
+ def do_the_math(self):
85
+ solver = MatrixSolver(self.current_stair)
86
+ solver.set_load( self.left_slab_load.q,self.main_slab_load.q,self.right_slab_load.q)
87
+ self.current_stair.set_calculate_result(solver.submit_problem())
88
+
89
+ def add_first_part(self):
90
+ # 添加最大的标题
91
+ self.add_big_title(self.big_title)
92
+ # 添加一个2*6的表格,包含项目基本信息和设计人员信息
93
+ table = DocTable(2,6)
94
+ table_context = [["项目名称","XX项目","构件编号","XXXX","日 期","2024/10/10"],
95
+ ["设 计","","校 对","","审 核",""]]
96
+ table.set_table_context(table_context)
97
+
98
+ # table.no_grid = True
99
+ table.all_bold = True
100
+ self.add_table(table)
101
+ # 添加执行规范和符号示意
102
+ doc_par = DocParagraph(self.operate_code_title)
103
+ doc_par.style = self.body_style
104
+ doc_par.is_bold = True
105
+ doc_par.font_size = 10
106
+ doc_par.first_line_indent = 0
107
+ self.add_paragraph(doc_par)
108
+
109
+ for line in self.operate_code_text_list:
110
+ doc_par = DocParagraph(line)
111
+ doc_par.style = self.body_style
112
+ doc_par.font_size = 10
113
+ doc_par.first_line_indent = 0.22
114
+ self.add_paragraph(doc_par)
115
+ self.add_blank_paragraph()
116
+ doc_par = DocParagraph(self.symbol_explain)
117
+ doc_par.style = self.body_style
118
+ doc_par.font_size = 10
119
+ doc_par.first_line_indent = 0
120
+ self.add_paragraph(doc_par)
121
+ doc_par.context = self.cut_line
122
+ self.add_paragraph(doc_par)
123
+
124
+ def add_single_stair(self,stair:StairPart,index):
125
+ self.current_stair = stair
126
+ self.current_index = index
127
+
128
+ # 添加一个标题
129
+ doc_par = DocParagraph(f"{self.current_index}、{self.current_stair.stair_type}类梯板,标高区间:{self.current_stair.stair_elevation_range}")
130
+ doc_par.style = self.body_style
131
+ doc_par.first_line_indent = 0
132
+ doc_par.font_size = 11
133
+ doc_par.is_bold = True
134
+ doc_par.par_level = 1
135
+ self.add_title(doc_par)
136
+
137
+ # 进行必要的计算
138
+ self.load_calculate()
139
+
140
+ self.do_the_math()
141
+
142
+ # 添加part1已知条件
143
+ self.add_1_basic_info()
144
+ self.add_2_load_and_calculate()
145
+ self.add_3_result()
146
+ self.add_blank_paragraph()
147
+
148
+
149
+
150
+ def add_1_basic_info(self):
151
+ stair = self.current_stair
152
+ index = self.current_index
153
+ indent = self.indent
154
+ font_size = self.normal_font_size
155
+ # 添加一个二级标题
156
+ doc_par = DocParagraph(f"{index}.1 已知条件")
157
+ doc_par.style = self.body_style
158
+ doc_par.first_line_indent = 0
159
+ doc_par.font_size = font_size
160
+ doc_par.is_bold = False
161
+ doc_par.par_level = 2
162
+ self.add_title(doc_par)
163
+
164
+ # 几何信息
165
+ doc_par = DocParagraph("几何信息:")
166
+ doc_par.style = self.body_style
167
+ doc_par.first_line_indent =indent
168
+ doc_par.font_size = font_size
169
+ self.add_paragraph(doc_par)
170
+
171
+ doc_par = DocParagraph(f"左标高={stair.position.left_elevation/1000:.3f}m;右标高={stair.position.right_elevation/1000:.3f}m")
172
+ doc_par.style = self.body_style
173
+ doc_par.first_line_indent = indent*2
174
+ doc_par.font_size = font_size
175
+ self.add_paragraph(doc_par)
176
+ doc_par.context = f"左平台长度={stair.position.left_plat_length}mm;右平台长度={stair.position.right_plat_length}mm"
177
+ self.add_paragraph(doc_par)
178
+ doc_par.context = f"左平台厚度={stair.left_thick}mm;右平台厚度={stair.right_thick}mm"
179
+ self.add_paragraph(doc_par)
180
+ doc_par.context = f"内延长(左)={stair.beam_list[1].offset}mm;内延长(右)={stair.beam_list[2].offset}mm"
181
+ self.add_paragraph(doc_par)
182
+ doc_par.context = f"梯段长度={stair.position.right_x1 - stair.position.left_x2}mm;踏步数={stair.step_num}"
183
+ doc_par.is_bold = True
184
+ self.add_paragraph(doc_par)
185
+ doc_par.context = f"梯板厚度={stair.main_thick}mm;梯段宽度={stair.stair_width}mm;梯井宽度={stair.stair_well_width}mm"
186
+ self.add_paragraph(doc_par)
187
+ doc_par.context = "平面类型:单跑"
188
+ doc_par.is_bold = False
189
+ self.add_paragraph(doc_par)
190
+ self.add_blank_paragraph()
191
+
192
+ # 荷载信息
193
+ doc_par = DocParagraph("荷载信息:")
194
+ doc_par.style = self.body_style
195
+ doc_par.first_line_indent =indent
196
+ doc_par.font_size = font_size
197
+ self.add_paragraph(doc_par)
198
+
199
+ doc_par = DocParagraph(f"附加恒荷载={self.load_param.append_dead_load:.3f}kN/m^{{2}} 活荷载={self.load_param.live_load:.3f}kN/m^{{2}}")
200
+ doc_par.style = self.body_style
201
+ doc_par.first_line_indent = indent*2
202
+ doc_par.font_size = font_size
203
+ self.add_paragraph(doc_par)
204
+ doc_par.context = f"恒载分项系数:{self.load_param.dead_load_coef};活载分项系数:{self.load_param.live_load_coef};活载调整系数:γ_{{L}} ={self.load_param.live_load_adjust_coef:.2f}"
205
+ self.add_paragraph(doc_par)
206
+ doc_par.context = f"活载准永久值系数:{self.load_param.live_load_permenent_coef}"
207
+ self.add_paragraph(doc_par)
208
+ doc_par.context = f"混凝土等级:C{self.concrete_level},f_{{c}} ={self.concrete_data[self.concrete_level][0]:.2f}MPa"
209
+ self.add_paragraph(doc_par)
210
+ doc_par.context = f"混凝土容重:{self.concrete_density:.2f}kN/mm^{{3}}"
211
+ self.add_paragraph(doc_par)
212
+ doc_par.context = f"配筋调整系数:{self.rebar_area_adjust_coef:.2f};纵筋保护层厚度:c={self.cover_thickness}mm"
213
+ self.add_paragraph(doc_par)
214
+ doc_par.context = f"梯板纵筋等级:{self.rebar_level};f_{{y}} ={self.rebar_fy}MPa"
215
+ self.add_paragraph(doc_par)
216
+ doc_par.context = f"梯梁纵筋等级:{self.rebar_level};f_{{y}} ={self.rebar_fy}MPa"
217
+ self.add_paragraph(doc_par)
218
+ doc_par.context = f"梯梁箍筋等级:{self.rebar_level};f_{{y}} ={self.rebar_fy}MPa"
219
+ self.add_paragraph(doc_par)
220
+
221
+ # 验算信息
222
+ doc_par = DocParagraph("验算信息:")
223
+ doc_par.style = self.body_style
224
+ doc_par.first_line_indent =indent
225
+ doc_par.font_size = font_size
226
+ self.add_paragraph(doc_par)
227
+
228
+ doc_par = DocParagraph(f"挠度限值:L_{{0}} /{self.displacement_limit};裂缝限值:{self.crack_width_limit}mm")
229
+ doc_par.style = self.body_style
230
+ doc_par.first_line_indent = indent*2
231
+ doc_par.font_size = font_size
232
+ self.add_paragraph(doc_par)
233
+
234
+ # 计算要求
235
+ doc_par = DocParagraph("计算要求:")
236
+ doc_par.style = self.body_style
237
+ doc_par.first_line_indent =indent
238
+ doc_par.font_size = font_size
239
+ self.add_paragraph(doc_par)
240
+
241
+ doc_par = DocParagraph("(1)楼梯板计算;(2)平台梁计算;(3)平台板裂缝验算;(4)平台板挠度验算;")
242
+ doc_par.style = self.body_style
243
+ doc_par.first_line_indent = indent*2
244
+ doc_par.font_size = font_size
245
+ self.add_paragraph(doc_par)
246
+
247
+ def add_2_load_and_calculate(self):
248
+ index = self.current_index
249
+ indent = self.indent
250
+ font_size = self.normal_font_size
251
+ # 添加一个二级标题
252
+ doc_par = DocParagraph(f"{index}.2 荷载与内力计算")
253
+ doc_par.style = self.body_style
254
+ doc_par.first_line_indent = 0
255
+ doc_par.font_size = font_size
256
+ doc_par.is_bold = False
257
+ doc_par.par_level = 2
258
+ self.add_title(doc_par)
259
+
260
+ doc_par = DocParagraph("(1)荷载计算:")
261
+ doc_par.style = self.body_style
262
+ doc_par.first_line_indent =0
263
+ doc_par.font_size = font_size
264
+ self.add_paragraph(doc_par)
265
+ # 标准值
266
+ doc_par.context = "标准值(qk):"
267
+ doc_par.first_line_indent = indent
268
+ self.add_paragraph(doc_par)
269
+ doc_par.context = self.get_load_text(LoadCalulateType.qk)
270
+ doc_par.first_line_indent = indent*2
271
+ self.add_paragraph(doc_par)
272
+ # 设计值
273
+ doc_par.context = "设计值(q):"
274
+ doc_par.first_line_indent = indent
275
+ self.add_paragraph(doc_par)
276
+ doc_par.context = self.get_load_text(LoadCalulateType.q)
277
+ doc_par.first_line_indent = indent*2
278
+ self.add_paragraph(doc_par)
279
+ # 准永久值
280
+ doc_par.context = "准永久值(qe):"
281
+ doc_par.first_line_indent = indent
282
+ self.add_paragraph(doc_par)
283
+ doc_par.context = self.get_load_text(LoadCalulateType.qe)
284
+ doc_par.first_line_indent = indent*2
285
+ self.add_paragraph(doc_par)
286
+
287
+ doc_par.context = "(2)内力计算:"
288
+ doc_par.first_line_indent =0
289
+ self.add_paragraph(doc_par)
290
+ # 标准值
291
+ doc_par.context = "a.楼梯板:矩阵位移法求解。"
292
+ doc_par.first_line_indent = indent
293
+ self.add_paragraph(doc_par)
294
+
295
+
296
+ self.add_blank_paragraph()
297
+
298
+ def get_load_text(self, type:LoadCalulateType):
299
+ if type == LoadCalulateType.qk:
300
+ Q1 = self.left_slab_load.qk
301
+ Q2 = self.main_slab_load.qk
302
+ Q3 = self.right_slab_load.qk
303
+ elif type == LoadCalulateType.q:
304
+ Q1 = self.left_slab_load.q
305
+ Q2 = self.main_slab_load.q
306
+ Q3 = self.right_slab_load.q
307
+ elif type == LoadCalulateType.qe:
308
+ Q1 = self.left_slab_load.qe
309
+ Q2 = self.main_slab_load.qe
310
+ Q3 = self.right_slab_load.qe
311
+ else:
312
+ Q1 = Q2 = Q3 = 0
313
+
314
+ if self.current_stair.stair_type=="AT":
315
+ return f"斜梯段:{Q2:.2f}kN/m"
316
+ elif self.current_stair.stair_type == "BT":
317
+ return f"左延伸段:{Q1:.2f}kN/m\t斜梯段:{Q2:.2f}kN/m"
318
+ elif self.current_stair.stair_type == "CT":
319
+ return f"斜梯段:{Q2:.2f}kN/m\t右延伸段:{Q3:.2f}kN/m"
320
+ elif self.current_stair.stair_type == "DT":
321
+ return f"左延伸段:{Q1:.2f}kN/m\t斜梯段:{Q2:.2f}kN/m\t右延伸段:{Q3:.2f}kN/m"
322
+ else:
323
+ return "未知踏步类型,暂无数据"
324
+
325
+ def add_3_result(self):
326
+ index = self.current_index
327
+ indent = self.indent
328
+ font_size = self.normal_font_size
329
+ # 添加一个二级标题
330
+ doc_par = DocParagraph(f"{index}.3 计算结果")
331
+ doc_par.style = self.body_style
332
+ doc_par.first_line_indent = 0
333
+ doc_par.font_size = font_size
334
+ doc_par.is_bold = False
335
+ doc_par.par_level = 2
336
+ self.add_title(doc_par)
337
+
338
+ doc_par = DocParagraph("计算说明:")
339
+ doc_par.style = self.body_style
340
+ doc_par.first_line_indent = 0
341
+ doc_par.font_size = font_size
342
+ self.add_paragraph(doc_par)
343
+
344
+ doc_par.context = "(a)简化方法:取板沿着宽度方向单位长度的板带"
345
+ doc_par.first_line_indent = indent
346
+ self.add_paragraph(doc_par)
347
+
348
+ doc_par.context = "(b)计算方法:矩阵位移法"
349
+ self.add_paragraph(doc_par)
350
+
351
+ doc_par.context = "单位说明:"
352
+ doc_par.first_line_indent = 0
353
+ self.add_paragraph(doc_par)
354
+
355
+ doc_par.context = "弯 矩:kN·m\t\t剪 力:kN/m\t\t挠 度:mm"
356
+ doc_par.first_line_indent = indent
357
+ self.add_paragraph(doc_par)
358
+ doc_par.context = r"纵筋面积:mm^{2}/m\t\t截面尺寸:mm×mm\t\t裂 缝:mm"
359
+ self.add_paragraph(doc_par)
360
+
361
+ self.add_blank_paragraph()
362
+ doc_par.context = "板段配筋计算结果:"
363
+ doc_par.first_line_indent = 0
364
+ self.add_paragraph(doc_par)
365
+ doc_par.context = "---------------------------------------------------------------------------------------------"
366
+ self.add_paragraph(doc_par)
367
+
368
+ self.insert_calculate_table()
369
+
370
+ # self.insert_all_pictures()
371
+
372
+ self.add_blank_paragraph()
373
+
374
+ def insert_calculate_table(self):
375
+ table_index = 1
376
+ ft = self.concrete_data[self.concrete_level][1]
377
+ if self.current_stair.stair_type == "BT" or self.current_stair.stair_type == "DT":
378
+ left_table = DocTable(8,4)
379
+ left_table.merge_cells(3,1,3,3)
380
+ left_table.set_table_title(f"计算板段-{table_index}(左延伸段):截面B×H=1000mm×{self.current_stair.left_thick}mm")
381
+ moments = self.current_stair.get_left_slab_table_moments()
382
+ shears = self.current_stair.get_left_slab_table_shears()
383
+ shear_context = self.current_stair.get_shear_validate("left",ft,self.cover_thickness)
384
+
385
+ table_context = [
386
+ ["截面位置","左","中","右"],
387
+ ["弯矩(M)",f"{moments[0]:.2f}",f"{moments[1]:.2f}",f"{moments[2]:.2f}"],
388
+ ["剪力(V)",f"{shears[0]:.2f}",f"{shears[1]:.2f}",f"{shears[2]:.2f}"],
389
+ ["抗剪截面验算",shear_context],
390
+ ["上部计算纵筋As'","","",""],
391
+ ["下部计算纵筋As","","",""],
392
+ ["上部纵筋实配","","",""],
393
+ ["下部纵筋实配","","",""],
394
+ ]
395
+ left_table.set_table_context(table_context)
396
+ self.add_table(left_table)
397
+ table_index += 1
398
+
399
+ cal_table = DocTable(13,4)
400
+ for i in [3,8,9,11,12]:
401
+ cal_table.merge_cells(i,1,i,3)
402
+ cal_table.set_table_title(f"计算板段-{table_index}(斜梯段):截面B×H=1000mm×{self.current_stair.main_thick}mm")
403
+ moments = self.current_stair.get_main_table_moments()
404
+ shears = self.current_stair.get_main_table_shears()
405
+ shear_context = self.current_stair.get_shear_validate("main",ft,self.cover_thickness)
406
+
407
+ table_context = [
408
+ ["截面位置","左","中","右"],
409
+ ["弯矩(M)",f"{moments[0]:.2f}",f"{moments[1]:.2f}",f"{moments[2]:.2f}"],
410
+ ["剪力(V)",f"{shears[0]:.2f}",f"{shears[1]:.2f}",f"{shears[2]:.2f}"],
411
+ ["抗剪截面验算",shear_context],
412
+ ["上部计算纵筋As'","","",""],
413
+ ["下部计算纵筋As","","",""],
414
+ ["上部纵筋实配","","",""],
415
+ ["下部纵筋实配","","",""],
416
+ ["挠度限值",f"[f]={self.crack_width_limit:.2f}mm"],
417
+ ["挠度验算结果","满足"],
418
+ ["裂缝宽度","","",""],
419
+ ["裂缝限值",f"[ω]={self.crack_width_limit:.2f}mm"],
420
+ ["裂缝验算结果",""]]
421
+ cal_table.set_table_context(table_context)
422
+ self.add_table(cal_table)
423
+ table_index += 1
424
+
425
+ if self.current_stair.stair_type == "CT" or self.current_stair.stair_type == "DT":
426
+ right_table = DocTable(8,4)
427
+ right_table.merge_cells(3,1,3,3)
428
+ right_table.set_table_title(f"计算板段-{table_index}(右延伸段):截面B×H=1000mm×{self.current_stair.right_thick}mm")
429
+
430
+ moments = self.current_stair.get_right_slab_table_moments()
431
+ shears = self.current_stair.get_right_slab_table_shears()
432
+ shear_context = self.current_stair.get_shear_validate("right",ft,self.cover_thickness)
433
+
434
+
435
+ table_context = [
436
+ ["截面位置","左","中","右"],
437
+ ["弯矩(M)",f"{moments[0]:.2f}",f"{moments[1]:.2f}",f"{moments[2]:.2f}"],
438
+ ["剪力(V)",f"{shears[0]:.2f}",f"{shears[1]:.2f}",f"{shears[2]:.2f}"],
439
+ ["抗剪截面验算",shear_context],
440
+ ["上部计算纵筋As'","","",""],
441
+ ["下部计算纵筋As","","",""],
442
+ ["上部纵筋实配","","",""],
443
+ ["下部纵筋实配","","",""],
444
+ ]
445
+ right_table.set_table_context(table_context)
446
+
447
+
448
+ self.add_table(right_table)
449
+ table_index += 1
450
+
451
+
452
+ def create(self):
453
+ self.add_first_part()
454
+ for i in range(len(self.stair_list)):
455
+ stair = self.stair_list[i]
456
+ self.add_single_stair(stair,i+1)
457
+ if i < len(self.stair_list)-1:
458
+ self.add_page_break()
459
+
460
+ def save_to_file(self, path):
461
+ self.save(path)
462
+
463
+
464
+
465
+
@@ -0,0 +1,225 @@
1
+ from docx.oxml.xmlchemy import BaseOxmlElement
2
+ from docx.oxml.ns import qn, nsdecls
3
+ from CivilTools.YDBLoader.BuildingDefine.StairPart import StairPart, Component
4
+ import numpy as np
5
+
6
+ # 网上找的代码,有点东西
7
+ # https://stackoverflow.com/questions/33069697/how-to-setup-cell-borders-with-python-docx
8
+ # 这个是github上的讨论帖,在讨论帖中找到的
9
+ # https://github.com/python-openxml/python-docx/issues/1306
10
+ def set_cell_border(cell, **kwargs):
11
+ """
12
+ Set cell`s border
13
+ Usage:
14
+
15
+ set_cell_border(
16
+ cell,
17
+ top={"sz": 12, "val": "single", "color": "#FF0000", "space": "0"},
18
+ bottom={"sz": 12, "color": "#00FF00", "val": "single"},
19
+ start={"sz": 24, "val": "dashed", "shadow": "true"},
20
+ end={"sz": 12, "val": "dashed"},
21
+ )
22
+ """
23
+ tc = cell._tc
24
+ tc_pr = tc.get_or_add_tcPr()
25
+
26
+ # check for tag existnace, if none found, then create one
27
+ tc_borders = tc_pr.first_child_found_in("w:tcBorders")
28
+ if tc_borders is None:
29
+ tc_borders = BaseOxmlElement('w:tcBorders')
30
+ tc_pr.append(tc_borders)
31
+
32
+ # list over all available tags
33
+ for edge in ('start', 'top', 'end', 'bottom', 'insideH', 'insideV'):
34
+ edge_data = kwargs.get(edge)
35
+ if edge_data:
36
+ tag = 'w:{}'.format(edge)
37
+
38
+ # check for tag existnace, if none found, then create one
39
+ element = tc_borders.find(qn(tag))
40
+ if element is None:
41
+ element = BaseOxmlElement(tag)
42
+ tc_borders.append(element)
43
+
44
+ # looks like order of attributes is important
45
+ for key in ["sz", "val", "color", "space", "shadow"]:
46
+ if key in edge_data:
47
+ element.set(qn('w:{}'.format(key)), str(edge_data[key]))
48
+
49
+ def analysis_sub_and_super_script(context:str):
50
+ """根据字符串中的'_'与'^'标志的上下标(上下标需要被{}包围起来),将字符串分隔并返回上下标结果
51
+ 返回的sub_or_super列表中,0代表常规字符,1代表下标,2代表上标,3代表highlighted
52
+ Args:
53
+ context (str): 输入的文字
54
+ """
55
+ contexts = []
56
+ sub_or_super = [0]
57
+ i = 0
58
+ j = 0
59
+ length = len(context)
60
+ flag = False
61
+ index_for_flag = {
62
+ "_" : 1,
63
+ "^" : 2,
64
+ "*" : 3
65
+ }
66
+
67
+ for c in context:
68
+ if (c in index_for_flag.keys()) and (j <length and context[j+1] =='{'):
69
+ flag = True
70
+ contexts.append(context[i:j])
71
+ sub_or_super.append(index_for_flag[c])
72
+ i = j + 2
73
+ if flag and c == "}":
74
+ contexts.append(context[i:j])
75
+ sub_or_super.append(0)
76
+ i = j+1
77
+ flag = False
78
+ j+=1
79
+ contexts.append(context[i:j])
80
+ return contexts, sub_or_super
81
+
82
+ def add_comma_in_num_str(num:int):
83
+ if not isinstance(num, int):
84
+ raise ValueError("Only int number can be added.")
85
+ num_str = str(num)[::-1]
86
+ result = ""
87
+ for i in range(len(num_str)):
88
+ if i>0 and i%3 == 0 and num_str[i] !="-":
89
+ result = "," + result
90
+ result = num_str[i] + result
91
+ return result
92
+
93
+
94
+ class MatrixSolver:
95
+ def __init__(self,stair: StairPart):
96
+ self.stair = stair
97
+ self.cut_point = 0.5
98
+
99
+ def set_load(self, q1,q2,q3):
100
+ self.q1 = q1
101
+ self.q2 = q2
102
+ self.q3 = q3
103
+
104
+ def pre_analysis(self):
105
+ concrete_e = 30000
106
+ uniform_b = 1000
107
+ top_y = self.stair.position.higher_elevation - self.stair.position.lower_elevation
108
+ if self.stair.stair_type == "AT":
109
+ self.point_num = 3
110
+ self.boundary = np.array([ 0, 0, 1, 1, 1, 1, 0, 0, 1])
111
+
112
+ point1 = [0,0]
113
+ point2 = [self.stair.total_horizental_length,top_y]
114
+ point_middle = self.calculate_middle_point(point1,point2,self.cut_point)
115
+ comp1 = Component(point1,point_middle)
116
+ comp2 = Component(point_middle,point2)
117
+ comp1.set_vertical_q(self.q2)
118
+ comp1.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
119
+ comp2.set_vertical_q(self.q2)
120
+ comp2.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
121
+ self.comp_list = [comp1,comp2]
122
+
123
+ elif self.stair.stair_type == "BT":
124
+ self.point_num = 4
125
+ self.q_list = [self.q1,self.q2,self.q2]
126
+ self.boundary = np.array([ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1])
127
+ point0 = [0,0]
128
+ point1 = [self.stair.left_extend_length,0]
129
+ point2 = [self.stair.total_horizental_length,top_y]
130
+ point_middle = self.calculate_middle_point(point1,point2,self.cut_point)
131
+ comp1 = Component(point0,point1)
132
+ comp2 = Component(point1,point_middle)
133
+ comp3 = Component(point_middle,point2)
134
+ comp1.set_vertical_q(self.q1)
135
+ comp1.set_comp_attr(concrete_e,uniform_b,self.stair.left_thick)
136
+ comp2.set_vertical_q(self.q2)
137
+ comp2.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
138
+ comp3.set_vertical_q(self.q2)
139
+ comp3.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
140
+ self.comp_list = [comp1,comp2,comp3]
141
+
142
+ elif self.stair.stair_type == "CT":
143
+ self.point_num = 4
144
+ self.q_list = [self.q2,self.q2,self.q3]
145
+ self.boundary = np.array([ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1])
146
+
147
+ point1 = [0,0]
148
+ point2 = [self.stair.total_horizental_length-self.stair.right_extend_length,top_y]
149
+ point3 = [self.stair.total_horizental_length,top_y ]
150
+ point_middle = self.calculate_middle_point(point1,point2,self.cut_point)
151
+ comp1 = Component(point1,point_middle)
152
+ comp2 = Component(point_middle,point2)
153
+ comp3 = Component(point2,point3)
154
+ comp1.set_vertical_q(self.q2)
155
+ comp1.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
156
+
157
+ comp2.set_vertical_q(self.q2)
158
+ comp2.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
159
+
160
+ comp3.set_vertical_q(self.q3)
161
+ comp3.set_comp_attr(concrete_e,uniform_b,self.stair.right_thick)
162
+ self.comp_list = [comp1,comp2,comp3]
163
+
164
+
165
+ else:
166
+ self.point_num = 5
167
+ self.q_list = [self.q1,self.q2,self.q2,self.q3]
168
+ self.boundary = np.array([0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1])
169
+
170
+ point0 = [0,0]
171
+ point1 = [self.stair.left_extend_length,0]
172
+ point2 = [self.stair.total_horizental_length - self.stair.right_extend_length,top_y]
173
+ point3 = [self.stair.total_horizental_length,top_y]
174
+ point_middle = self.calculate_middle_point(point1,point2,self.cut_point)
175
+ comp1 = Component(point0,point1)
176
+ comp2 = Component(point1,point_middle)
177
+ comp3 = Component(point_middle,point2)
178
+ comp4 = Component(point2,point3)
179
+
180
+ comp1.set_vertical_q(self.q1)
181
+ comp1.set_comp_attr(concrete_e,uniform_b,self.stair.left_thick)
182
+ comp2.set_vertical_q(self.q2)
183
+ comp2.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
184
+ comp3.set_vertical_q(self.q2)
185
+ comp3.set_comp_attr(concrete_e,uniform_b,self.stair.main_thick)
186
+ comp4.set_vertical_q(self.q3)
187
+ comp4.set_comp_attr(concrete_e,uniform_b,self.stair.right_thick)
188
+ self.comp_list = [comp1,comp2,comp3,comp4]
189
+
190
+ def calculate_middle_point(self, p1, p2,cut_point):
191
+ x = p1[0] + (p2[0]-p1[0])*cut_point
192
+ y = p1[1] + (p2[1]-p1[1])*cut_point
193
+ return [x,y]
194
+
195
+ def submit_problem(self):
196
+ self.pre_analysis()
197
+ comp_num = len(self.comp_list)
198
+ total_k = np.zeros((comp_num*3+3,comp_num*3+3))
199
+ total_f = np.zeros((comp_num*3+3,1))
200
+ for i in range(len(self.comp_list)):
201
+ comp = self.comp_list[i]
202
+ temp_k = comp.create_k()
203
+ temp_f = comp.create_f()
204
+ total_k[i*3:i*3+6,i*3:i*3+6] += temp_k
205
+ total_f[i*3:i*3+6,:] += temp_f
206
+ # 生成缩减矩阵并计算
207
+ new_k = np.delete(total_k,np.nonzero(self.boundary == 0),axis=0)
208
+ new_k = np.delete(new_k,np.nonzero(self.boundary == 0),axis=1)
209
+ new_f = np.delete(total_f,np.nonzero(self.boundary == 0),axis=0)
210
+ new_u = np.dot(np.linalg.inv(new_k),new_f)
211
+
212
+ total_u = self.boundary.copy().reshape(-1,1).astype(float)
213
+ total_u[np.nonzero(total_u == 1)[0]] = new_u
214
+
215
+ # 计算每个构件端点的数据
216
+ for i in range(len(self.comp_list)):
217
+ comp = self.comp_list[i]
218
+ comp_u = total_u[i*3:i*3+6]
219
+ comp_f = np.dot(comp.create_k(),comp_u)
220
+ comp_f -= comp.create_f()
221
+ comp.set_f(comp_f[0][0],comp_f[1][0],comp_f[3][0],comp_f[4][0])
222
+ comp.set_m(comp_f[2][0],comp_f[5][0])
223
+ return self.comp_list
224
+
225
+