Skip to main content

Hierarchical material library for CAD applications with build123d integration

Project description

mat

Material database for CAD and Monte Carlo particle transport.

Shared TOML data files with language-specific packages:

Package Language Registry Import
py-materials Python PyPI import pymat
rs-materials Rust crates.io use rs_materials::...

Features

Python (py-materials)

  • Hierarchical Materials: Chain grades, tempers, treatments, and vendors
  • Property Inheritance: Children inherit parent properties unless overridden
  • Lazy Loading: Categories load on first access
  • build123d Integration: Apply materials to shapes with automatic mass calculation
  • PBR Rendering: Physically-based rendering properties for visualization
  • periodictable Integration: Auto-fill density from chemical formulas
  • Factory Functions: Temperature/pressure-dependent materials (water, air, saline)

Rust (rs-materials)

  • TOML Database Reader: Loads all 7 material categories with property inheritance
  • Formula Parser: Fractional stoichiometry (Lu1.8Y0.2SiO5 → element/count pairs)
  • Mass/Atom Fraction Conversion: Bidirectional with roundtrip correctness
  • Scintillator Properties: Light yield, decay time, emission peak, refractive index
  • Thread-Safe: Send + Sync for Arc sharing in multi-threaded transport engines

Installation

Python

# With uv (recommended)
uv add git+https://github.com/MorePET/mat.git@latest

# Or specify version
uv add git+https://github.com/MorePET/mat.git@v1.0.0

Rust

[dependencies]
rs-materials = { git = "https://github.com/MorePET/mat.git" }

Quick Start

Creating Materials

    Create materials with convenient parameters:
from pymat import Material

        # Using convenience parameters
        steel = Material(name="Steel", density=7.85)
        # With visualization color
        aluminum = Material(name="Aluminum", density=2.7, color=(0.88, 0.88, 0.88))
        # With formula
        lyso = Material(name="LYSO", formula="Lu1.8Y0.2SiO5", density=7.1)
        assert lyso.formula == "Lu1.8Y0.2SiO5"

Using Property Groups

    Define multiple properties at once using property group dictionaries:
from pymat import Material

        # Define steel with multiple property groups
        steel = Material(
            name="Stainless Steel 304",
            mechanical={"density": 8.0, "youngs_modulus": 193, "yield_strength": 170},
            thermal={"melting_point": 1450, "thermal_conductivity": 15.1},
            pbr={"base_color": (0.75, 0.75, 0.77, 1.0), "metallic": 1.0}
        )        assert steel.properties.pbr.metallic == 1.0

Applying Materials to Shapes

    Apply materials to build123d shapes for visualization and mass calculation:
from build123d import Box
        from pymat import Material

        # Create material
        steel = Material(name="Steel", density=7.85, color=(0.7, 0.7, 0.7))

        # Create shape and apply material
        box = Box(10, 10, 10)
        steel.apply_to(box)        assert box.color is not None

Chainable Material Hierarchy

    Build hierarchies with grades, tempers, and treatments:
from pymat import Material

        # Create base stainless steel
        stainless = Material(
            name="Stainless Steel",
            density=8.0,
            thermal={"melting_point": 1450}
        )

        # Add grade
        s304 = stainless.grade_("304", name="SS 304", mechanical={"yield_strength": 170})
        # Add treatment
        passivated = s304.treatment_("passivated", name="SS 304 Passivated")        assert passivated.density == 8.0  # Inherited through chain

Direct Material Access

    Load materials and access them directly from the library:
from pymat import stainless, aluminum, lyso

        # Direct access to materials
        s316L = stainless.s316L
        al6061 = aluminum.a6061
        lyso_crystal = lyso
        assert "LYSO" in lyso_crystal.name

Physics Properties vs Visualization

    Understand the difference between measured optical properties (physics)
    and rendering properties (visualization):
from pymat import Material

        # Create transparent material
        glass = Material(
            name="Optical Glass",
            color=(0.9, 0.9, 0.9, 0.8),  # Visual: 80% opaque white
            optical={"transparency": 95, "refractive_index": 1.517},  # Physics: 95% transmission
            pbr={"transmission": 0.8}  # Rendering: how transparent it looks
        )

        # Physics properties (measured)
        # Visualization properties (rendering)        assert glass.properties.pbr.transmission == 0.8

