Skip to main content

semantic-release: conventional DOI

npxpy

npxpy is a versatile open source Python package that enables you to build projects (NANO files) for the 3D direct laser lithography system Nanoscribe Quantum X align (QXa) via CLI/Scripts. It is designed such that it adheres to the same workflow logic as Nanoscribe's GUI software nanoPrintX, making the application additionally user-friendly to experienced users of the QXa.

Table of Contents

Installation

You can install npxpy via pip together with all features (recommended) :

pip install npxpy[all]

It is recommended to install npxpy in a virtual environment to prevent dependency issues.
A more selective installation with respect to features like the 3D-viewport or GDS-parsing is possible as well by exchanging [all] with [viewport] and [gds], respectively. If you are interested in a light-weight installation you are able to install only the core features of npxpy via:

pip install npxpy

Beware that the light-weight installation lacks the other aforementioned features entirely.

Features and Usage

Straightforward print project preparation with usual workflow logic is embeded in the Python-software ecosystem with extras like GDS-parsing for high workflow integration.

>>> import npxpy
>>> #  Initialize the presets and resources that you want to use in this project.
>>> #  You can either load presets directly from a .toml...
>>> preset_from_file = npxpy.Preset.load_single(file_path="preset_from_file.toml")
>>> 
>>> #  ... or initialize it inside of your script.
>>> edit_presets = {
...     "writing_speed": 220000.0,
...     "writing_power": 50.0,
...     "slicing_spacing": 0.8,
...     "hatching_spacing": 0.3,
...     "hatching_angle": 0.0,
...     "hatching_angle_increment": 0.0,
...     "hatching_offset": 0.0,
...     "hatching_offset_increment": 0.0,
...     "hatching_back_n_forth": True,
...     "mesh_z_offset": 0.0,
... }
>>> 
>>> preset_from_args = npxpy.Preset(name="preset_from_args", **edit_presets)
>>> 
>>> #  Load your resources simply via path to their directories.
>>> stl_mesh = npxpy.Mesh(file_path="./example_mesh.stl", name="stl_structure")
>>> marker = npxpy.Image(file_path="./example_marker.png", name="marker_image")
>>> 
>>> #  Initialize your project and load your presets and resources into it.
>>> project = npxpy.Project(objective="25x", resin="IP-n162", substrate="FuSi")
>>> project.load_presets(preset_from_file, preset_from_args)
>>> project.load_resources(stl_mesh, marker)
>>> 
>>> #  Prepare the nodes of your project as usual.
>>> #  Setup alignment nodes
>>> coarse_aligner = npxpy.CoarseAligner(residual_threshold=8)
>>> marker_aligner = npxpy.MarkerAligner(
...     name="Marker Aligner", image=marker, marker_size=[10, 10]
... )
>>> 
>>> # Set anchors manually...
>>> ca_positions = [
...     [200.0, 200.0, 0.0],
...     [200.0, -200.0, 0.0],
...     [-200.0, -200.0, 0.0],
...     [-200.0, 200.0, 0.0],
... ]
>>> ma_positions = [
...     [0, 200, 0.33],
...     [200, 0, 0.33],
...     [0, -200, 0.33],
...     [-200, 0, 0.33],
... ]
>>> 
>>> coarse_aligner.set_coarse_anchors_at(ca_positions)
>>> marker_aligner.set_markers_at(ma_positions)
>>> 
>>> #  ... or incorporate them in a GDS-design and read them in.
>>> import npxpy.gds
>>> 
>>> gds = npxpy.gds.GDSParser("gds_file.gds")
>>> 
>>> interface_aligner = gds.get_custom_interface_aligner(
...     cell_name="cell_with_print_scene",
...     interface_layer=(1, 0),
...     signal_type="reflection",
...     detector_type="confocal",
...     area_measurement=True,
...     measure_tilt=True,
... )
>>> 
>>> #  Initialize printing scene
>>> scene = npxpy.Scene(name="scene", writing_direction_upward=True)
>>> 
>>> #  Initialize structure with desired preset and mesh defined above.
>>> structure = npxpy.Structure(
...     name="structure", preset=preset_from_file, mesh=stl_mesh
... )
>>> 
>>> #  Arrange hierarchy of all nodes as desired either with .add_child()...
>>> coarse_aligner.add_child(scene.add_child(interface_aligner))
>>> 
>>> #  ...or more conveniently by using .append_node() to append
>>> #  consecutively to the lowest node.
>>> scene.append_node(marker_aligner, structure)
>>> 
>>> #  Eventually, add all highest-order nodes of interest
>>> #  (here only coarse_aligner) to project.
>>> project.add_child(coarse_aligner)
>>> 
>>> #  After allocating your nodes, you can copy, manipulate and add additional
>>> #  instances as you like.
>>> scene_1 = scene.deepcopy_node(copy_children=True)
>>> scene_1.name = "scene_1"
>>> scene_1.translate([254.0, 300.0, 0.0])
>>> 
>>> #  You can access descendants/ancestors as you go via semantically ordered lists.
>>> structure_1 = scene_1.all_descendants[-1]
>>> structure_1.preset = preset_from_args
>>> structure_1.name = "structure_1"
>>> 
>>> coarse_aligner.add_child(scene_1)
>>> 
>>> #  Checking the node order can be done as well
>>> project.tree() 
Project (project)
    └──Coarse aligner (coarse_alignment)
        ├──scene (scene)
        │   └──cell_with_print_scene(1, 0) (interface_alignment)
        │       └──Marker Aligner (marker_alignment)
        │           └──structure (structure)
        └──scene_1 (scene)
            └──cell_with_print_scene(1, 0) (interface_alignment)
                └──Marker Aligner (marker_alignment)
                    └──structure_1 (structure)
