python二次开发Solidworks:读取样条曲线数据

目录

1、草图段对象

2、VBA代码分析

3、python代码实现


样条曲线(spline curve)是数学术语,是一种特殊的参数曲线,由一组控制点通过曲线拟合的方式生成。样条一词源于船舶建造中的一种临时性辅助支架,后来被引入计算机图形学中,成为一种广泛应用于计算机图形学、数控编程、工程建模等领域的曲线拟合方法。根据所使用的控制点数量和类型不同,样条曲线可以分为三阶样条曲线、二阶样条曲线和插值样条曲线等。本例实现python读取Solidworks的part文档中的草图的样条曲线。

1、草图段对象

在Solidworks中,草图段(SketchSegment)对象代表草图中的各个部分,如直线、圆弧、样条曲线和文字等。这些都属于草图段的细分分类。例如,一个矩形草图可以由多个草图段构成,每一条线段都是草图段的一个实例。

草图段对象在Solidworks内部具有特定的名称,例如Line8。这些名称可用于选择和操作草图段。通过SelectByID2方法,可以使用草图段的名称选择特定草图段。

2、VBA代码分析

在API help帮助中找到以下以下代码,并跑通:

'----------------------------------------------------
' Preconditions:
' 1. Verify that the specified part template exists.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Creates a sketch containing two splines.
' 2. Gets each spline's dimension, order, periodicity,
'    control point, and knot point data.
' 3. Examine the Immediate window.
'-----------------------------------------------------
Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swSketchSegment As SldWorks.SketchSegment
Dim swFeature As SldWorks.Feature
Dim swSketch As SldWorks.Sketch
Dim swSplineParamData As SldWorks.SplineParamData
Dim swSketchMgr As SldWorks.SketchManager
Dim points(11) As Double
Dim pointArray As Variant
Dim varCtrlPoints As Variant
Dim varKnotPoints As Variant
Dim status As Boolean
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim splineCount As Long
Dim splinePointCount As Long
Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.NewDocument("C:\ProgramData\SolidWorks\SOLIDWORKS 2018\templates\gb_part.prtdot", 0, 0, 0)
    'Create a sketch with two splines
    'First spline
    points(0) = -0.185955019567672
    points(1) = 4.16208582005027E-02
    points(2) = 0
    points(3) = -8.62492383138544E-02
    points(4) = 4.03922105323034E-02
    points(5) = 0
    points(6) = -6.72740896322921E-02
    points(7) = 5.40598971292923E-02
    points(8) = 0
    points(9) = -1.41436733240425E-02
    points(10) = -5.70437188125084E-03
    points(11) = 0
    pointArray = points
    Set swSketchMgr = swModel.SketchManager
    Set swSketchSegment = swSketchMgr.CreateSpline((pointArray))
    swModel.ClearSelection2 True
    'Second spline
    points(0) = -8.38342193907238E-02
    points(1) = -3.80341664350112E-02
    points(2) = 0
    points(3) = -6.55490761158148E-02
    points(4) = -1.79490921124739E-02
    points(5) = 0
    points(6) = -1.79387030603664E-02
    points(7) = -6.81344637902441E-02
    points(8) = 0
    points(9) = 6.34819349185705E-02
    points(10) = -3.29692207162395E-02
    points(11) = 0
    pointArray = points
    Set swSketchSegment = swSketchMgr.CreateSpline((pointArray))
    swModel.ClearSelection2 True
    'Sketch
    swSketchMgr.InsertSketch (True)
    'Get each spline's dimension, order, periodicity, control point, and knot data
    status = swModel.Extension.SelectByID2("草图1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
    Set swSelMgr = swModel.SelectionManager
    Set swFeature = swSelMgr.GetSelectedObject6(1, -1)
    Set swSketch = swFeature.GetSpecificFeature2
    Debug.Print swFeature.Name
    Debug.Print ""
    splineCount = swSketch.GetSplineCount(splinePointCount)
    For i = 1 To splineCount
        Debug.Print "Spline " & i & ": "
        Set swSplineParamData = swSketch.GetSplineParams5(True, i - 1)
        Debug.Print "  Dimension: " & swSplineParamData.Dimension
        Debug.Print "  Order: " & swSplineParamData.Order
        Debug.Print "  Periodicity: " & swSplineParamData.Periodic
        Debug.Print "  Number of control points: " & swSplineParamData.ControlPointsCount
        status = swSplineParamData.GetControlPoints(varCtrlPoints)
        Debug.Print "  Control points:"
        For j = 0 To UBound(varCtrlPoints)
            Debug.Print "      " & varCtrlPoints(j)
        Next j
        Debug.Print "  Number of knots: " & swSplineParamData.KnotPointsCount
        status = swSplineParamData.GetKnotPoints(varKnotPoints)
        Debug.Print "    Knot points:"
        For k = 0 To UBound(varKnotPoints)
            Debug.Print "      " & varKnotPoints(k)
        Next k
    Next i
End Sub

草图1

Spline 1: 
  Dimension: 3
  Order: 4
  Periodicity: 0
  Number of control points: 6
  Control points:
      -0.185955019567672
      4.16208582005027E-02
      0
      -0.150380934953332
      3.10398728957725E-02
      0
      -0.10646390756121
      1.79774026593307E-02
      0
      -5.16578490138504E-02
      7.31450269896099E-02
      0
      -3.05079969277205E-02
      2.86910814467778E-02
      0
      -1.41436733240425E-02
      -5.70437188125084E-03
      0
  Number of knots: 10
    Knot points:
      0
      0
      0
      0
      0.491042198542287
      0.606202911975324
      1
      1
      1
      1
Spline 2: 
  Dimension: 3
  Order: 4
  Periodicity: 0
  Number of control points: 6
  Control points:
      -8.38342193907238E-02
      -3.80341664350112E-02
      0
      -0.077690281088829
      -2.89692122866611E-02
      0
      -5.58988151965229E-02
      3.18258179599927E-03
      0
      -1.75895532053729E-02
      -0.10684766264249
      0
      3.43192698312501E-02
      -5.95444361085419E-02
      0
      6.34819349185705E-02
      -3.29692207162395E-02
      0
  Number of knots: 10
    Knot points:
      0
      0
      0
      0
      0.146797917671912
      0.520666331402203
      1
      1
      1
      1
草图1

Spline 1: 
  Dimension: 3
  Order: 4
  Periodicity: 0
  Number of control points: 6
  Control points:
      -0.185955019567672
      4.16208582005027E-02
      0
      -0.150380934953332
      3.10398728957725E-02
      0
      -0.10646390756121
      1.79774026593307E-02
      0
      -5.16578490138504E-02
      7.31450269896099E-02
      0
      -3.05079969277205E-02
      2.86910814467778E-02
      0
      -1.41436733240425E-02
      -5.70437188125084E-03
      0
  Number of knots: 10
    Knot points:
      0
      0
      0
      0
      0.491042198542287
      0.606202911975324
      1
      1
      1
      1
Spline 2: 
  Dimension: 3
  Order: 4
  Periodicity: 0
  Number of control points: 6
  Control points:
      -8.38342193907238E-02
      -3.80341664350112E-02
      0
      -0.077690281088829
      -2.89692122866611E-02
      0
      -5.58988151965229E-02
      3.18258179599927E-03
      0
      -1.75895532053729E-02
      -0.10684766264249
      0
      3.43192698312501E-02
      -5.95444361085419E-02
      0
      6.34819349185705E-02
      -3.29692207162395E-02
      0
  Number of knots: 10
    Knot points:
      0
      0
      0
      0
      0.146797917671912
      0.520666331402203
      1
      1
      1
      1

注意:帮助文档提供的代码大概率有问题,主要出现在以下两个地方,

swApp.NewDocument打开的模板路径要正确

swModel.Extension.SelectByID2要正确选中草图1

3、python代码实现

import win32com.client as win32
import pythoncom
import numpy as np
def vtPoint(x, y, z):
    # 坐标点转化为浮点数
    return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))
