python二次开发Solidworks:画砂轮

2023-10-19 13:15

本文主要是介绍python二次开发Solidworks:画砂轮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先根据输入参数计算出绘制砂轮需要的数据,然后绘制草图,完全标注后生成旋转体,具体代码如下:

import sympy as sy
import numpy as np
import matplotlib.pyplot as plt
'''
x1,y1为第一条直线端点坐标(-10,0),theta_l1为角度,取5*np.pi/3
l1为第一条直线的长度,取值2
x2,y2为第二条直线端点坐标(10,0),theta_l2为角度,取4*np.pi/3
x3,y3为第二条直线端点坐标,由其参数方程确定
l2为第二条直线的长度,取值3
r1为第一条圆弧的半径,取值3
r2为第二条圆弧的半径,待求解
l为直线方程的参数
x,y为未知数
d为
theta为圆方程的参数
'''
#输入参数
Line1_p1=[-10,0]
Line1_angle=5*np.pi/3
Line1_length=5
Line2_p1=[10,0]
Line2_angle=4*np.pi/3
Line2_length=3
Arc1_r=8
Arc1_angle=np.pi/6
#定义符号变量
x1,y1,x2,y2,l1,l2,theta_l1,theta_l2=sy.symbols('x1,y1,x2,y2,l1,l2,theta_l1,theta_l2')
r1,theta_arc1_start,theta_arc1_end,xr1_center,yr1_center=sy.symbols('r1,theta_arc1_start,theta_arc1_end,xr1_center,yr1_center')
r2,theta_arc2,theta_arc2_start=sy.symbols('r2,theta_arc2,theta_arc2_start')
l,theta,x,y,d,da=sy.symbols('l,theta,x,y,d,da')
#points存储重要的点坐标
points=[]
#存直线1的起点坐标,第1点
points.append(Line1_p1)
#存直线2的起点坐标,第2点
points.append(Line2_p1)
​
#第一条直线的参数方程,x1=Line1_p1[0],y1=Line1_p1[1],theta_l1=Line1_angle,l为参数
xl1=x1+l*sy.cos(theta_l1)
yl1=y1+l*sy.sin(theta_l1)
​
​
fig=plt.figure(figsize=(5,5))
plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
#生成直线1的横坐标,l1=Line1_length
a=np.arange(0, Line1_length, 0.01)
#计算直线1数据点并绘图
h0L1=xl1.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle)])
h1L1=yl1.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle)])
data_l1_x=[]
data_l1_y=[]
for i in a:data_l1_x.append(h0L1.subs([(l,i)]))data_l1_y.append(h1L1.subs([(l,i)]))
plt.plot(data_l1_x,data_l1_y,c='blue')
​
#存直线1的终点坐标,也就是圆弧1的起点坐标,第3点
points.append([data_l1_x[-1],data_l1_y[-1]])
​
#圆弧1初始角度
theta_arc1_start=theta_l1-np.pi/2
start=theta_arc1_start.subs([(theta_l1,Line1_angle)])
#圆弧1终止角度,圆心角取np.pi/3
theta_arc1_end=theta_arc1_start+theta
end=theta_arc1_end.subs([(theta_arc1_start,start),(theta,Arc1_angle)])
#圆弧1的圆心,r1=3,l1=2
xr1_center=x1+l1*sy.cos(theta_l1)+r1*sy.cos(theta_l1+np.pi/2)
yr1_center=y1+l1*sy.sin(theta_l1)+r1*sy.sin(theta_l1+np.pi/2)
​
#存圆弧1的圆心点坐标,第4点
o1x=xr1_center.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle),(l1,Line1_length),(r1,Arc1_r)])
o1y=yr1_center.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle),(l1,Line1_length),(r1,Arc1_r)])
points.append([o1x,o1y])
​
#第一条圆弧上任意一点的坐标
xr1=xr1_center+r1*sy.cos(theta)
yr1=yr1_center+r1*sy.sin(theta)
​
​
#计算圆弧1坐标并作图
b=np.arange(start,end, 0.01)
h0R1=xr1.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle),(r1,3),(l1,Line1_length)])
h1R1=yr1.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle),(r1,3),(l1,Line1_length)])
data_r1_x=[]
data_r1_y=[]
for i in b:data_r1_x.append(h0R1.subs([(theta, i)]))data_r1_y.append(h1R1.subs([(theta, i)]))
plt.plot(data_r1_x,data_r1_y,c='red')
​
​
#存圆弧1终止点,,第5点
points.append([data_r1_x[-1],data_r1_y[-1]])
​
​
​
#第二条直线的参数方程,x2=10,y2=0,theta_l2=4*np.pi/3,l为参数
xl2=x2+l*sy.cos(theta_l2)
yl2=y2+l*sy.sin(theta_l2)
#生成直线1的横坐标,l2=3
d=np.arange(0, 3, 0.01)
#计算直线2数据点并绘图
h0L2=xl2.subs([(x2,Line2_p1[0]),(theta_l2,Line2_angle)])
h1L2=yl2.subs([(y2,Line2_p1[1]),(theta_l2,Line2_angle)])
data_l2_x=[]
data_l2_y=[]
for i in d:data_l2_x.append(h0L2.subs([(l,i)]))data_l2_y.append(h1L2.subs([(l,i)]))
plt.plot(data_l2_x,data_l2_y,c='blue')
​
​
#存直线2终点,,第6点
points.append([data_l2_x[-1],data_l2_y[-1]])
​
#直线2终点处法线方程
x_ln=data_l2_x[-1]+l*sy.cos(theta_l2-np.pi/2)
y_ln=data_l2_y[-1]+l*sy.sin(theta_l2-np.pi/2)
​
lh0=x_ln.subs([(x2, Line2_p1[0]),(theta_l2,Line2_angle),(l2, Line2_length)])
lh1=y_ln.subs([(y2,Line2_p1[1]),(theta_l2,Line2_angle),(l2, Line2_length)])
​
#中垂线方程:不包括斜率不存在的情况
x3=data_r1_x[-1]
y3=data_r1_y[-1]
x4=data_l2_x[-1]
y4=data_l2_y[-1]
flz=(x4-x3)*(x-(x4+x3)/2)+(y4-y3)*(y-(y4+y3)/2)
​
#求解第二条圆弧的圆心及半径
'''
刚开始把exp=[x-lh0,y-lh1,flz]写成exp=[x-lh0,y-lh0,flz]
导致圆弧2圆心及半径求解错误,圆弧2始终与其它段接不上
花了较长时间才找到错误
'''
exp=[x-lh0,y-lh1,flz]
m=sy.solve(exp,[x,y,l])
xr2_center=m[x]
yr2_center=m[y]
r2c=m[l]
#存圆弧2圆心,,第7点
points.append([xr2_center,yr2_center])
​
#求解第二条圆弧的圆心角
fj=r2c*sy.sin(da)-sy.sqrt((x3-x4)**2+(y3-y4)**2)/2
​
theta_arc2=sy.solveset(fj,da,domain=sy.Interval(0,np.pi/2)).args[0]
​
​
#第二条圆弧的初始角度
theta_arc2_start=theta_l2+np.pi/2
#第二条圆弧的终止角度
theta_arc2_end=theta_arc2_start-2*theta_arc2
​
​
​
#第二条圆弧上任意一点的坐标
xr2=xr2_center+r2c*sy.cos(theta)
yr2=yr2_center+r2c*sy.sin(theta)
​
start2=theta_arc2_start.subs([(theta_l2,Line2_angle)])
end2=theta_arc2_end.subs([(theta_l2,Line2_angle)])
p=np.arange(end2,start2, 0.01)
data_r2_x=[]
data_r2_y=[]
for i in p:data_r2_x.append(xr2.subs([(theta, i)]))data_r2_y.append(yr2.subs([(theta, i)]))
plt.plot(data_r2_x,data_r2_y,c='red')
​
clist = ['blue', 'red', 'green', 'black', 'darkgreen', 'lime', 'gold', 'purple', 'green', 'cyan', 'salmon', 'grey','mediumvioletred', 'darkkhaki', 'gray', 'darkcyan', 'violet', 'powderblue']
markerlst = ['o', '*', 'x', '>', '<', '^', 'D', 'd', '1', '2', '3', '4', 'o', '*', 'x', '>', '<', '^', 'D', 'd','1', '2', '3', '4', 'o', '*', 'x', '>', '<', '^', 'D', 'd', '1', '2', '3', '4']
plt.xticks(np.linspace(-10,10,11))
plt.yticks(np.linspace(-10, 0.0, 11))
plt.grid(True, linestyle='--', alpha=0.5)
for i in range(len(points)):plt.scatter(points[i][0],points[i][1], c=clist[i], marker=markerlst[i],label=f"P{i}")
font1 = {'family': 'SimHei', 'weight': 'normal', 'size': 16}
# 图例展示位置,数字代表第几象限
plt.legend(loc=4,prop=font1,ncol=2,framealpha=0.5)
plt.tight_layout()
plt.show()
​
​
import win32com.client as win32
import pythoncom
​
swApp = win32.Dispatch('sldworks.application')
swApp.Visible = True
Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)
Part = swApp.NewDocument(r"C:\ProgramData\SolidWorks\SOLIDWORKS 2016\templates\gb_part.prtdot", 0, 0, 0)
# Part = swApp.ActiveDoc
boolstatus = Part.Extension.SelectByID2("前视基准面", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch(True)
Part.ClearSelection2(True)
Part.SketchManager.CreateLine(points[0][0],points[0][1],0,points[2][0],points[2][1],0)
Part.ClearSelection2(True)
Part.SketchManager.CreateArc(points[3][0],points[3][1],0,points[2][0],points[2][1],0,points[4][0],points[4][1],0,1)
Part.ClearSelection2(True)
Part.SketchManager.CreateArc(points[6][0],points[6][1],0,points[4][0],points[4][1],0,points[5][0],points[5][1],0,1)
Part.ClearSelection2(True)
Part.SketchManager.CreateLine(points[5][0],points[5][1], 0,points[1][0],points[1][1],0)
Part.ClearSelection2(True)
Part.SketchManager.CreateCenterLine(0,5,0,0,-10,0)
Part.ClearSelection2(True)
Part.SketchManager.CreateCenterLine(-12,0,0,12,0,0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point1", "SKETCHPOINT", -10, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 0.157744366042774, 0, -1.91530567862208, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-5,4,0)
Part.ClearSelection2(True)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point1", "SKETCHPOINT", -10, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -8.77718041256473, -1.03520491789499E-02, 0, True, 0, Nothing, 0)
Part.SketchAddConstraints('sgCOINCIDENT')
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -8.6434692451422, -2.28344189536183, 0, False, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-8.24233574287464, -0.919587987652101, 0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -6.58431726683536, 1.63901843055543E-02, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -8.88414934650275, -1.88230839309426, 0, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-12.4943508669108, 1.03259505671672, 0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point8", "SKETCHPOINT", 10, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 3.26156827918567E-03, 1.89203245972462, 0, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(3.97469657891235, 3.95129505783071, 0)
Part.ClearSelection2(True)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point8", "SKETCHPOINT", 10, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", 8.09322177512453, -9.36850455919629E-02, 0, True, 0, Nothing, 0)
Part.SketchAddConstraints('sgCOINCIDENT')
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Line2", "SKETCHSEGMENT", 9.08608052778282, -1.45426926219777, 0, False, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(8.7183550638353, -1.08654379825025, 0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", 7.13713556886099, -9.36850455919629E-02, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line2", "SKETCHSEGMENT", 9.19639816696708, -1.41749671580302, 0, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(11.9175666001787, 1.15658153182959, 0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -6.55131639307265, -0.127252746499565, 0, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-5.24079660871201, -2.44874493593841, 0)
Part.ClearSelection2(True)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 0.113612795961455, -5.48166215117303, 0, True, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-2.20787939347739, -9.63788203871677, 0)
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Arc2", "SKETCHSEGMENT", 2.50999183022091, -7.35383327168823, 0, False, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(6.36666433848222, -10.6862978662053, 0)
Part.ClearSelection2(True)
Part.SetPickMode
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Point3", "SKETCHPOINT", -6.60104030516506, -5.58829422721332, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, True, 0, Nothing, 0)
Part.SketchAddConstraints("sgMERGEPOINTS")
Part.ClearSelection2(True)
boolstatus = Part.Extension.SelectByID2("Arc1", "SKETCHSEGMENT", -7.0380808844066, -4.77023712537726, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -7.8992795998436, -3.45971734101662, 0, True, 0, Nothing, 0)
Part.SketchAddConstraints("sgTANGENT")
Part.ClearSelection2(True)
Part.SketchManager.CreateLine(-10, 0, 0, -10, 40, 0)
Part.SketchManager.CreateLine(-10, 40, 0, 10, 40, 0)
Part.SketchManager.CreateLine(10, 40, 0, 10, 0, 0)
Part.Extension.SelectByID2("Line7", "SKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.DeSelectByID("Line7", "SKETCHSEGMENT", 0, 0, 0)
boolstatus = Part.Extension.SelectByID2("Line5", "SKETCHSEGMENT", -9.79560003363511, 21.2523700341158, 0, False, 0, Nothing, 0)
myDisplayDim = Part.AddDimension2(-28.8824799708768, 18.5256729002241, 0)
Part.ClearSelection2(True)
Part.ShowNamedView2("*上下二等角轴测", 8)
boolstatus = Part.Extension.SelectByID2("Line6@草图1", "EXTSKETCHSEGMENT", -93.6539010025325, 25.9402592619527, 0, False, 16, Nothing, 0)
myFeature = Part.FeatureManager.FeatureRevolve2(True, True, False, False, False, False, 0, 0, 6.2831853071796, 0, False, False, 0.01, 0.01, 0, 0, 0, True, True, True)
Part.SelectionManager.EnableContourSelection = False
Part.ViewZoomtofit2()

问题:

绘制草图时出现了一点小问题,以相同的一个端点绘制的两端圆弧的交点却不重合,原因可能是圆心或半径的计算误差所导致的。

这篇关于python二次开发Solidworks:画砂轮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240023

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At