sdlpart_convert_stl.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. # sldprt_to_stl_converter.py
  2. import os
  3. import tkinter as tk
  4. from tkinter import filedialog, messagebox
  5. import win32com.client
  6. import sys
  7. def convert_sldprt_to_stl(sldprt_path, stl_path):
  8. """
  9. 使用 SolidWorks API 将 .SLDPRT 文件转换为 .STL 文件
  10. :param sldprt_path: 输入的 SLDPRT 文件路径
  11. :param stl_path: 输出的 STL 文件路径
  12. :return: 是否成功
  13. """
  14. try:
  15. # 检查输入文件是否存在
  16. if not os.path.isfile(sldprt_path):
  17. raise FileNotFoundError(f"找不到文件: {sldprt_path}")
  18. # 启动 SolidWorks 应用(不显示界面)
  19. swApp = win32com.client.Dispatch("SldWorks.Application")
  20. if not swApp:
  21. raise RuntimeError("无法启动 SolidWorks。请确保已安装并注册。")
  22. # 打开 SLDPRT 文件(类型 1 = swDocumentTypes_e.swDocPART)
  23. errors = 0
  24. warnings = 0
  25. part = swApp.OpenDoc6(sldprt_path, 1, 0, "", errors, warnings)
  26. if not part:
  27. raise RuntimeError("SolidWorks 无法打开该文件。可能是格式不兼容或损坏。")
  28. # 设置保存选项(STL 选项)
  29. # 0 = 默认精度,1 = 快速,2 = 高精度
  30. save_options = 0 # 可改为 2 提高 STL 精度
  31. export_options = 0
  32. # 保存为 STL
  33. result = part.SaveAs3(stl_path, save_options, export_options)
  34. # 关闭文档(不保存更改)
  35. swApp.CloseDoc(os.path.basename(sldprt_path))
  36. if result != 0:
  37. return True, f"成功导出到: {stl_path}"
  38. else:
  39. return False, "SolidWorks 保存失败,可能是权限或路径问题。"
  40. except Exception as e:
  41. return False, f"转换失败: {str(e)}"
  42. def select_and_convert():
  43. """选择文件并执行转换"""
  44. # 选择输入文件
  45. sldprt_path = filedialog.askopenfilename(
  46. title="选择 .SLDPRT 文件",
  47. filetypes=[("SolidWorks Part Files", "*.SLDPRT"), ("All Files", "*.*")]
  48. )
  49. if not sldprt_path:
  50. return # 用户取消
  51. # 设置输出 STL 路径(默认同名,同目录)
  52. directory = os.path.dirname(sldprt_path)
  53. filename = os.path.splitext(os.path.basename(sldprt_path))[0]
  54. stl_path = os.path.join(directory, f"{filename}.STL")
  55. # 询问是否覆盖
  56. if os.path.exists(stl_path):
  57. if not messagebox.askyesno("覆盖确认", f"{stl_path} 已存在,是否覆盖?"):
  58. return
  59. # 执行转换
  60. success, message = convert_sldprt_to_stl(sldprt_path, stl_path)
  61. # 显示结果
  62. if success:
  63. messagebox.showinfo("成功", message)
  64. else:
  65. messagebox.showerror("失败", message)
  66. def main():
  67. """主函数:创建 GUI 界面"""
  68. root = tk.Tk()
  69. root.title("SLDPRT 转 STL 转换器")
  70. root.geometry("400x200")
  71. root.resizable(False, False)
  72. # 标题标签
  73. label = tk.Label(
  74. root,
  75. text="SolidWorks SLDPRT 转 STL",
  76. font=("SimHei", 14, "bold"),
  77. pady=20
  78. )
  79. label.pack()
  80. # 说明
  81. info = tk.Label(
  82. root,
  83. text="点击下方按钮选择 .SLDPRT 文件进行转换",
  84. font=("微软雅黑", 10),
  85. fg="gray"
  86. )
  87. info.pack()
  88. # 转换按钮
  89. convert_btn = tk.Button(
  90. root,
  91. text="选择文件并转换",
  92. font=("微软雅黑", 12),
  93. bg="#4CAF50",
  94. fg="white",
  95. padx=20,
  96. pady=10,
  97. command=select_and_convert
  98. )
  99. convert_btn.pack(pady=20)
  100. # 启动主循环
  101. root.mainloop()
  102. if __name__ == "__main__":
  103. # 检查是否安装了 pywin32
  104. try:
  105. import win32com.client
  106. except ImportError:
  107. messagebox.showerror(
  108. "缺少依赖",
  109. "请先安装 pywin32:\n\npip install pywin32"
  110. )
  111. sys.exit(1)
  112. main()