m0_67985836 2025-05-05 20:57 采纳率: 75%
浏览 21
已结题

使用python调用solidworks样条曲线无法调用


import win32com.client
import pythoncom
import math

pythoncom.CoInitialize()
fileerror=win32com.client.VARIANT(pythoncom.VT_BYREF|pythoncom.VT_I4, -1)
filewarning=win32com.client.VARIANT(pythoncom.VT_BYREF|pythoncom.VT_I4, -1)
try:
    swApp = win32com.client.DispatchEx("SldWorks.Application.32")
    swApp.Visible = True

    # 创建新零件(默认模板,零件,毫米)
    Part = swApp.OpenDoc6(r"E:\desktop\动力活塞板弹簧-1.5mm.SLDPRT", 1, 0, "",fileerror,filewarning)
    if Part:
        print("新零件创建成功!")
    else:
        print("创建零件失败!")

except Exception as e:
    print("发生错误:", e)
if Part is None:
        print("错误:NewDocument() 返回 None,无法创建零件!")
elif not hasattr(Part, "Extension"):
        print("错误:part 对象没有 Extension 属性,可能不是有效的 SolidWorks 文档!")
arg_Nothing = win32com.client.VARIANT(pythoncom.VT_DISPATCH,None)
boolstatus = Part.Extension.SelectByID2("草图4", "SKETCH", 0, 0, 0, False, 0, arg_Nothing, 0)
Part.EditSketch()
boolstatus = Part.Extension.SelectByID2("Spline14", "SKETCHSEGMENT", 2.03858265783315E-02, 1.50000000002137E-03, -1.70881193377191E-02, False, 0, arg_Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Spline14", "SKETCHSEGMENT", 2.03858265783315E-02, 1.50000000002137E-03, -1.70881193377191E-02, False, 0, arg_Nothing, 0)
equationCurve = Part.SelectionManager.GetSelectedObject5(1)
boolstatus = equationCurve.SetEquationParameters2("3.1*(t*sin(t)+cos(t))", "3.1*(sin(t)-t*cos(t))", "", 2*math.pi, 3.8*math.pi, False, 0, 8.66025403784451E-04, -4.9999999999998E-04, True, True)
boolstatus = Part.Extension.SelectByID2("Spline14", "SKETCHSEGMENT", 2.03858265783315E-02, 1.50000000002137E-03, -1.70881193377191E-02, False, 0, arg_Nothing, 0)
equationCurve = Part.SelectionManager.GetSelectedObject5(1)
Part.ClearSelection2(True)
Part.SketchManager.InsertSketch(True)
boolstatus = Part.Extension.SelectByID2("草图21", "SKETCH", 0, 0, 0, False, 0, arg_Nothing, 0)
Part.EditSketch()
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Spline16", "SKETCHSEGMENT", -1.5823001555185E-03, 1.50000000002137E-03, -1.97693644219254E-02, False, 0, arg_Nothing, 0)
Part.EditDelete()
points=[-7.44310896393234E-04,2.13268833544406E-02, 0,2.22572936087786E-04,2.09892125961998E-02, 0,1.39881487144148E-03,1.98538834238149E-02, 0 ,1.49086858812133E-03, 1.84730776736171E-02,0,
        8.72488077370869E-04,1.79923527087334E-02,0,-4.62715843640031E-04,1.85242186273281E-02,0,-2.63505273955162E-03,1.99605373315806E-02,0,-3.74571757248018E-03,2.03923626637228E-02,0,
        -5.65274940202689E-03,2.07692967675423E-02,0,-8.06104399133102E-03,2.07692967675423E-02,0,-9.00118038180804E-03,2.07692967675423E-02,0,-8.06104399133102E-03,2.07692967675423E-02,0,
        -9.00118038180804E-03,2.07692967675423E-02,0,-1.03800720714473E-02, 2.06038266007717E-02,0]
pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, points)
pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, points)
swSketchMgr = Part.SketchManager
swSketchMgr.CreateSpline2(pointArray,1)
if swSketchMgr.CreateSpline2(pointArray,1):
    print(1)
Part.GraphicsRedraw2()
Part.ClearSelection2(True)

参考了https://blog.csdn.net/T20151470/article/details/133962095画样条曲线。
倒数第五行中的swSketchMgr.CreateSpline2(pointArray,1)无法运行,但是程序不报错,样条曲线画不出来,通过IF语句检测这句程序,发现没有运行,

img

  • 写回答

5条回答 默认 最新

  • 观熵 优质创作者: 人工智能技术领域 2025-05-05 21:44
    关注

    你的 SolidWorks Python 脚本中调用 swSketchMgr.CreateSpline2(pointArray, 1) 不报错但未生效,常见问题可能有以下几种(重点在样条点数据格式、草图状态、COM 对象有效性):


    重点排查建议

    1. 草图是否处于编辑状态?

    在调用 CreateSpline2 前,必须保证草图处于“编辑模式”下。否则命令不会有实际效果。

    确认点:

    Part.EditSketch()  # 必须成功激活当前草图
    

    建议显式插入一个新草图并进入编辑模式再绘制:

    Part.SketchManager.InsertSketch(True)  # 启动草图
    

    2. Spline 点格式问题

    CreateSpline2 要求是 VT_ARRAY | VT_R8 类型的浮点数列表,不能混用 VT_VARIANT

    你当前写法:

    pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, points)
    

    这个是对的,但你后面又覆盖成了:

    pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, points)
    

    建议修正为:

    pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, points)
    

    不要加 VT_VARIANT。


    3. 点数必须 > 2,且维度为 3 的倍数

    你提供的点列表长度必须是 3*n 的形式,例如 3个点 = 9个数(三维坐标)
    且至少需要 3 个控制点才能形成 Spline。

    当前你数据为:

    [-7.44310, 2.13268, 0, ... , 2.06038, 0] # 共 21 个点 * 3 = 63 个浮点数 ✔
    

    长度合理,确保这些点的单位和模型一致(单位差异可能导致线不可见)


    4. 建议完整调用流程

    # 插入新草图并激活
    Part.SketchManager.InsertSketch(True)
    Part.ClearSelection2(True)
    
    # 构造 Spline 点(保持 R8 类型)
    pointArray = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, points)
    
    # 创建样条曲线
    status = swSketchMgr.CreateSpline2(pointArray, 1)
    if status:
        print("Spline 创建成功")
    else:
        print("Spline 创建失败")
    

    5. 调试建议

    在关键调用前后加入:

    print("插入草图中")
    print("样条数据点个数:", len(points)//3)
    print("正在创建样条曲线...")
    

    ✅ 总结改动建议:

    • 保证草图在编辑状态;
    • CreateSpline2 只使用 VT_ARRAY | VT_R8
    • 保证 points 是浮点数、三维成组、数量充足;
    • 每次调用前清理选择 ClearSelection2(True)
    • 可加入 GraphicsRedraw2() 强制刷新。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月5日