Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

PartLessonsFocusDurationTotal Hours
Foundations1-3Environment setup, primitives, parametric design~3 hours3
Verification & Safety4-5AI verification, safety protocols, materials~2 hours5
Applied Projects6-8Practical commands, transforms, advanced design~4 hours9
Advanced Topics9-10Automation, troubleshooting, mastery~3 hours12
Leadership11Stakeholder-centric design~2 hours14

Total: 14-18 hours instruction + projects

4 Comprehensive Reference Appendices


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 build to 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:


Supplemental Resources & Textbooks

This course is enhanced by comprehensive textbooks and companion materials from the Programming with OpenSCAD project:

Free Textbooks (EPUB Format)

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:

  1. Start with PowerShell Introduction
  2. Complete PowerShell lessons (PS.0-PS.5)
  3. Begin 3dMake Introduction
  4. Follow Lesson 1: Environmental Configuration
  5. Continue through Lesson 11

For Instructors:

  1. Review Curriculum Guide
  2. Use 11 Teacher Templates for assessment
  3. Reference Master Rubric for grading
  4. 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

  1. Text-First Design: All core work happens in text editors and command-line interfaces-no graphical CAD previews, no mouse-dependent menu navigation.

  2. Parametric Thinking: Students learn to express geometry as code using OpenSCAD, enabling precise, reproducible, and iterable designs without visual feedback.

  3. 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.

  4. 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.

  5. 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:

ComponentDurationContent
PowerShell Introduction45 minWhat is a terminal, opening PowerShell, first 5 commands, screen reader tricks
Screen Reader Accessibility Guide1-2 hoursNVDA/JAWS reference, navigation sequences, handling output, keyboard shortcuts
PS.0: Basic Commands1 hourpwd, ls, cd, echo, cat, file operations
PS.1: Navigation & Files1 hourFile system navigation, creating/editing files, organizing work
PS.2: Variables & Scripting1 hourVariables, simple scripts, basic logic
PS.3: Loops & Iteration1 hourFor loops, foreach, batch operations
PS.4: Functions & Modules1 hourFunctions, parameters, reusable code blocks
PS.5: Error Handling1 hourTry-catch, debugging, troubleshooting
PowerShell Curriculum Overview30 minStudy 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)

LessonFocusDurationProject
Lesson 1Environmental Configuration + How 3D Printing Works60-90 minNone
Lesson 2Primitives & Boolean Operations + Debugging60 minNone
Lesson 3Parametric Architecture & Modules60 minNone

Part 2: Verification & Safety (Lessons 4-5 | ~2 hours)

LessonFocusDurationProject
Lesson 4AI-Enhanced Verification & Feedback45-60 minNone
Lesson 5Safety Protocols & Material Introduction60-90 minNone

Part 3: Applied Projects (Lessons 6-8 | ~4 hours)

LessonFocusDurationProject
Lesson 6Practical 3dm Commands & Text Embossing60-90 minCustomizable Keycap
Lesson 7Parametric Transforms & Assembly75-90 minPhone Stand
Lesson 8Advanced Parametric Design & Interlocking90-120 minStackable Bins

Part 4: Advanced Topics (Lessons 9-10 | ~3 hours)

LessonFocusDurationProject
Lesson 9Automation & 3dm Workflows (requires PS Foundation)60-90 minBatch Processing Automation
Lesson 10Troubleshooting & Mastery with Measurement120-150 minQA Testing + Accessibility Audit

Part 5: Leadership (Lesson 11 | ~2 hours)

LessonFocusDurationProject
Lesson 11Stakeholder-Centric Design & Design Thinking90-120 minBeaded 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:

PhaseRoleCore ToolsFocus
PowerShell FoundationObserver/LearnerTerminal, command lineCLI fundamentals and keyboard navigation
3dMake Lessons 1-5Observer/LearnerOpenSCAD, 3DMake, editorUsing CLI tools, safety, concepts, measurement
3dMake Lessons 6-8OperatorEditor, OpenSCAD, 3DMake, slicerHands-on practice with structured projects
3dMake Lessons 9-10DesignerFull toolchainParametric design, automation, troubleshooting
3dMake Lesson 11Problem-SolverFull toolchain + documentationStakeholder 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

SectionPrerequisitesWhat You’ll Learn
PowerShell FoundationNone - start hereTerminal basics, keyboard navigation, file operations, basic scripting
3dMake Lessons 1-5PowerShell Foundation3D printing concepts, safety, measurement, OpenSCAD basics, debugging
3dMake Lessons 6-8Lessons 1-5Building projects, parametric design, transforms, tolerances
3dMake Lessons 9-10Lessons 6-8 (Lesson 9 requires PS Foundation)Automation, troubleshooting, advanced measurement and QA
3dMake Lesson 11Lessons 9-10Stakeholder design, real-world prototyping, leadership

Grading Rubric

All projects are scored on a 0-9 scale across three equally weighted categories (3 points each):

CategoryPointsWhat We Measure
Problem & Solution0-3Does the design solve the stated problem? Are all functional requirements met?
Design & Code Quality0-3Is the OpenSCAD code clean, well-commented, and well-structured? Does the print work well? Is there evidence of iteration?
Documentation0-3Are all sections complete? Are reflections thoughtful and specific? Are measurements recorded?

Category 1: Problem & Solution (0-3 points)

ScoreDescription
3The prototype clearly and effectively solves the stated problem. All functional requirements are met. The solution shows evidence of testing against the requirements.
2The prototype mostly meets the problem. Most functional requirements are met. Minor gaps between the design and the requirements.
1The prototype partially addresses the problem. Several functional requirements are not met or were not clearly tested.
0The 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.

ScoreDescription
3Code 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.
2Code works but lacks clear structure or comments. Variables are used but could be better named. Print quality is acceptable. Some iteration evident.
1Code is functional but poorly organized. Comments are minimal or missing. Print quality has defects. Little or no iteration.
0Code does not work, is not submitted, or shows no original thinking. Print is not functional.

Category 3: Documentation (0-3 points)

ScoreDescription
3All required sections are present, complete, and specific. Reflections are thoughtful and reference specific decisions, problems encountered, and learning. Photos/measurements are included.
2Most required sections are present. Some sections are vague or missing detail. Reflections show some thought but are brief or generic.
1Documentation is incomplete. Major sections are missing or consist of one-line responses. Reflections are minimal.
0Documentation is not submitted or is essentially empty.

Score Interpretation

Total ScoreInterpretationNext Step
8-9Excellent workMove on to next project
6-7Good work with room for improvementMove on; instructor may suggest revisiting one element
4-5Meets basic expectationsResubmission of specific weak areas recommended
2-3Does not meet expectationsResubmission required
0-1Missing major deliverablesMeet 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.


Core Design Toolchain

OpenSCAD:

3DMake:

Editors:

Screen Reader & Accessibility

Screen Readers:

Accessibility Configuration:

Terminal & Command Line:

Slicing & Printing

Slicer Software & Documentation:

OpenSCAD Learning

Tutorials & Documentation:

Advanced Resources:

Supplemental Textbooks

EPUB Textbooks:

Online Companion Resources:

Assistive Technology Design & Research

Organizations & Communities:

Research & Resources:

Community & Forums

OpenSCAD Community:

3D Printing Community:

Troubleshooting Resources

Common Issues:

Tools for Debugging:

Printer-Specific Guides

Prusa Printers:

Bambu Lab Printers:

Anycubic Printers:

Creality Printers:


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:

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:


Troubleshooting & Getting Help

If you’re stuck:

  1. Check Common Issues and Solutions
  2. Post in OpenSCAD Discord or Reddit
  3. Visit your local makerspace for hands-on support
  4. 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

LessonDurationWhat You’ll Learn
Screen Reader Accessibility Guide30 minScreen reader tips specific to PowerShell (READ FIRST)
PS-Pre: Your First Terminal45 minOpening PowerShell, first commands, basic navigation
PS-0: Getting Started30 minPaths, shortcuts, tab completion
PS-1: Navigation45 minMoving 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

LessonDurationWhat You’ll Learn
PS-2: File & Folder Manipulation60 minCreate, copy, move, delete files/folders
PS-3: Input, Output & Piping60 minChain commands together, redirect output
PS-4: Environment Variables & Aliases45 minAutomate settings, create shortcuts
PS-5: Filling in the Gaps45 minProfiles, 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:

TopicWhen to Learn
Scripting (.ps1 files)After PS-5
Functions & LoopsAfter PS-5
Error HandlingAfter PS-5
Remote AdministrationAdvanced
3D Printing IntegrationAfter all above

How to Use This Curriculum

If You’ve Never Used a Terminal Before

Start here and go in order:

  1. Read Screen Reader Accessibility Guide completely
  2. Do PS-Pre: Your First Terminal exercises
  3. 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:

  1. Skim Screen Reader Accessibility Guide (you’ll recognize most tips)
  2. Quickly review PS-Pre (basics with screen reader focus)
  3. Move to PS-0 for deeper learning

If You’re Experienced with Terminal + Screen Reader

You can:

  1. Jump to specific lessons you need (PS-2, PS-3, etc.)
  2. Use the Quick Reference sections
  3. Skip the practice exercises, do the quizzes to verify knowledge

How Each Lesson is Structured

Every Lesson Contains:

  1. Learning Objectives - What you’ll be able to do
  2. Key Commands - The important ones to memorize
  3. Step-by-Step Examples - How to actually do it
  4. Practice Exercises - Hands-on work
  5. Quiz Questions - Check your understanding
  6. Extension Problems - Go deeper if interested

How to Get Through Each Lesson:

  1. Read the learning objectives
  2. Do the step-by-step examples alongside
  3. Complete the practice exercises (critical!)
  4. Take the quiz (don’t cheat)
  5. Try extension problems if you have time
  6. 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:

  1. Open PowerShell (Windows key -> type PowerShell -> Enter)
  2. Run these commands:
    pwd
    ls -n
    cd Documents
    pwd
    
  3. See how your screen reader reads each output
  4. Try Tab completion:
    • Type cd D and press Tab
    • Hear PowerShell auto-complete to Documents (or similar)
  5. 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:

  1. Come back to this page for the overview
  2. Jump back to that lesson for a quick review
  3. Use the quiz questions to self-test
  4. 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:

  1. 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
  2. Commands not working?

    • Check spelling carefully
    • Make sure you pressed Enter
    • Try Get-Help command-name
  3. Can’t read the output?

    • Redirect to file: command > output.txt
    • Open in Notepad: notepad.exe output.txt
    • This always works
  4. Something ran forever?

    • Press Ctrl+C to stop it
  5. 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:

  1. Read the relevant section of Screen Reader Accessibility Guide
  2. Try a different approach from the “Solutions” sections
  3. Go back one lesson and strengthen those concepts
  4. Ask an instructor or peer with specific questions

Before You Ask for Help, Prepare:

  1. What command are you running?
  2. What do you expect to happen?
  3. What actually happened?
  4. 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

  1. Right now: Read the Screen Reader Accessibility Guide completely
  2. Next session: Start PS-Pre and do all exercises
  3. Keep going: One lesson per day/week at your pace
  4. Practice: Do exercises, not just read
  5. Check yourself: Take the quizzes honestly
  6. 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

  1. Getting Started with Screen Readers
  2. NVDA-Specific Tips
  3. JAWS-Specific Tips
  4. General Terminal Accessibility
  5. Working with Long Output
  6. Keyboard Shortcuts Reference
  7. 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:

FeatureNVDAJAWS
CostFreeCommercial (paid)
InstallationSimpleComplex but thorough
PowerShell SupportExcellentExcellent
Learning CurveGentleSteeper
CustomizationGoodExtensive

Recommendation: Start with NVDA if you’re new to screen readers. Both will work for this curriculum.

Before You Start

  1. Make sure your screen reader is running before opening PowerShell
  2. Open PowerShell and let your screen reader read the title and prompt
  3. If you don’t hear anything, press Alt+Tab to cycle windows and find PowerShell
  4. 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

CommandWhat It Does
NVDA+HomeRead the current line (your command or output)
NVDA+Down ArrowRead from cursor to end of screen
NVDA+Up ArrowRead from top to cursor
NVDA+Page DownRead next page
NVDA+Page UpRead previous page
NVDA+F7Open the Review Mode viewer (can scroll through text)
NVDA+Shift+Right ArrowRead next word
NVDA+Shift+Down ArrowRead entire screen
NVDA+EndJump to end of line
NVDA+HomeJump 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:

  1. After the command finishes, press NVDA+Home to read the current line
  2. Press NVDA+Down Arrow repeatedly to read all output
  3. Or press NVDA+F7 to open Review Mode and use arrow keys to scroll

NVDA Settings for PowerShell

Enable verbosity for better feedback:

  1. Press NVDA+Ctrl+V to open NVDA menu
  2. Go to Preferences -> Settings
  3. Under “Speech”, increase verbosity
  4. 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

CommandWhat It Does
Insert+Down ArrowRead line by line downward
Insert+Up ArrowRead line by line upward
Insert+Page DownRead next page of text
Insert+Page UpRead previous page of text
Insert+EndJump to end of text on screen
Insert+HomeJump to start of text on screen
Insert+Ctrl+DownRead to end of screen
Insert+Ctrl+UpRead to beginning of screen
Insert+Shift+Page DownSelect and read next page
Insert+F3Open JAWS menu

Example: Reading Long Output

Scenario: You ran ls -n | Out-File list.txt and saved output to a file.

Solution with JAWS:

  1. Open the file: notepad.exe list.txt
  2. In Notepad, press Insert+Ctrl+Down to hear all content
  3. Use Insert+Down Arrow to read line by line at your own pace

JAWS Settings for PowerShell

Enable specific settings for terminals:

  1. Press Insert+F3 to open JAWS menu
  2. Go to “Options” -> “Settings Manager”
  3. Search for “terminal” or “console”
  4. Enable “Announce output” and “Speak when program speaks”

General Terminal Accessibility

Understanding the PowerShell Layout

The PowerShell window contains:

  1. Title bar: Window name (e.g., “Windows PowerShell”)
  2. Content area: Command history and output
  3. Prompt: The PS> area where you type

Your screen reader reads from top to bottom, but focus is at the prompt (bottom).

When you open PowerShell:

  1. Your screen reader announces the window title
  2. Then it announces the prompt line
  3. Anything before the prompt is previous output
  4. 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:

  • findstr searches for a pattern
  • \.scad means “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)

KeyActionWhy It Matters
Up ArrowShow previous commandRepeat commands without retyping
Down ArrowShow next commandNavigate through history
TabAuto-completeFaster than typing full names
Shift+TabCycle backward through completionsIf Tab went too far
HomeJump to start of lineEdit beginning of command
EndJump to end of lineEdit end of command
Ctrl+ASelect allCopy entire command line
Ctrl+CStop commandAbort long-running tasks
Ctrl+LClear screenStart fresh
Ctrl+KClear all(Alternative to Ctrl+L)
EnterRun commandExecute what you typed

Screen Reader Navigation

KeyNVDA ActionJAWS Action
Up/DownMove through line (native)Move through line (native)
Numpad+Start/stop review mode(Not needed in JAWS)
Function+HomeRead current lineRead current line
Function+Page DownRead next pageRead next page
Alt+TabSwitch 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:

  1. 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
  2. Output scrolled off-screen

    • Solution: Redirect to file: command > output.txt
    • Then read file: notepad.exe output.txt
  3. 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
  4. Large amount of output overwhelming screen reader

    • Solution: Use filtering: ls -n | findstr "pattern"
    • Or save to file for paced reading

Problem 2: “Tab Completion Isn’t Working”

Causes & Solutions:

  1. Need at least one character

    • Wrong: Type cd then Tab (won’t work without a path)
    • Right: Type cd D then Tab
  2. Exact path needed

    • If folder is “Documents”, typing cd Doc and Tab works
    • But typing cd X won’t find “Documents”
  3. Check if item exists

    • Use ls -n first to see available items
    • Then Tab-complete to them