def vtObj(obj):
    # 转化为对象数组
    return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)
def vtFloat(list):
    # 列表转化为浮点数
    return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, list)
def vtInt(list):
    # 列表转化为整数
    return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, list)
def vtVariant(list):
    # 列表转化为变体
    return win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, list)
swApp = win32.Dispatch('sldworks.application')
swApp.Visible = True
Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)
swModel = swApp.NewDocument(r"C:\ProgramData\SolidWorks\SOLIDWORKS 2018\templates\gb_part.prtdot", 0,0,0)
#Create a sketch with two splines
#First spline
points1=(-0.185955019567672,4.16208582005027E-02,0,-8.62492383138544E-02,4.03922105323034E-02,0,
        -6.72740896322921E-02,5.40598971292923E-02,0,-1.41436733240425E-02,-5.70437188125084E-03,0)
pointArray = vtFloat(points1)
swSketchMgr = swModel.SketchManager
swSketchMgr.CreateSpline2(pointArray,1)
swModel.ClearSelection2(True)
#Second spline
points2=(-8.38342193907238E-02,-3.80341664350112E-02,0,-6.55490761158148E-02,-1.79490921124739E-02,0,
         -1.79387030603664E-02,-6.81344637902441E-02,0,6.34819349185705E-02,-3.29692207162395E-02,0)
