123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- # sldprt_to_stl_converter.py
- import os
- import tkinter as tk
- from tkinter import filedialog, messagebox
- import win32com.client
- import sys
- def convert_sldprt_to_stl(sldprt_path, stl_path):
- """
- 使用 SolidWorks API 将 .SLDPRT 文件转换为 .STL 文件
- :param sldprt_path: 输入的 SLDPRT 文件路径
- :param stl_path: 输出的 STL 文件路径
- :return: 是否成功
- """
- try:
- # 检查输入文件是否存在
- if not os.path.isfile(sldprt_path):
- raise FileNotFoundError(f"找不到文件: {sldprt_path}")
- # 启动 SolidWorks 应用(不显示界面)
- swApp = win32com.client.Dispatch("SldWorks.Application")
- if not swApp:
- raise RuntimeError("无法启动 SolidWorks。请确保已安装并注册。")
- # 打开 SLDPRT 文件(类型 1 = swDocumentTypes_e.swDocPART)
- errors = 0
- warnings = 0
- part = swApp.OpenDoc6(sldprt_path, 1, 0, "", errors, warnings)
- if not part:
- raise RuntimeError("SolidWorks 无法打开该文件。可能是格式不兼容或损坏。")
- # 设置保存选项(STL 选项)
- # 0 = 默认精度,1 = 快速,2 = 高精度
- save_options = 0 # 可改为 2 提高 STL 精度
- export_options = 0
- # 保存为 STL
- result = part.SaveAs3(stl_path, save_options, export_options)
- # 关闭文档(不保存更改)
- swApp.CloseDoc(os.path.basename(sldprt_path))
- if result != 0:
- return True, f"成功导出到: {stl_path}"
- else:
- return False, "SolidWorks 保存失败,可能是权限或路径问题。"
- except Exception as e:
- return False, f"转换失败: {str(e)}"
- def select_and_convert():
- """选择文件并执行转换"""
- # 选择输入文件
- sldprt_path = filedialog.askopenfilename(
- title="选择 .SLDPRT 文件",
- filetypes=[("SolidWorks Part Files", "*.SLDPRT"), ("All Files", "*.*")]
- )
- if not sldprt_path:
- return # 用户取消
- # 设置输出 STL 路径(默认同名,同目录)
- directory = os.path.dirname(sldprt_path)
- filename = os.path.splitext(os.path.basename(sldprt_path))[0]
- stl_path = os.path.join(directory, f"{filename}.STL")
- # 询问是否覆盖
- if os.path.exists(stl_path):
- if not messagebox.askyesno("覆盖确认", f"{stl_path} 已存在,是否覆盖?"):
- return
- # 执行转换
- success, message = convert_sldprt_to_stl(sldprt_path, stl_path)
- # 显示结果
- if success:
- messagebox.showinfo("成功", message)
- else:
- messagebox.showerror("失败", message)
- def main():
- """主函数:创建 GUI 界面"""
- root = tk.Tk()
- root.title("SLDPRT 转 STL 转换器")
- root.geometry("400x200")
- root.resizable(False, False)
- # 标题标签
- label = tk.Label(
- root,
- text="SolidWorks SLDPRT 转 STL",
- font=("SimHei", 14, "bold"),
- pady=20
- )
- label.pack()
- # 说明
- info = tk.Label(
- root,
- text="点击下方按钮选择 .SLDPRT 文件进行转换",
- font=("微软雅黑", 10),
- fg="gray"
- )
- info.pack()
- # 转换按钮
- convert_btn = tk.Button(
- root,
- text="选择文件并转换",
- font=("微软雅黑", 12),
- bg="#4CAF50",
- fg="white",
- padx=20,
- pady=10,
- command=select_and_convert
- )
- convert_btn.pack(pady=20)
- # 启动主循环
- root.mainloop()
- if __name__ == "__main__":
- # 检查是否安装了 pywin32
- try:
- import win32com.client
- except ImportError:
- messagebox.showerror(
- "缺少依赖",
- "请先安装 pywin32:\n\npip install pywin32"
- )
- sys.exit(1)
- main()
|