Problem 3: “Screen Reader Says ‘Access Denied’ or ‘Permission Denied’”

Causes & Solutions:

  1. Need admin rights

    • Close PowerShell
    • Right-click PowerShell -> Run as administrator
    • Confirm the UAC prompt
  2. File is in use

    • Close any programs using the file
    • Try the command again
  3. File path contains spaces

    • Use quotes: cd "Program Files"
    • Or use Tab completion (handles spaces automatically)

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:

  1. Press Up Arrow to show previous command
  2. Use arrow keys to move through it
  3. Edit the command as needed
  4. 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 s to make it cd Documents
  • Press Enter to run it

Problem 6: “My Screen Reader Keeps Interrupting Each Other”

Causes & Solutions:

  1. NVDA verbosity too high

    • Press NVDA+Ctrl+V to open menu
    • Go to Settings -> Speech
    • Lower the verbosity level
  2. Multiple applications speaking

    • Use Alt+Tab to make PowerShell active window
    • Minimize other programs
  3. 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.


For every new task:

  1. Know where you are: pwd
  2. See what’s around: ls -n
  3. Plan your next step: Think before typing
  4. Run the command: Type and press Enter
  5. Check the output: Use screen reader or redirect to file
  6. Move forward: Next command or cd to 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)

  1. Press the Windows key alone
  2. You should hear “Search”
  3. Type: PowerShell
  4. You’ll hear search results appear
  5. Press Enter to open the first result (Windows PowerShell)
  6. PowerShell will open in a new window

Method 2: Using the Start Menu

  1. Press Windows key + X (opens the Quick Link menu)
  2. Look for “Windows PowerShell” or “Terminal”
  3. Press Enter

Method 3: From File Explorer

  1. Open File Explorer
  2. Navigate to any folder
  3. In the menu bar, select “File” -> “Open Windows PowerShell here”
  4. 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” indicator
  • C:\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:

  1. Run pwd to confirm you’re in Documents
  2. Run ls -n to see what files are in Documents
  3. Try going back: cd .. (the .. means “go up one level”)
  4. Run pwd again to confirm
  5. 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"

One of the most powerful screen reader tricks is Tab completion:

How it works:

  1. Type the first few letters of a folder or file name
  2. Press Tab
  3. PowerShell automatically completes the rest

Example:

  1. You’re in C:\Users\YourName>
  2. Type: cd Doc
  3. Press Tab
  4. PowerShell auto-completes it to: cd Documents
  5. Press Enter to go there

With a screen reader:

  1. As you type Doc, your screen reader announces each letter
  2. When you press Tab, PowerShell types the rest and your screen reader announces the full command
  3. 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:

  • echo sends text to the screen (or file)
  • "Hello, PowerShell!" is the text
  • > redirects it to a file called hello.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 CombinationWhat It Does
Up ArrowShows your previous command (press again to go further back)
Down ArrowShows your next command (if you went back)
TabAuto-completes folder/file names
Ctrl+CStops a running command
Ctrl+LClears the screen
EnterRuns the command

Screen reader tip: These all work perfectly with your screen reader. Try them!


Part 6: Screen Reader-Specific Tips

NVDA Users

  1. 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
  2. Reviewing Text:

    • Use NVDA+Shift+Page Up to review text above

JAWS Users

  1. 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
  2. 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:

  1. Make sure your cursor is at the prompt (try pressing End or Ctrl+End)
  2. Use Up Arrow to go back to your previous command and review it
  3. Try redirecting to a file: command > output.txt then open the file
  4. 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

  1. Open PowerShell
  2. Run pwd and note your location
  3. Run ls -n and listen to what’s there
  4. Try cd Documents or another folder
  5. Run pwd to confirm your new location
  6. Run ls -n in this new location

Goal: You should be comfortable knowing where you are and what’s around you

Exercise 2: Using Tab Completion

  1. In your home directory, type cd D (just the letter D)
  2. Press Tab
  3. PowerShell should auto-complete to a folder starting with D
  4. Repeat with other folder names
  5. Try typing a longer name: cd Down and Tab to Downloads

Goal: Tab completion should feel natural

Exercise 3: Creating and Viewing Files

  1. Create a file: echo "Test content" > test.txt
  2. View it: cat test.txt
  3. Create another: echo "Line 2" > another.txt
  4. List both: ls -n

Goal: You understand create, view, and list operations

Exercise 4: Going Up Levels

  1. Navigate into several folders: cd Documents, then cd folder1, etc.
  2. From deep inside, use cd .. multiple times to go back up
  3. After each cd .., run pwd to confirm your location

Goal: You understand relative navigation with ..

Exercise 5: Redirecting Output

  1. Create a list: ls -n > directory_list.txt
  2. Open it: notepad.exe directory_list.txt
  3. Read it with your screen reader
  4. Close Notepad
  5. 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:

  1. What does pwd do?
  2. What does ls -n do?
  3. Why do we use -n with ls?
  4. What path are you in right now?
  5. How do you navigate to a new folder?
  6. How do you go up one level?
  7. What’s the Tab key for?
  8. What does echo "text" > file.txt do?
  9. How do you read a file back?
  10. 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

IssueSolution
PowerShell won’t openTry searching Windows, or right-click a folder and select “Open PowerShell here”
Can’t hear the outputTry redirecting to a file: command > output.txt
Tab completion not workingMake sure you typed at least one character before pressing Tab
Command not foundMake sure you spelled it correctly; try Get-Command to see available commands
Stuck in a commandPress 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

  1. Open PowerShell and note the prompt (it includes the current path).
  2. Run pwd and say or note the printed path.
  3. Use ls -n to list names in your home directory.
  4. Practice cd Documents, cd ../ and cd ~ until comfortable.
  5. Try tab-completion: type cd ~/D and press Tab.

Checkpoints

  • Confirm you can state your current path and move to Documents.

Quiz - Lesson PS.0

  1. What is a path?
  2. What does ~ mean?
  3. How do you autocomplete a path?
  4. How do you go up one directory?
  5. What command lists only names (ls flag)?
  6. True or False: On Windows, PowerShell uses backslashes () in paths, but forward slashes (/) are also accepted.
  7. Explain the difference between an absolute path and a relative path.
  8. If you are in C:\Users\YourName\Documents and you type cd ../, where do you end up?
  9. What happens when you press Tab while typing a folder name in PowerShell?
  10. Describe a practical reason why understanding paths is important for a 3D printing workflow.
  11. What does ./ mean in a path, and when would you use it?
  12. If a folder path contains spaces (e.g., Program Files), how do you navigate to it with cd?
  13. Explain what the prompt PS C:\Users\YourName> tells you about your current state.
  14. How would you navigate to your home directory from any location using a single command?
  15. What is the advantage of using relative paths (like ../) versus absolute paths in automation scripts?

Extension Problems

  1. Create a nested folder and practice cd into it by typing partial names and using Tab.
  2. Use ls -n -af to list only files in a folder.
  3. Save pwd output to a file and open it in Notepad.
  4. Try cd into a folder whose name contains spaces; observe how quotes are handled.
  5. Create a short note file and open it from PowerShell.
  6. Build a folder structure that mirrors your project organization; navigate to each level and document the path.
  7. Create a script that prints your current path and the total number of files in it; run it from different locations.
  8. Investigate the special paths (e.g., $HOME, $PSScriptRoot); write down what each contains and when you’d use them.
  9. Compare absolute vs. relative paths by navigating to the same folder using each method; explain which is easier for automation.
  10. Create a PowerShell function that changes to a frequently-used folder and lists its contents in one command; test it from different starting locations.
  11. Navigate to three different locations and at each one note the prompt, the path from pwd, and verify you understand what each shows.
  12. Create a complex folder tree (at least 5 levels deep) and navigate it using only relative paths; verify your location at each step.
  13. Document all shortcuts you know (~, ./, ../, $HOME) and demonstrate each one works as expected.
  14. Write a guide for a peer on how to understand the PowerShell prompt and path notation without using GUI file explorer.
  15. 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

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 pwd to print your current location
  • Use cd to 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

CommandWhat It Does
pwdPrint Working Directory - shows where you are
cd pathChange Directory - move to a new location
lsList - shows files and folders in current location
ls -nList names only (screen reader friendly)
ls -n -afList names of files only
ls -n -adList names of directories only
ls *.extensionList 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

  1. Run pwd and confirm your location
  2. Move to Documents: cd Documents
  3. Confirm you moved: pwd
  4. List files and folders: ls -n
  5. List only files: ls -n -af
  6. Go back up: cd ..
  7. 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

  1. What does pwd show?
  2. How do you list directories only with ls?
  3. What wildcard matches any number of characters?
  4. How do you list files with the .scad extension?
  5. Give an example of an absolute path and a relative path.
  6. True or False: The * wildcard matches exactly one character.
  7. Explain the difference between ls -n and ls -n -ad.
  8. Write a command that would list all .txt files in your Documents folder using a wildcard.
  9. How would you search for files containing “part” in their name across multiple files?
  10. Describe a practical scenario where using wildcards saves time in a 3D printing workflow.
  11. What happens when you use ls -n part?.scad versus ls -n part*.scad?
  12. How would you navigate to a folder whose name contains both spaces and special characters?
  13. If you’re in /Documents/Projects/3D and you want to go to /Documents/Resources, what command would you use?
  14. Write a command sequence that navigates to the Downloads folder, lists only files, then returns to home.
  15. Explain the purpose of using ls -n -af specifically in a screen reader context.

Extension Problems

  1. Write a one-line script that lists .scad files and saves to scad_list.txt.
  2. Use ls -n ~/Documents | more to page through long listings.
  3. Combine ls with Select-String to search for a filename pattern.
  4. Create a shortcut alias in the session for a long path and test it.
  5. Practice tab-completion in a directory with many similarly named files.
  6. Build a PowerShell script that recursively lists all .scad and .stl files in a directory tree; save the results to a file.
  7. Compare the output of ls, Get-ChildItem, and gci to understand PowerShell aliasing; document what each command does.
  8. Create a filtering command that displays only files modified in the last 7 days; test it on your documents folder.
  9. Write a non-visual guide to PowerShell navigation; include descriptions of common patterns and how to verify directory contents audibly.
  10. Develop a navigation workflow for a typical 3D printing project: move between CAD, slicing, and print-log folders efficiently; document the commands.
  11. Create a complex wildcard search: find all files in a folder and subfolders that match multiple patterns (e.g., *_v1.* OR *_final.*).
  12. Build a script that navigates through a folder tree, counts files at each level, and reports the structure.
  13. Document the output differences between ls -n, ls -n -af, ls -n -ad, and Get-ChildItem; explain when to use each.
  14. Create a navigation “cheat sheet” as a PowerShell script that prints common paths and how to navigate to them.
  15. 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

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, and rmdir safely
  • Understand when operations are permanent and how to confirm results

Materials

  • PowerShell
  • Small practice folder for exercises

Step-by-step Tasks

  1. Create a practice directory: mkdir ~/Documents/PS_Practice and cd into it.
  2. Create two files: ni file1.txt and ni file2.txt.
  3. Copy file1.txt to file1_backup.txt with cp and confirm with ls -n.
  4. Rename file2.txt to notes.txt using mv and confirm.
  5. Delete file1.txt with rm and verify the backup remains.

Checkpoints

  • After step 3 you should see both the original and the backup file.

Quiz - Lesson PS.2

  1. How do you create an empty file from PowerShell?
  2. What command copies a file?
  3. How do you rename a file?
  4. What does rm -r do?
  5. Why is rm potentially dangerous?
  6. True or False: cp requires the -r flag to copy both files and folders.
  7. Explain the difference between rm and rmdir.
  8. If you delete a file with rm, can you recover it from PowerShell?
  9. Write a command that would copy an entire folder and all its contents to a new location.
  10. Describe a practical safety check you would perform before running rm -r on a folder.
  11. What happens if you cp a file to a destination where a file with the same name already exists? How would you handle this safely?
  12. Compare mv old_name.txt new_name.txt vs mv old_name.txt ~/Documents/new_name.txt. What is the key difference?
  13. Design a workflow to safely delete 50 files matching the pattern *.bak from a folder containing 500 files. What commands and verifications would you use?
  14. Explain how you could back up all .scad files from a project folder into a timestamped backup folder in one command.
  15. 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

  1. Create a folder tree and copy it to a new location with cp -r.
  2. Write a one-line command that creates three files named a b c and lists them.
  3. Move a file into a new folder and confirm the move.
  4. Use wildcards to delete files matching a pattern in a safe test folder.
  5. Export a listing of the practice folder to practice_listing.txt.
  6. Create a backup script that copies all .scad files from your project folder to a backup folder with timestamp naming.
  7. Build a safe deletion workflow: list files matching a pattern, verify count, then delete with confirmation; document the steps.
  8. Write a PowerShell script that organizes files by extension into subfolders; test it on a sample folder tree.
  9. Create a file operation audit trail: log all copy, move, and delete operations to a text file for review.
  10. Develop a project template generator: a script that creates a standard folder structure for a new 3D printing project with essential subfolders.
  11. Implement a file conflict handler: write a script that handles cases where cp would overwrite an existing file by renaming the existing file with a timestamp before copying.
  12. Create a batch rename operation: use a script to rename all files in a folder from old_prefix_* to new_prefix_*; test with actual files and verify the results.
  13. 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.
  14. 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.
  15. 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

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 echo to print text to the screen
  • Use cat to 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

