Thanks a lot. I’m now testing out the transformation matrices. The existing tools are very useful. Here my start to implement the axonometric projection.

I look also into defining a ProjectionPlane class, onto which the projected mesh would be translated onto; let’s say… like a window or a piece of paper in space. (Or the other way around, it would be nice if the ObjectViewer could be reduced to 2 dimensions).

```
# Axonometry Transformation Matrix
from compas.geometry import Projection
from compas.geometry._transformations import matrix_from_orthogonal_projection
class Axonometry(Projection):
""" Axonometric projections are standardized parallel projections onto a plane.
The position of the plane determines the type of axonometry:
isometric, dimetric or trimetric."""
def __init__(self, matrix=None):
if matrix:
_, _, _, _, perspective = decompose_matrix(matrix)
check = matrix_from_perspective_entries(perspective)
if not allclose(flatten(matrix), flatten(check)):
raise ValueError(
'This is not a proper projection matrix.')
super(Projection, self).__init__(matrix=matrix)
@classmethod
def isometric(cls):
"""Returns an orthogonal Projection onto a plane
at angles 120, 120, 120; distrotion ratio 1, 1, 1."""
P = cls()
P.matrix = matrix_from_orthogonal_projection(
([0, 0, 0], [-1, -1, -1]))
return P
# ==============================================================================
# Main
# ==============================================================================
if __name__ == "__main__":
import doctest
doctest.testmod(globs=globals())
# ==============================================================================
# Test
# ==============================================================================
from compas.datastructures import Mesh
from compas_viewers.objectviewer import ObjectViewer
mesh = Mesh.from_polyhedron(6)
# apply projection to mesh
P = Axonometry.isometric()
projected = mesh.transformed(P)
# print(projected_point)
viewer = ObjectViewer()
viewer.view.use_shaders = True
# viewer.add(mesh, settings={'color': '#ff0000', 'opacity': 0.7})
viewer.add(projected, settings={
'color': '#00ff00', 'opacity': 0.7})
viewer.update()
viewer.show()
```

The axonometry class could also become a view selection button in the ObjectViewer… Where can I submit these proposals/requests ?