llm操控solidworks 画立方体 deepseek
用eval方法链接llm和solidworks pythonwin32接口。deepseek接入solidowrks画立方体。
·
deepseek接入solidowrks画立方体
用eval方法链接llm和solidworks pythonwin32接口

离好的效果还差一个有脑子会生成复杂命令序列的ai
参考
基于Python的Solidworks二次开发方法_selectbyray-CSDN博客
Welcome - 2025 - SOLIDWORKS API Help
仓库
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 "❌ 拉伸失败。"
更多推荐



所有评论(0)