#coding:UTF-8
#coding:gbk
import math
import numpy as np
import pandas as pd
# 定义以下变量:
# 转子旋转角度为phi(φ,单位°); 滑靴中心对应失径rho(ρ 单位mm);
# 回程盘滑靴安装孔与滑靴中心角度差dtheta(△θ ,单位°); 滑靴在斜盘上投影坐标(y0,z0)……(yn-1,zn-1);
# 回程盘滑靴安装孔分布圆转角theta(θ,单位°); 回程盘滑靴安装孔与滑靴中心距离ds0……dsn-1;
n=9 #柱塞个数n
dp=28.8 #回程盘上滑靴孔的直径dp(单位mm)
d3=24 #滑靴颈部直径d3(单位mm)
R=50 #转子柱塞孔分布圆半径R(单位mm)
R2=51.3 #回程盘滑靴安装孔分布圆半径R2(单位mm)
gamma=17 #斜盘倾角gamma (γ单位°)
rho=[]
dtheta=np.arange(-6,6,0.001) #定义一个比较大的dtheta范围
ds_angle=pd.DataFrame()
Dds_mn=pd.DataFrame()
for phi in range(361):
y=R*math.cos(math.radians(phi))/math.cos(math.radians(gamma))
z=R*math.sin(math.radians(phi))
theta=math.atan2(z,y)
ds_mn=pd.DataFrame()
ds=[]
for item in dtheta: #第一个循环,找到第一个柱塞滑靴在转子转动一周时,滑靴与回程盘孔之间的角度范围ddtheta
dz2=R2*math.sin(theta-math.radians(item))
dy2=R2*math.cos(theta-math.radians(item))
dz1=R*math.sin(math.radians(phi))
dy1=R*math.cos(math.radians(phi))/math.cos(math.radians(gamma))
ds.append(math.pow(math.pow(dz2-dz1,2)+math.pow(dy2-dy1,2),0.5))
dsi=pd.DataFrame(ds,index=dtheta,columns=['A'])
dn=dsi[dsi.A<=(dp-d3)/2]
dindex=dn.index
dmin=dindex[0]
dmax=dindex[-1]
ddtheta=np.arange(dmin,dmax,0.001)
# print(ddtheta)
for i in range(n): #第二个循环,通过在第一个循环找到ddtheta,再求其他几个柱塞滑靴转动一周时,滑靴与回程盘孔之间的角度范围,并从中找到每个phi对应的最小和最大ddtheta值
dds=[]
for k in ddtheta:
dz2=R2*math.sin(theta+i*2*math.pi/n-math.radians(k))
dy2=R2*math.cos(theta+i*2*math.pi/n-math.radians(k))
dz1=R*math.sin(math.radians(phi)+i*2*math.pi/n)
dy1=R*math.cos(math.radians(phi)+i*2*math.pi/n)/math.cos(math.radians(gamma))
dds.append(math.pow(math.pow(dz2-dz1,2)+math.pow(dy2-dy1,2),0.5))
ddsi=pd.DataFrame(dds,index=ddtheta,columns=['B'])
ddn=ddsi[ddsi.B<=(dp-d3)/2]
ddindex=ddn.index
ddmin=ddindex[0] #△θ最小值
ddmax=ddindex[-1]#△θ最大值
ddmn=pd.DataFrame([ddmin,ddmax],index=["MIN","MAX"])
ds_mn=pd.concat([ds_mn,ddmn],axis=1)
#print(ds_mn)
min_angle=max(pd.Series(ds_mn.loc["MIN"]))
print(min_angle)
max_angle=min(pd.Series(ds_mn.loc["MAX"]))
dz_min=R2*math.sin(theta-math.radians(min_angle))-R*math.sin(math.radians(phi))
dy_min=R2*math.cos(theta-math.radians(min_angle))-R*math.cos(math.radians(phi))/math.cos(math.radians(gamma))
dz_max=R2*math.sin(theta-math.radians(max_angle))-R*math.sin(math.radians(phi))
dy_max=R2*math.cos(theta-math.radians(max_angle))-R*math.cos(math.radians(phi))/math.cos(math.radians(gamma))
ds_phi_min=math.pow(math.pow(dz_min,2)+math.pow(dy_min,2),0.5)
ds_phi_max=math.pow(math.pow(dz_max,2)+math.pow(dy_max,2),0.5)
phi_index=np.array([0])
phi_index[0]=phi
Ddtheta=np.arange(min_angle,max_angle,0.001)
print(Ddtheta)
Dds=[]
for j in Ddtheta:
ddz2=R2*math.sin(theta-math.radians(j))
ddy2=R2*math.cos(theta-math.radians(j))
ddz1=R*math.sin(math.radians(phi))
ddy1=R*math.cos(math.radians(phi))/math.cos(math.radians(gamma))
Dds.append(math.pow(math.pow(ddz2-ddz1,2)+math.pow(ddy2-ddy1,2),0.5))
Dds_phi=pd.DataFrame(Dds,index=Ddtheta,columns=['Dds_phi'])
print(Dds_phi)
Dds_phi_min=Dds_phi.nsmallest(1,'Dds_phi',keep='all')
print(Dds_phi_min)
Dds_phi_min_index=Dds_phi_min.index[0]
print(Dds_phi_min_index)
Dds_phi_min_ds=Dds_phi_min.iloc[0,0]
print(Dds_phi_min_ds)
data=pd.DataFrame([min_angle,max_angle,ds_phi_min,ds_phi_max,Dds_phi_min_index,Dds_phi_min_ds],columns=phi_index,index=["min_angle","max_angle","min_ds","max_ds","Dds_phi_dtheta","Dds_phi_min"])
print(data)
ds_angle=pd.concat([ds_angle,data],axis=1,)
ds_360=ds_angle.T
print(ds_360)
ds_360.to_excel("D:Ddss.xlsx")