pointArray = vtFloat(points2)
swSketchMgr.CreateSpline2(pointArray,1)
swModel.ClearSelection2(True)
#Sketch
swSketchMgr.InsertSketch(True)
#Get each spline's dimension, order, periodicity, control point, and knot data
status = swModel.Extension.SelectByID2("草图1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
swSelMgr = swModel.SelectionManager
swFeature = swSelMgr.GetSelectedObject6(1, -1)
swSketch = swFeature.GetSpecificFeature2
print(swFeature.Name)
splinePointCount=win32.VARIANT(pythoncom.VT_BYREF|pythoncom.VT_I4, -1)
splineCount = swSketch.GetSplineCount(splinePointCount)
for i in range(1,splineCount+1):
    print("Spline ",splineCount,i)
    swSplineParamData = swSketch.GetSplineParams5(True, i - 1)
    print("  Dimension: ",swSplineParamData.Dimension)
    print("  Order: ",swSplineParamData.Order)
    print("  Periodicity: ",swSplineParamData.Periodic)
    print("  Number of control points: ",swSplineParamData.ControlPointsCount)
    varCtrlPoints = win32.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_VARIANT, -1)
    status = swSplineParamData.GetControlPoints(varCtrlPoints)
    CtrlPoints=np.array(varCtrlPoints.value).reshape(-1,3)
    print("  Control points:")
    for j in range(len(CtrlPoints)):
        print(CtrlPoints[0])
    print("  Number of knots: ",swSplineParamData.KnotPointsCount)
    varKnotPoints=win32.VARIANT(pythoncom.VT_BYREF|pythoncom.VT_VARIANT, -1)
    status = swSplineParamData.GetKnotPoints(varKnotPoints)
    KnotPoints = np.array(varKnotPoints.value).reshape(-1, 1)
    for j in range(len(KnotPoints)):
        print(KnotPoints[j])

草图1
Spline  2 1
  Dimension:  3
  Order:  4
  Periodicity:  0
  Number of control points:  6
  Control points:
[-0.18595502  0.04162086  0.        ]
[-0.18595502  0.04162086  0.        ]
[-0.18595502  0.04162086  0.        ]
[-0.18595502  0.04162086  0.        ]
[-0.18595502  0.04162086  0.        ]
[-0.18595502  0.04162086  0.        ]
  Number of knots:  10
[0.]
[0.]
[0.]
[0.]
[0.4910422]
[0.60620291]
[1.]
[1.]
[1.]
[1.]
Spline  2 2
  Dimension:  3
  Order:  4
  Periodicity:  0
  Number of control points:  6
  Control points:
[-0.08383422 -0.03803417  0.        ]
[-0.08383422 -0.03803417  0.        ]
[-0.08383422 -0.03803417  0.        ]
[-0.08383422 -0.03803417  0.        ]
[-0.08383422 -0.03803417  0.        ]
[-0.08383422 -0.03803417  0.        ]
  Number of knots:  10
[0.]
[0.]
[0.]
[0.]
[0.14679792]
[0.52066633]
[1.]
[1.]
[1.]
[1.]

这部分的难点在于:

样条曲线数据类型不匹配

status = swSplineParamData.GetControlPoints(varCtrlPoints)数据类型不匹配

status = swSplineParamData.GetKnotPoints(varKnotPoints)数据类型不匹配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/103943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介:在尝试使用了结果集的Demo循环后,进入到生产还是有一点问题的,以下是各个组件的分解解释、遇到的问题,以及解决问题的思路,最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔! 先来看张图~来自…

MOTHERNEST双十一我们的目标是:不愁货——有!不愁钱——折!

喜迎双十一,MOTHERNEST进入开抢模式,水飞蓟护肝片,牛初乳粉,液体钙维生素D3胶囊将进行抢购模式,每人限购4件。 开抢时间: 2023.10.31 20:00-2023.10.31 23:59 2023.11.03 20:00-2023.11.03 23:59 限量每…

目标检测的方法

目标检测大致分为两个方向:基于传统的目标检测算法和基于深度学习的目标检测算法。 1.基于传统的目标检测算法 在利用深度学习做物体检测之前,传统算法对于目标检测通常分为3个阶段:区域选取、特征提取和体征分类。 2.基于深度学习的目标检测…

win10安装spark

一、进入spark下载页面 连接 Downloads | Apache Spark 二、解压下载后的.tgz文件 直接解压即可 三、运行 运行bin目录下的 spark-shell.cmd 提示 Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.hom…

NSSCTF做题第9页(3)