CommandWhat It Does
echo "text"Print text to the screen
cat filenamePrint the contents of a file
> filenameRedirect output into a file (overwrites)
>> filenameAppend output to a file (adds to end)
|Pipe - send output from one command to the next
clipCopy piped input to the Windows clipboard
notepad.exe filenameOpen 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

  1. Show your username and home path with echo $env:USERNAME and echo $env:USERPROFILE.
  2. Inspect echo $env:PATH and identify whether openscad or code would be found.
  3. Run Get-Command openscad and note the result.
  4. Create a temporary alias: Set-Alias -Name preview -Value openscad and test preview myfile.scad.
  5. 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

  1. How do you print an environment variable?
  2. What is the purpose of PATH?
  3. How do you check whether openscad is available?
  4. How do you create a temporary alias?
  5. Where would you make an alias permanent?
  6. True or False: Environment variables are case-sensitive on all platforms.
  7. Explain why having a program in your PATH is useful compared to always using its full file path.
  8. Write a command that would create an alias called slicer for the OpenSCAD executable.
  9. What file would you edit to make an alias persist across PowerShell sessions?
  10. Describe a practical benefit of using the $env:TEMP directory for temporary files in a 3D printing workflow.
  11. You have a custom script at C:\Scripts\backup_models.ps1 that you want to run from anywhere as backup-now. What steps would you take to make this work?
  12. Explain the difference between setting an environment variable in the current session vs. adding it to your profile for permanence.
  13. 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.
  14. If a program is not found by Get-Command, what are the possible reasons, and how would you troubleshoot?
  15. 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

  1. Add a folder to PATH for a test program (describe steps; do not change system PATH without admin).
  2. Create a short profile snippet that sets two aliases and test re-opening PowerShell.
  3. Use Get-Command to list the path for several common programs.
  4. Explore $env:TEMP and create a file there.
  5. Save a copy of your current PATH to a text file and examine it in your editor.
  6. Create a PowerShell profile script that loads custom aliases and environment variables for your 3D printing workflow; test it in a new session.
  7. Build a “project profile” that sets environment variables for CAD, slicing, and print directories; switch between profiles for different projects.
  8. Write a script that audits your current environment variables and creates a summary report of what’s set and why.
  9. Design a custom alias system for common 3D printing commands; document the aliases and their purposes.
  10. Create a profile migration guide: document how to export and import your PowerShell profile across machines for consistent workflows.
  11. 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.
  12. 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.
  13. 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.
  14. 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.
  15. 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

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

  1. Run several simple commands (e.g., pwd, ls -n, echo hi) then run history to view them.
  2. Use Invoke-History <n> to re-run a previous command (replace <n> with a history number).
  3. Practice aborting a long-running command with Ctrl + C (for example, ping 8.8.8.8).
  4. Open your profile: notepad.exe $PROFILE; if it doesn’t exist, create it: ni $PROFILE -Force.
  5. 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

  1. How do you view the command history?
  2. Which key combination aborts a running command?
  3. What does echo $PROFILE show?
  4. How does the & operator help run executables?
  5. What is one strategy if terminal output stops being announced by your screen reader?
  6. True or False: Using Ctrl+C permanently deletes any files created by the command you abort.
  7. Explain the difference between history and Get-History in PowerShell.
  8. If you place code in your profile but it doesn’t take effect after opening a new PowerShell window, what should you verify?
  9. Write a command that would run a program at the path C:\Program Files\OpenSCAD\openscad.exe directly.
  10. Describe a practical workflow scenario where having keyboard shortcuts (aliases) in your profile would save time.
  11. Explain how to re-run the 5th command from your history, and what would happen if that command had file operations (creates/deletes).
  12. Design a profile initialization strategy that separates utilities for different projects; explain how you would switch between them.
  13. 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?
  14. 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?
  15. 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

  1. Add an alias and an environment variable change to your profile and document the behavior after reopening PowerShell.
  2. Create a short script that automates creating a project folder and an initial .scad file.
  3. Experiment with running OpenSCAD by full path using & and by placing it in PATH; compare results.
  4. Practice redirecting Get-Help output to a file and reading it in Notepad for screen reader clarity.
  5. Document three screen reader troubleshooting steps you used and when they helped.
  6. Build a comprehensive PowerShell profile that includes aliases, environment variables, and helper functions for your 3D printing workflow.
  7. Create a script that troubleshoots common PowerShell issues (module loading, permission errors, command not found); test at least three scenarios.
  8. Write a PowerShell function that coordinates multiple tasks: creates a project folder, starts OpenSCAD, and opens slicing software.
  9. Design a screen-reader accessibility guide for PowerShell: document commands, outputs, and accessible navigation patterns.
  10. Develop an advanced PowerShell workflow: implement error handling, logging, and confirmation prompts for risky operations.
  11. 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.
  12. Build a profile debugger: create a script that compares two PowerShell sessions’ environment states (variables, aliases, functions) to identify what loaded/failed to load.
  13. 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.
  14. 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.
  15. 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

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 $mypath with 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 function
  • param([string]$path) = the function accepts a parameter called $path
  • Inside the function, use $path like 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 variable
  • foreach ($file in $scadFiles) = for each file, do this:
    • Write-Output "=== File: $file ===" = announce which file
    • cat $file = show contents
    • Write-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:

  1. List them all
  2. Check how many there are
  3. 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 look
  • ls $scadFolder -Filter *.scad -Name = find .scad files, show names only
  • foreach = process each file
  • Join-Path = combine folder and filename into full path
  • Test-Path = check if file exists
  • if = do different things based on condition

Running the Script

  1. Save as batch-process.ps1
  2. Edit $scadFolder to match your real folder
  3. 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 true
  • return = 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:

  1. Create file: notepad.exe hello.ps1
  2. Type:
    Write-Output "Hello from my first PowerShell script!"
    pwd
    ls -n
    
  3. 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:

  1. Create file: notepad.exe smart-listing.ps1
  2. Type:
    $targetFolder = "C:\Users\YourName\Documents"
    Write-Output "Listing contents of: $targetFolder"
    ls -n $targetFolder
    
  3. Edit $targetFolder to a real folder on your computer
  4. Run: .\smart-listing.ps1

Checkpoint: You should see listing of that specific folder.

Exercise 3: Function

Goal: Create a reusable function

Steps:

  1. Create file: notepad.exe navigate.ps1
  2. 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"
    
  3. 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:

  1. Create file: notepad.exe repeat.ps1
  2. Type:
    Write-Output "Demonstrating a loop:"
    
    for ($i = 1; $i -le 5; $i++) {
        Write-Output "Iteration $i: Hello!"
    }
    
    Write-Output "Loop complete!"
    
  3. 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:

  1. Create a folder: mkdir C:\Users\YourName\Documents\TestFiles
  2. 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
    
  3. Create script: notepad.exe report.ps1
  4. 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 ==="
    
  5. Run: .\report.ps1

Checkpoint: Should show report of all files in the test folder.


Quiz - Lesson PS-6

  1. What is a PowerShell script?
  2. What file extension do PowerShell scripts use?
  3. What is a variable and how do you create one?
  4. What is a function and why would you use one?
  5. How do you run a script?
  6. What is a loop and what does foreach do?
  7. What does Test-Path do?
  8. How do you handle errors in a script?
  9. When would you use Try-Catch?
  10. What technique makes script output readable for screen readers?

Extension Problems

  1. Auto-Backup Script: Create a script that copies all files from one folder to another, announcing progress
  2. File Counter: Write a function that counts files by extension (.txt, .scad, .stl, etc.)
  3. Folder Cleaner: Script that deletes files older than 30 days (with user confirmation)
  4. Project Template: Function that creates a complete project folder structure with all needed files
  5. Batch Rename: Script that renames all files in a folder according to a pattern
  6. Log Generator: Create a script that records what it does to a log file for later review
  7. Scheduled Task: Set up a script to run automatically every day at a specific time
  8. File Verifier: Check that all SCAD files in a folder have corresponding STL exports
  9. Report Generator: Create a summary report of all projects in a folder
  10. 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-Help and Get-Command to learn more

Starting PowerShell

Windows

  1. Press Windows, type PowerShell, then press Enter.
  2. If you need elevated rights, press Windows+X then choose Windows PowerShell (Admin).

macOS / Linux

  1. Open Terminal.app (macOS) or your preferred terminal (Linux).
  2. Type pwsh and 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 directory
  • ni <filename> - create a file (alias for New-Item)
  • cat <file> - show file contents
  • echo <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 utf8 then open list.txt.

Help and discovery

  • Get-Help <command> shows help: Get-Help ls or Get-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 -n to 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+Tab and back, or briefly pressing Ctrl or Shift to force announcement.

Suggested learning path

  1. Open PowerShell, run pwd, ls -n, cd into Documents.
  2. Create a file with ni test.txt, add a line with echo "hi" > test.txt, and read it with cat test.txt.
  3. Use Get-Help ls and redirect output to a file to read comfortably.

Hands-on: Explore the terminal (Beginner)

  1. Run pwd and speak or note the output.
  2. Run ls -n in your home directory. If the list is long, save it: ls -n > listing.txt ; notepad.exe listing.txt.
  3. Create a folder and file: mkdir PS_Practice ; cd PS_Practice ; ni notes.txt.
  4. Add a line: echo "My first note" > notes.txt ; cat notes.txt.

Extension Exercises

  1. Use wildcards to list only .scad files: ls -n *.scad. Proceed to search for other types of files.
  2. Save a long command’s output and search it with Select-String.
  3. Create a small script that prints a timestamp and test it with &.
  4. Build a project template generator: write a script that creates a folder structure for a new 3D printing project.
  5. Create a personalized PowerShell profile with aliases for frequently used commands; test it after restart.
  6. Write a PowerShell script that combines multiple concepts: navigates folders, creates files, and performs file operations.
  7. Create a screen-reader navigation guide for PowerShell ISE; test with actual screen reader if available.
  8. Build a data analysis script: read a CSV file, filter and process data, and generate a report.
  9. Develop a troubleshooting aide: common PowerShell error messages, their causes, and solutions.
  10. Design a comprehensive PowerShell learning portfolio: document skills developed, commands mastered, scripts created, and practical applications.

Quick Quiz (10 questions)

  1. What command shows your current directory?
  2. How do you list names only for screen readers?
  3. How do you create an empty file?
  4. What operator runs a script or executable by path?
  5. How do you page through long output?
  6. True or False: PowerShell only runs on Windows.
  7. What does the ~ symbol represent in a PowerShell path?
  8. Explain why redirecting output to a file (e.g., command > output.txt) is helpful for screen reader users.
  9. What is the difference between Get-Help and Get-Command?
  10. 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, and cd to 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 ~/D then 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 -n for 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

  1. Press Windows+X and choose Windows PowerShell (Admin).
  2. 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)

  1. Open PowerShell; listen for the prompt and current path.
  2. Run pwd to confirm your location.
  3. Run ls -n in your home directory and note the output.
  4. Practice cd Documents, cd ../, and cd ~ to move between folders.
  5. Create and open a file: ni example.txt ; notepad.exe example.txt (or code 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)

  1. What command prints your current directory?
  2. What does ~ represent?
  3. How do you list only names with ls?
  4. How do you go up one directory level?
  5. How would you open notes.txt in Notepad from PowerShell?
  6. True or False: The pipe operator | sends output to a file.
  7. Explain why running commands with elevated privileges (as Administrator) might be necessary.
  8. What is the difference between running a script with ./script.ps1 versus & './script.ps1'?
  9. Describe how you would handle a very long command output when using a screen reader.
  10. What does the PATH environment variable do, and why is it important when running programs like OpenSCAD?

Extension Problems

  1. Create a folder OpenSCAD_Projects in Documents and verify its contents.
  2. Create three files named a.scad, b.scad, c.scad and list them with a wildcard.
  3. Save ls -n ~/Documents output to doc_list.txt and open it.
  4. Try tab-completion in a deeply nested folder and note behavior.
  5. Capture pwd output into a file and open it: pwd > cwd.txt ; notepad.exe cwd.txt.
  6. Build an automated setup script that creates a complete project directory structure, initializes placeholder files, and generates a README.
  7. Create a PowerShell cheat sheet for your most-used commands; organize by category (navigation, files, scripting, troubleshooting).
  8. Write a non-visual tutorial for PowerShell basics; use audio descriptions and keyboard-only navigation as the primary learning method.
  9. Develop a workflow automation script: combines multiple PowerShell concepts (folders, aliases, piping) to solve a real 3D printing task.
  10. 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:

  1. Understanding of file system navigation and path concepts
  2. Proficiency with file and folder manipulation commands
  3. Ability to redirect and pipe command output
  4. Knowledge of environment variables and aliases
  5. Screen-reader accessibility best practices in terminal environments
  6. 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.

  1. What is the primary purpose of the PATH environment 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
  2. Which command prints your current working directory?

    • A) ls -n
    • B) cd
    • C) pwd
    • D) whoami
  3. What does the ~ symbol represent in PowerShell paths?

    • A) The root directory
    • B) The current directory
    • C) The parent directory
    • D) The home directory
  4. 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
  5. Which command creates a new empty file?

    • A) mkdir filename
    • B) ni filename
    • C) touch filename
    • D) echo filename
  6. 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
  7. 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
  8. Which command copies a file?

    • A) mv
    • B) rm
    • C) cp
    • D) cd
  9. How do you rename a file from oldname.txt to newname.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
  10. 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
  11. Which key combination allows you to autocomplete a path in PowerShell?

    • A) Ctrl + A
    • B) Ctrl + E
    • C) Tab
    • D) Space
  12. 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
  13. What does Get-Command openscad do?

    • 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
  14. Which wildcard matches any single character?

    • A) *
    • B) ?
    • C) %
    • D) #
  15. 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
  16. 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
  17. 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
  18. 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
  19. What command shows the history of previously run commands?

    • A) history
    • B) Get-History
    • C) Show-History
    • D) Both A and B
  20. How do you permanently set an alias so it persists across PowerShell sessions?

    • A) Use Set-Alias in the terminal every time
    • B) Add the Set-Alias line to your PowerShell profile
    • C) Use the Windows Control Panel
    • D) Aliases cannot be made permanent

Part B: Short Answer Questions (10 questions)

Answer each question in one to two sentences. Each question is worth 2 points.

  1. Explain the difference between absolute and relative paths. Give one example of each.

  2. Why is ls -n preferred over ls for screen reader users? Describe what flag you would use to list only files.

  3. What is the purpose of redirecting output to a file, and give an example of when you would use > instead of >>?

  4. Describe what would happen if you ran rm -r ~/Documents/my_folder and why this command should be used carefully.

  5. How would you search for all files with a .scad extension in your current directory? Write the command.

  6. Explain what happens when you pipe the output of ls -n into clip. What would you do next?

  7. What is an environment variable, and give one example of how you might use it in PowerShell.

  8. If a program is not in your PATH, what two methods could you use to run it from PowerShell?

  9. Describe how you would open a file in Notepad and also add a line to it from PowerShell.

  10. 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

  1. Create a folder structure ~/Documents/PowerShell_Assessment/Projects using a single command. Capture the ls -n output showing the creation.

  2. Create five files named project_1.scad, project_2.scad, project_3.txt, notes_1.txt, and notes_2.txt inside the Projects folder. Use wildcards to list only .scad files, then capture the output.

  3. Copy the entire Projects folder to Projects_Backup using cp -r. Capture the ls -n output showing both folders exist.

  4. Move (rename) project_1.scad to project_1_final.scad. Capture the ls -n output showing the renamed file.

  5. Delete notes_1.txt and notes_2.txt using a single rm command with wildcards. Capture the final ls -n output.

Tasks 6-10: Advanced Operations and Scripting

  1. Create a file called my_data.txt with at least four lines using echo and >>. Then read it with cat my_data.txt and capture the output.

  2. Use Select-String to search for a keyword (e.g., “project”) in my_data.txt and pipe the results to clip. Paste the results into Notepad and capture a screenshot.

  3. List all files in the Projects folder and redirect the output to projects_list.txt. Open it in Notepad and capture a screenshot of the file.

  4. Create a temporary alias called myls that runs ls -n, test it, and capture the output. Then explain what would be required to make it permanent.

  5. Run Get-Help Get-ChildItem and redirect the output to help_output.txt. Open the file in Notepad and capture a screenshot showing at least the first page of help content.


Grading Rubric

SectionQuestionsPoints EachTotal
Multiple Choice20120
Short Answer10220
Hands-On Tasks10330
Total40-70

Passing Score: 49 points (70%)


Helpful Resources for Review


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.scad using OpenSCAD’s parametric design capabilities3, run 3dm build, and inspect the generated build/main.stl

Materials

  • Terminal with 3dMake installed
  • Editor (VS Code or Notepad)
  • Example scaffold or classroom repository

Step-by-step Tasks

  1. Run ./3dm setup or follow instructor’s installation notes; confirm tools with which 3dm and which openscad. Verify your 3dMake installation is properly configured1.

  2. Create a project scaffold with 3dm new and open src/main.scad using 3dm edit-model. For a comprehensive introduction to the workflow, consult the OpenSCAD documentation2.

  3. 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]);
    
  4. Run 3dm build and verify build/main.stl exists. Compare this build process to standard OpenSCAD workflows4.

  5. Open the STL in your slicer to check for thin walls or non-manifold geometry5; if issues appear, iterate on main.scad and rebuild.

  6. Try modifying the parameters and running 3dm build again to see how parametric design allows you to quickly create variants.

Checkpoints

  • After step 2 you can locate 3dmake.toml and the build/ directory. Ensure your project scaffold matches the expected structure described in the 3dMake repository1.
  • After step 4 the build/ folder contains a valid main.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:

  1. STL File -> Your 3dMake model exported as an STL geometry file
  2. Slicer Analysis -> Software like PrusaSlicer reads the STL and divides it into layers
  3. G-code Generation -> The slicer converts layers into machine instructions (coordinates, temperature, speed)
  4. Printing -> The printer reads G-code, heats the nozzle to ~200-230C, and extrudes plastic one layer at a time
  5. 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 thickness of 0.5 mm might be too thin for FDM (will break easily)
  • A width of 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:

  1. Verify geometry (check for thin walls or non-manifold faces)
  2. Set layer height, infill, and supports
  3. Preview the layers to see what the printer will do
  4. 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:

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)

  1. What command initializes a 3dMake project?
  2. What folder holds generated STLs?
  3. How do you open the main model editor from the CLI?
  4. Why is it useful to run 3dm build frequently during development?
  5. Give one reason to prefer an external editor over editing inline.
  6. True or False: 3dMake requires a graphical user interface to use effectively.
  7. Explain what the 3dmake.toml file does in your project.
  8. Describe what the src/, build/, and other project scaffold folders are used for.
  9. How would you compare the 3dMake build workflow to traditional OpenSCAD workflows?
  10. What validation steps should you perform after running 3dm build and before sending a file to print?

