civil-tools-v 0.0.4__tar.gz → 0.0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/Steel.py +3 -3
- civil_tools_v-0.0.6/CivilTools/FigureGenerator/BasicPNGPlotter.py +134 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/Drift.py +28 -1
- civil_tools_v-0.0.6/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +600 -0
- civil_tools_v-0.0.6/CivilTools/FigureGenerator/__init__.py +1 -0
- civil_tools_v-0.0.6/CivilTools/ReportGenerator/DocPicture.py +11 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/StairCalculationReport.py +346 -52
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/UtilFunctions.py +91 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +15 -7
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +8 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +66 -6
- civil_tools_v-0.0.6/CivilTools/__init__.py +3 -0
- {civil_tools_v-0.0.4/civil_tools_v.egg-info → civil_tools_v-0.0.6}/PKG-INFO +1 -1
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6/civil_tools_v.egg-info}/PKG-INFO +1 -1
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/setup.py +3 -1
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/BasicPNGPlotter.py +0 -46
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +0 -10
- civil_tools_v-0.0.4/CivilTools/FigureGenerator/__init__.py +0 -0
- civil_tools_v-0.0.4/CivilTools/ReportGenerator/DocPicture.py +0 -8
- civil_tools_v-0.0.4/CivilTools/__init__.py +0 -1
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/CAD.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/Concrete.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/BasicDXF.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/DetailDXF.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/DrawingAttribs.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/LayerManager.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/BasicPltPlotter.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/ShearMoment.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/BasicGenerator.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/DocParagraph.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/DocTable.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/SeismicReport.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/SeismicReportTemplate.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/Connector.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/YDBLoader.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/YDBType.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/__init__.py +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/LICENSE +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/README.md +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/SOURCES.txt +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/dependency_links.txt +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/requires.txt +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/top_level.txt +0 -0
- {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/setup.cfg +0 -0
@@ -11,10 +11,10 @@ class SteelLevel:
|
|
11
11
|
|
12
12
|
|
13
13
|
class Steel:
|
14
|
-
HRB300 = SteelLevel("HRB300",
|
14
|
+
HRB300 = SteelLevel("HRB300", 270, 2100000)
|
15
15
|
HRB355 = SteelLevel("HRB355", 300, 2000000)
|
16
|
-
HRB400 = SteelLevel("HRB400",
|
17
|
-
HRB500 = SteelLevel("HRB500",
|
16
|
+
HRB400 = SteelLevel("HRB400", 360, 2000000)
|
17
|
+
HRB500 = SteelLevel("HRB500", 435, 2000000)
|
18
18
|
Q235 = SteelLevel("Q235", 111, 2000000)
|
19
19
|
Q345 = SteelLevel("Q345", 111, 2000000)
|
20
20
|
Q355 = SteelLevel("Q355", 111, 2000000)
|
@@ -0,0 +1,134 @@
|
|
1
|
+
from PIL import Image, ImageDraw, ImageFont
|
2
|
+
import warnings
|
3
|
+
import math
|
4
|
+
import io
|
5
|
+
|
6
|
+
|
7
|
+
def draw_rotated_text(
|
8
|
+
image, text, position, rotate, font, fill, x_offset=0, y_offset=0
|
9
|
+
):
|
10
|
+
# 创建临时透明图层
|
11
|
+
text_layer = Image.new("RGBA", image.size, (0, 0, 0, 0))
|
12
|
+
text_draw = ImageDraw.Draw(text_layer)
|
13
|
+
|
14
|
+
# 计算文字包围盒
|
15
|
+
bbox = text_draw.textbbox((0, 0), text, font=font)
|
16
|
+
text_width, text_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
|
17
|
+
|
18
|
+
# 在临时图层中央绘制文字
|
19
|
+
text_draw.text(
|
20
|
+
(
|
21
|
+
(text_layer.width - text_width + x_offset) / 2,
|
22
|
+
(text_layer.height - text_height + y_offset) / 2,
|
23
|
+
),
|
24
|
+
text,
|
25
|
+
font=font,
|
26
|
+
fill=fill,
|
27
|
+
)
|
28
|
+
|
29
|
+
# 绕中心点旋转
|
30
|
+
rotated = text_layer.rotate(
|
31
|
+
rotate, center=(text_layer.width // 2, text_layer.height // 2), expand=True
|
32
|
+
)
|
33
|
+
|
34
|
+
# 计算最终粘贴位置
|
35
|
+
paste_x = position[0] - rotated.width // 2
|
36
|
+
paste_y = position[1] - rotated.height // 2
|
37
|
+
|
38
|
+
# 合并到原图
|
39
|
+
image.paste(rotated, (paste_x, paste_y), rotated)
|
40
|
+
|
41
|
+
|
42
|
+
class BasicPNGPlotter:
|
43
|
+
def __init__(self, width, height, bg=(0, 0, 0, 0)):
|
44
|
+
self.width = width
|
45
|
+
self.height = height
|
46
|
+
self.image = Image.new("RGBA", (width, height), bg)
|
47
|
+
self.draw = ImageDraw.Draw(self.image)
|
48
|
+
|
49
|
+
def draw_horizental_line(self, s_x, s_y, length, color="black", line_width=5):
|
50
|
+
"""画一段水平线,length为长度,正代表向右"""
|
51
|
+
self.draw_line(s_x, s_y, s_x + length, s_y, color, line_width)
|
52
|
+
|
53
|
+
def draw_vertical_line(self, s_x, s_y, length, color="black", line_width=5):
|
54
|
+
"""画一段竖直线,length为长度,正代表向下"""
|
55
|
+
self.draw_line(s_x, s_y, s_x + length, s_y, color, line_width)
|
56
|
+
|
57
|
+
def draw_arc(self, start_x, start_y, width, height, start_degree, sweep_degree):
|
58
|
+
bbox = (
|
59
|
+
start_x,
|
60
|
+
start_y,
|
61
|
+
start_x + width,
|
62
|
+
start_y + height,
|
63
|
+
)
|
64
|
+
self.draw.arc(bbox, start_degree, sweep_degree, fill="black", width=5)
|
65
|
+
|
66
|
+
def draw_circle(self, start_x, start_y, diameter, line_width=5):
|
67
|
+
bbox = (
|
68
|
+
start_x,
|
69
|
+
start_y,
|
70
|
+
start_x + diameter,
|
71
|
+
start_y + diameter,
|
72
|
+
)
|
73
|
+
# 绘制圆(轮廓线)
|
74
|
+
self.draw.ellipse(bbox, outline="black", width=line_width)
|
75
|
+
|
76
|
+
def draw_rectangle(
|
77
|
+
self, s_x, s_y, rec_width, rec_height, color="black", line_width=2
|
78
|
+
):
|
79
|
+
"""画一个矩形,左上角点为s_x,s_y,width正代表向右,height正代表向下"""
|
80
|
+
self.draw_horizental_line(s_x, s_y, rec_width, color, line_width)
|
81
|
+
self.draw_horizental_line(s_x, s_y + rec_height, rec_width, color, line_width)
|
82
|
+
self.draw_vertical_line(s_x, s_y, rec_height, color, line_width)
|
83
|
+
self.draw_vertical_line(s_x + rec_width, s_y, rec_height, color, line_width)
|
84
|
+
|
85
|
+
def draw_line(self, s_x, s_y, e_x, e_y, color="black", width=5):
|
86
|
+
if s_x < 0 or s_x > self.width or s_y < 0 or s_y > self.height:
|
87
|
+
warnings.warn("Start point is out of figure.")
|
88
|
+
if e_x < 0 or e_x > self.width or e_y < 0 or e_y > self.height:
|
89
|
+
warnings.warn("End point is out of figure.")
|
90
|
+
self.draw.line((s_x, s_y, e_x, e_y), fill=color, width=width)
|
91
|
+
|
92
|
+
def draw_text(
|
93
|
+
self,
|
94
|
+
x: int,
|
95
|
+
y: int,
|
96
|
+
text: str,
|
97
|
+
font_size: int,
|
98
|
+
degree: float,
|
99
|
+
x_offset: float = 0,
|
100
|
+
y_offset: float = 0,
|
101
|
+
):
|
102
|
+
font = ImageFont.truetype("simhei.ttf", font_size)
|
103
|
+
draw_rotated_text(
|
104
|
+
self.image,
|
105
|
+
text,
|
106
|
+
(x, y),
|
107
|
+
degree / math.pi * 180,
|
108
|
+
font,
|
109
|
+
"black",
|
110
|
+
x_offset,
|
111
|
+
y_offset,
|
112
|
+
)
|
113
|
+
|
114
|
+
def draw_png(self):
|
115
|
+
self.draw.line((0, 0, 500, 500), fill="black", width=5)
|
116
|
+
|
117
|
+
def save(self, path):
|
118
|
+
self.image.save(path, "PNG")
|
119
|
+
|
120
|
+
def to_stream(self):
|
121
|
+
# 将图片保存到内存中的 BytesIO 对象
|
122
|
+
img_buffer = io.BytesIO()
|
123
|
+
self.image.save(img_buffer, "PNG") # 保存为 PNG 格式
|
124
|
+
del self.image
|
125
|
+
del self.draw # 关闭图形,释放内存
|
126
|
+
# 将指针重置到流的开头,以便后续读取
|
127
|
+
img_buffer.seek(0)
|
128
|
+
return img_buffer
|
129
|
+
|
130
|
+
|
131
|
+
if __name__ == "__main__":
|
132
|
+
p = BasicPNGPlotter(1500, 800)
|
133
|
+
p.draw_png()
|
134
|
+
p.save("testfiles/output.png")
|
{civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/Drift.py
RENAMED
@@ -32,6 +32,9 @@ class DriftPlotter(SeismicPlotter):
|
|
32
32
|
self._ax2_x = 1 / np.array(seismic_x)
|
33
33
|
self._ax2_y = 1 / np.array(seismic_y)
|
34
34
|
|
35
|
+
def set_limit(self, limit: float):
|
36
|
+
self.__limit = limit
|
37
|
+
|
35
38
|
def plot(self):
|
36
39
|
if self.__limit:
|
37
40
|
self.__plot_limit()
|
@@ -55,8 +58,32 @@ class DriftPlotter(SeismicPlotter):
|
|
55
58
|
self.axes[i].set_yticks(self._y_major_ticks)
|
56
59
|
self.axes[i].set_yticks(self._y_minor_ticks, minor=True)
|
57
60
|
x_ticks = GetTicks(xmaxs[i])
|
61
|
+
x_ticks = self.__shrink_x_ticks(x_ticks)
|
58
62
|
self.axes[i].set_xticks(x_ticks)
|
59
|
-
|
63
|
+
X_ticklabels = [0] + ["1/%d" % (1 / s) for s in x_ticks[1:]]
|
64
|
+
self.axes[i].set_xticklabels(X_ticklabels)
|
65
|
+
|
66
|
+
def __shrink_x_ticks(self, x_ticks):
|
67
|
+
if len(x_ticks) <= 4:
|
68
|
+
return x_ticks
|
69
|
+
new_x_ticks = []
|
70
|
+
for i in range(len(x_ticks)):
|
71
|
+
if i % 2 == 0:
|
72
|
+
new_x_ticks.append(x_ticks[i])
|
73
|
+
return new_x_ticks
|
74
|
+
|
75
|
+
def __plot_limit(self):
|
76
|
+
limitation = self.__limit
|
77
|
+
for ax in self.axes:
|
78
|
+
ax.vlines(
|
79
|
+
x=1 / limitation,
|
80
|
+
ymin=0,
|
81
|
+
ymax=self.floor_num,
|
82
|
+
color="r",
|
83
|
+
linewidth=3,
|
84
|
+
ls="--",
|
85
|
+
label=f"限值1/{limitation}",
|
86
|
+
)
|
60
87
|
|
61
88
|
def __add_titles(self):
|
62
89
|
self.axes[0].set_ylabel(self.y_label)
|