[GKCTF 2020]CheckIN 代码审计 这段代码定义了一个名为ClassName的类,并在脚本的最后创建了一个ClassName类的实例。 在ClassName类的构造函数中,首先通过调用$this->x()方法获取了请求参数$_REQUEST中的值,并将其赋值给$this->code属性…

短视频矩阵系统软件源码

短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道,平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算,5个账户就是2500的流量,200个视频就是50W流量,如果从其他渠道获得50W流量是个很困难的事情。短视频…

kubeadm初始化的k8s集群证书续期—— 筑梦之路

脚本自动化方式 这个是一个开源的项目:https://gitee.com/ximy/update-kube-cert 该项目可以自动化更新k8s集群的证书,使用也很简单。 该脚本可将 kubeadm 生成的证书有效期更新为 10 年。 git clone https://github.com/yuyicai/update-kube-cert.g…

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大,本处记录一些实战中常用到复杂查询替换操作。 注意:如果是重要文件,替换操作前最好备份;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能,用正则表达式模式匹配。 查…

PyCharm改变代码背景图片的使用教程

一个好的集成环境是学习和使用一门编程语言的重中之重,这次我给大家分享如何改变PyCharm软件的代码背景图片。 说明:本教程使用的是汉化版PyCharm软件。 打开PyCharm软件。 点击软件最上方导航栏的文件,然后找到设置。 打开设置然后点击外观…

【离散数学必刷题】命题逻辑(第一章 左孝凌)刷完包过!

复习16题: 【1】下列哪个语句是真命题() A、今天天气真好! B、我正在说谎。 C、如果7 2 10 ,那么4 6 5。 D、如果7 2 9 , 则 4 6 5。 对于A,只有具有确定真值的陈述句才是命题&#xf…

酷开科技 | 酷开系统沉浸式大屏游戏更解压!

随着家庭娱乐需求日益旺盛,越来越多的家庭消费者和游戏玩家开始追求大屏游戏带来的沉浸感。玩家在玩游戏的时候用大屏能获得更广阔的视野和更出色的视觉包围感,因此用大屏玩游戏已经成为了一种潮流。用酷开系统玩大屏游戏,过瘾又刺激&#xf…

C语言每日一题(19)回文素数

牛客网 BC157 回文素数 题目描述 描述 现在给出一个素数,这个素数满足两点: 1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。 2、 位数从高到低为递减或递增,如2459,87631。 请你判断一下&am…

HCIP-MGRE实验

实验拓扑图 需求 1 R5为ISP ,只能进行IP地址配置;其所有地址均配为公有IP地址 2 R1和R5间使用PPP的PAP认证,R5为主认证方; R2于R5之间使用ppp的chap认证,R5为主认证方; R3于R5之间使用HDLC封装。 3 R1/R2/R3构建一个MGRE环境,R1为…

idea 基础设置

1、设置 IDEA 主题 2、自动导包和优化多余的包 3、同一个包下的类,超过指定个数的时候,导包合并为* 4、显示行号 , 方法和方法间的分隔符: 5、忽略大小写,进行提示 6、多个类不隐藏,多行显示 7、设置默认的…

城市正视图(Urban Elevations, ACM/ICPC World Finals 1992, UVa221)rust解法

如图5-4所示,有n(n≤100)个建筑物。左侧是俯视图(左上角为建筑物编号,右下角为高度),右侧是从南向北看的正视图。 输入每个建筑物左下角坐标(即x、y坐标的最小值)、宽度…

(完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类

文章目录 背景输入点直接输入邻接矩阵 背景 网上倒是有一些关于使用sklearn进行谱聚类的教程,但是这些教程的输入都是一些点的集合,然后根据谱聚类的原理,其会每两个点计算一次亲密度(可以认为两个点距离越大,亲密度越…

js双向绑定

题目来源: 双向绑定_牛客题霸_牛客网 (nowcoder.com) JS37 双向绑定 描述 请补全JavaScript代码,要求如下: 1. 监听对象属性的变化 2. 当"person"对象属性发生变化时,页面中与该属性相关的数据同步更新 3. 将输入框中…

ETL实现实时文件监听

一、实时文件监听的作用及应用场景 实时文件监听是一种监测指定目录下的文件变化的技术,当产生新文件或者文件被修改时,可实时提醒用户并进行相应处理。这种技术广泛应用于数据备份、日志管理、文件同步和版本控制等场景,它可以帮助用户及时…

Vue3踩坑指南

vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的,底层还是webpack,没有使用新的vite搭建。 踩坑1:vue.config.ts不起作用 我本着既然是vue3 ts的项目,那么为了规范,项目中所有的js文件都得替换成ts文…

牛客网刷题-(4)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…
最新文章