Extension Problems (10)

  1. Add a README entry explaining your top-level parameters and expected units. Reference best practices from the OpenSCAD documentation2.
  2. Create a parameter variant by changing width by 20% and build both variants; compare dimensions with calipers. This demonstrates the power of parametric design discussed in programming resources3.
  3. Script a 3dm command sequence that automates new -> edit -> build for the scaffold. Review the 3dMake test suite for inspiration7.
  4. 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.
  5. Prepare a short instructor sign-off checklist describing safety checks before printing.
  6. Build a variant testing suite: create 5+ parameter combinations, export STLs, and compare file sizes and estimated print times.
  7. Create a 3dMake project template with best-practice structure, documentation, and reusable modules for future projects.
  8. Develop a screen-reader accessibility guide for 3dMake CLI commands and parameter syntax.
  9. Design a parametric part library in 3dMake format; document all parameters, units, and example usage.
  10. 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:


  1. 3DMake GitHub Repository - https://github.com/tdeck/3dmake ↩2 ↩3

  2. OpenSCAD Manual - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual ↩2 ↩3

  3. OpenSCAD Parametric Design - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Variables ↩2 ↩3

  4. OpenSCAD Review - Worth learning? - CadHub, accessed February 18, 2026, https://learn.cadhub.xyz/blog/openscad-review/

  5. OpenSCAD Prompt Creation - DocsBot AI, accessed February 18, 2026, https://docsbot.ai/prompts/technical/openscad-prompt-creation

  6. Slicer Validation Tools - PrusaSlicer Documentation - https://docs.prusa3d.com/en/guide/39012-validation-tools/

  7. 3dmake/e2e_test.py at main - GitHub, accessed February 18, 2026, https://github.com/tdeck/3dmake/blob/main/e2e_test.py

  8. 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:

  1. Go to 3dMake Windows Download
  2. This downloads 3dmake_windows.zip to your computer
  3. Right-click the file and select “Extract All…” (or use your preferred extraction tool)
  4. Remember where you extracted it (e.g., C:\Users\YourName\3dmake or C:\Program Files\3dmake)

Linux:

  1. Go to 3dMake Linux Download
  2. This downloads 3dmake_linux.tar.gz to your computer
  3. Extract it using: tar -xzf 3dmake_linux.tar.gz
  4. Remember where you extracted it (e.g., ~/3dmake or /opt/3dmake)

Step 2: Open Your Terminal

Windows:

  • Press Win + X and select “Windows PowerShell” or “Terminal”
  • For screen reader users: Use Alt + F2 and type powershell if 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) - default
  • frontsil - Front-facing silhouette only
  • topsil - 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 model
  • build/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.scad
  • parametric_box_v2.scad
  • bracket_for_motor.scad
  • main.scad (default project model)

Avoid:

  • test.scad
  • model1.scad
  • final_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:

  1. Key-value pairs - Each setting has a name and value separated by an equals sign:

    project_name = "My Project"
    
  2. Strings use quotes - Text values must be wrapped in double quotes:

    editor = "code"
    printer_profile = "prusa_MK4"
    
  3. Numbers don’t need quotes - Numeric values stand alone:

    scale = 1.05
    copies = 3
    
  4. Boolean values are true or false - Lowercase, no quotes:

    auto_start_prints = true
    edit_in_background = false
    
  5. Arrays use square brackets - Lists of values separated by commas:

    overlays = ["supports", "PETG"]
    libraries = ["bosl", "braille-chars"]
    
  6. One setting per line - Each configuration on its own line

  7. 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 (run 3dm edit-global-config to 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:

  1. Verify you extracted 3dMake and completed 3dm setup
  2. Restart your terminal completely (close and reopen)
  3. Check that you’re not inside the 3dMake directory when running commands
  4. On Linux, ensure you’re using ./3dm if 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:

  1. Open your model file: 3dm edit-model
  2. Check the line number mentioned in the error
  3. Verify correct OpenSCAD syntax (matching parentheses, semicolons, etc.)
  4. Save and try building again: 3dm build

“Model won’t render or build”

Checklist:

  • File is saved with .scad extension
  • 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:

  1. Verify printer is running and connected to network
  2. Edit configuration: 3dm edit-global-config
  3. Check these settings:
    • octoprint_host - correct IP/URL
    • octoprint_key - valid API key
    • print_mode - set to “octoprint” or “bambu_lan”
  4. Test connection: 3dm build print (without actually printing first)

Part 7: Quick Reference

Essential Commands

CommandPurpose
3dm --versionShow installed version
3dm helpDisplay all available commands
3dm setupInitial setup (run in extracted directory)
3dm newInitialize a new project
3dm buildBuild OpenSCAD model to STL
3dm build sliceBuild and slice to GCODE
3dm build printBuild, slice, and send to printer
3dm edit-modelOpen main.scad in text editor
3dm edit-model -m nameOpen a specific model file
3dm infoShow model statistics
3dm preview printCreate and print a tactile preview
3dm list-profilesShow available printer profiles
3dm list-overlaysShow available slicer overlays
3dm edit-global-configEdit global settings
3dm orient printAuto-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:

  1. Learn parametric design - Make reusable models with variables
  2. Explore modules - Organize code into reusable functions
  3. Add libraries - Use pre-built OpenSCAD libraries (BOSL, etc.)
  4. Optimize workflows - Chain commands (3dm build slice print)
  5. Automate models - Use loops and conditionals in OpenSCAD
  6. 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. Open VSCode
  2. Press Ctrl + Shift + X to open the Extensions panel
  3. Type openscad in the search box
  4. Install “OpenSCAD Language Support” - this adds syntax highlighting and keyword completion for .scad files

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

  1. In VSCode, press Ctrl + Shift + P to open the Command Palette
  2. Type Tasks: Configure Task and press Enter
  3. Select “Create tasks.json file from template”
  4. 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 + B to run the default build task (Preview in OpenSCAD)
  • OpenSCAD will open and display your model
  • Switch back to VSCode with Alt + Tab to keep editing

To export an STL:

  1. Press Ctrl + Shift + P
  2. Type Tasks: Run Task
  3. Select “Export STL”
  4. The .stl file will be saved in the same folder as your .scad file

Part 3: NVDA Settings for VSCode

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

ActionKeys
Read current lineNVDA + Up Arrow
Read from cursorNVDA + Down Arrow
Spell current wordNVDA + Numpad 2 (twice quickly)
Move to next/previous lineUp / Down Arrow
Move by wordCtrl + Left / Right Arrow
Move to start/end of lineHome / End
Move to start/end of fileCtrl + Home / End
Select allCtrl + A
Toggle line commentCtrl + /
Go to line numberCtrl + G, type number, Enter
Find in fileCtrl + F
Open file in workspaceCtrl + 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.

  • Punctuation level: All - JAWS Key + Shift + 2 cycles through levels. Set to All for code editing.
  • Reading rate: Adjust with Alt + Ctrl + Page Up / Page Down
  • Spell current line: JAWS Key + Up Arrow twice quickly

4.3 Useful JAWS + VSCode Keyboard Shortcuts

ActionKeys
Read current lineJAWS Key + Up Arrow
Read from cursorJAWS Key + Down Arrow
Read current characterJAWS Key + Numpad 5
Move by wordCtrl + Left / Right Arrow
Move to start/end of lineHome / End
Toggle commentCtrl + /
Go to lineCtrl + G
Open command paletteCtrl + 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

  1. Download from: https://notepad-plus-plus.org/
  2. 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 + G to go to a specific line
  • Use Ctrl + F to 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:

  1. Open VSCode (or Notepad++) code ~/Documents/OpenSCAD_Projects

  2. Open or create a .scad file Ctrl + P -> type filename

  3. Write your OpenSCAD code

  4. Preview in OpenSCAD Ctrl + Shift + B (VSCode) Ctrl + F5 (Notepad++)

  5. If the shape looks right, export STL Run “Export STL” task in VSCode OR: In OpenSCAD, press F6 then File > Export > Export as STL

  6. Open PrusaSlicer, import the STL, slice, export G-code

  7. 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 --version in 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 + Z to 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 + Tab to switch to OpenSCAD and arrow through the console to read the error
  • Errors always include a line number - use Ctrl + G in 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

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 chapter
  • Right Arrow - go to the next chapter

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 Escape to close the search panel

Other Keyboard Shortcuts

KeyAction
SFocus the search box
EscapeClose search results
Left ArrowPrevious chapter
Right ArrowNext chapter
TToggle the table of contents sidebar

Screen Reader Navigation

Reading the page:

  • Use Up / Down Arrow to read line by line
  • Use H to jump between headings - this is the fastest way to skim a long lesson
  • Use Ctrl + F (browser Find) or S (mdBook search) to find specific content

Table of contents:

  • The sidebar is a navigation landmark. Press D to move between landmark regions, or use NVDA + F7 to open the Elements List and select “Landmarks” to navigate to the sidebar directly.
  • Within the sidebar, arrow through the list of links and press Enter to 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 + A to select all, or use the copy button if present.

Tips:

  • NVDA + P to cycle punctuation level - do this before reading code blocks
  • NVDA + F7 -> Links list - useful for navigating between major sections quickly
  • H key (headings navigation) is your best friend on lesson pages with many sections

Reading the page:

  • Use Up / Down Arrow in virtual cursor mode to read line by line
  • Press H to jump between headings
  • Press JAWS Key + F6 to get a list of all headings on the page

Table of contents:

  • Press R to move between landmark regions to reach the sidebar
  • Within the sidebar, Tab through the links or use Up / 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 list
  • JAWS Key + F6 - headings list
  • Ctrl + F - browser find, works alongside mdBook search

With VoiceOver (Mac / iOS)

Mac:

  • VO + U to open the rotor - select Headings to navigate by heading
  • VO + Command + F to search the page
  • H (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 + P opens 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/Right to 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

ActionKeys
Read current lineNVDA + Up Arrow
Spell current lineNVDA + Up Arrow (twice quickly)
Read from cursor to endNVDA + Down Arrow
Read current wordNVDA + Numpad 5
Spell current wordNVDA + Numpad 5 (twice quickly)
Read current characterNVDA + Numpad 2
Stop readingCtrl
ActionKeys
Move by characterLeft / Right Arrow
Move by wordCtrl + Left / Right Arrow
Move by lineUp / Down Arrow
Start / end of lineHome / End
Start / end of fileCtrl + Home / Ctrl + End
Go to line numberCtrl + G, type number, Enter
Find textCtrl + F
Toggle line commentCtrl + /

If NVDA Stops Reading the Editor

  1. Click in the editor area once with the mouse (or press Escape and then click)
  2. Press NVDA + Space to 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

ActionKeys
Read current lineJAWS Key + Up Arrow
Spell current lineJAWS Key + Up Arrow (twice quickly)
Read from cursorJAWS Key + A
Read current wordJAWS Key + Numpad 5
Read next wordJAWS Key + Right Arrow
Read current characterJAWS Key + Numpad 5 (once = word, twice = spell)
Stop readingCtrl

Adjusting Speech Rate

ActionKeys
Increase rateAlt + Ctrl + Page Up (or Fn + Up Arrow on laptops)
Decrease rateAlt + Ctrl + Page Down (or Fn + Down Arrow on laptops)
ActionKeys
Move by characterLeft / Right Arrow
Move by wordCtrl + Left / Right Arrow
Move by lineUp / Down Arrow
Start / end of lineHome / End
Start / end of fileCtrl + Home / Ctrl + End
Go to line numberCtrl + G
Find textCtrl + F
Toggle line commentCtrl + /

If JAWS Stops Reading the Editor

  1. Press JAWS Key + Z to toggle Virtual/Browse mode off - for VSCode you want Virtual mode off
  2. Focus the menu bar with Alt, then press Escape to return to the editor
  3. If still not working, press Alt + F4 to 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 + Tab to 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 + G in 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 messageWhat 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.

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:

  1. Measure -> say “seventy point three millimeters”
  2. Type 70.3 in OpenSCAD
  3. 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

  • H to jump between headings (chapter navigation)
  • Ctrl + F to search within the current page
  • The sidebar table of contents is a navigation landmark - use NVDA + F7 to list landmarks, or press D to jump between landmark regions
  • Previous/Next chapter links are at the bottom of each page

JAWS + Browser

  • H to move between headings
  • Ctrl + F (browser Find) to search
  • JAWS Key + F6 to list headings
  • R to 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 chapter
  • S - focus the search box
  • Escape - close search results
  • T - 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

  1. Choose a simple model (<2 hours print) from Thingiverse or Printables and save the STL.
  2. Inspect the model: note overhangs, thin features, and dimensions; write two short reasons why this model is appropriate for a first print.
  3. 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.
  4. Perform safety checks, start the print, and monitor the first 10 minutes for adhesion and extrusion problems.
  5. 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)

  1. What is the first-check you do after loading filament? (short answer)
  2. Name two slicer settings that affect strength. (short answer)
  3. Why monitor the first layers of a print? (one sentence)
  4. How do you document filament used for reproducibility? (short answer)
  5. What is one sign of poor bed adhesion? (one sentence)
  6. True/False: Selecting a model with support requirements is not recommended for your first print. (Answer: True)
  7. Short answer: Describe two characteristics of a “printability-friendly” model that would be good for a beginner’s first print.
  8. Practical scenario: Your first print is showing stringing (thin lines between parts). What are two possible causes and how would you troubleshoot?
  9. 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
  10. 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)

  1. Re-slice the model with a finer layer height and compare surface finish and print time; document differences.
  2. Modify the model in OpenSCAD to thicken a failing feature and reprint a small test piece.
  3. Create a short checklist script (or text checklist) that verifies spool metadata and bed temperature before printing.
  4. Produce a one-page reflection that includes three lessons learned and one parameter you will change next time.
  5. Share your measurements and photos in the class folder and give feedback on two peers’ prints.
  6. Conduct a post-print analysis: compare actual measurements to STL specifications; identify and document any deviations.
  7. Print the same model in two different materials or with two different slicer profiles; compare durability, appearance, and accuracy.
  8. Create a detailed documentation package: CAD file, slicer settings, print log, measurements, and lessons learned.
  9. Design a quality assurance test: define pass/fail criteria and systematically verify your print meets all requirements.
  10. 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

ParameterValue
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

  • 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)

FeatureModel Spec (mm)Printed (mm)DeviationNotes

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 .stl model 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

CategoryScoreNotes
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

CategoryRevised ScoreNotes
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):

CategoryPointsWhat We Measure
Problem & Solution0-3Did the student select an appropriate model? Did the print succeed?
Design & Code Quality0-3Is documentation of printer setup thorough? Is print quality good?
Documentation0-3Is all documentation complete? Are measurements recorded? Is reflection thoughtful?

Category 1: Problem & Solution (0-3 points)

ScoreDescription
3Student selected appropriate model with sound reasoning. Print completed successfully with good adhesion and finish. No major issues.
2Model generally appropriate. Print mostly successful with minor adhesion or finish issues.
1Model had some difficulties; print partially successful or required intervention.
0Print failed or model was inappropriate.

Category 2: Design & Code Quality (0-3 points)

ScoreDescription
3Printer setup documented thoroughly. Safety checks evident. Print quality excellent. Photos provided.
2Setup documented adequately. Print quality acceptable. Some documentation of settings.
1Minimal documentation of setup. Print quality has defects.
0Setup not documented or print failed to start.

Category 3: Documentation (0-3 points)

ScoreDescription
3All sections complete. Measurements recorded precisely. Reflection is specific and shows learning.
2Most sections present. Measurements recorded but reflection brief.
1Incomplete sections. Measurements minimal. Reflection lacking.
0No documentation.

Score Interpretation

