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.
- CivilTools/DXFGenerator/BasicDXF.py +3 -0
- CivilTools/DXFGenerator/__init__.py +0 -0
- CivilTools/FigureGenerator/BasicPNGPlotter.py +43 -0
- CivilTools/FigureGenerator/BasicPltPlotter.py +3 -0
- CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +16 -0
- CivilTools/FigureGenerator/__init__.py +0 -0
- CivilTools/ReportGenerator/BasicGenerator.py +267 -0
- CivilTools/ReportGenerator/DocParagraph.py +17 -0
- CivilTools/ReportGenerator/DocPicture.py +9 -0
- CivilTools/ReportGenerator/DocTable.py +41 -0
- CivilTools/ReportGenerator/SeismicReport.py +220 -0
- CivilTools/ReportGenerator/SeismicReportTemplate.py +240 -0
- CivilTools/ReportGenerator/StairCalculationReport.py +465 -0
- CivilTools/ReportGenerator/UtilFunctions.py +225 -0
- CivilTools/ReportGenerator/__init__.py +7 -0
- CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +26 -0
- CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +1 -0
- CivilTools/YDBLoader/BuildingDefine/Column/Column.py +16 -0
- CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +1 -0
- CivilTools/YDBLoader/BuildingDefine/ComponentType.py +10 -0
- CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +21 -0
- CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +25 -0
- CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +2 -0
- CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +3 -0
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +45 -0
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +128 -0
- CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +2 -0
- CivilTools/YDBLoader/BuildingDefine/Section/Section.py +49 -0
- CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +42 -0
- CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +2 -0
- CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +2 -0
- CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +1 -0
- CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +38 -0
- CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +95 -0
- CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +206 -0
- CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +3 -0
- CivilTools/YDBLoader/BuildingDefine/__init__.py +9 -0
- CivilTools/YDBLoader/SQLiteConnector/Connector.py +80 -0
- CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +45 -0
- CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +96 -0
- CivilTools/YDBLoader/SQLiteConnector/__init__.py +3 -0
- CivilTools/YDBLoader/YDBLoader.py +224 -0
- CivilTools/YDBLoader/YDBType.py +5 -0
- CivilTools/YDBLoader/__init__.py +4 -0
- CivilTools/__init__.py +1 -0
- civil_tools_v-0.0.1.dist-info/LICENSE +21 -0
- civil_tools_v-0.0.1.dist-info/METADATA +98 -0
- civil_tools_v-0.0.1.dist-info/RECORD +50 -0
- civil_tools_v-0.0.1.dist-info/WHEEL +5 -0
- 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
|
+
|