Initial commit

This commit is contained in:
Qihuanye
2026-04-27 14:51:49 +08:00
commit dbbfc2867d
69 changed files with 68307 additions and 0 deletions
+177
View File
@@ -0,0 +1,177 @@
import os
os.environ.setdefault("MPLCONFIGDIR", "/tmp/matplotlib")
import schemdraw
import schemdraw.elements as elm
from schemdraw.segments import SegmentText
FONT_NAME = "LXGW WenKai"
OUTPUT_FILE = "terminal_voltage_diagram.svg"
def add_text(
drawing,
position,
text,
*,
rotation=0,
align=("center", "center"),
fontsize=18,
):
element = elm.Element().at(position).anchor("center").hold()
element.anchors["center"] = (0, 0)
element.segments.append(
SegmentText(
(0, 0),
text,
rotation=rotation,
align=align,
fontsize=fontsize,
font=FONT_NAME,
)
)
drawing.add(element)
with schemdraw.Drawing(show=False) as d:
d.config(
unit=1.0,
fontsize=18,
font=FONT_NAME,
lw=2.0,
margin=0.18,
bgcolor="white",
)
# ===== 几何参数 =====
left_x = 1.5
top_y = 6.3
bottom_y = 2.1
node_x = 6.1
term_x = 8.45
# 电池位置
battery_x = left_x
battery_bottom_y = 3.55
battery_len = 1.55
# 电阻尺寸控制
top_res_start_x = 3.0
top_res_len = 2.2
vertical_res_len = 2.25
# 关键点
top_node = (node_x, top_y)
bottom_node = (node_x, bottom_y)
a_pos = (term_x, top_y)
b_pos = (term_x, bottom_y)
top_battery_end_y = battery_bottom_y + battery_len
# ===== 左支路 + 电池 =====
# 下导线到电池
d.add(
elm.Line()
.at((battery_x, bottom_y))
.up(battery_bottom_y - bottom_y)
.hold()
)
# 电池
d.add(
elm.BatteryCell()
.at((battery_x, battery_bottom_y))
.up(battery_len)
.hold()
)
# 电池上端到顶端导线
d.add(
elm.Line()
.at((battery_x, top_battery_end_y))
.up(top_y - top_battery_end_y)
.hold()
)
# ===== 上支路 =====
d.add(elm.Line().at((battery_x, top_y)).right(top_res_start_x - battery_x).hold())
d.add(elm.ResistorIEC().at((top_res_start_x, top_y)).right(top_res_len).hold())
d.add(
elm.Line()
.at((top_res_start_x + top_res_len, top_y))
.right(node_x - (top_res_start_x + top_res_len))
.hold()
)
# 上节点
d.add(elm.Dot(radius=0.085).at(top_node).hold())
# a 端
d.add(elm.Line().at(top_node).right(term_x - node_x).hold())
d.add(elm.Dot(open=True, radius=0.105).at(a_pos).hold())
# ===== 中间竖支路 =====
d.add(elm.ResistorIEC().at(top_node).down(vertical_res_len).hold())
d.add(
elm.Line()
.at((node_x, top_y - vertical_res_len))
.down((top_y - vertical_res_len) - bottom_y)
.hold()
)
# 下节点
d.add(elm.Dot(radius=0.085).at(bottom_node).hold())
# b 端
d.add(elm.Line().at(bottom_node).right(term_x - node_x).hold())
d.add(elm.Dot(open=True, radius=0.105).at(b_pos).hold())
# ===== 下支路闭合 =====
d.add(elm.Line().at((battery_x, bottom_y)).right(node_x - battery_x).hold())
# ===== 文本标注 =====
# 9V:竖排,放在电池右侧偏中间,更贴近教材风格
add_text(
d,
(battery_x + 0.92, battery_bottom_y + battery_len / 2),
"10V",
rotation=0,
fontsize=16,
)
# 1kΩ:水平,置于上方电阻正下方
add_text(
d,
(top_res_start_x + top_res_len / 2, top_y - 0.72),
"1kΩ",
rotation=0,
fontsize=16,
)
# 2kΩ:竖排,置于竖直电阻左侧,方向要注意
add_text(
d,
(node_x - 0.82, top_y - vertical_res_len / 2),
"2kΩ",
rotation=0,
fontsize=16,
)
# a / b 端标注
add_text(
d,
(a_pos[0] + 0.42, a_pos[1] - 0.02),
"a",
fontsize=19,
)
add_text(
d,
(b_pos[0] + 0.42, b_pos[1] - 0.02),
"b",
fontsize=19,
)
d.save(OUTPUT_FILE, transparent=False)