>>> #  Export your project to a .nano-file.
>>> project.nano(project_name="my_project")

Features like a viewport based on pyvistaqt are also available for keeping track of your project visually as well.

>>> viewport = project.viewport()

Documentation

To view more functionalities and use case examples of npxpy, refer to the the provided documentation.

How to Cite

DOI

If npxpy contributes to your research, software, or project, we kindly request that you cite it in your publications using the provided DOI above.

License

This project is licensed under the MIT License - see the LICENSE file for details.
TL;DR: You may use, modify, and distribute this software freely, provided the license and copyright notice are included.

What This Means for Users and Contributors

  • Freedom to Use: You are free to use this software in any project (commercial, personal, or otherwise) without restrictions, as long as the MIT License terms are met.

  • Modifications and Derivatives: You may modify the code, create derivative works, and distribute them under any license of your choice. The only requirements are:

    • Include the original MIT License and copyright notice with your distribution.
    • Clearly state any significant changes made to the original code.
  • Linking and Distribution: You may link this software with proprietary code or other open-source projects without restrictions. No obligations apply to the proprietary components of your project.

  • Contribution: By contributing to this project, you agree that your contributions will be licensed under the MIT License. This ensures your changes remain freely usable by others under the same terms.

For more details on your rights and responsibilities under this license, please review the LICENSE file.

Metadata

Release files for npxpy 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for npxpy 0.4.0
File Size Uploaded
npxpy-0.4.0.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for npxpy 0.4.0
File Interpreter ABI Platform
npxpy-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.7 MB

Release files / npxpy-0.4.0.tar.gz

Download URL npxpy-0.4.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
8870c3da004aa59155f5279b0bbf0c14a8c00da95db3e641992fa7cc8044b8c2
BLAKE2b-256 checksum
How to use checksums
ae769525f50da233920b2211c74f6fd1654bd673e36ef080dba9cba1c82a5ffb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 14, 2025.

Transparency log

Release files / npxpy-0.4.0-py3-none-any.whl

Download URL npxpy-0.4.0-py3-none-any.whl
Size 395.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
89d7db891badd89a3752ed1d273838e3fb483a12658bc876778ed9e8fe2aa98b
BLAKE2b-256 checksum
How to use checksums
0dc6760faf354549b01e2a4f8e206e7520672361cfa2a8154715869cc2cbc60d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 14, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page