• python二次开发Solidworks:画砂轮


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

    1. import sympy as sy
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. '''
    5. x1,y1为第一条直线端点坐标(-10,0),theta_l1为角度,取5*np.pi/3
    6. l1为第一条直线的长度,取值2
    7. x2,y2为第二条直线端点坐标(10,0),theta_l2为角度,取4*np.pi/3
    8. x3,y3为第二条直线端点坐标,由其参数方程确定
    9. l2为第二条直线的长度,取值3
    10. r1为第一条圆弧的半径,取值3
    11. r2为第二条圆弧的半径,待求解
    12. l为直线方程的参数
    13. x,y为未知数
    14. d为
    15. theta为圆方程的参数
    16. '''
    17. #输入参数
    18. Line1_p1=[-10,0]
    19. Line1_angle=5*np.pi/3
    20. Line1_length=5
    21. Line2_p1=[10,0]
    22. Line2_angle=4*np.pi/3
    23. Line2_length=3
    24. Arc1_r=8
    25. Arc1_angle=np.pi/6
    26. #定义符号变量
    27. x1,y1,x2,y2,l1,l2,theta_l1,theta_l2=sy.symbols('x1,y1,x2,y2,l1,l2,theta_l1,theta_l2')
    28. r1,theta_arc1_start,theta_arc1_end,xr1_center,yr1_center=sy.symbols('r1,theta_arc1_start,theta_arc1_end,xr1_center,yr1_center')
    29. r2,theta_arc2,theta_arc2_start=sy.symbols('r2,theta_arc2,theta_arc2_start')
    30. l,theta,x,y,d,da=sy.symbols('l,theta,x,y,d,da')
    31. #points存储重要的点坐标
    32. points=[]
    33. #存直线1的起点坐标,第1点
    34. points.append(Line1_p1)
    35. #存直线2的起点坐标,第2点
    36. points.append(Line2_p1)
    37. #第一条直线的参数方程,x1=Line1_p1[0],y1=Line1_p1[1],theta_l1=Line1_angle,l为参数
    38. xl1=x1+l*sy.cos(theta_l1)
    39. yl1=y1+l*sy.sin(theta_l1)
    40. fig=plt.figure(figsize=(5,5))
    41. plt.rcParams['xtick.direction'] = 'in' # 将x周的刻度线方向设置向内
    42. plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内
    43. #生成直线1的横坐标,l1=Line1_length
    44. a=np.arange(0, Line1_length, 0.01)
    45. #计算直线1数据点并绘图
    46. h0L1=xl1.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle)])
    47. h1L1=yl1.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle)])
    48. data_l1_x=[]
    49. data_l1_y=[]
    50. for i in a:
    51. data_l1_x.append(h0L1.subs([(l,i)]))
    52. data_l1_y.append(h1L1.subs([(l,i)]))
    53. plt.plot(data_l1_x,data_l1_y,c='blue')
    54. #存直线1的终点坐标,也就是圆弧1的起点坐标,第3点
    55. points.append([data_l1_x[-1],data_l1_y[-1]])
    56. #圆弧1初始角度
    57. theta_arc1_start=theta_l1-np.pi/2
    58. start=theta_arc1_start.subs([(theta_l1,Line1_angle)])
    59. #圆弧1终止角度,圆心角取np.pi/3
    60. theta_arc1_end=theta_arc1_start+theta
    61. end=theta_arc1_end.subs([(theta_arc1_start,start),(theta,Arc1_angle)])
    62. #圆弧1的圆心,r1=3,l1=2
    63. xr1_center=x1+l1*sy.cos(theta_l1)+r1*sy.cos(theta_l1+np.pi/2)
    64. yr1_center=y1+l1*sy.sin(theta_l1)+r1*sy.sin(theta_l1+np.pi/2)
    65. #存圆弧1的圆心点坐标,第4点
    66. o1x=xr1_center.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle),(l1,Line1_length),(r1,Arc1_r)])
    67. o1y=yr1_center.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle),(l1,Line1_length),(r1,Arc1_r)])
    68. points.append([o1x,o1y])
    69. #第一条圆弧上任意一点的坐标
    70. xr1=xr1_center+r1*sy.cos(theta)
    71. yr1=yr1_center+r1*sy.sin(theta)
    72. #计算圆弧1坐标并作图
    73. b=np.arange(start,end, 0.01)
    74. h0R1=xr1.subs([(x1,Line1_p1[0]),(theta_l1,Line1_angle),(r1,3),(l1,Line1_length)])
    75. h1R1=yr1.subs([(y1,Line1_p1[1]),(theta_l1,Line1_angle),(r1,3),(l1,Line1_length)])
    76. data_r1_x=[]
    77. data_r1_y=[]
    78. for i in b:
    79. data_r1_x.append(h0R1.subs([(theta, i)]))
    80. data_r1_y.append(h1R1.subs([(theta, i)]))
    81. plt.plot(data_r1_x,data_r1_y,c='red')
    82. #存圆弧1终止点,,第5点
    83. points.append([data_r1_x[-1],data_r1_y[-1]])
    84. #第二条直线的参数方程,x2=10,y2=0,theta_l2=4*np.pi/3,l为参数
    85. xl2=x2+l*sy.cos(theta_l2)
    86. yl2=y2+l*sy.sin(theta_l2)
    87. #生成直线1的横坐标,l2=3
    88. d=np.arange(0, 3, 0.01)
    89. #计算直线2数据点并绘图
    90. h0L2=xl2.subs([(x2,Line2_p1[0]),(theta_l2,Line2_angle)])
    91. h1L2=yl2.subs([(y2,Line2_p1[1]),(theta_l2,Line2_angle)])
    92. data_l2_x=[]
    93. data_l2_y=[]
    94. for i in d:
    95. data_l2_x.append(h0L2.subs([(l,i)]))
    96. data_l2_y.append(h1L2.subs([(l,i)]))
    97. plt.plot(data_l2_x,data_l2_y,c='blue')
    98. #存直线2终点,,第6点
    99. points.append([data_l2_x[-1],data_l2_y[-1]])
    100. #直线2终点处法线方程
    101. x_ln=data_l2_x[-1]+l*sy.cos(theta_l2-np.pi/2)
    102. y_ln=data_l2_y[-1]+l*sy.sin(theta_l2-np.pi/2)
    103. lh0=x_ln.subs([(x2, Line2_p1[0]),(theta_l2,Line2_angle),(l2, Line2_length)])
    104. lh1=y_ln.subs([(y2,Line2_p1[1]),(theta_l2,Line2_angle),(l2, Line2_length)])
    105. #中垂线方程:不包括斜率不存在的情况
    106. x3=data_r1_x[-1]
    107. y3=data_r1_y[-1]
    108. x4=data_l2_x[-1]
    109. y4=data_l2_y[-1]
    110. flz=(x4-x3)*(x-(x4+x3)/2)+(y4-y3)*(y-(y4+y3)/2)
    111. #求解第二条圆弧的圆心及半径
    112. '''
    113. 刚开始把exp=[x-lh0,y-lh1,flz]写成exp=[x-lh0,y-lh0,flz]
    114. 导致圆弧2圆心及半径求解错误,圆弧2始终与其它段接不上
    115. 花了较长时间才找到错误
    116. '''
    117. exp=[x-lh0,y-lh1,flz]
    118. m=sy.solve(exp,[x,y,l])
    119. xr2_center=m[x]
    120. yr2_center=m[y]
    121. r2c=m[l]
    122. #存圆弧2圆心,,第7点
    123. points.append([xr2_center,yr2_center])
    124. #求解第二条圆弧的圆心角
    125. fj=r2c*sy.sin(da)-sy.sqrt((x3-x4)**2+(y3-y4)**2)/2
    126. theta_arc2=sy.solveset(fj,da,domain=sy.Interval(0,np.pi/2)).args[0]
    127. #第二条圆弧的初始角度
    128. theta_arc2_start=theta_l2+np.pi/2
    129. #第二条圆弧的终止角度
    130. theta_arc2_end=theta_arc2_start-2*theta_arc2
    131. #第二条圆弧上任意一点的坐标
    132. xr2=xr2_center+r2c*sy.cos(theta)
    133. yr2=yr2_center+r2c*sy.sin(theta)
    134. start2=theta_arc2_start.subs([(theta_l2,Line2_angle)])
    135. end2=theta_arc2_end.subs([(theta_l2,Line2_angle)])
    136. p=np.arange(end2,start2, 0.01)
    137. data_r2_x=[]
    138. data_r2_y=[]
    139. for i in p:
    140. data_r2_x.append(xr2.subs([(theta, i)]))
    141. data_r2_y.append(yr2.subs([(theta, i)]))
    142. plt.plot(data_r2_x,data_r2_y,c='red')
    143. clist = ['blue', 'red', 'green', 'black', 'darkgreen', 'lime', 'gold', 'purple', 'green', 'cyan', 'salmon', 'grey',
    144. 'mediumvioletred', 'darkkhaki', 'gray', 'darkcyan', 'violet', 'powderblue']
    145. markerlst = ['o', '*', 'x', '>', '<', '^', 'D', 'd', '1', '2', '3', '4', 'o', '*', 'x', '>', '<', '^', 'D', 'd',
    146. '1', '2', '3', '4', 'o', '*', 'x', '>', '<', '^', 'D', 'd', '1', '2', '3', '4']
    147. plt.xticks(np.linspace(-10,10,11))
    148. plt.yticks(np.linspace(-10, 0.0, 11))
    149. plt.grid(True, linestyle='--', alpha=0.5)
    150. for i in range(len(points)):
    151. plt.scatter(points[i][0],points[i][1], c=clist[i], marker=markerlst[i],label=f"P{i}")
    152. font1 = {'family': 'SimHei', 'weight': 'normal', 'size': 16}
    153. # 图例展示位置,数字代表第几象限
    154. plt.legend(loc=4,prop=font1,ncol=2,framealpha=0.5)
    155. plt.tight_layout()
    156. plt.show()
    157. import win32com.client as win32
    158. import pythoncom
    159. swApp = win32.Dispatch('sldworks.application')
    160. swApp.Visible = True
    161. Nothing = win32.VARIANT(pythoncom.VT_DISPATCH, None)
    162. Part = swApp.NewDocument(r"C:\ProgramData\SolidWorks\SOLIDWORKS 2016\templates\gb_part.prtdot", 0, 0, 0)
    163. # Part = swApp.ActiveDoc
    164. boolstatus = Part.Extension.SelectByID2("前视基准面", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
    165. Part.SketchManager.InsertSketch(True)
    166. Part.ClearSelection2(True)
    167. Part.SketchManager.CreateLine(points[0][0],points[0][1],0,points[2][0],points[2][1],0)
    168. Part.ClearSelection2(True)
    169. 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)
    170. Part.ClearSelection2(True)
    171. 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)
    172. Part.ClearSelection2(True)
    173. Part.SketchManager.CreateLine(points[5][0],points[5][1], 0,points[1][0],points[1][1],0)
    174. Part.ClearSelection2(True)
    175. Part.SketchManager.CreateCenterLine(0,5,0,0,-10,0)
    176. Part.ClearSelection2(True)
    177. Part.SketchManager.CreateCenterLine(-12,0,0,12,0,0)
    178. Part.ClearSelection2(True)
    179. boolstatus = Part.Extension.SelectByID2("Point1", "SKETCHPOINT", -10, 0, 0, False, 0, Nothing, 0)
    180. boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 0.157744366042774, 0, -1.91530567862208, True, 0, Nothing, 0)
    181. myDisplayDim = Part.AddDimension2(-5,4,0)
    182. Part.ClearSelection2(True)
    183. Part.ClearSelection2(True)
    184. boolstatus = Part.Extension.SelectByID2("Point1", "SKETCHPOINT", -10, 0, 0, False, 0, Nothing, 0)
    185. boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -8.77718041256473, -1.03520491789499E-02, 0, True, 0, Nothing, 0)
    186. Part.SketchAddConstraints('sgCOINCIDENT')
    187. Part.ClearSelection2(True)
    188. boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -8.6434692451422, -2.28344189536183, 0, False, 0, Nothing, 0)
    189. myDisplayDim = Part.AddDimension2(-8.24233574287464, -0.919587987652101, 0)
    190. Part.ClearSelection2(True)
    191. boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -6.58431726683536, 1.63901843055543E-02, 0, False, 0, Nothing, 0)
    192. boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -8.88414934650275, -1.88230839309426, 0, True, 0, Nothing, 0)
    193. myDisplayDim = Part.AddDimension2(-12.4943508669108, 1.03259505671672, 0)
    194. Part.ClearSelection2(True)
    195. boolstatus = Part.Extension.SelectByID2("Point8", "SKETCHPOINT", 10, 0, 0, False, 0, Nothing, 0)
    196. boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 3.26156827918567E-03, 1.89203245972462, 0, True, 0, Nothing, 0)
    197. myDisplayDim = Part.AddDimension2(3.97469657891235, 3.95129505783071, 0)
    198. Part.ClearSelection2(True)
    199. Part.ClearSelection2(True)
    200. boolstatus = Part.Extension.SelectByID2("Point8", "SKETCHPOINT", 10, 0, 0, False, 0, Nothing, 0)
    201. boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", 8.09322177512453, -9.36850455919629E-02, 0, True, 0, Nothing, 0)
    202. Part.SketchAddConstraints('sgCOINCIDENT')
    203. Part.ClearSelection2(True)
    204. boolstatus = Part.Extension.SelectByID2("Line2", "SKETCHSEGMENT", 9.08608052778282, -1.45426926219777, 0, False, 0, Nothing, 0)
    205. myDisplayDim = Part.AddDimension2(8.7183550638353, -1.08654379825025, 0)
    206. Part.ClearSelection2(True)
    207. boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", 7.13713556886099, -9.36850455919629E-02, 0, False, 0, Nothing, 0)
    208. boolstatus = Part.Extension.SelectByID2("Line2", "SKETCHSEGMENT", 9.19639816696708, -1.41749671580302, 0, True, 0, Nothing, 0)
    209. myDisplayDim = Part.AddDimension2(11.9175666001787, 1.15658153182959, 0)
    210. Part.ClearSelection2(True)
    211. boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, False, 0, Nothing, 0)
    212. boolstatus = Part.Extension.SelectByID2("Line4", "SKETCHSEGMENT", -6.55131639307265, -0.127252746499565, 0, True, 0, Nothing, 0)
    213. myDisplayDim = Part.AddDimension2(-5.24079660871201, -2.44874493593841, 0)
    214. Part.ClearSelection2(True)
    215. Part.ClearSelection2(True)
    216. boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, False, 0, Nothing, 0)
    217. boolstatus = Part.Extension.SelectByID2("Line3", "SKETCHSEGMENT", 0.113612795961455, -5.48166215117303, 0, True, 0, Nothing, 0)
    218. myDisplayDim = Part.AddDimension2(-2.20787939347739, -9.63788203871677, 0)
    219. Part.ClearSelection2(True)
    220. boolstatus = Part.Extension.SelectByID2("Arc2", "SKETCHSEGMENT", 2.50999183022091, -7.35383327168823, 0, False, 0, Nothing, 0)
    221. myDisplayDim = Part.AddDimension2(6.36666433848222, -10.6862978662053, 0)
    222. Part.ClearSelection2(True)
    223. Part.SetPickMode
    224. Part.ClearSelection2(True)
    225. boolstatus = Part.Extension.SelectByID2("Point3", "SKETCHPOINT", -6.60104030516506, -5.58829422721332, 0, False, 0, Nothing, 0)
    226. boolstatus = Part.Extension.SelectByID2("Point5", "SKETCHPOINT", -6.41126394835776, -5.42278825446442, 0, True, 0, Nothing, 0)
    227. Part.SketchAddConstraints("sgMERGEPOINTS")
    228. Part.ClearSelection2(True)
    229. boolstatus = Part.Extension.SelectByID2("Arc1", "SKETCHSEGMENT", -7.0380808844066, -4.77023712537726, 0, False, 0, Nothing, 0)
    230. boolstatus = Part.Extension.SelectByID2("Line1", "SKETCHSEGMENT", -7.8992795998436, -3.45971734101662, 0, True, 0, Nothing, 0)
    231. Part.SketchAddConstraints("sgTANGENT")
    232. Part.ClearSelection2(True)
    233. Part.SketchManager.CreateLine(-10, 0, 0, -10, 40, 0)
    234. Part.SketchManager.CreateLine(-10, 40, 0, 10, 40, 0)
    235. Part.SketchManager.CreateLine(10, 40, 0, 10, 0, 0)
    236. Part.Extension.SelectByID2("Line7", "SKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
    237. boolstatus = Part.DeSelectByID("Line7", "SKETCHSEGMENT", 0, 0, 0)
    238. boolstatus = Part.Extension.SelectByID2("Line5", "SKETCHSEGMENT", -9.79560003363511, 21.2523700341158, 0, False, 0, Nothing, 0)
    239. myDisplayDim = Part.AddDimension2(-28.8824799708768, 18.5256729002241, 0)
    240. Part.ClearSelection2(True)
    241. Part.ShowNamedView2("*上下二等角轴测", 8)
    242. boolstatus = Part.Extension.SelectByID2("Line6@草图1", "EXTSKETCHSEGMENT", -93.6539010025325, 25.9402592619527, 0, False, 16, Nothing, 0)
    243. 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)
    244. Part.SelectionManager.EnableContourSelection = False
    245. Part.ViewZoomtofit2()

    问题:

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

  • 相关阅读:
    2023年中国泌尿内窥镜市场规模、竞争格局及细分产品规模分析[图]
    Axios在vue项目中的基本用法
    ML.NET相关资源整理
    jsp+ajax+json练习(表单数据检测)
    vlan实验
    解决swiper组件autoplay报错问题
    Pandas数据分析17——pandas数据清洗(缺失值、重复值处理)
    OpenCV官方教程中文版 —— 模板匹配
    framework源码读后感
    在Java中使用io实现TCP协议编程
  • 原文地址:https://blog.csdn.net/T20151470/article/details/133913354