With the end of this week the draw() function has been completely implemented. The work on PR #17345 has been completed along with the documentations.
As mentioned in the previous blog this PR was an attempt to make the draw() function use SymPy’s own plot() rather than importing matplotlib externally to plot the diagram. The idea was to plot the load equation which is in terms of singularity function. This would directly plot uniformly distributed load, uniformly varying load and other higher order loads except for point loads and moment loads.
The task was now to plot the remaining parts of the diagram which were:
- A rectangle for drawing the beam
- Arrows for point loads
- Markers for moment loads and supports
- Colour filling to fill colour in inside the higher order loads (order >=0).
Instead of making temporary hacks to implement these, I went a step further to give the plotting module some additional functionalities. Apart from helping in implementing the draw() function, this would also enhance the plotting module.
The basic idea was to have some additional keyworded arguments in the plot() function. Every keyworded argument would be a list of dictionaries where each dictionary would represent the arguments (or parameters) that would have been passed in the corresponding matplotlib functions.
These are the functions of matplotlib that can now be accessed using sympy’s plot(), along with where there are used in our current situation:
- matplotlib.patches.Rectangle -to draw the beam
- matplotlib.pyplot.annotate – to draw arrows of load
- matplotlib.markers– to draw supports and moment loads
- fill_between() – to fill an area with color
Another thing which is worth mentioning is that to use fill_between() we would require numpy’s arange() for sure. Although it might be better if we could avoid using an external module directly, but I guess this is unavoidable for now.
Also, I have added an option for the user to scale the plot and get a pictorial view of it in case where the plotting with the exact dimensions doesn’t produce a decent diagram. For eg. If the magnitude of the load (order >= 0) is relatively higher to other applied loads or to the length of the beam, the load plot might get out of the final plot window.
Here is an example:
>>> R1, R2 = symbols('R1, R2') >>> E, I = symbols('E, I') >>> b1 = Beam(50, 20, 30) >>> b1.apply_load(10, 2, -1) >>> b1.apply_load(R1, 10, -1) >>> b1.apply_load(R2, 30, -1) >>> b1.apply_load(90, 5, 0, 23) >>> b1.apply_load(10, 30, 1, 50) >>> b1.apply_support(50, "pin") >>> b1.apply_support(0, "fixed") >>> b1.apply_support(20, "roller") # case 1 on the left >>> p = b1.draw() >>> p.show() # case 2 on the right >>> p1 = b1.draw(pictorial=True) >>> p1.show()
- Getting leftover PR’s merged
- Initiating implementation of Truss class
Will keep you updated!