Total ScoreInterpretationNext Step
8-9Excellent workStudent ready for independent printing projects
6-7Good executionEncourage documentation habit
4-5Meets basicsDiscuss printer setup and safety
2-3Does not meet expectationsResubmission or additional practice
0-1Missing major componentsMeet with instructor

Resubmission Policy

Students may resubmit to improve their score. Resubmissions must include:

  1. 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

  1. Open src/main.scad; identify and run simple examples using cube(), sphere(), and cylinder()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);
    
  2. Create three short examples demonstrating union(), difference(), and intersection() 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);
    // }
    
  3. 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);
    }
    
  4. Build an STL with 3dm build and open it in your slicer to check for thin walls or islands3.

  5. Document any fixes in the project README and commit the working main.scad and 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:

  1. During design iteration: Use $fn = 12 or $fn = 20 for quick feedback
  2. Before export: Increase to $fn = 32 or higher for final quality
  3. For complex assemblies: Keep $fn low 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:

  1. Coincident Faces -> Use small offsets (0.001 mm)
  2. Zero-Thickness Walls -> Ensure all walls are at least 0.8-1.0 mm
  3. Gaps Between Shapes -> Check that boolean operations have no small gaps; use minkowski() for rounded edges if needed
  4. 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)

  1. Name three primitive functions in OpenSCAD1.
  2. What does difference() accomplish2?
  3. Why might two coincident faces cause a render failure4?
  4. What is the 0.001 rule and why is it useful4?
  5. How does lowering $fn help during debugging2?
  6. True or False: union() combines shapes while intersection() keeps only overlapping volumes.
  7. Describe what Constructive Solid Geometry (CSG) is and give an example of where it’s useful.
  8. Explain how scale(), translate(), and rotate() transforms change a primitive’s behavior.
  9. How would you diagnose and fix a non-manifold issue in your model?
  10. 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:

These projects reinforce the boolean operations and CSG concepts you learned in this lesson.

Extension Problems (10)

  1. Create a small assembly using union() of three primitives and export the STL. Reference best practices from OpenSCAD documentation1.
  2. Intentionally create a failing boolean and fix it using offsets; explain your approach. Document the manifold issues encountered4.
  3. Write a short test script that generates three variants with varying $fn values and compare render times. Consider using 3dMake workflows3.
  4. Use 3dm info (if available) to generate a report on your model and document any recommendations3.
  5. Explore using a library module (e.g., a fillet helper) to fix a sharp corner and note the difference in final STL2.
  6. Build a geometry validation toolkit: test all basic transformations (union, difference, intersection) with edge cases and document failure modes.
  7. Create a parametric assembly generator that produces 5+ configurations and validates each for printability.
  8. Develop a boolean operation troubleshooting guide with visual examples and step-by-step fixes.
  9. Design a library module system for common geometric operations (fillets, chamfers, arrays); test reusability across projects.
  10. 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:


  1. OpenSCAD Manual - Primitives and Transforms - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem ↩2 ↩3 ↩4

  2. 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

  3. Slicer Validation - PrusaSlicer Documentation - https://docs.prusa3d.com/en/guide/39012-validation-tools/ ↩2 ↩3 ↩4

  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

KeyAction
F5Preview (fast)
F6Full render (for export)
Ctrl+SSave
Ctrl+ZUndo
F3Reset camera view
F5 then scrollZoom with mouse

Export Workflow

  1. Press F6 (full render - wait for it to complete)
  2. File > Export > Export as STL
  3. 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

  1. Interview a potential user (or yourself) and write a 1-paragraph problem statement.
  2. Search repositories for candidate models; list three options and justify which one you will adapt.
  3. Adapt the model (scale, add mounts, or modify features) and document the changes in a short changelog.
  4. Slice, print, and run a supervised test of the prototype; log any failures and corrective actions.
  5. 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)

  1. What is a good first question to ask a stakeholder when scoping this project? (short answer)
  2. Name one safety consideration when adapting a model for daily use. (short answer)
  3. What is a changelog entry? (one sentence)
  4. How do you verify a fit for an assembled part? (short answer)
  5. Why document corrective actions during testing? (one sentence)
  6. True/False: Once you complete a successful first print, any second project will automatically succeed without iteration. (Answer: False)
  7. Short answer: Describe one method to gather user feedback on your adapted model before committing to a full production print.
  8. 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?
  9. 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
  10. 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)

  1. Rework your prototype to improve durability and report trade-offs in weight and print time.
  2. Create a user test script and run it with two participants; summarize results.
  3. Convert a critical component to parametric OpenSCAD and publish the variant.
  4. Add a small assembly guide with tactile cues for non-visual users.
  5. Compare two filament types for the same part and recommend one with justification.
  6. Execute a formal design iteration cycle: print, test, measure, analyze, revise; repeat at least 3 times and document improvements.
  7. Build a comparative analysis: print your part in 2 different materials or with 2 different profiles; measure and compare all key properties.
  8. Create a complete design dossier: CAD files, iteration history, test results, measurements, lessons learned, and final recommendations.
  9. Develop a user testing protocol: define success metrics, recruit testers, gather systematic feedback, and iterate based on results.
  10. 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

ParameterValue
Print time
Filament
Key dimension 1
Key dimension 2

Adapted Model Specifications

ParameterOriginalAdaptedReason 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

  • Date:
  • Modifications:
  • Results:
  • Issues:
  • Next action:
  • Date:
  • Modifications:
  • Results:
  • Issues:
  • Next action:
  • 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 (.scad or .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

CategoryScoreNotes
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

CategoryRevised ScoreNotes
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 .scad or .stl files 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):

CategoryPointsWhat We Measure
Problem & Solution0-3Is the adapted design functional? Does it solve the stated adaptation goal?
Design & Code Quality0-3Are modifications clear and well-documented? Is iteration evident? Does the part work well?
Documentation0-3Is the iteration cycle documented? Are design decisions explained? Is reflection thorough?

Category 1: Problem & Solution (0-3 points)

ScoreDescription
3Adaptation successfully addresses design goal. Print is functional and performs as intended in modified context.
2Adaptation mostly addresses goal. Print is functional with minor limitations.
1Adaptation partially addresses goal. Print has functional limitations.
0Adaptation does not work or is not attempted.

Category 2: Design & Code Quality (0-3 points)

ScoreDescription
3Modifications clearly documented with before/after comparison. Iteration cycle evident (multiple prints/tests). Print quality excellent.
2Modifications documented adequately. Some iteration evident. Print quality acceptable.
1Minimal modification documentation. Little iteration. Print quality acceptable but lacks refinement.
0Modifications not documented or design not functional.

Category 3: Documentation (0-3 points)

ScoreDescription
3All sections complete. Design iteration documented with measurements and testing results. Reflection is specific. Photos included.
2Most sections present. Iteration documented but could be more detailed. Reflection adequate.
1Incomplete sections. Minimal iteration documentation. Reflection brief.
0No documentation submitted.

Score Interpretation

Total ScoreInterpretationNext Step
8-9Excellent adaptationStudent demonstrates design maturity
6-7Good iteration and adaptationEncourage further design work
4-5Meets basics; improve iterationResubmit iteration documentation
2-3Does not meet expectationsResubmission or coaching
0-1Missing componentsMeet with instructor

Resubmission Policy

Students may resubmit to improve their score. Resubmissions must include:

  1. 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

  1. Choose a model from Thingiverse or Printables and note the original dimensions.
  2. Decide on a purposeful modification (scale, add mounting holes, combine parts) and explain why.
  3. Apply changes in OpenSCAD (or by scaling in the slicer) and record the new dimensions.
  4. Slice and print all parts in one session when possible; log print times and filament used.
  5. 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)

  1. What is one risk when scaling a model up or down? (short answer)
  2. Name two checks to perform before printing multi-part models. (short answer)
  3. How should you record filament usage? (short answer)
  4. Why document construction steps? (one sentence)
  5. What is one visual sign a part needs more infill? (one sentence)
  6. 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)
  7. 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?
  8. 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?
  9. 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
  10. 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)

  1. Create a small assembly guide with tactile cues for non-visual users.
  2. Produce two scaled variants and compare required print time and fit.
  3. Modify a part to include snap-fit connectors and document fit tolerances.
  4. Add simple labeling to parts using embossed text in OpenSCAD.
  5. Publish your variant and short build notes to the class repo and review two peers’ submissions.
  6. Build a complete variant library: create 5+ variations of your bonus print; document parameters, reasoning, and use cases.
  7. Design a variant optimization process: compare variants by cost, print time, quality, and functionality; justify your “best” choice.
  8. Create a parametric master file that generates all variants automatically; test parameter ranges and edge cases.
  9. Develop a variant documentation and sharing system: create a portfolio with photos, specs, and instructions for each variant.
  10. 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

VariantScalePrint Time (est.)Filament (est.)Key Dimensions
v1
v2
v3

VariantActual Print TimeActual FilamentQualityNotes
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

  • .scad file with variant generation code
  • Photos of all variants (assembled if applicable)
  • Print log for each variant
  • Comparison analysis

Teacher Feedback

CategoryScoreNotes
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 .scad with 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

  1. Open src/main.scad and 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
    
  2. 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);
    
  3. Include a library module (e.g., include <bosl/constants.scad>) and call a small helper from it; run 3dm 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]);
    }
    
  4. Produce a low-resolution render to confirm topology, then export an STL and inspect it in a slicer4.

    • Use $fn=12 or lower during development to speed up renders
    • Once satisfied, increase to $fn=32 or $fn=64 for final prints
  5. 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:

  1. Different parameter values: Call the module with minimum, maximum, and mid-range values
  2. Default values: Verify that calling it with no parameters produces a reasonable result
  3. Rendered output: Use $fn = 32 to render the module and visually inspect for geometry issues
  4. 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)

  1. What is a parametric module and why is it useful1?
  2. How do you include an external library in OpenSCAD2?
  3. What is one advantage of moving code into lib/1?
  4. How can you test a module quickly without a full high-resolution render4?
  5. Name one safety or documentation step to include when producing a reusable module1.
  6. True or False: Parametric modules can only accept one parameter.
  7. Describe what “Don’t Repeat Yourself” (DRY) means in the context of 3D model code.
  8. Explain how you would create a module with three parameters and use it in your main file.
  9. What testing strategies should you use to validate a new module before using it in production prints?
  10. How would you document a reusable module so that future users (including yourself) understand its parameters and limitations?

Extension Problems (10)

  1. Create a module for a mounting bracket with parameters for hole size and spacing; publish a usage example1.
  2. Use a library module to add a fillet and compare the final STL before and after2.
  3. Produce three variants by changing a parameter and record estimated print times1.
  4. Move a working module into lib/ and commit with a clear commit message3.
  5. Write a short README for your module describing parameter ranges and expected units1.
  6. Build a complete module library with 5+ reusable parts; create comprehensive documentation and usage examples for each.
  7. Design a module versioning and compatibility system; document how to manage parameter changes over time.
  8. Create a module testing suite: write validation tests for parameter ranges, edge cases, and output consistency.
  9. Develop an accessibility guide for module parameters: explain how to use and understand module options without visual feedback.
  10. 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:


  1. OpenSCAD Modules - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Modules ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10

  2. BOSL - OpenSCAD Standard Library - https://github.com/BelfrySCAD/BOSL2 ↩2 ↩3 ↩4 ↩5

  3. 3DMake GitHub - https://github.com/tdeck/3dmake ↩2

  4. 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 info to 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

  1. Verify API configuration (if used) or run 3dm info --dry-run to confirm render pipeline works locally1.
  2. Run 3dm info and save the produced images and textual report to build/1.
  3. Inspect deterministic outputs (render warnings, slicer preview) and compare them to AI recommendations; prioritize deterministic issues3 2.
  4. Iterate prompt engineering (in 3dmake.toml or via --prompt) with precise technical primitives and re-run 3dm info to examine changes3.
  5. Document all prompts, AI outputs, and deterministic validation steps in AI-notes.md within the project3.

Checkpoints

  • After step 2 you have stored render images and the AI report in build/1.

Quiz - Lesson 3dMake.4 (10 questions)

  1. What command generates AI diagnostics and model renders1?
  2. Why must AI outputs be validated against renderer/slicer results3 2?
  3. Name one privacy or governance concern when sending models/images to an API3.
  4. What is an example of a technical primitive to include in a prompt3?
  5. Where should you record prompts and AI outputs in the project3?
  6. True or False: AI-generated suggestions should always be implemented without verification.
  7. Describe what “deterministic validation” means in the context of AI-assisted 3D design.
  8. Explain how you would use 3dm info to validate AI suggestions against your actual model.
  9. What steps would you take if the AI suggests a design change that conflicts with your requirements?
  10. How would you document AI-assisted decisions in your project for reproducibility and transparency?

Extension Problems (10)

  1. Create an AI-notes.md documenting three prompts and the AI’s responses; indicate which suggestions you acted on3.
  2. Simulate a false-positive AI warning: describe how you validated and rejected it using deterministic checks2.
  3. Generate a short prompt that requests the top three structural risks and record the results3.
  4. Create a short checklist for sanitizing uploads before sending to an API3.
  5. Re-run 3dm info after a code fix and compare the differences in the AI report1.
  6. Design a verification workflow: use AI suggestions + manual validation + physical testing to validate design decisions.
  7. Create a transparency log for AI-assisted features: document all AI interactions, suggestions adopted, and decisions made.
  8. Build an AI-assisted design case study: from initial prompt through final print; document the entire decision process.
  9. Develop guidelines for trustworthy AI use in 3D printing: when to trust AI, when to verify, and how to validate recommendations.
  10. Write an accessibility guide for using AI features in 3DMake: how to interpret AI suggestions non-visually and understand confidence levels.

  1. 3DMake GitHub - https://github.com/tdeck/3dmake ↩2 ↩3 ↩4 ↩5 ↩6

  2. Deterministic Validation in Design - https://www.nist.gov/publications ↩2 ↩3 ↩4

  3. 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

  1. Create three distinct die designs in OpenSCAD using parameters (size, face style, internal cavities).
  2. For each die, explain which parameters you changed and why (one short paragraph each).
  3. Print one sample of each die and perform a basic durability test (five throws onto a soft surface).
  4. Record outcomes of each throw and compute a simple frequency table for face results.
  5. 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)

  1. What parameter controls wall thickness in your .scad file? (short answer)
  2. Name one method to increase a part’s impact resistance. (short answer)
  3. How would you test randomness in a die? (short answer)
  4. Why might a hollow die behave differently than a solid one? (one sentence)
  5. What is a simple sign of print-layer delamination? (one sentence)
  6. True/False: A perfectly fair die must have uniform weight distribution throughout, including the internal structure. (Answer: True)
  7. Short answer: Describe two design approaches to a die that could be parametrically scaled - one using cube() with difference() for texture, one using linear_extrude() for embossed numbers.
  8. 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?
  9. 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
  10. 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)

  1. Create a parametric script that produces dice with adjustable center-of-mass offsets and show results of roll tests.
  2. Design a bead-style die that assembles from two printed halves and document assembly steps.
  3. Compare two infill patterns for the same die and report on mass and durability differences.
  4. Add tactile markers to faces for non-visual testing and document how they affect roll behavior.
  5. Publish your .scad and test logs to the class repo and provide feedback on two classmates’ designs.
  6. Conduct a formal fairness test: roll your die 100+ times, track results, and perform statistical analysis to verify randomness.
  7. Design multiple die variants (sizes, infills, materials); compare manufacturing feasibility, cost, and performance for each.
  8. Create a parametric die library: build a system that generates dice of different sizes, materials, and properties on command.
  9. Develop a comprehensive quality assurance protocol: define tolerances, measurement methods, and acceptance criteria for fair dice.
  10. 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

ParameterValue
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

FaceFrequency (out of ___ rolls)PercentageExpected %
116.67%
216.67%
316.67%
416.67%
516.67%
616.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

  • .scad file 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

