Source code for pymycar.Cad.MotorCycle.front_assembly

"""
Motorbike Front Assembly Visualization
======================================

"""

import pyvista as pv
from pymycar.Cad.geometric_forms import rectangle_U, control_arm, simple_tube, simple_sphere, spring, rocked
from pymycar.Cad.geometric_forms import control_arm, simple_tube, simple_sphere, spring, rocked


###############################################################################
# Forks
# -----

[docs] def fork_front_suspension_steer(data, index=None): """ Creates the CAD visualization for a front fork suspension. .. code-block:: # # # fork_left_upper * # | * STEERING_AXIS_TOP # | \ # | * STEERING_AXIS_BOTTOM # | # | * fork_right_upper # | | # fork_left_middle * | # | | # | | # | | # fork_left_bottom * * fork_right_middle # \ | # \ | # wheel_center_front * | # \ | # \ | # *fork_right_bottom # # # +-------------------------+----------------------------------+--------+ | Points Name | Description | Type | +=========================+==================================+========+ | wheel_center_front | Center of the Wheel | mobile | +-------------------------+----------------------------------+--------+ | STEERING_AXIS_TOP | Steering axis top point | fixed | +-------------------------+----------------------------------+--------+ | STEERING_AXIS_BOTTOM | Steering axis bottom point | fixed | +-------------------------+----------------------------------+--------+ | fork_right_upper | Fork right upper attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_upper | Fork left upper attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_right_middle | Fork right middle attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_middle | Fork left middle attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_right_bottom | Fork right bottom attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_bottom | Fork left bottom attachment | mobile | +-------------------------+----------------------------------+--------+ Parameters ---------- data : dict Dictionary containing suspension geometry data points. index : int, optional Index of the current data point in the data arrays. Default is None. Returns ------- tuple A tuple containing the following PyVista PolyData/MultiBlock objects: - bar_right_top : pyvista.PolyData - bar_left_top : pyvista.PolyData - U_form : pyvista.MultiBlock - steer_axis : pyvista.PolyData Examples -------- Create a base double wishbone suspension visualization. >>> import numpy as np >>> import pyvista as pv >>> from pymycar.Cad.MotorCycle.front_assembly import fork_front_suspension Define the suspension geometry points. >>> data = { ... "wheel_center_front": [np.array([1100.0, 0.0, 0.0])], ... "STEERING_AXIS_TOP": np.array([900.0, 0.0, 600.0]), ... "STEERING_AXIS_BOTTOM": np.array([1000.0, 0.0, 500.0]), ... "fork_right_upper": [np.array([900.0, -200.0, 600.0])], ... "fork_left_upper": [np.array([900.0, 200.0, 600.0])], ... "fork_right_middle": [np.array([999.0, -200.0, 300.0])], ... "fork_left_middle": [np.array([999.0, 200.0, 300.0])], ... "fork_right_bottom": [np.array([1100.0, -200.0, 0.0])], ... "fork_left_bottom": [np.array([1100.0, 200.0, 0.0])], ... } Generate the CAD elements and a representation of the wheel. >>> wheel = pv.Cylinder(center=data["wheel_center_front"][0], direction=(0, 1, 0), height=50, radius=200) >>> bar_right_top, bar_left_top, U_form, steer_axis = fork_front_suspension(data, 0) Initialize the plotter and add the generated meshes. >>> plotter = pv.Plotter() >>> plotter.add_mesh(wheel, color="black", opacity=1.0) >>> plotter.add_mesh(bar_right_top, color="red") >>> plotter.add_mesh(bar_left_top, color="red") >>> plotter.add_mesh(U_form, color="green") >>> plotter.add_mesh(steer_axis, color="blue") >>> for name, coord in data.items(): ... pts = coord[0] if isinstance(coord, list) else coord ... plotter.add_mesh(pv.Sphere(radius=5, center=pts), color='red') ... plotter.add_point_labels([pts], [name], point_size=20, font_size=30, text_color='black', always_visible=True) >>> plotter.show() """ aux_1 = 0.5* ((data["fork_right_upper"][index]) + (data["fork_right_bottom"][index])) aux_2 = 0.5* ((data["fork_left_upper"][index]) + (data["fork_left_bottom"][index])) aux_1_b = 0.5* ((data["fork_right_upper"][index]) + (data["fork_right_bottom"][index])) aux_2_b = 0.5* ((data["fork_left_upper"][index]) + (data["fork_left_bottom"][index])) steer_axis = simple_tube(data["STEERING_AXIS_TOP"], data["STEERING_AXIS_BOTTOM"]) bar_right = simple_tube(data["fork_right_upper"][index], data["STEERING_AXIS_BOTTOM"], radius=10, resolution=100, n_sides=10) bar_left = simple_tube(data["fork_left_upper"][index], data["STEERING_AXIS_BOTTOM"], radius=10, resolution=100, n_sides=10) U_form_top = rectangle_U(aux_1, aux_2, data["fork_right_upper"][index], data["fork_left_upper"][index], radius=10, resolution=100, n_sides=10) U_form_bottom = rectangle_U(aux_1_b, aux_2_b, data["fork_right_bottom"][index], data["fork_left_bottom"][index], radius=5, resolution=100, n_sides=10) return steer_axis, pv.MultiBlock([U_form_top, bar_right, bar_left]), U_form_bottom
[docs] def fork_front_suspension(data, index=None): """ Creates the CAD visualization for a front fork suspension. .. code-block:: # # # fork_left_upper * # | * STEERING_AXIS_TOP # | \ # | * STEERING_AXIS_BOTTOM # | # | * fork_right_upper # | | # fork_left_middle * | # | | # | | # | | # fork_left_bottom * * fork_right_middle # \ | # \ | # wheel_center_front * | # \ | # \ | # *fork_right_bottom # # # +-------------------------+----------------------------------+--------+ | Points Name | Description | Type | +=========================+==================================+========+ | wheel_center_front | Center of the Wheel | mobile | +-------------------------+----------------------------------+--------+ | STEERING_AXIS_TOP | Steering axis top point | fixed | +-------------------------+----------------------------------+--------+ | STEERING_AXIS_BOTTOM | Steering axis bottom point | fixed | +-------------------------+----------------------------------+--------+ | fork_right_upper | Fork right upper attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_upper | Fork left upper attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_right_middle | Fork right middle attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_middle | Fork left middle attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_right_bottom | Fork right bottom attachment | mobile | +-------------------------+----------------------------------+--------+ | fork_left_bottom | Fork left bottom attachment | mobile | +-------------------------+----------------------------------+--------+ Parameters ---------- data : dict Dictionary containing suspension geometry data points. index : int, optional Index of the current data point in the data arrays. Default is None. Returns ------- tuple A tuple containing the following PyVista PolyData/MultiBlock objects: - bar_right_top : pyvista.PolyData - bar_left_top : pyvista.PolyData - U_form : pyvista.MultiBlock - steer_axis : pyvista.PolyData Examples -------- Create a base double wishbone suspension visualization. >>> import numpy as np >>> import pyvista as pv >>> from pymycar.Cad.MotorCycle.front_assembly import fork_front_suspension Define the suspension geometry points. >>> data = { ... "wheel_center_front": [np.array([1100.0, 0.0, 0.0])], ... "STEERING_AXIS_TOP": np.array([900.0, 0.0, 600.0]), ... "STEERING_AXIS_BOTTOM": np.array([1000.0, 0.0, 500.0]), ... "fork_right_upper": [np.array([900.0, -200.0, 600.0])], ... "fork_left_upper": [np.array([900.0, 200.0, 600.0])], ... "fork_right_middle": [np.array([999.0, -200.0, 300.0])], ... "fork_left_middle": [np.array([999.0, 200.0, 300.0])], ... "fork_right_bottom": [np.array([1100.0, -200.0, 0.0])], ... "fork_left_bottom": [np.array([1100.0, 200.0, 0.0])], ... } Generate the CAD elements and a representation of the wheel. >>> wheel = pv.Cylinder(center=data["wheel_center_front"][0], direction=(0, 1, 0), height=50, radius=200) >>> bar_right_top, bar_left_top, U_form, steer_axis = fork_front_suspension(data, 0) Initialize the plotter and add the generated meshes. >>> plotter = pv.Plotter() >>> plotter.add_mesh(wheel, color="black", opacity=1.0) >>> plotter.add_mesh(bar_right_top, color="red") >>> plotter.add_mesh(bar_left_top, color="red") >>> plotter.add_mesh(U_form, color="green") >>> plotter.add_mesh(steer_axis, color="blue") >>> for name, coord in data.items(): ... pts = coord[0] if isinstance(coord, list) else coord ... plotter.add_mesh(pv.Sphere(radius=5, center=pts), color='red') ... plotter.add_point_labels([pts], [name], point_size=20, font_size=30, text_color='black', always_visible=True) >>> plotter.show() """ data["fork_right_middle"] = (data["fork_right_upper"] + data["fork_right_bottom"]) / 2 data["fork_left_middle"] = (data["fork_left_upper"] + data["fork_left_bottom"]) / 2 data["fork_right_middle_b"] = (data["fork_right_upper"] + data["fork_right_bottom"]) / 2 data["fork_left_middle_b"] = (data["fork_left_upper"] + data["fork_left_bottom"]) / 2 # bar_right_top = simple_tube(data["fork_right_upper"][index], data["fork_right_middle"][index]) # bar_left_top = simple_tube(data["fork_left_upper"][index], data["fork_left_middle"][index]) # U_form = rectangle_U(data["fork_right_middle"][index], data["fork_left_middle"][index], data["fork_right_bottom"][index], data["fork_left_bottom"][index], radius=10, resolution=100, n_sides=10) # steer_axis = simple_tube(data["STEERING_AXIS_TOP"], data["STEERING_AXIS_BOTTOM"]) # return bar_right_top, bar_left_top, U_form, steer_axis steer_axis = simple_tube(data["STEERING_AXIS_TOP"], data["STEERING_AXIS_BOTTOM"]) bar_right = simple_tube(data["fork_right_upper"][index], data["STEERING_AXIS_BOTTOM"], radius=10, resolution=100, n_sides=10) bar_left = simple_tube(data["fork_left_upper"][index], data["STEERING_AXIS_BOTTOM"], radius=10, resolution=100, n_sides=10) U_form_top = rectangle_U(data["fork_right_middle"][index], data["fork_left_middle"][index], data["fork_right_upper"][index], data["fork_left_upper"][index], radius=10, resolution=100, n_sides=10) U_form_bottom = rectangle_U(data["fork_right_middle_b"][index], data["fork_left_middle_b"][index], data["fork_right_bottom"][index], data["fork_left_bottom"][index], radius=5, resolution=100, n_sides=10) return steer_axis, pv.MultiBlock([U_form_top, bar_right, bar_left]), U_form_bottom