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 "? 拉伸失敗。"