deepseek接入solidowrks画立方体

用eval方法链接llm和solidworks pythonwin32接口

离好的效果还差一个有脑子会生成复杂命令序列的ai

参考

基于Python的Solidworks二次开发方法_selectbyray-CSDN博客

Welcome - 2025 - SOLIDWORKS API Help

仓库

llm_sw: llm链接solidworks


python -m win32com.client.makepy


import os
import http
import asyncio
import json
from dotenv import load_dotenv
from sw_server import get_sw_app,get_solidworks_instance,createbox
load_dotenv()
from urllib.parse import urlparse


# 配置日志

deepseek_model_name=os.environ.get("deepseek_MODEL_NAME", None)
deepseek_api_key=os.environ.get("deepseek_OPENAI_API_KEY", None)
deepseek_api_url=os.environ.get("deepseek_OPENAI_API_URL", None)
zhipu_model_name=os.environ.get("zhipu_MODEL_NAME", None)
zhipu_api_key=os.environ.get("zhipu_OPENAI_API_KEY", None)
zhipu_api_url=os.environ.get("zhipu_OPENAI_API_URL", None)
class Client:
    def __init__(self, api_url, api_key, model_name):
        self.api_key = api_key
        self.api_url = api_url
        self.model_name = model_name

    def create(self, messages, tools=None) -> tuple[str, list]:
        # 解析 URL(去掉协议部分)
        
        parsed=urlparse(f"{self.api_url}/chat/completions")
        host, path =parsed.hostname,parsed.path
        # 创建 HTTP 连接
        conn = http.client.HTTPSConnection(host)

        # 构造请求体
        request_body = {
            "model": self.model_name,
            "messages": messages,
            "tools": tools,
            "temperature": 0.9  # 添加温度参数
        }

        # 发送 POST 请求
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {self.api_key}"
        }
        conn.request(
            "POST",
            path,
            body=json.dumps(request_body),
            headers=headers
        )

        # 获取响应
        response = conn.getresponse()
        if response.status != 200:
            raise Exception(f"LLM服务器错误: {response.status} - {response.read().decode('utf-8')}")

        # 读取响应内容
        response_data = response.read().decode('utf-8')
        data = json.loads(response_data)

        # 将响应保存到文件
        with open('formatted_data.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=4, ensure_ascii=False)

        # 关闭连接
        conn.close()

        return data


def tool_call(user_say):
        '''
        
        image_promt={
                "role": "user",
                "content": [
                    {"type": "text", 
                    "text": "帮我............."},
                    {"type": "image_url", 
                                    "image_url": {
                        "url": f"data:image/jpeg;base64,{base64_image}"
                    }},
                ]
            }
        
        '''
        tools = [{
            "type": "function",
            "function": {
                "name": "execute",
                "description": "use freecad's function",
                "parameters": {
                "type": "object",
                "properties": {
                    "function": {
                        "type": "string",
                        "description": """
*返回单条纯函数代码,不要有注释*
**************************单条纯函数代码*********************************     

函数代码:createbox()
描述:此方法可选输入长宽高信息
例子:createbox(10,10,50)



                        """},
               
                },
           
            }}}
        ]
        history_content = '\n'.join(history)
        user_promt={
                "role": "user",
                "content":  f"{user_say}\n*这是历史消息*:{history_content}" 
            }
        
        
       
        

        data= deepseek_client.create([user_promt],tools)
        tool_calls=data["choices"][0]["message"]["tool_calls"]
        assistent_message=data["choices"][0]["message"]
        arguments=tool_calls[0]["function"]["arguments"]
        commands=json.loads(arguments)["function"]
        print("ai调用命令:\n"+commands)
         # 使用 eval 处理有返回值的函数,exec 处理无返回值的语句
        objects_information= eval(commands)  
      
        tool_promt={
                "role": "tool",
                "content":objects_information or "没有返回信息",
                "tool_call_id":tool_calls[0]["id"]
            }
        system_promt={
                "role": "system",
                "content":"用中文回答谢谢",
            }
        data= deepseek_client.create([system_promt,assistent_message,tool_promt])
        assitant_response=data["choices"][0]["message"].get("content", "")
        print("assitant:"+assitant_response)
        history.append(assitant_response)

'''
import base64
def get_imageToBase64()->str:
    imagePath=os.path.join(os.path.expanduser('~'), '图片', 'screenshot.jpg')
# 获取屏幕的宽度和高度
    screen_width, screen_height = pyautogui.size()
    screenshot = pyautogui.screenshot(region=(60, 300, screen_width//2, screen_height-500))
    screenshot.save(imagePath)
    # 读取图片并转换为 Base64
    with open(imagePath, "rb") as image_file:
        base64_image = base64.b64encode(image_file.read()).decode("utf-8")
        return base64_image

'''

async def main():

    global history,zhipu_client,deepseek_client
    zhipu_client = Client(zhipu_api_url,zhipu_api_key,zhipu_model_name )
    deepseek_client = Client(deepseek_api_url,deepseek_api_key ,deepseek_model_name)
    history=[]
    #user_say="画一个立方体"
    while True:
        user_say=input("你:")
        tool_call(user_say)  
    


             
async def main2():      
    commands="""
createbox(10,10,50)

""" 
    exec(commands) 
      
 
      
if __name__ == "__main__":
     asyncio.run(main())
import win32com.client
import pythoncom
arg_Nothing = win32com.client.VARIANT(pythoncom.VT_DISPATCH, None) 
def get_solidworks_instance():
    """
    尝试连接到一个已经运行的SolidWorks实例,
    如果没有找到,则启动一个新的实例。
    """
    try:
        # 尝试连接到现有的SolidWorks应用程序
        swApp = win32com.client.Dispatch("SldWorks.Application")
    except pythoncom.com_error:
        print("未找到正在运行的SolidWorks实例,正在启动新实例...")
        # 如果没有找到,则创建一个新的实例
        swApp = win32com.client.gencache.EnsureDispatch("SldWorks.Application")
    return swApp

# 获取SolidWorks应用程序对象
swApp = get_solidworks_instance()

# 激活SolidWorks窗口(可选)
swApp.Visible = True

# 检查是否有已打开的文档,如果没有,则创建新零件文档
if swApp.ActiveDoc is None:
    # 路径需要根据你的SolidWorks安装版本和模板位置调整
    part = swApp.NewDocument(r"C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2025\templates", 0, 0, 0)
else:
    print("已有文档处于打开状态,使用现有文档进行操作或关闭当前文档后重试。")

# 接下来的代码可以继续按照之前的逻辑来创建立方体...
swModel = swApp.ActiveDoc
# 创建草图并绘制矩形
import win32com.client
import pythoncom

def get_sw_app():
    """获取或启动 SolidWorks 实例"""
    try:
        swApp = win32com.client.GetActiveObject("SldWorks.Application")
        print("连接到已运行的 SolidWorks。")
    except:
        print("未检测到 SolidWorks,正在启动...")
        swApp = win32com.client.Dispatch("SldWorks.Application")
    swApp.Visible = True
    return swApp

def get_swmodel():
    # 获取 SolidWorks 实例
    swApp = get_sw_app()

    # 创建新零件(如果无活动文档)
    if swApp.ActiveDoc is None:
        # 使用默认零件模板(路径可能因版本而异)
        # 建议使用空模板或确保路径正确
         # 获取默认零件模板
        swModel = swApp.NewDocument(r"C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2025\templates\gb_part.prtdot", 0, 0, 0)
    else:
        swModel = swApp.ActiveDoc

    # 强制类型转换为 PartDoc
    swPart = swModel
    return swPart, swModel


swPart, swModel =get_swmodel()
def createbox(l=22,w=33,h=44):
    swPart, swModel =get_swmodel()
    l=l/1000
    w=w/1000
    h=h/1000
    # 选择基准面(英文版用 "Front Plane",中文版用 "前视基准面")
    # plane_name = "Front Plane"  # 英文版
    plane_name = "前视基准面"  # 中文版

    status = swModel.Extension.SelectByID2(
        plane_name, "PLANE",
        0, 0, 0,      # 坐标
        False,        # 不追加
        0,            # Mark
        arg_Nothing,         # Callout
        0             # Position
    )

    if not status:
        print("❌ 选择基准面失败!")
    else:
        print("✅ 成功选中基准面")

    # 进入草图
    sketchMgr = swModel.SketchManager
    sketchMgr.InsertSketch(True)

    # ✅ 使用 SketchRectangle 画矩形
    swModel.SketchRectangle(0, 0, 0, l, w, 0, 0) # 前两个参数为起始点坐标,中间两个为终点坐标x,y,z增量

    # 退出草图
    sketchMgr.InsertSketch(True)

    # 拉伸成 50mm 立方体
    featMgr = swModel.FeatureManager
    feature = featMgr.FeatureExtrusion2(
        True,           # Sd: 使用草图
        False,          # Flip: 不反向
        False,          # Dir: 不双向
        0,              # T1: 给定深度
        0,              # T2: 第二方向条件
        h,           # D1: 深度 50mm
        0.0,            # D2: 第二深度
        False,          # Dchk1: 不完全贯穿
        False,          # Dchk2: 不完全贯穿
        False,          # Ddir1: 不反向
        False,          # Ddir2: 不反向
        0.0,            # Dang1: 无拔模
        0.0,            # Dang2: 无拔模
        False,          # OffsetReverse1
        False,          # OffsetReverse2
        False,          # TranslateSurface1
        False,          # TranslateSurface2
        False,          # Merge: 新实体(非合并)
        False,          # UseFeatScope
        True,           # UseAutoSelect
        0,              # T0: 起始条件 = 从零开始
        0.0,            # StartOffset
        False           # FlipStartOffset
    )
    if feature is not None:
        print("🎉 立方体创建成功!")
        return "🎉 立方体创建成功!"
    else:
        print("❌ 拉伸失败。")
        return "❌ 拉伸失败。"

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