Scintillator-Specific Properties

    Define detector crystals with optical physics properties:
from pymat import Material

        lyso_crystal = Material(
            name="LYSO:Ce Crystal",
            density=7.1,
            optical={
                "refractive_index": 1.82,
                "transparency": 92,
                "light_yield": 32000,  # photons/MeV
                "decay_time": 41,  # ns
                "emission_peak": 420,  # nm
            },
            pbr={"base_color": (0.0, 1.0, 1.0, 0.85), "transmission": 0.85}
        )        assert lyso_crystal.properties.pbr.transmission == 0.85

Temperature-Dependent Materials

    Use factory functions for materials with properties that depend on external parameters:
from pymat.factories import water

        # Water at different temperatures
        cold_water = water(4)      # Max density
        room_water = water(20)     # Room temperature
        hot_water = water(80)      # Heated
        # Verify realistic values        assert 0.95 < hot_water.density < 0.98

Air at Different Conditions

    Create air material at specific temperature and pressure:
from pymat.factories import air

        sea_level = air(15, 1.0)      # 15°C, 1 atm
        high_altitude = air(15, 0.5)  # 15°C, 0.5 atm (5500m)

        assert sea_level.density > high_altitude.density

Saline Solutions

    Create solutions with specific concentration and temperature:
from pymat.factories import saline, water

        # Physiological saline at body temperature
        phantom = saline(0.9, temperature_c=37)
        # Saline is slightly denser than pure water at same temperature
        pure_water_37 = water(37)
        # Seawater (3.5% NaCl) at 20°C
        seawater = saline(3.5, temperature_c=20)
        # Higher concentration = higher density
        assert seawater.density > phantom.density

Loading Metal Materials

    Access various metal materials from the metals category:
from pymat import stainless, aluminum, copper

        # Stainless steel variants
        s304 = stainless.s304
        s316L = stainless.s316L
        # Aluminum alloys
        al6061 = aluminum.a6061
        al7075 = aluminum.a7075
        # Copper
        copper_material = copper
        assert copper_material.density == 8.96

Plastic Materials

    Access plastic materials for 3D printing and engineering:
from pymat import peek, pla, pc, pmma

        # Engineering plastics
        # 3D printing plastics
        # Transparent plastics        assert pc.properties.optical.transparency == 89

Scintillator Crystals

    Access scintillator materials for radiation detectors:
from pymat import lyso, bgo, nai

        # LYSO crystal
        # BGO crystal
        # NaI crystal
        assert nai.properties.optical.light_yield == 38000

Gas Materials

    Access gases for simulation and detector design:
from pymat import air, nitrogen, argon, helium, xenon

        # Common gases at STP
        # Detector gases
        assert argon.properties.compliance.radiation_resistant == True

Property Inheritance

    Child materials inherit properties from parents unless overridden:
from pymat import Material

        # Create material hierarchy
        root = Material(
            name="Base",
            density=7.8,
            thermal={"melting_point": 1500, "thermal_conductivity": 50}
        )

        grade1 = root.grade_("G1", mechanical={"yield_strength": 400})
        # Override inherited property
        grade2 = root.grade_("G2", thermal={"melting_point": 1600})
        assert grade2.properties.thermal.melting_point == 1600  # Overridden

Automatic Mass Calculation

    Materials with density automatically calculate shape mass:
from build123d import Box
        from pymat import stainless, aluminum

        # 10x10x10 mm³ box = 1000 mm³ = 1 cm³
        steel_box = Box(10, 10, 10)
        stainless.apply_to(steel_box)

        # Density = 8.0 g/cm³, Volume = 1 cm³ → Mass = 8.0 g
        # Aluminum box
        al_box = Box(10, 10, 10)
        aluminum.apply_to(al_box)

        # Density = 2.7 g/cm³ → Mass = 2.7 g
        assert 2.6 < al_box.mass < 2.8

Material Visualization

    Materials render with appropriate colors for visualization:
from build123d import Box
        from pymat import stainless, aluminum, lyso

        # Create shapes
        steel_part = Box(10, 10, 10)
        al_part = Box(10, 10, 10)
        crystal = Box(10, 10, 10)

        # Apply materials
        stainless.apply_to(steel_part)
        aluminum.apply_to(al_part)
        lyso.apply_to(crystal)

        # Verify colors are set
        # Colors should differ        assert crystal.color != steel_part.color

