通义千问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. 环境准备与思路梳理

要实现自动化,我们需要搭建一个沟通的桥梁。整个流程可以分解为三个核心步骤:

  1. 数据提取层:使用SolidWorks API(这里我们用Python通过COM接口调用)打开目标装配体,遍历所有零件和子装配体,提取名称、数量、材料、自定义属性等关键信息,并整理成结构化的数据(比如JSON或字典)。
  2. 智能处理层:将上一步得到的数据,连同我们预设的“指令”(也叫提示词),一起发送给本地部署的通义千问模型。指令会告诉模型:“这是一份设计数据,请根据它生成一份设计说明/物料清单。”
  3. 输出与应用层:接收模型返回的文本结果,可以直接打印、保存为文本文件,或者更进一步,用Python自动写入Word/Excel模板,生成一份格式精美的正式文档。

整个系统的架构非常清晰,各司其职。接下来,我们一步步实现它。

2.1 基础环境搭建

你需要准备以下环境:

  • SolidWorks:确保已安装,版本建议2018及以上,API接口更稳定。
  • Python:推荐3.8或3.9版本。需要安装几个关键的库:
    • win32com:用于通过COM接口与SolidWorks通信。
    • requestshttpx:如果通义千问模型通过HTTP API提供服务,则需要它们来发送请求。
    • json:用于处理结构化数据。
  • 通义千问模型服务:假设你已经通过ollamavLLM或类似框架,将通义千问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")

代码说明: 这个脚本是一个基础框架。它做了以下几件事:

  1. 连接到SolidWorks并打开指定装配体。
  2. 尝试遍历组件,获取名称、类型。
  3. 尝试获取质量和自定义属性(这部分在实际应用中需要根据SolidWorks API文档完善,特别是自定义属性的读取,通常需要使用 CustomPropertyManager)。
  4. 将收集到的信息整理成字典,并保存为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)

关键点解析

  1. 提示词工程:我们为不同类型的文档(设计说明、BOM摘要、工艺说明)设计了不同的“系统指令”。这些指令明确了模型的角色、任务和输出格式要求。这是让模型生成高质量文档的关键。
  2. 数据格式化:我们将JSON数据直接作为用户输入的一部分。模型能够很好地理解这种结构化数据。
  3. API调用:我们使用标准的HTTP POST请求与模型服务通信。temperature参数设置为较低值(0.2),是为了让生成的技术文档更加稳定和可靠,减少随机性。
  4. 输出处理:将生成的文本保存为文件,方便后续使用。

运行这段代码,你就能得到由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-docxopenpyxl 库,自动填充到预先设计好的Word或Excel模板中,直接生成具有公司LOGO、标准格式的正式文档。
  • 多轮对话与修订:实现一个简单交互界面。模型生成初稿后,工程师可以提出修改意见,如“将材料部分加粗”、“在注意事项里加上防锈要求”,模型能根据对话历史进行修改,实现协同编辑。

6. 写在最后

把通义千问这样的轻量级大模型和SolidWorks API结合起来,为我们打开了一扇门:让设计软件不仅会计算和绘图,还能理解和表达。它解决的不仅仅是“自动填表”的问题,更是尝试让AI理解设计意图,辅助完成知识性、描述性的工作。

实际用下来,你会发现对于结构清晰、数据完整的模型,这个流程已经能生成非常有价值的文档草稿,能节省大量重复性劳动的时间。当然,它目前还不能完全替代工程师的审核与润色,复杂模型的属性管理、提示词的精准调教都需要一些耐心。

但最重要的是,这个框架是灵活和可扩展的。你可以从生成最简单的BOM列表开始,逐步增加功能,比如自动生成质检要点、装配作业指导书摘要等等。它更像是一个强大的“文档助理”,把你从繁琐的格式和重复文字中解放出来,让你能更专注于设计本身。

如果你对三维设计感兴趣,又苦于文档工作,不妨就从今天这个教程开始,动手搭建属于你自己的自动化流水线。先从一个小装配体试起,看看AI能为你带来怎样的效率提升。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