diff --git a/src/Scripts/plot_3DST.py b/src/Scripts/plot_3DST.py new file mode 100644 index 0000000000000000000000000000000000000000..2647a32ac1d4f2e4a38b44b31e16a2cc56b87bbf --- /dev/null +++ b/src/Scripts/plot_3DST.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +# a lancer depuis src +import sys +from matplotlib import pyplot as plt +from Model.Geometry.Reach import Reach +from numpy import mean + +def set_axes_equal(ax): + '''Make axes of 3D plot have equal scale so that spheres appear as spheres, + cubes as cubes, etc.. This is one possible solution to Matplotlib's + ax.set_aspect('equal') and ax.axis('equal') not working for 3D. + + Input + ax: a matplotlib axis, e.g., as output from plt.gca(). + ''' + + x_limits = ax.get_xlim3d() + y_limits = ax.get_ylim3d() + z_limits = ax.get_zlim3d() + + x_range = abs(x_limits[1] - x_limits[0]) + x_middle = mean(x_limits) + y_range = abs(y_limits[1] - y_limits[0]) + y_middle = mean(y_limits) + z_range = abs(z_limits[1] - z_limits[0]) + z_middle = mean(z_limits) + + # The plot bounding box is a sphere in the sense of the infinity + # norm, hence I call half the max range the plot radius. + plot_radius = 0.5*max([x_range, y_range, z_range]) + + ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius]) + ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius]) + ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius]) + +st_file = sys.argv[1] +my_reach = Reach(None) +my_reach.import_geometry(st_file) +my_reach.compute_guidelines() + +ax = plt.figure().add_subplot(projection="3d") +for x, y, z in zip(my_reach.get_x(), my_reach.get_y(), my_reach.get_z()): + ax.plot(x, y, z, color='r', lw=1.) +for x, y, z in zip(my_reach.get_guidelines_x(), my_reach.get_guidelines_y(), my_reach.get_guidelines_z()): + ax.plot(x, y, z, color='b', lw=1.) +ax.set_xlabel('X') +ax.set_ylabel('Y') +ax.set_zlabel('Z') +plt.tight_layout() +set_axes_equal(ax) +plt.show()