CategoryScoreNotes
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

  • .scad file 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

  1. Conduct a safety briefing: review the Hierarchy of Controls and locate safety equipment1.
  2. Verify environmental controls and printer readiness: confirm filtration, bed adhesion, and spool metadata1 2.
  3. Run 3dm build and inspect the STL in a slicer; check layer-preview and non-manifold warnings3 4.
  4. If using remote submission (OctoPrint), confirm camera monitoring and logging before any unattended prints1.
  5. Obtain instructor sign-off and monitor the first layers in-person or via camera.
  6. After printing, wait for the part to cool (< $30^\circ\text{C}$), measure critical dimensions, and record observations1 2.

Checkpoints

  • Completed environmental checklist and saved inspection notes in the project README3 1.

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:

MaterialPrint TempDifficultyBest UsesCautions
PLA190-220CEasyPrototypes, classroom projects, decorative modelsBrittle; low heat resistance; low emission
PETG230-250CModerateFunctional parts, mechanical components, water resistanceStringing issues; requires bed heat; more emission than PLA
TPU220-240CHardFlexible parts, phone cases, gaskets, wearablesRequires 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)

  1. What are the four levels of the Hierarchy of Controls1?
  2. Name two engineering controls useful for reducing emissions1 2.
  3. Why must you monitor the first layers of a new print profile1?
  4. Where should you record spool metadata and print observations3 1?
  5. What is the safe cooldown temperature suggested before part removal2?
  6. True or False: Ventilation is only necessary for commercial printing facilities.
  7. Describe the relationship between print temperature, material type, and emissions.
  8. Explain what “spool metadata” includes and why tracking it is important for reproducibility.
  9. How would you measure and record critical dimensions on a printed part?
  10. What health and safety precautions should be documented in an SOP for supervised prints?

Extension Problems (10)

  1. Draft a one-page SOP for start-to-finish supervised prints in your lab1 2.
  2. Create a checklist script that verifies spool metadata and build settings before 3dm build runs3.
  3. Run a test print and log measured deviations; propose a parameter change to correct the error4.
  4. Design an accessible post-print inspection checklist that non-visual users can follow1 2.
  5. Research filtration options and recommend one for your classroom, including maintenance intervals1 2.
  6. Develop a comprehensive classroom safety and operations manual: SOPs, checklists, emergency procedures, and accessibility considerations.
  7. Create a print quality assurance system: define metrics, measurement methods, and acceptance criteria for finished prints.
  8. Build a calibration and maintenance log: document all calibration activities, maintenance dates, and performance metrics over time.
  9. Design a student training certification program: define knowledge and skill requirements, create assessments, and track competency.
  10. Write an operations handbook that covers setup, troubleshooting, safety, maintenance, and accessibility for your 3D printing facility.

  1. ANSI/AIHA Z590.3 - Hierarchy of Controls - https://www.aiha.org/ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14

  2. 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

  3. STL Validation and Geometry Checking - https://docs.prusa3d.com/en/guide/39012-validation-tools/ ↩2 ↩3 ↩4 ↩5

  4. 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

DateMaintenance TypeDescriptionTime SpentIssues FoundResolutionPerformed By

Issue Tracking

DateSymptomDiagnosisAction TakenStatusNotes

Parts Replacement

DatePartReasonSupplierCostNotes

Filament Compatibility Notes

Test results for different filament types used with this printer:

Filament TypeBrandNozzle TempBed TempPrint SpeedSuccess RateNotes
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:

MonthPrint Success RateAvg Print TimeCommon IssuesOverall 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

PropertyPLAPETGABSTPU
Nozzle Temp (C)200-220235-250240-260220-240
Bed Temp (C)20-6070-90100-11020-60
StrengthModerateHighVery HighLow (Flexible)
FlexibilityNoneSlightSlightHigh
Ease of PrintVery EasyEasyHardModerate
Cost ($/kg)$15-25$20-30$18-28$30-50
Print Speed40-60 mm/s30-50 mm/s20-40 mm/s10-30 mm/s
Supports NeededUsually YesUsually YesAlways YesYes
Bed AdhesionEasyModerateRequires prepEasy
Durability2-3 years5+ years5+ years3+ years
UV ResistanceLowModerateHighLow
Chemical ResistantNoModerateYesNo

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
Temperature RangePrint SpeedQualitySupport Needed
Low40-50 mm/sModerateUsually
Medium50-70 mm/sHighUsually
High70-100+ mm/sLowerMaybe

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

MaterialWaterAlcoholAcetoneOilsAcids
PLALowLowDissolvesLowLow
PETGHighModerateModerateHighModerate
ABSHighModerateDissolvesHighModerate
TPUModerateLowLowModerateLow

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)

MaterialSafe to ~CSoftens at ~CNotes
PLA50-6060-70Not suitable for hot items
PETG80-100100-110Can handle warm environments
ABS90-110110-120Good heat resistance
TPU60-8080-100Limited heat resistance

Cost & Availability

Material Cost per Print (for typical small project)

MaterialTypical Print WeightMaterial CostTotal Cost
PLA50g$0.50$0.50
PETG50g$1.00$1.00
ABS50g$0.90$0.90
TPU50g$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

PropertyPLAPETGTPU (Flex)ABS
DifficultyEasiestModerateHardVery Hard
Nozzle temp190-220C230-250C220-240C230-250C
Bed temp50-60C70-85C30-60C90-110C
Enclosure needed?NoNoNoYes
RigidityHighMediumNone - flexibleHigh
Impact resistanceLow (brittle)MediumVery highMedium
Heat resistanceLow (~60C)Medium (~80C)MediumHigh (~100C)
FlexibilityNoneSlightRubber-likeNone
Moisture sensitivityLowMediumHighMedium
Fume concernLowestLowModerateHigh
Bed adhesionEasyUse glue stick on PEIEasyRequires enclosure + glue
Print speedNormalNormalSlow (20-30 mm/s)Normal
Stringing tendencyLowMedium-HighHighLow
Approximate cost$15-25/kg$15-30/kg$20-40/kg$15-25/kg
Recommended for beginners?[YES] YesAfter PLAAfter 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

FilamentPrusaSlicer Profile NameKey Changes from PLA Default
PLAGeneric PLA- (baseline)
PETGGeneric PETGHigher temps; slower cooling; use glue stick on PEI
TPUGeneric FlexLower speed (20-30 mm/s); reduced retraction
ABSGeneric ABSHigher 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).

FilamentMoisture SensitivityStorage Recommendation
PLALowSealed bag with desiccant when not in use
PETGMediumSealed bag with desiccant; dry before use if stored open
TPUHighAlways store sealed; dry in oven (65C for 4-6 hrs) if it has absorbed moisture
ABSMediumSealed 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.

CommandPurposeExample
3dm describe <file>Generates text and AI analysis of geometry3dm 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 orientation3dm orient src/main.scad
3dm slice <file>Generates G-code (machine instructions)3dm slice src/main.scad

Step-by-step Tasks

  1. 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();
    }
    
  2. Run 3dm describe to generate a text-based analysis of your model:

    3dm describe src/main.scad
    

    This will output a description suitable for non-visual inspection. If AI is configured, you’ll also receive suggestions about geometry and potential print issues.

  3. Generate a tactile 2D preview with 3dm preview:

    3dm preview src/main.scad
    

    This creates a simplified 2D outline that can be printed for physical inspection or converted to braille for accessibility.

  4. Analyze print orientation with 3dm orient:

    3dm orient src/main.scad
    

    This command suggests the optimal orientation for printing-minimizing support material and maximizing surface quality.

  5. Prepare for printing by slicing your model:

    3dm slice src/main.scad
    

    This 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:

ParameterOriginalTry ThisEffect
key_size1825Larger keycap
key_height128Shorter, lower-profile key
letter“A”“YOUR_INITIAL”Different character
wall1.21.5Thicker walls (stronger)
letter_raise0.81.5Deeper emboss

Quiz - Lesson 3dMake.6 (10 questions)

  1. What does 3dm describe provide that 3dm preview does not1?
  2. Why is 3dm preview useful for accessibility1?
  3. What does 3dm orient help you determine about your model1?
  4. How does parametric design (using variables) make customization easier2?
  5. Name one use case for embossed text in a 3D model2.
  6. True or False: You must run 3dm build before running 3dm describe.
  7. Explain the relationship between wall thickness and print strength.
  8. Describe what happens when you change the $fn parameter in your text() function.
  9. How would you modify the keycap code to add a second embossed character2?
  10. What information would you include in a 3dm describe output for a manufacturer1?

Extension Problems (10)

  1. Create three keycap variants (small, medium, large) by changing key_size and export each as a separate STL2.
  2. Add a decorative border using linear_extrude and text(); verify the result with 3dm preview1.
  3. Run 3dm describe, 3dm preview, and 3dm orient on your keycap; document all outputs1.
  4. Modify the emboss module to support multiple characters in different positions2.
  5. Create a parametric keycap library with variants for different keyboard layouts (cherry, OEM, DSA profiles)2.
  6. Design an accessibility assessment: use 3dm describe and 3dm preview to validate your model for non-visual users.
  7. Build a custom keycap design system: parameterize profile, height, wall thickness, and emboss content; generate a product family.
  8. Create a comparison study: test three different emboss depths and document print quality differences.
  9. Develop a keycap troubleshooting guide: common failures (emboss erosion, wall cracking, text illegibility) and solutions.
  10. Write a comprehensive keycap design documentation: parameters, materials, print settings, post-processing, and accessibility features.

References


  1. 3DMake GitHub Repository - https://github.com/tdeck/3dmake ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  2. 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


Use CaseLayer HeightInfillSupportsNotes
Quick test / prototype0.30 mm10%As needed“Draft” - fastest, roughest
Standard project0.20 mm15-20%As neededBest all-around starting point
Functional part0.20 mm30-40%As neededUse for parts under stress
Fine detail / display0.15 mm15%As neededSmoother surface; slower
Solid reference part0.20 mm40-50%RarelyRarely needed; long print

Filament Temperature Settings

FilamentNozzle TempBed TempNotes
PLA200-215C50-60CEasiest to print; default choice
PETG230-250C70-85CUse glue stick on PEI bed
TPU220-240C30-60CPrint at 20-30 mm/s max; direct drive only
ABS230-250C90-110CRequires enclosure; more fumes

Always check the temperature range on your filament spool - it may vary by brand.


Support Settings Guide

Overhang AngleSupports Needed?Recommended Setting
< 45NoNone
45-60MaybePreview first; add if sagging
> 60YesSupport on build plate only
Bridge < 20 mmNoBridges usually fine
Bridge > 20 mmMaybePreview; consider reorienting

Common Print Problems & Quick Fixes

ProblemLikely CauseFix
Print lifts off bedPoor adhesion / warpingAdd brim; use glue stick; level bed
Stringing between partsTemperature too high / retractionLower temp 5C; check retraction settings
Layer lines very visibleLayer height too thickUse 0.15mm or 0.20mm
Print takes too longLayer height too thin / infill too highUse 0.30mm draft; reduce infill
Holes too smallFDM tolerance - always undersizedAdd 0.2-0.3mm to hole diameter
Part broke at layer boundaryWeak axis perpendicular to layersReorient so load is parallel to layers
First layer not stickingBed not levelRun bed leveling routine
Spaghetti / print failureNo supports on overhangAdd 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


Use CaseLayer HeightInfillSupportsNotes
Quick test / prototype0.30 mm10%As needed“Draft” - fastest, roughest
Standard project0.20 mm15-20%As neededBest all-around starting point
Functional part0.20 mm30-40%As neededUse for parts under stress
Fine detail / display0.15 mm15%As neededSmoother surface; slower
Solid reference part0.20 mm40-50%RarelyRarely needed; long print

Filament Temperature Settings

FilamentNozzle TempBed TempNotes
PLA200-215C50-60CEasiest to print; default choice
PETG230-250C70-85CUse glue stick on PEI bed
TPU220-240C30-60CPrint at 20-30 mm/s max; direct drive only
ABS230-250C90-110CRequires enclosure; more fumes

Always check the temperature range on your filament spool - it may vary by brand.


Support Settings Guide

Overhang AngleSupports Needed?Recommended Setting
< 45NoNone
45-60MaybePreview first; add if sagging
> 60YesSupport on build plate only
Bridge < 20 mmNoBridges usually fine
Bridge > 20 mmMaybePreview; consider reorienting

Common Print Problems & Quick Fixes

ProblemLikely CauseFix
Print lifts off bedPoor adhesion / warpingAdd brim; use glue stick; level bed
Stringing between partsTemperature too high / retractionLower temp 5C; check retraction settings
Layer lines very visibleLayer height too thickUse 0.15mm or 0.20mm
Print takes too longLayer height too thin / infill too highUse 0.30mm draft; reduce infill
Holes too smallFDM tolerance - always undersizedAdd 0.2-0.3mm to hole diameter
Part broke at layer boundaryWeak axis perpendicular to layersReorient so load is parallel to layers
First layer not stickingBed not levelRun bed leveling routine
Spaghetti / print failureNo supports on overhangAdd 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


Use CaseLayer HeightInfillSupportsNotes
Quick test / prototype0.30 mm10%As needed“Draft” - fastest; use standard mode
Standard project0.20 mm15-20%As neededBest all-around; Bambu default-optimized
Functional part0.20 mm30-40%As neededUse for load-bearing parts
Fine detail / display0.15 mm15%As neededBambu achieves excellent detail at speed
Solid reference part0.20 mm40-50%RarelyRarely needed; modern infill sufficient

Filament Temperature Settings

FilamentNozzle TempBed TempNotes
PLA (standard)200-210C50-60CFastest print times; Bambu-optimized profiles
PETG230-250C70-80CSlight cooling fan reduction for layer adhesion
TPU220-240C20-30CBest quality with Bambu’s tuned retraction
ABS240-260C100-110CRequires chamber heating; enclosed AMS recommended

Check Bambu’s material database for exact profile updates - these are dynamically optimized.


Support Settings Guide

Overhang AngleSupports Needed?Recommended Setting
< 45NoNone
45-60MaybeAuto-supports may activate; accept defaults
> 60YesBambu auto-tree supports; minimal removal
Bridge < 20 mmNoBridges excellent on Bambu; no supports needed
Bridge > 20 mmMaybeOften bridgeable; preview before confirming

Common Print Problems & Quick Fixes

ProblemLikely CauseFix
Nozzle clogging mid-printThermal runaway / wet filamentDry filament in AMS; check nozzle temp
Layer splitting or separationWrong material in AMS slotVerify correct material in Bambu Studio
Stringing / blobbingCooling fan reduced too muchIncrease cooling; adjust material profile
Print lifts off bedRare on Bambu; bed leveling driftAuto-calibrate via Bambu Studio
Holes undersizedFDM tolerance - always undersizedAdd 0.3-0.4mm to hole diameter
Part broke at layer boundaryWeak axis perpendicular to layersReorient so load is parallel to layers
Print aborts unexpectedlyAMS issue / filament jamClear AMS; verify filament path is smooth
Multi-material print misalignedNozzle offset miscalibrationRun 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


Use CaseLayer HeightInfillSupportsNotes
Quick test / prototype0.30 mm10%As needed“Draft” - fastest, roughest
Standard project0.20 mm15-20%As neededBest all-around starting point
Functional part0.20 mm30-40%As neededUse for parts under stress
Fine detail / display0.15 mm15%As neededSmoother surface; slower
Solid reference part0.20 mm40-50%RarelyRarely needed; long print

Filament Temperature Settings

FilamentNozzle TempBed TempNotes
PLA200-210C50-60CEasiest to print; Anycubic default
PETG230-240C70-80CUse painter’s tape on steel bed
TPU220-235C30-50CReduced speed recommended (25-30 mm/s)
ABS240-250C100-110CRequires ventilation; enclosed chamber recommended

Always check the temperature range on your filament spool - it may vary by brand.


Support Settings Guide

Overhang AngleSupports Needed?Recommended Setting
< 45NoNone
45-60MaybePreview first; add if sagging
> 60YesTree supports (Cura) recommended for easier removal
Bridge < 20 mmNoBridges usually fine
Bridge > 20 mmMaybePreview; consider reorienting

