From e2f2abb1ac30d296f731e6f87e6c3d65b6c120ef Mon Sep 17 00:00:00 2001 From: Reed Krantz Date: Sun, 26 Apr 2026 19:56:29 -0500 Subject: [PATCH] chore(build123d): create the build123d scafold that is not yet working --- build123d/default.nix | 167 ++++++++++++++++ build123d/packages/build123d.nix | 59 ++++++ build123d/packages/cadquery-ocp-proxy.nix | 33 ++++ build123d/packages/cadquery-ocp.nix | 33 ++++ build123d/packages/ocp-gordon.nix | 33 ++++ build123d/packages/ocpsvg.nix | 37 ++++ build123d/packages/trianglesolver.nix | 33 ++++ build123d/template/.gitignore | 224 ++++++++++++++++++++++ build123d/template/flake.nix | 38 ++++ flake.nix | 3 + 10 files changed, 660 insertions(+) create mode 100644 build123d/default.nix create mode 100644 build123d/packages/build123d.nix create mode 100644 build123d/packages/cadquery-ocp-proxy.nix create mode 100644 build123d/packages/cadquery-ocp.nix create mode 100644 build123d/packages/ocp-gordon.nix create mode 100644 build123d/packages/ocpsvg.nix create mode 100644 build123d/packages/trianglesolver.nix create mode 100644 build123d/template/.gitignore create mode 100644 build123d/template/flake.nix diff --git a/build123d/default.nix b/build123d/default.nix new file mode 100644 index 0000000..25ddb33 --- /dev/null +++ b/build123d/default.nix @@ -0,0 +1,167 @@ +{ + flake-parts-lib, + inputs, + ... +}: { + flake = { + templates = { + build123d = { + path = ./template; + description = "A python flake with a build132d parametric cad setup"; + }; + }; + + flakeModules.build123d = { + imports = [ + inputs.treefmt-nix.flakeModule + ]; + + options.perSystem = flake-parts-lib.mkPerSystemOption ({ + lib, + config, + pkgs, + self', + ... + }: let + cfg = config.krantz.build123d; + + python = pkgs.python3.override { + self = python; + packageOverrides = pyfinal: pyprev: { + build123d = pyfinal.callPackage ./packages/build123d.nix {}; + cadquery-ocp = pyfinal.callPackage ./packages/cadquery-ocp.nix {}; + cadquery-ocp-proxy = pyfinal.callPackage ./packages/cadquery-ocp-proxy.nix {}; + ocp-gordon = pyfinal.callPackage ./packages/ocp-gordon.nix {}; + ocpsvg = pyfinal.callPackage ./packages/ocpsvg.nix {}; + trianglesolver = pyfinal.callPackage ./packages/trianglesolver.nix {}; + }; + }; + in { + options.krantz.build123d = { + enable = lib.mkEnableOption "building a cargo project with crane"; + + # src = lib.mkOption { + # description = "The path to the root of the crate."; + # type = lib.types.path; + # example = lib.literalExpression "./."; + # }; + # srcFiltered = lib.mkOption { + # description = "A path to the filtered directory of the root of the crate."; + # type = lib.types.path; + # default = craneLib.cleanCargoSource cfg.src; + # defaultText = lib.literalExpression "config.krantz.rust.craneLib cfg.src"; + # example = lib.literalExpression "./."; + # }; + # + # runtimeDeps = lib.mkOption { + # description = "Packages needed for the app to run."; + # type = lib.types.listOf lib.types.package; + # default = []; + # example = with pkgs; [ + # openssl + # ]; + # }; + # buildDeps = lib.mkOption { + # description = "Packages needed for the app to build."; + # type = lib.types.listOf lib.types.package; + # default = []; + # example = with pkgs; [ + # pkg-config + # rustPlatform.bindgenHook + # ]; + # }; + # devDeps = lib.mkOption { + # description = "Packages to include only in the devShell."; + # type = lib.types.listOf lib.types.package; + # default = with pkgs; [ + # rust-analyzer + # ]; + # }; + # + # devShell = { + # enable = lib.mkEnableOption "a rust development environment" // {default = true;}; + # + # name = lib.mkOption { + # description = "The name of the attribute in devShells to configure"; + # type = lib.types.str; + # default = "default"; + # example = "rust"; + # }; + # + # extraAttrs = lib.mkOption { + # description = "Extra attributes to merge into the devshell. See https://crane.dev/API.html#cranelibdevshell"; + # type = lib.types.attrs; + # default = {}; + # example = { + # shellHook = '' + # export DEBUG=1 + # ''; + # }; + # }; + # }; + # + # package = { + # enable = lib.mkEnableOption "the compiled cargo project" // {default = true;}; + # + # name = lib.mkOption { + # description = "The name of the attribute in packages to configure"; + # type = lib.types.str; + # default = "default"; + # example = "lib"; + # }; + # + # extraAttrs = lib.mkOption { + # description = "Extra attributes to merge into the package. See https://crane.dev/API.html#cranelibbuildpackage"; + # type = lib.types.attrs; + # default = {}; + # example = { + # doCheck = false; + # }; + # }; + # }; + # + # craneLib = lib.mkOption { + # description = "The crane lib instance this module is using. Useful for overriding options"; + # default = craneLib; + # defaultText = lib.literalExpression "crane.mkLib pkgs"; + # readOnly = true; + # }; + }; + + config = lib.mkIf cfg.enable { + # Dev Shell that lets you enter an environment with all the necessary utilites + # Available through 'nix develop' + # Also can be activated automatically if direnv is installed on the system with 'direnv allow' + # devShells.${cfg.devShell.name} = lib.mkIf cfg.devShell.enable (pkgs.mkShell { + # # extra tooling dependencies + # packages = cfg.devDeps; + # + # inputsFrom = [self'.packages.${cfg.package.name}]; + # } + # // cfg.devShell.extraAttrs); + devShells.default = pkgs.mkShell { + # extra tooling dependencies + packages = [ + (python.withPackages (p: + with p; [ + build123d + ])) + ]; + }; + + # Formatter for nix files, available through 'nix fmt' + treefmt = { + programs.alejandra.enable = lib.mkDefault true; + }; + + # Your custom packages + # Accessible through 'nix build', 'nix shell', 'nix run', etc + # packages.${cfg.package.name} = lib.mkIf cfg.package.enable ( { + # inherit src buildInputs nativeBuildInputs cargoArtifacts; + # } + # // cfg.package.extraAttrs); + }; + }); + }; + }; +} diff --git a/build123d/packages/build123d.nix b/build123d/packages/build123d.nix new file mode 100644 index 0000000..9104f63 --- /dev/null +++ b/build123d/packages/build123d.nix @@ -0,0 +1,59 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps + cadquery-ocp, + numpy, + svgpathtools, + anytree, + ezdxf, + ipython, + lib3mf, + ocpsvg, + ocp-gordon, + trianglesolver, + sympy, + scipy, + webcolors, +}: +buildPythonPackage +rec { + pname = "build123d"; + version = "0.10.0"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-c97Tjdyo67lefdB4rD16rMjKQvzo8dF28QQONfuk9gg="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + cadquery-ocp + numpy + svgpathtools + anytree + ezdxf + ipython + lib3mf + ocpsvg + ocp-gordon + trianglesolver + sympy + scipy + webcolors + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + setuptools + setuptools-scm + wheel + ]; +} diff --git a/build123d/packages/cadquery-ocp-proxy.nix b/build123d/packages/cadquery-ocp-proxy.nix new file mode 100644 index 0000000..d3f3a34 --- /dev/null +++ b/build123d/packages/cadquery-ocp-proxy.nix @@ -0,0 +1,33 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps +}: +buildPythonPackage +rec { + pname = "cadquery-ocp-proxy"; + version = "7.9.3.1"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-c97Tjdyo67lefdB4rD16rMjKQvzo8dF28QQONfuk9gg="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + # setuptools + # setuptools-scm + # wheel + ]; +} diff --git a/build123d/packages/cadquery-ocp.nix b/build123d/packages/cadquery-ocp.nix new file mode 100644 index 0000000..892f78d --- /dev/null +++ b/build123d/packages/cadquery-ocp.nix @@ -0,0 +1,33 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps +}: +buildPythonPackage +rec { + pname = "cadquery-ocp"; + version = "7.9.3.1"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-c97Tjdyo67lefdB4rD16rMjKQvzo8dF28QQONfuk9gg="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + # setuptools + # setuptools-scm + # wheel + ]; +} diff --git a/build123d/packages/ocp-gordon.nix b/build123d/packages/ocp-gordon.nix new file mode 100644 index 0000000..c3dc456 --- /dev/null +++ b/build123d/packages/ocp-gordon.nix @@ -0,0 +1,33 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps +}: +buildPythonPackage +rec { + pname = "ocp-gordon"; + version = "0.2.0"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-c97Tjdyo67lefdB4rD16rMjKQvzo8dF28QQONfuk9gg="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + # setuptools + # setuptools-scm + # wheel + ]; +} diff --git a/build123d/packages/ocpsvg.nix b/build123d/packages/ocpsvg.nix new file mode 100644 index 0000000..af38bf8 --- /dev/null +++ b/build123d/packages/ocpsvg.nix @@ -0,0 +1,37 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps + cadquery-ocp-proxy, + svgelements, +}: +buildPythonPackage +rec { + pname = "ocpsvg"; + version = "0.6.0"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-8I2kNHzJDs01ZTlem9pXRtRquKr9aiaBuwOpwyG1QDk="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + cadquery-ocp-proxy + svgelements + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + setuptools + setuptools-scm + # wheel + ]; +} diff --git a/build123d/packages/trianglesolver.nix b/build123d/packages/trianglesolver.nix new file mode 100644 index 0000000..0a72a3b --- /dev/null +++ b/build123d/packages/trianglesolver.nix @@ -0,0 +1,33 @@ +{ + lib, + buildPythonPackage, + fetchPypi, + setuptools, + setuptools-scm, + wheel, + # runtime deps +}: +buildPythonPackage +rec { + pname = "trianglesolver"; + version = "1.2"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-SvGKreV51cDWQ4mz5lrq8Gz/JjGXYszYWeMmhVmnauo="; + }; + + # do not run tests + doCheck = false; + + buildInputs = [ + ]; + + # specific to buildPythonPackage, see its reference + pyproject = true; + build-system = [ + setuptools + # setuptools-scm + # wheel + ]; +} diff --git a/build123d/template/.gitignore b/build123d/template/.gitignore new file mode 100644 index 0000000..2305bbe --- /dev/null +++ b/build123d/template/.gitignore @@ -0,0 +1,224 @@ +# Generated by nix +.direnv/ +result + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +*.lcov +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +# Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +# poetry.lock +# poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +# pdm.lock +# pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +# pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi/* +!.pixi/config.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule* +celerybeat.pid + +# Redis +*.rdb +*.aof +*.pid + +# RabbitMQ +mnesia/ +rabbitmq/ +rabbitmq-data/ + +# ActiveMQ +activemq-data/ + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +# .idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ +# Temporary file for partial code execution +tempCodeRunnerFile.py + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.toml diff --git a/build123d/template/flake.nix b/build123d/template/flake.nix new file mode 100644 index 0000000..43d7908 --- /dev/null +++ b/build123d/template/flake.nix @@ -0,0 +1,38 @@ +{ + description = "made with build123d"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + flake-parts.url = "github:hercules-ci/flake-parts"; + + project-templates = { + url = "path:///home/reed/code/project-templates"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.flake-parts.follows = "flake-parts"; + }; + }; + + outputs = { + flake-parts, + project-templates, + ... + } @ inputs: + flake-parts.lib.mkFlake {inherit inputs;} { + imports = [ + project-templates.flakeModules.build123d + ]; + + systems = ["aarch64-linux" "x86_64-linux" "aarch64-darwin"]; + + perSystem = {pkgs, ...}: { + krantz.build123d = { + enable = true; + # src = ./.; + + # runtimeDeps = with pkgs; []; + # buildDeps = with pkgs; []; + }; + }; + }; +} diff --git a/flake.nix b/flake.nix index 7c82bc6..83e73cd 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,9 @@ outputs = {flake-parts, ...} @ inputs: flake-parts.lib.mkFlake {inherit inputs;} { imports = [ + flake-parts.flakeModules.flakeModules + + ./build123d ./rust ];