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.
Files changed (71) hide show
  1. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/Steel.py +3 -3
  2. civil_tools_v-0.0.6/CivilTools/FigureGenerator/BasicPNGPlotter.py +134 -0
  3. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/Drift.py +28 -1
  4. civil_tools_v-0.0.6/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +600 -0
  5. civil_tools_v-0.0.6/CivilTools/FigureGenerator/__init__.py +1 -0
  6. civil_tools_v-0.0.6/CivilTools/ReportGenerator/DocPicture.py +11 -0
  7. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/StairCalculationReport.py +346 -52
  8. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/UtilFunctions.py +91 -0
  9. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/LoadDefine.py +15 -7
  10. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairComponent.py +8 -0
  11. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/StairPart.py +66 -6
  12. civil_tools_v-0.0.6/CivilTools/__init__.py +3 -0
  13. {civil_tools_v-0.0.4/civil_tools_v.egg-info → civil_tools_v-0.0.6}/PKG-INFO +1 -1
  14. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6/civil_tools_v.egg-info}/PKG-INFO +1 -1
  15. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/setup.py +3 -1
  16. civil_tools_v-0.0.4/CivilTools/FigureGenerator/BasicPNGPlotter.py +0 -46
  17. civil_tools_v-0.0.4/CivilTools/FigureGenerator/StairCalculationSheetPNGPlotter.py +0 -10
  18. civil_tools_v-0.0.4/CivilTools/FigureGenerator/__init__.py +0 -0
  19. civil_tools_v-0.0.4/CivilTools/ReportGenerator/DocPicture.py +0 -8
  20. civil_tools_v-0.0.4/CivilTools/__init__.py +0 -1
  21. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/CAD.py +0 -0
  22. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/Concrete.py +0 -0
  23. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/Const/__init__.py +0 -0
  24. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/BasicDXF.py +0 -0
  25. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/DetailDXF.py +0 -0
  26. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/DrawingAttribs.py +0 -0
  27. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/LayerManager.py +0 -0
  28. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/DXFGenerator/__init__.py +0 -0
  29. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/BasicPltPlotter.py +0 -0
  30. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/ShearMassRatio.py +0 -0
  31. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/ShearMoment.py +0 -0
  32. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/FigureGenerator/SeismicReport/__init__.py +0 -0
  33. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/BasicGenerator.py +0 -0
  34. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/DocParagraph.py +0 -0
  35. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/DocTable.py +0 -0
  36. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/SeismicReport.py +0 -0
  37. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/SeismicReportTemplate.py +0 -0
  38. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/ReportGenerator/__init__.py +0 -0
  39. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Beam/Beam.py +0 -0
  40. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Beam/__init__.py +0 -0
  41. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Column/Column.py +0 -0
  42. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Column/__init__.py +0 -0
  43. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/ComponentType.py +0 -0
  44. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/Grid.py +0 -0
  45. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/Joint.py +0 -0
  46. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/StandFloor.py +0 -0
  47. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Geometry/__init__.py +0 -0
  48. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/BasicResult.py +0 -0
  49. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/SeismicResult.py +0 -0
  50. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/GlobalResult/__init__.py +0 -0
  51. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/Section.py +0 -0
  52. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/ShapeEnum.py +0 -0
  53. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Section/__init__.py +0 -0
  54. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Slab/Slab.py +0 -0
  55. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/Slab/__init__.py +0 -0
  56. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/StairPart/__init__.py +0 -0
  57. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/BuildingDefine/__init__.py +0 -0
  58. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/Connector.py +0 -0
  59. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/RowDataFactory.py +0 -0
  60. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/YDBTableName.py +0 -0
  61. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/SQLiteConnector/__init__.py +0 -0
  62. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/YDBLoader.py +0 -0
  63. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/YDBType.py +0 -0
  64. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/CivilTools/YDBLoader/__init__.py +0 -0
  65. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/LICENSE +0 -0
  66. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/README.md +0 -0
  67. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/SOURCES.txt +0 -0
  68. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/dependency_links.txt +0 -0
  69. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/requires.txt +0 -0
  70. {civil_tools_v-0.0.4 → civil_tools_v-0.0.6}/civil_tools_v.egg-info/top_level.txt +0 -0
  71. {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", 300, 2000000)
14
+ HRB300 = SteelLevel("HRB300", 270, 2100000)
15
15
  HRB355 = SteelLevel("HRB355", 300, 2000000)
16
- HRB400 = SteelLevel("HRB400", 300, 2000000)
17
- HRB500 = SteelLevel("HRB500", 300, 2000000)
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")
@@ -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
- # self.axes[i].set_xticklabels([f"{i*100:.1f}%" for i in x_ticks])
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)