Common Print Problems & Quick Fixes

ProblemLikely CauseFix
Print not adhering to steel bedPoor bed leveling / tape wornRe-level nozzle; refresh painter’s tape
Filament oozing on travelTemperature too highLower temp 5C; check Z-hop setting
Rough bottom layerBed too closeUse leveling knob to adjust distance
Print takes too longLayer height too thin / infill too highUse 0.30mm draft; reduce infill to 10%
Holes too smallFDM tolerance - always undersizedAdd 0.2-0.3mm to hole diameter
Part broke at layer boundaryWeak axis perpendicular to layersReorient so load is parallel to layers
Clogs at nozzleMoisture in filament / debrisDry filament; clean nozzle with needle
Spaghetti / complete failureBed not leveled or supports missedRun 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

  1. Create keychain.scad with top-level parameters: width, height, thickness, and text.
  2. Implement embossed or debossed text using linear_extrude() of a 2D text shape (or simulate with simple geometry if system lacks text support).
  3. Produce three size variants and export STLs; record print settings.
  4. Test attachment point for common key rings and report fit.

Deliverable

  • Source keychain.scad file with parametric variables documented
  • Three STL variants (small, medium, large)
  • Print settings log and fit-test report for key ring attachment

Starter files

Assessment Questions (Optional)

  1. How did you use OpenSCAD parameters to enable users to customize the keychain without editing code?
  2. What were the key differences in print time and material usage between your three variants?
  3. 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

VariableDefault ValuePurpose

Variant Configurations

VariantParameter 1Parameter 2Parameter 3Notes
v1
v2
v3

  • 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

  • .scad file with full parametric structure
  • Photos of 2+ printed variants
  • Variant specification table
  • Usage/customization guide

Teacher Feedback

CategoryScoreNotes
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

  • .scad with 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

OperationSyntaxExample
Translate (move)translate([x, y, z]) { ... }translate([10, 0, 0]) cube([5, 5, 5]);
Rotaterotate([x_deg, y_deg, z_deg]) { ... }rotate([45, 0, 0]) cube([5, 5, 5]);
Scalescale([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:

ParameterValueUse CasePrint Time
angle45Shallow viewing (documents, web browsing)~1.5 hrs
angle65Comfortable video watching~1.5 hrs
angle75Steep 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)

  1. What does the rotate() function do, and how does it differ from physical rotation1?
  2. Why is parametric positioning important for design iteration1?
  3. Explain the Minkowski sum operation and why it’s useful for filleting2.
  4. How would you position a second component relative to the first using translate()1?
  5. What parameter would you change to make a phone stand suitable for tablets3?
  6. True or False: You can rotate an object around multiple axes in a single rotate() call.
  7. Describe how $fn affects the appearance of rounded edges created by Minkowski2.
  8. What advantage does parametric design have over manually modeling each variant1?
  9. How would you verify that your stand’s angle matches your design intent after printing3?
  10. What design considerations should you account for when adding a lip to prevent phone slippage3?

Extension Problems (10)

  1. Create five stand variants (for phones, tablets, documents, laptops, and books) by parameterizing width, angle, and lip height3.
  2. Add parametric feet (small cylinders) to the base to improve stability; test with and without feet1.
  3. Use 3dm describe to document each variant’s key geometric properties1.
  4. Design and test a snap-fit connector system that joins the base and back without fasteners3.
  5. Create a comparison table showing print time, material weight, and assembly complexity for each variant3.
  6. Build a complete phone stand product family: define naming convention, parameter ranges, and assembly instructions.
  7. Develop a stress analysis guide: identify high-stress areas in your stand and propose reinforcement strategies.
  8. Create a customization guide for end users: how to modify angle, width, and lip height for different devices.
  9. Design an accessibility-focused stand: include tactile angle markers and clear, non-visual assembly instructions.
  10. Write a comprehensive stand design documentation: CAD parameters, material recommendations, print settings, assembly, troubleshooting, and accessible design notes.

References


  1. OpenSCAD Manual - Transformations - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  2. OpenSCAD Manual - Minkowski - https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#minkowski ↩2 ↩3

  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:

  1. Print a second identical bin
  2. 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_clear if 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:

  1. Creating a flexible arm that bends outward to release
  2. Providing a catch (usually a small notch or undercut) that locks into place
  3. 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:

  1. Define a global coordinate system where all parts know their positions
  2. Use modular design so each part can be printed, tested, and refined independently
  3. 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:

  1. Print and test parts individually before assembling
  2. Add small alignment features (pins, notches) to guide assembly
  3. Document which parts go together and the order
  4. Include spare parts (print 2-3 copies of small connecting pieces)
  5. 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:

  1. Reducing stress concentration at edges
  2. Improving layer adhesion at sharp transitions
  3. 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)

  1. What is the purpose of the stack_clear parameter in stackable bin design1?
  2. Why is wall thickness a critical parameter in structural parts1?
  3. Explain what “tolerance stack-up” means and why it matters in multi-part assemblies1.
  4. How does chamfering improve print quality3?
  5. What parameter would you adjust to make bins stack with more friction for stability1?
  6. True or False: Thin walls always print faster than thick walls.
  7. Describe the difference between the outer rim and inner rim in the stackable bin design1.
  8. Why might you use num_dividers as a parameter instead of hard-coding divider positions1?
  9. How would you measure whether your printed bin matches the designed dimensions1?
  10. What design considerations apply when stacking more than 3 bins vertically1?

Extension Problems (10)

  1. Create five bin variants (small, medium, large, tall, shallow) using parametric logic; print and stack them1.
  2. Add parametric rounded corners using minkowski() to improve structural integrity3.
  3. Design a custom divider system: parameterize number, position, and thickness; test strength1.
  4. Conduct a tolerance study: print bins with stack_clear values of 0.4, 0.6, 0.8 mm; document fit quality1.
  5. Create a modular stacking system with connecting clips or latches; test assembly and disassembly2.
  6. Build a complete storage system: design multiple bin sizes with standard stackability and create an assembly guide.
  7. Develop a manufacturing specification document: tolerance ranges, material recommendations, quality acceptance criteria.
  8. Design a labeling system: add parametric label holders or embossed areas for identifying bin contents.
  9. Create a structural analysis guide: identify stress concentration points and propose reinforcement strategies.
  10. Write comprehensive bin design documentation: parameters, variants, assembly, stackability testing, tolerance management, maintenance, and accessibility features.

References


  1. 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

  2. Engineering Tolerance in 3D Printing - https://www.sculpteo.com/en/blog/2021/06/17/tolerance-3d-printing/ ↩2

  3. 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

ParameterNominal ValueToleranceRationale
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

  • .scad file 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

CategoryScoreNotes
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

  • .scad with 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 lib for 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)

  1. What does the && operator do in a command chain1?
  2. Why would you use a batch build script instead of running commands manually1?
  3. How would you extract the filename without extension in a bash script1?
  4. Explain the purpose of creating a temporary SCAD file for variant testing1.
  5. What is 3dm lib list used for2?
  6. True or False: You must manually edit each model file to test different parameters.
  7. Describe what a continuous integration workflow accomplishes1.
  8. How would you save variant test results for comparison1?
  9. What file format would you use to archive completed builds for long-term storage1?
  10. How could you use scripting to automatically generate documentation for your designs1?

Extension Problems (10)

  1. Create a batch build script that processes 5+ model variants and generates a comparison report1.
  2. Design a parameter testing matrix: test 3 dimensions x 3 wall thicknesses and compare results1.
  3. Build a library module for common features (brackets, connectors, fasteners); use in multiple projects2.
  4. Create a “watch and rebuild” script that automatically regenerates designs when code changes1.
  5. Develop a production workflow script that generates timestamped builds with complete documentation1.
  6. Build an automated testing framework: validate designs against dimensional requirements1.
  7. Create a version control integration: automatically tag and archive successful builds1.
  8. Design a design parameter database: store and query historical variants and their properties1.
  9. Develop a remote print queue system: batch multiple models and send to printer automatically1.
  10. Write a comprehensive automation documentation: best practices, script templates, troubleshooting, and accessibility considerations.

Helpful Shell Commands Reference

CommandPurpose
chmod +x script.shMake script executable
./script.shRun a shell script
for file in *.scad; do ... doneLoop through files
basename file.scad .scadRemove 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


  1. 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

  2. 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:

ModeUseExample
Outside jawsMeasure outer dimensionsDiameter of a cylinder, width of a part
Inside jawsMeasure inner dimensionsHole diameter, inside width of a box
Depth rodMeasure depth or thicknessDepth of a recess, thickness of a part

Measurement Best Practices

  1. Zero the caliper: With jaws closed, press the ON/ZERO button to confirm it reads 0.0 mm
  2. Use gentle pressure: Tighten jaws just enough to hold the object; excessive force causes false readings
  3. Take three trials: Measure the same feature three times and calculate the average
  4. 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:

  1. Build the model and verify it’s manifold with 3dm describe
  2. Generate 3 variants: iPhone (60mm), iPad mini (100mm), Tablet (150mm)
  3. Test each variant by measuring critical dimensions
  4. 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:

  1. Create variants with cap_size = 12, 16, 18, 20, 24 mm
  2. Build each variant and verify emboss quality
  3. Test printability: print 2-3 variants
  4. 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:

  1. Print 2 identical bins and test stacking
  2. Create 3 configurations: Small (60x80x40), Medium (80x120x60), Large (120x160x80)
  3. Test with different stack_clearance values: 0.4, 0.6, 0.8mm
  4. Document which clearance works best in practice1
  5. 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:

IssueCauseFix
Coincident facesShapes touching exactlyAdd 0.001 offset: translate([0, 0, 0.001])
Zero-thickness wallsWall too thin to renderIncrease wall: wall = 2.0 instead of wall = 0.5
Incomplete shapeMissing face in differenceCheck boolean operations have complete shells
Self-intersecting facesShape overlaps itselfSimplify 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:

SymptomCausePrevention
Nozzle clogs after 10 minToo fast extrusion speedReduce speed in slicer
Parts separate from bedPoor first layer adhesionCheck bed level, clean bed
Melted plastic strandsRetraction not workingVerify retraction in slicer
Model warpingThermal stress, no coolingCool model, improve ventilation
Supports fail to removeToo thin or fused to modelThicken 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)

  1. What is the first diagnostic step when a model fails to slice2?
  2. Explain the 0.001 offset rule and when to apply it2.
  3. How would you verify that a wall is thick enough before printing1?
  4. What measurement method would you use to validate dimensional accuracy1?
  5. Describe what happens when stack_clearance is too small or too large1.
  6. True or False: Parametric design makes it harder to troubleshoot issues.
  7. How would you document a design so that others can modify and reprint it1?
  8. What should you check in a slicer preview before sending a file to print2?
  9. How would you use 3dm describe to find design flaws3?
  10. Describe a complete workflow from problem diagnosis to solution verification1.

Extension Problems (10)

  1. Complete all three exercises (A1, A2, A3) and document results1.
  2. Print and test 2+ variants of your phone stand; measure and compare1.
  3. Conduct a tolerance sensitivity study: test bins with 3+ clearance values1.
  4. Create a troubleshooting guide for your specific printer: common issues and fixes2.
  5. Design a validation workflow: automated checks before printing1.
  6. Build a design documentation database: parameter ranges, material recommendations, print settings1.
  7. Create before/after case studies of design problems and solutions1.
  8. Develop a printer calibration procedure and document baseline dimensions1.
  9. Design a quality assurance system: define metrics, measurement methods, acceptance criteria1.
  10. Write a comprehensive troubleshooting and maintenance guide: diagnostics, solutions, prevention strategies, and accessibility considerations.

References


  1. 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

  2. 3D Printing Troubleshooting Guide - https://www.prusa3d.com/support/ ↩2 ↩3 ↩4 ↩5

  3. 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:

  1. Increase nozzle temperature (too cold = harder extrusion)
  2. Clean extruder drive gear - brush with wire brush to restore grip
  3. Check filament diameter - should be 1.75mm (+/-0.03mm)
  4. Verify extruder tension - should grip firmly but not crush filament
  5. 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:

  1. Discard damaged section - cut off ~30cm if kinked
  2. Increase humidity - try drying filament in low oven (50C for 2 hours PLA)
  3. Check storage - PLA especially absorbs moisture
  4. Replace spool - if damage is extensive

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:

  1. Re-level build plate - cold plate adjustment for accuracy
  2. Clean build plate - wipe with isopropyl alcohol
  3. Lower nozzle (if too high) - reduce Z by 0.05-0.1mm
  4. Increase bed temperature - add 5-10C
  5. 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):

  1. Immediate - Cold Pull:

    • Heat nozzle to 200C
    • Grab filament and give firm pull while cooling
    • Repeat 5-10 times
    • May extract filament with debris
  2. 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
  3. 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
  4. 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:

  1. Check extruder steps/mm - calibrate e-steps if possible
  2. Increase flow rate - try 105-110% in slicer
  3. Raise temperature - add 5-10C
  4. Slow down print speed - reduce 10-20%
  5. Check filament quality - test with different brand/batch
  6. 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:

  1. Reduce flow rate - try 95% in slicer
  2. Lower temperature - reduce 5-10C
  3. Check line width - should be ~1.2x nozzle diameter (0.4mm nozzle = 0.48mm width)
  4. Speed up print - higher speeds reduce oozing
  5. 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:

  1. Check mechanics:

    • Manually move X/Y freely (no resistance)
    • Tighten all visible screws
    • Check belts for fraying (replace if damaged)
  2. Reduce speed:

    • Lower travel speed by 20-30%
    • Reduce acceleration in firmware
    • Slow down print speed by 20%
  3. Check print orientation:

    • Rotate model to reduce overhang
    • Add supports to prevent wobbling
    • Ensure solid perimeters around shift point
  4. 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:

  1. Reduce temperature by 5-10C
  2. Increase retraction distance (0.5-1.5mm more)
  3. Increase retraction speed
  4. Enable wipe on retract (slicer setting)
  5. 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:

  1. Environmental: Maintain consistent room temperature
  2. Material: Use same brand/batch filament
  3. Calibration: Re-level bed before each print
  4. Firmware: Disable bed leveling if unreliable
  5. 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

IssuePreventionFrequency
ClogsClean nozzleBefore each print
Bed adhesionLevel bed, clean plateBefore each print
Layer shiftCheck mechanics, beltsMonthly
Inconsistent qualityCalibrate e-stepsQuarterly
Worn nozzleMonitor extrusion qualityEvery 6 months
Temperature fluctuationStable environmentOngoing

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:

  1. Create a simple box in OpenSCAD: 10mm x 10mm x 5mm, solid
  2. Slice with default 0.4mm line width
  3. Print using 100% flow rate
  4. 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:

  1. Heat extruder to printing temperature
  2. Mark filament 100mm from extruder entrance with marker
  3. Command extrusion of 100mm in firmware (G-code: G1 E100 F100)
  4. 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 E101 then M500 to 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:

  1. Measure internal dimensions (hollow part) in 3 locations each axis
  2. Calculate average internal width: avg_internal
  3. 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

MeasurementMethodToleranceFrequency
Wall thicknessCalipers (multiple spots)+/-0.1mmEvery print
Hole diameterCalipers or gauge+/-0.1-0.2mmEvery print
Overall dimensionsRuler/calipers+/-0.2mmMonthly
Layer heightStack on calipers+/-0.02mmMonthly
Vertical dimensionsMeasure sides+/-0.1mmEvery print

Advanced Calibration

Shrinkage Compensation

Different materials shrink differently after cooling:

MaterialTypical ShrinkageCompensation
PLA0.3-0.5%Usually acceptable, no action
PETG0.5-1%Scale design up by 0.5-1% if critical
ABS0.8-1.5%Scale design up by 1% minimum
TPU1-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

FactorEffectMitigation
Room temperatureAffects cooling rateMaintain 20-22C
HumidityAffects material propertiesKeep 40-60% RH
Air flowInconsistent coolingAvoid drafts near printer
Time of dayMaterial temperature variesPrint 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

