Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some examples how projectionDir works in SVG export #1685

Open
Jopie01 opened this issue Oct 12, 2024 · 2 comments
Open

Some examples how projectionDir works in SVG export #1685

Jopie01 opened this issue Oct 12, 2024 · 2 comments

Comments

@Jopie01
Copy link

Jopie01 commented Oct 12, 2024

I'm really struggling to make any sense how the projectionDir option works in exporting a SVG. The documentation tells me: Direction the camera will view the shape from., but how is that direction defined?

Imagine the following example

import cadquery as cq

box = cq.Workplane('XY').box(10, 20, 10)
box = box.faces("<X").workplane().circle(2).cutThruAll()

cq.exporters.export(box,
    "box_custom_options.svg",
    opt={
        "width": 300,
        "height": 300,
        "marginLeft": 10,
        "marginTop": 10,
        "showAxes": False,
        "projectionDir": (1, 0, 0),  # <-- I'm lost how this works
        "strokeWidth": 0.25,
        "strokeColor": (255, 0, 0),
        "hiddenColor": (0, 0, 255),
        "showHidden": False,
    },
)

When you run this in cq-editor you will get the following SVG
g6

But I want that image 90 degrees rotated like so
g7

But I can't get my head around how to do that. Are there any examples how projectionDir works and how to use it? It would be really nice if it was possible to define the rotations about the XYZ like you can when assembling parts.

@lorenzncode
Copy link
Member

Currently there is no control over orientation. You might find the "up" orientation changes automatically with changes to projectionDir.

projectionDir = (1, 0, 0):
out0

projectionDir = (1, 1e-6, 0):
out1

"up" option added in draft PR #1277.

@Jopie01
Copy link
Author

Jopie01 commented Oct 14, 2024

Thanks for looking into this.

I also looked at the sourcecode of the SVG export and at the class reference of the HLRAlgo_Projector (https://dev.opencascade.org/doc/refman/html/class_h_l_r_algo___projector.html). In that class I found that it's also possible to send a gp_Trsf which allows to add a quaternion.

This allows to send the three angles when exporting a SVG, build a quaternion and add that as the projectionDir.

To test this, I copied a bit of code from the Location class https://github.com/CadQuery/cadquery/blob/master/cadquery/occ_impl/geom.py#L1029-L1035 and replaced https://github.com/CadQuery/cadquery/blob/master/cadquery/occ_impl/exporters/svg.py#L192 with the code. Also changed https://github.com/CadQuery/cadquery/blob/master/cadquery/occ_impl/exporters/svg.py#L197 to with

angles = (-90, 90, 0)  # <-- this should be configurable, now just for testing
T = gp_Trsf()

q = gp_Quaternion()
q.SetEulerAngles(gp_Extrinsic_XYZ, *map(radians, angles))

T.SetRotation(q)

if focus is not None:
    projector = HLRAlgo_Projector(coordinate_system, focus)
else:
    projector = HLRAlgo_Projector(T, False, 0.0)

By changing the angles, I can basically create any view I want.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants