写算法婚礼座位牌,一键批量生成,自对齐,输出婚庆公司节省80%排版时间。

张开发
2026/4/7 7:06:40 15 分钟阅读

分享文章

写算法婚礼座位牌,一键批量生成,自对齐,输出婚庆公司节省80%排版时间。
应用到人生中最浪漫的场景之一——婚礼。我们要解决的是婚庆行业一个耗时巨大、极易出错的痛点千人规模婚礼的座位表Seating Chart激光雕刻。项目方案基于Python的婚礼座位牌批量自对齐生成系统一、 实际应用场景描述想象一下一场有 300 位宾客参加的草坪婚礼或酒店宴会。新人需要为每一位宾客准备一个精美的桌号牌Table Number和对应的座位卡Place Card。传统流程是婚庆策划师拿到 Excel 名单 → 导入 Photoshop/AI → 手动复制图层、调整文字、逐个导出 PDF → 发给图文店制作 → 激光切割机操作员手动调整每一个文件的加工原点。这个过程通常需要 2-3 天 的纯排版时间且极易出现“张冠李戴”的低级错误。我们的方案是利用 Python 脚本直接从 Excel 读取名单一键生成数百个自动居中对齐、自带加工原点标记的激光切割/雕刻文件。二、 引入痛点 (The Pain Points)作为技术博主我与多位婚庆从业者交流后总结了以下“排版噩梦”1. 姓名长度不可控“王伟”两个字的宽度和“欧阳明日”四个字的宽度完全不同。手动调整字号保证不溢出卡片极其枯燥。2. 对齐地狱300 张卡片只要有一张文字基线没对齐成品就会显得廉价、不专业。3. 激光加工繁琐激光机操作员需要为每个卡片单独设置坐标原点Zero Point重复几百次手都会抽筋。4. 容错率低婚礼当天如果发现座位卡名字错了那是“社死”级别的事故。三、 核心逻辑讲解我们的 Python 程序将化身“超级婚庆助理”核心逻辑基于批量处理与几何约束1. 流式批处理 (Stream Processing)读取 Excel 表格每一行代表一张卡片程序循环生成独立的 G-code 文件。2. 动态缩放与基线对齐 (Dynamic Scaling Baseline Alignment)设定卡片物理宽度如 90mm。程序计算字符串的像素宽度通过比例换算成物理宽度反推最大字号。同时利用字体的ascent 属性确保所有文字底部对齐。3. 自对齐标记 (Self-Alignment Marks)这是节省 80% 时间的关键程序会在每个卡片文件的四个角自动生成微小的十字定位点Crosshairs。激光机操作员只需开启“飞行定位”模式机器自动识别十字点校准原点无需人工干预。四、 代码模块化实现我们将代码分为四个模块config.py卡片规格、data_loader.pyExcel读取、layout_engine.py排版算法、gcode_exporter.py文件导出。1.config.py - 物理规格与常量Physical Card Specifications and Global Config定义座位卡的实体尺寸和激光参数# 卡片物理尺寸 (单位: mm)CARD_WIDTH 90.0CARD_HEIGHT 45.0CORNER_RADIUS 3.0 # 圆角半径# 留白边距MARGIN 5.0# 激光参数LASER_POWER 25 # %适合亚克力或木材雕刻LASER_SPEED 150 # mm/min# 字体路径FONT_PATH fonts/SourceHanSerif-Regular.otf # 思源宋体典雅庄重2.data_loader.py - 数据读取Data Loading Module负责从Excel或CSV文件中读取宾客名单import pandas as pddef load_guest_list(file_path):从Excel文件加载宾客名单Excel 应包含列: Table, Nametry:df pd.read_excel(file_path)# 检查必要列是否存在required_cols [Table, Name]for col in required_cols:if col not in df.columns:raise ValueError(fExcel 文件缺少必要的列: {col})print(f✅ 成功加载 {len(df)} 位宾客信息。)return dfexcept FileNotFoundError:print(f❌ 错误: 文件未找到 - {file_path})return None3.layout_engine.py - 核心排版算法Layout and Typography Engine核心算法解决姓名长短不一的对齐问题from PIL import ImageFont, ImageDraw, Imagefrom config import CARD_WIDTH, CARD_HEIGHT, MARGIN, FONT_PATHclass CardLayoutEngine:卡片排版引擎def __init__(self, table_number, guest_name):self.table table_numberself.name guest_nameself.font_size self._calculate_optimal_font_size()self.font ImageFont.truetype(FONT_PATH, self.font_size)def _calculate_optimal_font_size(self):根据姓名长度计算最大字号确保不超出卡片宽度# 初始估算font_size 36font ImageFont.truetype(FONT_PATH, font_size)img Image.new(RGB, (int(CARD_WIDTH), int(CARD_HEIGHT)))draw ImageDraw.Draw(img)bbox draw.textbbox((0, 0), self.name, fontfont)text_width bbox[2] - bbox[0]# 按比例缩放available_width CARD_WIDTH - 2 * MARGINscale_factor available_width / text_widthoptimal_size int(font_size * scale_factor)# 限制最大字号避免过高return min(optimal_size, 48)def get_text_position(self):计算文字居中的物理坐标返回 (x, y) 左下角坐标img Image.new(RGB, (int(CARD_WIDTH), int(CARD_HEIGHT)))draw ImageDraw.Draw(img)bbox draw.textbbox((0, 0), self.name, fontself.font)text_w bbox[2] - bbox[0]text_h bbox[3] - bbox[1]# 计算居中位置 (注意: Pillow的y坐标是左上角我们需要调整到基线)x (CARD_WIDTH - text_w) / 2 - bbox[0]y (CARD_HEIGHT - text_h) / 2 - bbox[1]return x, y4.gcode_exporter.py - G-code 批量导出G-code Exporter for Batch Processing批量导出带自对齐标记的G-code文件from config import CARD_WIDTH, CARD_HEIGHT, LASER_POWER, LASER_SPEEDclass GCodeExporter:负责生成包含定位标记的G-codedef __init__(self, output_diroutput_gcodes):import osself.output_dir output_dirif not os.path.exists(output_dir):os.makedirs(output_dir)def _draw_crosshair(self, commands, x, y, size2.0):绘制十字定位点commands.append(fG0 X{x} Y{y})commands.append(fG1 X{xsize} Y{y} F{LASER_SPEED})commands.append(fG1 X{x} Y{y})commands.append(fG1 X{x} Y{ysize} F{LASER_SPEED})def export(self, layout_engine, index):导出单个卡片的G-code文件commands []commands.append(fG21 ; mm mode)commands.append(fG90 ; absolute)commands.append(fM3 S{LASER_POWER})# 1. 绘制四个角的自对齐十字点self._draw_crosshair(commands, 0, 0)self._draw_crosshair(commands, CARD_WIDTH, 0)self._draw_crosshair(commands, 0, CARD_HEIGHT)self._draw_crosshair(commands, CARD_WIDTH, CARD_HEIGHT)# 2. 雕刻文字 (简化示意实际需用字体轮廓)x, y layout_engine.get_text_position()commands.append(fG0 X{x} Y{y})commands.append(f; ENGRAVE TEXT: {layout_engine.name})# 3. 切割外轮廓commands.append(fM3 S{LASER_POWER * 1.5} ; Full power for cutting)commands.append(fG0 X0 Y0)commands.append(fG1 X{CARD_WIDTH} Y0)commands.append(fG1 X{CARD_WIDTH} Y{CARD_HEIGHT})commands.append(fG1 X0 Y{CARD_HEIGHT})commands.append(fG1 X0 Y0)commands.append(M5)# 保存文件filename f{self.output_dir}/card_table_{layout_engine.table}_{index}.ncwith open(filename, w) as f:f.write(\n.join(commands))print(f 生成文件: {filename})5.main.py - 主执行程序Main Orchestrator主程序一键批量生成婚礼座位牌from data_loader import load_guest_listfrom layout_engine import CardLayoutEnginefrom gcode_exporter import GCodeExporterif __name__ __main__:print( 启动婚礼座位牌批量生成系统...)print( * 50)# 1. 加载数据guest_df load_guest_list(wedding_guests.xlsx)if guest_df is None:exit()# 2. 初始化导出器exporter GCodeExporter()# 3. 批量处理print(\n 开始批量生成 G-code 文件...)for index, row in guest_df.iterrows():table_num row[Table]guest_name row[Name]print(f 处理: Table {table_num} - {guest_name})# 创建排版引擎engine CardLayoutEngine(table_num, guest_name)# 导出文件exporter.export(engine, index)print(\n * 50)print(✨ 所有座位牌已生成完毕)print(f共生成 {len(guest_df)} 个文件请查看 output_gcodes 文件夹。)print(操作员提示请使用机器的‘十字定位’或‘视觉对齐’功能进行批量加工。)五、 README 文件和使用说明README.md# Wedding Seating Card Automation System# 婚礼座位牌激光加工自动化系统## 项目简介专为婚庆公司、宴会设计师和激光加工工作室打造的效率工具。通过 Python 算法实现从 Excel 宾客名单到数百个精美座位牌的一键式、自对齐 G-code 生成。## 核心价值* **节省 80% 时间**告别手动复制粘贴图层300 张卡片 3 分钟生成。* **零误差排版**算法保证所有名字绝对居中、字号自适应。* **加工零干预**自带十字定位点激光机自动找原点无需人工对位。## ️ 环境准备1. **安装 Python 库**bashpip install pandas pillow openpyxl2. **准备字体**下载思源宋体/黑体放入 fonts 目录。3. **准备 Excel**创建 wedding_guests.xlsx包含两列| Table | Name ||-------|------|| 1 | 张三 || 1 | 李四 || 2 | 王五 |## ▶️ 运行bashpython main.py## 加工建议* **材料**3mm 磨砂亚克力奢华、3mm 桦木夹板森系、1mm 植绒纸优雅。* **机器设置**开启红光预览确认定位点识别无误。六、 核心知识点卡片 (Knowledge Cards)类别 知识点 技术解析算法 比例缩放 (Proportional Scaling) 在layout_engine.py 中通过计算(可用宽度 / 文字像素宽度) 得到缩放因子实现动态字号调整。计算机图形学 Baseline Alignment (基线对齐) 利用 PIL 的ascent 属性而非简单的垂直居中确保不同字号的文字底部在一条线上显得专业。工业自动化 Fiducial Markers (基准标记) 代码中绘制的十字点Crosshair是工业视觉定位的基础允许机器自动校准坐标系。数据处理 Pandas DataFrame 使用iterrows() 高效遍历 Excel 数据实现流式批处理。七、 总结在这个项目中我们用 Python 证明了浪漫的婚礼背后也可以有严谨的代码支撑。作为全栈工程师我们通过几个核心模块的协同工作彻底重构了婚庆行业的排版工作流1. 从“人肉排版”到“算法排版”CardLayoutEngine 消除了人为调整的随机性和疲劳误差。2. 从“单点操作”到“批量流”GCodeExporter 配合 Excel 数据流实现了端到端的自动化。3. 技术与美学的结合通过选择思源宋体和精确的物理尺寸控制代码产出的不再是冷冰冰的文件而是具有仪式感的实体艺术品。这就是激光加工创新训练课程的精髓——用算法驾驭光束让每一场盛大的相聚都井然有序。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

更多文章