pythonocc_链轮
```python```python```pythondef lianlun():from OCC.Display.SimpleGui import init_displayroller_diameter = 10.2#滚轮直径pitch = 15.875#螺距num_teeth = 40 #齿数chain_width = 6.35 #链宽#Dimensions derived from the
·
def lianlun():
from OCC.Display.SimpleGui import init_display
roller_diameter = 10.2 #滚轮直径
pitch = 15.875 #螺距
num_teeth = 40 #齿数
chain_width = 6.35 #链宽
# Dimensions derived from the provided inputs
roller_radius = roller_diameter / 2. #滚轮半径
tooth_angle = (2 * M_PI) / num_teeth #齿数角度
pitch_circle_diameter = pitch / sin(tooth_angle / 2.) #节圆直径
pitch_circle_radius = pitch_circle_diameter / 2. #节圆半径
roller_contact_angle_min = (M_PI * 120 / 180) - ((M_PI / 2.) / num_teeth) #滚轮接触角——最笑
roller_contact_angle_max = (M_PI * 140 / 180) - ((M_PI / 2.) / num_teeth) #滚轮接触角——最大
roller_contact_angle = (roller_contact_angle_min + roller_contact_angle_max) / 2.
tooth_radius_min = 0.505 * roller_diameter #齿半径
tooth_radius_max = tooth_radius_min + (0.069 * pow(roller_diameter, 1.0 / 3.0))
tooth_radius = (tooth_radius_min + tooth_radius_max) / 2.#齿半径
profile_radius = 0.12 * roller_diameter * (num_teeth + 2) #轮廓班囧
top_diameter = pitch_circle_diameter + ((1 - (1.6 / num_teeth)) * pitch) - roller_diameter
top_radius = top_diameter / 2. #顶部半径
thickness = chain_width * 0.95 #厚度
# Center hole data #中心数据
center_radius = 125.0 / 2. #中心半径
# Mounting hole data 安装孔数据
mounting_hole_count = 6 #安装孔数
mounting_radius = 153.0 / 2. #安装半径
hole_radius = 8.5 / 2. #孔半径
def build_tooth():
base_center = gp_Pnt2d(pitch_circle_radius + (tooth_radius - roller_radius), 0) #基圆中心:(节圆半径+(齿半径-滚子半径)
base_circle = gp_Circ2d(gp_Ax2d(base_center, gp_Dir2d()), tooth_radius) #基圆
trimmed_base = GCE2d_MakeArcOfCircle(base_circle, #修剪基础
M_PI - (roller_contact_angle / 2.),
M_PI).Value()
display.DisplayShape(trimmed_base, update=True, color=rgb_color(0.1, 0.8, 1))
trimmed_base.Reverse() # just a trick
p0 = trimmed_base.StartPoint() #=修剪_基底。起点
p1 = trimmed_base.EndPoint() #=修剪_基底。终点点
# print(p0.X())
# display.DisplayMessage(p0)
# display.DisplayShape(p0, update=True, color=rgb_color(1, 0.8, 1))
# Determine the center of the profile circle
x_distance = cos(roller_contact_angle / 2.) * (profile_radius + tooth_radius)
y_distance = sin(roller_contact_angle / 2.) * (profile_radius + tooth_radius)
profile_center = gp_Pnt2d(pitch_circle_radius - x_distance, y_distance)
# Construct the profile circle gp_Circ2d #确定轮廓圆的中心
profile_circle = gp_Circ2d(gp_Ax2d(profile_center, gp_Dir2d()),
profile_center.Distance(p1))
geom_profile_circle = GCE2d_MakeCircle(profile_circle).Value()
# Construct the outer circle gp_Circ2d 构建外圆
outer_circle = gp_Circ2d(gp_Ax2d(gp_Pnt2d(0, 0), gp_Dir2d()), top_radius)
geom_outer_circle = GCE2d_MakeCircle(outer_circle).Value()
inter = Geom2dAPI_InterCurveCurve(geom_profile_circle, geom_outer_circle)
num_points = inter.NbPoints()
assert isinstance(p1, gp_Pnt2d)
if num_points == 2:
if p1.Distance(inter.Point(1)) < p1.Distance(inter.Point(2)):
p2 = inter.Point(1)
else:
p2 = inter.Point(2)
elif num_points == 1:
p2 = inter.Point(1)
else:
sys.exit(-1)
# Trim the profile circle and mirror #修剪轮廓圆并镜像
trimmed_profile = GCE2d_MakeArcOfCircle(profile_circle, p1, p2).Value()
# Calculate the outermost point #计算最外面的点
p3 = gp_Pnt2d(cos(tooth_angle / 2.) * top_radius,
sin(tooth_angle / 2.) * top_radius)
# and use it to create the third arc #并使用它来创建第三个弧
trimmed_outer = GCE2d_MakeArcOfCircle(outer_circle, p2, p3).Value()
# display.DisplayShape(trimmed_outer, update=True, color=rgb_color(0.1, 0.8, 1))
# Mirror and reverse the three arcs #镜像并反转三条弧线
mirror_axis = gp_Ax2d(gp_Origin2d(), gp_DX2d().Rotated(tooth_angle / 2.))
# 镜像_基础= Geom2d _修剪曲线。向下转换(修剪基础。Copy()
mirror_base = Geom2d_TrimmedCurve.DownCast(trimmed_base.Copy())
mirror_profile = Geom2d_TrimmedCurve.DownCast(trimmed_profile.Copy())
mirror_outer = Geom2d_TrimmedCurve.DownCast(trimmed_outer.Copy())
mirror_base.Mirror(mirror_axis) #镜像基地。镜像(镜像轴)
mirror_profile.Mirror(mirror_axis) #镜像配置文件。镜像(镜像轴)
mirror_outer.Mirror(mirror_axis) #镜像_外部。镜像(镜像轴)
mirror_base.Reverse() #镜像基地。反向()
mirror_profile.Reverse()
mirror_outer.Reverse()
# Replace the two outer arcs with a single one #用单个弧替换两个外弧
outer_start = trimmed_outer.StartPoint()
outer_mid = trimmed_outer.EndPoint()
outer_end = mirror_outer.EndPoint()
outer_arc = GCE2d_MakeArcOfCircle(outer_start, outer_mid, outer_end).Value()
# Create an arc for the inside of the wedge #为楔子内部创建一个弧
inner_circle = gp_Circ2d(gp_Ax2d(gp_Pnt2d(0, 0), gp_Dir2d()),
top_radius - roller_diameter)
inner_start = gp_Pnt2d(top_radius - roller_diameter, 0)
inner_arc = GCE2d_MakeArcOfCircle(inner_circle, inner_start, tooth_angle).Value()
inner_arc.Reverse()
# Convert the 2D arcs and two extra lines to 3D edges
# 将2D弧和两条额外的线转换为三维边
plane = gp_Pln(gp_Origin(), gp_DZ())
arc1 = BRepBuilderAPI_MakeEdge(geomapi_To3d(trimmed_base, plane)).Edge()#(修剪_基础,平面))。边缘()
arc2 = BRepBuilderAPI_MakeEdge(geomapi_To3d(trimmed_profile, plane)).Edge()
arc3 = BRepBuilderAPI_MakeEdge(geomapi_To3d(outer_arc, plane)).Edge()
arc4 = BRepBuilderAPI_MakeEdge(geomapi_To3d(mirror_profile, plane)).Edge()
arc5 = BRepBuilderAPI_MakeEdge(geomapi_To3d(mirror_base, plane)).Edge()
p4 = mirror_base.EndPoint() #镜像_基底
p5 = inner_arc.StartPoint() #内弧。起点()
lin1 = BRepBuilderAPI_MakeEdge(gp_Pnt(p4.X(), p4.Y(), 0),
gp_Pnt(p5.X(), p5.Y(), 0)).Edge()
arc6 = BRepBuilderAPI_MakeEdge(geomapi_To3d(inner_arc, plane)).Edge()
p6 = inner_arc.EndPoint()
lin2 = BRepBuilderAPI_MakeEdge(gp_Pnt(p6.X(), p6.Y(), 0),
gp_Pnt(p0.X(), p0.Y(), 0)).Edge()
wire = BRepBuilderAPI_MakeWire(arc1)
wire.Add(arc2) #电线。添加(arc2)
wire.Add(arc3)
wire.Add(arc4)
wire.Add(arc5)
wire.Add(lin1)
wire.Add(arc6)
wire.Add(lin2)
face = BRepBuilderAPI_MakeFace(wire.Wire())
# 楔形 = BRepPrimAPI_MakePrism(面。形状(),
wedge = BRepPrimAPI_MakePrism(face.Shape(), gp_Vec(0.0, 0.0, thickness))
return wedge.Shape()
def round_tooth(wedge):
"""
圆齿(楔形
:param wedge:
:return:
"""
round_x = 2.6
round_z = 0.06 * pitch #*间距
round_radius = pitch #圆形半径=间距
# Determine where the circle used for rounding has to start and stop
# 确定用于舍入的圆的起点和终点
p2d_1 = gp_Pnt2d(top_radius - round_x, 0)
p2d_2 = gp_Pnt2d(top_radius, round_z)
# Construct the rounding circle
# 构建圆形
round_circle = GccAna_Circ2d2TanRad(p2d_1, p2d_2, round_radius, 0.01)
if (round_circle.NbSolutions() != 2):
sys.exit(-2)
round_circle_2d_1 = round_circle.ThisSolution(1)
round_circle_2d_2 = round_circle.ThisSolution(2)
if (round_circle_2d_1.Position().Location().Coord()[1] >= 0):
round_circle_2d = round_circle_2d_1
else:
round_circle_2d = round_circle_2d_2
# Remove the arc used for rounding
# 移除用于倒圆的弧线
trimmed_circle = GCE2d_MakeArcOfCircle(round_circle_2d, p2d_1, p2d_2).Value()
# Calculate extra points used to construct lines
# 计算用于构建线的额外点
p1 = gp_Pnt(p2d_1.X(), 0, p2d_1.Y())
p2 = gp_Pnt(p2d_2.X(), 0, p2d_2.Y())
p3 = gp_Pnt(p2d_2.X() + 1, 0, p2d_2.Y())
p4 = gp_Pnt(p2d_2.X() + 1, 0, p2d_1.Y() - 1)
p5 = gp_Pnt(p2d_1.X(), 0, p2d_1.Y() - 1)
# Convert the arc and four extra lines into 3D edges
# 将圆弧和四条额外的线转换为三维边
plane = gp_Pln(gp_Ax3(gp_Origin(), gp_DY().Reversed(), gp_DX()))
arc1 = BRepBuilderAPI_MakeEdge(geomapi_To3d(trimmed_circle, plane)).Edge()
lin1 = BRepBuilderAPI_MakeEdge(p2, p3).Edge()
lin2 = BRepBuilderAPI_MakeEdge(p3, p4).Edge()
lin3 = BRepBuilderAPI_MakeEdge(p4, p5).Edge()
lin4 = BRepBuilderAPI_MakeEdge(p5, p1).Edge()
# Make a wire composed of the edges #制作由边组成的线
round_wire = BRepBuilderAPI_MakeWire(arc1)
round_wire.Add(lin1)
round_wire.Add(lin2)
round_wire.Add(lin3)
round_wire.Add(lin4)
# Turn the wire into a face #把电线变成一张(面)脸
round_face = BRepBuilderAPI_MakeFace(round_wire.Wire()).Shape()
# Revolve the face around the Z axis over the tooth angle
# 在齿角上围绕Z轴旋转面
rounding_cut_1 = BRepPrimAPI_MakeRevol(round_face, gp_OZ(), tooth_angle).Shape()
# Construct a mirrored copy of the first cutting shape
# 构建第一个切割形状的镜像副本
mirror = gp_Trsf()
mirror.SetMirror(gp_XOY())
mirrored_cut_1 = BRepBuilderAPI_Transform(rounding_cut_1, mirror, True).Shape()
# and translate it so that it ends up on the other side of the wedge
# 转换它,让它在楔子的另一边结束
translate = gp_Trsf()
translate.SetTranslation(gp_Vec(0, 0, thickness))
rounding_cut_2 = BRepBuilderAPI_Transform(mirrored_cut_1, translate, False).Shape()
# Cut the wedge using the first and second cutting shape
# 使用第一个和第二个切割形状切割楔子
cut_1 = BRepAlgoAPI_Cut(wedge, rounding_cut_1).Shape()
cut_2 = BRepAlgoAPI_Cut(cut_1, rounding_cut_2).Shape()
return cut_2
def clone_tooth(base_shape):
"""
克隆牙(基础形状
:param base_shape:
:return:
"""
clone = gp_Trsf()
grouped_shape = base_shape
# Find a divisor, between 1 and 8, for the number_of teeth
# 为齿数找到一个介于1和8之间的除数
multiplier = 1 #乘数
max_multiplier = 1
for i in range(0, 8):
if num_teeth % multiplier == 0:
max_multiplier = i + 1
multiplier = max_multiplier
for i in range(1, multiplier):
clone.SetRotation(gp_OZ(), -i * tooth_angle)
rotated_shape = BRepBuilderAPI_Transform(base_shape, clone, True).Shape()
grouped_shape = BRepAlgoAPI_Fuse(grouped_shape, rotated_shape).Shape()
# Rotate the basic tooth and fuse together
# 旋转基本齿并融合在一起
aggregated_shape = grouped_shape #聚集形状=分组形状
for i in range(1, int(num_teeth / multiplier)):
clone.SetRotation(gp_OZ(), - i * multiplier * tooth_angle)
# 旋转形状 = BRepBuilderAPI_Transform(分组形状,克隆,真)。形状()
rotated_shape = BRepBuilderAPI_Transform(grouped_shape, clone, True).Shape()
# 聚集_形状 = BRepAlgoAPI_Fuse(聚集_形状,旋转_形状)。形状()
aggregated_shape = BRepAlgoAPI_Fuse(aggregated_shape, rotated_shape).Shape()
# 气缸 = brepprimpi _ make cylinder(gp_XOY(), 顶部半径 - 滚轮直径,厚度)
cylinder = BRepPrimAPI_MakeCylinder(gp_XOY(),
top_radius - roller_diameter,
thickness)
# 聚集_形状 = BRepAlgoAPI_Fuse(聚集_形状,圆柱体。Shape())。形状()
aggregated_shape = BRepAlgoAPI_Fuse(aggregated_shape,
cylinder.Shape()).Shape()
return aggregated_shape
def center_hole(base):
"""
中心孔(底部):
:param base:
:return:
"""
cylinder = BRepPrimAPI_MakeCylinder(center_radius, thickness).Shape()
cut = BRepAlgoAPI_Cut(base, cylinder)
return cut.Shape()
def mounting_holes(base):
"""
安装孔(底部):
:param base:
:return:
"""
result = base
for i in range(0, mounting_hole_count):
center = gp_Pnt(cos(i * M_PI / 3) * mounting_radius,
sin(i * M_PI / 3) * mounting_radius, 0.0)
center_axis = gp_Ax2(center, gp_DZ())
cylinder = BRepPrimAPI_MakeCylinder(center_axis, hole_radius,
thickness).Shape()
result = BRepAlgoAPI_Cut(result, cylinder).Shape()
cone = BRepPrimAPI_MakeCone(center_axis,
hole_radius + thickness / 2.,
hole_radius, thickness / 2.)
result = BRepAlgoAPI_Cut(result, cone.Shape()).Shape()
return result
def cut_out(base):
# 切出(基础):
# 外部 = gp_Circ2d(gp_OX2d(),顶部_半径 - 1.75 * 滚轮_直径)
outer = gp_Circ2d(gp_OX2d(), top_radius - 1.75 * roller_diameter)
# 内部 = gp_Circ2d(gp_OX2d(),中心_半径 + 0.75 * 滚轮_直径)
inner = gp_Circ2d(gp_OX2d(), center_radius + 0.75 * roller_diameter)
geom_outer = GCE2d_MakeCircle(outer).Value()
geom_inner = GCE2d_MakeCircle(inner).Value()
geom_inner.Reverse()
base_angle = (2. * M_PI) / mounting_hole_count
hole_angle = atan(hole_radius / mounting_radius) #孔角度
correction_angle = 3 * hole_angle #校正角度= 3 *孔角度
left = gp_Lin2d(gp_Origin2d(), gp_DX2d())
right = gp_Lin2d(gp_Origin2d(), gp_DX2d())
left.Rotate(gp_Origin2d(), correction_angle) #向左。旋转(gp_Origin2d(),校正_角度)
right.Rotate(gp_Origin2d(), base_angle - correction_angle) #没错。旋转(gp_Origin2d(),基础_角度-校正_角度)
geom_left = GCE2d_MakeLine(left).Value()
geom_right = GCE2d_MakeLine(right).Value()
inter_1 = Geom2dAPI_InterCurveCurve(geom_outer, geom_left)
inter_2 = Geom2dAPI_InterCurveCurve(geom_outer, geom_right)
inter_3 = Geom2dAPI_InterCurveCurve(geom_inner, geom_right)
inter_4 = Geom2dAPI_InterCurveCurve(geom_inner, geom_left)
if inter_1.Point(1).X() > 0:
p1 = inter_1.Point(1)
else:
p1 = inter_1.Point(2)
if inter_2.Point(1).X() > 0:
p2 = inter_2.Point(1)
else:
p2 = inter_2.Point(2)
if inter_3.Point(1).X() > 0:
p3 = inter_3.Point(1)
else:
p3 = inter_3.Point(2)
if inter_4.Point(1).X() > 0:
p4 = inter_4.Point(1)
else:
p4 = inter_4.Point(2)
trimmed_outer = GCE2d_MakeArcOfCircle(outer, p1, p2).Value()
trimmed_inner = GCE2d_MakeArcOfCircle(inner, p4, p3).Value()
plane = gp_Pln(gp_Origin(), gp_DZ())
arc1 = BRepBuilderAPI_MakeEdge(geomapi_To3d(trimmed_outer, plane)).Edge()
lin1 = BRepBuilderAPI_MakeEdge(gp_Pnt(p2.X(), p2.Y(), 0),
gp_Pnt(p3.X(), p3.Y(), 0)).Edge()
#(修剪_外部,平面))。边缘()
arc2 = BRepBuilderAPI_MakeEdge(geomapi_To3d(trimmed_inner, plane)).Edge()
lin2 = BRepBuilderAPI_MakeEdge(gp_Pnt(p4.X(), p4.Y(), 0),
gp_Pnt(p1.X(), p1.Y(), 0)).Edge()
cutout_wire = BRepBuilderAPI_MakeWire(arc1)
cutout_wire.Add(lin1) #断线。添加(lin1)
cutout_wire.Add(arc2)
cutout_wire.Add(lin2)
# Turn the wire into a face #把电线变成一张脸
cutout_face = BRepBuilderAPI_MakeFace(cutout_wire.Wire())
filleted_face = BRepFilletAPI_MakeFillet2d(cutout_face.Face())
explorer = BRepTools_WireExplorer(cutout_wire.Wire())
while explorer.More():
vertex = explorer.CurrentVertex()
filleted_face.AddFillet(vertex, roller_radius)
explorer.Next()
cutout = BRepPrimAPI_MakePrism(filleted_face.Shape(),
gp_Vec(0.0, 0.0, thickness)).Shape()
result = base #结果=基础
rotate = gp_Trsf()
for i in range(0, mounting_hole_count):
rotate.SetRotation(gp_OZ(), i * 2. * M_PI / mounting_hole_count)
# 旋转剪切 = BRepBuilderAPI_Transform(剪切,旋转,真)
rotated_cutout = BRepBuilderAPI_Transform(cutout, rotate, True)
result = BRepAlgoAPI_Cut(result,
rotated_cutout.Shape()).Shape()
return result
def build_sprocket():
# create the sprocket model
wedge = build_tooth()
rounded_wedge = round_tooth(wedge)
basic_disk = clone_tooth(rounded_wedge)
cut_disc = center_hole(basic_disk)
mountable_disc = mounting_holes(cut_disc)
sprocket = cut_out(mountable_disc)
return sprocket
sprocket_model = build_sprocket()
# display.DisplayShape(sprocket_model, update=True, color=rgb_color(1, 0.8, 1)) #
# display.DisplayShape(TopoDS_Shape_chengtao.Shape(), update=True, color=rgb_color(0.1, 0.2, 1)) #
点击阅读全文
更多推荐
所有评论(0)