通义千问1.5-1.8B-Chat-GPTQ-Int4进阶教程:使用SolidWorks API进行自动化设计文档生成
通义千问1.5-1.8B-Chat-GPTQ-Int4进阶教程:使用SolidWorks API进行自动化设计文档生成
你是不是也经历过这样的场景?在SolidWorks里精心设计完一个复杂的装配体,看着满屏幕的零件和特征,成就感满满。但紧接着,领导或者客户要求你提供一份详细的设计说明文档,或者一份清晰的物料清单摘要。你不得不从软件里一个个导出属性,再打开Word或者Excel,手动整理、复制、粘贴、排版……这个过程枯燥、重复,还容易出错。
如果能有一个助手,在你完成设计后,自动读取模型信息,并帮你生成一份条理清晰、格式规范的文档,那该多好。今天,我们就来探索如何将小巧高效的通义千问1.5-1.8B-Chat-GPTQ-Int4模型,与强大的SolidWorks API结合起来,搭建一个属于你自己的“设计文档自动生成器”。
这个方案的核心思路很简单:用SolidWorks API做“眼睛”和“手”,去读取三维模型里的所有信息;用通义千问模型做“大脑”,去理解和组织这些信息,生成人类可读的文档。 整个过程完全自动化,让你从繁琐的文档工作中解放出来,把精力真正聚焦在创造性设计上。
1. 为什么选择这个组合?
在开始动手之前,我们先聊聊为什么是“通义千问1.5-1.8B-Chat”和“SolidWorks API”这个组合。
首先,通义千问1.5-1.8B-Chat-GPTQ-Int4 是一个经过量化压缩的大语言模型。它的优势非常明显:体积小、推理速度快、资源消耗低。对于需要集成到本地工作流程(比如和SolidWorks联动)的应用来说,一个几GB的模型远比动辄几十GB的原始模型要友好得多。它能在普通的办公电脑上流畅运行,快速理解我们提供的结构化数据(零件名、属性、数量等),并生成连贯的文本。
其次,SolidWorks API 是官方提供的编程接口,它允许你通过代码(如VBA、C#、Python)几乎完全控制SolidWorks软件。你可以用它来遍历装配体结构、读取零件自定义属性、获取质量特性、甚至截图。这意味着我们能获取到生成文档所需的一切原始数据。
把它们俩结合起来,就等于给SolidWorks装上了一颗能理解设计意图、会组织语言的“智能芯”。我们不再需要手动编写死板的文档模板,模型数据变化,生成的文档内容也随之智能调整。
2. 环境准备与思路梳理
要实现自动化,我们需要搭建一个沟通的桥梁。整个流程可以分解为三个核心步骤:
- 数据提取层:使用SolidWorks API(这里我们用Python通过COM接口调用)打开目标装配体,遍历所有零件和子装配体,提取名称、数量、材料、自定义属性等关键信息,并整理成结构化的数据(比如JSON或字典)。
- 智能处理层:将上一步得到的数据,连同我们预设的“指令”(也叫提示词),一起发送给本地部署的通义千问模型。指令会告诉模型:“这是一份设计数据,请根据它生成一份设计说明/物料清单。”
- 输出与应用层:接收模型返回的文本结果,可以直接打印、保存为文本文件,或者更进一步,用Python自动写入Word/Excel模板,生成一份格式精美的正式文档。
整个系统的架构非常清晰,各司其职。接下来,我们一步步实现它。
2.1 基础环境搭建
你需要准备以下环境:
- SolidWorks:确保已安装,版本建议2018及以上,API接口更稳定。
- Python:推荐3.8或3.9版本。需要安装几个关键的库:
win32com:用于通过COM接口与SolidWorks通信。requests或httpx:如果通义千问模型通过HTTP API提供服务,则需要它们来发送请求。json:用于处理结构化数据。
- 通义千问模型服务:假设你已经通过
ollama、vLLM或类似框架,将通义千问1.5-1.8B-Chat-GPTQ-Int4模型部署在了本地(例如http://localhost:11434),并提供了兼容OpenAI或类似风格的API接口。
你可以通过以下命令安装必要的Python库:
pip install pywin32 requests
3. 实战:从SolidWorks提取设计数据
一切从数据开始。我们写一个Python脚本来充当“数据采集员”。
import win32com.client
import json
import os
def extract_sw_assembly_info(assembly_path):
"""
提取SolidWorks装配体信息
:param assembly_path: 装配体文件的完整路径
:return: 包含装配体信息的字典
"""
# 启动或连接到SolidWorks应用程序
sw_app = win32com.client.Dispatch("SldWorks.Application")
sw_app.Visible = True # 设置为True可见,调试用;批量处理可设为False
# 打开装配体文档
sw_model = sw_app.OpenDoc6(assembly_path, 2, 0, "", 0, 0) # 2代表装配体类型
if sw_model is None:
print(f"无法打开文件: {assembly_path}")
return None
# 获取装配体对象
sw_assy = sw_model.Extension
# 获取顶层装配体的特征管理器对象
sw_feat_mgr = sw_model.FeatureManager
assembly_info = {
"assembly_name": os.path.basename(assembly_path).replace('.SLDASM', ''),
"total_components": 0,
"components": []
}
# 递归函数,用于遍历装配体树
def traverse_component(comp, level=0, parent_id=None):
comp_name = comp.Name2
comp_type = comp.GetTypeName() # 如 “Part”, “Sub-assembly”
# 获取配置特定属性(这里获取当前激活配置的属性)
comp_model = comp.GetModelDoc()
if comp_model:
# 尝试获取自定义属性(需要先选择配置)
config_name = comp.ReferencedConfiguration
custom_props = {}
try:
# 注意:获取自定义属性需要正确的方法,这里是一个简化示例
# 实际应用中可能需要更复杂的逻辑来切换配置和读取属性
model_doc_ext = comp_model.Extension
# 这是一个更稳定的获取自定义属性方法示例(伪代码思路)
# 通常需要使用 `CustomPropertyManager` 对象
pass
except:
custom_props = {"error": "无法读取属性"}
# 获取物理属性(质量、体积等)- 需要重建模型以确保计算准确
try:
mass_props = comp_model.Extension.GetMassProperties2(0, False) # 0为当前配置
mass = mass_props.Mass if mass_props else 0
volume = mass_props.Volume if mass_props else 0
except:
mass = 0
volume = 0
else:
custom_props = {}
mass = 0
volume = 0
component_data = {
"id": f"{parent_id}_{comp_name}" if parent_id else comp_name,
"name": comp_name,
"type": comp_type,
"level": level,
"quantity": 1, # 注意:实际数量需要根据装配关系统计,这里简化
"custom_properties": custom_props,
"mass_kg": round(mass, 4),
"volume_m3": round(volume, 6)
}
assembly_info["components"].append(component_data)
assembly_info["total_components"] += 1
# 如果是子装配体,递归遍历其子组件
if comp_type == "Sub-assembly":
child_comp = comp.GetChildren() # 获取子组件
# 注意:GetChildren返回的是数组,需要遍历
# 此处为逻辑示意,实际遍历需要根据API返回值调整
# for child in child_comp:
# traverse_component(child, level+1, component_data[“id”])
# 获取顶层组件并开始遍历(简化版,仅获取直接子组件)
root_comp = sw_assy.GetRootComponent()
if root_comp:
children = root_comp.GetChildren()
# 实际开发中需要正确遍历children数组
# 这里我们用一个简化方法:获取所有零件
all_comps = sw_assy.GetComponents(True) # True表示获取所有
for i in range(all_comps.Count):
comp = all_comps[i]
traverse_component(comp)
# 关闭文档,不保存
sw_app.CloseDoc(assembly_info["assembly_name"] + ".SLDASM")
return assembly_info
# 使用示例
if __name__ == "__main__":
assy_path = r"C:\Your\SolidWorks\Assembly\Path\example.SLDASM"
data = extract_sw_assembly_info(assy_path)
if data:
# 将提取的数据保存为JSON文件,供下一步使用
with open('assembly_data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print(f"数据提取完成,共 {data['total_components']} 个组件。数据已保存至 assembly_data.json")
代码说明: 这个脚本是一个基础框架。它做了以下几件事:
- 连接到SolidWorks并打开指定装配体。
- 尝试遍历组件,获取名称、类型。
- 尝试获取质量和自定义属性(这部分在实际应用中需要根据SolidWorks API文档完善,特别是自定义属性的读取,通常需要使用
CustomPropertyManager)。 - 将收集到的信息整理成字典,并保存为JSON文件。
请注意:SolidWorks API非常庞大,上述代码主要展示流程。在实际项目中,你需要根据具体需求(如准确读取BOM数量、特定自定义属性)查阅SolidWorks API帮助文档,完善数据提取逻辑。提取出的assembly_data.json文件,就是我们要喂给通义千问模型的“食材”。
4. 核心:让通义千问理解并生成文档
现在,我们有了结构化的设计数据(JSON)。接下来,就是设计一个聪明的“提示词”(Prompt),让通义千问模型理解这些数据,并生成我们想要的文档。
我们假设通义千问模型服务运行在本地11434端口,并提供了兼容OpenAI的API。
import requests
import json
def generate_document_with_qwen(assembly_data, doc_type="design_description"):
"""
调用通义千问模型生成设计文档
:param assembly_data: 从SolidWorks提取的数据字典
:param doc_type: 文档类型,如 “design_description”, “bom_summary”, “process_note”
:return: 模型生成的文本
"""
# 根据文档类型,构造不同的系统指令(提示词)
prompt_templates = {
"design_description": """你是一名专业的机械设计工程师。请根据以下提供的SolidWorks装配体数据,生成一份简洁、专业的设计说明文档。
文档需包含:
1. 装配体概述(名称、主要功能)。
2. 主要组成部分介绍(列出关键零件/子装配体及其作用)。
3. 设计特点与注意事项。
请使用中文,语言流畅,条理清晰。
装配体数据如下:
{data}
""",
"bom_summary": """你是一名专业的物料管理员。请根据以下SolidWorks装配体数据,整理并生成一份清晰的物料清单(BOM)摘要。
摘要需包含:
1. 物料清单总览(零件总数、预估总质量/体积)。
2. 按类型(零件/装配体)分类的物料列表。
3. 关键物料(如质量最大、或特殊属性)的特别说明。
请使用中文,以表格的文本形式呈现(可用Markdown简易表格),确保数据准确。
装配体数据如下:
{data}
""",
"process_note": """你是一名经验丰富的制造工艺工程师。请根据以下零件设计数据,为其草拟一份初步的加工工艺说明。
说明需考虑:
1. 可能的毛坯选择(基于形状和材料推断)。
2. 建议的主要加工工序(如车、铣、钻、热处理等)。
3. 关键尺寸或特征的加工注意事项。
请使用中文,表述专业且具有可操作性。
零件数据如下:
{data}
"""
}
if doc_type not in prompt_templates:
return f"错误:不支持的文档类型 '{doc_type}'"
# 准备请求数据
prompt = prompt_templates[doc_type].format(data=json.dumps(assembly_data, indent=2, ensure_ascii=False))
# 假设模型API兼容OpenAI格式
api_url = "http://localhost:11434/v1/chat/completions" # 根据你的实际API地址修改
headers = {
"Content-Type": "application/json",
# 如果需要授权,请添加Authorization头
}
payload = {
"model": "qwen1.5-1.8b-chat", # 指定模型名称,根据你的部署调整
"messages": [
{"role": "system", "content": "你是一个专业的工程文档助手。"},
{"role": "user", "content": prompt}
],
"temperature": 0.2, # 较低的温度使输出更确定、专业
"max_tokens": 1500
}
try:
response = requests.post(api_url, headers=headers, json=payload, timeout=60)
response.raise_for_status()
result = response.json()
generated_text = result['choices'][0]['message']['content']
return generated_text
except requests.exceptions.RequestException as e:
return f"请求模型API时出错: {e}"
except KeyError as e:
return f"解析模型响应时出错: {e}"
# 使用示例
if __name__ == "__main__":
# 加载之前提取的数据
with open('assembly_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 生成设计说明
print("正在生成设计说明文档...")
design_doc = generate_document_with_qwen(data, "design_description")
print("生成的设计说明:\n", design_doc)
with open('设计说明.txt', 'w', encoding='utf-8') as f:
f.write(design_doc)
# 生成BOM摘要
print("\n正在生成BOM摘要...")
bom_doc = generate_document_with_qwen(data, "bom_summary")
print("生成的BOM摘要:\n", bom_doc)
with open('BOM摘要.txt', 'w', encoding='utf-8') as f:
f.write(bom_doc)
关键点解析:
- 提示词工程:我们为不同类型的文档(设计说明、BOM摘要、工艺说明)设计了不同的“系统指令”。这些指令明确了模型的角色、任务和输出格式要求。这是让模型生成高质量文档的关键。
- 数据格式化:我们将JSON数据直接作为用户输入的一部分。模型能够很好地理解这种结构化数据。
- API调用:我们使用标准的HTTP POST请求与模型服务通信。
temperature参数设置为较低值(0.2),是为了让生成的技术文档更加稳定和可靠,减少随机性。 - 输出处理:将生成的文本保存为文件,方便后续使用。
运行这段代码,你就能得到由AI初步撰写的设计文档了。你可以根据实际输出效果,反复调整提示词,比如要求它包含更多细节、使用特定的术语、或者调整文档的风格。
5. 效果展示与进阶思路
让我们看看一个简单的例子。假设我们有一个名为“手动压机”的小装配体,包含基座、立柱、压杆、螺杆等几个零件。运行上述流程后,我们可能会得到这样一份BOM摘要:
**手动压机装配体 - 物料清单(BOM)摘要**
**1. 总览**
* 零件总数:7个
* 主要类型:零件 (5个), 标准件 (2个,如螺栓)
* 预估总质量:~12.5 kg (基于各零件质量粗略合计)
**2. 物料分类列表**
| 序号 | 零件名称 | 类型 | 数量 | 预估质量 (kg) | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| 1 | 基座 | 零件 | 1 | 5.2 | 主要承重结构件,建议使用Q235钢板焊接 |
| 2 | 立柱 | 零件 | 2 | 3.1 (每个) | 导向支撑件,需保证直线度 |
| 3 | 压杆 | 零件 | 1 | 1.8 | 受力杆件,建议45#钢调质处理 |
| 4 | 螺杆 | 零件 | 1 | 0.8 | 关键传动件,需精加工螺纹 |
| 5 | 手柄 | 零件 | 1 | 0.5 | 操作件,表面可做防滑处理 |
| 6 | 六角头螺栓 M10x30 | 标准件 | 4 | - | 用于连接立柱与基座 |
| 7 | 平垫圈 10 | 标准件 | 4 | - | 与螺栓配套使用 |
**3. 关键物料说明**
* **基座**:质量最大,是装配体的基础,其加工平面度直接影响整体装配精度。
* **螺杆**:虽然质量小,但作为核心传动部件,其螺纹精度和强度至关重要,建议单独标注技术要求。
虽然这只是一个基于简单数据生成的示例,但已经具备了清晰的条理和实用的信息。模型能够根据零件名称(如“螺杆”)推断其功能(“关键传动件”),并给出初步的工艺建议(“需精加工螺纹”)。
5.1 如何做得更好?
这只是一个起点。要让这个系统真正强大起来,你还可以尝试以下进阶方向:
- 丰富数据源:除了基本属性,让API提取更多信息,如材料名称、表面处理要求(从自定义属性)、关键尺寸(通过遍历特征和尺寸注解)、甚至自动截图关键视图。数据越丰富,模型生成的文档就越精准。
- 优化提示词:你可以为不同公司、不同产品类型定制专属的提示词模板。例如,针对钣金设计,提示词可以要求模型重点描述折弯、焊接工艺;针对精密传动部件,则可以要求关注公差配合。
- 集成到SolidWorks内部:使用VBA或C#开发一个SolidWorks插件(Add-in)。这样,工程师只需在SolidWorks中点击一个按钮,就能自动运行数据提取、调用模型、生成文档并保存到指定位置,体验无缝衔接。
- 后处理与格式化:将AI生成的文本,通过Python的
python-docx或openpyxl库,自动填充到预先设计好的Word或Excel模板中,直接生成具有公司LOGO、标准格式的正式文档。 - 多轮对话与修订:实现一个简单交互界面。模型生成初稿后,工程师可以提出修改意见,如“将材料部分加粗”、“在注意事项里加上防锈要求”,模型能根据对话历史进行修改,实现协同编辑。
6. 写在最后
把通义千问这样的轻量级大模型和SolidWorks API结合起来,为我们打开了一扇门:让设计软件不仅会计算和绘图,还能理解和表达。它解决的不仅仅是“自动填表”的问题,更是尝试让AI理解设计意图,辅助完成知识性、描述性的工作。
实际用下来,你会发现对于结构清晰、数据完整的模型,这个流程已经能生成非常有价值的文档草稿,能节省大量重复性劳动的时间。当然,它目前还不能完全替代工程师的审核与润色,复杂模型的属性管理、提示词的精准调教都需要一些耐心。
但最重要的是,这个框架是灵活和可扩展的。你可以从生成最简单的BOM列表开始,逐步增加功能,比如自动生成质检要点、装配作业指导书摘要等等。它更像是一个强大的“文档助理”,把你从繁琐的格式和重复文字中解放出来,让你能更专注于设计本身。
如果你对三维设计感兴趣,又苦于文档工作,不妨就从今天这个教程开始,动手搭建属于你自己的自动化流水线。先从一个小装配体试起,看看AI能为你带来怎样的效率提升。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)