# -*- 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' + body + "\n\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("