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_keyself.api_url = api_urlself.model_name = model_namedef 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 datadef 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)# 读取图片并转换为 Base64with 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_clientzhipu_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 pythoncomdef get_sw_app():"""获取或启动 SolidWorks 实例"""try:swApp = win32com.client.GetActiveObject("SldWorks.Application")print("连接到已运行的 SolidWorks。")except:print("未检测到 SolidWorks,正在启动...")swApp = win32com.client.Dispatch("SldWorks.Application")swApp.Visible = Truereturn swAppdef 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# 强制类型转换为 PartDocswPart = swModelreturn swPart, swModelswPart, swModel =get_swmodel()
def createbox(l=22,w=33,h=44):swPart, swModel =get_swmodel()l=l/1000w=w/1000h=h/1000# 选择基准面(英文版用 "Front Plane",中文版用 "前视基准面")# plane_name = "Front Plane" # 英文版plane_name = "前视基准面" # 中文版status = swModel.Extension.SelectByID2(plane_name, "PLANE",0, 0, 0, # 坐标False, # 不追加0, # Markarg_Nothing, # Callout0 # Position)if not status:print("❌ 选择基准面失败!")else:print("✅ 成功选中基准面")# 进入草图sketchMgr = swModel.SketchManagersketchMgr.InsertSketch(True)# ✅ 使用 SketchRectangle 画矩形swModel.SketchRectangle(0, 0, 0, l, w, 0, 0) # 前两个参数为起始点坐标,中间两个为终点坐标x,y,z增量# 退出草图sketchMgr.InsertSketch(True)# 拉伸成 50mm 立方体featMgr = swModel.FeatureManagerfeature = featMgr.FeatureExtrusion2(True, # Sd: 使用草图False, # Flip: 不反向False, # Dir: 不双向0, # T1: 给定深度0, # T2: 第二方向条件h, # D1: 深度 50mm0.0, # D2: 第二深度False, # Dchk1: 不完全贯穿False, # Dchk2: 不完全贯穿False, # Ddir1: 不反向False, # Ddir2: 不反向0.0, # Dang1: 无拔模0.0, # Dang2: 无拔模False, # OffsetReverse1False, # OffsetReverse2False, # TranslateSurface1False, # TranslateSurface2False, # Merge: 新实体(非合并)False, # UseFeatScopeTrue, # UseAutoSelect0, # T0: 起始条件 = 从零开始0.0, # StartOffsetFalse # FlipStartOffset)if feature is not None:print("🎉 立方体创建成功!")return "🎉 立方体创建成功!"else:print("❌ 拉伸失败。")return "❌ 拉伸失败。"