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()

问题:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值