Python calculators for geometry analysis, structural checking, solar calculations, panel optimization, mesh analysis, material estimation, and fabrication cost estimation for AEC computational design
npx skills add https://github.com/Abhinavbwj/Claude-skills-for-Computational-Designers --skill cd-calculator
This skill provides 7 production-grade Python calculators purpose-built for computational design workflows in Architecture, Engineering, and Construction (AEC). Each calculator is a standalone command-line tool that accepts domain-specific parameters and returns precise, well-formatted results.
All calculators share common design principles:
--json flag on every calculator for structured machine-readable output, enabling pipeline integration with parametric design tools, Grasshopper scripts, Dynamo graphs, or custom automation.| # | Calculator | Script | Primary Domain |
|---|-----------|--------|---------------|
| 1 | Geometry Calculator | geometry_calculator.py | Cross-section properties |
| 2 | Structural Checker | structural_checker.py | Member sizing & verification |
| 3 | Solar Calculator | solar_calculator.py | Solar position & radiation |
| 4 | Panel Optimizer | panel_optimizer.py | Facade rationalization |
| 5 | Mesh Analyzer | mesh_analyzer.py | Mesh quality & topology |
| 6 | Material Estimator | material_estimator.py | Quantity takeoff & carbon |
| 7 | Fabrication Calculator | fabrication_calculator.py | CNC / 3D print / laser costing |
cd-calculator/
SKILL.md # This file
references/
formulas.md # Complete formula reference
scripts/
geometry_calculator.py # Cross-section geometry
structural_checker.py # Beam/column/deflection checks
solar_calculator.py # Solar position & radiation
panel_optimizer.py # Panel clustering & waste
mesh_analyzer.py # OBJ mesh quality analysis
material_estimator.py # Material quantity takeoff
fabrication_calculator.py # Fabrication time & cost
Script: scripts/geometry_calculator.py
Computes cross-section properties for common AEC shapes used in structural analysis, fabrication planning, and parametric design. All inputs are in millimeters; all outputs are in mm-based units (mm^2, mm^4, etc.).
| Shape | Description | Key Parameters |
|-------|------------|----------------|
| rectangle | Solid rectangular section | width, height |
| circle | Solid circular section | radius |
| triangle | Solid triangular section | base, height |
| i-beam | Standard I/H section | width, height, flange thickness, web thickness |
| hollow-rect | Rectangular hollow section (RHS) | width, height, wall thickness |
| hollow-circle | Circular hollow section (CHS) | outer radius, inner radius |
| l-shape | L-angle section | width, height, thickness |
| t-shape | T-section | width, height, flange thickness, web thickness |
| polygon | Arbitrary polygon | vertex coordinates |
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --shape | string | -- | Shape type (required) |
| --width | float | mm | Overall width |
| --height | float | mm | Overall height |
| --radius | float | mm | Radius for circular sections |
| --outer-radius | float | mm | Outer radius for hollow circle |
| --inner-radius | float | mm | Inner radius for hollow circle |
| --base | float | mm | Base width for triangle |
| --flange-thickness | float | mm | Flange thickness for I-beam / T-shape |
| --web-thickness | float | mm | Web thickness for I-beam / T-shape |
| --wall-thickness | float | mm | Wall thickness for hollow sections |
| --thickness | float | mm | Leg thickness for L-shape |
| --vertices | string | mm | Comma-separated x,y pairs for polygon |
| --json | flag | -- | Output as JSON |
# Solid rectangle 300 x 500 mm
python geometry_calculator.py --shape rectangle --width 300 --height 500
# Circular section with 150 mm radius
python geometry_calculator.py --shape circle --radius 150
# Standard I-beam
python geometry_calculator.py --shape i-beam --width 200 --height 400 --flange-thickness 15 --web-thickness 10
# Hollow rectangular section
python geometry_calculator.py --shape hollow-rect --width 300 --height 300 --wall-thickness 12
# JSON output for pipeline integration
python geometry_calculator.py --shape rectangle --width 300 --height 500 --json
========================================
GEOMETRY CALCULATOR - Rectangle
========================================
Dimensions:
Width (b) : 300.00 mm
Height (h) : 500.00 mm
Section Properties:
Area : 150,000.00 mm²
Perimeter : 1,600.00 mm
Centroid (x, y) : (150.00, 250.00) mm
Second Moment of Area:
Ix (about x-axis): 3,125,000,000.00 mm⁴
Iy (about y-axis): 1,125,000,000.00 mm⁴
Section Modulus:
Sx : 12,500,000.00 mm³
Sy : 7,500,000.00 mm³
Radius of Gyration:
rx : 144.34 mm
ry : 86.60 mm
========================================
Script: scripts/structural_checker.py
Performs quick structural sizing and verification checks for steel members based on simplified Eurocode 3 and ASCE 7 formulas. Designed for early-stage feasibility assessments, not detailed design.
| Check | Description | Key Inputs |
|-------|------------|------------|
| beam | Bending capacity and section sizing | span, UDL, steel grade |
| column | Axial capacity and buckling check | axial load, height, steel grade |
| deflection | Serviceability deflection check | span, UDL, section properties |
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --check | string | -- | Check type: beam, column, deflection |
| --span | float | mm | Beam span or effective length |
| --load | float | kN/m or kN | UDL for beams, axial for columns |
| --steel-grade | string | -- | S235, S275, S355 |
| --height | float | mm | Column height |
| --buckling-length-factor | float | -- | Effective length factor (default 1.0) |
| --moment-of-inertia | float | mm^4 | Section Ix for deflection check |
| --section | string | -- | Named section (e.g., IPE300) |
| --deflection-limit | string | -- | L/250, L/360, or custom (default L/250) |
| --json | flag | -- | Output as JSON |
# Size a beam: 6m span, 15 kN/m UDL, S355 steel
python structural_checker.py --check beam --span 6000 --load 15 --steel-grade S355
# Check a column: 2000 kN axial, 4m height, S355
python structural_checker.py --check column --load 2000 --height 4000 --steel-grade S355
# Deflection check with named section
python structural_checker.py --check deflection --span 8000 --load 10 --section IPE300
========================================
STRUCTURAL CHECKER - Beam Sizing
========================================
Input:
Span : 6,000 mm (6.00 m)
UDL : 15.00 kN/m
Steel Grade : S355 (fy = 355 MPa)
Bending Analysis:
Max Moment (M) : 67.50 kN·m
Required Sx : 190,141 mm³
Suggested Section: IPE 270 (Sx = 429,000 mm³)
Shear Analysis:
Max Shear (V) : 45.00 kN
Shear Utilization: 0.12 [OK]
Deflection:
Max Deflection : 10.82 mm
Limit (L/250) : 24.00 mm
Utilization : 0.45 [OK]
Overall Status: PASS
========================================
Script: scripts/solar_calculator.py
Computes solar geometry, shadow projections, and photovoltaic parameters for any location on Earth at any date and time. Essential for daylighting analysis, shadow studies, and PV system sizing in early-stage design.
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --latitude | float | deg | Site latitude (-90 to 90) |
| --longitude | float | deg | Site longitude (-180 to 180) |
| --date | string | -- | Date in YYYY-MM-DD format |
| --time | string | -- | Solar time in HH:MM format |
| --annual-summary | flag | -- | Monthly solar data summary |
| --shadow-analysis | flag | -- | Shadow length computation |
| --object-height | float | m | Object height for shadow analysis |
| --pv-tilt | flag | -- | Optimal PV tilt calculation |
| --json | flag | -- | Output as JSON |
# Solar position for London at noon on summer solstice
python solar_calculator.py --latitude 51.5 --longitude -0.12 --date 2025-06-21 --time 12:00
# Annual summary for Dubai
python solar_calculator.py --latitude 25.2 --longitude 55.3 --annual-summary
# Shadow analysis for a 30m building in New York
python solar_calculator.py --latitude 40.7 --longitude -74.0 --shadow-analysis --object-height 30
# Optimal PV tilt for Berlin
python solar_calculator.py --latitude 52.5 --longitude 13.4 --pv-tilt
========================================
SOLAR CALCULATOR - Position
========================================
Location:
Latitude : 51.500° N
Longitude : -0.120° W
Date : 2025-06-21
Solar Position at 12:00:
Altitude : 62.07°
Azimuth : 180.00° (South)
Day Information:
Sunrise : 03:43 solar time
Sunset : 20:21 solar time
Day Length : 16h 38m
Shadow (per 1m object):
Shadow Length : 0.53 m
Shadow Direction : 0.00° (North)
========================================
Script: scripts/panel_optimizer.py
Rationalizes facade panel inventories by clustering similar panel dimensions within a configurable tolerance, then estimates material waste and cost impacts. Critical for design-for-manufacture workflows in curtain wall and cladding systems.
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --panels | string | mm | Comma-separated WxH panel dimensions |
| --tolerance | float | mm | Grouping tolerance (default 10) |
| --sheet-width | float | mm | Raw sheet/stock width |
| --sheet-height | float | mm | Raw sheet/stock height |
| --cost-per-unique | float | $ | Cost premium per unique type (default 500) |
| --json | flag | -- | Output as JSON |
# Basic panel clustering
python panel_optimizer.py --panels "1200x800,1200x810,1205x800,1200x800,1190x795,1200x800,2400x800,2400x810"
# With sheet size for waste estimation
python panel_optimizer.py --panels "1200x800,1200x810,1205x800" --tolerance 15 --sheet-width 3000 --sheet-height 2000
# Cost-focused analysis
python panel_optimizer.py --panels "1200x800,1200x810,1205x800,1500x900,1510x895" --cost-per-unique 750
========================================
PANEL OPTIMIZER - Clustering
========================================
Input Summary:
Total Panels : 8
Raw Unique Sizes : 5
Tolerance : 10 mm
Panel Families:
Family 1 (1200 x 800 mm):
Members: 1200x800, 1200x810, 1205x800, 1190x795, 1200x800, 1200x800
Count: 6
Family 2 (2400 x 800 mm):
Members: 2400x800, 2400x810
Count: 2
Rationalization:
Unique types (before) : 5
Unique types (after) : 2
Reduction : 60.0%
Cost Impact:
Uniqueness premium : $1,000.00
Savings vs. raw : $1,500.00
========================================
Script: scripts/mesh_analyzer.py
Evaluates mesh quality and topological properties for architectural meshes. Reads standard OBJ files or accepts inline vertex/face data. Essential for assessing mesh suitability for FEA, fabrication unfolding, and rendering.
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --file | string | -- | Path to OBJ file |
| --vertices | string | -- | Inline vertices: "x,y,z;x,y,z;..." |
| --faces | string | -- | Inline faces: "i,j,k;i,j,k;..." |
| --json | flag | -- | Output as JSON |
# Analyze an OBJ file
python mesh_analyzer.py --file model.obj
# Analyze inline mesh data (a simple quad split into two triangles)
python mesh_analyzer.py --vertices "0,0,0;1,0,0;1,1,0;0,1,0" --faces "0,1,2;0,2,3"
# JSON output
python mesh_analyzer.py --file facade_mesh.obj --json
========================================
MESH ANALYZER
========================================
Topology:
Vertices : 4
Faces : 2
Edges : 5
Euler Char. (V-E+F): 1
Genus : 0
Is Manifold : Yes
Boundary Edges : 4
Face Area Statistics:
Min Area : 0.500 units²
Max Area : 0.500 units²
Mean Area : 0.500 units²
Std Dev : 0.000 units²
Total Area : 1.000 units²
Aspect Ratio Statistics:
Min : 1.000
Max : 1.414
Mean : 1.207
Faces > 3.0 : 0 (0.0%)
Normal Consistency : PASS (all normals consistent)
Bounding Box:
X range : 0.000 to 1.000 (1.000)
Y range : 0.000 to 1.000 (1.000)
Z range : 0.000 to 0.000 (0.000)
========================================
Script: scripts/material_estimator.py
Estimates material quantities, weights, and embodied carbon for buildings at the early design stage. Operates in two modes: parametric (from building type and GFA) or direct (from explicit material quantities).
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --building-type | string | -- | residential, office, industrial, retail |
| --gfa | float | m^2 | Gross floor area |
| --floors | int | -- | Number of floors |
| --concrete-volume | float | m^3 | Direct concrete volume |
| --steel-ratio | float | kg/m^3 | Reinforcement ratio |
| --glass-area | float | m^2 | Direct glass area |
| --timber-volume | float | m^3 | Direct timber volume |
| --waste-factor | float | -- | Override waste factor (e.g. 1.10) |
| --include-embodied-carbon | flag | -- | Calculate embodied carbon |
| --json | flag | -- | Output as JSON |
# Parametric estimate for a residential building
python material_estimator.py --building-type residential --gfa 5000 --floors 8
# Direct material quantities with embodied carbon
python material_estimator.py --concrete-volume 450 --steel-ratio 120 --glass-area 2000 --include-embodied-carbon
# Office building with custom waste factor
python material_estimator.py --building-type office --gfa 12000 --floors 20 --waste-factor 1.12 --include-embodied-carbon
========================================
MATERIAL ESTIMATOR - Parametric
========================================
Building Parameters:
Type : Residential
Gross Floor Area : 5,000.00 m²
Floors : 8
Floor Area/Floor : 625.00 m²
Material Quantities (incl. waste):
Concrete : 750.00 m³ (1,800.00 tonnes)
Rebar Steel : 67.50 tonnes
Structural Steel : 50.00 tonnes
Glass : 500.00 m² (6.25 tonnes)
Timber : 75.00 m³ (33.75 tonnes)
Total Weight : 1,957.50 tonnes
Embodied Carbon:
Concrete : 187,500 kgCO2e
Rebar Steel : 101,250 kgCO2e
Structural Steel : 75,000 kgCO2e
Glass : 6,875 kgCO2e
Timber : -10,125 kgCO2e (carbon stored)
─────────────────────────────────
Total : 360,500 kgCO2e
Per m² GFA : 72.10 kgCO2e/m²
========================================
Script: scripts/fabrication_calculator.py
Estimates fabrication time and cost for three digital fabrication processes: CNC milling, FDM 3D printing, and laser cutting. Uses industry-standard feed rates, material costs, and process parameters.
| Parameter | Type | Unit | Description |
|-----------|------|------|-------------|
| --process | string | -- | cnc-milling, 3d-print, laser-cut |
| --path-length | float | mm | CNC tool path length |
| --tool-changes | int | -- | Number of CNC tool changes |
| --material | string | -- | Material type (varies by process) |
| --feed-rate | float | mm/min | Override default feed rate |
| --volume | float | cm^3 | 3D print volume |
| --height | float | mm | 3D print height |
| --layer-height | float | mm | 3D print layer height |
| --infill | float | % | 3D print infill (default 20) |
| --cut-length | float | mm | Laser cut total path length |
| --thickness | float | mm | Material thickness for laser |
| --hourly-rate | float | $/hr | Machine/labor rate (default 75) |
| --json | flag | -- | Output as JSON |
# CNC milling job in wood
python fabrication_calculator.py --process cnc-milling --path-length 5000 --tool-changes 3 --material wood
# 3D print estimate
python fabrication_calculator.py --process 3d-print --volume 500 --height 200 --layer-height 0.2
# Laser cutting acrylic
python fabrication_calculator.py --process laser-cut --cut-length 8000 --material acrylic --thickness 6
# Custom hourly rate
python fabrication_calculator.py --process cnc-milling --path-length 12000 --tool-changes 5 --material aluminum --hourly-rate 120
========================================
FABRICATION CALCULATOR - CNC Milling
========================================
Process Parameters:
Material : Wood (Hardwood)
Path Length : 5,000.00 mm
Feed Rate : 3,000 mm/min
Tool Changes : 3
Change Time : 2.00 min each
Time Estimate:
Cutting Time : 1.67 min
Tool Change Time : 6.00 min
Setup Time : 15.00 min
Total Time : 22.67 min (0.38 hr)
Cost Estimate:
Machine Time : $28.33
Material (est.) : $15.00
─────────────────────────────
Total : $43.33
========================================
All calculators support --json output for integration with parametric design pipelines:
import subprocess, json
result = subprocess.run(
["python", "geometry_calculator.py", "--shape", "rectangle",
"--width", "300", "--height", "500", "--json"],
capture_output=True, text=True
)
data = json.loads(result.stdout)
area = data["area"]
Calculators can be chained for multi-step workflows. For example, compute section properties, then verify structural adequacy:
# Step 1: Get section properties
python geometry_calculator.py --shape i-beam --width 200 --height 400 \
--flange-thickness 15 --web-thickness 10 --json > section.json
# Step 2: Check deflection with computed Ix
python structural_checker.py --check deflection --span 8000 --load 10 \
--moment-of-inertia 198540000
All calculators validate inputs and return meaningful error messages:
ERROR: --radius must be a positive number.
ERROR: --shape 'hexagon' is not supported. Choose from: rectangle, circle, triangle,
i-beam, hollow-rect, hollow-circle, l-shape, t-shape, polygon.
ERROR: --inner-radius (160 mm) must be less than --outer-radius (150 mm).
Exit codes: 0 for success, 1 for input errors, 2 for computation errors.
| Quantity | Unit | Notes |
|----------|------|-------|
| Length / dimensions | mm | All geometry inputs |
| Area | mm^2 | Cross-section areas |
| Volume (geometry) | mm^3 | Section volumes per unit length |
| Moment of inertia | mm^4 | Second moment of area |
| Section modulus | mm^3 | Elastic section modulus |
| Force | kN | Structural loads |
| Stress | MPa (N/mm^2) | Steel yield, concrete fck |
| Moment | kN*m | Bending moments |
| Angle | degrees | Solar angles, bearings |
| Building area | m^2 | GFA, floor areas |
| Material volume | m^3 | Concrete, timber |
| Mass | tonnes (1000 kg) | Material weights |
| Carbon | kgCO2e | Embodied carbon |
| Fabrication length | mm | Tool paths, cut lengths |
| Cost | $ (currency units) | Fabrication costs |
| Time | minutes | Fabrication time |
For the complete mathematical formulas behind every calculation, see references/formulas.md. This includes derivations, source standards, and unit conversion tables.
| Version | Date | Changes |
|---------|------|---------|
| 1.0.0 | 2026-03-23 | Initial release with 7 calculators |
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take abhinavbwj/cd-calculator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.