Introduction
This course teaches 3D design and digital fabrication using a fully accessible, command-line-driven toolchain centered on OpenSCAD (text-based CAD), 3DMake (non-visual build automation), and accessible editors (VS Code, Notepad++, command-line editors) with screen reader support.
The curriculum is explicitly designed for blind and visually impaired learners who use screen readers (NVDA, JAWS, VoiceOver). It eliminates GUI navigation and visual feedback in favor of keyboard-driven, text-based workflows that screen readers can fully access. Accessibility is not an add-on. It is the foundation of every tool, workflow, and lesson in this curriculum.
Curriculum Structure
Part 1: PowerShell Foundation (6 lessons + 4 guides)
Where to Start: PowerShell Introduction
Before learning 3D design, students master terminal/command-line fundamentals:
- PS Introduction - What is a terminal and why learn it (pre-terminal intro for absolute beginners)
- PS.0 through PS.5 - 6 progressive lessons covering command-line basics through error handling
- Screen Reader Accessibility Guide - NVDA & JAWS reference for terminal navigation
- PowerShell Curriculum Overview - Complete guide with learning paths
Time commitment: ~6 hours
Skills gained: Terminal navigation, file operations, basic scripting, keyboard-only workflow mastery
Part 2: 3dMake Foundation (11 lessons + 4 appendices)
Where to Start: 3dMake Introduction
Main Curriculum: 11 Progressive Lessons
| Part | Lessons | Focus | Duration | Total Hours |
|---|---|---|---|---|
| Foundations | 1-3 | Environment setup, primitives, parametric design | ~3 hours | 3 |
| Verification & Safety | 4-5 | AI verification, safety protocols, materials | ~2 hours | 5 |
| Applied Projects | 6-8 | Practical commands, transforms, advanced design | ~4 hours | 9 |
| Advanced Topics | 9-10 | Automation, troubleshooting, mastery | ~3 hours | 12 |
| Leadership | 11 | Stakeholder-centric design | ~2 hours | 14 |
Total: 14-18 hours instruction + projects
4 Comprehensive Reference Appendices
- Appendix A: Comprehensive Slicing Guide - 7 major slicers (1,500+ lines)
- Appendix B: Material Properties & Selection - 6 materials (1,200+ lines)
- Appendix C: Tolerance Testing & QA Matrix - Measurement procedures (1,200+ lines)
- Appendix D: PowerShell Integration for SCAD Workflows - 5 automation scripts (1,100+ lines)
The Accessible Toolchain
Screen Reader Compatibility Throughout
This course uses tools designed for screen reader access:
- Terminal/Command line - Text-based, fully accessible to NVDA, JAWS, VoiceOver
- OpenSCAD - Free, open-source text-based CAD (no visual-only GUI dependency)
- 3DMake - Command-line build tool eliminating GUI navigation
- Accessible editors - VS Code, Notepad++, Nano, Vim (all keyboard-driven, screen reader friendly)
See Screen Reader Coding Tips (NVDA & JAWS) for detailed keyboard shortcuts and configuration.
3DMake: Non-Visual Build Automation
3DMake makes the entire design-to-print pipeline accessible:
3dm build -> Compiles main.scad to main.stl
3dm info -> Validates geometry and runs diagnostics
3dm slice -> Prepares model for printing
- No GUI navigation needed
- Automation eliminates repetitive manual steps
- Configuration files store parameters as human-readable text
- Error reporting is text-based (screen reader accessible)
- Works with command-line slicers
Iterative, Non-Visual Design
Students learn to design through code and testing, not visual previews:
- Write parametric OpenSCAD code in accessible editors
- Run
3dm buildto compile to printable file - Use measurement-based verification (calipers, scales, functional testing)
- Iterate by editing parameters and rebuilding
- No reliance on 3D preview or visual feedback
Project-Based Learning
Every 3dMake lesson includes hands-on projects:
- Lesson 6: Keycap with embossed text (3dm commands)
- Lesson 7: Phone stand (parametric transforms)
- Lesson 8: Stackable bins (interlocking features, tolerances)
- Lesson 9: Keychain automation (PowerShell batch processing)
- Lesson 10: QA testing + accessibility audit (measurement, troubleshooting)
- Lesson 11: Beaded jewelry holder (stakeholder-driven design)
Each project requires:
- Parametric OpenSCAD code (clean, well-commented)
- Functional prototype (tested, iterated)
- Complete documentation (reflections, measurements, decisions)
Learning Support
Reference Materials
Quick navigation to common topics:
- OpenSCAD Cheat Sheet - Syntax quick-reference
- 3dMake Setup Guide - Installation walkthrough
- VSCode Setup Guide - Accessibility configuration
- Vocabulary Glossary - Course terminology
- Filament Comparison Table - Material reference
- Master Rubric - Project assessment criteria
Navigation
- SUMMARY.md - Complete table of contents
- Curriculum Guide - Detailed overview of all lessons and appendices
- Quick Reference - At-a-glance command and syntax reference
Supplemental Resources & Textbooks
This course is enhanced by comprehensive textbooks and companion materials from the Programming with OpenSCAD project:
Free Textbooks (EPUB Format)
- Programming with OpenSCAD: A Beginner’s Guide to Coding 3D-Printable Objects - Comprehensive reference covering OpenSCAD syntax, geometry concepts, and design patterns. Ideal for deep dives into specific topics and as a reference guide throughout the course.
- Simplifying 3D Printing with OpenSCAD - Focused on practical workflows, optimization, and real-world printing scenarios.
Companion Teaching Resources
- Practice Worksheets - Printable worksheets for visualization practice, decomposition exercises, vocabulary building, and assessment.
- Visual Quick Reference - Command syntax guides and geometry reference.
- Code Solutions Repository - Working OpenSCAD examples organized by topic (3D shapes, transformations, loops, modules, if-statements, advanced techniques).
Getting Started
For Students:
- Start with PowerShell Introduction
- Complete PowerShell lessons (PS.0-PS.5)
- Begin 3dMake Introduction
- Follow Lesson 1: Environmental Configuration
- Continue through Lesson 11
For Instructors:
- Review Curriculum Guide
- Use 11 Teacher Templates for assessment
- Reference Master Rubric for grading
- Check Syllabus for course policies and learning progression
3D Design & Printing Curriculum - Non-Visual Toolchain Edition
Author: Michael Ryan Hunsaker, M.Ed., Ph.D.
Last Updated: 2026-02-20
Target Audience: Blind and visually impaired high school students; anyone learning 3D design and printing through screen reader-accessible workflows.
Overview
This curriculum teaches 3D design and digital fabrication using a fully accessible, command-line-driven toolchain centered on OpenSCAD (text-based CAD), 3DMake (non-visual build automation), and accessible editors (VS Code, Notepad++, command-line editors) with screen reader support. Students progress from foundational command-line skills through guided projects to real-world, stakeholder-driven design challenges.
Who This Course Is For
This course is explicitly designed for blind and visually impaired learners who use screen readers (NVDA, JAWS, VoiceOver). It eliminates GUI navigation and visual feedback in favor of keyboard-driven, text-based workflows that screen readers can fully access.
Accessibility is not an add-on. It is the foundation of every tool, workflow, and lesson in this curriculum.
Core Philosophy
-
Text-First Design: All core work happens in text editors and command-line interfaces-no graphical CAD previews, no mouse-dependent menu navigation.
-
Parametric Thinking: Students learn to express geometry as code using OpenSCAD, enabling precise, reproducible, and iterable designs without visual feedback.
-
Automation and Independence: 3DMake automates the journey from code to printed object, handling compilation, slicing orchestration, and metadata management through simple command-line commands and text configuration files.
-
Screen Reader Mastery: Students develop fluency with accessibility technologies (NVDA, JAWS, VoiceOver) and accessible editors, building skills that apply to careers in software, engineering, and digital fabrication.
-
Real-World Impact: Projects culminate in designing assistive-technology solutions for real stakeholders, combining technical skill with human-centered design and documentation.
Curriculum Structure & Scope/Sequence
Part 1: PowerShell Foundation (Prerequisite - 6-8 hours)
Start here: PowerShell Introduction
Students who have never opened a terminal begin with foundational command-line skills:
| Component | Duration | Content |
|---|---|---|
| PowerShell Introduction | 45 min | What is a terminal, opening PowerShell, first 5 commands, screen reader tricks |
| Screen Reader Accessibility Guide | 1-2 hours | NVDA/JAWS reference, navigation sequences, handling output, keyboard shortcuts |
| PS.0: Basic Commands | 1 hour | pwd, ls, cd, echo, cat, file operations |
| PS.1: Navigation & Files | 1 hour | File system navigation, creating/editing files, organizing work |
| PS.2: Variables & Scripting | 1 hour | Variables, simple scripts, basic logic |
| PS.3: Loops & Iteration | 1 hour | For loops, foreach, batch operations |
| PS.4: Functions & Modules | 1 hour | Functions, parameters, reusable code blocks |
| PS.5: Error Handling | 1 hour | Try-catch, debugging, troubleshooting |
| PowerShell Curriculum Overview | 30 min | Study guide, practice strategies, learning paths |
Outcomes:
- Comfort with terminal/command-line interface
- File system navigation and manipulation
- Basic scripting and automation
- Screen reader optimization for terminal work
- Foundation for 3DMake automation tasks
Note: Students should complete PowerShell Foundation before starting 3dMake Lesson 9 (Automation). Lessons 1-8 can begin without PowerShell, but Lesson 9+ requires command-line fluency.
Part 2: 3dMake Foundation (Main Curriculum - 14-18 hours)
Start here: 3dMake Introduction
11 progressive lessons building from foundational concepts to leadership-level design thinking, organized in 5 parts:
Part 1: Foundations (Lessons 1-3 | ~3 hours)
| Lesson | Focus | Duration | Project |
|---|---|---|---|
| Lesson 1 | Environmental Configuration + How 3D Printing Works | 60-90 min | None |
| Lesson 2 | Primitives & Boolean Operations + Debugging | 60 min | None |
| Lesson 3 | Parametric Architecture & Modules | 60 min | None |
Part 2: Verification & Safety (Lessons 4-5 | ~2 hours)
| Lesson | Focus | Duration | Project |
|---|---|---|---|
| Lesson 4 | AI-Enhanced Verification & Feedback | 45-60 min | None |
| Lesson 5 | Safety Protocols & Material Introduction | 60-90 min | None |
Part 3: Applied Projects (Lessons 6-8 | ~4 hours)
| Lesson | Focus | Duration | Project |
|---|---|---|---|
| Lesson 6 | Practical 3dm Commands & Text Embossing | 60-90 min | Customizable Keycap |
| Lesson 7 | Parametric Transforms & Assembly | 75-90 min | Phone Stand |
| Lesson 8 | Advanced Parametric Design & Interlocking | 90-120 min | Stackable Bins |
Part 4: Advanced Topics (Lessons 9-10 | ~3 hours)
| Lesson | Focus | Duration | Project |
|---|---|---|---|
| Lesson 9 | Automation & 3dm Workflows (requires PS Foundation) | 60-90 min | Batch Processing Automation |
| Lesson 10 | Troubleshooting & Mastery with Measurement | 120-150 min | QA Testing + Accessibility Audit |
Part 5: Leadership (Lesson 11 | ~2 hours)
| Lesson | Focus | Duration | Project |
|---|---|---|---|
| Lesson 11 | Stakeholder-Centric Design & Design Thinking | 90-120 min | Beaded Jewelry Holder |
Total: 14-18 hours of instruction + projects
4 Comprehensive Reference Appendices
Located in /3dMake_Foundation/ alongside the lessons:
Appendix A: Comprehensive Slicing Guide (1,500+ lines)
Reference for 7 major slicers:
- PrusaSlicer, Bambu Studio, Cura, SuperSlicer, OrcaSlicer, IdeaMaker, Fusion 360
- Setup guides, parameter explanations, troubleshooting, command-line integration
- Use when: Slicing questions, switching slicers, quality issues
Appendix B: Material Properties & Selection (1,200+ lines)
Complete material reference for 6 materials:
- PLA, PETG, ABS, TPU, Polycarbonate, Nylon
- Properties tables, printing parameters, quality verification, cost analysis
- Use when: Choosing material, troubleshooting prints, cost analysis
Appendix C: Tolerance Testing & QA Matrix (1,200+ lines)
Measurement-based quality assurance procedures:
- Caliper techniques, weight verification, functional testing, tolerance stack-up
- Step-by-step procedures, checklist templates, CSV tracking
- Use when: Starting a project, verifying dimensions, quality issues
Appendix D: PowerShell Integration for SCAD Workflows (1,100+ lines)
Complete automation guide for PowerShell + 3dMake:
- 5 complete PowerShell scripts for workflow automation
- Parametric sweeps, batch processing, print logging, printer communication
- Use when: Automating tasks, testing variations, batch printing
Learning Progression: Student Roles
Students move through roles across the curriculum:
| Phase | Role | Core Tools | Focus |
|---|---|---|---|
| PowerShell Foundation | Observer/Learner | Terminal, command line | CLI fundamentals and keyboard navigation |
| 3dMake Lessons 1-5 | Observer/Learner | OpenSCAD, 3DMake, editor | Using CLI tools, safety, concepts, measurement |
| 3dMake Lessons 6-8 | Operator | Editor, OpenSCAD, 3DMake, slicer | Hands-on practice with structured projects |
| 3dMake Lessons 9-10 | Designer | Full toolchain | Parametric design, automation, troubleshooting |
| 3dMake Lesson 11 | Problem-Solver | Full toolchain + documentation | Stakeholder design, real-world impact |
The Accessible Toolchain: How It Works
OpenSCAD - Text-Based 3D Design
OpenSCAD is a free, open-source CAD tool that uses a programming language to describe 3D geometry. Students write code that defines shapes, transforms them, and combines them using Boolean operations.
Why OpenSCAD?
- Screen reader friendly: All work happens in a text editor; no visual-only 3D preview.
- Repeatable: Code is version-controlled, documented, and shareable.
- Parametric: Variables allow students to design once and generate variations by changing numbers.
- No visual dependency: Students reason about geometry through code structure and testing.
3DMake - The Non-Visual Build Bridge
3DMake is a command-line tool that automates the journey from OpenSCAD code to a printable file:
3dm build
3dm info
3dm slice
Why 3DMake?
- No GUI navigation: All interaction is keyboard-driven and text-based.
- Automation: Eliminates repetitive manual steps.
- Metadata tracking: Configuration files store parameters as human-readable text.
- Error reporting: Diagnostic output is text that screen readers can read aloud.
Accessible Editors
Students write OpenSCAD code using screen reader-accessible editors:
- VS Code (Windows, macOS, Linux): Industry-standard with built-in screen reader support
- Notepad++ (Windows): Lightweight, keyboard-driven, excellent screen reader support
- Command-line editors (Nano, Vim, Emacs): Full keyboard control, no mouse needed
Prerequisites by Section
| Section | Prerequisites | What You’ll Learn |
|---|---|---|
| PowerShell Foundation | None - start here | Terminal basics, keyboard navigation, file operations, basic scripting |
| 3dMake Lessons 1-5 | PowerShell Foundation | 3D printing concepts, safety, measurement, OpenSCAD basics, debugging |
| 3dMake Lessons 6-8 | Lessons 1-5 | Building projects, parametric design, transforms, tolerances |
| 3dMake Lessons 9-10 | Lessons 6-8 (Lesson 9 requires PS Foundation) | Automation, troubleshooting, advanced measurement and QA |
| 3dMake Lesson 11 | Lessons 9-10 | Stakeholder design, real-world prototyping, leadership |
Grading Rubric
All projects are scored on a 0-9 scale across three equally weighted categories (3 points each):
| Category | Points | What We Measure |
|---|---|---|
| Problem & Solution | 0-3 | Does the design solve the stated problem? Are all functional requirements met? |
| Design & Code Quality | 0-3 | Is the OpenSCAD code clean, well-commented, and well-structured? Does the print work well? Is there evidence of iteration? |
| Documentation | 0-3 | Are all sections complete? Are reflections thoughtful and specific? Are measurements recorded? |
Category 1: Problem & Solution (0-3 points)
| Score | Description |
|---|---|
| 3 | The prototype clearly and effectively solves the stated problem. All functional requirements are met. The solution shows evidence of testing against the requirements. |
| 2 | The prototype mostly meets the problem. Most functional requirements are met. Minor gaps between the design and the requirements. |
| 1 | The prototype partially addresses the problem. Several functional requirements are not met or were not clearly tested. |
| 0 | The prototype does not address the stated problem, or no functional requirements were established. |
Category 2: Design & Code Quality (0-3 points)
OpenSCAD code is central to this course. We evaluate the clarity, structure, and documentation of your code as much as the print quality.
| Score | Description |
|---|---|
| 3 | Code is clean, well-organized, and thoroughly commented. Variables/modules are used appropriately. Print quality is excellent. Design shows original thinking and at least one meaningful iteration. |
| 2 | Code works but lacks clear structure or comments. Variables are used but could be better named. Print quality is acceptable. Some iteration evident. |
| 1 | Code is functional but poorly organized. Comments are minimal or missing. Print quality has defects. Little or no iteration. |
| 0 | Code does not work, is not submitted, or shows no original thinking. Print is not functional. |
Category 3: Documentation (0-3 points)
| Score | Description |
|---|---|
| 3 | All required sections are present, complete, and specific. Reflections are thoughtful and reference specific decisions, problems encountered, and learning. Photos/measurements are included. |
| 2 | Most required sections are present. Some sections are vague or missing detail. Reflections show some thought but are brief or generic. |
| 1 | Documentation is incomplete. Major sections are missing or consist of one-line responses. Reflections are minimal. |
| 0 | Documentation is not submitted or is essentially empty. |
Score Interpretation
| Total Score | Interpretation | Next Step |
|---|---|---|
| 8-9 | Excellent work | Move on to next project |
| 6-7 | Good work with room for improvement | Move on; instructor may suggest revisiting one element |
| 4-5 | Meets basic expectations | Resubmission of specific weak areas recommended |
| 2-3 | Does not meet expectations | Resubmission required |
| 0-1 | Missing major deliverables | Meet with instructor; create a completion plan |
Resubmission Policy
Students may resubmit any project as many times as they need to improve their score. Resubmissions must include a one-paragraph explanation of what was changed and why. The resubmission score replaces the original score.
Quick Links to Essential Tools & Setup
Core Design Toolchain
OpenSCAD:
- OpenSCAD Download - Free, cross-platform CAD (all major OS)
- OpenSCAD Documentation - Official reference
- OpenSCAD Cheat Sheet - Quick syntax reference
- OpenSCAD on GitHub - Source code and issue tracking
3DMake:
- 3DMake Documentation & Installation - Command-line build tool for OpenSCAD
- 3dMake Quick Reference - Command and workflow reference
- 3DMake Terminal Quick Start - CLI basics for new users
Editors:
- VS Code Download - Free, screen-reader-accessible code editor
- VS Code OpenSCAD Extension - Syntax highlighting for OpenSCAD
- Notepad++ Download - Free, lightweight Windows editor with OpenSCAD syntax support
- Vim/Neovim - Terminal-based editor with full keyboard control
Screen Reader & Accessibility
Screen Readers:
- NVDA Download - Free, open-source screen reader (Windows)
- JAWS Screen Reader - Commercial screen reader (Windows, macOS)
- VoiceOver (macOS/iOS) - Built-in Apple screen reader
- NVDA User Guide - Complete NVDA documentation
Accessibility Configuration:
- Screen Reader Coding Tips (NVDA & JAWS) - Keyboard shortcuts and configuration
- VSCode Setup Guide - Accessibility-focused editor configuration
- Accessibility in VS Code - Official VS Code accessibility guide
- JAWS Script Repository - Custom JAWS scripts for developers
Terminal & Command Line:
- PowerShell & Command Line Fundamentals - Terminal navigation for screen reader users
- Windows Terminal Accessibility - Official accessibility guide
- Screen Reader Tips for Linux - Linux-specific guidance
Slicing & Printing
Slicer Software & Documentation:
- PrusaSlicer Documentation - Official Prusa slicer
- PrusaSlicer Download - Free slicer optimized for Prusa printers
- Cura Slicer Documentation - Official UltiMaker Cura documentation
- Cura Slicer Download - Free, open-source slicer for most printers
- OrcaSlicer Documentation - Community wiki for OrcaSlicer
- OrcaSlicer Download - Free, open-source slicer fork with advanced features
- Bambu Studio Documentation - Official Bambu Lab slicer documentation
- Bambu Studio Download - Free slicer optimized for Bambu Lab printers
- SuperSlicer Documentation - Community wiki for SuperSlicer
- SuperSlicer Download - Free, open-source advanced slicer
- IdeaMaker Documentation - Anycubic/Raise3D slicer documentation
- IdeaMaker Download - Free slicer for Anycubic and other printers
- Slic3r Documentation - Original open-source command-line slicer
- Fusion 360 Slicer - Integrated slicer in Fusion 360 CAD
- Repetier-Host Documentation - Host software with integrated slicing
- Appendix A: Comprehensive Slicing Guide - Detailed comparison and setup guides for all major slicers
OpenSCAD Learning
Tutorials & Documentation:
- OpenSCAD Official Tutorials - Step-by-step guides from the OpenSCAD project
- OpenSCAD User Manual - Community-maintained comprehensive reference
- OpenSCAD by Example - Practical examples with code
- CadHub OpenSCAD Guide - Real-world applications and best practices
Advanced Resources:
- BOSL2 Library Documentation - Advanced shapes and transforms
- OpenSCAD Libraries - Complete library ecosystem
- Dotscad - Parametric design patterns library
- OpenSCAD Performance Optimization - Tips for faster rendering
Supplemental Textbooks
EPUB Textbooks:
- Programming with OpenSCAD: A Beginner’s Guide to Coding 3D-Printable Objects - Complete reference textbook (EPUB format)
- Simplifying 3D Printing with OpenSCAD - Practical workflows and applications (EPUB format)
Online Companion Resources:
- Programming with OpenSCAD Companion Resources - Practice worksheets and teaching materials
- Visual Quick Reference Guides - Command syntax and geometry reference
- Code Solutions Repository - Working examples for all exercises
- Teaching Tech 3D Printing Guide - Video tutorials and workflows
Assistive Technology Design & Research
Organizations & Communities:
- e-NABLE Community Foundation - 3D printed hand/arm devices
- Makers Making Change - Open-source assistive designs
- NIH 3D Print Exchange - Medical and assistive models
- Printables - Assistive Technology - Community models
- Thingiverse - Adaptive/Accessibility - Model repository
- YouMagine - Open-source design platform
Research & Resources:
- MIT D-Lab - Design for development and assistive technology
- Design for All Institute - Universal design principles
- Inclusive Design Toolkit - Design resources for disability
Community & Forums
OpenSCAD Community:
- OpenSCAD Discord - Real-time chat and support
- OpenSCAD Reddit - Discussion forum for OpenSCAD users
- OpenSCAD Google Group - Email-based discussion list
- CadHub Community - Collaborative 3D design community
3D Printing Community:
- Reddit r/3Dprinting - General 3D printing community
- Prusa Community - Prusa-specific forum
- Bambu Lab Forum - Bambu printer community
- 3DPrinting Stack Exchange - Q&A platform for 3D printing
Troubleshooting Resources
Common Issues:
- Common Issues and Solutions - Course-specific troubleshooting guide
- Diagnostic Checklist - Step-by-step diagnostics
- OpenSCAD FAQ - Frequently asked questions
- PrusaSlicer Troubleshooting - Prusa-specific solutions
Tools for Debugging:
- Netfabb Online - Free online mesh repair tool
- Meshmixer - Advanced mesh editing and repair
- MeshLab - Open-source mesh processing
- STL Viewer Online - Quick STL preview without installing software
Printer-Specific Guides
Prusa Printers:
- Prusa Knowledge Base - Official documentation and troubleshooting
- Prusa Assembly Guides - Setup and calibration
Bambu Lab Printers:
- Bambu Lab Wiki - Complete documentation
- Bambu Lab Support - Customer support resources
Anycubic Printers:
- Anycubic Support - Official support
- Anycubic Community - User forum
Creality Printers:
- Creality Documentation - Official guides
- Creality Support - Customer service
Local Resources: Utah Makerspaces & Community Printing
Public Library Make Spaces
Salt Lake City Public Library:
- SLC Public Creative Lab - Main Library (Level 1)
- Hardware: Prusa i3 MK3, LulzBot Taz 5, Elegoo Mars 2 (resin)
- Pricing: Free for prints under 6 hours; $0.50/hr + material cost otherwise
- Website: https://services.slcpl.org/creativelab
Salt Lake County Library System:
- County Library “Create” Spaces - Locations: Daybreak, Granite, Kearns, Syracuse, Tooele, and more
- Hardware: Flashforge Adventurer 5M Pro, LulzBot Workhorse, laser cutters
- Pricing: $0.06 per gram of filament used
- Website: https://www.slcolibrary.org/what-we-have/create
Makerspaces & Community Centers
Make Salt Lake:
- Location: 663 W 100 S, Salt Lake City, UT 84101
- Website: https://makesaltlake.org/
- Equipment: Full metal shop, CNC machines, large-scale FDM and resin printing
- Membership: Required; offers certification classes for advanced tools
- Community: Active maker community with regular workshops
University of Utah Maker Spaces:
- Lassonde Studios - Entrepreneurship and innovation hub
- Marriott Library ProtoSpace - 3D printing and fabrication
- Eccles Health Sciences Library Technology Hub - Biomedical device development
Utah Valley University:
- UVU Maker Hub - Open to community members
- Equipment: Large format 3D printers, laser cutters, CNC machines
School & Educational Programs
Salt Lake City Schools:
- STEM Lab programs in select elementary and secondary schools
- Advanced manufacturing pathways in Career and Technical Education (CTE)
- Contact: Salt Lake City School District STEM Coordinator
Weber School District:
- Advanced Manufacturing Programs
- 3D Design and Fabrication courses in multiple high schools
Online Printing Services (When Local Access Unavailable)
National & International Services:
- Shapeways - Professional print service with multiple materials
- Sculpteo - Online 3D printing platform
- Ponoko - Custom manufacturing platform
- 3D Hubs - Community-based distributed manufacturing
- Local Motors - Custom manufacturing and consulting
Material Suppliers (Utah & Regional)
Local Filament Suppliers:
- MatterHackers - Online with local Utah roots; wide material selection
- Hatchbox - Reliable filament available at local retailers
- Prusament - Premium Prusa filament
Regional Retailers:
- Local Best Buy, Micro Center, and Fry’s Electronics locations carry common filaments
- Amazon Prime for next-day delivery on most materials
- Local makerspaces often sell filament at cost
Recycling & Sustainability
3D Printing Waste:
- Fused Filament Fab - Filament recycling programs
- Salt Lake City Recycling Center: Accepts PLA and PETG at select locations
- Local makerspaces: Often have filament recycling programs
Professional Development & Certifications
Organizations Offering Training:
- Make Salt Lake Workshops - Regular classes and certifications
- University of Utah Continuing Education - Professional development courses
- Weber State University - Continuing education programs
Troubleshooting & Getting Help
If you’re stuck:
- Check Common Issues and Solutions
- Post in OpenSCAD Discord or Reddit
- Visit your local makerspace for hands-on support
- Check printer-specific forums (Prusa, Bambu Lab, Anycubic, etc.)
For accessibility support:
- Contact your NVDA/JAWS vendor directly for technical assistance
- Post accessibility-specific questions in OpenSCAD community
- This course’s GitHub Issues page for curriculum-specific questions
PowerShell for Screen Reader Users - Complete Curriculum Overview
Welcome! This curriculum teaches you how to use PowerShell (Windows Terminal) as a screen reader user, starting from zero experience and building to professional-level skills.
Last Updated: February 2026
Total Duration: 12-15 hours of instruction + practice
Target Users: Anyone with a screen reader (NVDA, JAWS, or other)
Why Learn PowerShell?
For Everyone
- Speed: Text commands are often faster than clicking through menus
- Automation: Repeat tasks automatically instead of doing them manually
- Precision: Exact control over what your computer does
- Scripting: Create programs that solve real problems
For 3D Printing (Our Focus)
- Batch Operations: Process 100s of 3D models at once
- Accessibility: Many 3D design tools are scriptable
- Reproducibility: Same settings, every time
- Integration: Connect OpenSCAD, slicers, and tools together
For Screen Reader Users Specifically
- Great Accessibility: PowerShell works perfectly with NVDA, JAWS, and others
- No Mouse Needed: Everything is keyboard-based
- Text-Based: Output is naturally readable by screen readers
- Stability: Unlike GUIs, terminal interactions are consistent
Curriculum Structure
Phase 1: Absolute Beginner -> Comfortable User
| Lesson | Duration | What You’ll Learn |
|---|---|---|
| Screen Reader Accessibility Guide | 30 min | Screen reader tips specific to PowerShell (READ FIRST) |
| PS-Pre: Your First Terminal | 45 min | Opening PowerShell, first commands, basic navigation |
| PS-0: Getting Started | 30 min | Paths, shortcuts, tab completion |
| PS-1: Navigation | 45 min | Moving around the file system confidently |
Goal: You can navigate to any folder and see what’s in it with your screen reader.
Phase 2: Intermediate User -> Power User
| Lesson | Duration | What You’ll Learn |
|---|---|---|
| PS-2: File & Folder Manipulation | 60 min | Create, copy, move, delete files/folders |
| PS-3: Input, Output & Piping | 60 min | Chain commands together, redirect output |
| PS-4: Environment Variables & Aliases | 45 min | Automate settings, create shortcuts |
| PS-5: Filling in the Gaps | 45 min | Profiles, history, debugging |
Goal: You can create folders, manage files, and combine commands to accomplish complex tasks.
Phase 3: Professional Skills (Beyond Curriculum)
These topics extend beyond this curriculum but are natural next steps:
| Topic | When to Learn |
|---|---|
| Scripting (.ps1 files) | After PS-5 |
| Functions & Loops | After PS-5 |
| Error Handling | After PS-5 |
| Remote Administration | Advanced |
| 3D Printing Integration | After all above |
How to Use This Curriculum
If You’ve Never Used a Terminal Before
Start here and go in order:
- Read Screen Reader Accessibility Guide completely
- Do PS-Pre: Your First Terminal exercises
- Continue with PS-0, PS-1, etc.
Don’t skip steps - each builds on the previous one.
If You’ve Used a Terminal Before (But Not with a Screen Reader)
Start here:
- Skim Screen Reader Accessibility Guide (you’ll recognize most tips)
- Quickly review PS-Pre (basics with screen reader focus)
- Move to PS-0 for deeper learning
If You’re Experienced with Terminal + Screen Reader
You can:
- Jump to specific lessons you need (PS-2, PS-3, etc.)
- Use the Quick Reference sections
- Skip the practice exercises, do the quizzes to verify knowledge
How Each Lesson is Structured
Every Lesson Contains:
- Learning Objectives - What you’ll be able to do
- Key Commands - The important ones to memorize
- Step-by-Step Examples - How to actually do it
- Practice Exercises - Hands-on work
- Quiz Questions - Check your understanding
- Extension Problems - Go deeper if interested
How to Get Through Each Lesson:
- Read the learning objectives
- Do the step-by-step examples alongside
- Complete the practice exercises (critical!)
- Take the quiz (don’t cheat)
- Try extension problems if you have time
- Move to next lesson when quiz is solid
Estimated time: 30-60 minutes per lesson (depends on practice time)
Screen Reader Tips Throughout the Curriculum
Every Lesson Includes:
- [SR] symbols marking screen reader-specific sections
- Tips for NVDA and JAWS users separately
- Solutions for common accessibility issues
- Workarounds for long outputs
Screen Reader Accessibility Guide
This is your companion resource used throughout:
- Detailed NVDA keyboard shortcuts
- Detailed JAWS keyboard shortcuts
- Solutions to common problems
- Pro tips for efficiency
Keep it open or printed as you work through lessons.
Quick Start Guide (First 15 Minutes)
If You Have 15 Minutes Right Now:
- Open PowerShell (Windows key -> type PowerShell -> Enter)
- Run these commands:
pwd ls -n cd Documents pwd - See how your screen reader reads each output
- Try Tab completion:
- Type
cd Dand press Tab - Hear PowerShell auto-complete to Documents (or similar)
- Type
- Create a file:
echo "I am learning PowerShell" > learning.txt cat learning.txt
That’s it! You’ve done the key concepts. Now read PS-Pre for the details.
Common Questions Before Starting
Q: Do I have to use PowerShell? What about Command Prompt (cmd.exe)?
A: Command Prompt works, but PowerShell is better. PowerShell is:
- More powerful
- Better for modern tools
- Screen-reader-friendly
- The future of Windows automation
Use PowerShell for this curriculum.
Q: What if I use a different screen reader (not NVDA or JAWS)?
A: The fundamentals work the same. Check your screen reader’s documentation for the equivalent of these commands:
- Read current line
- Read to end of screen
- Read next/previous page
Most screen readers have these features.
Q: I’m intimidated. Is this really for me?
A: YES. This curriculum is specifically designed for people with no terminal experience AND with screen readers. You’ll start with absolute basics. There’s nothing to be afraid of - we’ve written this specifically to make it accessible.
Q: How long will this take?
A: Realistically:
- Minimum (just lessons, no exercises): 5-6 hours
- Normal (lessons + exercises): 12-15 hours
- With extension problems: 18-20+ hours
Spread it over weeks or months. Go at your pace.
Q: What if I forget things?
A: That’s normal and expected. Solutions:
- Come back to this page for the overview
- Jump back to that lesson for a quick review
- Use the quiz questions to self-test
- Check the Screen Reader Accessibility Guide for troubleshooting
Q: Will this help me with 3D printing?
A: Absolutely. Near the end of the 3dMake curriculum, you’ll use PowerShell to:
- Batch-process 3D models
- Automate slicing tasks
- Run scripts that generate designs
- Integrate tools together
Suggested Study Schedule
Beginner Goal (Weeks 1-2)
Week 1:
- Day 1: Read Screen Reader Accessibility Guide
- Day 2: PS-Pre lesson
- Day 3: PS-0 lesson
- Day 4: Practice PS-0 and PS-1 exercises
- Day 5: PS-1 lesson
Week 2:
- Review PS-0 and PS-1 quizzes
- Practice navigation exercises daily
- Do extension problems for PS-0 and PS-1
- Feel confident with file system navigation
Goal: Know how to navigate to any folder, list its contents, and understand paths.
Intermediate Goal (Weeks 3-5)
Week 3:
- PS-2 lesson (file manipulation)
- Complete exercises
- Take quiz
Week 4:
- PS-3 lesson (piping and output)
- Complete exercises
- Take quiz
Week 5:
- PS-4 and PS-5 lessons
- Complete all quizzes
- Practice combining commands
Goal: Create, modify, and move files. Combine commands for complex tasks.
Advanced Goal (Weeks 6+)
- Review any lessons you need
- Do all extension problems
- Start learning PowerShell scripting
- Begin 3D printing integration
Success Criteria
By the End of PS-1, You Should:
- Know where you are at all times (
pwd) - See what’s around you (
ls -n) - Navigate confidently with your screen reader
- Use Tab completion comfortably
- Understand absolute and relative paths
- Pass the PS-0 and PS-1 quizzes
By the End of PS-3, You Should:
- Create and delete files and folders
- Copy and move files
- Redirect output to files
- Pipe commands together
- Save long outputs to readable files
- Pass all quizzes PS-0 through PS-3
By the End of PS-5, You Should:
- Use command history effectively
- Create aliases and functions
- Understand your PowerShell profile
- Handle screen reader edge cases
- Feel comfortable experimenting
- Pass all quizzes
Important Rules
Rule 1: Always Know Where You Are
Every session, first thing:
pwd
If you don’t know your path, you’ll get lost. Don’t move until you know where you are.
Rule 2: Check Before You Delete
Before deleting anything:
ls -n
Make sure you’re deleting the right thing. Once it’s gone, it’s gone.
Rule 3: Use -n with ls
Always:
ls -n
Never:
ls
The -n (names only) is screen reader friendly. The default view is hard to read.
Rule 4: When Lost, Redirect to a File
If output is confusing:
command-name > output.txt
notepad.exe output.txt
This is always clearer for screen readers than terminal output.
Rule 5: Save Everything You Create
Every exercise, save your work:
mkdir my-practice-folder
cd my-practice-folder
Create a “learning” folder and keep everything there.
Troubleshooting: “Nothing Works!”
If you’re stuck:
-
Can’t hear PowerShell at all?
- Make sure screen reader is running BEFORE PowerShell
- Try Alt+Tab to cycle to PowerShell window
- Restart both screen reader and PowerShell
-
Commands not working?
- Check spelling carefully
- Make sure you pressed Enter
- Try
Get-Help command-name
-
Can’t read the output?
- Redirect to file:
command > output.txt - Open in Notepad:
notepad.exe output.txt - This always works
- Redirect to file:
-
Something ran forever?
- Press Ctrl+C to stop it
-
Completely confused?
- Go back to PS-Pre and start over
- Work through every single exercise slowly
- Ask for help (ask an instructor or peer)
Resources
Official Documentation
- PowerShell Docs: https://docs.microsoft.com/powershell/
- Windows Terminal Docs: https://docs.microsoft.com/windows/terminal/
Screen Reader Guides
- NVDA: https://www.nvaccess.org/documentation/
- JAWS: https://www.freedomscientific.com/support/
Learning Resources
- Microsoft Learn: https://learn.microsoft.com/en-us/training/modules/
- PowerShell ISE: Built-in editor (open with
ise)
3D Printing Integration
- OpenSCAD Scripting: See 3dMake lessons in this curriculum
- Batch Processing: See PS-3 and PS-5 for real examples
Getting Help
If You’re Stuck:
- Read the relevant section of Screen Reader Accessibility Guide
- Try a different approach from the “Solutions” sections
- Go back one lesson and strengthen those concepts
- Ask an instructor or peer with specific questions
Before You Ask for Help, Prepare:
- What command are you running?
- What do you expect to happen?
- What actually happened?
- What error message did you hear?
Example: “I ran cd Desktop but my screen reader said ‘Cannot find path’. I expected to go to the Desktop folder.”
This helps others help you quickly.
Next Steps
- Right now: Read the Screen Reader Accessibility Guide completely
- Next session: Start PS-Pre and do all exercises
- Keep going: One lesson per day/week at your pace
- Practice: Do exercises, not just read
- Check yourself: Take the quizzes honestly
- Celebrate: Each lesson completed is a real skill gained
Final Thoughts
Learning to use PowerShell with a screen reader is absolutely achievable. Many people do it successfully. This curriculum was designed based on real experiences of screen reader users.
You’ve got this. Start with PS-Pre, take it slow, do the exercises, and ask questions when stuck.
Welcome to the PowerShell community!
Curriculum Map (For Reference)
START HERE v
+---- Screen Reader Accessibility Guide (reference throughout)
+---- PS-Pre: Your First Terminal (absolute beginner entry point)
+---- PS-0: Getting Started (paths & navigation foundations)
+---- PS-1: Navigation (comfortable moving around)
+---- PS-2: File & Folder Manipulation (create/move/delete)
+---- PS-3: Input, Output & Piping (chain commands)
+---- PS-4: Environment Variables & Aliases (automation)
+---- PS-5: Filling in the Gaps (profiles & history)
+---- PS_Unit_Test (comprehensive practice & assessment)
v
NEXT: 3D Printing Integration Lessons
v
ADVANCED: PowerShell Scripting
Questions? Feedback? Stuck? Refer back to this page and the Screen Reader Accessibility Guide. You’ve got everything you need.
Now open PS-Pre and let’s get started!
Screen Reader Accessibility Guide for PowerShell
Target Users: NVDA, JAWS, and other screen reader users
Last Updated: 2026
This guide is used throughout the PowerShell Foundation curriculum to help screen reader users navigate and work efficiently with the terminal.
Table of Contents
- Getting Started with Screen Readers
- NVDA-Specific Tips
- JAWS-Specific Tips
- General Terminal Accessibility
- Working with Long Output
- Keyboard Shortcuts Reference
- Troubleshooting
Getting Started with Screen Readers
Which Screen Reader Should I Use?
Both NVDA and JAWS work well with PowerShell, but they have different strengths:
| Feature | NVDA | JAWS |
|---|---|---|
| Cost | Free | Commercial (paid) |
| Installation | Simple | Complex but thorough |
| PowerShell Support | Excellent | Excellent |
| Learning Curve | Gentle | Steeper |
| Customization | Good | Extensive |
Recommendation: Start with NVDA if you’re new to screen readers. Both will work for this curriculum.
Before You Start
- Make sure your screen reader is running before opening PowerShell
- Open PowerShell and let your screen reader read the title and prompt
- If you don’t hear anything, press Alt+Tab to cycle windows and find PowerShell
- Use your screen reader’s screen review features to understand the layout
NVDA-Specific Tips
NVDA is free and available from https://www.nvaccess.org/
Key Commands for PowerShell
| Command | What It Does |
|---|---|
| NVDA+Home | Read the current line (your command or output) |
| NVDA+Down Arrow | Read from cursor to end of screen |
| NVDA+Up Arrow | Read from top to cursor |
| NVDA+Page Down | Read next page |
| NVDA+Page Up | Read previous page |
| NVDA+F7 | Open the Review Mode viewer (can scroll through text) |
| NVDA+Shift+Right Arrow | Read next word |
| NVDA+Shift+Down Arrow | Read entire screen |
| NVDA+End | Jump to end of line |
| NVDA+Home | Jump to start of line |
Example: Reading Long Output
Scenario: You ran ls -n and it listed 50 files. You can’t hear them all.
Solution with NVDA:
- After the command finishes, press NVDA+Home to read the current line
- Press NVDA+Down Arrow repeatedly to read all output
- Or press NVDA+F7 to open Review Mode and use arrow keys to scroll
NVDA Settings for PowerShell
Enable verbosity for better feedback:
- Press NVDA+Ctrl+V to open NVDA menu
- Go to Preferences -> Settings
- Under “Speech”, increase verbosity
- Look for “Report font changes” and enable it (helps with code)
JAWS-Specific Tips
JAWS is a commercial screen reader available from https://www.freedomscientific.com/
Key Commands for PowerShell
| Command | What It Does |
|---|---|
| Insert+Down Arrow | Read line by line downward |
| Insert+Up Arrow | Read line by line upward |
| Insert+Page Down | Read next page of text |
| Insert+Page Up | Read previous page of text |
| Insert+End | Jump to end of text on screen |
| Insert+Home | Jump to start of text on screen |
| Insert+Ctrl+Down | Read to end of screen |
| Insert+Ctrl+Up | Read to beginning of screen |
| Insert+Shift+Page Down | Select and read next page |
| Insert+F3 | Open JAWS menu |
Example: Reading Long Output
Scenario: You ran ls -n | Out-File list.txt and saved output to a file.
Solution with JAWS:
- Open the file:
notepad.exe list.txt - In Notepad, press Insert+Ctrl+Down to hear all content
- Use Insert+Down Arrow to read line by line at your own pace
JAWS Settings for PowerShell
Enable specific settings for terminals:
- Press Insert+F3 to open JAWS menu
- Go to “Options” -> “Settings Manager”
- Search for “terminal” or “console”
- Enable “Announce output” and “Speak when program speaks”
General Terminal Accessibility
Understanding the PowerShell Layout
The PowerShell window contains:
- Title bar: Window name (e.g., “Windows PowerShell”)
- Content area: Command history and output
- Prompt: The
PS>area where you type
Your screen reader reads from top to bottom, but focus is at the prompt (bottom).
Navigation Sequence
When you open PowerShell:
- Your screen reader announces the window title
- Then it announces the prompt line
- Anything before the prompt is previous output
- Anything after the prompt is where new output will appear
Reading Output Effectively
Strategy 1: Immediate Output (Small Amount)
- Run a command
- Your screen reader announces output immediately
- This works well for short outputs (a few lines)
Strategy 2: Large Output (Many Lines)
- Redirect to a file:
command > output.txt - Open the file:
notepad.exe output.txt - Read in Notepad (easier for long text)
Strategy 3: Searching Output
- Use
findstr(find string) to filter:ls -n | findstr "pattern" - Only results matching “pattern” are shown
Working with Long Output
This is one of the most common challenges for screen reader users. Here are proven solutions:
Solution 1: Redirect to a File
Command:
ls -n > list.txt
Then open:
notepad.exe list.txt
Advantages:
- Easy to navigate at your own pace
- Works with all screen readers
- Output doesn’t scroll away
- You can save it for later
Solution 2: Use Pagination
Command:
ls -n | more
How to use:
- Press Space to see next page
- Press Q to quit
- Note: Some screen readers struggle with
more, so Solution 1 is preferred
Solution 3: Filter Output
Example: Find only .scad files
ls -n | findstr "\.scad"
How it works:
findstrsearches for a pattern\.scadmeans “files ending in .scad”- Only matching items are displayed
Solution 4: Count Before Displaying
Command:
(ls -n).Count
What it does:
- Tells you how many items there are
- Helps you know if you should redirect to file
- If count > 20, probably use file method
Keyboard Shortcuts Reference
All Users (Works in PowerShell regardless of screen reader)
| Key | Action | Why It Matters |
|---|---|---|
| Up Arrow | Show previous command | Repeat commands without retyping |
| Down Arrow | Show next command | Navigate through history |
| Tab | Auto-complete | Faster than typing full names |
| Shift+Tab | Cycle backward through completions | If Tab went too far |
| Home | Jump to start of line | Edit beginning of command |
| End | Jump to end of line | Edit end of command |
| Ctrl+A | Select all | Copy entire command line |
| Ctrl+C | Stop command | Abort long-running tasks |
| Ctrl+L | Clear screen | Start fresh |
| Ctrl+K | Clear all | (Alternative to Ctrl+L) |
| Enter | Run command | Execute what you typed |
Screen Reader Navigation
| Key | NVDA Action | JAWS Action |
|---|---|---|
| Up/Down | Move through line (native) | Move through line (native) |
| Numpad+ | Start/stop review mode | (Not needed in JAWS) |
| Function+Home | Read current line | Read current line |
| Function+Page Down | Read next page | Read next page |
| Alt+Tab | Switch windows (works in any app) | Switch windows (works in any app) |
Troubleshooting
Problem 1: “I Can’t Hear the Output After Running a Command”
Causes & Solutions:
-
Cursor not at prompt
- Solution: Press End or Ctrl+End to go to the end of text
- Then use Up Arrow or screen reader commands to review
-
Output scrolled off-screen
- Solution: Redirect to file:
command > output.txt - Then read file:
notepad.exe output.txt
- Solution: Redirect to file:
-
Screen reader focus on window title, not content
- Solution: Press Tab or arrow keys to move to the content area
- Then use screen reader commands to read
-
Large amount of output overwhelming screen reader
- Solution: Use filtering:
ls -n | findstr "pattern" - Or save to file for paced reading
- Solution: Use filtering:
Problem 2: “Tab Completion Isn’t Working”
Causes & Solutions:
-
Need at least one character
- Wrong: Type
cdthen Tab (won’t work without a path) - Right: Type
cd Dthen Tab
- Wrong: Type
-
Exact path needed
- If folder is “Documents”, typing
cd Docand Tab works - But typing
cd Xwon’t find “Documents”
- If folder is “Documents”, typing
-
Check if item exists
- Use
ls -nfirst to see available items - Then Tab-complete to them
- Use
Problem 3: “Screen Reader Says ‘Access Denied’ or ‘Permission Denied’”
Causes & Solutions:
-
Need admin rights
- Close PowerShell
- Right-click PowerShell -> Run as administrator
- Confirm the UAC prompt
-
File is in use
- Close any programs using the file
- Try the command again
-
File path contains spaces
- Use quotes:
cd "Program Files" - Or use Tab completion (handles spaces automatically)
- Use quotes:
Problem 4: “Command Runs Forever and Won’t Stop”
Solution: Press Ctrl+C
Examples of long-running commands:
ping google.com(will ping forever until stopped)- Connecting to a slow server
- Large file operations
Always press Ctrl+C when a command seems stuck.
Problem 5: “I Need to Edit My Last Command”
Solutions:
- Press Up Arrow to show previous command
- Use arrow keys to move through it
- Edit the command as needed
- Press Enter to run the modified version
Example:
- You typed:
cd Document(missing the ‘s’) - Press Up Arrow to show it again
- Press End to go to the end
- Type
sto make itcd Documents - Press Enter to run it
Problem 6: “My Screen Reader Keeps Interrupting Each Other”
Causes & Solutions:
-
NVDA verbosity too high
- Press NVDA+Ctrl+V to open menu
- Go to Settings -> Speech
- Lower the verbosity level
-
Multiple applications speaking
- Use Alt+Tab to make PowerShell active window
- Minimize other programs
-
JAWS reading too fast
- Press Insert+Down Arrow in settings
- Look for speech rate and slow it down
Pro Tips for Efficiency
1. Create Aliases for Frequently Used Commands
Example in PowerShell:
Set-Alias -Name la -Value "ls -n -ad"
Now you can type just la instead of ls -n -ad.
2. Use Command History Effectively
See all recent commands:
history
Run a previous command by number:
Invoke-History 5
(Runs the 5th command in history)
3. Redirect Everything to Files for Accessibility
If a command produces output, save it:
command-name > results.txt
notepad.exe results.txt
This is always more accessible than reading from terminal.
4. Create a README for Yourself
Create a simple help file:
echo "ls -n means list names only (screen reader friendly)" > my-notes.txt
echo "cd means change directory" >> my-notes.txt
notepad.exe my-notes.txt
Come back to it whenever you forget something.
Recommended Workflow
For every new task:
- Know where you are:
pwd - See what’s around:
ls -n - Plan your next step: Think before typing
- Run the command: Type and press Enter
- Check the output: Use screen reader or redirect to file
- Move forward: Next command or
cdto next folder
This workflow keeps you oriented and prevents errors.
Quick Reference Card
Print or save this:
EVERY COMMAND STARTS WITH:
1. pwd (where am I?)
2. ls -n (what's here?)
3. cd path (go there)
LONG OUTPUT?
-> command > file.txt
-> notepad.exe file.txt
STUCK?
-> Ctrl+C
WANT TO REPEAT?
-> Up Arrow
-> History
NEED HELP?
-> Get-Help command-name
Additional Resources
- NVDA Documentation: https://www.nvaccess.org/documentation/
- JAWS Documentation: https://www.freedomscientific.com/support/
- PowerShell Docs: https://docs.microsoft.com/powershell/
- Accessibility Best Practices: https://www.w3.org/WAI/
Feedback
This guide is meant to help YOU. If something isn’t clear:
- Try a different approach from the “Solutions” sections
- Reach out to instructors with specific questions
- Share what worked for you with classmates
Remember: Using a terminal with a screen reader is absolutely possible. These tools and techniques will help you master it.
PS-Pre: Your First Terminal - Screen Reader Navigation Fundamentals
Duration: 30-45 minutes
Prerequisites: None - this is the starting point
Accessibility Note: This lesson is designed specifically for screen reader users (NVDA, JAWS)
What is a Terminal?
A terminal (also called a command line or shell) is a text-based interface where you type commands instead of clicking buttons. Think of it like sending written instructions to your computer instead of pointing and clicking.
Why learn this?
- Faster and more precise work (especially for 3D printing scripts and automation)
- Essential for programming and using tools like OpenSCAD
- Accessibility: Many command line tools work perfectly with screen readers
- Scripting: Automate repetitive tasks
Part 1: Opening PowerShell for the First Time
On Windows
Method 1: Search (Easiest)
- Press the Windows key alone
- You should hear “Search”
- Type:
PowerShell - You’ll hear search results appear
- Press Enter to open the first result (Windows PowerShell)
- PowerShell will open in a new window
Method 2: Using the Start Menu
- Press Windows key + X (opens the Quick Link menu)
- Look for “Windows PowerShell” or “Terminal”
- Press Enter
Method 3: From File Explorer
- Open File Explorer
- Navigate to any folder
- In the menu bar, select “File” -> “Open Windows PowerShell here”
- PowerShell opens in that folder location
First Connection: Understanding the Prompt
When PowerShell opens, your screen reader will announce the window title and then the prompt. The prompt is where you type commands.
What you’ll hear:
PS C:\Users\YourName>
What this means:
PS= “PowerShell” indicatorC:\Users\YourName= Your current location (the “path”)>= The prompt is ready for your input
Important: Your cursor is blinking right after the >. This is where you type.
Part 2: Your First Commands (Screen Reader Edition)
Command 1: “Where Am I?” - pwd
What it does: Tells you your current location
Type this:
pwd
Press Enter
What you’ll hear: Your screen reader will announce the current path, something like:
C:\Users\YourName
Understanding paths:
- Paths show your location in the file system (like a mailing address)
- Windows paths use backslashes:
C:\Users\YourName\Documents - Think of it like folders inside folders:
C:\(main drive) ->Users->YourName->Documents
Command 2: “What’s Here?” - ls -n
What it does: Lists all files and folders in your current location. The -n flag makes it screen-reader friendly (names only, one per line)
Type this:
ls -n
Press Enter
What you’ll hear: Your screen reader will announce each file and folder name, one per line:
Desktop
Documents
Downloads
Music
Pictures
...
Why -n?
- Without
-n, PowerShell shows files in columns (hard to read with a screen reader) - With
-n, each file/folder is on its own line (perfect for screen readers)
Command 3: “Go There” - cd Documents
What it does: Changes your location (navigates to a folder)
Type this:
cd Documents
Press Enter
What you’ll hear: The prompt changes to show your new location. You might hear something like:
PS C:\Users\YourName\Documents>
Practice navigation:
- Run
pwdto confirm you’re in Documents - Run
ls -nto see what files are in Documents - Try going back:
cd ..(the..means “go up one level”) - Run
pwdagain to confirm - Go back to Documents:
cd Documents
Part 3: Reading Screen Reader Output (Critical Skills)
Dealing with Long Lists
When you run ls -n in a folder with many files, the list might be very long. Your screen reader might announce 50+ items rapidly.
Solution 1: Save to a File
ls -n > list.txt
notepad.exe list.txt
This saves the list to a file and opens it in Notepad where you can read it more slowly.
Solution 2: Search Within the Output
ls -n | findstr "search-term"
Example: If you’re looking for files containing “scad”, type:
ls -n | findstr "scad"
Navigating Tab Completion
One of the most powerful screen reader tricks is Tab completion:
How it works:
- Type the first few letters of a folder or file name
- Press Tab
- PowerShell automatically completes the rest
Example:
- You’re in
C:\Users\YourName> - Type:
cd Doc - Press Tab
- PowerShell auto-completes it to:
cd Documents - Press Enter to go there
With a screen reader:
- As you type
Doc, your screen reader announces each letter - When you press Tab, PowerShell types the rest and your screen reader announces the full command
- This is much faster than typing the whole thing
Part 4: Creating and Editing Files
Create a Simple File
Type this:
echo "Hello, PowerShell!" > hello.txt
What this does:
echosends text to the screen (or file)"Hello, PowerShell!"is the text>redirects it to a file calledhello.txt
Read the File Back
Type this:
cat hello.txt
What you’ll hear: Your screen reader announces:
Hello, PowerShell!
Open and Edit the File
Type this:
notepad.exe hello.txt
This opens the file in Notepad where you can edit it with your screen reader.
Part 5: Essential Keyboard Shortcuts
These work in PowerShell and are crucial for screen reader users:
| Key Combination | What It Does |
|---|---|
| Up Arrow | Shows your previous command (press again to go further back) |
| Down Arrow | Shows your next command (if you went back) |
| Tab | Auto-completes folder/file names |
| Ctrl+C | Stops a running command |
| Ctrl+L | Clears the screen |
| Enter | Runs the command |
Screen reader tip: These all work perfectly with your screen reader. Try them!
Part 6: Screen Reader-Specific Tips
NVDA Users
-
Reading Command Output:
- Use NVDA+Home to read the current line
- Use NVDA+Down Arrow to read to the end of the screen
- Use NVDA+Page Down to read the next page
-
Reviewing Text:
- Use NVDA+Shift+Page Up to review text above
JAWS Users
-
Reading Output:
- Use Insert+Down Arrow to read line-by-line
- Use Insert+Page Down to read by page
- Use Insert+End to jump to the end of text
-
Reading All Text:
- Use Insert+Down Arrow repeatedly
- Or use Insert+Ctrl+Down to read to the end
Common Issue: “I Can’t Hear the Output”
Problem: You run a command but don’t hear the output
Solutions:
- Make sure your cursor is at the prompt (try pressing End or Ctrl+End)
- Use Up Arrow to go back to your previous command and review it
- Try redirecting to a file:
command > output.txtthen open the file - In NVDA: Try pressing NVDA+F7 to open the Review Mode viewer
Part 7: Practice Exercises
Complete these in order. Take your time with each one:
Exercise 1: Basic Navigation
- Open PowerShell
- Run
pwdand note your location - Run
ls -nand listen to what’s there - Try
cd Documentsor another folder - Run
pwdto confirm your new location - Run
ls -nin this new location
Goal: You should be comfortable knowing where you are and what’s around you
Exercise 2: Using Tab Completion
- In your home directory, type
cd D(just the letter D) - Press Tab
- PowerShell should auto-complete to a folder starting with D
- Repeat with other folder names
- Try typing a longer name:
cd Downand Tab toDownloads
Goal: Tab completion should feel natural
Exercise 3: Creating and Viewing Files
- Create a file:
echo "Test content" > test.txt - View it:
cat test.txt - Create another:
echo "Line 2" > another.txt - List both:
ls -n
Goal: You understand create, view, and list operations
Exercise 4: Going Up Levels
- Navigate into several folders:
cd Documents, thencd folder1, etc. - From deep inside, use
cd ..multiple times to go back up - After each
cd .., runpwdto confirm your location
Goal: You understand relative navigation with ..
Exercise 5: Redirecting Output
- Create a list:
ls -n > directory_list.txt - Open it:
notepad.exe directory_list.txt - Read it with your screen reader
- Close Notepad
- Verify the file exists:
ls -n | findstr "directory"
Goal: You can save long outputs to files for easier reading
Checkpoint Questions
After completing this lesson, you should be able to answer:
- What does
pwddo? - What does
ls -ndo? - Why do we use
-nwithls? - What path are you in right now?
- How do you navigate to a new folder?
- How do you go up one level?
- What’s the Tab key for?
- What does
echo "text" > file.txtdo? - How do you read a file back?
- How do you stop a command that’s running?
You should be able to answer all 10 with confidence before moving to PS-0.
Common Questions
Q: Do I need to use PowerShell? Can I use Command Prompt (cmd.exe)? A: PowerShell is more powerful and works better with modern tools. We recommend PowerShell, but Command Prompt basics are similar.
Q: Why is my screen reader not reading the output?
A: This is common. Use command > file.txt to save output to a file, then open it with Notepad for reliable reading.
Q: What if I type something wrong? A: Just press Enter and you’ll see an error message. Type the correct command on the next line. No harm done!
Q: How do I get help with a command?
A: Type Get-Help command-name (we’ll cover this in PS-0)
Q: Can I make PowerShell more accessible? A: Yes! We’ll cover customization in PS-5.
Next Steps
Once you’re comfortable with these basics:
- Move to PS-0: Getting Started for deeper path understanding
- Then continue through PS-1 through PS-5 for full terminal mastery
Resources
- Microsoft PowerShell Docs: https://docs.microsoft.com/powershell/
- NVDA Screen Reader: https://www.nvaccess.org/
- JAWS Screen Reader: https://www.freedomscientific.com/products/software/jaws/
- Windows Terminal Accessibility: https://docs.microsoft.com/windows/terminal/
Troubleshooting
| Issue | Solution |
|---|---|
| PowerShell won’t open | Try searching Windows, or right-click a folder and select “Open PowerShell here” |
| Can’t hear the output | Try redirecting to a file: command > output.txt |
| Tab completion not working | Make sure you typed at least one character before pressing Tab |
| Command not found | Make sure you spelled it correctly; try Get-Command to see available commands |
| Stuck in a command | Press Ctrl+C to stop it |
Still stuck? The checkpoint questions and exercises are your best teacher. Work through them multiple times until comfortable.
PS-0: Getting Started - Layout, Paths, and the Shell
Estimated time: 20-30 minutes
Learning Objectives
- Launch PowerShell and locate the prompt
- Understand path notation and shortcuts (
~,./,../) - Use tab completion to navigate quickly
Materials
- Computer with PowerShell
- Editor (Notepad/VS Code)
Step-by-step Tasks
- Open PowerShell and note the prompt (it includes the current path).
- Run
pwdand say or note the printed path. - Use
ls -nto list names in your home directory. - Practice
cd Documents,cd ../andcd ~until comfortable. - Try tab-completion: type
cd ~/Dand press Tab.
Checkpoints
- Confirm you can state your current path and move to
Documents.
Quiz - Lesson PS.0
- What is a path?
- What does
~mean? - How do you autocomplete a path?
- How do you go up one directory?
- What command lists only names (
lsflag)? - True or False: On Windows, PowerShell uses backslashes () in paths, but forward slashes (/) are also accepted.
- Explain the difference between an absolute path and a relative path.
- If you are in
C:\Users\YourName\Documentsand you typecd ../, where do you end up? - What happens when you press Tab while typing a folder name in PowerShell?
- Describe a practical reason why understanding paths is important for a 3D printing workflow.
- What does
./mean in a path, and when would you use it? - If a folder path contains spaces (e.g.,
Program Files), how do you navigate to it withcd? - Explain what the prompt
PS C:\Users\YourName>tells you about your current state. - How would you navigate to your home directory from any location using a single command?
- What is the advantage of using relative paths (like
../) versus absolute paths in automation scripts?
Extension Problems
- Create a nested folder and practice
cdinto it by typing partial names and using Tab. - Use
ls -n -afto list only files in a folder. - Save
pwdoutput to a file and open it in Notepad. - Try
cdinto a folder whose name contains spaces; observe how quotes are handled. - Create a short note file and open it from PowerShell.
- Build a folder structure that mirrors your project organization; navigate to each level and document the path.
- Create a script that prints your current path and the total number of files in it; run it from different locations.
- Investigate the special paths (e.g.,
$HOME,$PSScriptRoot); write down what each contains and when you’d use them. - Compare absolute vs. relative paths by navigating to the same folder using each method; explain which is easier for automation.
- Create a PowerShell function that changes to a frequently-used folder and lists its contents in one command; test it from different starting locations.
- Navigate to three different locations and at each one note the prompt, the path from
pwd, and verify you understand what each shows. - Create a complex folder tree (at least 5 levels deep) and navigate it using only relative paths; verify your location at each step.
- Document all shortcuts you know (
~,./,../,$HOME) and demonstrate each one works as expected. - Write a guide for a peer on how to understand the PowerShell prompt and path notation without using GUI file explorer.
- Create a troubleshooting flowchart: if someone says “I don’t know where I am,” what commands do you give them to find out?
References
- Microsoft. (2024). PowerShell scripting overview and documentation. https://learn.microsoft.com/powershell/scripting/overview
- Microsoft. (2024). Filesystem navigation in PowerShell. https://learn.microsoft.com/powershell/scripting/learn/shell/navigate-the-filesystem
- Microsoft. (2024). Accessibility features in PowerShell ISE. https://learn.microsoft.com/powershell/scripting/windows-powershell/ise/accessibility-in-windows-powershell-ise
Helpful Resources
- PowerShell Basics - Microsoft Learn
- Filesystem Navigation Guide
- Understanding Path Notation
- Tab Completion Reference
- Accessibility in PowerShell ISE
PS-1: Navigation - Moving Around Your File System
Duration: 1 class period
Prerequisite: PS-0 (Getting Started)
Learning Objectives By the end of this lesson, you will be able to:
- Use
pwdto print your current location - Use
cdto move between directories - Use
ls(and its flags) to list files and folders - Use wildcards
*and?to filter listings - Navigate relative vs. absolute paths
- Search for files by name and extension
Materials
- PowerShell
- Text editor (Notepad or VS Code)
Commands Covered in This Lesson
| Command | What It Does |
|---|---|
pwd | Print Working Directory - shows where you are |
cd path | Change Directory - move to a new location |
ls | List - shows files and folders in current location |
ls -n | List names only (screen reader friendly) |
ls -n -af | List names of files only |
ls -n -ad | List names of directories only |
ls *.extension | List files matching a pattern |
pwd - Where Am I?
Type pwd and press Enter. PowerShell prints the full path to your current location.
pwd
# Output: C:\Users\YourName
When to use: Always run this if you’re unsure of your current location.
cd - Changing Directories
cd stands for “change directory.”
# Go to Documents
cd Documents
# Go up one level to parent directory
cd ..
# Go to home directory
cd ~
# Go to a specific path
cd C:\Users\YourName\Documents\3D_Projects
ls - Listing Files and Folders
Use ls -n for screen reader compatibility.
# List all files and folders (names only)
ls -n
# List only files (no folders)
ls -n -af
# List only folders (no files)
ls -n -ad
Wildcards - Finding Files by Pattern
Wildcards help you find files without typing the full name.
* (asterisk) matches any number of characters:
# List all .scad files
ls -n *.scad
# List all files starting with "part"
ls -n part*
# List all files ending with "_final"
ls -n *_final*
? (question mark) matches exactly one character:
# Find files like model1.scad, model2.scad (but not model12.scad)
ls -n model?.scad
Step-by-step Practice
- Run
pwdand confirm your location - Move to
Documents:cd Documents - Confirm you moved:
pwd - List files and folders:
ls -n - List only files:
ls -n -af - Go back up:
cd .. - Search for files:
ls -n *.txt
Checkpoints
After this lesson, you should be able to:
- Navigate to any folder using
cd - Confirm your location with
pwd - List files and folders with
ls -n - Use wildcards to find files by pattern
- Move between absolute and relative paths confidently
Quiz - Lesson PS.1
- What does
pwdshow? - How do you list directories only with
ls? - What wildcard matches any number of characters?
- How do you list files with the
.scadextension? - Give an example of an absolute path and a relative path.
- True or False: The
*wildcard matches exactly one character. - Explain the difference between
ls -nandls -n -ad. - Write a command that would list all
.txtfiles in your Documents folder using a wildcard. - How would you search for files containing “part” in their name across multiple files?
- Describe a practical scenario where using wildcards saves time in a 3D printing workflow.
- What happens when you use
ls -n part?.scadversusls -n part*.scad? - How would you navigate to a folder whose name contains both spaces and special characters?
- If you’re in
/Documents/Projects/3Dand you want to go to/Documents/Resources, what command would you use? - Write a command sequence that navigates to the Downloads folder, lists only files, then returns to home.
- Explain the purpose of using
ls -n -afspecifically in a screen reader context.
Extension Problems
- Write a one-line script that lists
.scadfiles and saves toscad_list.txt. - Use
ls -n ~/Documents | moreto page through long listings. - Combine
lswithSelect-Stringto search for a filename pattern. - Create a shortcut alias in the session for a long path and test it.
- Practice tab-completion in a directory with many similarly named files.
- Build a PowerShell script that recursively lists all
.scadand.stlfiles in a directory tree; save the results to a file. - Compare the output of
ls,Get-ChildItem, andgcito understand PowerShell aliasing; document what each command does. - Create a filtering command that displays only files modified in the last 7 days; test it on your documents folder.
- Write a non-visual guide to PowerShell navigation; include descriptions of common patterns and how to verify directory contents audibly.
- Develop a navigation workflow for a typical 3D printing project: move between CAD, slicing, and print-log folders efficiently; document the commands.
- Create a complex wildcard search: find all files in a folder and subfolders that match multiple patterns (e.g.,
*_v1.* OR *_final.*). - Build a script that navigates through a folder tree, counts files at each level, and reports the structure.
- Document the output differences between
ls -n,ls -n -af,ls -n -ad, andGet-ChildItem; explain when to use each. - Create a navigation “cheat sheet” as a PowerShell script that prints common paths and how to navigate to them.
- Design a project folder structure on your computer, document each path, then create a script that validates all folders exist.
References
- Microsoft. (2024). Get-ChildItem cmdlet reference. https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-childitem
- Microsoft. (2024). PowerShell wildcards and filtering. https://learn.microsoft.com/powershell/scripting/learn/shell/using-wildcards
- Microsoft. (2024). Navigation best practices in PowerShell. https://learn.microsoft.com/powershell/scripting/learn/shell/navigate-the-filesystem
Helpful Resources
- Get-ChildItem Cmdlet Reference
- PowerShell Wildcards and Filtering
- Navigation Best Practices
- Relative and Absolute Paths
- Screen Reader Tips for PowerShell
PS-2: File and Folder Manipulation
Estimated time: 30-45 minutes
Learning Objectives
- Create, copy, move, and delete files and folders from PowerShell
- Use
ni,mkdir,cp,mv,rm, andrmdirsafely - Understand when operations are permanent and how to confirm results
Materials
- PowerShell
- Small practice folder for exercises
Step-by-step Tasks
- Create a practice directory:
mkdir ~/Documents/PS_Practiceandcdinto it. - Create two files:
ni file1.txtandni file2.txt. - Copy
file1.txttofile1_backup.txtwithcpand confirm withls -n. - Rename
file2.txttonotes.txtusingmvand confirm. - Delete
file1.txtwithrmand verify the backup remains.
Checkpoints
- After step 3 you should see both the original and the backup file.
Quiz - Lesson PS.2
- How do you create an empty file from PowerShell?
- What command copies a file?
- How do you rename a file?
- What does
rm -rdo? - Why is
rmpotentially dangerous? - True or False:
cprequires the-rflag to copy both files and folders. - Explain the difference between
rmandrmdir. - If you delete a file with
rm, can you recover it from PowerShell? - Write a command that would copy an entire folder and all its contents to a new location.
- Describe a practical safety check you would perform before running
rm -ron a folder. - What happens if you
cpa file to a destination where a file with the same name already exists? How would you handle this safely? - Compare
mv old_name.txt new_name.txtvsmv old_name.txt ~/Documents/new_name.txt. What is the key difference? - Design a workflow to safely delete 50 files matching the pattern
*.bakfrom a folder containing 500 files. What commands and verifications would you use? - Explain how you could back up all
.scadfiles from a project folder into a timestamped backup folder in one command. - When organizing a 3D printing project, you need to move completed designs to an archive folder and delete failed prototypes. How would you structure this as a safe, auditable process?
Extension Problems
- Create a folder tree and copy it to a new location with
cp -r. - Write a one-line command that creates three files named
a b cand lists them. - Move a file into a new folder and confirm the move.
- Use wildcards to delete files matching a pattern in a safe test folder.
- Export a listing of the practice folder to
practice_listing.txt. - Create a backup script that copies all
.scadfiles from your project folder to a backup folder with timestamp naming. - Build a safe deletion workflow: list files matching a pattern, verify count, then delete with confirmation; document the steps.
- Write a PowerShell script that organizes files by extension into subfolders; test it on a sample folder tree.
- Create a file operation audit trail: log all copy, move, and delete operations to a text file for review.
- Develop a project template generator: a script that creates a standard folder structure for a new 3D printing project with essential subfolders.
- Implement a file conflict handler: write a script that handles cases where
cpwould overwrite an existing file by renaming the existing file with a timestamp before copying. - Create a batch rename operation: use a script to rename all files in a folder from
old_prefix_*tonew_prefix_*; test with actual files and verify the results. - Build a folder comparison tool: list all files in two folders and identify which files exist in one but not the other; output to a report.
- Write a destructive operation validator: before executing
rm -r, create a script that lists exactly what will be deleted, shows file counts by type, and requires explicit user confirmation to proceed. - Design a complete project lifecycle workflow: create folders for active projects, completed designs, and archive; include move operations between folders, backup steps, and verification that all files arrive intact.
References
- Microsoft. (2024). New-Item cmdlet reference. https://learn.microsoft.com/powershell/module/microsoft.powershell.management/new-item
- Microsoft. (2024). Copy-Item and Move-Item cmdlets. https://learn.microsoft.com/powershell/module/microsoft.powershell.management/copy-item
- Microsoft. (2024). File system operations guide. https://learn.microsoft.com/powershell/scripting/learn/shell/manipulating-items
Helpful Resources
- New-Item Cmdlet Reference
- Copy-Item and Move-Item
- Remove-Item Cmdlet Reference
- File System Operations Guide
- Safe Deletion Practices
PS-3: Input, Output, and Piping
Duration: 1 class period Prerequisite: PS-2 (File and Folder Manipulation)
Learning Objectives
By the end of this lesson, you will be able to:
- Use
echoto print text to the screen - Use
catto read file contents - Use
>to redirect output into a file - Use
|(pipe) to send one command’s output to another - Copy output to the clipboard with
clip - Open files with a text editor from the command line
Commands Covered
| Command | What It Does |
|---|---|
echo "text" | Print text to the screen |
cat filename | Print the contents of a file |
> filename | Redirect output into a file (overwrites) |
>> filename | Append output to a file (adds to end) |
| | Pipe - send output from one command to the next |
clip | Copy piped input to the Windows clipboard |
notepad.exe filename | Open a file in Notepad |
echo - Printing Text
echo prints text to the screen. It is useful for testing, for writing text into files, and for understanding how piping works.
echo "Hello, World"
echo "This is a test"
cat - Reading Files
cat prints the contents of a file to the screen.
# Read a text file
cat ~/Documents/notes.txt
# Read an OpenSCAD file
cat ~/Documents/OpenSCAD_Projects/project0.scad
With a long file, use cat filename | more to read it page by page (press Space to advance, Q to quit).
> - Redirecting Output to a File
The > symbol redirects output from the screen into a file instead.
# Create a file with a single line
echo "Author: Your Name" > header.txt
# Confirm the file was created and has content
cat header.txt
Warning: > overwrites the file if it already exists. Use >> to append instead:
echo "Date: 2025" >> header.txt
echo "Project: Floor Marker" >> header.txt
cat header.txt
| - Piping
The pipe symbol | sends the output of one command to the input of the next. This lets you chain commands together.
# List files and send the list to clip (copies to clipboard)
ls -n | clip
# Now paste with Ctrl + V anywhere
# Search within a file's contents using Select-String (like grep)
cat project0.scad | Select-String "cube"
clip - Copying to Clipboard
clip takes whatever is piped to it and puts it on the Windows clipboard.
# Copy your current directory path to the clipboard
pwd | clip
# Copy a file listing to clipboard
ls -n | clip
# Copy the contents of a file to clipboard
cat notes.txt | clip
After any of these, press Ctrl + V in any application to paste.
Opening Files in Notepad
# Open a file in Notepad
notepad.exe ~/Documents/notes.txt
# Open a .scad file
notepad.exe ~/Documents/OpenSCAD_Projects/project0.scad
# Create a new file and open it
ni new_notes.txt
# PS-3: Input, Output, and Piping
Estimated time: 25-40 minutes
**Learning Objectives**
- Use `echo`, `cat`, `>` and `>>` for basic IO
- Use `|` to pipe outputs between commands
- Copy command output to the clipboard with `clip`
**Materials**
- PowerShell
- Example text files for practice
Step-by-step Tasks
1. Create `practice.txt` with three lines using `echo` and `>`/`>>`.
2. Read the file with `cat practice.txt`.
3. Pipe the file into `Select-String` to search for a word.
4. Copy the file contents to clipboard with `cat practice.txt | clip`.
5. Redirect `ls -n` into `list.txt` and open it in Notepad.
Checkpoints
- After step 3 you should be able to find a keyword using piping.
## Quiz - Lesson PS.3
1. What is the difference between `>` and `>>`?
2. What does the pipe `|` do?
3. How do you copy output to the clipboard?
4. How would you page through long output?
5. How do you suppress output to nowhere?
6. True or False: The pipe operator `|` connects the output of one command to the input of another.
7. Explain why redirecting output to a file is useful for screen reader users.
8. Write a command that would search for the word "sphere" in all `.scad` files in a directory.
9. How would you count the number of lines in a file using PowerShell piping?
10. Describe a practical scenario in 3D printing where you would pipe or redirect command output.
11. What would be the difference in output between `echo "test" > file.txt` (run twice) vs `echo "test" >> file.txt` (run twice)? Show the expected file contents.
12. Design a three-step piping chain: read a file, filter for specific content, and save the results; explain what each pipe does.
13. You have a 500-line `.scad` file and need to find all instances of `sphere()` and count them. Write the command.
14. Explain how `clip` is particularly valuable for screen reader users when working with file paths or long output strings.
15. Describe how you would use pipes and redirection to create a timestamped backup report of all `.stl` files in a 3D printing project folder.
## Extension Problems
1. Use piping to count lines in a file (hint: `Select-String -Pattern '.' | Measure-Object`).
2. Save a long `ls -n` output and search it with `Select-String`.
3. Chain multiple pipes to filter and then save results.
4. Practice copying different command outputs to clipboard and pasting.
5. Create a small script that generates a report (counts of files by extension).
6. Build a data processing pipeline: read a CSV file, filter rows, and export results; document each step.
7. Write a script that pipes directory listing to Count occurrences of each file extension; create a summary report.
8. Create a log analysis command: read a log file, filter for errors, and save matching lines to a separate error log.
9. Design a piping workflow for 3D printing file management: find `.stl` files, extract their sizes, and generate a report.
10. Develop a reusable piping function library: create functions for common filtering, sorting, and reporting patterns; test each function with different inputs.
11. Build a complex filter pipeline: read a `.scad` file, extract lines containing specific geometry commands, count each type, and output a summary to both screen and file.
12. Create an interactive piping tool: build a script that accepts user input for a search term, pipes through multiple filters, and displays paginated results.
13. Develop a performance analysis tool: use piping to combine file listing, metadata extraction, and statistical reporting; export results to a dated report file.
14. Implement a comprehensive error-handling pipeline: read output, catch errors, log them separately, and generate a summary of successes vs failures.
15. Design and execute a real-world project backup workflow: use piping to verify file integrity, count files by type, generate a backup manifest, and create audit logs-all in one integrated command pipeline.
## References
- Microsoft. (2024). *Out-File cmdlet for redirection*. https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/out-file
- Microsoft. (2024). *Select-String piping reference*. https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/select-string
- Microsoft. (2024). *PowerShell pipeline concepts*. https://learn.microsoft.com/powershell/scripting/learn/shell/using-the-pipeline
## Helpful Resources
- [Using Out-File for Redirection](https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/out-file)
- [Piping and Select-String](https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/select-string)
- [Get-Content Cmdlet Reference](https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-content)
- [Measure-Object for Counting](https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-object)
- [PowerShell Pipeline Concept](https://learn.microsoft.com/powershell/scripting/learn/shell/using-the-pipeline)
PS-4: Environment Variables, PATH, and Aliases
Estimated time: 30-45 minutes
Learning Objectives
- Read environment variables with
$env:VARNAME - Inspect and verify programs in the
PATH - Create temporary aliases and understand making them persistent via the profile
Materials
- PowerShell (with rights to open profile if desired)
Step-by-step Tasks
- Show your username and home path with
echo $env:USERNAMEandecho $env:USERPROFILE. - Inspect
echo $env:PATHand identify whetheropenscadorcodewould be found. - Run
Get-Command openscadand note the result. - Create a temporary alias:
Set-Alias -Name preview -Value openscadand testpreview myfile.scad. - Open your profile (
notepad.exe $PROFILE) and add the alias line to make it persistent (advanced).
Checkpoints
- After step 3 you can determine whether a program will be found by
PATH.
Quiz - Lesson PS.4
- How do you print an environment variable?
- What is the purpose of
PATH? - How do you check whether
openscadis available? - How do you create a temporary alias?
- Where would you make an alias permanent?
- True or False: Environment variables are case-sensitive on all platforms.
- Explain why having a program in your PATH is useful compared to always using its full file path.
- Write a command that would create an alias called
slicerfor the OpenSCAD executable. - What file would you edit to make an alias persist across PowerShell sessions?
- Describe a practical benefit of using the
$env:TEMPdirectory for temporary files in a 3D printing workflow. - You have a custom script at
C:\Scripts\backup_models.ps1that you want to run from anywhere asbackup-now. What steps would you take to make this work? - Explain the difference between setting an environment variable in the current session vs. adding it to your profile for permanence.
- Design a profile strategy for managing multiple 3D printing projects, each with different tool paths and directories; show how to structure environment variables for each.
- If a program is not found by
Get-Command, what are the possible reasons, and how would you troubleshoot? - Describe how you would verify that your PowerShell profile is loading correctly and how to debug issues if aliases or environment variables don’t appear after restarting PowerShell.
Extension Problems
- Add a folder to PATH for a test program (describe steps; do not change system PATH without admin).
- Create a short profile snippet that sets two aliases and test re-opening PowerShell.
- Use
Get-Commandto list the path for several common programs. - Explore
$env:TEMPand create a file there. - Save a copy of your current PATH to a text file and examine it in your editor.
- Create a PowerShell profile script that loads custom aliases and environment variables for your 3D printing workflow; test it in a new session.
- Build a “project profile” that sets environment variables for CAD, slicing, and print directories; switch between profiles for different projects.
- Write a script that audits your current environment variables and creates a summary report of what’s set and why.
- Design a custom alias system for common 3D printing commands; document the aliases and their purposes.
- Create a profile migration guide: document how to export and import your PowerShell profile across machines for consistent workflows.
- Implement a safe PATH modification script: create a utility that allows you to add/remove directories from PATH for the current session only; show how to make it permanent in your profile.
- Build a comprehensive profile framework with modules: create separate .ps1 files for aliases, environment variables, and functions; have your main profile load all of them dynamically.
- Develop an environment validation tool: write a script that checks whether all required programs (OpenSCAD, slicers, etc.) are accessible via PATH; report findings and suggest fixes.
- Create a project-switching alias system: design a function that changes all environment variables and aliases based on the current project; test switching between multiple projects.
- Build a profile troubleshooting guide: create a script that exports your current environment state (variables, aliases, PATH) to a timestamped file, allowing you to compare states before and after changes and identify what broke.
References
- Microsoft. (2024). Environment variables in PowerShell. https://learn.microsoft.com/powershell/scripting/learn/shell/using-environment-variables
- Microsoft. (2024). Set-Alias cmdlet reference. https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/set-alias
- Microsoft. (2024). Creating and using PowerShell profiles. https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_profiles
Helpful Resources
- Environment Variables in PowerShell
- Understanding the PATH Variable
- Set-Alias Cmdlet Reference
- Creating a PowerShell Profile
- Get-Command for Locating Programs
PS-5: Filling in the Gaps - Control Flow, Profiles, and Useful Tricks
Estimated time: 30-45 minutes
Learning Objectives
- Use history and abort commands (
history,Ctrl+C) - Inspect and edit your PowerShell profile for persistent settings
- Run programs by full path using the
&operator - Handle common screen reader edge cases when using the terminal
Materials
- PowerShell and an editor (Notepad/ VS Code)
Step-by-step Tasks
- Run several simple commands (e.g.,
pwd,ls -n,echo hi) then runhistoryto view them. - Use
Invoke-History <n>to re-run a previous command (replace<n>with a history number). - Practice aborting a long-running command with
Ctrl + C(for example,ping 8.8.8.8). - Open your profile:
notepad.exe $PROFILE; if it doesn’t exist, create it:ni $PROFILE -Force. - Add a persistent alias line to your profile (example:
Set-Alias -Name preview -Value openscad), save, and reopen PowerShell to verify.
Checkpoints
- After step 2 you can re-run a recent command by history number.
- After step 5 your alias should persist across sessions.
Quiz - Lesson PS.5
- How do you view the command history?
- Which key combination aborts a running command?
- What does
echo $PROFILEshow? - How does the
&operator help run executables? - What is one strategy if terminal output stops being announced by your screen reader?
- True or False: Using
Ctrl+Cpermanently deletes any files created by the command you abort. - Explain the difference between
historyandGet-Historyin PowerShell. - If you place code in your profile but it doesn’t take effect after opening a new PowerShell window, what should you verify?
- Write a command that would run a program at the path
C:\Program Files\OpenSCAD\openscad.exedirectly. - Describe a practical workflow scenario where having keyboard shortcuts (aliases) in your profile would save time.
- Explain how to re-run the 5th command from your history, and what would happen if that command had file operations (creates/deletes).
- Design a profile initialization strategy that separates utilities for different projects; explain how you would switch between them.
- Walk through a troubleshooting workflow: your screen reader stops announcing output after running a long command. What steps would you take to diagnose and resolve the issue?
- Create a safety checkpoint system: before any destructive operation (mass delete, overwrite), how would you use profile functions and history to verify the command is correct?
- Develop a comprehensive capstone scenario: integrate everything from PS-0 through PS-5 (navigation, file operations, piping, environment setup, history) to design an automated 3D printing project workflow with error handling and logging.
Extension Problems
- Add an alias and an environment variable change to your profile and document the behavior after reopening PowerShell.
- Create a short script that automates creating a project folder and an initial .scad file.
- Experiment with running OpenSCAD by full path using
&and by placing it in PATH; compare results. - Practice redirecting
Get-Helpoutput to a file and reading it in Notepad for screen reader clarity. - Document three screen reader troubleshooting steps you used and when they helped.
- Build a comprehensive PowerShell profile that includes aliases, environment variables, and helper functions for your 3D printing workflow.
- Create a script that troubleshoots common PowerShell issues (module loading, permission errors, command not found); test at least three scenarios.
- Write a PowerShell function that coordinates multiple tasks: creates a project folder, starts OpenSCAD, and opens slicing software.
- Design a screen-reader accessibility guide for PowerShell: document commands, outputs, and accessible navigation patterns.
- Develop an advanced PowerShell workflow: implement error handling, logging, and confirmation prompts for risky operations.
- Implement a “undo” system using history: create a function that logs destructive commands (rm, mv, cp -Force) and allows you to review/rollback the last operation.
- Build a profile debugger: create a script that compares two PowerShell sessions’ environment states (variables, aliases, functions) to identify what loaded/failed to load.
- Develop a multi-project profile manager: design a system where you can switch entire environments (paths, aliases, variables) for different 3D printing projects by running a single command.
- Create a comprehensive accessibility analyzer: write a script that tests whether key PowerShell commands produce screen-reader-friendly output; document workarounds for commands that don’t.
- Design a complete capstone project: build an integrated automation suite that manages a 3D printing workflow (project setup, file organization, CAD/slicing tool automation, output logging, error recovery, and audit trails) with full error handling and documentation.
References
- Microsoft. (2024). PowerShell history and recall functionality. https://learn.microsoft.com/powershell/scripting/learn/shell/using-history
- Microsoft. (2024). Understanding and creating PowerShell profiles. https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_profiles
- Microsoft. (2024). The call operator (&) for running executables. https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_operators#call-operator-
Helpful Resources
- PowerShell History and Recall
- Understanding Profiles
- Invoke-History Cmdlet Reference
- The Call Operator (&)
- Screen Reader Tips and Tricks
PS-6: Advanced Terminal Techniques - Scripts, Functions & Professional Workflows
Duration: 90 minutes
Prerequisites: Complete PS-0 through PS-5
Skill Level: Advanced intermediate
This lesson extends PowerShell skills to professional-level workflows. You’ll learn to automate complex tasks, write reusable code, and integrate tools for 3D printing workflows.
Learning Objectives
By the end of this lesson, you will be able to:
- Create and run PowerShell scripts (.ps1 files)
- Write functions that accept parameters
- Use loops to repeat tasks automatically
- Automate batch processing of 3D models
- Debug scripts when something goes wrong
- Create professional workflows combining multiple tools
Part 1: PowerShell Scripts Basics
What’s a Script?
A script is a file containing PowerShell commands that run in sequence. Instead of typing commands one by one, you put them in a file and run them all at once.
Why use scripts?
- Repeatability: Run the same task 100 times identically
- Documentation: Commands are written down for reference
- Complexity: Combine many commands logically
- Automation: Schedule scripts to run automatically
Creating Your First Script
Step 1: Open a text editor
notepad.exe my-first-script.ps1
Step 2: Type this script
# This is a comment - screen readers will read it
Write-Output "Script is running!"
pwd
ls -n
Write-Output "Script is done!"
Step 3: Save the file
- In Notepad: Ctrl+S
- Make sure filename ends in
.ps1 - Save in an easy-to-find location (like Documents)
Step 4: Run the script
.\my-first-script.ps1
What happens: PowerShell runs each command in sequence and shows output.
Important: Script Execution Policy
On some Windows systems, you might get an error about “execution policy”. This is a security feature.
To fix it temporarily:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Then try your script again:
.\my-first-script.ps1
Note for screen readers: Your screen reader will announce the error if there is one. Use Get-Help Get-ExecutionPolicy for more information.
Part 2: Variables and Parameters
Using Variables
Variables store values you want to use later.
Example script:
$mypath = "C:\Users\YourName\Documents"
cd $mypath
Write-Output "I am now in:"
pwd
ls -n
Breaking it down:
$mypath= variable name (always starts with$)== assign the value after this"C:\Users..."= the value (a path)cd $mypath= use the variable (replace$mypathwith its value)
Functions with Parameters
A function is reusable code that you can run with different inputs.
Example: A function that lists files in a folder
function ListFolder {
param(
[string]$path
)
Write-Output "Contents of: $path"
cd $path
ls -n
}
# Use the function:
ListFolder -path "C:\Users\YourName\Documents"
ListFolder -path "C:\Users\YourName\Downloads"
What’s happening:
function ListFolder= name of the functionparam([string]$path)= the function accepts a parameter called$path- Inside the function, use
$pathlike any variable - Call the function with
-path "value"
Screen reader tip: When you call a function, PowerShell will announce the results just like any command.
Part 3: Loops - Repeating Tasks
Loop Over Files
Imagine you have 10 SCAD files and want to print their contents. You could do it 10 times manually, or use a loop.
Example: Print every .scad file in a folder
$scadFiles = ls -n *.scad
foreach ($file in $scadFiles) {
Write-Output "=== File: $file ==="
cat $file
Write-Output ""
}
What’s happening:
$scadFiles = ls -n *.scad= find all .scad files and store in variableforeach ($file in $scadFiles)= for each file, do this:Write-Output "=== File: $file ==="= announce which filecat $file= show contentsWrite-Output ""= blank line between files
Result: All files printed one after another, organized and readable.
Loop with a Counter
Example: Do something 5 times
for ($i = 1; $i -le 5; $i++) {
Write-Output "This is iteration number $i"
# Do something here
}
What’s happening:
for ($i = 1; $i -le 5; $i++)= loop from 1 to 5$i= counter variable (starts at 1, increases each loop)-le= “less than or equal to” (stop when $i > 5)$i++= add 1 to $i each time through
Part 4: Real-World Example - Batch Processing SCAD Files
Scenario
You have 10 OpenSCAD (.scad) files in a folder. You want to:
- List them all
- Check how many there are
- For each one, verify it exists
The Script
# Batch Processing Script for SCAD Files
$scadFolder = "C:\Users\YourName\Documents\3D_Projects"
$scadFiles = ls $scadFolder -Filter *.scad -Name
Write-Output "Processing SCAD files in: $scadFolder"
Write-Output "Found $($scadFiles.Count) files"
Write-Output ""
foreach ($file in $scadFiles) {
$fullPath = Join-Path -Path $scadFolder -ChildPath $file
if (Test-Path -Path $fullPath) {
Write-Output " Found: $file"
} else {
Write-Output " Missing: $file"
}
}
Write-Output ""
Write-Output "Batch processing complete!"
Breaking it down:
$scadFolder= where to lookls $scadFolder -Filter *.scad -Name= find .scad files, show names onlyforeach= process each fileJoin-Path= combine folder and filename into full pathTest-Path= check if file existsif= do different things based on condition
Running the Script
- Save as
batch-process.ps1 - Edit
$scadFolderto match your real folder - Run it:
.\batch-process.ps1
Screen reader output:
Processing SCAD files in: C:\Users\YourName\Documents\3D_Projects
Found 10 files
Found: model1.scad
Found: model2.scad
Found: model3.scad
[... more files ...]
Batch processing complete!
Part 5: Error Handling
Try-Catch Blocks
What if something goes wrong? Use try-catch:
Example:
try {
$file = "C:\nonexistent\path\file.txt"
$content = cat $file
Write-Output $content
} catch {
Write-Output "Error: Could not read file"
Write-Output "Details: $_"
}
What’s happening:
try= run these commands- If an error happens, PowerShell jumps to
catch catch= handle the error gracefully$_= the error message
Screen reader advantage: Errors are announced clearly instead of crashing silently.
Validating Input
Example: Make sure a folder exists before processing
function ProcessFolder {
param([string]$folderPath)
if (-not (Test-Path -Path $folderPath)) {
Write-Output "Error: Folder does not exist: $folderPath"
return
}
Write-Output "Processing folder: $folderPath"
ls -n $folderPath
}
ProcessFolder -folderPath "C:\Users\YourName\Documents"
What’s happening:
Test-Path= check if folder exists-not= if NOT truereturn= exit the function early if error
Part 6: Debugging Scripts
Common Errors and Solutions
Error 1: “Command not found”
Cause: Typo in command name
Fix: Check spelling
# Wrong:
writ-output "hello"
# Correct:
Write-Output "hello"
Error 2: “Variable is null”
Cause: Variable was never assigned
Fix: Make sure variable is set before using it
$myvar = "hello" # Set first
Write-Output $myvar # Then use
Error 3: “Cannot find path”
Cause: Wrong folder path
Fix: Verify path exists
# Check if path exists:
Test-Path -Path "C:\Users\YourName\Documents"
# If false, the path is wrong
Error 4: “Access denied”
Cause: Don’t have permission
Fix: Run PowerShell as administrator
- Right-click PowerShell -> Run as administrator
Debugging Technique: Trace Output
Add Write-Output statements to track what’s happening:
$path = "C:\Users\YourName\Documents"
Write-Output "Starting script. Path is: $path"
$files = ls -n $path
Write-Output "Found $($files.Count) files"
foreach ($file in $files) {
Write-Output "Processing: $file"
# Do something with $file
Write-Output "Done with: $file"
}
Write-Output "Script complete"
Your screen reader will announce each step, so you know where errors happen.
Part 7: Creating Professional Workflows
Example 1: Automated Project Setup
Scenario: You start a new 3D printing project regularly. Instead of creating folders manually:
function SetupNewProject {
param([string]$projectName)
$baseFolder = "C:\Users\YourName\Documents\3D_Projects"
$projectFolder = Join-Path -Path $baseFolder -ChildPath $projectName
# Create folder structure
mkdir $projectFolder -Force
mkdir "$projectFolder\designs" -Force
mkdir "$projectFolder\output" -Force
mkdir "$projectFolder\notes" -Force
# Create a README
$readmeContent = @"
# $projectName
Created: $(Get-Date)
## Designs
All .scad files go here.
## Output
STL and other exports go here.
## Notes
Project notes and observations.
"@
$readmeContent | Out-File -FilePath "$projectFolder\README.txt" -Encoding utf8
Write-Output "Project setup complete: $projectFolder"
}
# Use it:
SetupNewProject -projectName "MyKeychain"
SetupNewProject -projectName "PhoneStand"
What it does:
- Creates folder structure for a new project
- Sets up subfolders for designs, output, notes
- Creates a README file automatically
Example 2: Batch File Verification
Scenario: Before processing, verify all required files exist:
function VerifyProjectFiles {
param([string]$projectFolder)
$requiredFiles = @(
"README.txt",
"designs",
"output",
"notes"
)
$allGood = $true
foreach ($item in $requiredFiles) {
$path = Join-Path -Path $projectFolder -ChildPath $item
if (Test-Path -Path $path) {
Write-Output " Found: $item"
} else {
Write-Output " Missing: $item"
$allGood = $false
}
}
if ($allGood) {
Write-Output "All checks passed!"
return $true
} else {
Write-Output "Some files are missing!"
return $false
}
}
# Use it:
$verified = VerifyProjectFiles -projectFolder "C:\Users\YourName\Documents\3D_Projects\MyKeychain"
if ($verified) {
Write-Output "Safe to proceed with processing"
}
Part 8: Screen Reader Tips for Scripts
Making Script Output Readable
Problem: Script runs but output scrolls too fast or is hard to follow
Solution 1: Save to file
.\my-script.ps1 > output.txt
notepad.exe output.txt
Solution 2: Use Write-Output with clear sections
Write-Output "========== STARTING =========="
Write-Output ""
# ... script ...
Write-Output ""
Write-Output "========== COMPLETE =========="
Solution 3: Pause between major sections
Write-Output "Pausing... Press Enter to continue"
Read-Host
Your screen reader will announce the pause, give you time to read output.
Announcing Progress
For long-running scripts:
$files = ls -n *.scad
$count = 0
foreach ($file in $files) {
$count++
Write-Output "Processing $count of $($files.Count): $file"
# Do something with $file
}
Write-Output "All $count files processed!"
Practice Exercises
Exercise 1: Your First Script
Goal: Create and run a simple script
Steps:
- Create file:
notepad.exe hello.ps1 - Type:
Write-Output "Hello from my first PowerShell script!" pwd ls -n - Save and run:
.\hello.ps1
Checkpoint: You should see output for each command.
Exercise 2: Script with a Variable
Goal: Use a variable to make the script flexible
Steps:
- Create file:
notepad.exe smart-listing.ps1 - Type:
$targetFolder = "C:\Users\YourName\Documents" Write-Output "Listing contents of: $targetFolder" ls -n $targetFolder - Edit
$targetFolderto a real folder on your computer - Run:
.\smart-listing.ps1
Checkpoint: You should see listing of that specific folder.
Exercise 3: Function
Goal: Create a reusable function
Steps:
- Create file:
notepad.exe navigate.ps1 - Type:
function GoTo { param([string]$path) if (Test-Path -Path $path) { cd $path Write-Output "Now in: $(pwd)" Write-Output "Contents:" ls -n } else { Write-Output "Path does not exist: $path" } } # Test the function: GoTo -path "C:\Users\YourName\Documents" GoTo -path "C:\Users\YourName\Downloads" - Run:
.\navigate.ps1
Checkpoint: Both commands should work, showing contents of each folder.
Exercise 4: Loop
Goal: Use a loop to repeat an action
Steps:
- Create file:
notepad.exe repeat.ps1 - Type:
Write-Output "Demonstrating a loop:" for ($i = 1; $i -le 5; $i++) { Write-Output "Iteration $i: Hello!" } Write-Output "Loop complete!" - Run:
.\repeat.ps1
Checkpoint: Should print “Iteration 1” through “Iteration 5”.
Exercise 5: Real-World Script
Goal: Create a useful script for a real task
Steps:
- Create a folder:
mkdir C:\Users\YourName\Documents\TestFiles - Create some test files:
echo "test" > C:\Users\YourName\Documents\TestFiles\file1.txt echo "test" > C:\Users\YourName\Documents\TestFiles\file2.txt echo "test" > C:\Users\YourName\Documents\TestFiles\file3.txt - Create script:
notepad.exe report.ps1 - Type:
$folder = "C:\Users\YourName\Documents\TestFiles" $files = ls -n $folder Write-Output "=== FILE REPORT ===" Write-Output "Folder: $folder" Write-Output "Total files: $($files.Count)" Write-Output "" Write-Output "Files:" foreach ($file in $files) { Write-Output " - $file" } Write-Output "" Write-Output "=== END REPORT ===" - Run:
.\report.ps1
Checkpoint: Should show report of all files in the test folder.
Quiz - Lesson PS-6
- What is a PowerShell script?
- What file extension do PowerShell scripts use?
- What is a variable and how do you create one?
- What is a function and why would you use one?
- How do you run a script?
- What is a loop and what does
foreachdo? - What does
Test-Pathdo? - How do you handle errors in a script?
- When would you use
Try-Catch? - What technique makes script output readable for screen readers?
Extension Problems
- Auto-Backup Script: Create a script that copies all files from one folder to another, announcing progress
- File Counter: Write a function that counts files by extension (.txt, .scad, .stl, etc.)
- Folder Cleaner: Script that deletes files older than 30 days (with user confirmation)
- Project Template: Function that creates a complete project folder structure with all needed files
- Batch Rename: Script that renames all files in a folder according to a pattern
- Log Generator: Create a script that records what it does to a log file for later review
- Scheduled Task: Set up a script to run automatically every day at a specific time
- File Verifier: Check that all SCAD files in a folder have corresponding STL exports
- Report Generator: Create a summary report of all projects in a folder
- Error Tracker: Script that lists all commands that had errors in your recent history
Important Notes
- Always test scripts on small sets of files first before running them on important data
- Save your work regularly - use version control if possible
- Test error handling - make sure errors don’t crash silently
- Document your scripts - use comments so you remember what each part does
- Backup before batch operations - if something goes wrong, you have the original
References
- Microsoft PowerShell Scripting Guide: https://docs.microsoft.com/powershell/scripting/
- Function Documentation: https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_functions_advanced
- Error Handling: https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_error_handling
- Loops: https://docs.microsoft.com/powershell/module/microsoft.powershell.core/about/about_foreach
Next Steps: After mastering this lesson, explore PowerShell modules, remoting, and 3D printing integration in the main curriculum.
PowerShell Introduction - Screen-reader friendly (JAWS/NVDA)
Estimated time: 20-30 minutes
Target audience: Users who are new to the command line and use screen readers.
Learning Goals
- Open and identify the PowerShell prompt
- Run basic commands:
pwd,ls -n,cd,ni,cat,echo - Redirect and page through long outputs for screen readers
- Use
Get-HelpandGet-Commandto learn more
Starting PowerShell
Windows
- Press Windows, type
PowerShell, then press Enter. - If you need elevated rights, press Windows+X then choose Windows PowerShell (Admin).
macOS / Linux
- Open Terminal.app (macOS) or your preferred terminal (Linux).
- Type
pwshand press Enter (PowerShell Core / pwsh must be installed).
When PowerShell starts you will hear the prompt and usually your current path. The default prompt often includes PS followed by the path, e.g., PS C:\Users\YourName>.
Essential commands - short list
pwd- print working directory (where you are now)ls -n- list file and folder names only (recommended for screen readers)cd <path>- change directoryni <filename>- create a file (alias for New-Item)cat <file>- show file contentsecho <text>- print text
Quick examples:
pwd
ls -n
cd Documents
ni notes.txt
echo "hello" > notes.txt
cat notes.txt
Paging long outputs for screen readers
- If an output is long, redirect to a file and open it in an editor:
some-command > output.txt ; notepad.exe output.txt. - Or pipe to
more:some-command | more(press Space to advance pages, Q to quit). - For very long listings prefer
ls -n | Out-File -FilePath list.txt -Encoding utf8then openlist.txt.
Help and discovery
Get-Help <command>shows help:Get-Help lsorGet-Help Get-ChildItem.Get-Command <name>locates a program or cmdlet:Get-Command openscad.
Tip: Redirect Get-Help into a file for easier reading: Get-Help Get-Command | Out-File help.txt ; notepad.exe help.txt.
Running scripts and executables
- Use the call operator
&to run files with spaces or when PowerShell might treat them differently:& "./script.ps1". - To run an executable by path:
& 'C:\Program Files\OpenSCAD\openscad.exe'.
Screen reader specific tips (JAWS, NVDA)
- Use
ls -nto avoid cluttered, multi-column listings. - Redirect large outputs to a text file and open it in an editor that your screen reader handles well.
- If output stops being announced, try moving focus with
Alt+Taband back, or briefly pressingCtrlorShiftto force announcement.
Suggested learning path
- Open PowerShell, run
pwd,ls -n,cdinto Documents. - Create a file with
ni test.txt, add a line withecho "hi" > test.txt, and read it withcat test.txt. - Use
Get-Help lsand redirect output to a file to read comfortably.
Hands-on: Explore the terminal (Beginner)
- Run
pwdand speak or note the output. - Run
ls -nin your home directory. If the list is long, save it:ls -n > listing.txt ; notepad.exe listing.txt. - Create a folder and file:
mkdir PS_Practice ; cd PS_Practice ; ni notes.txt. - Add a line:
echo "My first note" > notes.txt ; cat notes.txt.
Extension Exercises
- Use wildcards to list only
.scadfiles:ls -n *.scad. Proceed to search for other types of files. - Save a long command’s output and search it with
Select-String. - Create a small script that prints a timestamp and test it with
&. - Build a project template generator: write a script that creates a folder structure for a new 3D printing project.
- Create a personalized PowerShell profile with aliases for frequently used commands; test it after restart.
- Write a PowerShell script that combines multiple concepts: navigates folders, creates files, and performs file operations.
- Create a screen-reader navigation guide for PowerShell ISE; test with actual screen reader if available.
- Build a data analysis script: read a CSV file, filter and process data, and generate a report.
- Develop a troubleshooting aide: common PowerShell error messages, their causes, and solutions.
- Design a comprehensive PowerShell learning portfolio: document skills developed, commands mastered, scripts created, and practical applications.
Quick Quiz (10 questions)
- What command shows your current directory?
- How do you list names only for screen readers?
- How do you create an empty file?
- What operator runs a script or executable by path?
- How do you page through long output?
- True or False: PowerShell only runs on Windows.
- What does the
~symbol represent in a PowerShell path? - Explain why redirecting output to a file (e.g.,
command > output.txt) is helpful for screen reader users. - What is the difference between
Get-HelpandGet-Command? - Describe a practical scenario where you would use piping (
|) in PowerShell.
References
- Microsoft. (2024). PowerShell scripting language documentation. https://learn.microsoft.com/powershell/
- Microsoft. (2024). Out-File cmdlet reference. https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/out-file
- Wadhwa, K. & others. (2024). PowerShell for DevOps and system administration. https://learn.microsoft.com/powershell/scripting/learn/shell/navigate-the-filesystem
PowerShell Tutorial
Estimated time: 30-45 minutes
Learning Objectives
- Launch PowerShell and identify the prompt
- Understand and use basic path notation (
~,./,../) - Use
pwd,ls -n, andcdto navigate the filesystem - Open files in an external editor and run simple commands
Materials
- A computer with PowerShell installed
- Access to a text editor (Notepad, VS Code)
Pre-Requisite Knowledge
- Typing and basic text-editing skills
- Familiarity with file/folder concepts and basic OS navigation
- Basic screen-reading familiarity (if applicable)
What is PowerShell?
PowerShell is a cross-platform command-line shell and scripting language that runs on Windows, Linux, and macOS. It lets you control your computer with text commands instead of a graphical user interface (GUI). In this course we use PowerShell to run CLI tools (like OpenSCAD, slicers, or 3DMake), move files, and automate repetitive tasks.
What we’ll do and why
You’ll use PowerShell to run CLI programs, navigate the filesystem, and manipulate files - tasks that are especially efficient when using a keyboard or a screen reader.
Quick tutorial & core concepts
Paths and navigation
~- home directory.- current directory..- parent directory./- current directory shortcut../- parent directory shortcut- Use Tab to autocomplete files and folders (try typing
~/Dthen press Tab)
Paths typically use \ on Windows and / on Unix-like systems; PowerShell accepts / in most contexts.
Useful commands (examples)
pwd # show current directory
ls -n # list names only (screen-reader friendly)
cd path/to/dir # change directory
whoami # current user
Wildcards
*matches zero or more characters?matches a single character
Use ls -n *.scad to filter by extension, for example.
Common operations
File and folder manipulation
mkdir my-folder # create folder
cp -r src dest # copy (use -r for directories)
mv oldname newname # rename or move
rm file # remove file
ni filename.txt # create new file (New-Item alias)
Input, output, and piping
echo 'hello' | clip # copy to clipboard
command > output.txt # redirect output to file
command > $null # discard/suppress output
Use | to pipe output and > to redirect into files.
Editing and running programs
notepad.exe file.txt # open in Notepad (Windows)
code file.txt # open in VS Code (if in PATH)
& './script.ps1' # call operator to run a script or executable
On Linux/macOS, use ./myapp for local executables where appropriate.
Screen-reader friendly tips
- Prefer
ls -nfor name-only output. - Filter lists with
-af(files) or-ad(directories):ls -n -af ~/Documents. - Redirect very long outputs to a file and open it in an editor.
Error handling and control
- Abort a running command:
Ctrl+C - View history: Up/Down arrows or
Get-History - Clear screen:
clear - If an error is long, read the first few lines for the gist and copy short snippets into an editor to examine.
Environment variables & PATH
Environment variables configure your session. PATH tells the shell where to find executables.
echo $env:PATH
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:/mytools", "Machine")
Setting machine-level environment variables requires Administrator privileges.
Running PowerShell as Administrator
- Press Windows+X and choose Windows PowerShell (Admin).
- If a UAC dialog appears, press Alt+Y to accept.
Running CLI applications and archives
To extract ZIP archives:
Expand-Archive -Path file.zip -DestinationPath folder
Aliases and cross-platform notes
PowerShell provides aliases (ls, cp, mv) mapping to cmdlets (Get-ChildItem, Copy-Item, Move-Item). They make PowerShell feel familiar but can behave differently than native Linux tools. Concepts transfer to WSL, macOS, and Linux, but watch path and permission differences.
Step-by-step Tasks (Hands-on)
- Open PowerShell; listen for the prompt and current path.
- Run
pwdto confirm your location. - Run
ls -nin your home directory and note the output. - Practice
cd Documents,cd ../, andcd ~to move between folders. - Create and open a file:
ni example.txt ; notepad.exe example.txt(orcode example.txt).
Checkpoints
- After step 3 you should be able to state your current directory.
- After step 5 you should be able to create and open a text file from PowerShell.
Quick Quiz (10 questions)
- What command prints your current directory?
- What does
~represent? - How do you list only names with
ls? - How do you go up one directory level?
- How would you open
notes.txtin Notepad from PowerShell? - True or False: The pipe operator
|sends output to a file. - Explain why running commands with elevated privileges (as Administrator) might be necessary.
- What is the difference between running a script with
./script.ps1versus& './script.ps1'? - Describe how you would handle a very long command output when using a screen reader.
- What does the
PATHenvironment variable do, and why is it important when running programs like OpenSCAD?
Extension Problems
- Create a folder
OpenSCAD_Projectsin Documents and verify its contents. - Create three files named
a.scad,b.scad,c.scadand list them with a wildcard. - Save
ls -n ~/Documentsoutput todoc_list.txtand open it. - Try tab-completion in a deeply nested folder and note behavior.
- Capture
pwdoutput into a file and open it:pwd > cwd.txt ; notepad.exe cwd.txt. - Build an automated setup script that creates a complete project directory structure, initializes placeholder files, and generates a README.
- Create a PowerShell cheat sheet for your most-used commands; organize by category (navigation, files, scripting, troubleshooting).
- Write a non-visual tutorial for PowerShell basics; use audio descriptions and keyboard-only navigation as the primary learning method.
- Develop a workflow automation script: combines multiple PowerShell concepts (folders, aliases, piping) to solve a real 3D printing task.
- Create a PowerShell proficiency self-assessment: list all concepts covered, provide test commands for each, and reflect on what you learned.
References
- Microsoft. (2024). Accessibility in PowerShell ISE. https://learn.microsoft.com/powershell/scripting/windows-powershell/ise/accessibility-in-windows-powershell-ise
- Microsoft. (2024). Learn PowerShell scripting language. https://learn.microsoft.com/powershell/scripting/overview
- Microsoft. (2024). Environment variables and PATH configuration. https://learn.microsoft.com/powershell/scripting/learn/shell/using-aliases
Helpful Resources
- Accessibility in PowerShell ISE (Microsoft): https://learn.microsoft.com/powershell/scripting/windows-powershell/ise/accessibility-in-windows-powershell-ise
- Learn PowerShell (Microsoft Docs): https://learn.microsoft.com/powershell/scripting/overview
- Environment Variables & PATH: https://poshcode.gitbook.io/powershell-faq/src/getting-started/environment-variables
- Alias Reference: https://learn.microsoft.com/powershell/scripting/learn/shell/using-aliases
PowerShell Unit Test - Comprehensive Assessment
Estimated time: 60-90 minutes
Key Learning Outcomes Assessed
By completing this unit test, you will demonstrate:
- Understanding of file system navigation and path concepts
- Proficiency with file and folder manipulation commands
- Ability to redirect and pipe command output
- Knowledge of environment variables and aliases
- Screen-reader accessibility best practices in terminal environments
- Problem-solving and command chaining skills
Target Audience:
Users who have completed PS-0 through PS-5 and need to demonstrate mastery of PowerShell fundamentals.
Instructions:
Complete all sections below. For multiple choice, select the best answer. For short answers, write one to two sentences. For hands-on tasks, capture evidence (screenshots or output files) and submit alongside your answers.
Part A: Multiple Choice Questions (20 questions)
Select the best answer for each question. Each question is worth 1 point.
-
What is the primary purpose of the
PATHenvironment variable?- A) Store your home directory location
- B) Tell the shell where to find executable programs
- C) Configure the visual appearance of the terminal
- D) Store the current working directory name
-
Which command prints your current working directory?
- A)
ls -n - B)
cd - C)
pwd - D)
whoami
- A)
-
What does the
~symbol represent in PowerShell paths?- A) The root directory
- B) The current directory
- C) The parent directory
- D) The home directory
-
How do you list only file names (not full details) in a way that is screen-reader friendly?
- A)
ls - B)
ls -n - C)
ls -l - D)
cat -n
- A)
-
Which command creates a new empty file?
- A)
mkdir filename - B)
ni filename - C)
touch filename - D)
echo filename
- A)
-
What is the difference between
>and>>?- A)
>redirects to file,>>displays on screen - B)
>overwrites a file,>>appends to a file - C) They do the same thing
- D)
>is for text,>>is for binary
- A)
-
What does the pipe operator
|do?- A) Creates a folder
- B) Sends the output of one command to the input of another
- C) Deletes files matching a pattern
- D) Lists all processes
-
Which command copies a file?
- A)
mv - B)
rm - C)
cp - D)
cd
- A)
-
How do you rename a file from
oldname.txttonewname.txt?- A)
cp oldname.txt newname.txt - B)
mv oldname.txt newname.txt - C)
rename oldname.txt newname.txt - D)
rn oldname.txt newname.txt
- A)
-
What is the purpose of
Select-String?- A) Select files in a directory
- B) Search for text patterns within a file
- C) Select a string to copy to clipboard
- D) Select which shell to use
-
Which key combination allows you to autocomplete a path in PowerShell?
- A)
Ctrl + A - B)
Ctrl + E - C)
Tab - D)
Space
- A)
-
How do you copy text to the Windows clipboard from PowerShell?
- A)
cat filename > clipboard - B)
cat filename | clip - C)
copy filename - D)
cat filename | paste
- A)
-
What does
Get-Command openscaddo?- A) Opens the OpenSCAD application
- B) Gets help about the OpenSCAD command
- C) Locates the full path of the openscad executable
- D) Lists all available commands
-
Which wildcard matches any single character?
- A)
* - B)
? - C)
% - D)
#
- A)
-
What is the purpose of the
&call operator?- A) Run a script or executable by full path
- B) Execute all commands in parallel
- C) Combine multiple commands
- D) Create an alias
-
How do you create a temporary alias for a command?
- A)
alias preview='openscad' - B)
Set-Alias -Name preview -Value openscad - C)
New-Alias preview openscad - D)
Alias preview = openscad
- A)
-
Where is your PowerShell profile typically stored?
- A) C:\Program Files\PowerShell\profile.ps1
- B) The location returned by
echo $PROFILE - C) ~/PowerShell/profile.ps1
- D) ~/.bashrc
-
How do you abort a long-running command in PowerShell?
- A) Press
Escape - B) Press
Ctrl + X - C) Press
Ctrl + C - D) Press
Alt + F4
- A) Press
-
What command shows the history of previously run commands?
- A)
history - B)
Get-History - C)
Show-History - D) Both A and B
- A)
-
How do you permanently set an alias so it persists across PowerShell sessions?
- A) Use
Set-Aliasin the terminal every time - B) Add the
Set-Aliasline to your PowerShell profile - C) Use the Windows Control Panel
- D) Aliases cannot be made permanent
- A) Use
Part B: Short Answer Questions (10 questions)
Answer each question in one to two sentences. Each question is worth 2 points.
-
Explain the difference between absolute and relative paths. Give one example of each.
-
Why is
ls -npreferred overlsfor screen reader users? Describe what flag you would use to list only files. -
What is the purpose of redirecting output to a file, and give an example of when you would use
>instead of>>? -
Describe what would happen if you ran
rm -r ~/Documents/my_folderand why this command should be used carefully. -
How would you search for all files with a
.scadextension in your current directory? Write the command. -
Explain what happens when you pipe the output of
ls -nintoclip. What would you do next? -
What is an environment variable, and give one example of how you might use it in PowerShell.
-
If a program is not in your
PATH, what two methods could you use to run it from PowerShell? -
Describe how you would open a file in Notepad and also add a line to it from PowerShell.
-
What is one strategy you would use if your screen reader stops announcing terminal output while using PowerShell?
Part C: Hands-On Tasks (10 tasks)
Complete each task and capture evidence (screenshots, output files, or command transcripts). Each task is worth 3 points.
Tasks 1-5: File System and Navigation
-
Create a folder structure
~/Documents/PowerShell_Assessment/Projectsusing a single command. Capture thels -noutput showing the creation. -
Create five files named
project_1.scad,project_2.scad,project_3.txt,notes_1.txt, andnotes_2.txtinside theProjectsfolder. Use wildcards to list only.scadfiles, then capture the output. -
Copy the entire
Projectsfolder toProjects_Backupusingcp -r. Capture thels -noutput showing both folders exist. -
Move (rename)
project_1.scadtoproject_1_final.scad. Capture thels -noutput showing the renamed file. -
Delete
notes_1.txtandnotes_2.txtusing a singlermcommand with wildcards. Capture the finalls -noutput.
Tasks 6-10: Advanced Operations and Scripting
-
Create a file called
my_data.txtwith at least four lines usingechoand>>. Then read it withcat my_data.txtand capture the output. -
Use
Select-Stringto search for a keyword (e.g., “project”) inmy_data.txtand pipe the results toclip. Paste the results into Notepad and capture a screenshot. -
List all files in the
Projectsfolder and redirect the output toprojects_list.txt. Open it in Notepad and capture a screenshot of the file. -
Create a temporary alias called
mylsthat runsls -n, test it, and capture the output. Then explain what would be required to make it permanent. -
Run
Get-Help Get-ChildItemand redirect the output tohelp_output.txt. Open the file in Notepad and capture a screenshot showing at least the first page of help content.
Grading Rubric
| Section | Questions | Points Each | Total |
|---|---|---|---|
| Multiple Choice | 20 | 1 | 20 |
| Short Answer | 10 | 2 | 20 |
| Hands-On Tasks | 10 | 3 | 30 |
| Total | 40 | - | 70 |
Passing Score: 49 points (70%)
Helpful Resources for Review
- PowerShell Command Reference
- Navigation and File System
- Using Pipes and Filtering
- Profile and Aliases
- Screen Reader Accessibility Tips
Submission Checklist
- All 20 multiple choice questions answered
- All 10 short answer questions answered (1-2 sentences each)
- All 10 hands-on tasks completed with evidence captured
- Files/screenshots organized and labeled clearly
- Submission includes this checklist
Lesson 1: Environmental Configuration and the Developer Workflow
Estimated time: 60-90 minutes
Learning Objectives
- Install and verify
3dm1,openscad2, and a slicer are discoverable in the terminal - Initialize a 3dMake project and understand the project scaffold (
src/,build/,3dmake.toml) - Edit
src/main.scadusing OpenSCAD’s parametric design capabilities3, run3dm build, and inspect the generatedbuild/main.stl
Materials
- Terminal with 3dMake installed
- Editor (VS Code or Notepad)
- Example scaffold or classroom repository
Step-by-step Tasks
-
Run
./3dm setupor follow instructor’s installation notes; confirm tools withwhich 3dmandwhich openscad. Verify your 3dMake installation is properly configured1. -
Create a project scaffold with
3dm newand opensrc/main.scadusing3dm edit-model. For a comprehensive introduction to the workflow, consult the OpenSCAD documentation2. -
Add three top-level parameters (e.g.,
width,height,thickness) and a minimal model. This demonstrates the parametric design philosophy central to OpenSCAD3.Example
src/main.scad:// Top-level parameters (change these to customize your model) width = 50; // mm height = 30; // mm thickness = 5; // mm // Main model cube([width, height, thickness]); -
Run
3dm buildand verifybuild/main.stlexists. Compare this build process to standard OpenSCAD workflows4. -
Open the STL in your slicer to check for thin walls or non-manifold geometry5; if issues appear, iterate on
main.scadand rebuild. -
Try modifying the parameters and running
3dm buildagain to see how parametric design allows you to quickly create variants.
Checkpoints
- After step 2 you can locate
3dmake.tomland thebuild/directory. Ensure your project scaffold matches the expected structure described in the 3dMake repository1. - After step 4 the
build/folder contains a validmain.stl. Verify the geometry using your slicer’s validation tools6.
Understanding 3D Printing Technology: The FDM Pipeline
Before you send your first print, it’s important to understand how 3D printers work and how the choices you make in the slicer affect the final result. This section builds on the workflow you learned above by explaining what happens after 3dm build.
The FDM (Fused Deposition Modeling) Process
FDM printing builds objects layer by layer, where each layer is a thin horizontal slice of your STL file. Here’s the complete pipeline:
- STL File -> Your 3dMake model exported as an STL geometry file
- Slicer Analysis -> Software like PrusaSlicer reads the STL and divides it into layers
- G-code Generation -> The slicer converts layers into machine instructions (coordinates, temperature, speed)
- Printing -> The printer reads G-code, heats the nozzle to ~200-230C, and extrudes plastic one layer at a time
- Cooling & Solidification -> Each layer cools and bonds to the layer below
Critical Settings That Affect Your Print
When you open your STL in a slicer, you’ll encounter several parameters that directly impact quality, time, and strength:
Layer Height
- Definition: The thickness of each printed layer (typically 0.15-0.30 mm)
- Effect on Time: Smaller layers = more detail but longer print time. A layer height of 0.15 mm prints slower than 0.30 mm because more layers must be printed
- Effect on Quality: Smaller layers produce smoother surfaces; larger layers print faster but appear more “stepped”
- Common Choice: 0.20 mm is a good balance for classroom projects
Infill
- Definition: The interior solid percentage of your model (0-100%)
- Purpose: Infill provides internal strength without using solid material throughout (which would be wasteful and heavy)
- Common Values for Classroom: 15-20% infill is typical; 10% for very light parts, 50% for functional parts
- Infill Patterns: Grid, gyroid, or honeycomb patterns determine how the internal structure looks. Grid is simple and fast; gyroid is strong but more complex
- Rule of Thumb: Higher infill = stronger, heavier, and longer print time
Supports
- Definition: Temporary structures the printer creates to hold overhanging geometry during printing
- When Needed: Any geometry that “hangs” at a steep angle (typically > 45 from vertical) requires supports
- Post-Processing: Supports must be removed after printing (breaking them off, dissolving them, or picking them away)
- Cost: Supports increase print time and waste material, so good STL design minimizes them
Why This Matters for Your Design
When you wrote src/main.scad in the tasks above, you created a parametric model. Those parameters become constraints that affect how well your part prints:
- A
thicknessof 0.5 mm might be too thin for FDM (will break easily) - A
widthof 300 mm will take many hours to print - Sharp corners and thin walls can cause printing failures
Understanding the FDM pipeline helps you design parts that not only look correct in OpenSCAD but will actually print successfully.
Next Steps: The Slicer
After you create an STL with 3dm build, you open it in a slicer to:
- Verify geometry (check for thin walls or non-manifold faces)
- Set layer height, infill, and supports
- Preview the layers to see what the printer will do
- Export as G-code to send to the printer
You’ll practice this workflow in Lesson 2, where you’ll iterate on a simple part and resolve common printing issues.
Getting Started: Guided Projects & Extension Resources
Once you’ve completed this lesson, you’re ready to work on hands-on projects. The curriculum includes several guided projects and extension resources:
Extension Projects (Beginner to Advanced)
These projects are located in the Lesson 1 assets folder and are designed to reinforce your skills in practical contexts:
-
Your First Print (Lesson 1 Assets - Your First Print)
- Goal: Low-friction introduction to the complete printing workflow
- Skills: Setup, basic slicing, first-time print validation
- Best for: After completing Lesson 1
- Asset folder: assets/Lessons_3dMake_1/Your_First_Print/
-
Basic Project Scaffold Template (Lesson 1 Assets - SCAD Template)
- A starter template for your own 3D printing projects
- Includes parameter configuration and TODO sections
Learning Series Sample Projects
The 3dmake_learning_series/ folder contains worked examples aligned with this curriculum:
- 01_cube_keycap (Beginner) - Text embossing basics
- 02_parametric_phone_stand (Intermediate) - Transforms and Minkowski fillets
- 03_stackable_bins (Advanced) - Tolerance and assemblies
Reference Materials
Quick-reference guides are available in Reference_Materials/:
- 3dmake-setup-guide.md - Complete setup walkthrough and command reference
- openscad-cheat-sheet.md - Keyboard shortcuts, syntax, and common functions
- filament-comparison-table.md - Material properties for different print scenarios
- master-rubric.md - Assessment criteria for evaluating student work
- markdown-starter-guide.md - Documentation best practices
Quiz - Lesson 3dMake.1 (10 questions)
- What command initializes a 3dMake project?
- What folder holds generated STLs?
- How do you open the main model editor from the CLI?
- Why is it useful to run
3dm buildfrequently during development? - Give one reason to prefer an external editor over editing inline.
- True or False: 3dMake requires a graphical user interface to use effectively.
- Explain what the
3dmake.tomlfile does in your project. - Describe what the
src/,build/, and other project scaffold folders are used for. - How would you compare the 3dMake build workflow to traditional OpenSCAD workflows?
- What validation steps should you perform after running
3dm buildand before sending a file to print?
Extension Problems (10)
- Add a README entry explaining your top-level parameters and expected units. Reference best practices from the OpenSCAD documentation2.
- Create a parameter variant by changing
widthby 20% and build both variants; compare dimensions with calipers. This demonstrates the power of parametric design discussed in programming resources3. - Script a
3dmcommand sequence that automates new -> edit -> build for the scaffold. Review the 3dMake test suite for inspiration7. - Intentionally create a thin-wall error and document the steps you took to find and fix it. Consult slicing guides8 for identifying common geometry issues.
- Prepare a short instructor sign-off checklist describing safety checks before printing.
- Build a variant testing suite: create 5+ parameter combinations, export STLs, and compare file sizes and estimated print times.
- Create a 3dMake project template with best-practice structure, documentation, and reusable modules for future projects.
- Develop a screen-reader accessibility guide for 3dMake CLI commands and parameter syntax.
- Design a parametric part library in 3dMake format; document all parameters, units, and example usage.
- Write a comprehensive troubleshooting guide for common 3dMake build errors, with solutions and prevention tips.
Supplemental Resources
For deeper exploration of OpenSCAD and parametric design, consult these resources:
- Programming with OpenSCAD EPUB Textbook - Comprehensive reference with examples of parametric design, transformations, and modules
- CodeSolutions Repository - Working OpenSCAD code organized by topic, including 3D primitives and parametric examples relevant to Lesson 1
- OpenSCAD Quick Reference - Visual syntax guide and command reference
-
3DMake GitHub Repository - https://github.com/tdeck/3dmake ↩ ↩2 ↩3
-
OpenSCAD Manual - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual ↩ ↩2 ↩3
-
OpenSCAD Parametric Design - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Variables ↩ ↩2 ↩3
-
OpenSCAD Review - Worth learning? - CadHub, accessed February 18, 2026, https://learn.cadhub.xyz/blog/openscad-review/ ↩
-
OpenSCAD Prompt Creation - DocsBot AI, accessed February 18, 2026, https://docsbot.ai/prompts/technical/openscad-prompt-creation ↩
-
Slicer Validation Tools - PrusaSlicer Documentation - https://docs.prusa3d.com/en/guide/39012-validation-tools/ ↩
-
3dmake/e2e_test.py at main - GitHub, accessed February 18, 2026, https://github.com/tdeck/3dmake/blob/main/e2e_test.py ↩
-
Slicing Guides and Common Geometry Issues - PrusaSlicer Documentation, accessed February 18, 2026, https://docs.prusa3d.com/en/ ↩
3dMake Setup & Workflow Guide (Comprehensive)
This guide walks you through installing 3dMake, creating projects, and managing your workflow efficiently.
Part 1: Installing 3dMake
Prerequisites
Before installing 3dMake, ensure you have:
- Windows or Linux operating system (macOS is not currently supported)
- Terminal or PowerShell access
- Internet connection to download 3dMake
- At least 100 MB of free disk space
Platform Support
Supported:
- Windows (32-bit and 64-bit)
- Linux (x86-64 architecture)
Not Supported:
- macOS - Currently no macOS version is available
Step-by-Step Installation
Step 1: Download 3dMake for Your Operating System
Visit the 3dMake releases page and download the appropriate version:
Windows:
- Go to 3dMake Windows Download
- This downloads
3dmake_windows.zipto your computer - Right-click the file and select “Extract All…” (or use your preferred extraction tool)
- Remember where you extracted it (e.g.,
C:\Users\YourName\3dmakeorC:\Program Files\3dmake)
Linux:
- Go to 3dMake Linux Download
- This downloads
3dmake_linux.tar.gzto your computer - Extract it using:
tar -xzf 3dmake_linux.tar.gz - Remember where you extracted it (e.g.,
~/3dmakeor/opt/3dmake)
Step 2: Open Your Terminal
Windows:
- Press
Win + Xand select “Windows PowerShell” or “Terminal” - For screen reader users: Use
Alt + F2and typepowershellif needed
Linux:
- Open your terminal application (Terminal, Konsole, GNOME Terminal, etc.)
Step 3: Navigate to 3dMake Directory
Navigate to where you extracted 3dMake:
Windows:
cd C:\Users\YourName\3dmake
Linux:
cd ~/3dmake
For screen reader users: Use pwd (print working directory) to confirm your location.
Step 4: Run the Setup Command
From inside the 3dMake directory, run:
Windows:
.\3dm setup
Linux:
./3dm setup
Follow the prompts to configure:
- Your default printer profile (e.g., Prusa MK4, Bambu Lab)
- OctoPrint connection (if you use OctoPrint)
- AI integration (optional - for model descriptions)
- Preferred text editor
Step 5: Complete Installation
After setup finishes, 3dMake will be available from any directory. You can now use the 3dm command from your terminal.
Do not delete the original 3dMake directory where you extracted the files, as 3dMake needs to reference it.
Step 6: Verify Installation
3dm --version
You should see the installed version number. If you see an error, verify:
- You’re in the 3dMake directory
- The extraction completed successfully
- Your terminal has access to the extracted files
Step 7: Get Help
3dm help
This displays all available 3dMake commands.
Part 2: Creating and Managing Projects
What Is a 3dMake Project?
A 3dMake project is a folder structure that organizes:
- src/ folder - contains your OpenSCAD (.scad) files
- build/ folder - stores outputs that 3dMake generates (STL files, sliced GCODE, etc.)
- 3dmake.toml file - project configuration and settings
- README.md - project documentation
Creating Your First Project
Step 1: Choose or Create a Project Directory
Decide where you want your project. Examples:
Windows:
C:\Users\YourName\Documents\3d-projects\
C:\Users\YourName\Desktop\MyProject\
Linux:
~/3d-projects/
~/Documents/3d-projects/
Create the directory if it doesn’t exist:
Windows:
mkdir C:\Users\YourName\Documents\3d-projects\FirstProject
Linux:
mkdir -p ~/3d-projects/FirstProject
Step 2: Navigate Into Your Project Directory
Windows:
cd C:\Users\YourName\Documents\3d-projects\FirstProject
Linux:
cd ~/3d-projects/FirstProject
For screen reader users: Use pwd (print working directory) to confirm you’re in the right folder.
Step 3: Initialize a 3dMake Project
3dm new
This creates the project structure:
FirstProject/
+------ src/ (stores your .scad files)
+------ build/ (stores generated files: STL, GCODE, etc.)
+------ 3dmake.toml (project configuration)
+------ README.md (project documentation)
The src/main.scad file is created as a starting template.
Step 4: Verify Project Creation
Windows:
Get-ChildItem -Force
Linux:
ls -la
You should see the src/, build/, 3dmake.toml, and README.md files listed.
Part 3: Working With Your Project
Creating OpenSCAD Models
Step 1: Create or Edit OpenSCAD Files
The main model file is src/main.scad. You can edit it directly using 3dMake:
3dm edit-model
This opens src/main.scad in your configured text editor.
To edit a different model (if you create additional .scad files):
3dm edit-model -m mymodel
This opens src/mymodel.scad.
Manual File Creation:
You can also create .scad files directly in the src/ folder using your preferred text editor:
- Visual Studio Code
- Notepad++ (Windows)
- Gedit (Linux)
- Nano or Vim (terminal-based)
Step 2: Building Your Model
Before exporting, build the model from your OpenSCAD code:
3dm build
This converts your OpenSCAD code into a 3D mesh (geometry). The output is build/main.stl.
For a different model:
3dm build -m mymodel
This creates build/mymodel.stl.
Step 3: Viewing Model Information
To see statistics about your model:
3dm info
Output includes:
- Bounding box - dimensions (X, Y, Z in millimeters)
- Volume - cubic millimeters of material
- Face count - total triangles in the mesh
- Manifold status - whether model is watertight (printable)
Example output:
Volume: 1234.56 mm
Bounding Box: 50.0 x 40.0 x 30.0 mm
Faces: 2048
Manifold: Yes
Step 4: Previewing Your Model
3dMake can create flat “tactile previews” of your model (fast-printing 2D silhouettes):
3dm preview slice
This generates a preview STL and slices it (ready to print in minutes).
To print the preview directly:
3dm preview print
Available preview types:
3sil- Three silhouettes (front, left, top) - defaultfrontsil- Front-facing silhouette onlytopsil- Top-down silhouette only
Change preview type:
3dm preview -v topsil print
Step 5: Slicing and Preparing for Print
To slice your model (convert STL to GCODE for your printer):
3dm build slice
This creates both:
build/main.stl- the 3D modelbuild/main.gcode- sliced for your printer
Step 6: Printing Directly from 3dMake
If your printer is connected via OctoPrint or Bambu Labs (LAN mode):
3dm build slice print
This builds, slices, and sends directly to your printer in one command.
Or simply:
3dm build print
(The print command automatically includes slicing)
Part 4: Managing Multiple Projects
Switching Between Projects
Method 1: Navigate via Terminal
# Leave current project
cd ..
# Enter a different project
cd ../SecondProject
pwd # Verify you're in the right place
For screen reader users, always use pwd after navigating to confirm your location.
Method 2: Create a Projects Directory Structure
Create a central folder for all projects:
3d-projects/
+------ FirstProject/
| +------ src/
| +------ build/
| +------ 3dmake.toml
+------ SecondProject/
| +------ src/
| +------ build/
| +------ 3dmake.toml
+------ README.md (project index)
Method 3: Use a Project Index
Create a README.md in your 3d-projects/ folder to track all projects:
# My 3D Projects
## Project List
1. **FirstProject** - My initial test models
- Location: `./FirstProject/src/`
- Status: In progress
- Latest model: `main.scad`
2. **SecondProject** - Parametric keychain designs
- Location: `./SecondProject/src/`
- Status: Complete
- Latest model: `keychain.scad`
3. **ThirdProject** - Functional brackets for printing
- Location: `./ThirdProject/src/`
- Status: In progress
- Latest model: `bracket_assembly.scad`
Building from All Projects
To build models from all projects:
Windows:
Get-ChildItem -Directory | ForEach-Object {
cd $_.FullName
3dm build
cd ..
}
Linux/Bash:
for project in */; do
cd "$project"
3dm build
cd ..
done
Part 5: Workflow Best Practices
File Naming Conventions
Use clear, descriptive names for your .scad files:
Good:
cube_5cm.scadparametric_box_v2.scadbracket_for_motor.scadmain.scad(default project model)
Avoid:
test.scadmodel1.scadfinal_final_FINAL.scad
Understanding TOML Configuration Files
What is TOML?
TOML (Tom’s Obvious, Minimal Language) is a human-readable configuration file format. It’s designed to be simple and clear, making it easy to read and edit in any text editor.
Basic TOML Formatting Rules:
-
Key-value pairs - Each setting has a name and value separated by an equals sign:
project_name = "My Project" -
Strings use quotes - Text values must be wrapped in double quotes:
editor = "code" printer_profile = "prusa_MK4" -
Numbers don’t need quotes - Numeric values stand alone:
scale = 1.05 copies = 3 -
Boolean values are true or false - Lowercase, no quotes:
auto_start_prints = true edit_in_background = false -
Arrays use square brackets - Lists of values separated by commas:
overlays = ["supports", "PETG"] libraries = ["bosl", "braille-chars"] -
One setting per line - Each configuration on its own line
-
Comments start with # - Use for notes (not processed):
# This is my default printer printer_profile = "prusa_MK4"
How 3dMake Uses TOML:
3dMake has two TOML configuration files:
- Global config (
defaults.toml) - Settings for all your projects (run3dm edit-global-configto edit) - Project config (
3dmake.toml) - Settings specific to one project (located in your project root)
Project settings override global settings. For example, if your global config says printer_profile = "prusa_MK4" but your project’s 3dmake.toml says printer_profile = "bambu", the project setting wins.
Project Configuration (3dmake.toml)
The 3dmake.toml file in your project root contains project-specific settings:
project_name = "My Project"
model_name = "main"
printer_profile = "prusa_MK4"
overlays = []
editor = "code"
Edit your project configuration:
3dm edit-global-config
This opens your configuration file in your text editor.
Version Control (Optional)
If you’re using Git, add a .gitignore to avoid committing large build files:
Create .gitignore in your project root:
build/
*.stl
*.gcode
*.png
.DS_Store
__pycache__/
Then initialize Git:
git init
git add .
git commit -m "Initial project setup"
Backup Strategy
Regularly backup your src/ folder:
Windows:
Copy-Item -Path "src" -Destination "backups/src_$(Get-Date -Format 'yyyy-MM-dd')" -Recurse
Linux:
cp -r src backups/src_$(date +%Y-%m-%d)
Documentation
Keep a src/README.md describing each model:
# Models in This Project
## main.scad
- **Purpose:** Primary design for this project
- **Parameters:** width, height, depth
- **Last modified:** 2026-02-20
- **Notes:** Standard model for printing
## alternate.scad
- **Purpose:** Alternative design variant
- **Parameters:** width, height, depth, wall_thickness
- **Last modified:** 2026-02-15
- **Notes:** Experimental version with snap-fit features
Configuring Your Text Editor
By default, 3dMake uses:
- Windows: Notepad
- Linux: Nano (or your EDITOR environment variable)
To use a different editor, edit your global configuration:
3dm edit-global-config
Add or modify the editor line. Examples:
Windows (Visual Studio Code):
editor = "code"
Windows (Notepad++):
editor = '''C:\Program Files (x86)\Notepad++\notepad++.exe'''
Linux (Visual Studio Code):
editor = "code"
Linux (Gedit):
editor = "gedit"
Part 6: Troubleshooting
Common Issues
“3dm command not found”
Cause: 3dMake isn’t in your PATH or you haven’t completed setup.
Solution:
- Verify you extracted 3dMake and completed
3dm setup - Restart your terminal completely (close and reopen)
- Check that you’re not inside the 3dMake directory when running commands
- On Linux, ensure you’re using
./3dmif 3dMake isn’t in your PATH yet
“No such file or directory: src/main.scad”
Cause: You’re not in a valid 3dMake project directory.
Solution:
Verify you’re in the project directory:
pwd
ls -la
You should see src/, build/, and 3dmake.toml files. If not, run:
3dm new
“OpenSCAD error: syntax error at line 5”
Cause: Your .scad file has incorrect OpenSCAD syntax.
Solution:
- Open your model file:
3dm edit-model - Check the line number mentioned in the error
- Verify correct OpenSCAD syntax (matching parentheses, semicolons, etc.)
- Save and try building again:
3dm build
“Model won’t render or build”
Checklist:
- File is saved with
.scadextension - File is in the
src/folder - File has valid OpenSCAD syntax
- Build output has a specific error message (check line number)
Debug mode:
3dm build --debug
This provides more detailed error messages.
Screen reader isn’t reading 3dMake output clearly
Solution: Use the --debug flag for more verbose output:
3dm build --debug
This logs each step, making it easier for screen readers to follow.
“Permission denied” error (Linux)
Cause: 3dMake executable doesn’t have run permissions.
Solution:
chmod +x 3dm
./3dm setup
Cannot connect to printer
Cause: OctoPrint or Bambu printer settings not configured correctly.
Solution:
- Verify printer is running and connected to network
- Edit configuration:
3dm edit-global-config - Check these settings:
octoprint_host- correct IP/URLoctoprint_key- valid API keyprint_mode- set to “octoprint” or “bambu_lan”
- Test connection:
3dm build print(without actually printing first)
Part 7: Quick Reference
Essential Commands
| Command | Purpose |
|---|---|
3dm --version | Show installed version |
3dm help | Display all available commands |
3dm setup | Initial setup (run in extracted directory) |
3dm new | Initialize a new project |
3dm build | Build OpenSCAD model to STL |
3dm build slice | Build and slice to GCODE |
3dm build print | Build, slice, and send to printer |
3dm edit-model | Open main.scad in text editor |
3dm edit-model -m name | Open a specific model file |
3dm info | Show model statistics |
3dm preview print | Create and print a tactile preview |
3dm list-profiles | Show available printer profiles |
3dm list-overlays | Show available slicer overlays |
3dm edit-global-config | Edit global settings |
3dm orient print | Auto-orient and print model |
Directory Structure Reference
YourProject/
+------ src/ <- Place .scad files here
+------ build/ <- Built STL, GCODE auto-save here
+------ 3dmake.toml <- Project settings
+------ README.md <- Project documentation
Configuration Options (3dmake.toml)
Common settings you can modify:
project_name = "My Project"
model_name = "main" # Default model to build
printer_profile = "prusa_MK4" # Your printer
overlays = ["supports"] # Default slicing overlays
editor = "code" # Text editor to use
For full configuration options, see the GitHub repository: https://github.com/tdeck/3dmake
Part 8: Next Steps
Once you’re comfortable with basic projects:
- Learn parametric design - Make reusable models with variables
- Explore modules - Organize code into reusable functions
- Add libraries - Use pre-built OpenSCAD libraries (BOSL, etc.)
- Optimize workflows - Chain commands (
3dm build slice print) - Automate models - Use loops and conditionals in OpenSCAD
- Collaborate - Use Git to share projects with others
For advanced topics, see:
Sources
3dMake GitHub Repository. (2026). 3dMake - Non-visual 3D design and printing. Retrieved from https://github.com/tdeck/3dmake
3dMake Documentation. (2026). Terminal quick start guide. Retrieved from https://github.com/tdeck/3dmake/blob/main/docs/terminal_quick_start.md
OpenSCAD Community. (2025). OpenSCAD user manual. Retrieved from https://en.wikibooks.org/wiki/OpenSCAD_User_Manual
Revarbat (Ed.). (2024). BOSL - Belfry OpenSCAD Library. Retrieved from https://github.com/revarbat/BOSL/wiki
VSCode Setup Guide - Accessible OpenSCAD Development
For use with NVDA or JAWS on Windows
This guide walks you through setting up Visual Studio Code (VSCode) as an accessible code editor for writing OpenSCAD files, with a task runner that automatically previews your .scad code in OpenSCAD whenever you save.
Why VSCode Instead of the OpenSCAD Editor?
The built-in OpenSCAD editor has inconsistent behavior with screen readers - focus can jump unexpectedly, and the editor sometimes stops being read after certain actions. VSCode is a mainstream code editor with strong, well-tested accessibility support for both NVDA and JAWS.
You write your code in VSCode. OpenSCAD runs in the background (or in a separate window) to render the preview. You never have to interact with the OpenSCAD editor itself.
Part 1: Install Required Software
1.1 Install VSCode
Download from: https://code.visualstudio.com/
During installation:
- Check “Add to PATH” - this is important for running VSCode from PowerShell
- Check “Register Code as an editor for supported file types”
1.2 Install OpenSCAD
Download from: https://openscad.org/downloads.html
Use the installer version (not the portable version). After installing, confirm OpenSCAD is in your PATH by opening PowerShell and typing:
openscad --version
You should hear a version number. If you get an error, see the PATH setup section in the PowerShell Foundation guide.
1.3 Install the OpenSCAD VSCode Extension (Optional but Recommended)
- Open VSCode
- Press
Ctrl + Shift + Xto open the Extensions panel - Type
openscadin the search box - Install “OpenSCAD Language Support” - this adds syntax highlighting and keyword completion for
.scadfiles
Part 2: Configure the Task Runner
VSCode uses a file called tasks.json to define custom commands you can run from the keyboard. We’ll set up a task that opens your current .scad file in OpenSCAD for preview whenever you press a key.
2.1 Open or Create Your Workspace Folder
All your .scad files for a project should be in one folder. Open that folder in VSCode:
cd ~/Documents/OpenSCAD_Projects
code .
The . tells VSCode to open the current folder as a workspace.
2.2 Create the Tasks File
- In VSCode, press
Ctrl + Shift + Pto open the Command Palette - Type
Tasks: Configure Taskand press Enter - Select “Create tasks.json file from template”
- Select “Others”
This creates a .vscode/tasks.json file. Replace its entire contents with the following:
{
"version": "2.0.0",
"tasks": [
{
"label": "Preview in OpenSCAD",
"type": "shell",
"command": "openscad",
"args": ["${file}"],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "silent",
"panel": "shared"
},
"problemMatcher": []
},
{
"label": "Export STL",
"type": "shell",
"command": "openscad",
"args": [
"-o",
"${fileDirname}/${fileBasenameNoExtension}.stl",
"${file}"
],
"group": "build",
"presentation": {
"reveal": "always",
"panel": "shared"
},
"problemMatcher": []
}
]
}
Save the file with Ctrl + S.
2.3 Run the Preview Task
With any .scad file open and focused:
- Press
Ctrl + Shift + Bto run the default build task (Preview in OpenSCAD) - OpenSCAD will open and display your model
- Switch back to VSCode with
Alt + Tabto keep editing
To export an STL:
- Press
Ctrl + Shift + P - Type
Tasks: Run Task - Select “Export STL”
- The
.stlfile will be saved in the same folder as your.scadfile
Part 3: NVDA Settings for VSCode
3.1 Recommended NVDA Settings
Open NVDA Menu (NVDA + N) -> Preferences -> Settings:
Speech category:
- Symbol level: Most (so you hear brackets, semicolons, and other syntax characters)
Browse Mode category:
- Uncheck “Use browse mode on page load in web content” - not needed for VSCode
3.2 Useful NVDA + VSCode Keyboard Shortcuts
| Action | Keys |
|---|---|
| Read current line | NVDA + Up Arrow |
| Read from cursor | NVDA + Down Arrow |
| Spell current word | NVDA + Numpad 2 (twice quickly) |
| Move to next/previous line | Up / Down Arrow |
| Move by word | Ctrl + Left / Right Arrow |
| Move to start/end of line | Home / End |
| Move to start/end of file | Ctrl + Home / End |
| Select all | Ctrl + A |
| Toggle line comment | Ctrl + / |
| Go to line number | Ctrl + G, type number, Enter |
| Find in file | Ctrl + F |
| Open file in workspace | Ctrl + P, type filename |
3.3 Punctuation Level
When reading code, you need to hear all punctuation - semicolons, brackets, parentheses, and commas are all part of OpenSCAD syntax.
In NVDA: NVDA + N -> Preferences -> Settings -> Speech -> Symbol level: Most
You can also toggle punctuation level on the fly: NVDA + P cycles through None, Some, Most, All.
Part 4: JAWS Settings for VSCode
4.1 Virtual Cursor
JAWS may try to activate Virtual/Browse mode in VSCode. If VSCode stops responding to arrow keys for navigation and starts reading the page as HTML, press JAWS Key + Z to toggle Virtual mode off. You want to be in Application mode (not Virtual mode) when using VSCode.
4.2 Recommended JAWS Settings
- Punctuation level: All -
JAWS Key + Shift + 2cycles through levels. Set to All for code editing. - Reading rate: Adjust with
Alt + Ctrl + Page Up / Page Down - Spell current line:
JAWS Key + Up Arrowtwice quickly
4.3 Useful JAWS + VSCode Keyboard Shortcuts
| Action | Keys |
|---|---|
| Read current line | JAWS Key + Up Arrow |
| Read from cursor | JAWS Key + Down Arrow |
| Read current character | JAWS Key + Numpad 5 |
| Move by word | Ctrl + Left / Right Arrow |
| Move to start/end of line | Home / End |
| Toggle comment | Ctrl + / |
| Go to line | Ctrl + G |
| Open command palette | Ctrl + Shift + P |
Part 5: Notepad++ as an Alternative
If VSCode is too complex to set up, Notepad++ is a simpler screen-reader-friendly option for editing .scad files.
Setup
- Download from: https://notepad-plus-plus.org/
- Install the OpenSCAD syntax highlighting plugin:
- Go to Plugins -> Plugin Admin
- Search for “OpenSCAD” - install if available
- Alternatively, download a UDL (User Defined Language) file from the OpenSCAD community and import it via Language -> User Defined Language -> Import
Running OpenSCAD from Notepad++
Use the Run menu (F5) to configure a custom command:
openscad "$(FULL_CURRENT_PATH)"
Name it “Preview in OpenSCAD” and assign it a shortcut key (e.g., Ctrl + F5).
NVDA + Notepad++ Tips
- Punctuation level: set to Most or All
- Use
Ctrl + Gto go to a specific line - Use
Ctrl + Fto find text - The status bar at the bottom of Notepad++ announces line and column numbers - useful for finding where errors are
Part 6: Workflow Summary
Here is the complete workflow from writing code to printing:
-
Open VSCode (or Notepad++) code ~/Documents/OpenSCAD_Projects
-
Open or create a .scad file Ctrl + P -> type filename
-
Write your OpenSCAD code
-
Preview in OpenSCAD Ctrl + Shift + B (VSCode) Ctrl + F5 (Notepad++)
-
If the shape looks right, export STL Run “Export STL” task in VSCode OR: In OpenSCAD, press F6 then File > Export > Export as STL
-
Open PrusaSlicer, import the STL, slice, export G-code
-
Load G-code onto SD card or USB and print
Troubleshooting
OpenSCAD doesn’t open when I run the task
- Confirm OpenSCAD is installed and in your PATH:
openscad --versionin PowerShell - If not found, add the OpenSCAD install folder to your PATH (see PowerShell Foundation guide)
VSCode isn’t being read by my screen reader
- For JAWS: Press
JAWS Key + Zto toggle out of Virtual mode - For NVDA: Make sure you are focused inside the editor panel, not a sidebar
- Try clicking directly in the editor area with the mouse once to confirm focus
I hear “unlabeled” for some VSCode elements
- This is a known VSCode accessibility limitation for some UI panels
- Use keyboard shortcuts rather than trying to navigate by element - the editor itself reads well
My .scad file has an error but I can’t find it
- OpenSCAD will display an error in its console - use
Alt + Tabto switch to OpenSCAD and arrow through the console to read the error - Errors always include a line number - use
Ctrl + Gin VSCode to jump to that line
References
Microsoft. (2024). Visual Studio Code accessibility. https://code.visualstudio.com/docs/editor/accessibility
NV Access. (2024). NVDA user guide. https://www.nvaccess.org/files/nvda/documentation/userGuide.html
OpenSCAD. (n.d.). OpenSCAD documentation. https://openscad.org/documentation.html
Navigating This Curriculum - mdBook Guide
This curriculum is published as a web book using mdBook. This page explains how to find what you need, navigate between chapters, and use the book with a screen reader.
What Is mdBook?
mdBook is a tool that turns a collection of Markdown files into a navigable web book - similar to an online textbook. Each lesson or document is its own page (chapter), and they are organized into sections visible in the sidebar table of contents.
You can access the book from any web browser on any device.
Basic Navigation
Sidebar Table of Contents
The left side of the page contains a table of contents showing all chapters organized by unit and lesson. You can click or tap any chapter title to jump directly to it.
On a small screen (phone or tablet), the sidebar may be hidden. Look for a hamburger menu icon (three horizontal lines) to show it.
Arrow Navigation
At the bottom of every page there are Previous and Next links that take you through the chapters in order. You can also use keyboard arrow keys:
Left Arrow- go to the previous chapterRight Arrow- go to the next chapter
Search
The mdBook search feature indexes all content across all chapters.
- Click the search icon (magnifying glass) in the top bar, or press
S - Type your search term
- Results appear as a dropdown list with the chapter name and a snippet of context
- Click any result to jump to that chapter; the matching term will be highlighted
- Press
Escapeto close the search panel
Other Keyboard Shortcuts
| Key | Action |
|---|---|
S | Focus the search box |
Escape | Close search results |
Left Arrow | Previous chapter |
Right Arrow | Next chapter |
T | Toggle the table of contents sidebar |
Screen Reader Navigation
With NVDA (Chrome, Firefox, or Edge recommended)
Reading the page:
- Use
Up / Down Arrowto read line by line - Use
Hto jump between headings - this is the fastest way to skim a long lesson - Use
Ctrl + F(browser Find) orS(mdBook search) to find specific content
Table of contents:
- The sidebar is a navigation landmark. Press
Dto move between landmark regions, or useNVDA + F7to open the Elements List and select “Landmarks” to navigate to the sidebar directly. - Within the sidebar, arrow through the list of links and press
Enterto follow one.
Code blocks:
- Code examples are marked up as
<code>elements. NVDA will read them inline. - Punctuation level should be set to Most or All to hear semicolons, brackets, and other syntax characters in code examples.
- To copy a code block: navigate to the code, press
Ctrl + Ato select all, or use the copy button if present.
Tips:
NVDA + Pto cycle punctuation level - do this before reading code blocksNVDA + F7-> Links list - useful for navigating between major sections quicklyHkey (headings navigation) is your best friend on lesson pages with many sections
With JAWS (Chrome or Edge recommended)
Reading the page:
- Use
Up / Down Arrowin virtual cursor mode to read line by line - Press
Hto jump between headings - Press
JAWS Key + F6to get a list of all headings on the page
Table of contents:
- Press
Rto move between landmark regions to reach the sidebar - Within the sidebar,
Tabthrough the links or useUp / Down Arrow
Code blocks:
- Set punctuation to All before reading code:
JAWS Key + Shift + 2 - JAWS reads code blocks as regular text - navigate through them line by line
Tips:
JAWS Key + F5- links listJAWS Key + F6- headings listCtrl + F- browser find, works alongside mdBook search
With VoiceOver (Mac / iOS)
Mac:
VO + Uto open the rotor - select Headings to navigate by headingVO + Command + Fto search the pageH(with Quick Nav on) to move between headings
iOS:
- Swipe left/right to navigate elements
- Use the rotor (
two-finger rotate) to set navigation mode to Headings - Double-tap to activate links
Finding What You Need
If you know which unit or project you need
Open the table of contents and look for the unit or project name. The structure follows this pattern:
- Unit 0 - Foundation lessons (safety, how printing works, calipers, OpenSCAD basics, slicing)
- Unit 1 - Guided projects (Project 0 and Project 1)
- Unit 2 - Intermediate skills (parametric design, tolerances, advanced slicing, materials)
- Unit 3 - Open-ended projects (Project 2, 3, and 4)
- Reference Materials - Quick-reference sheets you can keep open while working
- PowerShell Foundation - Command-line navigation guide
If you are looking for a specific term or command
Use the Search function (S). Search for:
- An OpenSCAD command (e.g.,
difference,translate,module) - A vocabulary word (e.g.,
infill,tolerance,stakeholder) - A project name (e.g.,
floor marker,jewelry,assistive technology)
If you are looking for reference material while working
Keep a second browser tab open to the Reference Materials section. Useful pages to bookmark:
- OpenSCAD Cheat Sheet
- Slicing Settings Quick Reference
- Filament Comparison Table
- Screen Reader Coding Tips (NVDA/JAWS)
Printing or Saving Pages
To save or print any page for offline use:
Ctrl + Popens the print dialog in any browser- Use “Save as PDF” to save a local copy
- For the whole book: if your instructor has provided a PDF version, use that - it contains all chapters in one file
Reporting a Problem
If a page is missing content, has a broken link, or is difficult to navigate with your screen reader, let your instructor know:
- Which page (chapter title)
- What you were trying to do
- What happened instead
This helps improve the curriculum for future students.
Terminology
How to Use This Terminology File
- Review the glossary before lessons that reference terms (e.g., the OpenSCAD lessons, Make3D build walkthroughs, and PowerShell guides).
- Encourage students to keep a personal glossary when they encounter new words during projects and prototyping.
- Maintain and extend this file as new tools or workflows are adopted.
General Terms
Shape - Any graphical 2D or 3D object created by OpenSCAD. Design - An OpenSCAD creation (an OpenSCAD program) which usually consists of a combination of multiple shapes and operations. Operation - An OpenSCAD command that changes the appearance or properties of one or more shapes (for example translate(), rotate(), difference(), union()). Parameter - A named value passed into a module, function, or used as a variable to control dimensions and behavior. Preview - A fast, approximate display of a design in OpenSCAD used for checking structure before full render. Render - Full evaluation of a design’s geometry in OpenSCAD; required before exporting to an STL for printing. Units - The measurement units used in designs. OpenSCAD is unitless by default, but in 3D printing contexts millimeters are conventionally used; be explicit about units when sharing models. Width / Length / Height - X, Y, and Z axis dimensions respectively. 2D shape - A planar geometry with width and length but negligible height (e.g., a 2D profile used for extrusion). 3D shape - A solid geometry with width, length, and height.
3D Printing Terminology
Layer Height - The vertical thickness of each printed layer, typically measured in millimeters; smaller values give finer Z resolution. Nozzle (Extruder) - The heated tip on the printer that melts filament and deposits it onto the print surface. Filament - Thermoplastic material supplied as a long strand (e.g., PLA, PETG, ABS, TPU) used by FDM printers. Infill - The internal lattice or pattern printed inside a solid object to provide strength while saving material; expressed as a percentage. Shell (Wall) - The outer perimeters printed around each layer that form the visible surface and structural walls of a part. Brim / Raft / Skirt - Temporary structures printed to improve bed adhesion or prime the extruder; removed after printing. Retraction - A printer motion that withdraws filament to reduce ooze when moving between print areas. Overhang - A portion of a model that extends outward such that it has little or no support underneath; critical for printability. Support - Additional printed material used to hold up overhangs during printing; removed after printing (manually or dissolvable). Bed Adhesion - Methods and materials used to keep the first layer attached to the build plate (tape, glue stick, PEI, heated bed). Print Speed - The rate at which the printer moves while extruding; faster speeds reduce time but can reduce print quality. Layer Cooling - Use of fans to cool freshly extruded plastic; affects bridging and overhang quality. G-code - The low-level instructions sent to a 3D printer describing moves, extrusion, temperatures, and other commands. STL - A common 3D model file format (surface tessellation) used for 3D printing; does not hold scale or unit metadata. Slicing - The process of converting a 3D model (e.g., STL) into per-layer toolpaths and G-code for a specific printer and filament. Print Bed / Build Plate - The surface on which prints are produced. Warping - Distortion caused by uneven cooling, often lifting corners from the build plate; mitigated by bed adhesion and enclosure. Calibration - The process of adjusting printer settings (e.g., steps/mm, nozzle height) to ensure accurate prints.
OpenSCAD-Specific Terms
Module - A reusable block of OpenSCAD code defined with module name(){}
which can be called with different parameters to produce geometry.
Function - A small, parameterized computation defined with function
that returns a value used in modules or expressions.
Boolean Operations - union(), difference(), intersection() used to
combine or subtract solids.
Transform - Operations that change object position or orientation,
including translate(), rotate(), and scale().
Children - In module calls, the nested code that becomes part of the
module’s execution context when using children().
CSG (Constructive Solid Geometry) - The technique of building complex
shapes by combining primitive solids with boolean operations.
Primitive - Simple built-in shapes like cube(), cylinder(),
sphere(), and polyhedron().
Linear Extrusion - linear_extrude() which creates a 3D shape from
a 2D profile by extruding along the Z axis.
Rotate_extrude - rotate_extrude() which sweeps a 2D profile around
an axis to form rotationally symmetric solids.
Children() - A special OpenSCAD construct that allows a module to
render nested content passed into it.
Preview vs Render - Preview is quick and approximate; render (F6)
evaluates the final geometry for export.
Parameterization - Designing with variables and parameters so that a
single file can generate many variants by changing inputs.
3dMake / Make3D Terminology (CLI-based toolchain concepts)
3dMake (Make3D) - A command-line workflow or helper scripts that automate building, slicing, and managing OpenSCAD-based projects. Build Script - A script that automates repetitive steps (rendering, slicing, packaging) for reproducible builds. Pipeline - The sequence of steps from source (.scad) to final G-code (render -> export STL -> slice -> generate G-code). Artifacts - Files produced by the build pipeline (STL, G-code, logs). Parameter File - External file (JSON, TOML, or similar) that provides default parameter values to feed into OpenSCAD builds. Headless Render - Running OpenSCAD from the command line (no GUI) to render models and export STLs programmatically. Automation - Using scripts or CI to produce builds and test changes without manual GUI interaction.
PowerShell Terminology (relevant to automation and workflows)
PowerShell - A task automation and configuration management framework
from Microsoft that uses cmdlets and a scripting language.
Cmdlet - A lightweight command in PowerShell (e.g., Get-ChildItem,
Set-ExecutionPolicy) with structured input and output.
Script - A .ps1 file containing PowerShell commands, functions, and
logic used to automate tasks.
Module (PowerShell) - A package of functions, cmdlets, or scripts that
can be imported with Import-Module.
Pipeline (PowerShell) - Passing the output of one cmdlet as the input
to another using the | operator for chained processing.
Object - PowerShell passes rich objects (not plain text) between
commands, enabling structured data manipulation.
PSProvider - A PowerShell interface that exposes data stores as drives
(e.g., HKLM:, Variable:), enabling uniform access.
Execution Policy - Security setting controlling whether scripts can
run on a machine (e.g., Restricted, RemoteSigned).
Cmdlet Parameters - Named options passed to cmdlets (e.g., -Path,
-Recurse) to customize behavior.
Remote Session - Using Enter-PSSession or Invoke-Command to run
commands on a remote system.
Error Handling - Using try{ } catch { } finally { } and $Error
variables to handle script failures gracefully.
Splatting - Passing a collection of parameters to a cmdlet using @{}
or @array for cleaner code.
Format-Table / Format-List - Cmdlets for controlling how objects are
displayed in the console; for automation prefer raw objects to
formatted text.
Testing, Documentation, and Workflow Terms
Linting - Static analysis to detect style or simple errors in code (e.g., PowerShell Script Analyzer). Unit / Integration Test - Automated checks that verify functions or the build pipeline produce expected outputs. Versioning - Tracking changes to files (git) to manage collaboration and releases. Release Assets - Packaged files attached to a release (useful for distributing large binaries or fonts without committing them to the repository). Accessibility (a11y) - Ensuring materials and workflows work for people using assistive technology (screen readers, braille displays, keyboard navigation).
Vocabulary Glossary - 3D Design & Printing
Overview
A reference for all key terms used in this curriculum. Terms are organized alphabetically.
Terms
Additive manufacturing - A family of processes that build objects by adding material layer by layer. 3D printing is a form of additive manufacturing.
ABS (Acrylonitrile Butadiene Styrene) - A common plastic filament, stronger and more heat-resistant than PLA, but harder to print and emits more fumes.
Bed adhesion - How well the first layer sticks to the print bed. Poor adhesion causes warping. Improved by using a heated bed, glue stick, or painter’s tape.
Boolean operation - An operation that combines or subtracts 3D shapes. The three types in OpenSCAD are union(), difference(), and intersection().
Brim - A flat ring printed around the base of a model to help it stick to the build plate. Removed after printing.
Build plate / print bed - The flat surface on which the 3D object is built. May be heated.
CAD (Computer-Aided Design) - Using software to create 2D or 3D models. OpenSCAD is a form of CAD.
Caliper - A precision measuring tool used to measure the length, width, height, diameter, or depth of objects to the nearest 0.1 mm or finer.
Clearance - An intentional gap added to a design so that two parts fit together with the desired level of looseness or tightness.
Constructive solid geometry (CSG) - A modeling approach where complex shapes are built from simple primitives using Boolean operations (adding, subtracting, intersecting).
Cooling fan - A fan on the printer that cools the extruded plastic as it is deposited, helping layers set quickly and maintain shape.
difference() - OpenSCAD command that subtracts one shape from another, creating holes or recesses.
Direct drive extruder - An extruder mounted directly above the hot end. Better for flexible filaments (TPU) because the filament path is short.
Extruder - The mechanism that grips and feeds filament into the hot end.
FDM (Fused Deposition Modeling) - The most common type of 3D printing. Melts plastic filament and deposits it layer by layer.
Filament - The plastic material used as “ink” in FDM printing. Comes on spools in 1.75 mm diameter rolls.
Functional requirement - A testable statement describing what a design must do. Example: “The marker must support the weight of a desk rolling over it.”
G-code - The machine instruction language that tells the 3D printer exactly where to move and at what temperature. Generated by the slicer.
Hot end / nozzle - The heated component that melts and extrudes the filament. Typically heated to 200-250C depending on material.
Infill - The internal structure of a printed object. Usually expressed as a percentage (e.g., 15% infill = 15% solid inside). Common patterns include grid, gyroid, and honeycomb.
intersection() - OpenSCAD command that keeps only the region where two shapes overlap.
Layer height - The thickness of each printed layer. Typical values: 0.1 mm (fine detail) to 0.3 mm (fast/draft). Affects surface quality and print time.
Linear extrusion - In OpenSCAD, linear_extrude() turns a 2D shape into a 3D object by extending it upward.
Module - In OpenSCAD, a reusable block of code that can be called with different parameters to create variations.
Overhang - A portion of a model that extends beyond the layer below it. Overhangs above ~45 require support structures.
Parameter / parametric design - A design approach where dimensions are stored as variables, so changing one number updates the whole model.
PETG (Polyethylene Terephthalate Glycol-modified) - A durable, moderately flexible filament. More impact-resistant and heat-resistant than PLA; easier to print than ABS.
PLA (Polylactic Acid) - The most common beginner filament. Bio-derived, easy to print, low-emission. Brittle under impact and heat-sensitive.
Primitive - A basic 3D shape in OpenSCAD: cube, sphere, cylinder. Complex objects are built by combining primitives.
Render - In OpenSCAD, pressing F6 generates a full, final 3D model from your code. Slower than Preview (F5) but required for export.
Retraction - A slicer setting that briefly pulls the filament backward when the nozzle moves without printing, to prevent strings of plastic between features.
rotate() - OpenSCAD command that rotates a shape around the X, Y, or Z axis.
Slicer - Software (e.g., PrusaSlicer) that converts a 3D model (.stl) into G-code instructions for a specific printer.
Stakeholder - A person who has a meaningful interest in whether a design succeeds - typically the person you are designing for.
STL file (.stl) - The standard file format for 3D models used in most slicers. Describes the geometry of a shape as a mesh of triangles.
Support structures - Temporary scaffolding material generated by the slicer to support overhangs during printing. Removed after the print is complete.
Tolerance - The acceptable amount of dimensional variation in a printed part. FDM printers typically have a tolerance of +/-0.15-0.30 mm.
TPU (Thermoplastic Polyurethane) - A flexible filament used for rubber-like parts: phone cases, wearables, shock absorbers. Harder to print than PLA.
translate() - OpenSCAD command that moves a shape along the X, Y, and/or Z axis.
union() - OpenSCAD command that combines two or more shapes into a single solid.
Warp / warping - A print defect where the corners or edges of a print lift off the build plate due to uneven cooling.
$fn - OpenSCAD special variable that sets the number of faces on rounded shapes (spheres, cylinders). Higher = smoother. Typical values: 20-100.
Screen Reader Coding Tips - NVDA & JAWS
A consolidated reference for using NVDA or JAWS while writing OpenSCAD code in VSCode or Notepad++. Tips that were previously scattered across lesson files are collected here.
General Principles for Coding with a Screen Reader
- Turn punctuation up. All OpenSCAD syntax - semicolons, brackets, parentheses, commas - is meaningful. If your screen reader skips punctuation, you will miss syntax errors. Set punctuation to Most or All before coding.
- Navigate by line. Arrow up and down to move through code one line at a time. Use
Ctrl + Left/Rightto move word by word within a line. - Use go-to-line. Both VSCode and Notepad++ let you jump to a specific line number with
Ctrl + G. OpenSCAD errors always give a line number - use this to find them fast. - Spell when uncertain. If you are not sure what a character is, spell the line character by character using your screen reader’s spell command.
- Comment as you go. Adding a short comment after a block of code lets you navigate by searching for recognizable words with
Ctrl + F.
NVDA Quick Reference
Setting Punctuation Level
NVDA + P - cycles through: None -> Some -> Most -> All
For code: set to Most or All.
You can also set a permanent default:
NVDA + N -> Preferences -> Settings -> Speech -> Symbol level
Essential Reading Commands
| Action | Keys |
|---|---|
| Read current line | NVDA + Up Arrow |
| Spell current line | NVDA + Up Arrow (twice quickly) |
| Read from cursor to end | NVDA + Down Arrow |
| Read current word | NVDA + Numpad 5 |
| Spell current word | NVDA + Numpad 5 (twice quickly) |
| Read current character | NVDA + Numpad 2 |
| Stop reading | Ctrl |
Navigation in VSCode with NVDA
| Action | Keys |
|---|---|
| Move by character | Left / Right Arrow |
| Move by word | Ctrl + Left / Right Arrow |
| Move by line | Up / Down Arrow |
| Start / end of line | Home / End |
| Start / end of file | Ctrl + Home / Ctrl + End |
| Go to line number | Ctrl + G, type number, Enter |
| Find text | Ctrl + F |
| Toggle line comment | Ctrl + / |
If NVDA Stops Reading the Editor
- Click in the editor area once with the mouse (or press
Escapeand then click) - Press
NVDA + Spaceto toggle between Browse and Application mode - for code editors, you want Application mode
JAWS Quick Reference
Setting Punctuation Level
JAWS Key + Shift + 2 - cycles through punctuation levels
For code: set to All.
Essential Reading Commands
| Action | Keys |
|---|---|
| Read current line | JAWS Key + Up Arrow |
| Spell current line | JAWS Key + Up Arrow (twice quickly) |
| Read from cursor | JAWS Key + A |
| Read current word | JAWS Key + Numpad 5 |
| Read next word | JAWS Key + Right Arrow |
| Read current character | JAWS Key + Numpad 5 (once = word, twice = spell) |
| Stop reading | Ctrl |
Adjusting Speech Rate
| Action | Keys |
|---|---|
| Increase rate | Alt + Ctrl + Page Up (or Fn + Up Arrow on laptops) |
| Decrease rate | Alt + Ctrl + Page Down (or Fn + Down Arrow on laptops) |
Navigation in VSCode with JAWS
| Action | Keys |
|---|---|
| Move by character | Left / Right Arrow |
| Move by word | Ctrl + Left / Right Arrow |
| Move by line | Up / Down Arrow |
| Start / end of line | Home / End |
| Start / end of file | Ctrl + Home / Ctrl + End |
| Go to line number | Ctrl + G |
| Find text | Ctrl + F |
| Toggle line comment | Ctrl + / |
If JAWS Stops Reading the Editor
- Press
JAWS Key + Zto toggle Virtual/Browse mode off - for VSCode you want Virtual mode off - Focus the menu bar with
Alt, then pressEscapeto return to the editor - If still not working, press
Alt + F4to close VSCode and reopen it
Window Focus
When you launch OpenSCAD from VSCode (via the task runner), focus stays in VSCode. To switch to OpenSCAD to read the console or error messages:
Alt + Tabto cycle through open windows- JAWS will announce the application name as you cycle
OpenSCAD-Specific Tips
Reading Errors
When OpenSCAD can’t render your code, it outputs an error. The error message always includes:
- Line number - use
Ctrl + Gin VSCode to jump there - Error type - usually a missing semicolon, a typo in a command name, or mismatched brackets
Common errors and what they sound like:
| Error message | What it usually means |
|---|---|
| “Expected ‘;’ …” | You forgot a semicolon at the end of a statement |
| “Expected ‘,’ or ‘)’ …” | Missing comma between parameters, or unclosed parenthesis |
| “Identifier … is undefined” | You typed a variable name wrong, or used a variable before declaring it |
| “WARNING: Normalized tree is empty” | Your shape has no geometry (e.g., you subtracted more than you started with) |
Bracket Matching
All OpenSCAD shapes and operations use brackets and braces:
- Parentheses
()- hold parameters:cube([10, 10, 10]) - Square brackets
[]- hold vectors (lists of numbers):[10, 10, 10] - Curly braces
{}- hold groups of shapes for boolean operations
Every opening bracket must have a closing bracket. If you are missing one, OpenSCAD will report an error somewhere near (but not always exactly at) the problem.
VSCode can help: when your cursor is on a bracket, VSCode highlights the matching bracket. With NVDA, you can navigate to the matching bracket with Ctrl + Shift + \.
Commenting Out Code
To test part of your code without deleting it, comment it out:
- Single line: position cursor at start of line, type
// - Multiple lines: select the lines, press
Ctrl + /in VSCode (adds//to each selected line) - Block comment: type
/*before and*/after the block
To uncomment: select the commented lines, press Ctrl + / again.
Navigating Large Files
Use Ctrl + F (Find) to locate sections of your code:
- Search for your module names to jump to them: e.g.,
module round_bead - Search for comments you wrote: e.g.,
// Step 2 - Search for line numbers in error messages
Caliper and OpenSCAD Workflow Tips
When measuring an object and entering it into OpenSCAD, say the measurement aloud before typing it to reduce transcription errors. Then read the number back after typing it to confirm.
Recommended sequence:
- Measure -> say “seventy point three millimeters”
- Type
70.3in OpenSCAD - Read back: “seven zero point three” to confirm
mdBook Navigation (Web Version of This Curriculum)
If you are reading this curriculum through the web version (mdBook), here are tips for navigating with a screen reader:
NVDA + Browser
Hto jump between headings (chapter navigation)Ctrl + Fto search within the current page- The sidebar table of contents is a navigation landmark - use
NVDA + F7to list landmarks, or pressDto jump between landmark regions - Previous/Next chapter links are at the bottom of each page
JAWS + Browser
Hto move between headingsCtrl + F(browser Find) to searchJAWS Key + F6to list headingsRto jump to regions/landmarks- Use the search box in the mdBook header to search across all chapters
Keyboard Navigation (No Screen Reader)
Left Arrow / Right Arrow- previous/next chapterS- focus the search boxEscape- close search resultsT- toggle the table of contents sidebar
References
NV Access. (2024). NVDA user guide. https://www.nvaccess.org/files/nvda/documentation/userGuide.html
Freedom Scientific. (2024). JAWS for Windows help. https://support.freedomscientific.com/Content/Documents/Manuals/JAWS/JAWS-Screen-Reader-Help.pdf
Microsoft. (2024). Visual Studio Code accessibility. https://code.visualstudio.com/docs/editor/accessibility
More on mdBook navigation
- mdBook (general / keyboard navigation): https://rust-lang.github.io/mdBook/ - includes documentation and basic navigation/usage for the mdBook web UI.
- Curriculum mdBook navigation (with accessibility tips): mdBook Navigation Guide - local guide in this curriculum with notes for using mdBook with and without screen readers.
Your First Print - Guided Extension
Estimated time: 2-4 hours (including setup and print monitoring)
Learning Objectives
- Select a simple ready-made model and evaluate its printability for a classroom printer
- Configure slicer settings for a short-duration print and prepare the printer safely
- Document print parameters and reflect on the physical outcome
Materials
- Computer with slicer and access to the online repository
- Prusa Mini+ or classroom-approved printer, filament spool
Step-by-step Tasks
- Choose a simple model (<2 hours print) from Thingiverse or Printables and save the STL.
- Inspect the model: note overhangs, thin features, and dimensions; write two short reasons why this model is appropriate for a first print.
- Load the model in your slicer, select the classroom profile, and adjust settings only if necessary (layer height, infill, supports). Record the final print time and filament estimate.
- Perform safety checks, start the print, and monitor the first 10 minutes for adhesion and extrusion problems.
- After cooling, measure three critical dimensions and compare to the models stated dimensions; record deviations.
Probing Questions
- Why did you select this model? What risks did you anticipate and how did you mitigate them?
- Which slicer setting most affects print time for this model and why?
- If a thin feature failed, what minimal change would you make to ensure success next time?
Quiz - Your First Print (10 questions)
- What is the first-check you do after loading filament? (short answer)
- Name two slicer settings that affect strength. (short answer)
- Why monitor the first layers of a print? (one sentence)
- How do you document filament used for reproducibility? (short answer)
- What is one sign of poor bed adhesion? (one sentence)
- True/False: Selecting a model with support requirements is not recommended for your first print. (Answer: True)
- Short answer: Describe two characteristics of a “printability-friendly” model that would be good for a beginner’s first print.
- Practical scenario: Your first print is showing stringing (thin lines between parts). What are two possible causes and how would you troubleshoot?
- Multiple choice: When measuring a printed dimension, where should you measure multiple times (three different spots) to account for print variation? (A) Never, measure once (B) Only if you suspect error (C) Always measure at least three locations - Answer: C
- Reflection: Explain why carefully selecting your first print model (simple, robust, known to work on your printer) is better than immediately attempting a complex design. What will you learn from success that prepares you for harder projects?
Extension Problems (10)
- Re-slice the model with a finer layer height and compare surface finish and print time; document differences.
- Modify the model in OpenSCAD to thicken a failing feature and reprint a small test piece.
- Create a short checklist script (or text checklist) that verifies spool metadata and bed temperature before printing.
- Produce a one-page reflection that includes three lessons learned and one parameter you will change next time.
- Share your measurements and photos in the class folder and give feedback on two peers’ prints.
- Conduct a post-print analysis: compare actual measurements to STL specifications; identify and document any deviations.
- Print the same model in two different materials or with two different slicer profiles; compare durability, appearance, and accuracy.
- Create a detailed documentation package: CAD file, slicer settings, print log, measurements, and lessons learned.
- Design a quality assurance test: define pass/fail criteria and systematically verify your print meets all requirements.
- Write a “first print troubleshooting guide” based on your experience: common issues you encountered and how you solved them.
Deliverables
- Short report: model chosen, key slicer settings, measured deviations, and answers to probing questions.
- Photos of the final print and the measured values table.
Your First Print - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Select a simple 3D model, configure slicer settings, and complete your first independent print job.
Ideas and Concept
Model Selection
- Model name and source (Thingiverse, Printables, etc.):
- Link or file reference:
- Why did you choose this model?
Printability Assessment
- Estimated print time (from slicer):
- Estimated filament:
- Expected challenges (overhangs, thin features, supports needed):
- Why is this model appropriate for a first print?
Measurements and Printer Configuration
Printer Setup Log
| Parameter | Value |
|---|---|
| Printer model | |
| Nozzle diameter | |
| Bed temperature | |
| Nozzle temperature | |
| Layer height | |
| Infill percentage | |
| Support settings |
Safety Checks (Completed)
- Bed clean and level
- Bed adhesive/prep applied (if needed)
- Filament loaded correctly
- Nozzle at correct height
- Print area clear of obstructions
- Buildplate secured
Object Notes
Print Monitoring Notes
- What did you observe in the first 10 minutes?
- Any adhesion issues?
- Any extrusion problems?
- Print completed successfully: Yes / No
Printed Part Measurements (After Cooling)
| Feature | Model Spec (mm) | Printed (mm) | Deviation | Notes |
|---|---|---|---|---|
Use and Assembly Notes
- How does the print feel and look compared to the model?
- Did any features fail or print poorly?
- If there were issues, what do you suspect caused them?
Reflections
What Went Well
- Which aspect of the print was most successful?
- Did anything surprise you positively?
What Didn’t Go Well
- Were there any defects or failed features?
- What challenges did you encounter?
Learning and Next Steps
- What did you learn from this first independent print?
- What would you do differently next time?
- If you printed this again, what settings would you change?
Post-Print Analysis
- Compare this print to others you’ve seen in the classroom
- What variables (temperature, layer height, infill) do you think most affected the outcome?
- How would you test that hypothesis?
Attachments
- Exported
.stlmodel file (or link to source) - Slicer settings (screenshot or export)
- Photo of final print (multiple angles if possible)
- Safety checklist (signed/dated)
- Print log with timestamps (if available from printer)
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Feedback:
Resubmission (if applicable)
What Was Changed
(One-paragraph explanation of changes made and why)
Revised Score
| Category | Revised Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Your First Print - Teacher Template (Extension Project)
Briefing
A foundational extension project where students select a ready-made 3D model from online repositories, configure slicer settings, and complete their first independent print job. This project builds confidence and establishes safe printing practices.
Key Learning: Printer safety; slicer configuration; print monitoring; dimensional verification.
Real-world Connection: Production environments rely on safe print setup and quality verification. This project establishes habits that transfer to any 3D printing context.
Constraints
- Model must be 2 hours print time
- No or minimal support requirements recommended
- Student must document printer configuration and safety checks
- Student must compare printed dimensions to model specifications
Functional Requirements
- Model selected and deemed appropriate for beginner
- Printer configured safely with classroom profile
- Print completes successfully with good adhesion
- Printed part is measured and deviations documented
Deliverables
- Completed documentation template with:
- Model selection rationale and printability assessment
- Printer setup log (materials, temperature, settings)
- Print monitoring observations (first 10 minutes, monitoring during print)
- Dimensional measurements and deviation analysis
- Reflection on first print experience
- Post-print analysis and troubleshooting notes
- Photograph of final print
- Slicer settings (screenshot or text export)
Rubric
All projects are scored on a 0-9 scale across three equally weighted categories (3 points each):
| Category | Points | What We Measure |
|---|---|---|
| Problem & Solution | 0-3 | Did the student select an appropriate model? Did the print succeed? |
| Design & Code Quality | 0-3 | Is documentation of printer setup thorough? Is print quality good? |
| Documentation | 0-3 | Is all documentation complete? Are measurements recorded? Is reflection thoughtful? |
Category 1: Problem & Solution (0-3 points)
| Score | Description |
|---|---|
| 3 | Student selected appropriate model with sound reasoning. Print completed successfully with good adhesion and finish. No major issues. |
| 2 | Model generally appropriate. Print mostly successful with minor adhesion or finish issues. |
| 1 | Model had some difficulties; print partially successful or required intervention. |
| 0 | Print failed or model was inappropriate. |
Category 2: Design & Code Quality (0-3 points)
| Score | Description |
|---|---|
| 3 | Printer setup documented thoroughly. Safety checks evident. Print quality excellent. Photos provided. |
| 2 | Setup documented adequately. Print quality acceptable. Some documentation of settings. |
| 1 | Minimal documentation of setup. Print quality has defects. |
| 0 | Setup not documented or print failed to start. |
Category 3: Documentation (0-3 points)
| Score | Description |
|---|---|
| 3 | All sections complete. Measurements recorded precisely. Reflection is specific and shows learning. |
| 2 | Most sections present. Measurements recorded but reflection brief. |
| 1 | Incomplete sections. Measurements minimal. Reflection lacking. |
| 0 | No documentation. |
Score Interpretation
| Total Score | Interpretation | Next Step |
|---|---|---|
| 8-9 | Excellent work | Student ready for independent printing projects |
| 6-7 | Good execution | Encourage documentation habit |
| 4-5 | Meets basics | Discuss printer setup and safety |
| 2-3 | Does not meet expectations | Resubmission or additional practice |
| 0-1 | Missing major components | Meet with instructor |
Resubmission Policy
Students may resubmit to improve their score. Resubmissions must include:
- A one-paragraph explanation of what was changed and why
The resubmission score replaces the original.
Assessment Notes
- Strong submissions show careful model selection reasoning, thorough printer documentation, and specific observations about print behavior
- Watch for: Poor printer documentation, dismissive attitude toward safety checks, or generic reflections
- Reinforce: Safety first; documentation enables learning and troubleshooting
- Next Step: Extension problem suggestions include print quality analysis or variant material testing
Basic Project Scaffold
Lesson 2: Geometric Primitives and Constructive Solid Geometry
Estimated time: 60 minutes
Learning Objectives
- Use OpenSCAD primitives (
cube(),sphere(),cylinder()) and transforms (translate(),rotate(),scale())1 - Apply CSG operators (
union,difference,intersection) safely and diagnose common numerical issues2 - Use quick diagnostic renders and validate geometry in a slicer3
Materials
- 3dMake project scaffold with
src/main.scad - Example primitive snippets (provided in assets)
- Reference: openscad-cheat-sheet.md for syntax quick-reference
-
Open
src/main.scad; identify and run simple examples usingcube(),sphere(), andcylinder()1.Example primitives:
// Primitive shapes - uncomment one to try // Cube (x, y, z dimensions) cube([20, 20, 20]); // Sphere (radius, resolution) // sphere(r=10, $fn=32); // Cylinder (radius, height, resolution) // cylinder(r=10, h=20, $fn=32); -
Create three short examples demonstrating
union(),difference(), andintersection()and render with reduced$fn. Review CSG best practices2.Example CSG operations:
// UNION - Combine multiple shapes union(){ cube([20, 20, 20]); translate([15, 0, 0]) sphere(r=10, $fn=32); } // DIFFERENCE - Subtract shapes // difference(){ // cube([20, 20, 20]); // translate([10, 10, 10]) sphere(r=8, $fn=32); // } // INTERSECTION - Keep only overlapping volumes // intersection(){ // cube([20, 20, 20]); // sphere(r=12, $fn=32); // } -
Reproduce a failing
difference()case and apply the 0.001 offset strategy to the subtractor; re-render and confirm fix. This technique addresses common manifold issues4.Fix technique:
// Problem: Coincident faces cause non-manifold issues difference(){ cube([20, 20, 20], center=true); // Use translate with small offset (0.001) to prevent coincident faces translate([0, 0, 0.001]) sphere(r=10, $fn=32); } -
Build an STL with
3dm buildand open it in your slicer to check for thin walls or islands3. -
Document any fixes in the project README and commit the working
main.scadand STL.
Debugging, Resolution, and Common Issues
As your OpenSCAD models become more complex, you’ll encounter rendering errors, non-manifold geometry, or slow previews. Learning to debug efficiently is essential for productive design work.
Understanding OpenSCAD Console Errors
When you press F5 to preview or F6 to render your model, OpenSCAD displays warnings and errors in the console at the bottom of the editor. Here’s what to look for:
- Error Line Numbers: The console message tells you the exact line where the problem was detected. Look for missing semicolons, unmatched braces, or undefined variables
- Syntax Errors: These prevent the model from rendering at all (common causes: missing
;, unclosed{or[, typos in function names) - Warnings (Non-Manifold Geometry): Your geometry is technically valid but has internal inconsistencies that may prevent printing
Example Console Output:
ERROR: Unexpected token 'sphere' at line 15, column 5
Expected one of: } ) ]
This tells you that line 15 has a syntax issue-likely a missing closing bracket on the previous line.
The 0.001 Offset Strategy (Revisited)
One of the most common issues with CSG operations is coincident faces-when two shapes touch exactly at their boundaries. This creates a non-manifold geometry that slicer tools flag as unprintable.
The Fix: Add a tiny offset (0.001 mm or smaller) to move one surface slightly:
// BEFORE (problematic):
difference(){
cube([20, 20, 20], center=true);
sphere(r=10, $fn=32);
}
// AFTER (fixed):
difference(){
cube([20, 20, 20], center=true);
translate([0, 0, 0.001]) sphere(r=10, $fn=32); // Tiny offset prevents coincident faces
}
This 0.001 mm offset is invisible to the human eye but fixes the non-manifold warning and makes the model printable.
Using $fn to Balance Speed and Quality
The $fn parameter controls the resolution of curved surfaces (spheres, cylinders, etc.). It represents the number of polygonal faces used to approximate the curve:
$fn = 12- Very fast preview, coarse geometry (useful for quick testing)$fn = 32- Good balance for most designs (default for many situations)$fn = 100+- High quality but slow to render; use only for final export
Debugging Workflow:
- During design iteration: Use
$fn = 12or$fn = 20for quick feedback - Before export: Increase to
$fn = 32or higher for final quality - For complex assemblies: Keep
$fnlow during iteration to save preview time
Incremental Rendering: The F5/F6 Workflow
- F5 (Preview): Quick render to check overall geometry and catch layout errors
- F6 (Full Render): Slower but more accurate; use before export
- Strategy: Press F5 frequently while editing to get immediate feedback, then F6 once before exporting
This workflow catches errors early and saves you from spending 10 minutes rendering only to discover a syntax error.
Diagnosing Non-Manifold Geometry
A model might render in OpenSCAD but still be unprintable. The slicer will report errors like “non-manifold edges” or “holes in surface.” Common causes:
- Coincident Faces -> Use small offsets (0.001 mm)
- Zero-Thickness Walls -> Ensure all walls are at least 0.8-1.0 mm
- Gaps Between Shapes -> Check that boolean operations have no small gaps; use
minkowski()for rounded edges if needed - Inside-Out Geometry -> A shape might be flipped; use
scale([1, 1, -1])to flip normals if needed
When your slicer reports non-manifold issues, use the slicer’s visualization to locate the problem, then reference the line numbers in your OpenSCAD code and test fixes incrementally using F5/F6.
Checkpoints
- After task 3 the problematic boolean should render without non-manifold warnings4.
- After this section, you should be able to interpret at least three common console error messages and apply appropriate fixes.
Quiz - Lesson 3dMake.2 (10 questions)
- Name three primitive functions in OpenSCAD1.
- What does
difference()accomplish2? - Why might two coincident faces cause a render failure4?
- What is the 0.001 rule and why is it useful4?
- How does lowering
$fnhelp during debugging2? - True or False:
union()combines shapes whileintersection()keeps only overlapping volumes. - Describe what Constructive Solid Geometry (CSG) is and give an example of where it’s useful.
- Explain how scale(), translate(), and rotate() transforms change a primitive’s behavior.
- How would you diagnose and fix a non-manifold issue in your model?
- When validating geometry in a slicer, what specific issues should you look for?
Lesson 2 Assets & Projects
Your Lesson 2 assets are located in the centralized assets folder:
- Lesson 2 Asset Overview (assets/Lessons_3dMake_2/README.md) - Folder contents and learning resources
- Your Second Print Project (assets/Lessons_3dMake_2/Your_Second_Print/) - Adapt models to real-world needs
- Bonus Print Project (assets/Lessons_3dMake_2/Bonus_Print/) - Practice resizing and parametric variation
These projects reinforce the boolean operations and CSG concepts you learned in this lesson.
Extension Problems (10)
- Create a small assembly using
union()of three primitives and export the STL. Reference best practices from OpenSCAD documentation1. - Intentionally create a failing boolean and fix it using offsets; explain your approach. Document the manifold issues encountered4.
- Write a short test script that generates three variants with varying
$fnvalues and compare render times. Consider using 3dMake workflows3. - Use
3dm info(if available) to generate a report on your model and document any recommendations3. - Explore using a library module (e.g., a fillet helper) to fix a sharp corner and note the difference in final STL2.
- Build a geometry validation toolkit: test all basic transformations (union, difference, intersection) with edge cases and document failure modes.
- Create a parametric assembly generator that produces 5+ configurations and validates each for printability.
- Develop a boolean operation troubleshooting guide with visual examples and step-by-step fixes.
- Design a library module system for common geometric operations (fillets, chamfers, arrays); test reusability across projects.
- Write an accessibility guide for boolean operations: describe methods for validating geometry non-visually using model properties and slicer feedback.
Supplemental Resources
For additional examples and practice with 3D primitives and boolean operations, explore these resources:
- Programming with OpenSCAD EPUB Textbook - Comprehensive guide to primitives, boolean operations, and CSG fundamentals
- CodeSolutions: 3D Primitives - Working examples of cube, sphere, cylinder, and other 3D shapes
- CodeSolutions: Combining Shapes - Examples of union, difference, intersection, and hull operations
- Practice Worksheets: 3D Shapes - Visualization and decomposition exercises
-
OpenSCAD Manual - Primitives and Transforms - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem ↩ ↩2 ↩3 ↩4
-
Gonzalez Avila, J. F., Pietrzak, T., & Casiez, G. (2024). Understanding the challenges of OpenSCAD users for 3D printing. Proceedings of the ACM Symposium on User Interface Software and Technology. ↩ ↩2 ↩3 ↩4 ↩5
-
Slicer Validation - PrusaSlicer Documentation - https://docs.prusa3d.com/en/guide/39012-validation-tools/ ↩ ↩2 ↩3 ↩4
-
Google. (2025). Vertex AI Gemini 3 Pro Preview: Getting started with generative AI. https://docs.cloud.google.com/vertex-ai/generative-ai/docs/start/get-started-with-gemini-3 ↩ ↩2 ↩3 ↩4 ↩5
OpenSCAD Quick Reference - Cheat Sheet
Keep this handy during all OpenSCAD work. For full documentation: https://openscad.org/documentation.html
Basic Shapes (Primitives)
cube([length, width, height]); // rectangular box
cube([l, w, h], center = true); // centered at origin
sphere(r = radius); // sphere by radius
sphere(d = diameter); // sphere by diameter
cylinder(h = height, r = radius); // cylinder
cylinder(h = height, d = diameter); // cylinder by diameter
cylinder(h = height, r1 = 5, r2 = 2); // cone (different top/bottom radii)
$fn = 50; // sets smoothness for spheres/cylinders (higher = smoother, slower)
Transformations
translate([x, y, z]) shape; // move
rotate([x_deg, y_deg, z_deg]) shape; // rotate
scale([x, y, z]) shape; // scale (1.5 = 150%)
mirror([1, 0, 0]) shape; // mirror across YZ plane (use [0,1,0] for XZ, [0,0,1] for XY)
Boolean Operations
union() { shape1; shape2; } // combine shapes
difference() { base; subtract; } // remove one shape from another
intersection() { shape1; shape2; } // keep only overlapping region
Tip for difference(): Always make the subtracting shape 1 mm taller on both ends than the base shape to avoid zero-thickness artifacts.
// Example - box with a hole:
difference() {
cube([30, 30, 10]);
translate([15, 15, -1]) cylinder(h = 12, r = 5); // extends -1 to +11
}
Variables
length = 70; // define a variable
width = 16;
height = 5;
cube([length, width, height]); // use the variables
cube([length * 2, width, height]); // math works too
Modules (Reusable Functions)
// Define a module:
module my_box(l = 20, w = 15, h = 10) {
cube([l, w, h]);
}
// Call the module:
my_box(); // uses all defaults
my_box(30, 20, 8); // positional arguments
my_box(l = 50); // named argument; others use defaults
Loops
// Repeat a shape N times:
for (i = [0 : 4]) { // i goes 0, 1, 2, 3, 4
translate([i * 20, 0, 0]) cube([15, 15, 5]);
}
// Step size:
for (i = [0 : 5 : 20]) { // i goes 0, 5, 10, 15, 20
translate([i, 0, 0]) sphere(r = 3);
}
2D Shapes (for extrusion)
circle(r = 10); // 2D circle
square([w, h]); // 2D rectangle
polygon([[0,0],[10,0],[5,10]]); // arbitrary 2D shape
// Extrude a 2D shape into 3D:
linear_extrude(height = 5) circle(r = 10); // makes a cylinder
rotate_extrude() translate([15, 0]) circle(r = 3); // makes a torus
Useful Functions
len([a, b, c]) // returns 3 (length of a vector)
sqrt(25) // returns 5
pow(2, 8) // returns 256 (2^8)
abs(-5) // returns 5
min(3, 5, 1) // returns 1
max(3, 5, 1) // returns 5
Comments
// Single-line comment
/*
Multi-line
comment
*/
Keyboard Shortcuts
| Key | Action |
|---|---|
| F5 | Preview (fast) |
| F6 | Full render (for export) |
| Ctrl+S | Save |
| Ctrl+Z | Undo |
| F3 | Reset camera view |
| F5 then scroll | Zoom with mouse |
Export Workflow
- Press F6 (full render - wait for it to complete)
- File > Export > Export as STL
- Save with a descriptive filename:
projectname_v2.stl
Sources
OpenSCAD. (n.d.). OpenSCAD cheatsheet. https://openscad.org/cheatsheet/
OpenSCAD. (n.d.). OpenSCAD documentation. https://openscad.org/documentation.html
Gohde, J., & Kintel, M. (2021). Programming with OpenSCAD. No Starch Press. https://nostarch.com/programmingopenscad
Real-Life Problem Solver - Guided Extension
Estimated time: 4-8 hours (design, adapt, print, and document)
Learning Objectives
- Identify a user problem and evaluate candidate printed solutions
- Adapt an existing model to meet real constraints and safety requirements
- Test, measure, and iterate on a prototype with documented decisions
Materials
- Computer with slicer and access to repositories
- Printer, filament, basic hand tools for post-processing
Step-by-step Tasks
- Interview a potential user (or yourself) and write a 1-paragraph problem statement.
- Search repositories for candidate models; list three options and justify which one you will adapt.
- Adapt the model (scale, add mounts, or modify features) and document the changes in a short changelog.
- Slice, print, and run a supervised test of the prototype; log any failures and corrective actions.
- Produce a final report summarizing performance, measured deviations, and next steps.
Probing Questions
- What assumptions did you make about the user’s context? How could you validate them?
- Which adaptation had the biggest impact on function and why?
Quiz - Your Second Print (10 questions)
- What is a good first question to ask a stakeholder when scoping this project? (short answer)
- Name one safety consideration when adapting a model for daily use. (short answer)
- What is a changelog entry? (one sentence)
- How do you verify a fit for an assembled part? (short answer)
- Why document corrective actions during testing? (one sentence)
- True/False: Once you complete a successful first print, any second project will automatically succeed without iteration. (Answer: False)
- Short answer: Describe one method to gather user feedback on your adapted model before committing to a full production print.
- Practical scenario: Your adapted model prints but feels too fragile in daily use. What are two strategies to improve durability while maintaining the basic form?
- Multiple choice: When you create a changelog, what should you document? (A) Only the successful changes (B) All changes, including failures and iterations (C) Only the slicer settings - Answer: B
- Reflection: Explain how iteration (design -> print -> test -> adapt) leads to better functional outcomes than trying to get the design perfect on the first attempt. Give a specific example from your project.
Extension Problems (10)
- Rework your prototype to improve durability and report trade-offs in weight and print time.
- Create a user test script and run it with two participants; summarize results.
- Convert a critical component to parametric OpenSCAD and publish the variant.
- Add a small assembly guide with tactile cues for non-visual users.
- Compare two filament types for the same part and recommend one with justification.
- Execute a formal design iteration cycle: print, test, measure, analyze, revise; repeat at least 3 times and document improvements.
- Build a comparative analysis: print your part in 2 different materials or with 2 different profiles; measure and compare all key properties.
- Create a complete design dossier: CAD files, iteration history, test results, measurements, lessons learned, and final recommendations.
- Develop a user testing protocol: define success metrics, recruit testers, gather systematic feedback, and iterate based on results.
- Write a design case study: document your entire project journey from initial concept through final manufacture, including all mistakes and successes.
Your Second Print - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Adapt or modify an existing 3D model to meet a new constraint, improve functionality, or customize for a specific use.
Ideas and Concept
Original Model
- Model name and source:
- Link or file reference:
- Why did you choose this model for adaptation?
Adaptation Goal
- What problem or constraint are you addressing?
- How will you know the adaptation is successful?
- Who will use the adapted model?
Measurements and Design Specifications
Original Model Specifications
| Parameter | Value |
|---|---|
| Print time | |
| Filament | |
| Key dimension 1 | |
| Key dimension 2 |
Adapted Model Specifications
| Parameter | Original | Adapted | Reason for Change |
|---|---|---|---|
Object Notes
Modifications Made
- Describe changes to the original design:
- Did you modify the model in OpenSCAD, slicer, or both?
- Include before/after code snippets or screenshots:
Design Iteration Cycle
Print 1
- Date:
- Modifications:
- Results:
- Issues:
- Next action:
Print 2 (if applicable)
- Date:
- Modifications:
- Results:
- Issues:
- Next action:
Print 3 (if applicable)
- Date:
- Modifications:
- Results:
- Final assessment:
User Testing (if applicable)
- Who tested the adapted model?
- What feedback did they provide?
- How did this feedback influence your design?
Assembly and Use Notes
- How is the adapted model assembled or used?
- How does it differ from the original in use?
- What challenges did you encounter?
Reflections
Design Evolution
- Describe how your adaptation evolved through the iteration process
- Which iteration felt most successful?
Lessons Learned
- What did you learn about adapting existing designs?
- What surprised you during the process?
Comparison: Original vs. Adapted
- What are the key functional differences?
- Would you recommend the adapted version? Why?
Future Iterations
- If you were to continue developing this, what would you change?
- How could you make the design more parametric or reusable?
Accessibility Considerations
- How did you approach testing this project with screen readers?
- What documentation would help someone without visual access understand the changes?
Attachments
- Original model file (link or reference)
- Adapted model file (
.scador.stl) - Code comparison (before/after with comments)
- Photos of adapted print(s)
- Iteration log with timestamps
- User feedback notes (if applicable)
- Slicer settings for final print
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Feedback:
Resubmission (if applicable)
What Was Changed
(One-paragraph explanation of changes made and why)
Revised Score
| Category | Revised Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Your Second Print - Teacher Template (Extension Project)
Briefing
Building on the first successful print, students now adapt an existing model to meet a specific constraint or improvement goal. This project emphasizes design iteration, parametric thinking, and the ability to modify existing designs for new contexts.
Key Learning: Design iteration; constraint-based modification; documentation of changes.
Real-world Connection: Adaptation and iteration are core engineering practices. Most real products are refinements of earlier versions.
Constraints
- Must be a modification or adaptation of an existing 3D model
- Modifications must be parametric (variables or commented code showing what changed)
- Student must document the modification rationale and testing process
- Iteration should be evidence through multiple print attempts or variant comparisons
Functional Requirements
- Modification is clearly documented with before/after code comparison
- Adapted print functions as intended in the modified context
- Student provides evidence of testing the adaptation
- Design shows intentional thought about materials, fit, or functionality
Deliverables
- Completed documentation template with:
- Original model identification and link
- Modifications made (with code comments or diff)
- Design iteration cycle (print, test, adapt, repeat)
- User testing results (if applicable)
- Reflection on design decisions
- Comparison of original vs. adapted version
- Modified
.scador.stlfiles showing changes - Photos of both original and adapted prints (if possible)
- Test results or user feedback documentation
Rubric
All projects are scored on a 0-9 scale across three equally weighted categories (3 points each):
| Category | Points | What We Measure |
|---|---|---|
| Problem & Solution | 0-3 | Is the adapted design functional? Does it solve the stated adaptation goal? |
| Design & Code Quality | 0-3 | Are modifications clear and well-documented? Is iteration evident? Does the part work well? |
| Documentation | 0-3 | Is the iteration cycle documented? Are design decisions explained? Is reflection thorough? |
Category 1: Problem & Solution (0-3 points)
| Score | Description |
|---|---|
| 3 | Adaptation successfully addresses design goal. Print is functional and performs as intended in modified context. |
| 2 | Adaptation mostly addresses goal. Print is functional with minor limitations. |
| 1 | Adaptation partially addresses goal. Print has functional limitations. |
| 0 | Adaptation does not work or is not attempted. |
Category 2: Design & Code Quality (0-3 points)
| Score | Description |
|---|---|
| 3 | Modifications clearly documented with before/after comparison. Iteration cycle evident (multiple prints/tests). Print quality excellent. |
| 2 | Modifications documented adequately. Some iteration evident. Print quality acceptable. |
| 1 | Minimal modification documentation. Little iteration. Print quality acceptable but lacks refinement. |
| 0 | Modifications not documented or design not functional. |
Category 3: Documentation (0-3 points)
| Score | Description |
|---|---|
| 3 | All sections complete. Design iteration documented with measurements and testing results. Reflection is specific. Photos included. |
| 2 | Most sections present. Iteration documented but could be more detailed. Reflection adequate. |
| 1 | Incomplete sections. Minimal iteration documentation. Reflection brief. |
| 0 | No documentation submitted. |
Score Interpretation
| Total Score | Interpretation | Next Step |
|---|---|---|
| 8-9 | Excellent adaptation | Student demonstrates design maturity |
| 6-7 | Good iteration and adaptation | Encourage further design work |
| 4-5 | Meets basics; improve iteration | Resubmit iteration documentation |
| 2-3 | Does not meet expectations | Resubmission or coaching |
| 0-1 | Missing components | Meet with instructor |
Resubmission Policy
Students may resubmit to improve their score. Resubmissions must include:
- A one-paragraph explanation of what was changed and why
The resubmission score replaces the original.
Assessment Notes
- Strong submissions show clear modification intent, multiple iteration cycles with documented changes, and user feedback integration
- Watch for: Minimal modifications, no iteration, or generic reflections
- Reinforce: Why iteration matters; how to document design decisions
- Extension: Portfolio development; design for manufacturability
Bonus Print - Guided Extension
Estimated time: 3-5 hours
Learning Objectives
- Apply scaling and simple modifications to an existing model
- Verify multi-part prints and manage print constraints
- Document design changes and reproduceable print settings
Materials
- Online repository access, slicer, printer, filament
Step-by-step Tasks
- Choose a model from Thingiverse or Printables and note the original dimensions.
- Decide on a purposeful modification (scale, add mounting holes, combine parts) and explain why.
- Apply changes in OpenSCAD (or by scaling in the slicer) and record the new dimensions.
- Slice and print all parts in one session when possible; log print times and filament used.
- Create a short construction note and photograph the assembled result.
Probing Questions
- What motivated the modification and who benefits from it?
- How did scaling affect tolerances or assembly fit?
Quiz - Bonus Print (10 questions)
- What is one risk when scaling a model up or down? (short answer)
- Name two checks to perform before printing multi-part models. (short answer)
- How should you record filament usage? (short answer)
- Why document construction steps? (one sentence)
- What is one visual sign a part needs more infill? (one sentence)
- True/False: Scaling a model uniformly (proportionally) in all three dimensions will preserve the original fit tolerances perfectly. (Answer: False - because tolerance stack-up and printer behavior can change)
- Short answer: Explain the difference between scaling a model in the slicer versus modifying the OpenSCAD code to scale a design. Which approach is more reproducible?
- Practical scenario: You want to scale a model from 10 cm to 25 cm (2.5x scale). What should you check regarding print time and support material before committing to the print?
- Multiple choice: When assembling multi-part prints, what should you test first? (A) The final assembly (B) Individual part dimensions, then pairwise assembly (C) Skip testing - Answer: B
- Reflection: Describe how documenting your modifications (scaling factor, OpenSCAD code changes, filament type, print settings) enables other students to reproduce your design and iterate on it further.
Extension Problems (10)
- Create a small assembly guide with tactile cues for non-visual users.
- Produce two scaled variants and compare required print time and fit.
- Modify a part to include snap-fit connectors and document fit tolerances.
- Add simple labeling to parts using embossed text in OpenSCAD.
- Publish your variant and short build notes to the class repo and review two peers’ submissions.
- Build a complete variant library: create 5+ variations of your bonus print; document parameters, reasoning, and use cases.
- Design a variant optimization process: compare variants by cost, print time, quality, and functionality; justify your “best” choice.
- Create a parametric master file that generates all variants automatically; test parameter ranges and edge cases.
- Develop a variant documentation and sharing system: create a portfolio with photos, specs, and instructions for each variant.
- Write a “remix and iterate” guide: explain how future students can modify your designs, what parameters they should change, and how to test improvements.
Bonus Print - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Create scaled variants of a design to explore parametric thinking and manufacturing trade-offs.
Design Concept
- Base design name and description:
- Why did you choose this design?
- How will you generate variants parametrically?
Variant Specifications
| Variant | Scale | Print Time (est.) | Filament (est.) | Key Dimensions |
|---|---|---|---|---|
| v1 | ||||
| v2 | ||||
| v3 |
Print Results
| Variant | Actual Print Time | Actual Filament | Quality | Notes |
|---|---|---|---|---|
| v1 | ||||
| v2 | ||||
| v3 |
Analysis and Reflections
- Which variant is most efficient (time/material ratio)?
- How did scaling affect print quality?
- What trade-offs did you observe (speed vs. quality, material vs. time)?
- If you made a fourth variant, what would it be and why?
Attachments
-
.scadfile with variant generation code - Photos of all variants (assembled if applicable)
- Print log for each variant
- Comparison analysis
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Bonus Print - Teacher Template (Extension Project)
Briefing
Students design scaled variants of a 3D-printable object to explore parametric design and manufacturing trade-offs. This project emphasizes variant generation, documentation, and the relationship between design parameters and print outcomes.
Key Learning: Parametric scaling; variant generation; trade-off analysis.
Real-world Connection: Manufacturing efficiency depends on understanding how parameter changes affect production time, material use, and functionality.
Constraints
- Must generate at least 3 scaled variants of a single base design
- All variants must be parametric (variables clearly documented)
- Student must document print parameters for each variant
- Variants must be compared on measurable criteria (time, material, fit, etc.)
Functional Requirements
- Variants are generated parametrically, not manually resized in slicer
- Each variant prints successfully
- Comparison metrics recorded for all variants
- Code is well-commented and organized
Deliverables
- Parametric
.scadwith variant generation code - Completed documentation template with variant specifications
- Print log for all variants
- Comparison matrix (time, material, quality, cost)
- Photos of all variants
- Reflection on design scalability
Rubric
(Same three-category 0-9 scale as other projects)
Category 1: Problem & Solution (0-3)
All variants print successfully and meet comparison criteria.
Category 2: Design & Code Quality (0-3)
Code is parametric and well-commented. Variants show thoughtful design thinking.
Category 3: Documentation (0-3)
Comparison matrix complete. Reflection specific and insightful.
Assessment Notes
- Strong submissions: Show parametric structure, complete comparison matrix, and insightful reflection on scaling trade-offs
- Reinforce: How parametric thinking enables rapid variant generation
- Extension: Cost-benefit analysis; material property comparisons
Lesson 3: Parametric Architecture and Modular Libraries
Estimated time: 60 minutes
Learning Objectives
- Define and document top-level parameters and use them to drive model variants1
- Create reusable modules and import a library module into a project2
- Produce and test low-resolution renders and export a working STL3
Materials
- A 3dMake project scaffold with
src/main.scad - Example library (e.g., BOSL) available in
lib/or classroom assets - Reference: openscad-cheat-sheet.md for parametric design patterns
-
Open
src/main.scadand add three top-level parameters (with units) at the top of the file1.// Top-level parameters - customize these part_width = 50; // mm part_height = 40; // mm part_thickness = 5; // mm -
Implement a simple
module bracket(width, height, thickness)that composes primitives and boolean operations2.// Simple bracket module - combines primitives with CSG module bracket(w, h, t) { union(){ // Base plate cube([w, h, t], center=false); // Vertical support translate([0, h-5, 0]) cube([t, 5, 20], center=false); } } // Use the module bracket(part_width, part_height, part_thickness); -
Include a library module (e.g.,
include <bosl/constants.scad>) and call a small helper from it; run3dm build2.Alternative: Create your own simple library module:
// Create lib/helpers.scad module simple_fillet(size, radius) { // Simple fillet using minkowski minkowski(){ children(); cylinder(h=0.01, r=radius, $fn=16); } }Then in main.scad:
include <lib/helpers.scad> simple_fillet(20, 2){ cube([20, 20, 20]); } -
Produce a low-resolution render to confirm topology, then export an STL and inspect it in a slicer4.
- Use
$fn=12or lower during development to speed up renders - Once satisfied, increase to
$fn=32or$fn=64for final prints
- Use
-
Refactor the module into
lib/with a short README and a usage example1.
Going Deeper: Parametric Design and Modular Thinking
Now that you’ve created simple modules, let’s explore why they matter for design at scale.
What Is Parametric Design?
Parametric design means building your model around adjustable parameters so that a single change propagates automatically throughout your entire design. Instead of hardcoding a dimension like 50, you store it in a variable:
// Non-parametric (fragile):
cube([50, 50, 50]);
translate([50, 0, 0]) cube([50, 50, 50]);
translate([100, 0, 0]) cube([50, 50, 50]);
// Parametric (flexible):
box_size = 50;
cube([box_size, box_size, box_size]);
translate([box_size, 0, 0]) cube([box_size, box_size, box_size]);
translate([2*box_size, 0, 0]) cube([box_size, box_size, box_size]);
If you need to change the box size from 50 to 60 mm, the parametric version requires one change; the non-parametric version requires three edits.
Modules with Default Parameters
A module becomes even more powerful when you define default parameters:
// Define a module with defaults
module storage_box(length = 40, width = 30, height = 20, wall = 2) {
difference() {
// Outer shell
cube([length, width, height]);
// Inner hollow (remove inside, keep walls and bottom)
translate([wall, wall, wall])
cube([length - 2*wall, width - 2*wall, height]);
}
}
// Call with defaults
storage_box();
// Call with one parameter changed
storage_box(length = 60);
// Call with all custom parameters
storage_box(length = 80, width = 50, height = 30, wall = 3);
This approach creates a small, medium, and large box set:
// Small box (all defaults)
storage_box();
// Medium box (positioned next to small)
translate([45, 0, 0]) storage_box(length = 50, width = 40, height = 25);
// Large box (positioned next to medium)
translate([100, 0, 0]) storage_box(length = 70, width = 55, height = 35);
The DRY Principle: Don’t Repeat Yourself
When you copy-paste the same shape over and over, you create maintenance risk. If you later discover a bug in the shape, you must fix it in every copy. Modules eliminate this:
Without modules (DRY violation):
// Bracket repeated 3 times (copy-paste)
union(){ cube([10,10,10]); translate([0,20,0]) cube([2,30,10]); }
translate([50, 0, 0]) union(){ cube([10,10,10]); translate([0,20,0]) cube([2,30,10]); }
translate([100, 0, 0]) union(){ cube([10,10,10]); translate([0,20,0]) cube([2,30,10]); }
With modules (DRY compliant):
module bracket() {
union(){
cube([10,10,10]);
translate([0,20,0]) cube([2,30,10]);
}
}
bracket();
translate([50, 0, 0]) bracket();
translate([100, 0, 0]) bracket();
Scope and Reusability
Parameters are scoped to their module, meaning you can’t access a module’s parameters from outside it. This is intentional-it prevents naming conflicts and makes modules truly reusable:
module box(size = 10) {
cube([size, size, size]);
}
// You can use 'size' in multiple contexts without conflict
size = 100; // Global size
box(); // Calls box with its default size=10
translate([size, 0, 0]) box(size = 50); // Calls box with size=50
Importing Libraries: include vs use
Once you’ve written modules in lib/helpers.scad, you can share them with other projects:
// Option 1: include (gives you all functions and modules)
include <lib/helpers.scad>
// Option 2: use (brings in functions but hides module definitions)
use <lib/helpers.scad>
// Now you can call any module from helpers.scad
simple_fillet(20, 2) {
cube([20, 20, 20]);
}
For most classroom use, include is simpler to understand. For larger projects, use provides cleaner namespace isolation.
Testing Your Modules
Before committing a module to your library, test it with:
- Different parameter values: Call the module with minimum, maximum, and mid-range values
- Default values: Verify that calling it with no parameters produces a reasonable result
- Rendered output: Use
$fn = 32to render the module and visually inspect for geometry issues - STL export: Export to STL and open in your slicer to check for non-manifold warnings
Checkpoints
- After step 2 you have a parametric module you can call with different arguments1.
- After this section, you should understand how to create modules with default parameters and why that matters for reusability.
Quiz - Lesson 3dMake.3 (10 questions)
- What is a parametric module and why is it useful1?
- How do you include an external library in OpenSCAD2?
- What is one advantage of moving code into
lib/1? - How can you test a module quickly without a full high-resolution render4?
- Name one safety or documentation step to include when producing a reusable module1.
- True or False: Parametric modules can only accept one parameter.
- Describe what “Don’t Repeat Yourself” (DRY) means in the context of 3D model code.
- Explain how you would create a module with three parameters and use it in your main file.
- What testing strategies should you use to validate a new module before using it in production prints?
- How would you document a reusable module so that future users (including yourself) understand its parameters and limitations?
Extension Problems (10)
- Create a module for a mounting bracket with parameters for hole size and spacing; publish a usage example1.
- Use a library module to add a fillet and compare the final STL before and after2.
- Produce three variants by changing a parameter and record estimated print times1.
- Move a working module into
lib/and commit with a clear commit message3. - Write a short README for your module describing parameter ranges and expected units1.
- Build a complete module library with 5+ reusable parts; create comprehensive documentation and usage examples for each.
- Design a module versioning and compatibility system; document how to manage parameter changes over time.
- Create a module testing suite: write validation tests for parameter ranges, edge cases, and output consistency.
- Develop an accessibility guide for module parameters: explain how to use and understand module options without visual feedback.
- Write a module library contribution guide: standards for code style, documentation, testing, and review for collaborative development.
Supplemental Resources
For deeper exploration of parametric design and module creation, explore these resources:
- Programming with OpenSCAD EPUB Textbook - Comprehensive guide to modules, parametric design, and library creation
- CodeSolutions: Modules - Working examples of module definition, parameter passing, and reusable components
- BOSL2 Library - Professional OpenSCAD library with hundreds of reusable modules for common operations
-
OpenSCAD Modules - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Modules ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
BOSL - OpenSCAD Standard Library - https://github.com/BelfrySCAD/BOSL2 ↩ ↩2 ↩3 ↩4 ↩5
-
OpenSCAD Review - Worth learning? - CadHub, accessed February 18, 2026, https://learn.cadhub.xyz/blog/openscad-review/ ↩ ↩2
Parametric Design Template
// Parametric Design Template // Demonstrates how to create designs that adapt to different inputs // This pattern allows you to quickly generate variations
// ============================================ // CUSTOMIZABLE PARAMETERS // ============================================
// Box dimensions (change these to regenerate different sizes) box_width = 40; box_depth = 40; box_height = 30;
// Feature sizing (scales with box size) corner_radius = 3; wall_thickness = 2;
// Boolean flags for feature toggling include_lid = true; include_feet = true; hollow_interior = true;
// ============================================ // QUALITY SETTINGS // ============================================ $fn = 30; // Fragment quality
// ============================================ // PARAMETRIC MODULES // ============================================
// Simple box with rounded corners module rounded_box(width, depth, height, radius) { hull() { // Create 8 corner spheres to define the shape translate([radius, radius, radius]) sphere(r = radius); translate([width - radius, radius, radius]) sphere(r = radius); translate([radius, depth - radius, radius]) sphere(r = radius); translate([width - radius, depth - radius, radius]) sphere(r = radius); translate([radius, radius, height - radius]) sphere(r = radius); translate([width - radius, radius, height - radius]) sphere(r = radius); translate([radius, depth - radius, height - radius]) sphere(r = radius); translate([width - radius, depth - radius, height - radius]) sphere(r = radius); } }
// Box with optional hollow interior module box_body(width, depth, height, wall, hollow) { if (hollow) { difference() { rounded_box(width, depth, height, corner_radius);
translate([wall, wall, wall])
rounded_box(width - 2*wall,
depth - 2*wall,
height - 2*wall,
corner_radius);
}
} else {
rounded_box(width, depth, height, corner_radius);
}
}
// Optional feet/standoff supports module feet(width, depth, foot_height, foot_radius) { foot_spacing_x = width * 0.8; foot_spacing_y = depth * 0.8;
translate([width/2 - foot_spacing_x/2, depth/2 - foot_spacing_y/2, 0])
cylinder(h = foot_height, r = foot_radius, $fn = 16);
translate([width/2 + foot_spacing_x/2, depth/2 - foot_spacing_y/2, 0])
cylinder(h = foot_height, r = foot_radius, $fn = 16);
translate([width/2 - foot_spacing_x/2, depth/2 + foot_spacing_y/2, 0])
cylinder(h = foot_height, r = foot_radius, $fn = 16);
translate([width/2 + foot_spacing_x/2, depth/2 + foot_spacing_y/2, 0])
cylinder(h = foot_height, r = foot_radius, $fn = 16);
}
// Optional lid/cover that fits on top module lid(width, depth, lid_thickness, clearance) { translate([0, 0, -lid_thickness]) cube([width + 2clearance, depth + 2clearance, lid_thickness], center = true); }
// ============================================ // MAIN ASSEMBLY // ============================================
// Render the main body box_body(box_width, box_depth, box_height, wall_thickness, hollow_interior);
// Add feet if enabled if (include_feet) { feet(box_width, box_depth, 2, 1.5); }
// Add lid if enabled (displayed above for clarity) if (include_lid) { translate([0, 0, box_height + 3]) lid(box_width, box_depth, wall_thickness, 0.5); }
// ============================================ // USAGE TIPS // ============================================ // 1. Change top-level parameters to regenerate designs quickly // 2. Toggle include_lid and include_feet to test variations // 3. Adjust corner_radius for different aesthetic styles // 4. Export at different scales for prototyping // 5. Combine multiple parametric modules for complex designs
Module Design Pattern Template
// Module Design Pattern Template // Demonstrates best practices for organizing code with reusable modules // Modules promote code reuse, clarity, and maintainability
// ============================================ // CONFIGURATION SECTION // ============================================
$fn = 32;
// Component dimensions connector_diameter = 8; connector_length = 15; connector_wall = 1.5;
base_size = 50; base_height = 5;
// ============================================ // UTILITY MODULES (General Purpose) // ============================================
// Create a hollow cylinder (tube/connector) module hollow_cylinder(od, id, height) { difference() { cylinder(h = height, d = od, center = true); cylinder(h = height + 1, d = id, center = true); } }
// Create a flat base/mounting plate module flat_base(size, thickness) { cube([size, size, thickness], center = true); }
// Create corner supports for strengthening module corner_support(size, height) { linear_extrude(height = height, center = true) polygon(points = [[0, 0], [size, 0], [0, size]]); }
// ============================================ // SPECIFIC COMPONENT MODULES // ============================================
// Connector with internal thread pattern (for joining parts) module connector_with_threads(od, id, length, threads) { difference() { // Main connector body cylinder(h = length, d = od, center = true);
// Hollow core
cylinder(h = length + 1, d = id, center = true);
// Thread pattern (decorative/functional grooves)
for (i = [0 : threads - 1]) {
rotate([0, 0, (360 / threads) * i])
translate([od/2 - 0.5, 0, 0])
cube([1, 0.5, length + 1], center = true);
}
}
}
// Joint/coupling to connect two parts module coupling_joint(connector_od, connector_id, couple_length) { cylinder(h = couple_length, d = connector_od, center = true); }
// Base with mounting holes module base_with_holes(size, thickness, hole_diameter, hole_spacing) { difference() { // Solid base flat_base(size, thickness);
// Subtract mounting holes
for (x = [-hole_spacing/2, hole_spacing/2]) {
for (y = [-hole_spacing/2, hole_spacing/2]) {
translate([x, y, 0])
cylinder(h = thickness + 1, d = hole_diameter, center = true);
}
}
}
}
// ============================================ // ASSEMBLY MODULES (Combine Components) // ============================================
// Basic assembly: base + connector module simple_connector_assembly(base_sz, base_h, conn_od, conn_id, conn_len) { // Base plate flat_base(base_sz, base_h);
// Connector mounted vertically
translate([0, 0, base_h/2 + conn_len/2])
hollow_cylinder(conn_od, conn_id, conn_len);
}
// Complex assembly with multiple connectors module multi_connector_assembly(base_sz, base_h, spacing) { // Central base base_with_holes(base_sz, base_h, 2, spacing * 0.8);
// Mounted connectors at four corners
for (x = [-spacing/2, spacing/2]) {
for (y = [-spacing/2, spacing/2]) {
translate([x, y, base_h/2 + connector_length/2])
connector_with_threads(connector_diameter,
connector_diameter - 2*connector_wall,
connector_length,
6);
}
}
}
// ============================================ // OUTPUT SECTION // ============================================
// Choose which assembly to render:
// Option 1: Simple assembly // simple_connector_assembly(base_size, base_height, // connector_diameter, // connector_diameter - 2*connector_wall, // connector_length);
// Option 2: Multi-connector assembly multi_connector_assembly(base_size, base_height, base_size * 0.7);
// ============================================ // MODULE DESIGN BEST PRACTICES // ============================================ // 1. Utility Modules: General-purpose shapes // - Reusable across many projects // - Keep parameters generic // // 2. Component Modules: Specific parts // - Build on utility modules // - Include feature-specific logic // // 3. Assembly Modules: Combine components // - Use positioning and transforms // - Organize parts spatially // // 4. Naming Conventions: // - Use descriptive names (hollow_cylinder, not hc) // - Prefix related modules (base_, connector_) // // 5. Parameter Guidelines: // - Put adjustable values at top // - Use meaningful default values // - Document parameter purposes // // 6. Code Organization: // - Group related modules // - Start with utilities, end with assemblies // - Use comments to separate sections
Lesson 4: AI-Enhanced Verification and Multimodal Feedback
Estimated time: 45-60 minutes
Learning Objectives
- Run
3dm infoto collect deterministic renders and AI diagnostics (if configured)1 2 - Compare AI suggestions with renderer and slicer outputs and prioritize deterministic fixes3
- Record and sanitize AI prompts and outputs for reproducibility and data governance3
Materials
- 3dMake configured with an LLM API key (optional)
- Example project with renderable geometry
Step-by-step Tasks
- Verify API configuration (if used) or run
3dm info --dry-runto confirm render pipeline works locally1. - Run
3dm infoand save the produced images and textual report tobuild/1. - Inspect deterministic outputs (render warnings, slicer preview) and compare them to AI recommendations; prioritize deterministic issues3 2.
- Iterate prompt engineering (in
3dmake.tomlor via--prompt) with precise technical primitives and re-run3dm infoto examine changes3. - Document all prompts, AI outputs, and deterministic validation steps in
AI-notes.mdwithin the project3.
Checkpoints
- After step 2 you have stored render images and the AI report in
build/1.
Quiz - Lesson 3dMake.4 (10 questions)
- What command generates AI diagnostics and model renders1?
- Why must AI outputs be validated against renderer/slicer results3 2?
- Name one privacy or governance concern when sending models/images to an API3.
- What is an example of a technical primitive to include in a prompt3?
- Where should you record prompts and AI outputs in the project3?
- True or False: AI-generated suggestions should always be implemented without verification.
- Describe what “deterministic validation” means in the context of AI-assisted 3D design.
- Explain how you would use
3dm infoto validate AI suggestions against your actual model. - What steps would you take if the AI suggests a design change that conflicts with your requirements?
- How would you document AI-assisted decisions in your project for reproducibility and transparency?
Extension Problems (10)
- Create an
AI-notes.mddocumenting three prompts and the AI’s responses; indicate which suggestions you acted on3. - Simulate a false-positive AI warning: describe how you validated and rejected it using deterministic checks2.
- Generate a short prompt that requests the top three structural risks and record the results3.
- Create a short checklist for sanitizing uploads before sending to an API3.
- Re-run
3dm infoafter a code fix and compare the differences in the AI report1. - Design a verification workflow: use AI suggestions + manual validation + physical testing to validate design decisions.
- Create a transparency log for AI-assisted features: document all AI interactions, suggestions adopted, and decisions made.
- Build an AI-assisted design case study: from initial prompt through final print; document the entire decision process.
- Develop guidelines for trustworthy AI use in 3D printing: when to trust AI, when to verify, and how to validate recommendations.
- Write an accessibility guide for using AI features in 3DMake: how to interpret AI suggestions non-visually and understand confidence levels.
-
3DMake GitHub - https://github.com/tdeck/3dmake ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Deterministic Validation in Design - https://www.nist.gov/publications ↩ ↩2 ↩3 ↩4
-
AI Output Validation - Best Practices for Prompt Engineering - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
Dice Design Workshop - Guided Extension
Estimated time: 3-6 hours
Learning Objectives
- Design parametric dice in OpenSCAD with controlled mass distribution
- Test durability and randomness for small, thrown objects
- Document design decisions and measure physical outcomes
Materials
- Computer with OpenSCAD and slicer
- Printer and filament, small testing surface
Step-by-step Tasks
- Create three distinct die designs in OpenSCAD using parameters (size, face style, internal cavities).
- For each die, explain which parameters you changed and why (one short paragraph each).
- Print one sample of each die and perform a basic durability test (five throws onto a soft surface).
- Record outcomes of each throw and compute a simple frequency table for face results.
- Measure mass and critical dimensions; document any deformation or failure modes.
Probing Questions
- How does internal infill or cavity affect mass distribution and roll randomness?
- Which parameter had the largest effect on durability and why?
Quick Quiz (10 questions)
- What parameter controls wall thickness in your
.scadfile? (short answer) - Name one method to increase a part’s impact resistance. (short answer)
- How would you test randomness in a die? (short answer)
- Why might a hollow die behave differently than a solid one? (one sentence)
- What is a simple sign of print-layer delamination? (one sentence)
- True/False: A perfectly fair die must have uniform weight distribution throughout, including the internal structure. (Answer: True)
- Short answer: Describe two design approaches to a die that could be parametrically scaled - one using
cube()withdifference()for texture, one usinglinear_extrude()for embossed numbers. - Practical scenario: Your first die printed, but when tested with 100 rolls, it landed on face #1 significantly more often than other faces. What are two possible causes and how would you diagnose the problem?
- Multiple choice: If you increase infill from 15% to 50%, what happens? (A) Dramatically longer print time and higher weight (B) Slightly longer print time, much higher weight (C) Same weight, different durability - Answer: B
- Reflection: Explain why a fair die is an excellent test of design precision and iterative improvement. How does this project teach you about manufacturability, quality assurance, and design validation?
Extension Problems (10)
- Create a parametric script that produces dice with adjustable center-of-mass offsets and show results of roll tests.
- Design a bead-style die that assembles from two printed halves and document assembly steps.
- Compare two infill patterns for the same die and report on mass and durability differences.
- Add tactile markers to faces for non-visual testing and document how they affect roll behavior.
- Publish your
.scadand test logs to the class repo and provide feedback on two classmates’ designs. - Conduct a formal fairness test: roll your die 100+ times, track results, and perform statistical analysis to verify randomness.
- Design multiple die variants (sizes, infills, materials); compare manufacturing feasibility, cost, and performance for each.
- Create a parametric die library: build a system that generates dice of different sizes, materials, and properties on command.
- Develop a comprehensive quality assurance protocol: define tolerances, measurement methods, and acceptance criteria for fair dice.
- Write a die design guide for future students: explain the physics of fair dice, how to test for bias, and how to iterate on designs.
Dice, Dice, Dice - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Design parametric 3D-printed dice and test for fairness through statistical analysis.
Design Concept
- Dice specifications (size, material, infill):
- How will you ensure uniform weight distribution?
- What design details will your dice include (pips, patterns)?
Design Specifications
| Parameter | Value |
|---|---|
| Die size | |
| Infill % | |
| Material | |
| Pip depth | |
| Pit/pip count per face |
Fairness Testing
Test Setup
- How many rolls will you conduct? (minimum 100)
- Rolling surface and method:
- Date/time of testing:
Roll Results
| Face | Frequency (out of ___ rolls) | Percentage | Expected % |
|---|---|---|---|
| 1 | 16.67% | ||
| 2 | 16.67% | ||
| 3 | 16.67% | ||
| 4 | 16.67% | ||
| 5 | 16.67% | ||
| 6 | 16.67% |
Statistical Analysis
- Calculate chi-squared value or deviation from expected:
- Is the die fair (within statistical tolerance)?
- What face appears most/least frequently?
Reflections
- Were you surprised by the results?
- What design factors influenced fairness?
- How would you improve the dice design?
- What did you learn about manufacturing precision?
Attachments
-
.scadfile with parametric dice module - Photo of test dice
- Roll data (raw results or tally sheet)
- Statistical analysis calculations
- Design iteration notes (if multiple versions tested)
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Dice, Dice, Dice - Teacher Template (Extension Project)
Briefing
Students design and test fair 3D-printed dice to explore geometry, symmetry, manufacturing precision, and statistical validation. This project combines physics, materials science, and rigorous testing practices.
Key Learning: Precision manufacturing; fairness validation; quality assurance.
Real-world Connection: Manufacturing quality assurance requires measurement, testing, and statistical analysis. Casino dice are one of the most rigorously tested manufactured objects.
Constraints
- Dice must be generated parametrically in OpenSCAD
- Student must conduct fairness testing (100+ rolls minimum)
- Design must address weight distribution and uniform geometry
- Statistical analysis of test results required
Functional Requirements
- Dice geometry is parametric (size, infill, details)
- All faces print with usable pips/markers
- Statistical testing conducted with documented results
- Analysis shows understanding of fairness criteria
Deliverables
.scadfile with parametric dice module- Completed documentation template with fairness test results
- Statistical analysis (roll frequency data, calculations)
- Photos of test dice and assembly
- Reflection on design precision and manufacturing tolerances
Rubric
Category 1: Problem & Solution (0-3)
Dice print successfully and fairness testing conducted rigorously.
Category 2: Design & Code Quality (0-3)
Code is parametric and thoughtful. Dice design shows understanding of symmetry and balance.
Category 3: Documentation (0-3)
Testing data complete and organized. Statistical analysis accurate and insightful.
Assessment Notes
- Strong submissions: Show rigorous fairness testing (100+ rolls), clear statistical analysis, and reflection on manufacturing precision
- Reinforce: Why uniformity matters; how to test for bias
- Extension: Material comparisons; cost-benefit analysis of infill vs. fairness
Lesson 5: Safety Protocols and the Physical Fabrication Interface
Estimated time: 60-90 minutes
Learning Objectives
- Describe the Hierarchy of Controls and apply it to a classroom maker-space1 2
- Perform pre-print environmental and equipment checks1
- Validate the digital-to-physical pipeline and document post-print inspection results3 4
Materials
- Classroom 3D printer, enclosure, and filtration (or documented lab SOP)
- Example parametric OpenSCAD project and slicer profile
Step-by-step Tasks
- Conduct a safety briefing: review the Hierarchy of Controls and locate safety equipment1.
- Verify environmental controls and printer readiness: confirm filtration, bed adhesion, and spool metadata1 2.
- Run
3dm buildand inspect the STL in a slicer; check layer-preview and non-manifold warnings3 4. - If using remote submission (OctoPrint), confirm camera monitoring and logging before any unattended prints1.
- Obtain instructor sign-off and monitor the first layers in-person or via camera.
- After printing, wait for the part to cool (< $30^\circ\text{C}$), measure critical dimensions, and record observations1 2.
Checkpoints
Introduction to Material Selection
Before your part goes to print, it’s important to understand how material choice affects the printing process, the final product’s properties, and the safety considerations for your workspace.
Why Material Choice Matters
Most projects in this class use PLA - and for good reason. It’s the easiest, cheapest, and lowest-emission option. But as you advance, you’ll encounter projects that require different materials:
- A flexible phone case needs TPU (thermoplastic polyurethane)
- A functional bracket that will be outdoors might use PETG (polyethylene terephthalate)
- A decorative miniature works perfectly in PLA
Three Common Materials: Quick Reference
Each material has different print temperatures, strength properties, and difficulty levels. Here’s a quick comparison:
| Material | Print Temp | Difficulty | Best Uses | Cautions |
|---|---|---|---|---|
| PLA | 190-220C | Easy | Prototypes, classroom projects, decorative models | Brittle; low heat resistance; low emission |
| PETG | 230-250C | Moderate | Functional parts, mechanical components, water resistance | Stringing issues; requires bed heat; more emission than PLA |
| TPU | 220-240C | Hard | Flexible parts, phone cases, gaskets, wearables | Requires slow speeds; produces more fumes; needs ventilation |
How Material Choice Affects Your Slicer Settings
When you switch materials, you must adjust:
- Nozzle Temperature: Too cold and plastic won’t extrude; too hot and it burns
- Bed Temperature: Helps adhesion; critical for PETG, optional for PLA
- Print Speed: TPU requires very slow speeds (20-30 mm/s) to prevent extrusion problems
- Cooling: PLA benefits from active cooling; TPU does not
Most slicers (like PrusaSlicer) have material profiles that automatically set these values. Always verify the temperatures match your filament’s specifications (check the spool label).
Environmental and Safety Considerations
Different materials produce different levels of emission:
- PLA: Lowest concern; generally safe in ventilated rooms
- PETG: Low emission; still requires good ventilation
- TPU: Moderate to higher emission; requires active ventilation or filtration
Always follow your classroom’s safety protocol and consult Appendix B: Material Properties & Selection for a comprehensive reference on all available materials, their specifications, and best practices.
Looking Ahead: Material and Design Decisions
Later in this curriculum, you’ll encounter projects that specifically require:
- Flexible materials (Lesson 8: Assembly and Durability)
- High-strength materials (Lesson 10: Quality Assurance and Measurement)
- Multiple-material assemblies (Lesson 11: Stakeholder-Centric Design)
By understanding material properties now, you’ll be prepared to make informed design decisions in those lessons.
Quiz - Lesson 3dMake.5 (10 questions)
- What are the four levels of the Hierarchy of Controls1?
- Name two engineering controls useful for reducing emissions1 2.
- Why must you monitor the first layers of a new print profile1?
- Where should you record spool metadata and print observations3 1?
- What is the safe cooldown temperature suggested before part removal2?
- True or False: Ventilation is only necessary for commercial printing facilities.
- Describe the relationship between print temperature, material type, and emissions.
- Explain what “spool metadata” includes and why tracking it is important for reproducibility.
- How would you measure and record critical dimensions on a printed part?
- What health and safety precautions should be documented in an SOP for supervised prints?
Extension Problems (10)
- Draft a one-page SOP for start-to-finish supervised prints in your lab1 2.
- Create a checklist script that verifies spool metadata and build settings before
3dm buildruns3. - Run a test print and log measured deviations; propose a parameter change to correct the error4.
- Design an accessible post-print inspection checklist that non-visual users can follow1 2.
- Research filtration options and recommend one for your classroom, including maintenance intervals1 2.
- Develop a comprehensive classroom safety and operations manual: SOPs, checklists, emergency procedures, and accessibility considerations.
- Create a print quality assurance system: define metrics, measurement methods, and acceptance criteria for finished prints.
- Build a calibration and maintenance log: document all calibration activities, maintenance dates, and performance metrics over time.
- Design a student training certification program: define knowledge and skill requirements, create assessments, and track competency.
- Write an operations handbook that covers setup, troubleshooting, safety, maintenance, and accessibility for your 3D printing facility.
-
ANSI/AIHA Z590.3 - Hierarchy of Controls - https://www.aiha.org/ ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14
-
10+ OpenSCAD Online Courses for 2026 | Explore Free Courses & Certifications, accessed February 18, 2026, https://www.classcentral.com/subject/openscad ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
STL Validation and Geometry Checking - https://docs.prusa3d.com/en/guide/39012-validation-tools/ ↩ ↩2 ↩3 ↩4 ↩5
-
Post-Print Inspection Procedures - https://www.prusa3d.com/support/ ↩ ↩2 ↩3
Safety Checklist for 3D Printing
Complete this checklist before each printing session to maintain a safe workspace.
Pre-Print Setup
-
Work Area Clear
- Clear desk/table of unnecessary items
- Remove tripping hazards around printer
- Ensure adequate ventilation around the printer
-
Printer Inspection
- Check nozzle is clean (no old filament residue)
- Verify build plate is level
- Confirm heated bed temperature sensor attached
- Check all cables are secure and not frayed
-
Filament Preparation
- Filament spool rotates freely (no binding)
- Filament path clear of obstructions
- Extruder drive gear clean (not clogged with plastic)
- New filament loaded correctly
-
Environmental Conditions
- Room temperature adequate (18-25C ideal)
- No direct drafts from windows/AC on printer
- Humidity levels reasonable (not extremely dry)
- Adequate lighting to see printer clearly
During Print
-
First Layer Monitoring
- Watch first 2-3 layers closely
- Check bed adhesion (not too loose or tight)
- Confirm nozzle temperature stable
- Monitor for any unusual sounds
-
Regular Checks
- Check print every 15-30 minutes initially
- Verify filament is feeding smoothly
- Listen for grinding or skipping noises
- Watch for layer shifting or warping
-
Temperature Stability
- Heated bed maintains consistent temperature
- Nozzle temperature doesn’t fluctuate
- No thermal runaway warnings
Safety Alerts
- STOP Print Immediately If
- Nozzle jams or extrudes unevenly
- Filament completely stops feeding
- Burning smell detected
- Visible layer shifting
- Extruder grinding or skipping sounds
- Any unusual smells (especially chemical/burning)
- Power indicators show failure
Post-Print
-
Cool Down Period
- Allow heated bed to cool naturally (10-15 min)
- Keep hands clear until nozzle cools
- Verify printer is idle before touching
-
Print Removal
- Use proper tools (spatula/scraper)
- Remove print when bed fully cooled
- Inspect print for defects or sharp edges
- Sand sharp edges if necessary
-
Equipment Cleaning
- Wipe nozzle with brass wire when cooled
- Remove any plastic debris from build plate
- Check extruder for filament residue
- Clean any visible dust from electronics
-
Workspace Cleanup
- Return tools to proper storage
- Dispose of support material safely
- Tidy workspace and verify clear pathways
- Store filament properly in dry location
Hazard Awareness
Hot Surfaces:
- Nozzle reaches 200-250C
- Bed reaches 60-100C
- Allow adequate cooling time before touching
Filament Hazards:
- Tangled filament can jam printer
- Always keep filament spool free-spinning
- Check for knots or kinks before printing
Electrical Safety:
- Never operate with wet hands
- Keep liquids away from printer
- Unplug before major maintenance
- Verify power supply is grounded
Material Hazards:
- Some filaments emit fumes when heated
- Ensure adequate ventilation
- Use HEPA filter if printing indoors
- Dispose of failed prints properly
Emergency Contacts
- Printer Fire: Unplug immediately, use dry chemical extinguisher (NOT water)
- Burns: Rinse with cool water for 15+ minutes
- Inhalation Issues: Move to fresh air, seek medical attention if symptoms persist
Last Reviewed: _______________
Reviewed By: _______________
Notes: ________________________________________________
Printer Maintenance Log
Track routine maintenance, repairs, and operational issues to keep your printer running smoothly.
Printer Information
- Model: _________________________
- Serial Number: _________________________
- Purchase Date: _________________________
- Last Service Date: _________________________
Maintenance Schedule
Daily (Before Each Use)
- Visual inspection for damage
- Clean nozzle if needed
- Check build plate level
- Verify filament spool rotates freely
Weekly
- Clean extruder drive gear
- Inspect and clean Z-axis rails
- Check all cable connections
- Test emergency stop function
Monthly
- Full build plate leveling procedure
- Clean interior of printer chamber
- Inspect heating elements
- Test temperature calibration
Quarterly (Every 3 Months)
- Replace worn nozzle if needed
- Full mechanical inspection
- Software/firmware update check
- Complete system test print
Maintenance Log
| Date | Maintenance Type | Description | Time Spent | Issues Found | Resolution | Performed By |
|---|---|---|---|---|---|---|
Issue Tracking
| Date | Symptom | Diagnosis | Action Taken | Status | Notes |
|---|---|---|---|---|---|
Parts Replacement
| Date | Part | Reason | Supplier | Cost | Notes |
|---|---|---|---|---|---|
Filament Compatibility Notes
Test results for different filament types used with this printer:
| Filament Type | Brand | Nozzle Temp | Bed Temp | Print Speed | Success Rate | Notes |
|---|---|---|---|---|---|---|
| PLA | ||||||
| PETG | ||||||
| ABS | ||||||
| TPU | ||||||
| Other: |
Troubleshooting Reference
Common Issues and Solutions
Nozzle Clogs:
- Date First Noticed: _____________
- Attempts to Clear: _____________
- Successful Solution: _____________
Bed Adhesion Problems:
- Suspected Cause: _____________
- Solution Applied: _____________
- Result: _____________
Layer Shifting:
- Frequency: _____________
- Likely Causes: _____________
- Actions Taken: _____________
Extrusion Issues:
- Symptoms: _____________
- Diagnosed Problem: _____________
- Fix Applied: _____________
Printer Performance Metrics
Track overall printer health over time:
| Month | Print Success Rate | Avg Print Time | Common Issues | Overall Assessment |
|---|---|---|---|---|
Warranty & Support Information
- Warranty Expires: _________________________
- Manufacturer Support: _________________________
- Local Technician: _________________________
- Emergency Contact: _________________________
Last Log Entry: _______________
Logged By: _______________
Material Properties Quick Reference
Essential material information for 3D printing with FDM/FFF printers.
Common Filament Types Comparison
| Property | PLA | PETG | ABS | TPU |
|---|---|---|---|---|
| Nozzle Temp (C) | 200-220 | 235-250 | 240-260 | 220-240 |
| Bed Temp (C) | 20-60 | 70-90 | 100-110 | 20-60 |
| Strength | Moderate | High | Very High | Low (Flexible) |
| Flexibility | None | Slight | Slight | High |
| Ease of Print | Very Easy | Easy | Hard | Moderate |
| Cost ($/kg) | $15-25 | $20-30 | $18-28 | $30-50 |
| Print Speed | 40-60 mm/s | 30-50 mm/s | 20-40 mm/s | 10-30 mm/s |
| Supports Needed | Usually Yes | Usually Yes | Always Yes | Yes |
| Bed Adhesion | Easy | Moderate | Requires prep | Easy |
| Durability | 2-3 years | 5+ years | 5+ years | 3+ years |
| UV Resistance | Low | Moderate | High | Low |
| Chemical Resistant | No | Moderate | Yes | No |
Detailed Material Properties
PLA (Polylactic Acid)
Characteristics:
- Biodegradable (under industrial conditions)
- Easy to print, beginner-friendly
- Available in many colors and finishes
- Brittle if too thin
Best Uses:
- Decorative objects
- Prototypes and tests
- Educational models
- Low-stress parts
Tips:
- Print without bed heat if possible
- Cooling fan helps quality
- Sensitive to moisture (dry storage)
- Avoid direct sunlight (UV degrades color)
PETG (Polyethylene Terephthalate Glycol)
Characteristics:
- Strong and durable
- Good temperature resistance
- Less brittle than PLA
- Slightly harder to print than PLA
Best Uses:
- Functional parts
- Outdoor objects
- Mechanical components
- Items requiring durability
Tips:
- Requires higher bed temperature
- Reduced cooling fan on first layers
- Slightly oozes while printing
- Better layer adhesion than PLA
ABS (Acrylonitrile Butadiene Styrene)
Characteristics:
- Very strong and durable
- Heat resistant
- Can be sanded and post-processed
- Warping issues common
Best Uses:
- High-stress parts
- Mechanical applications
- Parts needing heat resistance
- Projects requiring sanding/finishing
Tips:
- Use heated bed to prevent warping
- Enclose printer if possible
- Needs adequate ventilation (fumes)
- Print at slower speeds
- Avoid abrupt temperature changes
TPU (Thermoplastic Polyurethane)
Characteristics:
- Flexible and rubber-like
- High durability
- Can stretch without breaking
- Difficult to print
Best Uses:
- Flexible parts
- Cushioning/dampening
- Phone cases
- Gaskets and seals
Tips:
- Print very slowly (10-30 mm/s)
- Use flexible nozzle or reduce pressure
- Direct drive extruder works better
- Requires patience and calibration
Nozzle & Bed Temperature Guide
Temperature Selection
- Too Low: Poor layer adhesion, weak prints, under-extrusion
- Too High: Filament degrades, nozzle stringing, oozing
- Optimal Range: Start middle of range, adjust by 5-10C
First Layer Critical
- Use bed temperature at high end of range
- Reduce nozzle temperature by 5-10C for subsequent layers
- Slow down first layer speed to 50% of normal
Print Speed vs. Temperature
| Temperature Range | Print Speed | Quality | Support Needed |
|---|---|---|---|
| Low | 40-50 mm/s | Moderate | Usually |
| Medium | 50-70 mm/s | High | Usually |
| High | 70-100+ mm/s | Lower | Maybe |
Post-Processing Properties
Strength After Printing
Structural Integrity Timeline:
- 0-24 hours: 70-80% of final strength
- 24-48 hours: 90-95% of final strength
- 48-72 hours: 99-100% of final strength
- 7+ days: Maximum strength (some materials still hardening)
Note: Allow adequate cooling before stress-testing parts
Chemical Resistance
| Material | Water | Alcohol | Acetone | Oils | Acids |
|---|---|---|---|---|---|
| PLA | Low | Low | Dissolves | Low | Low |
| PETG | High | Moderate | Moderate | High | Moderate |
| ABS | High | Moderate | Dissolves | High | Moderate |
| TPU | Moderate | Low | Low | Moderate | Low |
Acetone Notes: Can be used to smooth ABS and PETG (vapor or liquid)
Environmental Factors
Humidity Effects
- PLA: Absorbs moisture (store in dry container with desiccant)
- PETG: Moderate moisture absorption
- ABS: Low moisture absorption
- TPU: Low moisture absorption
Storage Conditions:
- Temperature: 15-25C
- Humidity: 30-50% relative humidity
- Away from direct sunlight
- In sealed container with desiccant packets
Temperature Resistance (After Printing)
| Material | Safe to ~C | Softens at ~C | Notes |
|---|---|---|---|
| PLA | 50-60 | 60-70 | Not suitable for hot items |
| PETG | 80-100 | 100-110 | Can handle warm environments |
| ABS | 90-110 | 110-120 | Good heat resistance |
| TPU | 60-80 | 80-100 | Limited heat resistance |
Cost & Availability
Material Cost per Print (for typical small project)
| Material | Typical Print Weight | Material Cost | Total Cost |
|---|---|---|---|
| PLA | 50g | $0.50 | $0.50 |
| PETG | 50g | $1.00 | $1.00 |
| ABS | 50g | $0.90 | $0.90 |
| TPU | 50g | $1.50 | $1.50 |
Including electricity ($0.25 per print) and wear on equipment ($0.50)
Quick Selection Guide
Question: What should I print with?
- First time? -> PLA
- Need durability? -> PETG or ABS
- Need flexibility? -> TPU
- Need high strength? -> ABS or PETG
- Quick test/prototype? -> PLA
- Outdoor use? -> PETG or ABS
- Food contact? -> Food-grade resin or commercial alternatives
- Heat resistant? -> ABS
Reference Last Updated: _______________
Verified By: _______________
Filament Comparison Table
Quick reference for choosing the right filament. All temperature values are typical ranges - always check the label on your specific spool.
Side-by-Side Comparison
| Property | PLA | PETG | TPU (Flex) | ABS |
|---|---|---|---|---|
| Difficulty | Easiest | Moderate | Hard | Very Hard |
| Nozzle temp | 190-220C | 230-250C | 220-240C | 230-250C |
| Bed temp | 50-60C | 70-85C | 30-60C | 90-110C |
| Enclosure needed? | No | No | No | Yes |
| Rigidity | High | Medium | None - flexible | High |
| Impact resistance | Low (brittle) | Medium | Very high | Medium |
| Heat resistance | Low (~60C) | Medium (~80C) | Medium | High (~100C) |
| Flexibility | None | Slight | Rubber-like | None |
| Moisture sensitivity | Low | Medium | High | Medium |
| Fume concern | Lowest | Low | Moderate | High |
| Bed adhesion | Easy | Use glue stick on PEI | Easy | Requires enclosure + glue |
| Print speed | Normal | Normal | Slow (20-30 mm/s) | Normal |
| Stringing tendency | Low | Medium-High | High | Low |
| Approximate cost | $15-25/kg | $15-30/kg | $20-40/kg | $15-25/kg |
| Recommended for beginners? | [YES] Yes | After PLA | After experience | [NO] No |
When to Use Each Material
PLA - Use for
- Prototypes and test prints
- Classroom projects
- Decorative objects
- Tactile models and markers
- Anything that won’t be exposed to heat or heavy stress
PLA - Avoid for
- Objects left in a hot car or direct sun
- Parts that need to flex or bend without breaking
- High-impact applications
PETG - Use for
- Functional parts that need to be tougher than PLA
- Parts exposed to mild heat or moisture
- Mechanical components (brackets, clips, mounts)
- Food-contact applications (check your specific brand’s food-safe certification)
PETG - Avoid for
- Very fine detail (it strings more than PLA)
- Projects where you need the easiest possible print
TPU / Flexible - Use for
- Wearable objects (wristbands, phone cases)
- Bumpers and shock absorbers
- Grips and handles
- Objects that must deform and return to shape
- Tactile objects that need to feel soft
TPU - Avoid for
- Fine detail
- Printing on Bowden extruder setups (the flex causes jams - direct drive only)
- Your first few prints while still learning
ABS - Use for
- High heat environments
- Parts requiring post-processing (ABS sands and glues easily)
- Professional/industrial contexts with proper ventilation
ABS - Avoid for
- Classroom settings without dedicated ventilation
- Beginners
- Any print where warping would be a problem
Slicer Profile Quick Reference
| Filament | PrusaSlicer Profile Name | Key Changes from PLA Default |
|---|---|---|
| PLA | Generic PLA | - (baseline) |
| PETG | Generic PETG | Higher temps; slower cooling; use glue stick on PEI |
| TPU | Generic Flex | Lower speed (20-30 mm/s); reduced retraction |
| ABS | Generic ABS | Higher temps; enclosure; disable cooling fan |
Storage Tips
All filament absorbs moisture from the air over time, which causes poor print quality (bubbling, stringing, weak layer bonds).
| Filament | Moisture Sensitivity | Storage Recommendation |
|---|---|---|
| PLA | Low | Sealed bag with desiccant when not in use |
| PETG | Medium | Sealed bag with desiccant; dry before use if stored open |
| TPU | High | Always store sealed; dry in oven (65C for 4-6 hrs) if it has absorbed moisture |
| ABS | Medium | Sealed bag with desiccant |
Signs of wet filament: popping or crackling sounds during printing, bubbles in extruded plastic, excessive stringing, weak or brittle prints.
Sources
All3DP. (2025). All 3D printing filament types explained. https://all3dp.com/1/3d-printer-filament-types-3d-printing-3d-filament/
MatterHackers. (n.d.). 3D printer filament compare. https://www.matterhackers.com/3d-printer-filament-compare
Prusa Research. (2023). Materials guide. https://help.prusa3d.com/materials
Lesson 6: Practical 3dm Commands and Text Embossing
Estimated time: 60-90 minutes
Learning Objectives
- Master key 3dMake commands:
3dm describe,3dm preview,3dm orient,3dm slice1 - Apply text embossing and parametric customization to create a personalized keycap2
- Generate tactile 2D previews for accessible model inspection1
Materials
- 3dMake project scaffold with
src/main.scad - Access to a slicer (PrusaSlicer, Cura, or Bambu Studio)
- Optional: printer for test print
- Reference: 3dmake-setup-guide.md for command reference
Related Project: See cube_keycap.scad for a worked example combining text embossing and the 3dm commands.
Understanding the 3dm Command Suite
The 3dMake CLI provides a systematic workflow for model management. Each command serves a specific phase of the design-to-print pipeline.
| Command | Purpose | Example |
|---|---|---|
3dm describe <file> | Generates text and AI analysis of geometry | 3dm describe src/main.scad |
3dm preview <file> | Creates a 2D tactile printout (ASCII/braille/SVG) | 3dm preview src/main.scad |
3dm orient <file> | Analyzes and suggests optimal print orientation | 3dm orient src/main.scad |
3dm slice <file> | Generates G-code (machine instructions) | 3dm slice src/main.scad |
Step-by-step Tasks
-
Create a parametric keycap model with top-level parameters for customization2:
// Cube Keycap - Parametric Design // A customizable keycap with embossed text // Parameters (easy customization) key_size = 18; // mm - width/depth of keycap key_height = 12; // mm - height wall = 1.2; // mm - wall thickness letter = "A"; // Character to emboss letter_size = 10; // mm - text height letter_raise = 0.8; // mm - emboss depth // Hollow shell module shell(){ difference(){ cube([key_size, key_size, key_height], center=false); translate([wall, wall, wall]) cube([key_size-2*wall, key_size-2*wall, key_height], center=false); } } // Text embossing on top face module emboss(){ translate([key_size/2, key_size/2, key_height-0.01]) linear_extrude(height=letter_raise) text(letter, size=letter_size, halign="center", valign="center"); } // Assemble keycap union(){ shell(); emboss(); } -
Run
3dm describeto generate a text-based analysis of your model:3dm describe src/main.scadThis will output a description suitable for non-visual inspection. If AI is configured, you’ll also receive suggestions about geometry and potential print issues.
-
Generate a tactile 2D preview with
3dm preview:3dm preview src/main.scadThis creates a simplified 2D outline that can be printed for physical inspection or converted to braille for accessibility.
-
Analyze print orientation with
3dm orient:3dm orient src/main.scadThis command suggests the optimal orientation for printing-minimizing support material and maximizing surface quality.
-
Prepare for printing by slicing your model:
3dm slice src/main.scadThis generates G-code (
build/main.gcode) ready for your printer.
Checkpoint
- After task 1, you have a working keycap model with parameters
- After task 3, you have a 2D tactile preview in
build/ - After task 5, you have G-code ready to send to a printer
Customization Challenge
Modify the keycap by changing these parameters and observing the results:
| Parameter | Original | Try This | Effect |
|---|---|---|---|
key_size | 18 | 25 | Larger keycap |
key_height | 12 | 8 | Shorter, lower-profile key |
letter | “A” | “YOUR_INITIAL” | Different character |
wall | 1.2 | 1.5 | Thicker walls (stronger) |
letter_raise | 0.8 | 1.5 | Deeper emboss |
Quiz - Lesson 3dMake.6 (10 questions)
- What does
3dm describeprovide that3dm previewdoes not1? - Why is
3dm previewuseful for accessibility1? - What does
3dm orienthelp you determine about your model1? - How does parametric design (using variables) make customization easier2?
- Name one use case for embossed text in a 3D model2.
- True or False: You must run
3dm buildbefore running3dm describe. - Explain the relationship between wall thickness and print strength.
- Describe what happens when you change the
$fnparameter in your text() function. - How would you modify the keycap code to add a second embossed character2?
- What information would you include in a
3dm describeoutput for a manufacturer1?
Extension Problems (10)
- Create three keycap variants (small, medium, large) by changing
key_sizeand export each as a separate STL2. - Add a decorative border using
linear_extrudeandtext(); verify the result with3dm preview1. - Run
3dm describe,3dm preview, and3dm orienton your keycap; document all outputs1. - Modify the emboss module to support multiple characters in different positions2.
- Create a parametric keycap library with variants for different keyboard layouts (cherry, OEM, DSA profiles)2.
- Design an accessibility assessment: use
3dm describeand3dm previewto validate your model for non-visual users. - Build a custom keycap design system: parameterize profile, height, wall thickness, and emboss content; generate a product family.
- Create a comparison study: test three different emboss depths and document print quality differences.
- Develop a keycap troubleshooting guide: common failures (emboss erosion, wall cracking, text illegibility) and solutions.
- Write a comprehensive keycap design documentation: parameters, materials, print settings, post-processing, and accessibility features.
References
-
3DMake GitHub Repository - https://github.com/tdeck/3dmake ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
OpenSCAD Manual - Text & Linear Extrude - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Text ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
Slicing Settings Quick Reference - PrusaSlicer
Recommended Settings by Use Case
| Use Case | Layer Height | Infill | Supports | Notes |
|---|---|---|---|---|
| Quick test / prototype | 0.30 mm | 10% | As needed | “Draft” - fastest, roughest |
| Standard project | 0.20 mm | 15-20% | As needed | Best all-around starting point |
| Functional part | 0.20 mm | 30-40% | As needed | Use for parts under stress |
| Fine detail / display | 0.15 mm | 15% | As needed | Smoother surface; slower |
| Solid reference part | 0.20 mm | 40-50% | Rarely | Rarely needed; long print |
Filament Temperature Settings
| Filament | Nozzle Temp | Bed Temp | Notes |
|---|---|---|---|
| PLA | 200-215C | 50-60C | Easiest to print; default choice |
| PETG | 230-250C | 70-85C | Use glue stick on PEI bed |
| TPU | 220-240C | 30-60C | Print at 20-30 mm/s max; direct drive only |
| ABS | 230-250C | 90-110C | Requires enclosure; more fumes |
Always check the temperature range on your filament spool - it may vary by brand.
Support Settings Guide
| Overhang Angle | Supports Needed? | Recommended Setting |
|---|---|---|
| < 45 | No | None |
| 45-60 | Maybe | Preview first; add if sagging |
| > 60 | Yes | Support on build plate only |
| Bridge < 20 mm | No | Bridges usually fine |
| Bridge > 20 mm | Maybe | Preview; consider reorienting |
Common Print Problems & Quick Fixes
| Problem | Likely Cause | Fix |
|---|---|---|
| Print lifts off bed | Poor adhesion / warping | Add brim; use glue stick; level bed |
| Stringing between parts | Temperature too high / retraction | Lower temp 5C; check retraction settings |
| Layer lines very visible | Layer height too thick | Use 0.15mm or 0.20mm |
| Print takes too long | Layer height too thin / infill too high | Use 0.30mm draft; reduce infill |
| Holes too small | FDM tolerance - always undersized | Add 0.2-0.3mm to hole diameter |
| Part broke at layer boundary | Weak axis perpendicular to layers | Reorient so load is parallel to layers |
| First layer not sticking | Bed not level | Run bed leveling routine |
| Spaghetti / print failure | No supports on overhang | Add supports or reorient |
G-code Export Checklist
Before exporting, confirm:
- Correct printer profile selected
- Correct filament profile selected
- Layer height appropriate for use case
- Infill percentage set
- Supports enabled if needed
- Layer preview reviewed (no floating parts, supports where needed)
- Print time and filament weight noted for your records
Sources
Prusa Research. (2023). PrusaSlicer knowledge base. https://help.prusa3d.com/category/prusaslicer_204
Hubs. (2023). What is FDM 3D printing? https://www.hubs.com/knowledge-base/what-is-fdm-3d-printing/
ThePrusaSlicer.net. (2025). How to use PrusaSlicer. https://theprusaslicer.net/how-to-use-prusaslicer/
Slicing Settings Quick Reference - PrusaSlicer
Recommended Settings by Use Case
| Use Case | Layer Height | Infill | Supports | Notes |
|---|---|---|---|---|
| Quick test / prototype | 0.30 mm | 10% | As needed | “Draft” - fastest, roughest |
| Standard project | 0.20 mm | 15-20% | As needed | Best all-around starting point |
| Functional part | 0.20 mm | 30-40% | As needed | Use for parts under stress |
| Fine detail / display | 0.15 mm | 15% | As needed | Smoother surface; slower |
| Solid reference part | 0.20 mm | 40-50% | Rarely | Rarely needed; long print |
Filament Temperature Settings
| Filament | Nozzle Temp | Bed Temp | Notes |
|---|---|---|---|
| PLA | 200-215C | 50-60C | Easiest to print; default choice |
| PETG | 230-250C | 70-85C | Use glue stick on PEI bed |
| TPU | 220-240C | 30-60C | Print at 20-30 mm/s max; direct drive only |
| ABS | 230-250C | 90-110C | Requires enclosure; more fumes |
Always check the temperature range on your filament spool - it may vary by brand.
Support Settings Guide
| Overhang Angle | Supports Needed? | Recommended Setting |
|---|---|---|
| < 45 | No | None |
| 45-60 | Maybe | Preview first; add if sagging |
| > 60 | Yes | Support on build plate only |
| Bridge < 20 mm | No | Bridges usually fine |
| Bridge > 20 mm | Maybe | Preview; consider reorienting |
Common Print Problems & Quick Fixes
| Problem | Likely Cause | Fix |
|---|---|---|
| Print lifts off bed | Poor adhesion / warping | Add brim; use glue stick; level bed |
| Stringing between parts | Temperature too high / retraction | Lower temp 5C; check retraction settings |
| Layer lines very visible | Layer height too thick | Use 0.15mm or 0.20mm |
| Print takes too long | Layer height too thin / infill too high | Use 0.30mm draft; reduce infill |
| Holes too small | FDM tolerance - always undersized | Add 0.2-0.3mm to hole diameter |
| Part broke at layer boundary | Weak axis perpendicular to layers | Reorient so load is parallel to layers |
| First layer not sticking | Bed not level | Run bed leveling routine |
| Spaghetti / print failure | No supports on overhang | Add supports or reorient |
G-code Export Checklist
Before exporting, confirm:
- Correct printer profile selected
- Correct filament profile selected
- Layer height appropriate for use case
- Infill percentage set
- Supports enabled if needed
- Layer preview reviewed (no floating parts, supports where needed)
- Print time and filament weight noted for your records
Sources
Prusa Research. (2023). PrusaSlicer knowledge base. https://help.prusa3d.com/category/prusaslicer_204
Hubs. (2023). What is FDM 3D printing? https://www.hubs.com/knowledge-base/what-is-fdm-3d-printing/
ThePrusaSlicer.net. (2025). How to use PrusaSlicer. https://theprusaslicer.net/how-to-use-prusaslicer/
Slicing Settings Quick Reference - Bambu Studio / X1 Series
Recommended Settings by Use Case
| Use Case | Layer Height | Infill | Supports | Notes |
|---|---|---|---|---|
| Quick test / prototype | 0.30 mm | 10% | As needed | “Draft” - fastest; use standard mode |
| Standard project | 0.20 mm | 15-20% | As needed | Best all-around; Bambu default-optimized |
| Functional part | 0.20 mm | 30-40% | As needed | Use for load-bearing parts |
| Fine detail / display | 0.15 mm | 15% | As needed | Bambu achieves excellent detail at speed |
| Solid reference part | 0.20 mm | 40-50% | Rarely | Rarely needed; modern infill sufficient |
Filament Temperature Settings
| Filament | Nozzle Temp | Bed Temp | Notes |
|---|---|---|---|
| PLA (standard) | 200-210C | 50-60C | Fastest print times; Bambu-optimized profiles |
| PETG | 230-250C | 70-80C | Slight cooling fan reduction for layer adhesion |
| TPU | 220-240C | 20-30C | Best quality with Bambu’s tuned retraction |
| ABS | 240-260C | 100-110C | Requires chamber heating; enclosed AMS recommended |
Check Bambu’s material database for exact profile updates - these are dynamically optimized.
Support Settings Guide
| Overhang Angle | Supports Needed? | Recommended Setting |
|---|---|---|
| < 45 | No | None |
| 45-60 | Maybe | Auto-supports may activate; accept defaults |
| > 60 | Yes | Bambu auto-tree supports; minimal removal |
| Bridge < 20 mm | No | Bridges excellent on Bambu; no supports needed |
| Bridge > 20 mm | Maybe | Often bridgeable; preview before confirming |
Common Print Problems & Quick Fixes
| Problem | Likely Cause | Fix |
|---|---|---|
| Nozzle clogging mid-print | Thermal runaway / wet filament | Dry filament in AMS; check nozzle temp |
| Layer splitting or separation | Wrong material in AMS slot | Verify correct material in Bambu Studio |
| Stringing / blobbing | Cooling fan reduced too much | Increase cooling; adjust material profile |
| Print lifts off bed | Rare on Bambu; bed leveling drift | Auto-calibrate via Bambu Studio |
| Holes undersized | FDM tolerance - always undersized | Add 0.3-0.4mm to hole diameter |
| Part broke at layer boundary | Weak axis perpendicular to layers | Reorient so load is parallel to layers |
| Print aborts unexpectedly | AMS issue / filament jam | Clear AMS; verify filament path is smooth |
| Multi-material print misaligned | Nozzle offset miscalibration | Run auto-calibration in maintenance menu |
G-code Export Checklist (Bambu Studio)
Before starting print, confirm:
- Correct printer (X1 / X1E) and hotend selected
- Filament material and color match actual AMS configuration
- Layer height optimal for desired quality
- Infill and supports enabled/disabled appropriately
- Print preview shows correct color layering (if multi-material)
- Estimated time and filament weight acceptable
- Camera enabled for remote monitoring
- Web upload or USB export ready
Sources
Bambu Lab. (2024). Bambu Studio documentation & material profiles. https://bambulab.com/en/download
Bambu Lab Community. (2024). Forum & troubleshooting guides. https://community.bambulab.com/
Luke’s Lab. (2024). Bambu Lab deep-dives & calibration tutorials. https://www.youtube.com/@LukesBlab
Slicing Settings Quick Reference - Cura / Anycubic i3 Mega
Recommended Settings by Use Case
| Use Case | Layer Height | Infill | Supports | Notes |
|---|---|---|---|---|
| Quick test / prototype | 0.30 mm | 10% | As needed | “Draft” - fastest, roughest |
| Standard project | 0.20 mm | 15-20% | As needed | Best all-around starting point |
| Functional part | 0.20 mm | 30-40% | As needed | Use for parts under stress |
| Fine detail / display | 0.15 mm | 15% | As needed | Smoother surface; slower |
| Solid reference part | 0.20 mm | 40-50% | Rarely | Rarely needed; long print |
Filament Temperature Settings
| Filament | Nozzle Temp | Bed Temp | Notes |
|---|---|---|---|
| PLA | 200-210C | 50-60C | Easiest to print; Anycubic default |
| PETG | 230-240C | 70-80C | Use painter’s tape on steel bed |
| TPU | 220-235C | 30-50C | Reduced speed recommended (25-30 mm/s) |
| ABS | 240-250C | 100-110C | Requires ventilation; enclosed chamber recommended |
Always check the temperature range on your filament spool - it may vary by brand.
Support Settings Guide
| Overhang Angle | Supports Needed? | Recommended Setting |
|---|---|---|
| < 45 | No | None |
| 45-60 | Maybe | Preview first; add if sagging |
| > 60 | Yes | Tree supports (Cura) recommended for easier removal |
| Bridge < 20 mm | No | Bridges usually fine |
| Bridge > 20 mm | Maybe | Preview; consider reorienting |
Common Print Problems & Quick Fixes
| Problem | Likely Cause | Fix |
|---|---|---|
| Print not adhering to steel bed | Poor bed leveling / tape worn | Re-level nozzle; refresh painter’s tape |
| Filament oozing on travel | Temperature too high | Lower temp 5C; check Z-hop setting |
| Rough bottom layer | Bed too close | Use leveling knob to adjust distance |
| Print takes too long | Layer height too thin / infill too high | Use 0.30mm draft; reduce infill to 10% |
| Holes too small | FDM tolerance - always undersized | Add 0.2-0.3mm to hole diameter |
| Part broke at layer boundary | Weak axis perpendicular to layers | Reorient so load is parallel to layers |
| Clogs at nozzle | Moisture in filament / debris | Dry filament; clean nozzle with needle |
| Spaghetti / complete failure | Bed not leveled or supports missed | Run leveling; add supports or reorient |
G-code Export Checklist (Cura)
Before exporting, confirm:
- Anycubic i3 Mega printer profile selected
- Correct filament type and diameter (1.75 mm)
- Layer height appropriate for use case
- Infill percentage set
- Supports enabled if needed (tree supports preferred)
- Nozzle and bed temperature set correctly
- Print preview checked (no floating parts)
- Estimated time and filament weight noted
Sources
Anycubic. (2024). Anycubic i3 Mega official documentation. https://www.anycubic.com/
Ultimaker. (2024). Cura slicing software guide. https://ultimaker.com/software/ultimaker-cura
Teaching Tech. (2024). 3D printer calibration guide. https://www.youtube.com/@TeachingTech
Cube Keycap Example
// 01_cube_keycap.scad // Beginner: A simple 20mm cube keycap with an embossed letter // Parameters key_size = 18; // mm key_height = 12; // mm wall = 1.2; // mm letter = “R”; // change to your preferred letter letter_size = 10; // mm letter_raise = 0.8;// mm
module shell(){ difference(){ cube([key_size, key_size, key_height], center=false); translate([wall, wall, wall]) cube([key_size-2wall, key_size-2wall, key_height], center=false); } }
module emboss(){ // Emboss letter on top face translate([key_size/2, key_size/2, key_height-0.01]) linear_extrude(height=letter_raise) text(letter, size=letter_size, halign=“center”, valign=“center”); }
union(){ shell(); emboss(); }
Parametric Keychain - Extension Project
Estimated time: 2-4 hours
Learning Objectives
By completing this project, you will:
- Create parametric OpenSCAD modules that accept user inputs
- Implement 2D text manipulation and 3D extrusion techniques
- Generate and test multiple design variants systematically
- Document design parameters for reproducibility and user customization
Objective
- Create a parametric keychain design that adapts to custom text, dimensions, and materials.
Tasks
- Create
keychain.scadwith top-level parameters:width,height,thickness, andtext. - Implement embossed or debossed text using
linear_extrude()of a 2D text shape (or simulate with simple geometry if system lacks text support). - Produce three size variants and export STLs; record print settings.
- Test attachment point for common key rings and report fit.
Deliverable
- Source
keychain.scadfile with parametric variables documented - Three STL variants (small, medium, large)
- Print settings log and fit-test report for key ring attachment
Starter files
- starter.scad - minimal parametric scaffold to begin.
Assessment Questions (Optional)
- How did you use OpenSCAD parameters to enable users to customize the keychain without editing code?
- What were the key differences in print time and material usage between your three variants?
- Describe how you tested the key ring attachment and what adjustments you would make for the final design.
Parametric Keychain - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Design a fully parametric keychain that supports personalization and customization.
Design Concept
- Keychain theme or purpose:
- Design elements (shape, attachment, personalization method):
- Parametric strategy (what will be variables?):
Parametric Variables
| Variable | Default Value | Purpose |
|---|---|---|
Variant Configurations
| Variant | Parameter 1 | Parameter 2 | Parameter 3 | Notes |
|---|---|---|---|---|
| v1 | ||||
| v2 | ||||
| v3 |
Print and Assembly Results
- Describe how each variant prints:
- Assembly/attachment method:
- Functionality (does it work as intended?):
Reflections
- Which parameterization strategy was most effective?
- How could someone else customize this design?
- What would you add in a future iteration?
Customization Guide
- Clear instructions for modifying parameters
- Examples of common customizations
- Best practices for variant generation
Attachments
-
.scadfile with full parametric structure - Photos of 2+ printed variants
- Variant specification table
- Usage/customization guide
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Parametric Keychain - Teacher Template (Extension Project)
Briefing
Students design a personalized keychain using fully parametric OpenSCAD code. This project emphasizes parameter-driven design, customization, and user-centered iteration.
Key Learning: Parametric modularity; customization; design for manufacturing variation.
Real-world Connection: Mass customization is a growing manufacturing trend. Parametric design enables efficient production of personalized products.
Constraints
- Keychain must be fully parametric (text, size, material all variables)
- Design must include at least one test for different parameter values
- Assembly instructions must support varied configurations
- Code must be documented for future customization
Functional Requirements
- All design elements are parametric variables
- Keychain includes personalization (names, initials, dates)
- Multiple variant configurations tested and documented
- Design is reproducible and shareable
Deliverables
.scadwith parametric keychain module- Variant specification table (3+ configurations)
- Photos of at least 2 printed variants
- Customization guide for future users
- Code documentation and usage examples
Rubric
Category 1: Problem & Solution (0-3)
Keychains print successfully and are functional/customizable.
Category 2: Design & Code Quality (0-3)
Code is fully parametric and well-organized. Variants work well.
Category 3: Documentation (0-3)
Variant table complete. Customization guide clear and detailed.
Assessment Notes
- Strong submissions: Show comprehensive parametric thinking, multiple tested variants, and clear guidance for customization
- Reinforce: Documentation for design reuse
- Extension: User feedback on customization preferences; commercial potential analysis
Lesson 7: Parametric Transforms and the Phone Stand Project
Estimated time: 75-90 minutes
Learning Objectives
- Use parametric transforms (
rotate(),translate(),scale()) to position and orient sub-assemblies1 - Apply the Minkowski operation as a method for creating filleted edges2
- Create multi-part assemblies where each component serves a distinct structural function3
- Test and validate parametric variations before printing1
Materials
- 3dMake project scaffold with
src/main.scad - Access to a printer or slicing software
- Measuring tools (calipers) for post-print validation
Related Project: Study phone_stand.scad for an advanced example combining multiple transforms and Minkowski operations in a real-world assembly.
Understanding Parametric Transforms
Transforms are the foundation of positioning objects in 3D space. Unlike drag-and-drop interfaces, OpenSCAD requires you to explicitly specify every position and rotation. This precision is what enables parametric design-once defined mathematically, a model can be infinitely reconfigured.
Core Transform Operations
| Operation | Syntax | Example |
|---|---|---|
| Translate (move) | translate([x, y, z]) { ... } | translate([10, 0, 0]) cube([5, 5, 5]); |
| Rotate | rotate([x_deg, y_deg, z_deg]) { ... } | rotate([45, 0, 0]) cube([5, 5, 5]); |
| Scale | scale([x, y, z]) { ... } | scale([2, 1, 1]) cube([5, 5, 5]); |
| Minkowski (fillets/rounding) | minkowski() { shape; fillet; } | minkowski(){ cube([10,10,10]); cylinder(r=2, h=0.01); } |
Translating Objects: Moving in 3D Space
translate([x, y, z]) moves an object in three-dimensional space. The key insight is that you specify the movement before creating or referencing the object:
// Move a cube 30 mm to the right
translate([30, 0, 0]) cube([20, 20, 20]);
// Move it up by 10 mm
translate([0, 0, 10]) cube([20, 20, 20]);
// Move it diagonally (right and forward)
translate([30, 20, 0]) cube([20, 20, 20]);
A critical concept: When you use translate(), OpenSCAD moves the coordinate system, not just the object. The object is then created in the new coordinate system. This means:
// These are functionally equivalent:
translate([10, 0, 0]) cube([20, 20, 20]);
cube([20, 20, 20]);
translate([10, 0, 0]) cube([20, 20, 20]); // Second cube shifted right
For multi-part assemblies, you typically nest translate() calls within modules:
module phone_stand() {
// Base stays at origin
base();
// Back support is translated up and back
translate([0, -30, base_thickness])
rotate([65, 0, 0])
back_support();
}
Rotating Objects: Orientation Around Axes
rotate([x_deg, y_deg, z_deg]) rotates an object around the X, Y, and Z axes (in degrees):
// Rotate 45 around X axis (tilts forward/back)
rotate([45, 0, 0]) cube([10, 10, 10]);
// Rotate 90 around Y axis (rotates left/right)
rotate([0, 90, 0]) cube([10, 10, 10]);
// Rotate 45 around Z axis (spins in place)
rotate([0, 0, 45]) cube([10, 10, 10]);
// Rotate around all three axes
rotate([45, 30, 15]) cube([10, 10, 10]);
Order matters: When you specify multiple rotations, they are applied in sequence (X, then Y, then Z). This can produce unexpected results:
// These produce different final orientations:
rotate([45, 90, 0]) cube([10, 10, 10]);
rotate([90, 45, 0]) cube([10, 10, 10]);
Combining Transforms: The Order of Operations
You can nest transforms to build complex positions. Remember: OpenSCAD applies transforms from the inside out:
// Example: Position a cylinder so it sticks up from the back of a base
// Step 1: Create a cylinder at the origin
cylinder(r=5, h=20, $fn=32);
// Step 2: Translate it to the right spot
translate([0, 0, base_thickness])
cylinder(r=5, h=20, $fn=32);
// Step 3: In a module, combine positioning
module mounting_peg() {
translate([base_width/2, base_depth - 10, base_thickness])
cylinder(r=5, h=20, $fn=32);
}
// Inside a phone_stand() assembly:
mounting_peg();
Practical Tip: Coordinate System Visualization
When working with complex assemblies, it helps to visualize the coordinate system:
// Small axes indicator (add to your design temporarily for debugging):
module axes() {
color("red") cube([20, 1, 1]); // X axis (red)
color("green") cube([1, 20, 1]); // Y axis (green)
color("blue") cube([1, 1, 20]); // Z axis (blue)
}
// Place it at key points to verify positioning:
axes();
translate([100, 0, 0]) axes(); // Check alignment at offset
Step-by-step Tasks
Task 1: Build a Simple Phone Stand Base
Create a parametric base plate that can be adjusted for different phone weights and sizes:
// Phone Stand - Base Component
// Adjustable platform for holding phones and tablets
// === TOP-LEVEL PARAMETERS (customize these) ===
base_width = 70; // mm - front-to-back width
base_depth = 90; // mm - side-to-side depth
base_thickness = 4; // mm - thickness of base
angle = 65; // degrees - tilt angle
lip_height = 12; // mm - height of friction lip
fillet_r = 6; // mm - edge rounding radius
// === MODULES ===
// Simple rectangular plate
module plate(w, d, t) {
cube([w, d, t], center=false);
}
// Fillet edges using Minkowski sum (approximation)
module filleted_plate(w, d, t, r) {
minkowski() {
plate(w, d, t);
cylinder(h=0.01, r=r, $fn=40);
}
}
// Base of the stand
module base() {
translate([0, 0, 0])
filleted_plate(base_width, base_depth, base_thickness, fillet_r);
}
// Back support angled for viewing
module back() {
// Rotate the plate to create the angle
rotate([angle, 0, 0])
filleted_plate(base_width, base_depth, base_thickness, fillet_r);
}
// Friction lip to prevent phone from sliding
module lip() {
translate([0, base_depth - 8, base_thickness])
cube([base_width, 8, lip_height], center=false);
}
// === ASSEMBLE ===
union() {
base();
back();
lip();
}
Task 2: Test Parameter Variations
Save your file and test each variant by modifying the parameters and running 3dm build:
# Build the base version
3dm build
# Then try modifying angle in main.scad and rebuild
# angle = 45; // Shallow angle for viewing documents
# 3dm build
# Or try a steep angle for portrait viewing
# angle = 75; // Steep for reading
# 3dm build
Document the impact:
| Parameter | Value | Use Case | Print Time |
|---|---|---|---|
angle | 45 | Shallow viewing (documents, web browsing) | ~1.5 hrs |
angle | 65 | Comfortable video watching | ~1.5 hrs |
angle | 75 | Steep vertical viewing | ~1.5 hrs |
Task 3: Run 3dm orient to Optimize Orientation
3dm orient src/main.scad
This command analyzes your model and suggests:
- Optimal rotation for minimal support material
- Estimated support volume that will need to be removed
- Print time savings from better orientation
Task 4: Generate Variants for Different Devices
Modify your main.scad to create three configurations (tablet, phone, document holder):
// At the bottom of main.scad, uncomment one configuration:
// Configuration 1: Phone (narrow, shallow angle)
// base_width = 60;
// angle = 55;
// Configuration 2: Tablet (wide, moderate angle)
base_width = 120;
angle = 40;
// Configuration 3: Document (wide, steep angle)
// base_width = 200;
// angle = 20;
Task 5: Validate and Document
After printing (or slicing), record:
- Actual dimensions (measure with calipers)
- Angle accuracy (verify tilt angle with protractor or phone measurement app)
- Friction resistance (does phone stay in place?)
- Print quality (note any support marks, layer quality)
Advanced: Adding Snap-Fit Connectors
To join the base and back without fasteners, you can add interlocking features:
// Optional: Add snap-fit connectors
// Slot in base plate (where back plate slides in)
module base_slot() {
slot_width = base_thickness + 0.5; // Slight clearance
slot_depth = 20;
translate([base_width/2 - slot_width/2, 0, base_thickness])
cube([slot_width, slot_depth, lip_height]);
}
// Tab on back plate (fits into base slot)
module back_tab() {
tab_width = base_thickness;
tab_height = lip_height;
translate([base_width/2 - tab_width/2, 0, 0])
cube([tab_width, 20, tab_height]);
}
Checkpoint
- After task 1, you have a working 3-part stand (base, back, lip)
- After task 2, you’ve tested at least 2 parameter variations
- After task 4, you have 3 different configurations ready to print
Quiz - Lesson 3dMake.7 (10 questions)
- What does the
rotate()function do, and how does it differ from physical rotation1? - Why is parametric positioning important for design iteration1?
- Explain the Minkowski sum operation and why it’s useful for filleting2.
- How would you position a second component relative to the first using
translate()1? - What parameter would you change to make a phone stand suitable for tablets3?
- True or False: You can rotate an object around multiple axes in a single
rotate()call. - Describe how
$fnaffects the appearance of rounded edges created by Minkowski2. - What advantage does parametric design have over manually modeling each variant1?
- How would you verify that your stand’s angle matches your design intent after printing3?
- What design considerations should you account for when adding a lip to prevent phone slippage3?
Extension Problems (10)
- Create five stand variants (for phones, tablets, documents, laptops, and books) by parameterizing width, angle, and lip height3.
- Add parametric feet (small cylinders) to the base to improve stability; test with and without feet1.
- Use
3dm describeto document each variant’s key geometric properties1. - Design and test a snap-fit connector system that joins the base and back without fasteners3.
- Create a comparison table showing print time, material weight, and assembly complexity for each variant3.
- Build a complete phone stand product family: define naming convention, parameter ranges, and assembly instructions.
- Develop a stress analysis guide: identify high-stress areas in your stand and propose reinforcement strategies.
- Create a customization guide for end users: how to modify angle, width, and lip height for different devices.
- Design an accessibility-focused stand: include tactile angle markers and clear, non-visual assembly instructions.
- Write a comprehensive stand design documentation: CAD parameters, material recommendations, print settings, assembly, troubleshooting, and accessible design notes.
References
-
OpenSCAD Manual - Transformations - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
OpenSCAD Manual - Minkowski - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#minkowski ↩ ↩2 ↩3
-
3DMake GitHub - Phone Stand Example - https://github.com/tdeck/3dmake/blob/main/docs/examples.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
Parametric Phone Stand Example
// 02_parametric_phone_stand.scad // Intermediate: Parametric phone stand // Parameters thickness = 4; // mm width = 70; // mm depth = 90; // mm angle = 65; // degrees lip_height = 12; // mm fillet_r = 6; // mm (mock fillet by minkowski)
module plate(w, d, t){ cube([w, d, t], center=false); }
module fillet(shape, r){ minkowski(){ children(); cylinder(h=0.01, r=r, $fn=40); } }
// Back plate module back(){ rotate([angle,0,0]) fillet(){ plate(width, depth, thickness); } }
// Base module base(){ translate([0,0,0]) fillet(){ plate(width, depth, thickness); } }
// Lip module lip(){ translate([0, depth-8, thickness]) cube([width, 8, lip_height], center=false); }
union(){ base(); back(); lip(); }
Lesson 8: Advanced Parametric Design and Interlocking Features
Estimated time: 90-120 minutes
Learning Objectives
- Design parametric walls with precise clearances for stackable assemblies1
- Create interlocking features (rims, tabs, snap-fits) for assembly without fasteners2
- Apply chamfers for edge finishing and print quality3
- Manage tolerance stack-up in complex parametric designs1
Materials
- 3dMake project scaffold with
src/main.scad - Calipers for measuring clearances and wall thickness
- Printer for test prints (recommended for validation)
Related Project: Work through stackable_bins.scad to apply tolerance design in a multi-part assembly with interlocking features.
Understanding Tolerance and Clearance
In 3D printing, tolerance refers to the acceptable variation in printed dimensions. When designing parts that must fit together, you must account for:
- Printer accuracy (~0.1-0.3 mm typical)
- Material shrinkage (PLA: ~0.3-0.5%)
- Cumulative tolerance when multiple parts fit together
For stackable bins with interlocking rims:
bin_outer = 80 mm
rim_clearance = 0.6 mm (small space between stack and rim below)
rim_inner = bin_outer - 2*wall - 2*rim_clearance
Step-by-step Tasks
Task 1: Design a Parametric Stackable Bin
Create a storage bin with walls, a removable lid, and interlocking features:
// Stackable Storage Bin - Advanced Parametric Design
// Features: walls, interlocking rim, chamfered edges, optional dividers
// === PARAMETERS ===
bin_w = 80; // mm - width
bin_d = 120; // mm - depth
bin_h = 60; // mm - height
wall = 2; // mm - wall thickness (structural)
rim = 3; // mm - interlock rim height
chamfer = 2; // mm - edge chamfer
stack_clear = 0.6; // mm - clearance between stacking parts
// Derived parameters
inner_w = bin_w - 2*wall;
inner_d = bin_d - 2*wall;
rim_inner_w = bin_w - 2*(wall + stack_clear);
rim_inner_d = bin_d - 2*(wall + stack_clear);
// === MODULES ===
// Outer shell of the bin
module outer_shell() {
cube([bin_w, bin_d, bin_h]);
}
// Inner cavity (creates walls by subtracting)
module inner_cavity() {
translate([wall, wall, wall])
cube([inner_w, inner_d, bin_h - wall]);
}
// Main bin body (hollow box)
module body() {
difference() {
outer_shell();
inner_cavity();
}
}
// Outer rim (sits on top of bin, inside rim of bin below)
module rim_outer() {
translate([0, 0, bin_h])
cube([bin_w, bin_d, rim]);
}
// Inner rim cutout (where the bin below's rim sits)
module rim_inner() {
translate([wall + stack_clear, wall + stack_clear, bin_h])
cube([rim_inner_w, rim_inner_d, rim]);
}
// Rim assembly (outer + inner cutout)
module rim_assembly() {
difference() {
rim_outer();
rim_inner();
}
}
// Chamfer edges for better print quality
module chamfered_edges() {
difference() {
children();
// Top edge chamfer
translate([-1, -1, bin_h - chamfer])
cube([bin_w + 2, bin_d + 2, chamfer + 1]);
}
}
// === ASSEMBLE ===
union() {
chamfered_edges() {
body();
}
rim_assembly();
}
Task 2: Test Stackability
After printing the first bin:
- Print a second identical bin
- Stack one on top of the other and verify:
- Does the rim insert smoothly into the rim below?
- Can you stack 3 bins without binding?
- Does the stack remain stable without tipping?
Document:
- Any friction or resistance (good for stability)
- Gaps or looseness (adjust
stack_clearif needed)
Task 3: Design Variants for Different Storage Needs
Create three different bin sizes using the same parametric code:
// Small bin (desk organization)
bin_w = 60;
bin_d = 80;
bin_h = 40;
// OR
// Medium bin (general storage)
// bin_w = 80;
// bin_d = 120;
// bin_h = 60;
// OR
// Large bin (bulk storage)
// bin_w = 120;
// bin_d = 160;
// bin_h = 80;
Task 4: Add Optional Internal Dividers
Enhance the design with parametric dividers:
// Optional: Parametric dividers
num_dividers = 2; // Number of internal compartments
divider_thickness = 1.5; // mm
module dividers() {
for (i = [1 : num_dividers]) {
y_pos = wall + (i * inner_d / (num_dividers + 1));
translate([wall, y_pos, wall])
cube([inner_w, divider_thickness, bin_h - 2*wall]);
}
}
// Add to union:
// dividers();
Task 5: Document Tolerance Sensitivity
Create a testing matrix to understand how variations affect fit:
Test Configuration Matrix:
========================================
Config | stack_clear | wall | Result
========================================
A | 0.4 mm | 2.0 | Tight - hard to stack
B | 0.6 mm | 2.0 | Ideal - smooth fit
C | 0.8 mm | 2.0 | Loose - unstable
D | 0.6 mm | 2.5 | Better - stronger walls
========================================
After printing and testing, record observations about fit quality.
Advanced Topics: Snap-Fit Connectors and Multi-Part Assemblies
As you progress beyond simple stacking, you may want to create assemblies where parts connect without fasteners. This section covers snap-fit and interlocking designs.
Designing Snap-Fit Clips
A snap-fit clip works by:
- Creating a flexible arm that bends outward to release
- Providing a catch (usually a small notch or undercut) that locks into place
- Balancing flexibility (easy to insert/remove) with durability (survives many cycles)
Here’s a simple snap-fit connector:
// Simple snap-fit clip for connecting parts
module snap_fit_base() {
// Main mounting block
cube([20, 40, 15]);
}
module snap_fit_arm(thickness = 1.5, deflection = 0.5) {
// Flexible arm that bends to insert/release
// thickness: how thick the arm is (0.8-2.0 mm typical)
// deflection: how far it must bend to insert (0.3-1.0 mm typical)
translate([0, 0, 15]) {
// Thin vertical arm
cube([thickness, 35, 12]);
// Catch hook (small bump on end)
translate([-1, 30, 10])
cube([3, 5, 2]); // Notch for mating part to lock onto
}
}
// Test the snap-fit assembly
union() {
snap_fit_base();
translate([3, 0, 0]) snap_fit_arm();
}
Key parameters to test:
thickness(1.0-2.0 mm): Thicker = stronger but harder to flex- Arm length: Longer = more flexible but weaker
- Catch geometry: Size and shape determine how securely parts lock
Tolerance for Snap-Fits
Unlike stackable bins, snap-fit parts need tighter tolerances because they must flex on insertion:
Recommended tolerances for snap-fit:
- Arm thickness tolerance: +/-0.2 mm (tighter than bins)
- Catch gap (clearance): 0.3-0.5 mm (smaller than stacking clearance)
- Insertion force: Should be noticeable but not require tools
If too loose: Parts fall apart
If too tight: Parts won't insert or break on insertion
Multi-Part Assemblies: Coordinating Multiple Components
For more complex assemblies (like the Miniature Assembly in later projects), you need to:
- Define a global coordinate system where all parts know their positions
- Use modular design so each part can be printed, tested, and refined independently
- Document assembly order so users know which parts fit together first
Here’s a pattern for a multi-part assembly:
// Multi-part assembly pattern
// === ASSEMBLY PARAMETERS ===
assembly_id = "miniature_furniture"; // Unique name for this assembly
part_scale = 1.0; // Scale entire assembly if needed
// === PARTS ===
module part_base() {
cube([60, 40, 5]);
}
module part_support_left() {
translate([5, 0, 5])
cube([3, 40, 25]);
}
module part_support_right() {
translate([52, 0, 5])
cube([3, 40, 25]);
}
module part_shelf() {
translate([8, 5, 18])
cube([44, 30, 2]);
}
// === ASSEMBLY ===
// Complete assembly (print individual parts separately first)
module furniture_assembly() {
part_base();
part_support_left();
part_support_right();
part_shelf();
}
// Export individual parts by uncommenting one at a time:
// part_base();
// part_support_left();
// part_support_right();
// part_shelf();
// Or export the full assembly:
furniture_assembly();
Best practices for multi-part designs:
- Print and test parts individually before assembling
- Add small alignment features (pins, notches) to guide assembly
- Document which parts go together and the order
- Include spare parts (print 2-3 copies of small connecting pieces)
- Test the full assembly on a test print before final production
Assembly Documentation
For any multi-part project, create a simple assembly guide:
Miniature Furniture Assembly Guide
Parts:
- Base (60 x 40 x 5 mm, prints in ~20 min)
- Support Left (3 x 40 x 25 mm, prints in ~5 min)
- Support Right (3 x 40 x 25 mm, prints in ~5 min)
- Shelf (44 x 30 x 2 mm, prints in ~15 min)
Assembly Steps:
1. Prepare all four parts and test fit manually
2. Glue or snap supports to base (supports on left and right edges)
3. Slide shelf onto supports
4. Check that shelf is level and square
Quality Checks:
- Shelf should not wobble or flex excessively
- All parts should be free of support marks or defects
- Shelf should hold light objects without sagging
Advanced: Chamfers and Surface Finish
Chamfers improve print quality by:
- Reducing stress concentration at edges
- Improving layer adhesion at sharp transitions
- Making parts easier to remove from the build platform
// More sophisticated chamfer (chamfered corner)
module chamfer_corner(size, radius) {
difference() {
children();
translate([size-radius, size-radius, size-radius])
rotate([45, 0, 0]) cube([radius*2, radius*2, radius*2]);
}
}
Checkpoint
- After task 1, you have a single parametric bin
- After task 2, you’ve verified stackability
- After task 4, you have optional dividers working
- After task 5, you’ve documented tolerance data
Quiz - Lesson 3dMake.8 (10 questions)
- What is the purpose of the
stack_clearparameter in stackable bin design1? - Why is wall thickness a critical parameter in structural parts1?
- Explain what “tolerance stack-up” means and why it matters in multi-part assemblies1.
- How does chamfering improve print quality3?
- What parameter would you adjust to make bins stack with more friction for stability1?
- True or False: Thin walls always print faster than thick walls.
- Describe the difference between the outer rim and inner rim in the stackable bin design1.
- Why might you use
num_dividersas a parameter instead of hard-coding divider positions1? - How would you measure whether your printed bin matches the designed dimensions1?
- What design considerations apply when stacking more than 3 bins vertically1?
Extension Problems (10)
- Create five bin variants (small, medium, large, tall, shallow) using parametric logic; print and stack them1.
- Add parametric rounded corners using
minkowski()to improve structural integrity3. - Design a custom divider system: parameterize number, position, and thickness; test strength1.
- Conduct a tolerance study: print bins with
stack_clearvalues of 0.4, 0.6, 0.8 mm; document fit quality1. - Create a modular stacking system with connecting clips or latches; test assembly and disassembly2.
- Build a complete storage system: design multiple bin sizes with standard stackability and create an assembly guide.
- Develop a manufacturing specification document: tolerance ranges, material recommendations, quality acceptance criteria.
- Design a labeling system: add parametric label holders or embossed areas for identifying bin contents.
- Create a structural analysis guide: identify stress concentration points and propose reinforcement strategies.
- Write comprehensive bin design documentation: parameters, variants, assembly, stackability testing, tolerance management, maintenance, and accessibility features.
References
-
3DMake GitHub - Stackable Bins Example - https://github.com/tdeck/3dmake/blob/main/docs/examples.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Engineering Tolerance in 3D Printing - https://www.sculpteo.com/en/blog/2021/06/17/tolerance-3d-printing/ ↩ ↩2
-
OpenSCAD Manual - Minkowski (chamfers/rounding) - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#minkowski ↩ ↩2 ↩3
Stackable Bins Example
// 03_stackable_bins.scad // Advanced: Stackable storage bins // Parameters bin_w = 80; // width bin_d = 120; // depth bin_h = 60; // height wall = 2; // wall thickness rim = 3; // interlock rim height chamfer = 2; stack_clear = 0.6; // clearance between stacks
module outer(){ cube([bin_w, bin_d, bin_h]); }
module inner(){ translate([wall, wall, wall]) cube([bin_w-2wall, bin_d-2wall, bin_h-2*wall]); }
module body(){ difference(){ outer(); inner(); } }
module rim_outer(){ translate([0,0,bin_h]) cube([bin_w, bin_d, rim]); }
module rim_inner(){ translate([wall+stack_clear, wall+stack_clear, bin_h]) cube([bin_w-2*(wall+stack_clear), bin_d-2*(wall+stack_clear), rim]); }
module chamfer_edges(){ // Simple top edge chamfer via difference difference(){ children(); translate([-1,-1,bin_h-chamfer]) cube([bin_w+2, bin_d+2, chamfer+2]); } }
union(){ chamfer_edges(){ body(); } rim_outer(); difference(){ rim_outer(); rim_inner(); } }
Snap-Fit Clip Project
Snap-Fit Clip - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Design a snap-fit connector that joins two 3D-printed parts without external fasteners.
Design Concept
- What two parts will your snap-fit connect?
- Design approach (cantilever, torsion box, other):
- Material and expected stress limits:
Tolerance Specifications
| Parameter | Nominal Value | Tolerance | Rationale |
|---|---|---|---|
| Tab thickness | |||
| Clip opening | |||
| Undercut depth | |||
| Contact area |
Assembly Testing
Test 1: Initial Assembly
- Date:
- Effort required to snap together:
- Snap strength (resistance to pulling apart):
- Visual inspection (any deformation?):
Test 2-5: Reusability Testing
- Cycle 2: (date, observations)
- Cycle 3: (date, observations)
- Cycle 4: (date, observations)
- Cycle 5: (date, observations)
Durability Assessment
- After 5 cycles, is the snap-fit still functional?
- Any permanent deformation observed?
- Estimated service life (based on testing):
Mechanical Analysis
- Describe the snap mechanism (why does it work?):
- What material properties enable this design?
- What are the stress points?
Reflections
- Did the snap-fit work as expected?
- What tolerance adjustments would you make?
- How would you test durability over thousands of cycles?
- What materials would fail with this design? Why?
Attachments
-
.scadfile with parametric snap-fit module - Photos of both parts before assembly
- Photos of assembled connection
- Testing documentation with dates/observations
- Tolerance analysis table
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Snap-Fit Clip - Teacher Template (Extension Project)
Briefing
Students design a snap-fit connector that joins two 3D-printed parts without fasteners. This project emphasizes tolerance engineering, material properties, and mechanical design validation.
Key Learning: Tolerance engineering; snap-fit mechanics; non-destructive assembly testing.
Real-world Connection: Snap-fits are ubiquitous in consumer products. Designing them requires understanding material stress, geometry precision, and repeated-use durability.
Constraints
- Snap-fit must connect two printed parts without external fasteners
- Design must be parametric (tolerance variables clearly labeled)
- Assembly must be testable (connection strength, reusability)
- Design must account for material properties (PLA creep, flex limits)
Functional Requirements
- Parts snap together securely without over-constraint
- Connection withstands intended use without permanent deformation
- Snap mechanism is reusable (at least 5+ assembly cycles)
- Design demonstrates understanding of tolerance and material behavior
Deliverables
.scadwith parametric snap-fit module- Completed documentation template
- Assembly testing log (snap strength, cycle durability)
- Tolerance analysis documentation
- Reflection on mechanical design trade-offs
Rubric
Category 1: Problem & Solution (0-3)
Snap-fit works reliably; parts assemble and disassemble as designed.
Category 2: Design & Code Quality (0-3)
Code shows tolerance thinking. Design is mechanically sound.
Category 3: Documentation (0-3)
Assembly testing documented. Tolerance rationale explained.
Assessment Notes
- Strong submissions: Show evidence of tolerance testing, multiple assembly cycles documented, and reflection on material limits
- Reinforce: Snap-fit design principles; tolerancing for manufacturability
- Extension: Material property analysis; cost-benefit comparisons
Lesson 9: Automation and 3dm Workflows
Estimated time: 60-90 minutes
Learning Objectives
- Chain 3dm commands to automate the design-to-print pipeline1
- Create shell scripts that manage multiple model variants automatically1
- Use
3dm libfor library management and code reuse2 - Optimize workflows for batch processing and continuous improvement1
Materials
- 3dMake project scaffold with multiple model files
- Terminal/command line access
- Text editor for script creation
The 3dm Command Chain
Instead of running commands one at a time, you can chain them to automate the entire workflow:
# Individual commands (slow, manual)
3dm build src/main.scad
3dm describe src/main.scad
3dm slice src/main.scad
# Chained commands (fast, automatic)
3dm build src/main.scad && 3dm describe src/main.scad && 3dm slice src/main.scad
The && operator ensures each command runs only if the previous one succeeds.
Step-by-step Tasks
Task 1: Create a Multi-Variant Project
Organize your project with multiple model files:
src/
+------ main.scad # Base model
+------ keycap_small.scad # Variant 1
+------ keycap_medium.scad # Variant 2
+------ keycap_large.scad # Variant 3
+------ stand_test.scad # Experimental model
Each file should be independent and buildable:
// keycap_small.scad
key_size = 14;
key_height = 10;
letter = "S";
// ... rest of keycap code
Task 2: Create a Batch Build Script
Create build_all.sh to build, describe, and slice all models:
#!/bin/bash
# build_all.sh - Batch process all SCAD files
echo "=== Building all models ==="
for scad_file in src/*.scad; do
echo "Processing: $scad_file"
# Extract filename without extension
base_name=$(basename "$scad_file" .scad)
# Build
echo " Building..."
3dm build "$scad_file" || continue
# Describe (AI analysis if configured)
echo " Describing..."
3dm describe "$scad_file" > "build/${base_name}.description.txt"
# Slice (generate G-code)
echo " Slicing..."
3dm slice "$scad_file"
# Move G-code to organized folder
if [ -f "build/main.gcode" ]; then
mv "build/main.gcode" "build/${base_name}.gcode"
fi
echo " Done: $base_name"
done
echo "=== All models processed ==="
ls -lh build/*.gcode
To run the script:
chmod +x build_all.sh # Make executable
./build_all.sh # Run
Task 3: Create a Variant Testing Script
Test parameter variations automatically and compare results:
#!/bin/bash
# test_variants.sh - Build and compare parameter variants
echo "=== Testing keycap variants ==="
# Array of sizes to test
sizes=(12 16 20 24)
for size in "${sizes[@]}"; do
echo "Testing size: ${size}mm"
# Create temporary SCAD with this size
cat > temp_keycap.scad << EOF
key_size = $size;
key_height = 12;
wall = 1.2;
letter = "T";
module shell(){
difference(){
cube([key_size, key_size, key_height], center=false);
translate([wall, wall, wall])
cube([key_size-2*wall, key_size-2*wall, key_height], center=false);
}
}
module emboss(){
translate([key_size/2, key_size/2, key_height-0.01])
linear_extrude(height=0.8)
text("T", size=10, halign="center", valign="center");
}
union(){
shell();
emboss();
}
EOF
# Build and analyze
3dm build temp_keycap.scad
# Get file size (proxy for material volume)
stl_file="build/temp_keycap.stl"
file_size=$(stat -f%z "$stl_file" 2>/dev/null || stat -c%s "$stl_file" 2>/dev/null)
echo " -> STL size: $(numfmt --to=iec-i --suffix=B "$file_size" 2>/dev/null || echo "$file_size bytes")"
# Save for comparison
cp "$stl_file" "build/keycap_${size}mm.stl"
done
echo "=== Variant testing complete ==="
echo "Results saved to build/"
Task 4: Library Management
Organize reusable modules into libraries:
# Create a library structure
mkdir -p lib
mkdir -p lib/connectors
mkdir -p lib/shapes
mkdir -p lib/fasteners
# Create lib/shapes/rounded_cube.scad
cat > lib/shapes/rounded_cube.scad << 'EOF'
// Rounded cube module for reuse across projects
module rounded_cube(w, h, d, radius, fn=16) {
minkowski(){
cube([w-2*radius, h-2*radius, d-2*radius], center=true);
cylinder(r=radius, h=0.01, $fn=fn);
}
}
// Example usage:
// rounded_cube(20, 20, 20, 2);
EOF
# View available libraries
3dm lib list
# Install a community library
3dm lib install BOSL2
Then in your main.scad:
include <lib/shapes/rounded_cube.scad>
// Use the custom module
rounded_cube(30, 20, 15, 2);
Task 5: Continuous Integration Concept
Create a workflow that regenerates designs when parameters change:
#!/bin/bash
# watch_and_build.sh - Rebuild whenever SCAD files change
watch_dir="src"
build_dir="build"
echo "Watching for changes in $watch_dir..."
while true; do
# Find recently modified files
find "$watch_dir" -name "*.scad" -mmin -1 | while read file; do
echo "$(date '+%Y-%m-%d %H:%M:%S') - Change detected: $file"
# Rebuild
3dm build "$file" && echo " Build successful"
done
sleep 5 # Check every 5 seconds
done
Batch Processing Workflow
Complete pipeline from code to print-ready files:
#!/bin/bash
# production_build.sh - Complete pipeline
PROJECT="my_keycaps"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
OUTPUT_DIR="builds/$PROJECT/$TIMESTAMP"
mkdir -p "$OUTPUT_DIR"
echo "=== Production Build: $PROJECT ($TIMESTAMP) ==="
# Step 1: Build all models
for scad in src/*.scad; do
name=$(basename "$scad" .scad)
echo "Building: $name"
3dm build "$scad" || { echo "Failed: $name"; exit 1; }
cp "build/main.stl" "$OUTPUT_DIR/${name}.stl"
cp "build/main.gcode" "$OUTPUT_DIR/${name}.gcode"
done
# Step 2: Generate summaries
echo "Generating build report..."
{
echo "# Production Build Report"
echo "Date: $(date)"
echo "Project: $PROJECT"
echo ""
echo "## Files Generated"
ls -lh "$OUTPUT_DIR"
echo ""
echo "## Total Material Required"
du -sh "$OUTPUT_DIR"
} > "$OUTPUT_DIR/BUILD_REPORT.md"
# Step 3: Archive
echo "Archiving..."
tar -czf "${OUTPUT_DIR}.tar.gz" "$OUTPUT_DIR"
echo "=== Build complete ==="
echo "Output: $OUTPUT_DIR"
echo "Archive: ${OUTPUT_DIR}.tar.gz"
Checkpoint
- After task 2, you have a working batch build script
- After task 3, you’ve tested multiple parameter variants
- After task 5, you understand continuous integration concepts
Quiz - Lesson 3dMake.9 (10 questions)
- What does the
&&operator do in a command chain1? - Why would you use a batch build script instead of running commands manually1?
- How would you extract the filename without extension in a bash script1?
- Explain the purpose of creating a temporary SCAD file for variant testing1.
- What is
3dm lib listused for2? - True or False: You must manually edit each model file to test different parameters.
- Describe what a continuous integration workflow accomplishes1.
- How would you save variant test results for comparison1?
- What file format would you use to archive completed builds for long-term storage1?
- How could you use scripting to automatically generate documentation for your designs1?
Extension Problems (10)
- Create a batch build script that processes 5+ model variants and generates a comparison report1.
- Design a parameter testing matrix: test 3 dimensions x 3 wall thicknesses and compare results1.
- Build a library module for common features (brackets, connectors, fasteners); use in multiple projects2.
- Create a “watch and rebuild” script that automatically regenerates designs when code changes1.
- Develop a production workflow script that generates timestamped builds with complete documentation1.
- Build an automated testing framework: validate designs against dimensional requirements1.
- Create a version control integration: automatically tag and archive successful builds1.
- Design a design parameter database: store and query historical variants and their properties1.
- Develop a remote print queue system: batch multiple models and send to printer automatically1.
- Write a comprehensive automation documentation: best practices, script templates, troubleshooting, and accessibility considerations.
Helpful Shell Commands Reference
| Command | Purpose |
|---|---|
chmod +x script.sh | Make script executable |
./script.sh | Run a shell script |
for file in *.scad; do ... done | Loop through files |
basename file.scad .scad | Remove extension |
stat -c%s file (Linux) or stat -f%z file (macOS) | Get file size |
find dir -name "*.scad" | Find all SCAD files |
tar -czf archive.tar.gz folder/ | Create compressed archive |
du -sh folder/ | Show folder size |
References
-
3DMake GitHub - Automation Examples - https://github.com/tdeck/3dmake/blob/main/docs/automation.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
3DMake Library Management - https://github.com/tdeck/3dmake/wiki/Library-Management ↩ ↩2 ↩3
#!/bin/bash
build_all.sh - Batch build script for OpenSCAD projects
Compiles all SCAD files in the current directory to STL format
Usage: ./build_all.sh [output_directory]
Color codes for output
RED=‘\033[0;31m’ GREEN=‘\033[0;32m’ YELLOW=‘\033[1;33m’ NC=‘\033[0m’ # No Color
Configuration
SCAD_FILES=() OUTPUT_DIR=“${1:-./_builds}” OPENSCAD_CMD=“openscad” FAILED_COUNT=0 SUCCESS_COUNT=0
============================================
HELPER FUNCTIONS
============================================
Check if OpenSCAD is installed
check_openscad() { if ! command -v $OPENSCAD_CMD &> /dev/null; then echo -e “${RED}Error: OpenSCAD not found. Install it first.${NC}” echo “Ubuntu/Debian: sudo apt-get install openscad” echo “macOS: brew install openscad” exit 1 fi }
Create output directory
setup_output() { mkdir -p “$OUTPUT_DIR” echo -e “${YELLOW}Output directory: $OUTPUT_DIR${NC}” }
Find all SCAD files
find_scad_files() { echo “Searching for SCAD files…” while IFS= read -r file; do SCAD_FILES+=(“$file”) done < <(find . -name “*.scad” -type f | sort)
if [ ${#SCAD_FILES[@]} -eq 0 ]; then
echo -e "${RED}No SCAD files found!${NC}"
exit 1
fi
echo -e "${GREEN}Found ${#SCAD_FILES[@]} SCAD files${NC}"
}
Compile a single SCAD file
compile_scad() { local scad_file=“$1” local output_file=“${OUTPUT_DIR}/$(basename “$scad_file” .scad).stl“
echo -n "Building: $scad_file ... "
if $OPENSCAD_CMD -o "$output_file" "$scad_file" 2>/dev/null; then
echo -e "${GREEN}✓ Success${NC}"
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
return 0
else
echo -e "${RED}✗ Failed${NC}"
FAILED_COUNT=$((FAILED_COUNT + 1))
return 1
fi
}
============================================
MAIN EXECUTION
============================================
echo “==========================================” echo “OpenSCAD Batch Build Script” echo “==========================================” echo “”
check_openscad setup_output find_scad_files
echo “” echo “Building ${#SCAD_FILES[@]} files…” echo “==========================================”
Build all SCAD files
for scad_file in “${SCAD_FILES[@]}”; do compile_scad “$scad_file” done
echo “==========================================” echo “” echo -e “Build Summary:” echo -e “ ${GREEN}✓ Successful: $SUCCESS_COUNT${NC}“ if [ $FAILED_COUNT -gt 0 ]; then echo -e “ ${RED}✗ Failed: $FAILED_COUNT${NC}“ fi echo “”
Exit with appropriate code
if [ $FAILED_COUNT -eq 0 ]; then echo -e “${GREEN}All builds successful!${NC}” echo “Files ready in: $OUTPUT_DIR” exit 0 else echo -e “${RED}$FAILED_COUNT build(s) failed. Check for errors above.${NC}” exit 1 fi
#!/bin/bash
test_variants.sh - Test different parameter variations of SCAD files
Generates multiple versions of a design with different parameters
Useful for testing parametric designs and export optimization
Configuration
SCAD_FILE=“${1:-./*.scad}” OUTPUT_DIR=“${2:-./_variants}” OPENSCAD_CMD=“openscad” TEST_COUNT=0
============================================
VARIANT CONFIGURATIONS
============================================
Define parameter variations to test
Format: “name:parameter1=value1,parameter2=value2”
declare -a VARIANTS=( “small:size=10,thickness=1” “medium:size=20,thickness=2” “large:size=30,thickness=3” “extra_large:size=40,thickness=4” “high_detail:fn=50,thickness=2” “low_detail:fn=16,thickness=2” “hollow:hollow=true,wall_thickness=2” “solid:hollow=false,wall_thickness=3” )
============================================
FUNCTIONS
============================================
setup() { mkdir -p “$OUTPUT_DIR” echo “Output directory: $OUTPUT_DIR” echo “” }
test_variant() { local name=“$1” local params=“$2” local scad_file=“$3” local output_file=“${OUTPUT_DIR}/${name}.stl”
echo -n "Testing variant '$name' ... "
# Build parameter string for OpenSCAD
local param_string=""
IFS=',' read -ra PARAMS <<< "$params"
for param in "${PARAMS[@]}"; do
param_string="$param_string -D $param"
done
if $OPENSCAD_CMD $param_string -o "$output_file" "$scad_file" 2>/dev/null; then
local size=$(du -h "$output_file" | cut -f1)
echo "✓ ($size)"
TEST_COUNT=$((TEST_COUNT + 1))
return 0
else
echo "✗ Failed"
return 1
fi
}
run_tests() { echo “Testing ${#VARIANTS[@]} variants of: $1” echo “==========================================” echo “”
for variant in "${VARIANTS[@]}"; do
IFS=':' read -r name params <<< "$variant"
test_variant "$name" "$params" "$1"
done
}
summary() { echo “” echo “==========================================” echo “Test Summary: $TEST_COUNT variants created” echo “View results in: $OUTPUT_DIR” echo “” echo “Next steps:” echo “ 1. Load STL files in your slicer“ echo “ 2. Compare print times and file sizes“ echo “ 3. Identify optimal parameters“ echo “ 4. Use best variant for production“ }
============================================
MAIN
============================================
setup
Find SCAD file if using wildcard
if [[ $SCAD_FILE == “”* ]]; then SCAD_FILE=$(ls -1 ${SCAD_FILE} 2>/dev/null | head -n1) if [ -z “$SCAD_FILE” ]; then echo “No SCAD files found!” exit 1 fi fi
run_tests “$SCAD_FILE” summary
exit 0
Batch Export Script for OpenSCAD
Exports multiple STL files with optimized settings
For use with PrusaSlicer, Cura, or other slicers
Configuration
$ProjectName = “3D Print Batch” $ScadDirectory = Get-Location $OutputDirectory = Join-Path $ScadDirectory “_exports” $OpenSCADPath = “C:\Program Files\OpenSCAD\openscad.exe”
Ensure OpenSCAD exists
if (-Not (Test-Path $OpenSCADPath)) { Write-Host “Error: OpenSCAD not found at $OpenSCADPath” -ForegroundColor Red exit 1 }
Create output directory
New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null Write-Host “Output directory: $OutputDirectory” -ForegroundColor Green
Find all SCAD files
$ScadFiles = Get-ChildItem -Path $ScadDirectory -Filter “*.scad” -File | Sort-Object Name Write-Host “Found $($ScadFiles.Count) SCAD files`n” -ForegroundColor Green
$SuccessCount = 0 $FailCount = 0
Process each SCAD file
foreach ($ScadFile in $ScadFiles) { $OutputFile = Join-Path $OutputDirectory “$($ScadFile.BaseName).stl” $ScadPath = $ScadFile.FullName
Write-Host -NoNewline "Exporting: $($ScadFile.Name) ... "
try {
# Call OpenSCAD with headless rendering
& $OpenSCADPath -o $OutputFile $ScadPath 2>$null
if (Test-Path $OutputFile) {
$Size = (Get-Item $OutputFile).Length / 1MB
Write-Host "✓ Success ($([Math]::Round($Size, 2)) MB)" -ForegroundColor Green
$SuccessCount++
} else {
Write-Host "✗ Failed" -ForegroundColor Red
$FailCount++
}
}
catch {
Write-Host "✗ Error: $_" -ForegroundColor Red
$FailCount++
}
}
Summary
Write-Host “n==========================================" Write-Host "Export Summary:" -ForegroundColor Cyan Write-Host " Successful: $SuccessCount" -ForegroundColor Green if ($FailCount -gt 0) { Write-Host " Failed: $FailCount" -ForegroundColor Red } Write-Host "nFiles ready in: $OutputDirectory” -ForegroundColor Yellow
Optional: Open output directory in Windows Explorer
$Choice = Read-Host “Open output folder? (Y/n)” if ($Choice -ne ‘n’ -and $Choice -ne ‘N’) { explorer.exe $OutputDirectory }
Lesson 10: Hands-On Practice Exercises and Troubleshooting
Estimated time: 120-150 minutes (multiple activities)
Learning Objectives
- Apply all prior lessons in integrated projects1
- Diagnose and fix common 3D printing and OpenSCAD issues2
- Validate models using deterministic and AI-assisted inspection3
- Document design decisions and troubleshooting processes1
Materials
- 3dMake project scaffold
- Printer for test prints (recommended)
- Measuring tools (calipers, protractor)
- Access to 3dm commands
- Reference: master-rubric.md for assessment criteria
- Reference: filament-comparison-table.md for material properties
Extension Projects: Complete Dice_Dice_Dice or Snap_Fit_Clip to practice integrated validation workflows.
Part 1: Measurement Fundamentals
Before you can validate that your designs print correctly, you need to measure accurately. This section covers using calipers and interpreting measurement data.
Understanding Digital Calipers
A digital caliper is a precision tool with three measurement modes:
| Mode | Use | Example |
|---|---|---|
| Outside jaws | Measure outer dimensions | Diameter of a cylinder, width of a part |
| Inside jaws | Measure inner dimensions | Hole diameter, inside width of a box |
| Depth rod | Measure depth or thickness | Depth of a recess, thickness of a part |
Measurement Best Practices
- Zero the caliper: With jaws closed, press the ON/ZERO button to confirm it reads 0.0 mm
- Use gentle pressure: Tighten jaws just enough to hold the object; excessive force causes false readings
- Take three trials: Measure the same feature three times and calculate the average
- Record to 0.1 mm: Most printed parts can be reliably measured to one decimal place
Example measurement sequence:
Object: 3D-printed cube
Trial 1: 24.5 mm
Trial 2: 24.2 mm
Trial 3: 24.6 mm
Average: (24.5 + 24.2 + 24.6) / 3 = 24.43 mm 24.4 mm
Interpretation: Designed as 25.0 mm, printed as 24.4 mm
Deviation: -0.6 mm (0.24% shrinkage, acceptable for PLA)
Using Measurements to Improve Design
When you find a deviation between your designed and actual dimensions, you can adjust future prints:
// Design parameter
part_height = 50; // Designed: 50 mm
// After first print, measured: 49.7 mm
// Shrinkage: ~0.6% (typical for PLA)
// Adjustment for next print:
// Option 1: Add 0.3 mm to compensate
part_height = 50.3; // Should now print ~50.0 mm
// OR
// Option 2: Scale the entire design by 1.006 (0.6% larger)
scale([1.006, 1.006, 1.006])
main_model();
Tolerance Stack-Up in Assemblies
When multiple parts fit together, measurement errors compound. This is called tolerance stack-up:
Example: Stackable bins
Designed: Outer width = 80.0 mm, Rim clearance = 0.6 mm
If each part prints 0.3 mm undersized:
Bin A actual: 79.7 mm outer
Bin B actual: 79.7 mm outer
Stack-up effect: Instead of 0.6 mm clearance, you get 0.9 mm
Result: Bins stack loosely (might be acceptable or problematic depending on use)
Solution: Design with 0.8 mm clearance initially, measure test prints,
then adjust if needed.
Creating a Measurement Log
For any parametric design project, maintain a measurement log:
Project: Phone Stand Variants
Date: February 10, 2026
Part: Base (narrow variant, 60 mm)
Design dimension: 60.0 mm width
Trial 1: 59.7 mm
Trial 2: 59.8 mm
Trial 3: 59.9 mm
Average: 59.8 mm
Deviation: -0.2 mm
Status: Acceptable (within +/-0.5 mm tolerance)
Part: Base (wide variant, 120 mm)
Design dimension: 120.0 mm width
Trial 1: 119.5 mm
Trial 2: 119.6 mm
Trial 3: 119.8 mm
Average: 119.6 mm
Deviation: -0.4 mm
Status: Acceptable
Part: Lip (lip_height parameter: 15 mm)
Design dimension: 15.0 mm
Trial 1: 14.8 mm
Trial 2: 14.9 mm
Trial 3: 14.9 mm
Average: 14.87 mm 14.9 mm
Deviation: -0.1 mm
Status: Excellent
Reference: Appendix C
For comprehensive QA procedures, assembly testing, and durability validation, see Appendix C: Tolerance Testing & QA Matrix, which covers:
- Go/no-go gauges for functional validation
- Multi-cycle durability testing (snap-fits, hinges)
- Stress testing procedures
- Complete measurement worksheets
Exercise Set A: Guided Projects with Real-World Constraints
Exercise A1: The Parametric Phone Stand (Beginner)
Objective: Create a phone stand that works for 3+ phone models with different screen sizes.
Requirements:
- Base must support 300g weight
- Angle must be adjustable (45-75)
- Width must accommodate phones 60-90mm wide
- All parameters at top of file
Starter Code:
// Parametric Phone Stand v1
// Required parameters
phone_width = 75; // mm - adjust for different phones
base_width = phone_width + 10; // Add margin
base_depth = 100; // mm
base_thickness = 5; // mm
stand_angle = 60; // degrees - adjust viewing angle
lip_height = 15; // mm - hold phone at top
// Module definitions
module base() {
cube([base_width, base_depth, base_thickness]);
}
module stand() {
rotate([stand_angle, 0, 0])
cube([base_width, base_depth, base_thickness]);
}
module lip() {
translate([0, base_depth - 8, base_thickness])
cube([base_width, 8, lip_height]);
}
// Assemble
union() {
base();
stand();
lip();
}
Tasks:
- Build the model and verify it’s manifold with
3dm describe - Generate 3 variants: iPhone (60mm), iPad mini (100mm), Tablet (150mm)
- Test each variant by measuring critical dimensions
- Document which variant works best with real devices
Success Criteria:
- All 3 variants build without errors
- Printed parts successfully hold test phones
- Dimensions match designs within 0.5mm
Exercise A2: The Customizable Keycap Set (Intermediate)
Objective: Design a family of keycaps for a custom keyboard with text, icons, and different profiles.
Requirements:
- 5+ keycap sizes (mm 12-28)
- Support embossed text and numbers
- Optional: icon cutouts
- All printable without supports
Challenge: Use parametric code to generate all 5 caps from a single design1:
// Parametric Keycap Generator v1
// PARAMETERS TO CUSTOMIZE
cap_size = 18; // mm - change for different key sizes
cap_height = 12; // mm
wall = 1.2; // mm
text_char = "A"; // Character to emboss
emboss_depth = 0.8; // mm
// Derived calculations
inner_size = cap_size - 2*wall;
module keycap() {
// Hollow shell
difference() {
cube([cap_size, cap_size, cap_height], center=false);
translate([wall, wall, wall])
cube([inner_size, inner_size, cap_height], center=false);
}
}
module emboss() {
translate([cap_size/2, cap_size/2, cap_height - 0.01])
linear_extrude(height=emboss_depth)
text(text_char, size=cap_size*0.5,
halign="center", valign="center", $fn=32);
}
// Main assembly
union() {
keycap();
emboss();
}
Tasks:
- Create variants with
cap_size= 12, 16, 18, 20, 24 mm - Build each variant and verify emboss quality
- Test printability: print 2-3 variants
- Measure final dimensions and compare to design
Documentation Required:
- Parameter table showing all 5 variants
- Print time estimates for each
- Post-processing notes (support removal, surface finishing)
Exercise A3: The Stackable Storage System (Advanced)
Objective: Design a modular storage system where bins stack securely and dividers are customizable.
Requirements:
- Bins must stack without binding
- Dividers must be optional and repositionable
- 3+ configurations (small/medium/large)
- Tolerance management documented1
Key Features:
// Advanced Stackable Bin System
// PARAMETERS
bin_width = 80;
bin_depth = 120;
bin_height = 60;
wall_thick = 2;
rim_height = 3;
stack_clearance = 0.6; // KEY TOLERANCE PARAMETER
divider_thickness = 1.5;
num_dividers = 2; // 0 for no dividers
// Tolerance-critical calculation
rim_inner_width = bin_width - 2*(wall_thick + stack_clearance);
rim_inner_depth = bin_depth - 2*(wall_thick + stack_clearance);
module bin_body() {
difference() {
cube([bin_width, bin_depth, bin_height]);
translate([wall_thick, wall_thick, wall_thick])
cube([bin_width - 2*wall_thick,
bin_depth - 2*wall_thick,
bin_height - wall_thick]);
}
}
module stacking_rim() {
difference() {
translate([0, 0, bin_height])
cube([bin_width, bin_depth, rim_height]);
translate([wall_thick + stack_clearance,
wall_thick + stack_clearance,
bin_height])
cube([rim_inner_width, rim_inner_depth, rim_height]);
}
}
module dividers() {
if (num_dividers > 0) {
for (i = [1 : num_dividers]) {
y = wall_thick + (i * (bin_depth - 2*wall_thick) / (num_dividers + 1));
translate([wall_thick, y, wall_thick])
cube([bin_width - 2*wall_thick, divider_thickness, bin_height - 2*wall_thick]);
}
}
}
// Main assembly
union() {
bin_body();
stacking_rim();
dividers();
}
Tasks:
- Print 2 identical bins and test stacking
- Create 3 configurations: Small (60x80x40), Medium (80x120x60), Large (120x160x80)
- Test with different
stack_clearancevalues: 0.4, 0.6, 0.8mm - Document which clearance works best in practice1
- Print a large bin with 3 dividers and test storage capacity
Documentation Required:
- Tolerance testing matrix with measurements
- Assembly instructions with photos/descriptions
- Recommendations for printer calibration
Exercise Set B: Common Problems and Solutions
B1: Non-Manifold Geometry
Problem: Model renders but slicer shows errors or generates invalid G-code
Diagnosis:
3dm describe your_model.scad
# Look for messages like "non-manifold edges" or "thickness near zero"
Common Causes and Fixes:
| Issue | Cause | Fix |
|---|---|---|
| Coincident faces | Shapes touching exactly | Add 0.001 offset: translate([0, 0, 0.001]) |
| Zero-thickness walls | Wall too thin to render | Increase wall: wall = 2.0 instead of wall = 0.5 |
| Incomplete shape | Missing face in difference | Check boolean operations have complete shells |
| Self-intersecting faces | Shape overlaps itself | Simplify geometry, use hull() instead of union |
Fix Example:
// BEFORE (often fails)
difference(){
cube([20, 20, 20]);
sphere(r=10);
}
// AFTER (usually works)
difference(){
cube([20, 20, 20]);
translate([10, 10, 10.001]) // Offset to prevent coincidence
sphere(r=10, $fn=32);
}
B2: Print Failures
Problem: Print starts but fails partway through
Diagnosis:
# Check G-code for errors
3dm slice your_model.scad
# Verify model in slicer before printing
# Preview layer-by-layer
Common Causes:
| Symptom | Cause | Prevention |
|---|---|---|
| Nozzle clogs after 10 min | Too fast extrusion speed | Reduce speed in slicer |
| Parts separate from bed | Poor first layer adhesion | Check bed level, clean bed |
| Melted plastic strands | Retraction not working | Verify retraction in slicer |
| Model warping | Thermal stress, no cooling | Cool model, improve ventilation |
| Supports fail to remove | Too thin or fused to model | Thicken supports, adjust angle |
Validation Checklist Before Printing:
#!/bin/bash
# pre_print_check.sh - Validate before printing
echo "=== Pre-Print Validation ==="
# 1. Check for non-manifold geometry
echo "Checking geometry..."
3dm describe src/main.scad | grep -i "non-manifold"
# 2. Check wall thickness
echo "Checking wall thickness > 1mm..."
# (This requires slicer analysis - do manually)
# 3. Generate preview
echo "Generating 2D preview..."
3dm preview src/main.scad
# 4. Estimate print time
3dm slice src/main.scad
echo "Generated G-code: build/main.gcode"
echo "=== Ready to print? ==="
B3: Dimensional Inaccuracy
Problem: Printed part measures 0.5-2mm different from design
Cause: Printer calibration, shrinkage, or design tolerance issues1
Diagnosis:
# After printing, measure 3 locations and average
# Compare to design parameters
Solution Process:
Step 1: Measure printed part (3 locations)
Design: 50mm
Measured: 49.7mm, 49.8mm, 49.6mm
Average: 49.7mm (0.3mm small)
Step 2: Calculate correction factor
Correction = 50.0 / 49.7 = 1.0060 (0.6% larger)
Step 3: Apply to design
New param = old_param * 1.0060
Step 4: Reprint and verify
Prevention:
- Use standard calibration models (benchy, calibration cube)
- Document printer baseline dimensions
- Apply material-specific shrinkage factors
Exercise Set C: Validation and Documentation
C1: Design Review Checklist
After completing any design, validate using this checklist:
# Design Review Checklist
## Geometry Validation
- [ ] Model builds without errors (`3dm build`)
- [ ] No non-manifold edges (`3dm describe` shows no warnings)
- [ ] All walls 1.5mm thick
- [ ] No floating parts or disconnected geometry
- [ ] All features clearly serve a purpose
## Parametric Design
- [ ] All dimensions are parameters (no hard-coded values)
- [ ] Parameter names are descriptive (e.g., `wall_thickness` not `w`)
- [ ] Parameters have units comments (e.g., `wall = 2; // mm`)
- [ ] Derived values calculated from parameters (e.g., `inner = outer - 2*wall`)
## Printability
- [ ] Overhangs 45 or have support strategy
- [ ] No fine details < 0.5mm
- [ ] Assembly features tested (snap-fits, interlocks)
- [ ] Post-processing needs documented
## Documentation
- [ ] README describes design purpose and key parameters
- [ ] Usage examples provided
- [ ] Known limitations documented
- [ ] Assembly instructions included (if multi-part)
## Accessibility
- [ ] Model dimensions available in text form
- [ ] AI description (`3dm describe`) is useful
- [ ] Assembly process described non-visually
- [ ] No features rely solely on visual inspection
C2: Troubleshooting Documentation Template
After solving any issue, document it:
# Troubleshooting Record
## Issue: [Describe the problem]
**Date:** YYYY-MM-DD
**Project:** [Project name]
## Symptoms
- [What did you observe?]
- [When did it happen?]
## Root Cause
[Analysis of why it happened]
## Solution Applied
[Exact steps to fix]
## Verification
[How did you confirm it worked?]
## Prevention
[How to avoid this in future designs]
## References
- [Related documentation]
- [Similar issues]
Checkpoint
- After Exercise A1, you have a working phone stand
- After Exercise A2, you have a parametric keycap set
- After Exercise A3, you have a stackable bin system with tolerance data
- After Exercise B, you understand common failure modes
- After Exercise C, you have documentation habits
Quiz - Lesson 3dMake.10 (10 questions)
- What is the first diagnostic step when a model fails to slice2?
- Explain the 0.001 offset rule and when to apply it2.
- How would you verify that a wall is thick enough before printing1?
- What measurement method would you use to validate dimensional accuracy1?
- Describe what happens when stack_clearance is too small or too large1.
- True or False: Parametric design makes it harder to troubleshoot issues.
- How would you document a design so that others can modify and reprint it1?
- What should you check in a slicer preview before sending a file to print2?
- How would you use
3dm describeto find design flaws3? - Describe a complete workflow from problem diagnosis to solution verification1.
Extension Problems (10)
- Complete all three exercises (A1, A2, A3) and document results1.
- Print and test 2+ variants of your phone stand; measure and compare1.
- Conduct a tolerance sensitivity study: test bins with 3+ clearance values1.
- Create a troubleshooting guide for your specific printer: common issues and fixes2.
- Design a validation workflow: automated checks before printing1.
- Build a design documentation database: parameter ranges, material recommendations, print settings1.
- Create before/after case studies of design problems and solutions1.
- Develop a printer calibration procedure and document baseline dimensions1.
- Design a quality assurance system: define metrics, measurement methods, acceptance criteria1.
- Write a comprehensive troubleshooting and maintenance guide: diagnostics, solutions, prevention strategies, and accessibility considerations.
References
-
OpenSCAD Best Practices - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/FAQ ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
3D Printing Troubleshooting Guide - https://www.prusa3d.com/support/ ↩ ↩2 ↩3 ↩4 ↩5
-
3DMake Documentation - https://github.com/tdeck/3dmake/wiki/Troubleshooting ↩ ↩2
Common 3D Printing Issues and Solutions
Comprehensive troubleshooting guide for diagnosing and fixing common 3D printing problems.
Pre-Print Issues
Problem: Filament Won’t Load
Symptoms:
- Extruder clicks/grinds but no filament moves
- Nozzle temperature displays but stays clean
- No material extrudes when manual extrude command sent
Diagnosis Checklist:
- Nozzle temperature high enough? (Check material specs)
- Filament path clear of obstructions?
- Drive gear has grip on filament (not polished smooth)?
- Extruder tension set correctly?
Solutions:
- Increase nozzle temperature (too cold = harder extrusion)
- Clean extruder drive gear - brush with wire brush to restore grip
- Check filament diameter - should be 1.75mm (+/-0.03mm)
- Verify extruder tension - should grip firmly but not crush filament
- Inspect nozzle - may be partially clogged (see nozzle clog section)
Problem: Warped/Damaged Filament
Symptoms:
- Filament appears bent or kinked on spool
- Filament diameter inconsistent
- Melted spots on filament surface
Diagnosis Checklist:
- Was filament stored properly (dry, cool)?
- Spool has been sitting unused?
- Transport/handling damage visible?
Solutions:
- Discard damaged section - cut off ~30cm if kinked
- Increase humidity - try drying filament in low oven (50C for 2 hours PLA)
- Check storage - PLA especially absorbs moisture
- Replace spool - if damage is extensive
Print Quality Issues
Problem: Poor Bed Adhesion (First Layer Lifts)
Symptoms:
- Print lifts off bed during first layer
- Material rolls up at edges
- Print comes free during printing
Diagnosis Checklist:
- Build plate level? (Should drag paper at all points)
- Nozzle at correct height for first layer?
- Bed clean and free of dust/oil?
- Bed temperature adequate?
Solutions:
- Re-level build plate - cold plate adjustment for accuracy
- Clean build plate - wipe with isopropyl alcohol
- Lower nozzle (if too high) - reduce Z by 0.05-0.1mm
- Increase bed temperature - add 5-10C
- Use adhesion aids:
- PLA: Painter’s tape, glue stick, or bare clean plastic
- PETG: Textured bed or thin glue layer
- ABS: Heated bed + blue tape + ABS slurry (acetone + scraps)
- TPU: Clean bed, possibly elevated temperature
Problem: Nozzle Clog
Symptoms:
- No extrusion after initial layers
- Consistent gap between nozzle and print
- Pressure building in nozzle (smoking or popping)
- Clicking sounds from extruder
Diagnosis Checklist:
- Filament jam visible in extruder?
- Nozzle temperature high enough?
- Print moved away from nozzle?
- Recent failed print or debris?
Solutions (Increasing Intensity):
-
Immediate - Cold Pull:
- Heat nozzle to 200C
- Grab filament and give firm pull while cooling
- Repeat 5-10 times
- May extract filament with debris
-
Hot Swap:
- Heat nozzle to printing temperature
- Remove extruder completely
- Use small drill bit (0.3-0.4mm) to carefully poke from top
- Don’t force - may damage nozzle
-
Soak & Poke:
- Remove nozzle with wrench while hot
- Soak in heated acetone or strong cleaner (20-30 min)
- Use ultrasonic cleaner if available
- Use thin needle to clear passage
-
Replacement:
- If clog persists, nozzle may be damaged internally
- Replace with new nozzle (usually $3-10)
- Always keep spare nozzles
Problem: Under-Extrusion (Thin Walls, Weak Print)
Symptoms:
- Print walls thinner than expected
- Weak layer bonding (layers separate easily)
- Visible horizontal lines in walls
- Light-colored sections in print
Diagnosis Checklist:
- Nozzle partially clogged?
- Extrusion multiplier/width set correctly?
- Hot end temperature too low?
- Filament diameter inconsistent?
- Drive gear slipping?
Solutions:
- Check extruder steps/mm - calibrate e-steps if possible
- Increase flow rate - try 105-110% in slicer
- Raise temperature - add 5-10C
- Slow down print speed - reduce 10-20%
- Check filament quality - test with different brand/batch
- Clean drive gear - remove plastic buildup
Problem: Over-Extrusion (Blobs, Rough Texture)
Symptoms:
- Excess material squishing out between layers
- Rough, bumpy texture on surface
- Blobs or zits on walls
- Layers slightly translucent
Diagnosis Checklist:
- Temperature too high?
- Extrusion width too large?
- Line width set wider than nozzle?
- Flow rate too high?
Solutions:
- Reduce flow rate - try 95% in slicer
- Lower temperature - reduce 5-10C
- Check line width - should be ~1.2x nozzle diameter (0.4mm nozzle = 0.48mm width)
- Speed up print - higher speeds reduce oozing
- Check nozzle size - confirm you’re using correct setting
Problem: Layer Shifting
Symptoms:
- Layers offset horizontally mid-print
- X or Y axis suddenly jumps
- Top portion of print misaligned
- Usually happens at specific layer height
Diagnosis Checklist:
- Mechanical: Check X/Y pulley teeth, belts, screws loose?
- Collision: Does print hit extruder/frame?
- Speed: Trying to move too fast, losing steps?
- Support: Is print unstable/wobbly?
- Firmware: Recent changes to acceleration settings?
Solutions:
-
Check mechanics:
- Manually move X/Y freely (no resistance)
- Tighten all visible screws
- Check belts for fraying (replace if damaged)
-
Reduce speed:
- Lower travel speed by 20-30%
- Reduce acceleration in firmware
- Slow down print speed by 20%
-
Check print orientation:
- Rotate model to reduce overhang
- Add supports to prevent wobbling
- Ensure solid perimeters around shift point
-
Firmware:
- Check acceleration settings (try 1000 mm/s)
- Verify step/mm calibration
- Update firmware if outdated
Advanced Troubleshooting
Problem: Stringing (Fine Filament Between Prints)
Cause: Nozzle oozes while traveling between print sections
Solutions:
- Reduce temperature by 5-10C
- Increase retraction distance (0.5-1.5mm more)
- Increase retraction speed
- Enable wipe on retract (slicer setting)
- Check nozzle diameter (worn nozzles ooze more)
Problem: Warping (Corners Curl Up)
Cause: Material cools unevenly, contracts differently
Solutions (by material):
- ABS: Heated enclosure, slow cooling, higher bed temp
- PETG: Reduce cooling fan, increase bed temp
- PLA: Usually warps if bed too hot - reduce temperature
Problem: Inconsistent Print Quality
Cause: Variable conditions print-to-print
Solutions:
- Environmental: Maintain consistent room temperature
- Material: Use same brand/batch filament
- Calibration: Re-level bed before each print
- Firmware: Disable bed leveling if unreliable
- Maintenance: Clean nozzle after each print
Diagnosis Decision Tree
Print fails?
+---- No extrusion -> Check nozzle temperature -> Clog? -> Cold pull/poke/replace
+---- Lifts off bed -> Clean bed -> Level bed -> Adjust height -> Increase temp
+---- Breaks mid-print -> Layer shift? -> Check mechanics, speed
| -> Under-extrusion? -> Increase flow/temp/speed
| -> Over-extrusion? -> Decrease flow/temp
+---- Bad surface quality -> Stringing? -> Reduce temp/increase retraction
| -> Blobs? -> Check flow rate, temperature
| -> Warping? -> Adjust bed temp, enclosed space
+---- Print weak -> Under-extrusion -> Increase flow rate, temperature
-> Poor layer bonding -> Increase bed temp, first layer height
Maintenance to Prevent Issues
| Issue | Prevention | Frequency |
|---|---|---|
| Clogs | Clean nozzle | Before each print |
| Bed adhesion | Level bed, clean plate | Before each print |
| Layer shift | Check mechanics, belts | Monthly |
| Inconsistent quality | Calibrate e-steps | Quarterly |
| Worn nozzle | Monitor extrusion quality | Every 6 months |
| Temperature fluctuation | Stable environment | Ongoing |
Last Reviewed: _______________
Printer Model: _______________
Notes: ________________________________________________
Measurement Calibration Guide
Ensure accurate dimensions in your 3D printed parts through proper calibration and verification procedures.
Why Calibration Matters
Printed dimensions often deviate from designed dimensions due to:
- Nozzle width variations
- Extrusion flow rate inconsistencies
- Plastic shrinkage during cooling
- Slicer interpretation differences
- Material-specific shrinkage (ABS can shrink 0.3-1%)
Typical tolerances without calibration: +/-0.3-0.5mm Typical tolerances with calibration: +/-0.1-0.2mm
Pre-Print Calibration
1. Nozzle Diameter Verification
What to verify: Is your nozzle actually 0.4mm?
Test:
- Create a simple box in OpenSCAD: 10mm x 10mm x 5mm, solid
- Slice with default 0.4mm line width
- Print using 100% flow rate
- Measure printed box
Adjustment:
- If too small: Nozzle might be partially clogged (clean)
- If significantly different from 0.4mm: Replace nozzle
2. E-Steps Calibration (Extrusion Rate)
What to verify: Does the extruder push the correct amount of filament?
Method:
- Heat extruder to printing temperature
- Mark filament 100mm from extruder entrance with marker
- Command extrusion of 100mm in firmware (G-code:
G1 E100 F100) - Measure actual distance filament moved
Formula:
New E-steps = Current E-steps x (100mm / Actual distance moved)
Example:
- Current setting: 93 steps/mm
- Commanded: 100mm
- Actual: 92mm moved
- New: 93 x (100/92) = 101 steps/mm
How to apply (varies by printer):
- Marlin:
M92 E101thenM500to save - Klipper: Update configuration and restart
3. First Layer Height Verification
What to verify: Is first layer height optimal?
Test: Print a simple single-layer square (just base layer)
Measurements:
- Too high (>0.3mm): Poor layer adhesion
- Too low (<0.1mm): Nozzle scratches bed, plastic squeezed
- Optimal: 0.2-0.25mm (roughly paper thickness)
Adjustment: Use bed leveling or Z-offset:
- If too high: Reduce Z-offset by 0.05mm
- If too low: Increase Z-offset by 0.05mm
- Test between adjustments
Dimension Calibration Process
Standard XY Calibration Test
Goal: Create parts with precisely measured dimensions
Test File (OpenSCAD):
// Create calibration cube
cube_size = 20; // 20mm cube
wall_thickness = 2;
difference() {
cube([cube_size, cube_size, cube_size], center=true);
cube([cube_size - 2*wall_thickness,
cube_size - 2*wall_thickness,
cube_size + 1], center=true); // Top open
}
Print Instructions:
- Use standard settings (your normal layer height, speed, temp)
- Print with 100% flow rate
- Allow complete cooling (2+ hours)
Measurement Procedure:
- Measure internal dimensions (hollow part) in 3 locations each axis
- Calculate average internal width:
avg_internal - Expected internal:
20 - 2xwall_thickness = 16mm
Calibration Formula:
Flow rate adjustment = Expected internal / Actual internal x 100%
Example:
- Expected: 16.00mm
- Actual: 15.75mm
- Adjustment: (16.00 / 15.75) x 100% = 101.6%
- Set flow to: 101.6% in slicer
Z-Height Calibration
Goal: Verify layer heights are accurate
Test: Print calibration tower with varying layer heights
Tower Specifications:
- 20mm x 20mm square base
- Height: 40mm
- Layers: Print at 0.2mm nominal
Measurements:
- Stack digital calipers on layers and measure height
- Calculate average layer thickness
- Compare with intended 0.2mm
Adjustment: If actual layer height differs:
New Z-scale = Intended height / Actual height
Example:
- Intended: 0.2mm per layer
- Actual: 0.195mm per layer
- Adjustment: 0.2 / 0.195 = 1.026 (increase Z by 2.6%)
Tolerance Measurement Matrix
Critical Measurements to Track
| Measurement | Method | Tolerance | Frequency |
|---|---|---|---|
| Wall thickness | Calipers (multiple spots) | +/-0.1mm | Every print |
| Hole diameter | Calipers or gauge | +/-0.1-0.2mm | Every print |
| Overall dimensions | Ruler/calipers | +/-0.2mm | Monthly |
| Layer height | Stack on calipers | +/-0.02mm | Monthly |
| Vertical dimensions | Measure sides | +/-0.1mm | Every print |
Advanced Calibration
Shrinkage Compensation
Different materials shrink differently after cooling:
| Material | Typical Shrinkage | Compensation |
|---|---|---|
| PLA | 0.3-0.5% | Usually acceptable, no action |
| PETG | 0.5-1% | Scale design up by 0.5-1% if critical |
| ABS | 0.8-1.5% | Scale design up by 1% minimum |
| TPU | 1-2% | Significant - scale up 1-2% for critical dimensions |
How to apply in design:
// In OpenSCAD, scale critical dimensions
final_size = 20;
material_shrinkage = 1.01; // 1% shrinkage
designed_size = final_size * material_shrinkage;
Bed Temperature Compensation
Different bed temperatures affect final dimensions:
ABS on cold bed (50C) vs warm bed (100C):
- Cold bed: Faster cooling, less shrinkage (but poor adhesion)
- Warm bed: Slower cooling, more shrinkage (better adhesion)
- Difference: Can be 0.2-0.3% in dimensions
Solution: Standardize bed temperature for repeatable results
Environmental Factors
| Factor | Effect | Mitigation |
|---|---|---|
| Room temperature | Affects cooling rate | Maintain 20-22C |
| Humidity | Affects material properties | Keep 40-60% RH |
| Air flow | Inconsistent cooling | Avoid drafts near printer |
| Time of day | Material temperature varies | Print at consistent times |
Quick Calibration Checklist
Before First Print with New Settings
- E-steps calibration complete
- First layer height verified
- Nozzle diameter confirmed
- Test print completed and measured
Monthly Maintenance
- Calibration cube printed and measured
- Flow rate adjusted if needed
- Layer height verified
- Temperature consistency checked
When Dimensions Are Critical
- Printed test part, let cool 24+ hours
- Measured in multiple locations
- Calculated average deviation
- Flow rate adjusted accordingly
- Re-printed and verified
After Any Changes
- Nozzle replacement -> Re-verify nozzle diameter
- Bed leveling -> Re-verify first layer
- Temperature changes -> Test print required
- Material change -> Full calibration recommended
Measurement Tools Needed
| Tool | Cost | Accuracy | Use |
|---|---|---|---|
| Digital Calipers | $5-15 | +/-0.05mm | Primary measurements |
| Steel Ruler | $3-10 | +/-1mm | Quick rough checks |
| Vernier Calipers | $10-30 | +/-0.05mm | Precision work |
| Micrometer | $20-50 | +/-0.01mm | Critical tolerances |
| Layer Height Gauge | DIY or $5-10 | +/-0.05mm | Layer verification |
Recommendation: Start with digital calipers (most versatile and affordable)
Troubleshooting Calibration Issues
Problem: Measurements still inconsistent after calibration
- Check if bed is level (temperature affects levelness)
- Verify material is dry (moisture affects dimensions)
- Ensure ambient temperature is stable
- Try printing on different bed locations
Problem: Can’t achieve target dimensions
- Nozzle may be damaged/worn (try replacement)
- Printer may have fundamental hardware issues
- Review mechanical components (belts, screws)
- Consider printer calibration limits
Problem: Dimensions drift over time
- Printer thermal properties changing
- Nozzle wearing out (gradually gets smaller)
- Bed surface degrading
- Normal wear - recalibrate quarterly
Reference: Standard Test Models
These models are helpful for calibration:
- Calibration Cube (20mm hollow) - Overall accuracy
- Tolerance Test Box (various hole sizes) - Hole accuracy
- Layer Tower (graduated heights) - Layer consistency
- Thin Wall Test (walls 1-5mm) - Wall thickness accuracy
Last Calibration Date: _______________
Printer Model: _______________
Current E-Steps: _______________
Current Flow Rate: _______________
Materials Calibrated For: _______________
Diagnostic Checklist for 3D Printing
Use this comprehensive checklist to systematically diagnose and troubleshoot printing issues.
Quick Diagnosis Flowchart
Print Problem?
|
+---- [Before Print] Issues?
| +---- Filament won't load -> CHECK: Temperature, drive gear, nozzle
| +---- Printer won't heat -> CHECK: Power, temperature sensor, firmware
| +---- Bed not level -> CHECK: Leveling routine, bed surface
|
+---- [First Layer] Issues?
| +---- Won't stick -> CHECK: Bed temperature, cleanliness, nozzle height
| +---- Too squished -> CHECK: Nozzle height, bed temperature
| +---- Gaps/uneven -> CHECK: Bed levelness, hot end alignment
|
+---- [Mid-Print] Issues?
| +---- Stops extruding -> CHECK: Clog, temperature drop, jam
| +---- Layers shift -> CHECK: Loose belts, mechanical bind
| +---- Print wobbles -> CHECK: Build plate, print stability
|
+---- [Print Quality] Issues?
+---- Weak/brittle -> CHECK: Temperature, flow rate, layer adhesion
+---- Rough surface -> CHECK: Flow rate, speed, temperature
+---- Warped -> CHECK: Bed temperature, cooling rate, material
Pre-Print Diagnostics
Category A: Power & Connectivity
Checklist:
- Printer powered on
- LED indicators showing normal status
- USB cable connected (if applicable)
- No error codes displaying
- Display/interface responding to input
If failed:
- Check power outlet and cable
- Verify power supply specifications (voltage, current)
- Test with different power outlet
- Try power-cycling (off 30 sec, on)
- Check for blown fuses inside printer
Category B: Temperature System
Heating Element Status:
- Hot end temperature rises when heating commanded
- Bed temperature rises when heating commanded
- Temperature readings stable (not fluctuating 5C+)
- No error messages during heating
Measurement Method:
1. Set hot end to 200C, observe rise
- Expected time to reach: 2-4 minutes
- Steady rise without plateau: Good
- Plateau before reaching: Problem (see below)
2. Set bed to 60C, observe rise
- Expected time to reach: 5-10 minutes
- Stable at target: Good
If heating slow/incomplete:
- Verify target temperature was set
- Check heating element firmware settings
- Test thermal sensor connectivity
- Inspect heating element for damage
- Measure electrical resistance of heaters
Temperature Stability Test:
1. Heat to target temperature
2. Wait 10 minutes for stabilization
3. Record temperature every minute
4. Calculate range (max - min)
Results:
- +/-2C range: Excellent
- +/-5C range: Acceptable
- +/-10C range: Marginal
- >+/-10C range: Problem
Category C: Mechanical Systems
Movement Diagnostics:
Manual Axis Movement:
1. Disable motors (if possible)
2. Manually move each axis
3. Record observations:
- X-axis: _____ (smooth/rough/stuck)
- Y-axis: _____ (smooth/rough/stuck)
- Z-axis: _____ (smooth/rough/stuck)
Expected results: Smooth, no grinding sounds
If rough/stuck:
- Check for visible obstructions
- Inspect rails for debris
- Verify pulleys turn freely
- Check belt tension (if accessible)
- Lubricate dry joints
Powered Movement Test:
1. Position nozzle at center
2. Command X+10mm movement
3. Verify nozzle moved ~10mm
4. Repeat for Y+10mm and Z+5mm
5. Check for skipping or missed steps
Category D: Leveling & Alignment
Build Plate Leveling Test:
Paper Method (Most Common):
1. Heat bed to printing temperature
2. Heat nozzle to printing temperature
3. Position nozzle at first corner
4. Adjust leveling screw until paper drags slightly
5. Move to next corner and repeat
6. Repeat for all 4-9 corners
7. Do center point check last
Target: Consistent slight paper drag all points
Leveling Validation:
- Level at 4 corners
- Level at bed center
- No high/low points
- Nozzle doesn’t hit bed at any point
- Consistent first-layer appearance across bed
Category E: Filament & Extruder
Filament Quality Check:
- Filament diameter consistent (visually inspect ~50cm)
- No visible cracks or damage
- Spool rotates freely without binding
- Filament path clear to extruder
- No tangles in filament path
Extruder Test:
1. Heat to printing temperature
2. Remove print head (if removable)
3. Push 10-20mm of filament through manually
4. Feel resistance during push
5. Observe material exits cleanly
Expected: Smooth push, consistent extrusion
Filament Loading Test
Test Sequence:
1. Heat extruder to material temp
2. Load filament into extruder
3. Watch for material at nozzle tip
Timeline:
- 0-10 sec: Filament engaging
- 10-30 sec: Moving through hot end
- 30-60 sec: Should appear at nozzle tip
- >60 sec: Possible partial clog
If fails:
-> See "Filament Won't Load" troubleshooting
First Layer Diagnostics
Layer Appearance Test
After printing first 5-10 layer heights, evaluate:
| Appearance | Issue | Action |
|---|---|---|
| Wavy/embossed | Bed not level or too close | Relevel bed |
| Gaps between lines | Nozzle too high | Lower Z-offset |
| Completely squished | Nozzle too low | Raise Z-offset |
| Partial adhesion | Bed too cool or dirty | Clean bed, increase temp |
| Consistent squish/lines | Correct | Continue print |
Mid-Print Issue Diagnostics
Extrusion Failure Checklist
When extrusion stops during print:
Immediate Actions:
- Pause print (don’t stop)
- Listen for extruder sounds (grinding = jam)
- Feel nozzle carefully (if cooled slightly)
- Observe filament in extruder (is it feeding?)
Diagnostic Decision:
Is filament stuck in extruder?
+---- YES -> Nozzle clog likely
| -> See Nozzle Clog section (common_issues_and_solutions.md)
| -> Try: Cold pull, retract, clean
|
+---- NO -> Filament loading issue
-> Is spool binding? -> Fix spool rotation
-> Is path blocked? -> Clear obstruction
-> Is drive gear slipping? -> Clean/tension drive gear
Mechanical Issue Diagnostics
When movement sounds wrong:
Listen for:
- Grinding/grating: Bearing issue or obstruction
- Clicking/skipping: Lost steps or over-torque
- Squealing: Lubrication needed
- Silence (but no movement): Stalled motor
Diagnosis Method:
1. Pause print
2. Manually move suspected axis
3. Record resistance type:
- Smooth: Normal
- Rough: Bearing/alignment problem
- Stuck: Mechanical bind
4. Visually inspect that axis
Layer Quality Diagnostics
Visual Inspection During Print
Every 30 minutes of printing, check:
[ ] Layer alignment (no X/Y shifting)
[ ] Material flow (consistent lines, not thin or thick)
[ ] Surface appearance (smooth, not rough)
[ ] Support structure (if used, printing properly)
[ ] No material strings between features
[ ] Consistent layer heights visible
Dimensional Accuracy Diagnostics
After print completes and cools (24 hours):
Precision Measurement
Materials Needed:
- Digital calipers (+/-0.05mm accuracy)
- Ruler (for larger dimensions)
- Notepad for recording
Measurement Protocol:
1. Measure each dimension 3 times at different locations
2. Calculate average
3. Compare to design dimension
4. Calculate deviation percentage
Formula:
Deviation % = ((Measured - Design) / Design) x 100%
Example:
- Design: 20.0mm
- Measured: 19.8mm
- Deviation: ((19.8 - 20.0) / 20.0) x 100% = -1%
Tolerance Evaluation
| Tolerance | Pass/Fail | Action |
|---|---|---|
| +/-0.5mm or better | PASS | No adjustment needed |
| +/-0.5-1mm | MARGINAL | Document and monitor |
| >+/-1mm | FAIL | Adjust flow/calibration |
Environmental Diagnostics
When quality varies between prints:
Check Conditions:
- Room temperature stable (+/-5C?)
- Humidity reasonable (30-60%?)
- No drafts from windows/AC near printer
- Consistent vibration level (no external impact)
- Same filament spool/batch used
- Same slicer settings applied
Environmental Log:
Date: _____ Time: _____ Temp: ___C Humidity: ___%
Print Duration: ______ Result Quality: Poor/Fair/Good/Excellent
Notes: ________________________________________________________
Troubleshooting Decision Tree
Start here for systematic diagnosis:
+---- Printer won't start?
| +---- Check: Power, connections, firmware
|
+---- Heating won't work?
| +---- Check: Temperature sensor, firmware, heater element
|
+---- Won't home/move?
| +---- Check: Endstops, mechanical bind, motors, belts
|
+---- First layer fails?
| +---- Check: Bed level, nozzle height, cleanliness, temperature
|
+---- Filament won't feed?
| +---- Check: Temperature, nozzle, drive gear, clog
|
+---- Extrusion stops mid-print?
| +---- Extruder grinding? -> Clog (cold pull or replace nozzle)
| +---- Filament slack? -> Drive gear or load issue
| +---- No sounds? -> Temperature drop or firmware issue
|
+---- Print quality poor?
| +---- Weak/thin? -> Increase flow/temp/slow down
| +---- Rough/bloated? -> Decrease flow/temp/speed up
| +---- Warped? -> Lower bed temp, faster cooling
| +---- Strings? -> Increase retraction, lower temp
|
+---- Dimensions wrong?
+---- Check: Flow rate calibration, printer accuracy limits
Diagnostic Report Template
Use when seeking help:
DIAGNOSTIC REPORT
================
Printer Model: _________________________
Problem Description: ___________________
When it occurs: (always/sometimes/first 5 layers, etc) ____
Recent changes: _______________________
DIAGNOSTICS PERFORMED:
[ ] Power/connectivity verified
[ ] Temperatures verified
[ ] Mechanical movement tested
[ ] Bed leveling checked
[ ] Filament loading tested
[ ] First layer inspected
[ ] Print quality evaluated
Key Findings:
1. ___________________________________
2. ___________________________________
3. ___________________________________
Attempted Solutions:
1. ___________________________________
2. ___________________________________
Result: (Solved/Partial/Ongoing) ________
Last Diagnostic Date: _______________
Issue Resolved: _______________
Diagnostic Performed By: _______________
Measurement Worksheet
Student Name: ___________________________________ Date: ___________________________________ Project / Assignment: ___________________________________
How to Use This Worksheet
- Measure each feature three times and record all three values
- Calculate the average: add the three values and divide by 3
- Round to one decimal place (e.g., 23.4 mm)
- Use the average in your OpenSCAD code - not a single measurement
Units: All measurements in millimeters (mm) unless otherwise noted.
Object 1
Object description: ___________________________________
| Feature | What You’re Measuring | M1 (mm) | M2 (mm) | M3 (mm) | Average (mm) |
|---|---|---|---|---|---|
| Length (X) | |||||
| Width (Y) | |||||
| Height (Z) | |||||
| Feature 4 | |||||
| Feature 5 |
Notes / sketches:
(describe the object here - label which direction is X, Y, Z)
Object 2
Object description: ___________________________________
| Feature | What You’re Measuring | M1 (mm) | M2 (mm) | M3 (mm) | Average (mm) |
|---|---|---|---|---|---|
| Length (X) | |||||
| Width (Y) | |||||
| Height (Z) | |||||
| Feature 4 | |||||
| Feature 5 |
Notes / sketches:
(describe the object here)
Object 3
Object description: ___________________________________
| Feature | What You’re Measuring | M1 (mm) | M2 (mm) | M3 (mm) | Average (mm) |
|---|---|---|---|---|---|
| Length (X) | |||||
| Width (Y) | |||||
| Height (Z) | |||||
| Feature 4 | |||||
| Feature 5 |
Notes / sketches:
(describe the object here)
Object 4
Object description: ___________________________________
| Feature | What You’re Measuring | M1 (mm) | M2 (mm) | M3 (mm) | Average (mm) |
|---|---|---|---|---|---|
| Length (X) | |||||
| Width (Y) | |||||
| Height (Z) | |||||
| Feature 4 | |||||
| Feature 5 |
Notes / sketches:
(describe the object here)
Object 5
Object description: ___________________________________
| Feature | What You’re Measuring | M1 (mm) | M2 (mm) | M3 (mm) | Average (mm) |
|---|---|---|---|---|---|
| Length (X) | |||||
| Width (Y) | |||||
| Height (Z) | |||||
| Feature 4 | |||||
| Feature 5 |
Notes / sketches:
(describe the object here)
Accuracy Check
After completing all measurements, compare your averages with a partner who measured the same objects.
| Object | My Average (mm) | Partner’s Average (mm) | Difference (mm) | Within 1 mm? |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 |
If any difference is greater than 1 mm, remeasure together and find the source of the discrepancy.
Percent Error (Optional / Extension)
If your instructor provides the “true” dimension of an object (measured with a reference instrument), you can calculate your percent error:
Formula: % error = (|your average true value| / true value) x 100
| Object | Your Average | True Value | Difference | % Error |
|---|---|---|---|---|
A percent error under 2% is excellent for caliper work at this level.
Reflection
Answer in complete sentences.
-
Which measurement was most difficult to take and why?
-
Did your three measurements for any feature vary significantly? What might cause variation between repeated measurements?
-
If you were designing an object in OpenSCAD that needed to fit over one of these objects, which measurement would you use - your smallest, your largest, or your average? Why?
Accessibility Audit Project
Accessibility Audit - Student Documentation Template (Extension Project)
- Author:
- Date:
- Description: Audit 3D printing tools and workflows for accessibility barriers and recommend improvements.
Audit Scope
Tools/workflows to audit:
Testing methodology (screen reader, keyboard-only, other):
Detailed Findings
Tool 1: _____
Automated Accessibility Checks
- (Screenshots/results of testing)
Screen Reader Testing
- Navigation: (clear/unclear/broken)
- Output readability: (readable/partially readable/unreadable)
- Error messages: (helpful/unclear/missing)
- Specific barriers found:
Keyboard Navigation
- All functions accessible via keyboard: Yes / No
- Tab order logical: Yes / No
- Specific barriers:
Recommendations for Tool 1
| Recommendation | Priority | Feasibility | Impact |
|---|---|---|---|
Tool 2: _____
(Repeat structure above)
Tool 3: _____
(Repeat structure above)
Summary of Barriers
| Barrier | Frequency | Severity | Tools Affected |
|---|---|---|---|
Recommendations Matrix
| Priority | Feasibility | Impact | Recommendation | Implementation Steps |
|---|---|---|---|---|
| High | Easy | High | ||
| High | Moderate | High | ||
| Moderate | Easy | Medium |
Reflections
- What surprised you about accessibility barriers in these tools?
- How would you prioritize improvements if you had limited resources?
- What role should users with disabilities play in accessibility testing?
- How can accessibility become part of the design culture?
Action Plan
If implementing improvements, describe your plan:
- Which improvements will you tackle first?
- How will you measure success?
- Timeline for implementation:
Attachments
- Screenshots of accessibility tests
- Screen reader testing notes (with timestamps)
- Keyboard navigation checklist
- Detailed findings document
- Recommendations matrix
- Action plan (if implementing)
Teacher Feedback
| Category | Score | Notes |
|---|---|---|
| Problem & Solution (0-3) | ||
| Design & Code Quality (0-3) | ||
| Documentation (0-3) | ||
| Total (0-9) | ** ** |
Feedback:
Accessibility Audit - Teacher Template (Extension Project)
Briefing
Students conduct a comprehensive accessibility audit of 3D printing workflows and tools. This project emphasizes universal design principles, accessibility testing, and inclusive documentation.
Key Learning: Accessibility as a design practice; testing with assistive technology; inclusive documentation.
Real-world Connection: Universal design benefits all users. Accessibility is increasingly a legal and ethical requirement in professional contexts.
Constraints
- Audit must cover at least three tools or workflows (editor, slicer, terminal)
- Testing must include both automated checks and user feedback
- Recommendations must be specific and actionable
- Documentation must support future accessibility improvements
Functional Requirements
- Audit identifies specific accessibility barriers with clear descriptions
- Testing conducted with screen reader and keyboard-only navigation
- Recommendations are prioritized by impact and feasibility
- Documentation guides future accessibility improvements
Deliverables
- Completed audit template
- Detailed findings for each tool/workflow
- Screen reader testing log
- Recommendations matrix (priority, feasibility, impact)
- Reflection on accessibility challenges and opportunities
- Action plan for improving course materials
Rubric
Category 1: Problem & Solution (0-3)
Audit is thorough and identifies real barriers. Recommendations are actionable.
Category 2: Design & Code Quality (0-3)
Testing methodology is rigorous. Findings are specific and well-documented.
Category 3: Documentation (0-3)
Audit template complete. Recommendations prioritized. Action plan clear.
Assessment Notes
- Strong submissions: Show rigorous testing methodology, specific barrier descriptions, prioritized recommendations, and sincere reflection on inclusion
- Reinforce: Accessibility is everyone’s responsibility; small improvements compound
- Extension: Implementation of recommended improvements; follow-up testing
Lesson 11: Stakeholder-Centric Design and the Beaded Jewelry Project
Estimated time: 90-120 minutes | Level: Advanced
Learning Objectives
- Conduct stakeholder interviews to identify needs, wants, and constraints1
- Extract functional requirements from interview data1
- Design a product that meets explicit requirements (not assumptions)2
- Iterate design based on stakeholder feedback2
- Document design decisions for reproducibility and accessibility3
Materials
- Interview worksheet (provided below)
- Notebook/laptop for notes
- Access to stakeholder (or use provided scenario)
- 3dMake project scaffold
- Calipers for measurement
- Reference: master-rubric.md for design documentation standards
Extension Project: Complete Beaded_Jewelry_Unit to apply stakeholder-centric design principles in a real project context.
Why This Matters: The Design Thinking Process
Most design failures start before CAD. They happen because:
- Assumption Problem: Designer assumes what users need without asking
- Specification Problem: Unclear requirements lead to wasted iterations
- Accessibility Problem: Features designed without considering all users
This lesson flips the process: Listen First, Design Second1.
The Design Thinking Pipeline
1. Empathize (Listen to stakeholder)
v
2. Define (Extract functional requirements)
v
3. Ideate (Sketch/prototype solutions)
v
4. Prototype (Build in CAD)
v
5. Test (Get feedback)
v
6. Iterate (Refine based on feedback)
Part 1: Stakeholder Interviews (20-30 minutes)
What is a Stakeholder?
A stakeholder is anyone who will use, interact with, or be affected by your design. Examples:
- End User: Person who directly uses the product
- Maintenance Person: Someone who repairs/replaces parts
- Budget Holder: Person responsible for cost
- Safety Officer: Person ensuring regulatory compliance
Open-Ended Interview Questions
Good interview questions:
- [YES] Start with “What,” “How,” “Why”
- [YES] Don’t suggest answers
- [YES] Follow up with “Tell me more…”
- [YES] Listen for numbers, specific stories, pain points
Bad interview questions:
- [NO] “Do you like…?” (Yes/No - no detail)
- [NO] “Would you prefer A or B?” (Forced choice)
- [NO] “Don’t you think…?” (Leading question)
Sample Interview Script (Beaded Jewelry)
You’re designing a custom beaded bracelet holder. Here’s how to interview a stakeholder:
Opening:
"Hi [name], I'm designing a way to store and display beaded
bracelets. I'd love to understand how YOU currently use bracelets
so I can design something that works for you. Is now a good time?"
Question 1: "Tell me about your current bracelet collection.
How many do you have? What are they made of?"
Question 2: "How do you currently store or display them?
What works well? What's frustrating?"
Question 3: "If you could design the perfect bracelet holder,
what would it look like? What would it do?"
Question 4: "Are there any constraints I should know about?
(Size of your space, colors, budget, etc.)"
Question 5: "Who else might use this? How would their needs
differ from yours?"
Closing:
"Thank you for your time. I'll design based on what you've told me
and come back with a prototype for feedback."
Step-by-Step Interview Task
Duration: 15 minutes total
-
Prepare (5 min):
- Choose your stakeholder or use the scenario below
- Write 4-6 questions using the template above
- Explain the project and get permission to take notes
-
Conduct (10 min):
- Ask your prepared questions
- Write down specific details (numbers, names, quotes)
- Listen more than you talk
- Ask “Why?” when you hear interesting responses
-
Document (Immediately after):
- Write a 2-3 sentence summary
- Extract 3-5 key needs/constraints
- Identify any questions that still need answers
Scenario: If You Don’t Have a Real Stakeholder
Scenario: Meet Sarah, a jewelry enthusiast
Sarah has 15+ beaded bracelets but they’re tangled in a drawer. She wants to:
- Display them where she can see them
- Keep them organized by color/style
- Protect them from tangling
- Fit in a small space on her desk
Constraints:
- Budget: $15 materials cost
- Space: 6“ x 6“ footprint maximum
- Aesthetic: Minimalist, natural wood preferred
- Timeline: Needs it within 2 weeks
Part 2: Extract Functional Requirements (20-30 minutes)
From Interview to Requirements
A functional requirement is specific, measurable, and testable:
| Interview Data | [NO] Bad Requirement | [YES] Good Requirement |
|---|---|---|
| “I have 15 bracelets” | Lots of storage | Hold 15-20 bracelets without damage |
| “They’re tangled in my drawer” | Keep organized | Vertical hanging system to prevent tangling |
| “I want to see them” | Display feature | Visible from above (no lid) |
| “Minimalist, natural wood” | Nice looking | Wood construction, 2 colors, clean lines |
Functional Requirements Template
For your beaded jewelry holder, extract 5-8 requirements:
Functional Requirements:
1. Capacity: Hold _____ bracelets
2. Organization: Arrange by _____ (color/size/style)
3. Protection: Prevent _____ (tangling/damage)
4. Display: Visible from _____ (above/front/sides)
5. Dimensions: _____ mm wide, _____ mm deep, _____ mm tall
6. Material: _____ (wood/plastic/metal)
7. Accessibility: _____ (non-visual inspection method)
8. Durability: Withstand _____ (weight/use/time)
Measurable Acceptance Criteria
For each requirement, define how you’ll TEST it:
| Requirement | Measurement Method |
|---|---|
| Hold 15 bracelets | Count actual bracelets loaded; verify no deformation |
| Prevent tangling | Manual inspection: no twisting/knotting after 1 week storage |
| Dimensions | Measure with calipers; compare to design parameters |
| Wood material | Visual inspection; material weight check |
| Withstand weight | Load test: 2kg weight for 1 hour; check for deformation |
Part 3: Design the Bracelet Holder (30-40 minutes)
Design Strategy
Based on functional requirements, create a parametric SCAD model:
// Parametric Beaded Bracelet Holder
// Designed for: [Stakeholder name]
// Requirements: [List 3-5 key requirements]
// === PARAMETERS (from stakeholder requirements) ===
holder_width = 150; // mm - width for 15+ bracelets
holder_depth = 80; // mm - depth for stability
holder_height = 120; // mm - height for display
num_pegs = 16; // Number of hanging pegs
peg_diameter = 6; // mm - bracelet hang diameter
peg_spacing = holder_width / (num_pegs + 1);
// === DESIGN ===
module base() {
// Wooden-look base plate
cube([holder_width, holder_depth, 10]);
}
module back_wall() {
// Back support for stability
translate([0, 0, 10])
cube([holder_width, 5, holder_height]);
}
module hanging_pegs() {
// Pegs for bracelets to hang
for (i = [1 : num_pegs]) {
x_pos = peg_spacing * i;
translate([x_pos, holder_depth/2, holder_height - 20])
cylinder(r=peg_diameter/2, h=30, $fn=16);
}
}
module bracelet_holder() {
// Combine all components
union() {
base();
back_wall();
hanging_pegs();
}
}
// Main
bracelet_holder();
Customization Based on Stakeholder Feedback
Before printing, modify parameters:
Interview revealed:
- "15 bracelets is about right"
- "I like minimal spacing"
- "Natural wood color"
- "Small desk space - maybe 5 inches wide?"
Updated parameters:
num_pegs = 15; // Exact count for their collection
holder_width = 127; // 5 inches in mm
peg_spacing = holder_width / (num_pegs + 1);
Testing Non-Visually
# Describe the model to verify it matches requirements
3dm describe src/main.scad
# Expected output should mention:
# - 15 hanging pegs arranged horizontally
# - Base plate for stability
# - Back wall for support
# - Dimensions approximately 127mm x 80mm x 120mm
# Generate preview for tactile inspection
3dm preview src/main.scad
Part 4: Iterate Based on Feedback (20-30 minutes)
Feedback Loop
After printing a test version:
-
Measure physical parts:
# Use calipers to verify - Actual width: _____ mm (design: 127mm) - Actual peg diameter: _____ mm (design: 6mm) - Actual spacing: _____ mm -
Test with actual bracelets:
- Can 15 bracelets actually hang?
- Do they tangle?
- Do pegs support the weight?
- Is it stable on the desk?
-
Document feedback:
Test Results: - [YES] Holds 15 bracelets comfortably - Pegs slightly too thin (bracelets slip) - [YES] No tangling observed - Wobbles slightly - needs wider base Adjustments for v2: - Increase peg_diameter: 6mm -> 8mm - Increase base_depth: 80mm -> 100mm -
Iterate:
// Modified parameters for v2 peg_diameter = 8; // Thicker pegs (8mm instead of 6mm) holder_depth = 100; // Wider base (100mm instead of 80mm) -
Reprint and test:
- Does v2 address the issues?
- Any new problems?
- Is it ready for final design?
Accessible Iteration Tracking
Document all iterations in a spreadsheet or text file:
Version | Peg Size | Base Depth | Fits Bracelets | Stable | Notes
--------|----------|------------|----------------|--------|------
v1 | 6mm | 80mm | [YES] (14/15) | | Wobbles, pegs thin
v2 | 8mm | 100mm | [YES] (15/15) | [YES] | Perfect fit, stable
v3 | 8mm | 100mm | [YES] (15/15) | [YES] | With wood stain
Complete Project: Beaded Jewelry Bracelet Holder
Project Requirements
Objective: Design a customized bracelet holder based on an actual stakeholder’s needs.
Deliverables:
-
Interview Documentation (1-2 pages)
- 4-6 interview questions asked
- Stakeholder’s 3-5 key needs
- Extracted functional requirements
- Acceptance criteria for each requirement
-
Design SCAD File (
bracelet_holder.scad)- Parametric design with all requirements
- Clear parameters at top (easily customizable)
- Well-commented modules
- Matches stakeholder dimensions
-
Iteration Log (2-3 pages)
- Version 1 test results
- Feedback from stakeholder
- Changes made for v2
- Final design specifications
-
Printed Prototype (physical)
- Demonstrates final design
- Holds actual bracelets from stakeholder
- Passes all acceptance criteria
-
Final Documentation (1-2 pages)
- Design process summary
- Stakeholder feedback quotes
- Design decisions justified
- Lessons learned
Assessment Rubric (0-9 scale)
Problem & Solution (0-3 points)
- Stakeholder clearly identified and interviewed
- Requirements extracted from interview (not assumptions)
- Functional requirements are specific and measurable
Design & Code Quality (0-3 points)
- SCAD code is parametric and well-organized
- Design meets all extracted requirements
- Iterations show thoughtful refinement based on feedback
Documentation (0-3 points)
- Interview process clearly documented
- Design decisions justified with stakeholder feedback
- Iteration log shows testing methodology
- Accessible description of design (3dm describe output)
Quiz - Lesson 3dMake.11 (10 questions)
- What is the primary purpose of conducting stakeholder interviews before design1?
- Give one example of an open-ended interview question and one bad (leading) question1.
- What is the difference between a “need” and a “want” in the design context1?
- How do you convert interview data into functional requirements1?
- What is an acceptance criterion and why is it important2?
- Describe how you would test a bracelet holder’s capacity non-visually using measurements2.
- True or False: You can design a good product without talking to the person who will use it.
- Explain why iteration based on real feedback is better than guessing2.
- How would you document design changes in a way that’s accessible to non-visual users3?
- What should you do if your prototype fails a stakeholder’s test2?
Extension Problems (10)
- Conduct interviews with 3 different stakeholders for the bracelet holder; compare their requirements1.
- Design 3 different bracelet holder variants for different stakeholder types (minimalist, maximalist, travel-focused)1.
- Create a complete functional requirements document with measurable acceptance criteria1.
- Build and test 2 iterations of the bracelet holder; document all changes2.
- Develop a design specification document that someone else could follow to recreate your design3.
- Conduct a “design review” with your stakeholder; document their feedback and your responses1.
- Create a manufacturing specification: tolerances, materials, assembly instructions, quality checks2.
- Build a customer feedback tracking system; document what works and what could be improved1.
- Design an accessibility checklist for the bracelet holder: non-visual inspection, measurement-based testing, assembly ease3.
- Write a comprehensive design case study: from initial interview through final product, including all iterations, feedback, and lessons learned1 2 3.
Summary: From Interview to Design
The 11 lessons have taken you from beginner to advanced designer. This final lesson shows you that the best designs start with listening, not assuming.
The Full Journey
- Lessons 1-3: Foundation (setup, primitives, parametric code)
- Lessons 4-5: Verification & Safety (AI checking, physical safety)
- Lessons 6-7: Applied Projects (keycap, phone stand)
- Lesson 8: Advanced Design (tolerance, interlocking, complex assemblies)
- Lesson 9: Automation (batch processing, scripting)
- Lesson 10: Mastery (troubleshooting, QA, testing)
- Lesson 11: Leadership (listening to stakeholders, designing for real users)
Next Steps After This Lesson
You’re now ready for:
- [YES] Professional product design workflows
- [YES] Customer-driven development
- [YES] Small-batch manufacturing
- [YES] Open-source design contributions
- [YES] Teaching others these skills
References
-
Design Thinking Process - IDEO - https://www.ideo.com/perspectives/design-thinking ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Functional Requirements in Product Design - https://www.productschool.com/blog/requirements/ ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Accessible Design Documentation - https://www.a11y-101.com/design/inclusive-documentation ↩ ↩2 ↩3 ↩4 ↩5
Stakeholder Interview Template
Structured interview guide for gathering requirements directly from end-users and stakeholders.
Pre-Interview Preparation
Interview Details:
- Date: _________________________
- Time: _________________________
- Location: _________________________
- Stakeholder Name: _________________________
- Role/Title: _________________________
- Contact: _________________________
Interview Objective: (What do you specifically want to learn?)
Estimated Duration: 45-60 minutes
Interview Sections
Section 1: Context & Background (5 minutes)
Opening Questions:
-
“Tell me about your role in this project.”
-
-
“What problem are we trying to solve?”
-
-
“Who else will be affected by this design?”
-
Section 2: Current Situation (10 minutes)
Current Process:
-
“How do you currently solve this problem?”
-
-
“What works well about the current approach?”
-
-
“What frustrates you most about the current process?”
-
Pain Points:
- Primary issue: _______________________________________________________
- Secondary issues: ___________________________________________________
Section 3: Ideal Solution (15 minutes)
Requirements (Ask open-ended):
-
“Ideally, what would this solution do?”
-
-
“How would you use it?”
-
-
“Where would it be used?”
-
-
“When would it be needed?”
-
Specific Constraints:
- Size requirements: _____________________________________________________
- Weight constraints: ____________________________________________________
- Temperature tolerance: _________________________________________________
- Durability needs: ______________________________________________________
- Cost budget: __________________________________________________________
- Timeline: _____________________________________________________________
Section 4: Usage Patterns (10 minutes)
Frequency & Scale:
-
“How often would this be used?”
- Daily [ ] Weekly [ ] Monthly [ ] Occasionally
-
“How many people need this?”
-
-
“For how long each use?”
-
User Profile:
- Physical capabilities: _______________________________________________
- Technical expertise: _________________________________________________
- Accessibility needs: _________________________________________________
Section 5: Success Criteria (10 minutes)
What defines success?
How will you measure if this works?
- Metric 1: __________________________________________________________
- Metric 2: __________________________________________________________
What would be a failure?
Section 6: Preferences & Priorities (10 minutes)
Priority Ranking (Ask: “If you could only have 3 features, which would they be?”)
- _________________________________________________________________ (Priority: __ /10)
- _________________________________________________________________ (Priority: __ /10)
- _________________________________________________________________ (Priority: __ /10)
Style/Aesthetic:
- Preferred look: ____________________________________________________
- Must fit with existing: _______________________________________________
- Any visual requirements: _____________________________________________
Material/Finish:
- Preferred materials: ________________________________________________
- Texture preference: ___________________________________________________
- Color preferences: ____________________________________________________
Follow-Up Questions
Dig deeper on key points:
- “Tell me more about that…”
- “Why is that important?”
- “What would happen if that weren’t included?”
- “Can you give me an example?”
- “How would you compare that to…?”
Accessibility Considerations
Always Ask:
- “Are there any accessibility requirements?”
- “Will this be used by people with different abilities?”
- “Are there sensory, mobility, or cognitive considerations?”
- “What assistive devices might be used with this?”
Document:
- Visual considerations: _______________________________________________
- Motor/dexterity needs: ________________________________________________
- Hearing/audio considerations: _________________________________________
- Cognitive/learning preferences: _______________________________________
Post-Interview Notes
Key Takeaways:
Action Items:
- _________________________________________________________________
- _________________________________________________________________
Questions to Follow Up On:
Conflicts/Concerns:
Next Steps:
Interview Analysis
After conducting multiple interviews, summarize:
Common Themes
(What requirements appeared in multiple interviews?)
Conflicting Requirements
(What requirements contradicted each other?)
- Stakeholder 1 wants: _______________________________________________
- Stakeholder 2 wants: _______________________________________________
- Resolution: __________________________________________________________
Risk Areas
(What might be difficult or risky about this project?)
Interview Conducted By: _____________________ Date Documented: _____________________ Approved By Stakeholder: _____ (signature/name)
Functional Requirements Template
Document and organize functional requirements derived from stakeholder interviews and research.
Project Information
- Project Name: _________________________
- Version: _________________________
- Date Created: _________________________
- Last Updated: _________________________
- Prepared By: _________________________
- Approved By: _________________________
Executive Summary
Project Description: (One paragraph overview of what this project is about)
Business/User Need: (Why is this project important?)
Stakeholders:
- Primary user: _____________________________________________________
- Secondary users: __________________________________________________
- Decision makers: __________________________________________________
Functional Requirements
Organization Strategy
Requirements organized by:
- User role/perspective
- Feature/component
- Priority level
- Other: _______________
Primary Functional Requirements
Core features that define the product
FR1: [Feature Name]
Priority: [ ] Critical [ ] High [ ] Medium [ ] Low
Description: What the product must do:
User Stories:
-
“As a [user type], I want to [action] so that [benefit]”
-
-
“As a [user type], I want to [action] so that [benefit]”
-
Acceptance Criteria:
- _________________________________________________________________
- _________________________________________________________________
- _________________________________________________________________
Related Requirements: ____________________________________
FR2: [Feature Name]
Priority: [ ] Critical [ ] High [ ] Medium [ ] Low
Description:
User Stories:
Acceptance Criteria:
- _________________________________________________________________
- _________________________________________________________________
Related Requirements: ____________________________________
FR3: [Feature Name]
(Continue with additional primary requirements)
Secondary Functional Requirements
Important supporting features
FR-S1: [Feature Name]
Priority: [ ] High [ ] Medium [ ] Low
Description:
Acceptance Criteria:
- _________________________________________________________________
- _________________________________________________________________
FR-S2: [Feature Name]
(Continue with secondary requirements)
Non-Functional Requirements
Performance, reliability, and design properties
Performance Requirements
- Response time: ___________________________________________________
- Throughput: _______________________________________________________
- Resource usage: ___________________________________________________
Reliability Requirements
- Failure rate acceptable: _____________________________________________
- Recovery capability: _________________________________________________
- Data persistence: ___________________________________________________
Physical Requirements (for 3D printed objects)
- Dimensions: ________________________________________________________
- Weight capacity: ____________________________________________________
- Material properties: __________________________________________________
- Temperature range: __________________________________________________
- Durability: ________________________________________________________
Accessibility Requirements
-
Usable by people with visual impairment
- How: __________________________________________________________
-
Usable by people with motor impairment
- How: __________________________________________________________
-
Usable by people with hearing impairment
- How: __________________________________________________________
-
Usable by people with cognitive differences
- How: __________________________________________________________
Constraint Requirements
Limitations on design and implementation
Technical Constraints
- Must work with: ____________________________________________________
- Must not require: __________________________________________________
- Must be compatible with: ____________________________________________
Physical Constraints
- Cannot exceed (size/weight/cost): _____________________________________
- Must fit in/with: ___________________________________________________
- Must be available by (date): _________________________________________
Regulatory/Safety Constraints
- Must comply with: __________________________________________________
- Must not: __________________________________________________________
- Safety considerations: _______________________________________________
Cost Constraints
- Maximum budget: ____________________________________________________
- Target unit cost: ___________________________________________________
Environmental Context
Use Environment
- Location(s): _______________________________________________________
- Climate conditions: _________________________________________________
- Physical surroundings: _______________________________________________
- Typical usage pattern: _______________________________________________
Maintenance & Lifecycle
- Expected lifespan: __________________________________________________
- Maintenance needed: ________________________________________________
- End-of-life handling: ________________________________________________
Dependency Mapping
Requirements that depend on other requirements:
| Requirement | Depends On | Notes |
|---|---|---|
| FR1 | ||
| FR2 | FR1 | Cannot implement without FR1 |
| FR3 |
External dependencies:
- Third-party components needed: ________________________________________
- Integration points: __________________________________________________
Scope Definition
What IS In Scope
What IS NOT In Scope
Future Considerations (Out of Scope but noted)
Change Control
Requirements Changes:
| Change Request | Date | Reason | Status |
|---|---|---|---|
Verification Plan
How will we verify each requirement is met?
| Requirement | Verification Method | Test Case | Status |
|---|---|---|---|
| FR1 | [Inspection/Test/Demo] | ||
| FR2 | [Inspection/Test/Demo] |
Sign-Off
Stakeholder Approval:
| Stakeholder | Title | Signature | Date |
|---|---|---|---|
Requirements Baseline Approved: Date: ____________ Status: Approved / Pending / Rejected
Reference Documents
- Interview notes: ____________________________________________________
- Design sketches: ____________________________________________________
- Related specifications: _______________________________________________
- Standards/guidelines: ________________________________________________
Document Version History:
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | Initial draft | ||
Design Specification Template
Technical design document specifying how requirements will be implemented.
Design Document Information
- Project: _________________________
- Design Version: _________________________
- Date: _________________________
- Designed By: _________________________
- Reviewed By: _________________________
Design Overview
Problem Statement: (What are we solving?)
Solution Approach: (High-level how we’ll solve it)
Key Design Decisions:
Component Breakdown
Component 1: [Component Name]
Purpose:
Specifications:
- Dimensions: ________________________________________________________
- Material: __________________________________________________________
- Quantity: __________________________________________________________
Design Rationale: (Why this approach?)
Related Components:
- Connects to: _______________________________________________________
- Interfaces with: ____________________________________________________
Manufacturing Considerations:
- Support structures needed: ___________________________________________
- Orientation for print: _______________________________________________
- Estimated print time: _______________________________________________
Component 2: [Component Name]
(Repeat structure for each component)
Assembly Design
Overall Assembly Structure: (How components fit together)
Assembly Sequence:
Fastening Methods:
- Snap fits (location: ___________________________________)
- Threaded inserts (quantity: ______)
- Glue/adhesive (type: ________________)
- Other: _______________________________________________________
Assembly Challenges & Solutions:
- Challenge: _________________________________________________________ Solution: __________________________________________________________
Material Selection
Primary Material: ______________________________________________
Why this material?
| Property | Requirement | Selected Material | Alternative |
|---|---|---|---|
| Strength | |||
| Flexibility | |||
| Temperature | |||
| Cost | |||
| Availability |
Material Properties:
- Nozzle temperature: ______________________________________________
- Bed temperature: __________________________________________________
- Print speed: _______________________________________________________
- Support required: __________________________________________________
- Post-processing: __________________________________________________
Material Alternatives & Trade-offs:
- Option 1: _________________________________________________________
- Option 2: _________________________________________________________
- Selected option rationale: ___________________________________________
Design Features
Feature 1: [Feature Name]
Purpose:
Design Details:
- Dimensions: ________________________________________________________
- Placement: _________________________________________________________
- Tolerances: ________________________________________________________
Rationale: (Why designed this way?)
Related Requirement: (Which requirement does this fulfill?)
Feature 2: [Feature Name]
(Repeat for each significant feature)
Tolerance & Fit Analysis
Critical Dimensions:
| Dimension | Tolerance | Rationale | Risk |
|---|---|---|---|
| +/-_mm | |||
| +/-_mm |
Fit Relationships:
- Part A to Part B: _____________________________________________________
- Part B to Part C: _____________________________________________________
Validation Plan:
- Print test version before production
- Measure critical dimensions
- Test assembly fit
- Perform functional test
Manufacturing Planning
Print Parameters
Slicer Settings:
- Layer height: ______________________________________________________
- Infill: ____________________________________________________________
- Support material: __________________________________________________
- Raft/brim: _________________________________________________________
Print Time & Material:
- Estimated time: ____________________________________________________
- Material weight: ___________________________________________________
- Cost estimate: _____________________________________________________
Orientation Strategy: (How will this be oriented during printing?)
- Rationale: _________________________________________________________
- Risks: _____________________________________________________________
- Mitigation: ________________________________________________________
Post-Processing
Cleanup:
- Remove supports (method: ______________________________________)
- Remove raft/brim (method: _____________________________________)
- Sand edges (grit: _____________)
- Smooth surfaces (method: _______________________________________)
Finishing:
- Paint/coat (type: ____________________________________________)
- Treat for durability: __________________________________________
- Inspect quality: ________________________________________________
Assembly Work:
- Insert threaded nuts/inserts
- Assemble components
- Test functionality
Estimated Total Time: ____________ hours
Testing Plan
Functionality Tests:
| Test | Method | Pass Criteria | Status |
|---|---|---|---|
Durability Tests:
- Stress test: _______________________________________________________
- Environmental exposure: ____________________________________________
- Lifecycle test: _____________________________________________________
Tolerance Verification:
- Measure key dimensions
- Compare to specification
- Document variance
Design Risks & Mitigation
Risk 1:
- Description: _______________________________________________________
- Probability: [ ] High [ ] Medium [ ] Low
- Impact: [ ] Critical [ ] Major [ ] Minor
- Mitigation: ________________________________________________________
- Contingency: _______________________________________________________
Risk 2: (Continue for identified risks)
Design Alternatives Considered
Alternative 1:
- Approach: _________________________________________________________
- Pros: ______________________________________________________________
- Cons: ______________________________________________________________
- Why not selected: __________________________________________________
Alternative 2: (Continue for each alternative considered)
Technical Specifications
Dimensional Drawing Reference
(Attach or describe detailed drawings/models)
- CAD file: __________________________________________________________
- Drawing revision: __________________________________________________
Performance Specifications
- Load capacity: _____________________________________________________
- Temperature range: _________________________________________________
- Lifespan: __________________________________________________________
- Accuracy/precision: ________________________________________________
Bill of Materials (BOM)
| Item | Part # | Quantity | Unit Cost | Notes |
|---|---|---|---|---|
| 3D Printed Main Body | - | 1 | $0.XX | PLA |
Total Material Cost: $__________
Design Verification Checklist
Before manufacturing:
- All components specified
- Material selected and justified
- Assembly method documented
- Tolerances verified
- Manufacturing plan complete
- Testing approach defined
- Risks documented
- Cost estimates calculated
- Timeline realistic
- Design approved by stakeholders
Design Change Log
| Change # | Date | Description | Reason | Impact |
|---|---|---|---|---|
Sign-Off
Design Approval:
| Role | Name | Signature | Date |
|---|---|---|---|
| Designer | |||
| Reviewer | |||
| Stakeholder |
Status:
- Approved - Ready for manufacturing
- Approved with conditions: ________________________________
- Not approved - Revisions needed: ____________________________
Appendices
- Appendix A: Detailed CAD Models
- Appendix B: Assembly Instructions
- Appendix C: Material Data Sheets
- Appendix D: Test Reports
Feedback Collection Template
Structured approach to gathering and analyzing feedback from users and stakeholders throughout the design process.
Feedback Collection Strategy
Collection Points:
- Prototype testing (early design)
- Mid-development review
- Beta testing (near completion)
- Post-launch review
- Long-term usage feedback
Target Audience:
- Primary users: _____________________________________________________
- Secondary users: ___________________________________________________
- Stakeholders: _______________________________________________________
Prototype Feedback Form
Feedback Session Information
- Feedback Date: _________________________
- Tester Name: _________________________
- Tester Role: _________________________
- Prototype Version: _________________________
- Session Duration: _________________________
Section 1: First Impressions (5 minutes)
Initial Reactions:
-
“What is your first impression of this design?”
-
-
“Is it what you expected?”
- More than expected [ ] As expected [ ] Less than expected
- Explanation: ________________________________________________
-
“Would you use this?”
- Definitely [ ] Maybe [ ] No [ ] Not sure
- Why? __________________________________________________________
Section 2: Usability (15 minutes)
Using the Product:
-
“Can you show me how you would use this?”
- (Observe: difficulties, hesitations, confusion)
- Notes: _________________________________________________________
-
“Was it easy to understand how to use?”
- Very easy [ ] Easy [ ] Neutral [ ] Difficult [ ] Very difficult
- What was confusing? _______________________________________________
-
“Are there any parts that don’t work well together?”
-
Specific Usability Issues:
| Issue | Severity | Suggestion |
|---|---|---|
| High/Med/Low | ||
| High/Med/Low |
Section 3: Functionality Assessment (10 minutes)
Does it do what it’s supposed to?
| Feature/Function | Works Well | Works OK | Doesn’t Work | Needed But Missing |
|---|---|---|---|---|
| - | ||||
| - | ||||
| - |
Critical Functions:
- Most important for your use: ________________________________________
- Missing capability: _________________________________________________
Section 4: Physical Design Assessment (10 minutes)
Appearance & Feel:
Visual Design:
- Appealing [ ] Acceptable [ ] Unappealing [ ] Doesn’t matter
- Suggestions: _______________________________________________________
Size & Comfort:
- Too large / Just right / Too small (circle one)
- Weight: Too heavy / Just right / Too light (circle one)
- Comfort feedback: __________________________________________________
Material & Texture:
- Appropriate: [ ] Yes [ ] No [ ] Uncertain
- Feel: _____________________________________________________________
- Durability concern: _________________________________________________
Color/Finish:
- Appropriate: [ ] Yes [ ] No
- Preference: ________________________________________________________
Section 5: Performance & Reliability (10 minutes)
During Testing:
-
“Did it work consistently?”
- Always [ ] Usually [ ] Sometimes [ ] Never
- Issues experienced: ______________________________________________
-
“How solid/durable does it feel?”
- Very durable [ ] Durable [ ] Adequate [ ] Fragile [ ] Very fragile
- Concerns: _______________________________________________________
-
“Any parts that seem weak?”
-
Section 6: Overall Satisfaction (5 minutes)
Scoring Matrix:
| Criterion | Rating | Comments |
|---|---|---|
| Overall satisfaction | 1 2 3 4 5 | |
| Likely to recommend | 1 2 3 4 5 | |
| Meets my needs | 1 2 3 4 5 | |
| Design quality | 1 2 3 4 5 | |
| Value for cost | 1 2 3 4 5 |
(1=Poor, 5=Excellent)
Section 7: Suggestions & Improvements (10 minutes)
Open-Ended Feedback:
-
“What would make this better?”
-
-
“What should we change?”
-
-
“What should we keep as-is?”
-
-
“Would you buy/use this?”
- Yes [ ] Maybe [ ] No
- Why? __________________________________________________________
Suggestions Priority:
| Suggestion | Priority | Category | Effort |
|---|---|---|---|
| High/Med/Low | Design/Function/Material | Easy/Med/Hard | |
| High/Med/Low | Design/Function/Material | Easy/Med/Hard |
Section 8: Accessibility Check (5 minutes)
If applicable to your product:
-
“Can someone with limited vision use this?”
- Yes [ ] With difficulty [ ] No
- How: __________________________________________________________
-
“Can someone with limited mobility use this?”
- Yes [ ] With difficulty [ ] No
- How: __________________________________________________________
-
“Are there any accessibility barriers?”
-
Post-Testing Notes
Tester Behavior Observations: (What did you notice about how they used it?)
Surprises: (Anything unexpected?)
Key Insights:
Critical Issues Found:
Non-Critical Issues:
Feedback Analysis (After Multiple Sessions)
Common Themes
Frequently Mentioned Issues:
- _________________________________________ (Mentioned by ___ of ___% testers)
- _________________________________________ (Mentioned by ___ of ___%)
- _________________________________________ (Mentioned by ___ of ___%)
Frequently Praised Aspects:
Data Summary
| Metric | Average | Range | Status |
|---|---|---|---|
| Overall Satisfaction | ___/5 | - | // |
| Likelihood to Recommend | ___/5 | - | // |
| Meets Needs | ___/5 | - | // |
| Usability Rating | ___/5 | - | // |
Priority Action Items
Must Fix (High Priority - blocks usage):
-
- Impact if not fixed: ______________________________________________
-
- Impact if not fixed: ______________________________________________
Should Fix (Medium Priority - improves experience):
Nice to Have (Low Priority - enhancements):
Design Changes Resulting from Feedback
| Original Design | Feedback | Change Made | Rationale |
|---|---|---|---|
Follow-Up Actions
Immediate Actions:
- Fix critical issues: _______________________________________________
- Notify stakeholders: ______________________________________________
- Update design document: ___________________________________________
Next Test Cycle:
- Schedule follow-up testing
- Prepare updated prototype
- Revise feedback form if needed
Timeline for Changes:
- Critical fixes by: ___________________________________________________
- Medium priority by: __________________________________________________
- Low priority by: ____________________________________________________
Stakeholder Communication
Share findings with:
- Design team
- Stakeholders
- User community
- Management
Format for sharing:
- Summary report
- Presentation
- Video highlights
- Detailed documentation
Feedback Tracking
Overall Feedback Summary:
| Test Round | Date | # Testers | Key Finding | Action Taken |
|---|---|---|---|---|
| Prototype V1 | ||||
| Prototype V2 | ||||
| Beta |
Sign-Off
Feedback Session Conducted By: ____________________ Analysis Completed By: ____________________ Reviewed By: ____________________
Status:
- Feedback incorporated into design
- Partial incorporation (note: __________________________)
- Under review (decision pending)
- Declined (reason: _______________________________________)
Session Documentation Date: ____________________ Feedback Database Location: ____________________
Master Project Rubric - 0-9 Point Scale
This rubric applies to all Unit 1, 2, and 3 projects unless otherwise noted in the project briefing. Project 0 is complete/incomplete only.
Rubric Overview
Projects are scored from 0-9 across three categories worth 3 points each:
| Category | Max Points | What Is Evaluated |
|---|---|---|
| Problem & Solution | 3 | How well the prototype meets the identified problem or functional requirements |
| Design Quality | 3 | Complexity, originality, technical quality of the design; evidence of iteration |
| Documentation | 3 | Completeness, accuracy, and thoughtfulness of all written deliverables |
Category 1: Problem & Solution (0-3 points)
| Score | Description |
|---|---|
| 3 | The prototype clearly and effectively solves the stated problem. All functional requirements are met. The solution shows evidence of testing against the requirements. |
| 2 | The prototype mostly meets the problem. Most functional requirements are met. Minor gaps between the design and the requirements. |
| 1 | The prototype partially addresses the problem. Several functional requirements are not met or were not clearly tested. |
| 0 | The prototype does not address the stated problem, or no functional requirements were established. |
Category 2: Design Quality (0-3 points)
| Score | Description |
|---|---|
| 3 | The design is original, well-considered, and technically executed. Code (if applicable) is clean, uses variables/modules appropriately, and is well-commented. The print is clean and well-made. Evidence of at least one meaningful revision or iteration. |
| 2 | The design is functional and shows thought. Code works but may lack structure (few comments, raw numbers instead of variables). Print quality is acceptable. Some iteration evident. |
| 1 | The design is basic or primarily borrowed from another source without modification. Code has issues. Print quality has significant defects that were not addressed. |
| 0 | No meaningful original design. Print is not functional or was not completed. |
Category 3: Documentation (0-3 points)
| Score | Description |
|---|---|
| 3 | All required sections are present, complete, and specific. Reflections are thoughtful and reference specific decisions, problems encountered, and learning. Photos are included. Measurements are recorded. |
| 2 | Most required sections are present. Some sections are vague or missing detail. Reflections show some thought but are brief or generic. |
| 1 | Documentation is incomplete. Major sections are missing or consist of one-line responses. Reflections are minimal. |
| 0 | Documentation is not submitted or is essentially empty. |
Score Interpretation
| Total Score | Interpretation | Next Step |
|---|---|---|
| 8-9 | Excellent work | Move on to next project |
| 6-7 | Good work with room for improvement | Move on; instructor may suggest revisiting one element |
| 4-5 | Meets basic expectations | Resubmission of specific weak areas recommended |
| 2-3 | Does not meet expectations | Resubmission required |
| 0-1 | Missing major deliverables | Meet with instructor; create a completion plan |
Resubmission Policy
Students may resubmit any project as many times as they need to improve their score. Resubmissions must include:
- A one-paragraph explanation of what was changed and why
The resubmission score replaces the original score.
Project 3: Beaded Jewelry - OpenSCAD Design
Accessibility: When including images or diagrams, add short alt-text and provide a comment-based walkthrough for any .scad examples so screen-reader users can follow the design steps.
Unit: 3 - Open-Ended Projects Estimated Duration: 1 week (self-paced: plan milestones below) Deliverables due: End of week (see milestones)
Project Brief
Design and produce a wearable beaded jewelry piece that includes at least eight 3D-printed beads generated in OpenSCAD. Your design must use two distinct parametric bead modules and combine them into a completed, wearable piece (necklace, bracelet, or similar).
Constraints (must follow)
- Your prototype must include a 3D-printed component designed in OpenSCAD.
- Code your project in a single
.scadfile that parameterizes bead shapes for repeatability. - Use at least two different bead shapes in the final assembly.
- The final piece must be wearable and assembled - not just a set of loose beads.
Learning Objectives
- Create parametric OpenSCAD modules for repeated geometry
- Combine modular parts into a coherent assembled object
- Document design decisions and printing notes for reproducibility
- Evaluate designs against measurable functional requirements
StepbyStep Milestones
- Project setup (Day 1)
- Read this briefing and the Unit 3 lessons.
- Create a folder for your project and initialize a short Design Notes document.
- Bead module development (Days 1-2)
- Implement
bead_A(size, detail)andbead_B(size, detail)parametric modules. - Test-print a single bead from each module; record optimal print temperature/bed settings.
- Assembly and iteration (Days 3-4)
- Create an assembly script that arranges at least 8 beads and tests fit/tolerances.
- Iterate bead hole diameter and test-strung spacing until beads slide but do not fall off.
- Final prototype & documentation (Day 5)
- Print final beads, assemble the piece, photograph the result, and prepare the deliverables.
Deliverables
Submit both digitally and physically as instructed:
.scadfile containing parametric bead modules and the assembly script.stlfiles (exported as needed) for printed parts- Technical documentation (Google Drive link or similar) including:
- Design Notes (ideas, measurements, param values)
- Construction / 3D printing notes (temperatures, speeds, supports)
- Photos of final prototype (multiple views)
- Physical turn-in: one assembled piece (if required by instructor)
Functional Requirements (examples - adapt to your design)
- The bead module must allow a hole diameter adjustable in 0.1 mm increments between 2.0-4.0 mm.
- The assembly must include at least 8 beads and remain wearable (fits comfortably on intended body part).
- The OpenSCAD file must be parameterized such that changing a single
scaleparameter adjusts bead size consistently. - The assembled piece must not have sharp edges that would injure skin under normal use.
Grading Rubric (simplified, 0-9 scale)
- Implementation & parametric code: 3 points
- Functionality & wearability: 3 points
- Documentation & print notes: 2 points
- Presentation & photos: 1 point
Quiz - Project 3: Beaded Jewelry (10 questions)
- Why use parametric modules for repeated parts? (one sentence)
- What is a reliable way to test a bead hole for a given cord diameter?
- Name two OpenSCAD functions or techniques useful for repeating geometry.
- What printing setting is most likely to affect hole diameter accuracy?
- How would you document an iteration that changed hole diameter from 2.5 mm to 2.7 mm?
- True/False: Once your first bead prints successfully, all subsequent iterations will print exactly the same. (Answer: False - each print can vary due to temperature, humidity, and material batch differences)
- Short answer: Explain what “wearability” means for a jewelry design. What are two specific checks you would perform to confirm a necklace is comfortable to wear?
- Practical scenario: Your bead design uses a 3 mm hole diameter. When you string it on a cord, it’s too tight and won’t slide. What are two possible solutions you could implement in OpenSCAD to fix this?
- Multiple choice: When documenting your design for reproducibility, what should you record? (A) Final bead dimensions only (B) All design iterations, parameter changes, and failed attempts (C) Just the successful version - Answer: B
- Reflection: Describe how the iterative design process (design -> print -> test -> modify) applies specifically to creating a functional wearable. Why is rapid testing and documentation critical for jewelry design?
Answer key (instructor use):
- To allow repeatable, adjustable geometry and quick global changes.
- Print a small tolerance test piece and measure fit; record results.
for()loops,moduleparameters,translate()androtate();scale().- Nozzle diameter and extrusion multiplier; also bridging/cooling.
- Note the parameter change, reproduce the print settings, measure and record fit, update Design Notes.
Extension Problems (apply project skills)
- Design an interlocking bead (snap-fit) and describe the tolerances required.
- Create a parametric clasp module that integrates with your bead string and documents a pass/fail test.
- Modify one bead to include decorative text or pattern generated procedurally in OpenSCAD.
- Convert your single
.scadproject into a small library: separate bead modules into include files and demonstrate reuse. - Propose a modification to make the piece weather-resistant for outdoor wear (materials, coatings, or geometry).
- Design and print a complete jewelry set: matching beads, clasp, and string connector with consistent design language.
- Create a variant generator that produces 10+ different bead designs with single-parameter changes; document aesthetic and functional differences.
- Build a design system document for your jewelry: modular bead library, material requirements, assembly instructions, and care guide.
- Investigate material effects: print the same bead in 2+ materials; compare durability, aesthetic, and wearability.
- Develop a parametric customization guide: enable users to modify size, spacing, color (if multi-material), and aesthetics through top-level variables.
Submission Instructions
Upload your digital deliverables to the course Drive folder and email the instructor with the link; bring the printed prototype to class on the due date.
Accessibility
Provide alt-text for photos and a short written walkthrough of how your .scad file generates the bead shapes so screen-reader users can understand the sequence and parameters.
Notes
The attached asset project_3_briefing.txt was used as the source. If you want me to also copy the original .txt into a .bak in the same folder, I can do that - tell me and I’ll create an adjacent .bak file.
3dMake Foundation Final Exam
Name: _________________________ | Date: ____________
Total Points: 100 (4 points per problem)
Instructions:
- Answer all 25 questions
- For code errors, identify the specific problem and explain why it’s wrong
- For behavioral questions, show your reasoning
- For design problems, explain your approach and why it solves the stated challenge
- You may reference the OpenSCAD documentation and appendices
- All work must be your own
Section 1: Error Detection & Code Analysis (Problems 1-10)
For each code block, identify any errors. If there is an error, explain what’s wrong and how to fix it. If the code is correct, state “No error” and explain what the code does.
Problem 1: Primitive Definition Error
cube([10, 10, 10], center=true);
sphere(r=5, $fn=16);
cylinder(h=20, r=8);
Question: Is there an error in this code? If yes, identify it. If no, explain what this code renders.
Answer: ________________________________________________________________
Problem 2: Transform Syntax Error
translate([5, 5, 0])
rotate([0, 45, 0])
cube([10, 10, 10], center=true);
Question: Does this code have a syntax error? Explain what this code does.
Answer: ________________________________________________________________
Problem 3: CSG Operation Error
cube([20, 20, 20], center=true);
difference() {
sphere(r=12);
cylinder(h=30, r=5, center=true);
}
Question: What is wrong with this CSG operation? Explain the fix.
Answer: ________________________________________________________________
Problem 4: Module Definition Error
module bracket(width, height, depth) {
cube([width, height, depth], center=true);
translate([width/2 + 2, 0, 0])
cube([4, height, depth/2], center=true);
}
bracket(20, 15, 10);
Question: Is there an error in this module definition or call? Why or why not?
Answer: ________________________________________________________________
Problem 5: Parameter & Variable Scoping Error
wall_thickness = 2;
module hollow_cube(size) {
difference() {
cube([size, size, size], center=true);
cube([size - wall_thickness, size - wall_thickness, size - wall_thickness], center=true);
}
}
hollow_cube(20);
Question: Will this code work correctly? If not, what is the problem and how would you fix it?
Answer: ________________________________________________________________
Problem 6: Loop & Iteration Error
for (i = [0:5:20]) {
translate([i, 0, 0])
cube([4, 4, 4]);
}
Question: Will this code produce 5 cubes? Show the positions and explain why or why not.
Answer: ________________________________________________________________
Problem 7: Center Parameter Misunderstanding
cube([10, 10, 20], center=false);
sphere(r=5);
Question: What is the relationship between these two shapes? Where would the sphere appear relative to the cube?
Answer: ________________________________________________________________
Problem 8: Intersection Error
intersection() {
cube([20, 20, 20], center=true);
sphere(r=8, $fn=32);
}
Question: Is there an error? What will this code render?
Answer: ________________________________________________________________
Problem 9: Nested Transform Error
translate([10, 0, 0])
rotate([0, 0, 45])
translate([5, 0, 0])
cube([5, 5, 5], center=true);
Question: Are the transforms applied in the correct order? Trace the final position of the cube.
Answer: ________________________________________________________________
Problem 10: Resolution Parameter Error
sphere(r=10, $fn=4);
cylinder(h=20, r=8, $fn=3);
cube([10, 10, 10]);
Question: Identify the problem(s) with resolution in this code. What will happen when rendered?
Answer: ________________________________________________________________
Section 2: Code Behavior & Theory (Problems 11-17)
For each question, show your reasoning. You may draw diagrams if helpful.
Problem 11: Vertex Coordinates
Question: A cube is defined as cube([10, 10, 20], center=false).
a) List the XYZ coordinates of all 8 vertices.
Answer:
- Vertex 1: _______________
- Vertex 2: _______________
- Vertex 3: _______________
- Vertex 4: _______________
- Vertex 5: _______________
- Vertex 6: _______________
- Vertex 7: _______________
- Vertex 8: _______________
b) Now define the SAME cube with center=true. List the NEW coordinates of all 8 vertices.
Answer:
- Vertex 1: _______________
- Vertex 2: _______________
- Vertex 3: _______________
- Vertex 4: _______________
- Vertex 5: _______________
- Vertex 6: _______________
- Vertex 7: _______________
- Vertex 8: _______________
Problem 12: Sphere Geometry
Question: Explain the difference between sphere(r=10, $fn=8) and sphere(r=10, $fn=128).
Which would you use for a prototype and which for final printing? Why?
Answer: ________________________________________________________________
Problem 13: Transform Order
Question: Given this code:
translate([10, 0, 0])
rotate([0, 0, 45])
cube([5, 5, 5], center=true);
Does the order matter? What if you swap translate and rotate? Show both final positions.
Answer: ________________________________________________________________
Problem 14: Boolean Operation Behavior
Question: You have a solid cube and you want to create a hole through it. Which CSG operation would you use: union(), difference(), or intersection()?
Explain your choice and write pseudocode showing how you’d accomplish this.
Answer: ________________________________________________________________
Problem 15: Parametric Design Advantage
Question: Compare these two approaches:
Approach A: Hard-coded cube with fixed dimensions
cube([10, 10, 20]);
Approach B: Parametric cube
module parametric_box(width, height, depth) {
cube([width, height, depth], center=true);
}
parametric_box(10, 10, 20);
Why is Approach B better for design iteration? Give an example of how you’d use it.
Answer: ________________________________________________________________
Problem 16: Scale Transform Behavior
Question: If you apply scale([2, 1, 0.5]) to a cube([10, 10, 10], center=true), what are the NEW dimensions of the cube?
Answer: New dimensions: _______________
Show your calculation:
Problem 17: Library Organization
Question: You’ve created three useful modules:
bracket(width, height, depth)hollow_cube(size, wall_thickness)connector_pin(diameter, height)
How would you organize these into a reusable library? What file structure would you create and why?
Answer: ________________________________________________________________
Section 3: Design & Problem-Solving (Problems 18-25)
These problems test your ability to design solutions, debug real-world issues, and think creatively.
Problem 18: Tolerance Design Challenge
Question: You’re designing a snap-fit connector. The male part has a thickness of 2mm. The female slot needs to accommodate this part with enough flexibility to snap but not fall out.
Should the slot be: a) Exactly 2mm wide b) 2.1mm wide c) 1.9mm wide d) 2.5mm wide
Explain your choice and the design thinking behind it.
Answer: ________________________________________________________________
Problem 19: Design Iteration Problem
Question: You print a keycap with key_size=12 and the text embossing is too shallow to feel. Your code uses:
linear_extrude(height=1)
text("A", size=8);
What parameter(s) would you adjust to make the embossing deeper? Show your new code.
Answer: ________________________________________________________________
Problem 20: Error Diagnosis
Question: Your 3dMake build fails with this error: “Geometry is non-manifold.” You have this code:
difference() {
cube([20, 20, 20], center=true);
cylinder(h=30, r=4, center=true);
}
Why might this fail? What’s the common fix for non-manifold geometry?
Answer: ________________________________________________________________
Problem 21: Multi-Part Assembly
Question: You’re designing a two-part box (lid + base). The base has dimensions [50, 30, 20]. The lid should sit on top of the base.
Write parametric modules for both parts and show how you’d position them together. Include appropriate positioning logic.
Answer:
module base(length, width, height) {
// Your code here
}
module lid(length, width, height) {
// Your code here
}
// Positioning code here:
Problem 22: Optimization Challenge
Question: You have a design that takes 5 minutes to render. You notice you have:
sphere(r=10, $fn=256);
cylinder(h=20, r=8, $fn=256);
cube([20, 20, 20]);
Which parameter(s) would you reduce to speed up rendering while maintaining acceptable quality for a prototype? Explain your choices.
Answer: ________________________________________________________________
Problem 23: Real-World Constraint Problem
Question: A stakeholder requests a custom handle for a tool. They specify:
- Must fit a hand (approximately 80mm long)
- Must accommodate fingers 60mm long inside
- Wall thickness must be at least 3mm for durability
- Should be ergonomic (slightly curved)
Sketch or describe a parametric design for this handle. What parameters would you expose to allow customization?
Answer: ________________________________________________________________
Problem 24: Code Reusability Challenge
Question: You’ve created a single keycap module. Now you need to create a keyboard with 5 keys arranged in a row. Keys are spaced 15mm apart.
Write code using a loop that creates 5 keycaps with letters A-E, properly spaced.
Answer:
module keycap(letter, key_size=10) {
// Keycap code here (you can assume this exists)
}
// Your loop code here:
Problem 25: Design Thinking & Iteration
Question: You’ve printed Iteration 1 of a product and measured the results. The wall thickness is 3mm but feels too fragile. In Iteration 2, you increased it to 5mm, and now it feels too rigid and won’t flex as intended.
For Iteration 3, what thickness would you try and why? How would you make this decision more scientific/data-driven?
Answer: ________________________________________________________________
Bonus Challenge (Optional, +5 points)
Question: Design a parametric model for a custom assistive technology device (e.g., a tactile measuring tool, a custom gripper, an adapted eating utensil, etc.).
- Identify the user’s specific need
- Specify the key dimensions and parameters
- Write at least one module with realistic dimensions
- Explain how the design would be tested and iterated
Answer:
// Your design here:
User Need: _________________________________________________________________
Parameters: _________________________________________________________________
Testing Plan: ________________________________________________________________
Scoring Rubric
| Points per Problem | Criteria |
|---|---|
| 4 | Correct answer with clear, complete explanation; demonstrates deep understanding |
| 3 | Mostly correct answer; minor gaps in explanation or reasoning |
| 2 | Partially correct; shows some understanding but has significant gaps |
| 1 | Minimal effort; shows limited understanding |
| 0 | No answer or completely incorrect |
Total Possible: 100 + 5 bonus = 105 points
References You May Use
- 3dMake Quick Reference
- OpenSCAD Cheat Sheet
- Appendix A: Comprehensive Slicing Guide
- Appendix C: Tolerance Testing & QA Matrix
- Appendix D: PowerShell Integration
End of Final Exam
Submission Instructions:
- Answer all 25 questions completely
- Show your work for calculations and reasoning
- Include code samples where requested
- Submit as a PDF with your name and date
- Scoring will be based on correctness, clarity, and depth of understanding
Good luck! [celebration]