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

news2024/10/1 1:19:17

目录

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.coloradmin.cn/o/1129277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于卷的磁盘扫描算法设计

1、设计目的 常规情况下,当我们扫描计算机的硬盘时, 通常会使用诸如FindFirstFile/FindNextFile(Windows),或者opendir/readdir(Linux)遍历扫描的目录。 一般情形下,由于文件数量相对较少,文件夹层次低,扫…

Hafnium简介和构建

安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…

MSVCR100.dll丢失修复方法,MSVCR100.dll丢失的解决方法

今天我要和大家分享的是:msvcr100.dll丢失的6种解决方法。 首先,让我们来了解一下msvcr100.dll丢失的原因。msvcr100.dll是Microsoft Visual C 2010的一个组件,它包含了许多运行库文件,这些文件是许多应用程序所必需的。当msvcr1…

TouchGFX界面开发 | 图像控件应用示例

图像控件应用示例 TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前,必须将其导入到项目中。TouchGFX Designer内置了五种类型的图像部件: 固定图像:图像大小是由关联的图像文件定义的,不能在运行时改动。若要将…

物联网AI MicroPython传感器学习 之 GPS户外定位模块

学物联网,来万物简单IoT物联网!! 一、产品简介 HT2828Z3G5L是一款高性能的面向车载组合导航领域的定位G-MOUSE,系统包含同时支持北斗和GPS的高性能卫星接收机芯片。具备全方位功能,能满足专业定位的严格要求。体积小巧…

【数据结构】常见复杂度习题详解 ------ 习题篇

文章目录 📋前言一. ⛳️前篇回顾二. ⛳️常见时间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三4️⃣实例四5️⃣实例五6️⃣实例六7️⃣实例七8️⃣实例八 三. ⛳️常见空间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三 四. ⛳️总结 📋前言 …

GIS 数据结构整理:网格索引

1 一维网格索引 把整个数据库数值空间划分成n*n的正方形网格,建立另一个倒排文件——栅格索引每一个网格在栅格索引中有一个索引条目(记录),在这个记录中登记所有位于或穿过该网格的物体的关键字 1.1 变长指针法 在这个网格的物体,按照序号…

2023年系统设计面试如何破解?进入 FAANG 面试的实战指南

如果您正在准备编码面试,但想知道如何准备关键的系统设计主题,并寻找正确方法、技巧和问题的分步指导,那么您来对地方了。在本文中,我将分享 2023 年系统设计面试的完整指南。 在软件开发领域,如果您正在申请高级工程…

『Linux升级路』权限管理

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Linux中的用户 📒1.1Linux用户分类 📒1.2用户转换…

网络编程 day3

#include <head.h> #define SER_PORT 6678 //服务器端口号 #define SER_IP "192.168.115.64"//服务器IP地址 #define CLI_PORT 6666 //客户端端口号 #define CLI_IP "192.168.115.93" int main(int argc, const char *argv[]) {//1.创建套接字,用于连…

css-边框流水线

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, user-scalableno" /><title></title><style type&…

eNSP笔记③

密码模式 Telnet ①首先进入console口 [Huawei]user-interface console 0②设置模式为密码模式,回车后输入密码 [Huawei-ui-console0]authentication-mode password ③设置对应权限3 [Huawei-ui-console0]user privilege level 3用户级别允许使用的命令级别进入系统视图保存…

基于国产ARM+FPGA+AD的验证和生产测试自动化

TestStand是一款测试执行软件&#xff0c;可帮助工程师在验证和生产环节加速开发和部署系统。 验证和生产测试自动化 TestStand可借助自身功能特性&#xff0c;实现用户所有测试系统中整个测试过程的自动化、提速和标准化: 调用和执行使用LabVIEW、Python、C/C或.NET编写的测…

【API篇】八、Flink窗口函数

文章目录 1、增量聚合之ReduceFunction2、增量聚合之AggregateFunction3、全窗口函数full window functions4、增量聚合函数搭配全窗口函数5、会话窗口动态获取间隔值6、触发器和移除器7、补充 //窗口操作 stream.keyBy(<key selector>).window(<window assigner>)…

【31】c++设计模式——>模板方法模式

模板方法模式通常由以下几个部分组成&#xff1a; 1.抽象基类&#xff08;Abstract Base Class&#xff09;&#xff1a;抽象基类定义了一个算法的骨架&#xff0c;其中包含了模板方法和一些基本操作方法。模板方法在抽象基类中被声明为虚函数&#xff0c;它定义了算法的流程&…

html网页多个div鼠标移动自动排列实例

程序示例精选 html网页多个div鼠标移动自动排列实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《html网页多个div鼠标移动自动排列实例》编写代码&#xff0c;代码整洁&#xff0c;规则…

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

土地利用/覆被变化是自然客观条件和人类社会经济活动综合作用的结果&#xff0c;其形成与演变过程在受到地理自然因素制约的同时&#xff0c;也越来越多的受到人类改造利用行为的影响。伴随城市化进展&#xff0c;土地供需矛盾日益凸显&#xff0c;土地利用已经成为城市发展的重…

[moeCTF 2023] crypto

这个比赛从8月到10月&#xff0c;漫长又不分段。结束了以后前边的都基本上忘光了。还是分段提交的好点&#xff0c;有机会写写。不过反正也是新生赛&#xff0c;又不是新生只是打个热闹。 ezrot 厨子解决大部分问题 可可的新围墙 给了1个串 mt3_hsTal3yGnM_p3jocfFn3cp3_hFs…

[c语言]深入返回值为函数指针的函数

之前写过个好玩代码 c语言返回值为函数指针的函数 一、发现 #include<stdio.h>int (*drink(void)) (void) {static int i;i;printf("(%d)\n", i);return (int(*)(void))drink; }int main() {drink()();return 0; }这个代码定义了一个返回值为函数指针的函数&…

Python基础入门例程11-NP11 单词的长度

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解答&#xff1a; 说明&#xff1a; 描述 牛妹正在学英语&#xff0c;但是背单词实在是太痛苦了&#xff0c;她想让你帮她写一个小程序&#xff0c;能够根据输入的单词&#xff0c;快速得到单词的长度。 输…