# -*- coding: utf-8 -*-
"""功能区 24 个按钮图标生成器。
SVG 设计稿(语义化,统一风格) → svglib 栅格化 64x64 透明 PNG → bin\Debug\icons\。
幂等可重跑;svg 定义即源档(同步存一份到 icons/svg 供后续编辑)。
风格规范:viewBox 0 0 64 64;主色 #4A4A4A;强调绿 #217346(=功能区 AccentColor);
删除红 #D83931;母排铜 #C8791E;线宽 4 圆角;不用白色填充(保透明底)。"""
import os
import io
ROOT = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件"
SVG_DIR = os.path.join(ROOT, "成套报价软件", "icons", "svg")
PNG_DIR = os.path.join(ROOT, "成套报价软件", "bin", "Debug", "icons")
G = "#4A4A4A" # 主体深灰
GR = "#217346" # 强调绿
RD = "#D83931" # 删除红
CU = "#C8791E" # 铜排橙
BL = "#2B579A" # 文档蓝(点缀)
W = 'stroke="%s" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"' % G
def svg(body):
return ('\n")
# ---- 图标定义: name -> SVG body (64x64) ----
ICONS = {}
# 文档底形(多图标复用): 纸张
def doc(x=14, y=8, w=30, h=44, fold=True, color=G):
f = ('' %
(x, y, w - 10, 10, 10, h - 10, w, W, color)) if fold else \
('' % (x, y, w, h, W, color))
return f
# 1 button1 新建项目: 文档 + 绿色加号
ICONS["new-project"] = svg(
doc() +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'' +
'')
# 2 button2 修改项目: 文档 + 笔(斜置)
ICONS["edit-project"] = svg(
doc() +
'' % (W, G) +
'' % (W, G) +
'' % (CU, "#9C5A10") +
'')
# 3 button3 删除项目: 垃圾桶
ICONS["delete-project"] = svg(
'' % (W, RD) +
'' % RD +
'' % RD +
'' % RD +
'' % RD +
'' % RD)
# 4 button4 打开项目(项目页): 打开的文件夹
ICONS["open-project"] = svg(
'' % (W, G) +
'' % (W, GR) +
'' % GR)
# 5 button5 复制项目: 双层文档
ICONS["copy-project"] = svg(
'' % (W, G) +
'' % (W, GR) +
'' % G +
'' % G +
'' % G)
# 6 button8 导入项目: 容器+向下箭头(进箱)
ICONS["import-project"] = svg(
'' % (W, GR) +
'' % GR +
'' % GR)
# 7 button7 导出项目: 容器+向上箭头(出箱)
ICONS["export-project"] = svg(
'' % (W, BL) +
'' % BL +
'' % BL)
# 8 button9 打开项目(报价页): 文件夹+文档探出
ICONS["open-quote"] = svg(
'' % (W, G) +
'' % ("#E8F2EC", GR) +
'' % GR +
'' % GR +
'' % (W, G))
# 9 button10 修改项目(报价页): 文档+笔+绿点(区分项目页)
ICONS["edit-quote"] = svg(
doc() +
'' % (W, G) +
'' % GR +
'' % (CU, "#9C5A10"))
# 10 button17 保存: 软盘(绿色)
ICONS["save"] = svg(
'' % (W, GR) +
'' % (W, GR) +
'' % (W, GR) +
'' % GR)
# 11 button18 导入报价: 文档+向下箭头
ICONS["import-quote"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'' % GR)
# 12 button16 甲方报表: 表格+绿色对勾
ICONS["report"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'')
# 13 button15 调母排: 三根铜排+调节箭头
ICONS["busbar"] = svg(
'' % CU +
'' % CU +
'' % CU +
'' % G)
# 14 button13 调系数: 双滑块调节
ICONS["factor"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (GR, GR) +
'' % (BL, BL))
# 15 button33 元件排序: 列表+上下箭头
ICONS["sort-components"] = svg(
'' % G +
'' % G +
'' % G +
'' % G +
'' % G +
'' % G +
'' % GR +
'' % GR)
# 16 button29 模板费用: 模板网格+¥
ICONS["template-cost"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'¥')
# 17 button11 CAD扒图: 齿轮+放大镜
ICONS["cad-grab"] = svg(
'' % (W, G) +
'' % G +
'' % (W, GR) +
'' % GR)
# 18 btn登录: 人形+门框
ICONS["login"] = svg(
'' % (W, G) +
'' % (W, GR) +
'' % (W, GR) +
'' % G)
# 19 btn修改密码: 锁+钥匙孔
ICONS["password"] = svg(
'' % (W, GR) +
'' % (W, GR) +
'' % GR +
'' % GR)
# 20 btn会员信息: 人像卡片
ICONS["member"] = svg(
'' % (W, G) +
'' % (W, GR) +
'' % (W, GR) +
'' % G +
'' % G)
# 21 btn企业信息: 办公楼
ICONS["company"] = svg(
'' % (W, G) +
'' % (W, GR) +
'' % G +
'' % G +
'' % G +
'' % G +
'' % G +
'' % G +
'' % (W, G))
# 22 btn保存布局: 网格布局+绿色对勾
ICONS["save-layout"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'' % GR +
'')
# 23 btn备份: 数据库+向右箭头
ICONS["backup"] = svg(
'' % (W, G) +
'' % (W, G) +
'' % (W, G) +
'' % GR +
'' % GR)
# 24 btn恢复: 数据库+向左回箭头
ICONS["restore"] = svg(
'' % (W, GR) +
'' % (W, GR) +
'' % (W, GR) +
'' % G +
'' % G)
# 按钮 Name → 图标文件映射(与 Designer.cs 集合一致)
BIND = {
"button1": "new-project", "button2": "edit-project", "button3": "delete-project",
"button4": "open-project", "button5": "copy-project", "button7": "export-project",
"button8": "import-project", "button9": "open-quote", "button10": "edit-quote",
"button17": "save", "button18": "import-quote", "button16": "report",
"button15": "busbar", "button13": "factor", "button33": "sort-components",
"button29": "template-cost", "button11": "cad-grab",
"btn登录": "login", "btn修改密码": "password", "btn会员信息": "member",
"btn企业信息": "company", "btn保存布局": "save-layout",
"btn备份": "backup", "btn恢复": "restore",
}
def render_all():
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM
os.makedirs(SVG_DIR, exist_ok=True)
os.makedirs(PNG_DIR, exist_ok=True)
ok, fail = 0, []
for name, body in ICONS.items():
sp = os.path.join(SVG_DIR, name + ".svg")
with io.open(sp, "w", encoding="utf-8") as f:
f.write(svg(body) if not body.startswith("