Material Categories

  • Metals: Stainless steel, aluminum, copper, tungsten, lead, titanium, brass
  • Scintillators: LYSO, BGO, NaI, CsI, LaBr3, PWO, plastic scintillators
  • Plastics: PEEK, Delrin, Ultem, PTFE, ESR, Nylon, PLA, ABS, PETG, TPU, PMMA, PE, PC
  • Ceramics: Alumina, Macor, Zirconia, Glass (borosilicate, fused silica, BK7)
  • Electronics: FR4, Rogers, Kapton, copper PCB, solder, ferrite
  • Liquids: Water, Heavy Water, Mineral Oil, Glycerol, Silicone Oil
  • Gases: Air, Nitrogen, Oxygen, Argon, CO₂, Helium, Hydrogen, Neon, Xenon, Methane, Vacuum

Property Groups

Each material can have properties organized in these domains:

  • Mechanical: density, Young's modulus, yield strength, hardness
  • Thermal: melting point, thermal conductivity, expansion coefficient
  • Electrical: resistivity, conductivity, dielectric constant
  • Optical: refractive index, transparency, light yield (PHYSICS - measured values)
  • PBR: base color, metallic, roughness (VISUALIZATION - rendering appearance)
  • Manufacturing: machinability, printability, weldability
  • Compliance: RoHS, REACH, food-safe, biocompatible
  • Sourcing: cost, availability, suppliers

Advanced Usage

Custom Materials

Create materials using property group dictionaries:

from pymat import Material

my_material = Material(
    name="Custom Alloy",
    mechanical={
        "density": 8.1,
        "youngs_modulus": 200,
        "yield_strength": 450
    },
    pbr={
        "base_color": (0.7, 0.7, 0.75, 1.0),
        "metallic": 1.0,
        "roughness": 0.4
    }
)

Loading from TOML

from pymat import load_toml

materials = load_toml("my_materials.toml")
my_material = materials["my_material"]

Enrichment from Chemical Formulas

from pymat import enrich_from_periodictable

material = Material(name="Aluminum Oxide", formula="Al2O3")
enrich_from_periodictable(material)
print(material.density)  # ~3.95 g/cm³

Optical vs PBR Properties

Important: Understand the distinction between physics and visualization:

  • Optical Properties (optical.*): Measured/calculated physical values

    • transparency: % light transmission (measured)
    • refractive_index: optical property (measured)
    • light_yield: scintillator brightness (measured)
  • PBR Properties (pbr.*): Rendering/visualization parameters

    • base_color: RGBA values (0-1) for display
    • transmission: how transparent it LOOKS in renders
    • metallic: surface finish appearance
    • roughness: surface roughness appearance

These can differ intentionally! A material might be physically transparent (95% optical transmission) but rendered opaque (0% pbr transmission) for CAD clarity.

License

MIT

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_materials-2.1.0.tar.gz (49.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_materials-2.1.0-py3-none-any.whl (41.7 kB view details)

Uploaded Python 3

File details

Details for the file py_materials-2.1.0.tar.gz.

File metadata

  • Download URL: py_materials-2.1.0.tar.gz
  • Upload date:
  • Size: 49.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for py_materials-2.1.0.tar.gz
Algorithm Hash digest
SHA256 54208ea7820987545d4d93f2e4c9ffa1ba7cd12ceb27afa2a4471b558e7122c1
MD5 a4d23e27692840071a463e6810c5716c
BLAKE2b-256 7f5b700a16dc3af35db4a06f190943490c52bf5671bc4c43a92e7f31345b8237

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_materials-2.1.0.tar.gz:

Publisher: release.yml on MorePET/mat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py_materials-2.1.0-py3-none-any.whl.

File metadata

  • Download URL: py_materials-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 41.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for py_materials-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d2c835f31932df6b1ba10b54fe1e2728d153d9a68a1862855a180cba86739eb1
MD5 d8248e76407b104c9923611c21fcbfa8
BLAKE2b-256 00b2bc6e5a1ef185b958c33e48b4efad6551b474f1990805f5101b6e4be60632

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_materials-2.1.0-py3-none-any.whl:

Publisher: release.yml on MorePET/mat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page