Compare commits
4 Commits
36139d4ab5
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94080e71ae | ||
|
|
395d364a8f | ||
|
|
7c2728c004 | ||
|
|
8f67a3dd0a |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -14,4 +14,8 @@ settings.json
|
||||
node_modules
|
||||
*.log
|
||||
*.lock
|
||||
*.pdf
|
||||
*.pdf
|
||||
lightening.ico
|
||||
metadata.yml
|
||||
VERSION
|
||||
生成exe图标.png
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@ gui: build
|
||||
uv run python update_version.py
|
||||
cd webui && npm run build
|
||||
cd ..
|
||||
uv run pyinstaller webview_app.py -n LighteningGUI --noconsole --add-data "webui/dist;webui/dist" -y
|
||||
uv run pyinstaller webview_app.py -n LighteningGUI --noconsole --add-data "webui/dist;webui/dist" -y --icon lightening.ico
|
||||
|
||||
console: dist build
|
||||
uv run python update_version.py
|
||||
|
||||
@@ -34,7 +34,6 @@ pip install -r requirements.txt
|
||||
|
||||
- ezdxf - DXF文件生成
|
||||
- loguru - 日志记录
|
||||
- matplotlib - 数据可视化和动画
|
||||
- numpy - 数值计算
|
||||
- tomli - TOML配置文件解析
|
||||
- pywebview - 图形界面框架
|
||||
|
||||
94
animation.py
94
animation.py
@@ -1,94 +0,0 @@
|
||||
import matplotlib.pyplot as plt
|
||||
from functools import wraps
|
||||
import numpy as np
|
||||
|
||||
|
||||
class Animation:
|
||||
def __init__(self) -> None:
|
||||
fig, ax = plt.subplots()
|
||||
self._fig = fig
|
||||
self._ax = ax
|
||||
self._ticks = 0
|
||||
self._disable = False
|
||||
self.init_fig()
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def switch_decorator(func):
|
||||
@wraps(func)
|
||||
def not_run(cls, *args, **kwargs):
|
||||
# print("not run")
|
||||
pass
|
||||
|
||||
@wraps(func)
|
||||
def wrapTheFunction(cls, *args, **kwargs):
|
||||
if not cls._disable:
|
||||
# print("desc")
|
||||
return func(cls, *args, **kwargs)
|
||||
return not_run(cls, *args, **kwargs)
|
||||
|
||||
return wrapTheFunction
|
||||
|
||||
def enable(self, _enable):
|
||||
self._disable = not _enable
|
||||
|
||||
@switch_decorator
|
||||
def init_fig(self):
|
||||
ax = self._ax
|
||||
ax.set_aspect(1)
|
||||
ax.set_xlim([-500, 500])
|
||||
ax.set_ylim([-500, 500])
|
||||
|
||||
@switch_decorator
|
||||
def show(self):
|
||||
self._fig.show()
|
||||
|
||||
@switch_decorator
|
||||
def add_rg_line(self, line_func):
|
||||
ax = self._ax
|
||||
x = np.linspace(0, 300)
|
||||
y = line_func(x)
|
||||
ax.plot(x, y)
|
||||
|
||||
@switch_decorator
|
||||
def add_rs(self, rs, rs_x, rs_y):
|
||||
ax = self._ax
|
||||
ax.add_artist(plt.Circle((rs_x, rs_y), rs, fill=False))
|
||||
|
||||
@switch_decorator
|
||||
def add_rc(self, rc, rc_x, rc_y):
|
||||
ax = self._ax
|
||||
ax.add_artist(plt.Circle((rc_x, rc_y), rc, fill=False))
|
||||
|
||||
# 增加暴露弧范围
|
||||
@switch_decorator
|
||||
def add_expose_area(
|
||||
self,
|
||||
rc_x,
|
||||
rc_y,
|
||||
intersection_x1,
|
||||
intersection_y1,
|
||||
intersection_x2,
|
||||
intersection_y2,
|
||||
):
|
||||
ax = self._ax
|
||||
ax.plot([rc_x, intersection_x1], [rc_y, intersection_y1], color="red")
|
||||
ax.plot([rc_x, intersection_x2], [rc_y, intersection_y2], color="red")
|
||||
pass
|
||||
|
||||
@switch_decorator
|
||||
def clear(self):
|
||||
ax = self._ax
|
||||
ax.cla()
|
||||
|
||||
@switch_decorator
|
||||
def pause(self):
|
||||
ax = self._ax
|
||||
self._ticks += 1
|
||||
ticks = self._ticks
|
||||
ax.set_title(f"{ticks}")
|
||||
plt.pause(0.02)
|
||||
self.clear()
|
||||
self.init_fig()
|
||||
|
||||
pass
|
||||
BIN
lightening.ico
BIN
lightening.ico
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB |
3
main.py
3
main.py
@@ -261,7 +261,8 @@ def run_egm(para: Parameter, animation=None) -> dict:
|
||||
ground_angel,
|
||||
6,
|
||||
) # 最大电流时
|
||||
cad.save_as(f"egm{phase_conductor_foo + 1}.dxf")
|
||||
# TODO: 暂时先不用。
|
||||
# cad.save_as(f"egm{phase_conductor_foo + 1}.dxf")
|
||||
min_distance_intersection = (
|
||||
np.sum(
|
||||
(
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
version: 1.0.17
|
||||
company_name: EGM
|
||||
file_description: EGM Lightning Protection Calculator
|
||||
product_name: Lightening
|
||||
100
plot.py
100
plot.py
@@ -1,100 +0,0 @@
|
||||
import matplotlib
|
||||
from plot_data import *
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.ticker as mticker
|
||||
|
||||
matplotlib.use("Qt5Agg")
|
||||
# 解决中文乱码
|
||||
plt.rcParams["font.sans-serif"] = ["simsun"]
|
||||
plt.rcParams["font.family"] = "sans-serif"
|
||||
# plt.rcParams["font.weight"] = "bold"
|
||||
# 解决负号无法显示的问题
|
||||
plt.rcParams["axes.unicode_minus"] = False
|
||||
plt.rcParams["savefig.dpi"] = 1200 # 图片像素
|
||||
# plt.savefig("port.png", dpi=600, bbox_inches="tight")
|
||||
fontsize = 12
|
||||
################################################
|
||||
witdh_of_bar=0.3
|
||||
color=plt.cm.BuPu(np.linspace(152/255, 251/255,152/255))
|
||||
percent1 = data_150m塔高_不同地线保护角[:, 1] / data_150m塔高_不同地线保护角[:, 0]
|
||||
# percent1 = data_66m串长_不同塔高[:, 1] / data_66m串长_不同塔高[:, 0]
|
||||
# percent2 = data_68m串长_不同塔高[:, 1] / data_68m串长_不同塔高[:, 0]
|
||||
fig, ax = plt.subplots()
|
||||
x = np.arange(len(category_names_150m塔高_不同地线保护角)) # the label locations
|
||||
p1 = ax.bar(category_names_150m塔高_不同地线保护角, percent1, witdh_of_bar, label="绕击/反击跳闸率比值",color=color,hatch='-')
|
||||
# p1 = ax.bar(x - 0.3 / 2, percent1, 0.3, label="6.6m绝缘距离")
|
||||
# p2 = ax.bar(x + 0.3 / 2, percent2, 0.3, label="6.8m绝缘距离")
|
||||
ax.xaxis.set_major_locator(mticker.FixedLocator(x))
|
||||
ax.set_xticklabels(category_names_150m塔高_不同地线保护角)
|
||||
ax.set_ylabel("比值", fontsize=fontsize)
|
||||
ax.set_xlabel("地线保护角(°)", fontsize=fontsize)
|
||||
# ax.set_xlabel("接地电阻(Ω)", fontsize=fontsize)
|
||||
plt.xticks(fontsize=fontsize)
|
||||
plt.yticks(fontsize=fontsize)
|
||||
ax.bar_label(p1, padding=0, fontsize=fontsize)
|
||||
# ax.bar_label(p2, padding=0, fontsize=fontsize)
|
||||
ax.legend(fontsize=fontsize)
|
||||
|
||||
fig.tight_layout()
|
||||
plt.show()
|
||||
|
||||
|
||||
# results = {
|
||||
# "100m": 100 * data[0, :] / np.sum(data[0, :]),
|
||||
# "110m": data[1, :] / np.sum(data[1, :]),
|
||||
# "120m": data[2, :] / np.sum(data[2, :]),
|
||||
# "130m": data[3, :] / np.sum(data[3, :]),
|
||||
# "140m": data[4, :] / np.sum(data[4, :]),
|
||||
# "150m": data[5, :] / np.sum(data[5, :]),
|
||||
# }
|
||||
|
||||
|
||||
# def survey(results, category_names):
|
||||
# """
|
||||
# Parameters
|
||||
# ----------
|
||||
# results : dict
|
||||
# A mapping from question labels to a list of answers per category.
|
||||
# It is assumed all lists contain the same number of entries and that
|
||||
# it matches the length of *category_names*.
|
||||
# category_names : list of str
|
||||
# The category labels.
|
||||
# """
|
||||
# labels = list(results.keys())
|
||||
# data = np.array(list(results.values()))
|
||||
# data_cum = data.cumsum(axis=1)
|
||||
# category_colors = plt.get_cmap("RdYlGn")(np.linspace(0.15, 0.85, data.shape[1]))
|
||||
#
|
||||
# fig, ax = plt.subplots(figsize=(9.2, 5))
|
||||
# ax.invert_yaxis()
|
||||
# ax.xaxis.set_visible(False)
|
||||
# ax.set_xlim(0, np.sum(data, axis=1).max())
|
||||
#
|
||||
# for i, (colname, color) in enumerate(zip(category_names, category_colors)):
|
||||
# widths = data[:, i]
|
||||
# starts = data_cum[:, i] - widths
|
||||
# rects = ax.barh(
|
||||
# labels, widths, left=starts, height=0.5, label=colname, color=color
|
||||
# )
|
||||
#
|
||||
# r, g, b, _ = color
|
||||
# text_color = "white" if r * g * b < 0.5 else "darkgrey"
|
||||
# ax.bar_label(rects, label_type="center", color=text_color)
|
||||
# ax.legend(
|
||||
# ncol=len(category_names),
|
||||
# bbox_to_anchor=(0, 1),
|
||||
# loc="lower left",
|
||||
# fontsize="small",
|
||||
# )
|
||||
#
|
||||
# return fig, ax
|
||||
|
||||
# percent=data/np.sum(data,axis=1)[:,None]*100
|
||||
# percent = data[:, 1] / data[:, 0]
|
||||
# plt.bar(category_names, percent, 0.3, label="黑")
|
||||
# # plt.bar(category_names, percent[:,0], 0.2, label="r")
|
||||
#
|
||||
# # plt.bar(category_names, [0.014094 / 100, 0.025094 / 100], 0.2, label="h")
|
||||
# plt.legend()
|
||||
# # survey(results, category_names)
|
||||
# plt.show()
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""更新版本号脚本"""
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -20,22 +19,6 @@ def increment_version(version: str) -> str:
|
||||
return version
|
||||
|
||||
|
||||
def update_index_html(version: str):
|
||||
"""更新 webui/index.html 中的标题版本号"""
|
||||
index_file = Path(__file__).parent / "webui" / "index.html"
|
||||
content = index_file.read_text(encoding="utf-8")
|
||||
|
||||
# 替换标题中的版本号
|
||||
new_content = re.sub(
|
||||
r"<title>EGM 输电线路绕击跳闸率计算( v[\d.]+)?</title>",
|
||||
f"<title>EGM 输电线路绕击跳闸率计算 v{version}</title>",
|
||||
content
|
||||
)
|
||||
|
||||
index_file.write_text(new_content, encoding="utf-8")
|
||||
print(f"Updated version in {index_file} to v{version}")
|
||||
|
||||
|
||||
def update_version_file(version: str):
|
||||
"""更新 VERSION 文件"""
|
||||
version_file = Path(__file__).parent / "VERSION"
|
||||
@@ -66,7 +49,6 @@ def main():
|
||||
|
||||
# 更新所有文件
|
||||
update_version_file(new_version)
|
||||
update_index_html(new_version)
|
||||
create_metadata(new_version)
|
||||
|
||||
print(f"Version updated: {current_version} -> {new_version}")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>EGM 输电线路绕击跳闸率计算 v1.0.17</title>
|
||||
<title>EGM 输电线路绕击跳闸率计算</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
@@ -15,7 +15,16 @@ export default defineConfig({
|
||||
vue({
|
||||
template: { transformAssetUrls }
|
||||
}),
|
||||
quasar()
|
||||
quasar(),
|
||||
{
|
||||
name: 'html-version',
|
||||
transformIndexHtml(html) {
|
||||
return html.replace(
|
||||
/<title>EGM 输电线路绕击跳闸率计算( v[\d.]+)?<\/title>/,
|
||||
`<title>EGM 输电线路绕击跳闸率计算 v${version}</title>`
|
||||
)
|
||||
}
|
||||
}
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
|
||||
Reference in New Issue
Block a user