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

DXF export issue #1767

Open
adam-urbanczyk opened this issue Feb 13, 2025 · 2 comments
Open

DXF export issue #1767

adam-urbanczyk opened this issue Feb 13, 2025 · 2 comments
Labels

Comments

@adam-urbanczyk
Copy link
Member

My use-case has a far smaller work scope: I only need 3D-to-2D projections. Dimensions & annotation are not required. Kind of similar to #1685 except in DXF:

Here is my reduced workflow:

  1. On-demand 3rd angle projections of the same part to three separate DXF files (e.g. top.dxf, left.dxf, front.dxf)

  2. Write a simple (Python/bash) script to embed the DXF files into a ISO titleblock template, e.g. this file

  3. Open the output DXF in the LibreCAD GUI.

  4. Manually draw dimensions on the titleblock with command prompt or with the mouse.

I managed to simulate #1685 with the following code:

def exportDXF3rdAngleProjection(my_part, prefix: str) -> None:
    viewpoint = {
        'top': (0, 0, 1),
        'left': (1, 0, 0),
        'front': (0, 1, 0),
    }
    for name, direction in viewpoint.items():
        cq.exporters.exportDXF(
            mounting_rail.rotateAboutCenter(direction, 90),
            f"{prefix}{name}.dxf",

            # Note: exportDXF is missing the following parameter.
            #opt={
            #    "projectionDir": direction,
            #},
            doc_units=6,
        )

but the issue is cq.exporters.exportDXF messed up the countersunk holes:

Image

Question: is it a known issue in cadquery? Is there a bug report on Github that I can keep track of?

Originally posted by @antonysigma in #122

@adam-urbanczyk
Copy link
Member Author

@antonysigma could you provide a MRE?

@antonysigma
Copy link

antonysigma commented Feb 13, 2025

could you provide a MRE?

@adam-urbanczyk , here you are. Thanks in advance!

Python version: Python 3.9.5
cadquery version: cadquery==2.5.2

import cadquery as cq
from ocp_vscode import (
    set_port,
    show_object,
)

viewpoint = {
    'top': (0, 0, 1),
    'left': (1, 0, 0),
    'front': (0, 1, 0),
}

def exportDXF3rdAngleProjection(my_part, prefix: str) -> None:
    for name, direction in viewpoint.items():
        cq.exporters.exportDXF(
            my_part.rotateAboutCenter(direction, 90),
            f"{prefix}{name}.dxf",

            # Note: exportDXF is missing the following parameter.
            #opt={
            #    "projectionDir": direction,
            #},
            doc_units=6,
        )

def exportSVG3rdAngleProjection(my_part, prefix: str) -> None:
    for name, direction in viewpoint.items():
        cq.exporters.export(
            my_part,
            f'{prefix}{name}.svg',
            opt={
                'projectionDir': direction,
            },
        )

if __name__ == '__main__':
    # Build the part
    width = 10
    depth = 10
    height = 10.0

    # !!! Test projection of fillets to arc segments in DXF. !!!
    baseplate = (
        cq.Workplane("XY")  #
        .box(width, depth, height)
        .edges("|Z")
        .fillet(2.0)
    )

    hole_dia = 3.0

    # !!! Test projection of countersunk to arc segments in DXF. !!!
    drilled = (
        baseplate.faces(">Z")  #
        .workplane()
        .cskHole(hole_dia, hole_dia * 2, 82.0)
    )

    # Expected DXF output to be identical to SVG output
    exportSVG3rdAngleProjection(drilled, "")
    exportDXF3rdAngleProjection(drilled, "")

    # Initialize the ocp_vscode viewer
    if False:
        set_port(3939)
        show_object(drilled)

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

No branches or pull requests

2 participants