ToolCostAccuracyUse
Digital Calipers$5-15+/-0.05mmPrimary measurements
Steel Ruler$3-10+/-1mmQuick rough checks
Vernier Calipers$10-30+/-0.05mmPrecision work
Micrometer$20-50+/-0.01mmCritical tolerances
Layer Height GaugeDIY or $5-10+/-0.05mmLayer 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:

  1. Calibration Cube (20mm hollow) - Overall accuracy
  2. Tolerance Test Box (various hole sizes) - Hole accuracy
  3. Layer Tower (graduated heights) - Layer consistency
  4. 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:

  1. Check power outlet and cable
  2. Verify power supply specifications (voltage, current)
  3. Test with different power outlet
  4. Try power-cycling (off 30 sec, on)
  5. 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:

AppearanceIssueAction
Wavy/embossedBed not level or too closeRelevel bed
Gaps between linesNozzle too highLower Z-offset
Completely squishedNozzle too lowRaise Z-offset
Partial adhesionBed too cool or dirtyClean bed, increase temp
Consistent squish/linesCorrectContinue 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

TolerancePass/FailAction
+/-0.5mm or betterPASSNo adjustment needed
+/-0.5-1mmMARGINALDocument and monitor
>+/-1mmFAILAdjust 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

  1. Measure each feature three times and record all three values
  2. Calculate the average: add the three values and divide by 3
  3. Round to one decimal place (e.g., 23.4 mm)
  4. Use the average in your OpenSCAD code - not a single measurement

Units: All measurements in millimeters (mm) unless otherwise noted.


Object 1

Object description: ___________________________________

FeatureWhat You’re MeasuringM1 (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: ___________________________________

FeatureWhat You’re MeasuringM1 (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: ___________________________________

FeatureWhat You’re MeasuringM1 (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: ___________________________________

FeatureWhat You’re MeasuringM1 (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: ___________________________________

FeatureWhat You’re MeasuringM1 (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.

ObjectMy 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

ObjectYour AverageTrue ValueDifference% Error

A percent error under 2% is excellent for caliper work at this level.


Reflection

Answer in complete sentences.

  1. Which measurement was most difficult to take and why?

  2. Did your three measurements for any feature vary significantly? What might cause variation between repeated measurements?

  3. 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

RecommendationPriorityFeasibilityImpact

Tool 2: _____

(Repeat structure above)


Tool 3: _____

(Repeat structure above)


Summary of Barriers

BarrierFrequencySeverityTools Affected

Recommendations Matrix

PriorityFeasibilityImpactRecommendationImplementation Steps
HighEasyHigh
HighModerateHigh
ModerateEasyMedium

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

CategoryScoreNotes
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

  1. 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
  2. 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
  3. 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 storageHold 15-20 bracelets without damage
“They’re tangled in my drawer”Keep organizedVertical hanging system to prevent tangling
“I want to see them”Display featureVisible from above (no lid)
“Minimalist, natural wood”Nice lookingWood 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:

RequirementMeasurement Method
Hold 15 braceletsCount actual bracelets loaded; verify no deformation
Prevent tanglingManual inspection: no twisting/knotting after 1 week storage
DimensionsMeasure with calipers; compare to design parameters
Wood materialVisual inspection; material weight check
Withstand weightLoad 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:

  1. Measure physical parts:

    # Use calipers to verify
    - Actual width: _____ mm (design: 127mm)
    - Actual peg diameter: _____ mm (design: 6mm)
    - Actual spacing: _____ mm
    
  2. Test with actual bracelets:

    • Can 15 bracelets actually hang?
    • Do they tangle?
    • Do pegs support the weight?
    • Is it stable on the desk?
  3. 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
    
  4. Iterate:

    // Modified parameters for v2
    peg_diameter = 8;        // Thicker pegs (8mm instead of 6mm)
    holder_depth = 100;      // Wider base (100mm instead of 80mm)
    
  5. 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:

  1. Interview Documentation (1-2 pages)

    • 4-6 interview questions asked
    • Stakeholder’s 3-5 key needs
    • Extracted functional requirements
    • Acceptance criteria for each requirement
  2. Design SCAD File (bracelet_holder.scad)

    • Parametric design with all requirements
    • Clear parameters at top (easily customizable)
    • Well-commented modules
    • Matches stakeholder dimensions
  3. Iteration Log (2-3 pages)

    • Version 1 test results
    • Feedback from stakeholder
    • Changes made for v2
    • Final design specifications
  4. Printed Prototype (physical)

    • Demonstrates final design
    • Holds actual bracelets from stakeholder
    • Passes all acceptance criteria
  5. 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)

  1. What is the primary purpose of conducting stakeholder interviews before design1?
  2. Give one example of an open-ended interview question and one bad (leading) question1.
  3. What is the difference between a “need” and a “want” in the design context1?
  4. How do you convert interview data into functional requirements1?
  5. What is an acceptance criterion and why is it important2?
  6. Describe how you would test a bracelet holder’s capacity non-visually using measurements2.
  7. True or False: You can design a good product without talking to the person who will use it.
  8. Explain why iteration based on real feedback is better than guessing2.
  9. How would you document design changes in a way that’s accessible to non-visual users3?
  10. What should you do if your prototype fails a stakeholder’s test2?

Extension Problems (10)

  1. Conduct interviews with 3 different stakeholders for the bracelet holder; compare their requirements1.
  2. Design 3 different bracelet holder variants for different stakeholder types (minimalist, maximalist, travel-focused)1.
  3. Create a complete functional requirements document with measurable acceptance criteria1.
  4. Build and test 2 iterations of the bracelet holder; document all changes2.
  5. Develop a design specification document that someone else could follow to recreate your design3.
  6. Conduct a “design review” with your stakeholder; document their feedback and your responses1.
  7. Create a manufacturing specification: tolerances, materials, assembly instructions, quality checks2.
  8. Build a customer feedback tracking system; document what works and what could be improved1.
  9. Design an accessibility checklist for the bracelet holder: non-visual inspection, measurement-based testing, assembly ease3.
  10. 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

  1. Lessons 1-3: Foundation (setup, primitives, parametric code)
  2. Lessons 4-5: Verification & Safety (AI checking, physical safety)
  3. Lessons 6-7: Applied Projects (keycap, phone stand)
  4. Lesson 8: Advanced Design (tolerance, interlocking, complex assemblies)
  5. Lesson 9: Automation (batch processing, scripting)
  6. Lesson 10: Mastery (troubleshooting, QA, testing)
  7. 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


  1. Design Thinking Process - IDEO - https://www.ideo.com/perspectives/design-thinking ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13

  2. Functional Requirements in Product Design - https://www.productschool.com/blog/requirements/ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  3. 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:

  1. “Tell me about your role in this project.”


  2. “What problem are we trying to solve?”


  3. “Who else will be affected by this design?”


Section 2: Current Situation (10 minutes)

Current Process:

  1. “How do you currently solve this problem?”


  2. “What works well about the current approach?”


  3. “What frustrates you most about the current process?”


Pain Points:

  • Primary issue: _______________________________________________________
  • Secondary issues: ___________________________________________________

Section 3: Ideal Solution (15 minutes)

Requirements (Ask open-ended):

  1. “Ideally, what would this solution do?”


  2. “How would you use it?”


  3. “Where would it be used?”


  4. “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:

  1. “How often would this be used?”

    • Daily [ ] Weekly [ ] Monthly [ ] Occasionally
  2. “How many people need this?”


  3. “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?”)

  1. _________________________________________________________________ (Priority: __ /10)
  2. _________________________________________________________________ (Priority: __ /10)
  3. _________________________________________________________________ (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:

RequirementDepends OnNotes
FR1
FR2FR1Cannot 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 RequestDateReasonStatus

Verification Plan

How will we verify each requirement is met?

RequirementVerification MethodTest CaseStatus
FR1[Inspection/Test/Demo]
FR2[Inspection/Test/Demo]

Sign-Off

Stakeholder Approval:

StakeholderTitleSignatureDate

Requirements Baseline Approved: Date: ____________ Status: Approved / Pending / Rejected


Reference Documents

  • Interview notes: ____________________________________________________
  • Design sketches: ____________________________________________________
  • Related specifications: _______________________________________________
  • Standards/guidelines: ________________________________________________

Document Version History:

VersionDateAuthorChanges
1.0Initial 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?

PropertyRequirementSelected MaterialAlternative
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:

DimensionToleranceRationaleRisk
+/-_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

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:

TestMethodPass CriteriaStatus

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)

ItemPart #QuantityUnit CostNotes
3D Printed Main Body-1$0.XXPLA

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 #DateDescriptionReasonImpact

Sign-Off

Design Approval:

RoleNameSignatureDate
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:

  1. “What is your first impression of this design?”


  2. “Is it what you expected?”

    • More than expected [ ] As expected [ ] Less than expected
    • Explanation: ________________________________________________
  3. “Would you use this?”

    • Definitely [ ] Maybe [ ] No [ ] Not sure
    • Why? __________________________________________________________

Section 2: Usability (15 minutes)

Using the Product:

  1. “Can you show me how you would use this?”

    • (Observe: difficulties, hesitations, confusion)
    • Notes: _________________________________________________________
  2. “Was it easy to understand how to use?”

    • Very easy [ ] Easy [ ] Neutral [ ] Difficult [ ] Very difficult
    • What was confusing? _______________________________________________
  3. “Are there any parts that don’t work well together?”


Specific Usability Issues:

IssueSeveritySuggestion
High/Med/Low
High/Med/Low

Section 3: Functionality Assessment (10 minutes)

Does it do what it’s supposed to?

Feature/FunctionWorks WellWorks OKDoesn’t WorkNeeded 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:

  1. “Did it work consistently?”

    • Always [ ] Usually [ ] Sometimes [ ] Never
    • Issues experienced: ______________________________________________
  2. “How solid/durable does it feel?”

    • Very durable [ ] Durable [ ] Adequate [ ] Fragile [ ] Very fragile
    • Concerns: _______________________________________________________
  3. “Any parts that seem weak?”



Section 6: Overall Satisfaction (5 minutes)

Scoring Matrix:

CriterionRatingComments
Overall satisfaction1 2 3 4 5
Likely to recommend1 2 3 4 5
Meets my needs1 2 3 4 5
Design quality1 2 3 4 5
Value for cost1 2 3 4 5

(1=Poor, 5=Excellent)


Section 7: Suggestions & Improvements (10 minutes)

Open-Ended Feedback:

  1. “What would make this better?”


  2. “What should we change?”


  3. “What should we keep as-is?”


  4. “Would you buy/use this?”

    • Yes [ ] Maybe [ ] No
    • Why? __________________________________________________________

Suggestions Priority:

SuggestionPriorityCategoryEffort
High/Med/LowDesign/Function/MaterialEasy/Med/Hard
High/Med/LowDesign/Function/MaterialEasy/Med/Hard

Section 8: Accessibility Check (5 minutes)

If applicable to your product:

  1. “Can someone with limited vision use this?”

    • Yes [ ] With difficulty [ ] No
    • How: __________________________________________________________
  2. “Can someone with limited mobility use this?”

    • Yes [ ] With difficulty [ ] No
    • How: __________________________________________________________
  3. “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:

  1. _________________________________________ (Mentioned by ___ of ___% testers)
  2. _________________________________________ (Mentioned by ___ of ___%)
  3. _________________________________________ (Mentioned by ___ of ___%)

Frequently Praised Aspects:



Data Summary

MetricAverageRangeStatus
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 DesignFeedbackChange MadeRationale

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 RoundDate# TestersKey FindingAction 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:

CategoryMax PointsWhat Is Evaluated
Problem & Solution3How well the prototype meets the identified problem or functional requirements
Design Quality3Complexity, originality, technical quality of the design; evidence of iteration
Documentation3Completeness, accuracy, and thoughtfulness of all written deliverables

Category 1: Problem & Solution (0-3 points)

ScoreDescription
3The prototype clearly and effectively solves the stated problem. All functional requirements are met. The solution shows evidence of testing against the requirements.
2The prototype mostly meets the problem. Most functional requirements are met. Minor gaps between the design and the requirements.
1The prototype partially addresses the problem. Several functional requirements are not met or were not clearly tested.
0The prototype does not address the stated problem, or no functional requirements were established.

Category 2: Design Quality (0-3 points)

ScoreDescription
3The 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.
2The 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.
1The design is basic or primarily borrowed from another source without modification. Code has issues. Print quality has significant defects that were not addressed.
0No meaningful original design. Print is not functional or was not completed.

Category 3: Documentation (0-3 points)

ScoreDescription
3All required sections are present, complete, and specific. Reflections are thoughtful and reference specific decisions, problems encountered, and learning. Photos are included. Measurements are recorded.
2Most required sections are present. Some sections are vague or missing detail. Reflections show some thought but are brief or generic.
1Documentation is incomplete. Major sections are missing or consist of one-line responses. Reflections are minimal.
0Documentation is not submitted or is essentially empty.

Score Interpretation

Total ScoreInterpretationNext Step
8-9Excellent workMove on to next project
6-7Good work with room for improvementMove on; instructor may suggest revisiting one element
4-5Meets basic expectationsResubmission of specific weak areas recommended
2-3Does not meet expectationsResubmission required
0-1Missing major deliverablesMeet 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:

  1. 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 .scad file 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

  1. 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.
  1. Bead module development (Days 1-2)
  • Implement bead_A(size, detail) and bead_B(size, detail) parametric modules.
  • Test-print a single bead from each module; record optimal print temperature/bed settings.
  1. 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.
  1. 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:

  • .scad file containing parametric bead modules and the assembly script
  • .stl files (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 scale parameter 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)

  1. Why use parametric modules for repeated parts? (one sentence)
  2. What is a reliable way to test a bead hole for a given cord diameter?
  3. Name two OpenSCAD functions or techniques useful for repeating geometry.
  4. What printing setting is most likely to affect hole diameter accuracy?
  5. How would you document an iteration that changed hole diameter from 2.5 mm to 2.7 mm?
  6. 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)
  7. 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?
  8. 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?
  9. 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
  10. 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):

  1. To allow repeatable, adjustable geometry and quick global changes.
  2. Print a small tolerance test piece and measure fit; record results.
  3. for() loops, module parameters, translate() and rotate(); scale().
  4. Nozzle diameter and extrusion multiplier; also bridging/cooling.
  5. Note the parameter change, reproduce the print settings, measure and record fit, update Design Notes.

Extension Problems (apply project skills)

  1. Design an interlocking bead (snap-fit) and describe the tolerances required.
  2. Create a parametric clasp module that integrates with your bead string and documents a pass/fail test.
  3. Modify one bead to include decorative text or pattern generated procedurally in OpenSCAD.
  4. Convert your single .scad project into a small library: separate bead modules into include files and demonstrate reuse.
  5. Propose a modification to make the piece weather-resistant for outdoor wear (materials, coatings, or geometry).
  6. Design and print a complete jewelry set: matching beads, clasp, and string connector with consistent design language.
  7. Create a variant generator that produces 10+ different bead designs with single-parameter changes; document aesthetic and functional differences.
  8. Build a design system document for your jewelry: modular bead library, material requirements, assembly instructions, and care guide.
  9. Investigate material effects: print the same bead in 2+ materials; compare durability, aesthetic, and wearability.
  10. 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 ProblemCriteria
4Correct answer with clear, complete explanation; demonstrates deep understanding
3Mostly correct answer; minor gaps in explanation or reasoning
2Partially correct; shows some understanding but has significant gaps
1Minimal effort; shows limited understanding
0No answer or completely incorrect

Total Possible: 100 + 5 bonus = 105 points


References You May Use


End of Final Exam

Submission Instructions:

  1. Answer all 25 questions completely
  2. Show your work for calculations and reasoning
  3. Include code samples where requested
  4. Submit as a PDF with your name and date
  5. Scoring will be based on correctness, clarity, and depth of understanding

Good luck! [celebration]