Skip to content

winksaville/py-helical-thread

Repository files navigation

Helical Thread

Create helical threads

Examples

def add_traces(
    name: str,
    fig: go.Figure,
    ths: ThreadHelixes,
    helix_locations: List[HelixLocation],
    vert_offset: float = 0,
) -> None:

    # Loop over each of the helexis adding a trace for each
    for i, hl in enumerate(helix_locations):
        # Create the helix funtion
        f = ths.ht.helix(hl)

        # Create a list of points using map to invoke "f"
        # over 500 points between first_t and last_t inclusive.
        points = list(
            map(f, linspace(ths.ht.first_t, ths.ht.last_t, num=500, dtype=float))
        )

        # Check if we should offset the points
        if vert_offset != 0:
            points = [(x, y, z + vert_offset) for x, y, z in points]

        # Add a trace decomposing points into three separate lists
        fig.add_trace(
            go.Scatter3d(
                # Extract x, y, z
                x=[x for x, _, _ in points],
                y=[y for _, y, _ in points],
                z=[z for _, _, z in points],
                mode="lines",
                name=f"{name}{i}",
            )
        )


if __name__ == "__main__":
    params = Parameters(argv[1:])
    ths: ThreadHelixes = helical_thread(params.ht)

    # Create a plotly figure
    fig = go.Figure(
        # layout_title_text="Helical Triangle",
        layout_scene_camera_projection_type="orthographic",
    )

    # Add the traces for internal/external or both

    if (params.int_ext_both == "int") or (params.int_ext_both == "both"):
        add_traces("int", fig, ths, ths.int_helixes)

    if (params.int_ext_both == "ext") or (params.int_ext_both == "both"):
        # When doing set the vert_offset to pitch / s so we see the thread alignment
        vert_offset = ths.ht.pitch / 2 if params.int_ext_both == "both" else 0
        add_traces("ext", fig, ths, ths.ext_helixes, vert_offset)

    # Show the figure
    fig.show()

    if params.write:
        # Write the image is requested
        try:
            fname = "data/int_ext_both.webp"
            fig.write_image(fname)
            print(f"wrote: {fname}")
        except Exception as e:
            print(f"Unable to write files; maybe run from project root: e={e}")

Prerequisites

Using

  • python >= 3.7

Development and Examples

See dev-requirements.in for most up to date list:

  • pip-tools
  • bump2version
  • wheel
  • isort
  • black
  • flake8
  • tox
  • tox-conda
  • coverage
  • Sphinx>=3.2
  • sphinx_rtd_theme
  • sphinx-autodoc-typehints
  • sphinx-prompt
  • sphinx_substitution_extensions>=2020.09.30, <2021.12.00
  • taperable-helix
  • twine
  • pytest
  • pytest-runner
  • kaleido
  • plotly
  • psutil
  • numpy
  • pandas

About

A package that uses taperable-helix to create a set of HelixLocations for a helical thread

Resources

License

Stars

Watchers

Forks

Packages

No packages published