<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.opensourceecology.org/index.php?action=history&amp;feed=atom&amp;title=Wall_Module_Specification</id>
	<title>Wall Module Specification - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.opensourceecology.org/index.php?action=history&amp;feed=atom&amp;title=Wall_Module_Specification"/>
	<link rel="alternate" type="text/html" href="https://wiki.opensourceecology.org/index.php?title=Wall_Module_Specification&amp;action=history"/>
	<updated>2026-05-17T05:54:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://wiki.opensourceecology.org/index.php?title=Wall_Module_Specification&amp;diff=318842&amp;oldid=prev</id>
		<title>Marcin: /* Wall Module Schema → FreeCAD Geometry Compiler */</title>
		<link rel="alternate" type="text/html" href="https://wiki.opensourceecology.org/index.php?title=Wall_Module_Specification&amp;diff=318842&amp;oldid=prev"/>
		<updated>2026-01-21T07:01:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Wall Module Schema → FreeCAD Geometry Compiler&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:01, 21 January 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Wall Module Schema → FreeCAD Geometry Compiler =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Wall Module Schema → FreeCAD Geometry Compiler =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https://chatgpt.com/share/69707955-7ca4-8010-850a-ca6cef5201ee&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This page defines the canonical transformation from a &amp;#039;&amp;#039;wall module specification&amp;#039;&amp;#039; (schema instance) into deterministic CAD geometry in FreeCAD.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This page defines the canonical transformation from a &amp;#039;&amp;#039;wall module specification&amp;#039;&amp;#039; (schema instance) into deterministic CAD geometry in FreeCAD.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Marcin</name></author>
	</entry>
	<entry>
		<id>https://wiki.opensourceecology.org/index.php?title=Wall_Module_Specification&amp;diff=318841&amp;oldid=prev</id>
		<title>Marcin: Created page with &quot;= Wall Module Schema → FreeCAD Geometry Compiler =  This page defines the canonical transformation from a &#039;&#039;wall module specification&#039;&#039; (schema instance) into deterministic CAD geometry in FreeCAD.  == Scope == * Wall modules built from 2x6 framing, 24&quot; OC * Optional OSB sheathing on Face A (7/16&quot;) * Optional openings: ** Window (RO width/height, sill height, x position) ** Door (RO width/height, centered in 4&#039; module by default) * Flush-built header: (2) 2x12 members,...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.opensourceecology.org/index.php?title=Wall_Module_Specification&amp;diff=318841&amp;oldid=prev"/>
		<updated>2026-01-21T06:56:29Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;= Wall Module Schema → FreeCAD Geometry Compiler =  This page defines the canonical transformation from a &amp;#039;&amp;#039;wall module specification&amp;#039;&amp;#039; (schema instance) into deterministic CAD geometry in FreeCAD.  == Scope == * Wall modules built from 2x6 framing, 24&amp;quot; OC * Optional OSB sheathing on Face A (7/16&amp;quot;) * Optional openings: ** Window (RO width/height, sill height, x position) ** Door (RO width/height, centered in 4&amp;#039; module by default) * Flush-built header: (2) 2x12 members,...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Wall Module Schema → FreeCAD Geometry Compiler =&lt;br /&gt;
&lt;br /&gt;
This page defines the canonical transformation from a &amp;#039;&amp;#039;wall module specification&amp;#039;&amp;#039; (schema instance) into deterministic CAD geometry in FreeCAD.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
* Wall modules built from 2x6 framing, 24&amp;quot; OC&lt;br /&gt;
* Optional OSB sheathing on Face A (7/16&amp;quot;)&lt;br /&gt;
* Optional openings:&lt;br /&gt;
** Window (RO width/height, sill height, x position)&lt;br /&gt;
** Door (RO width/height, centered in 4&amp;#039; module by default)&lt;br /&gt;
* Flush-built header: (2) 2x12 members, biased to Face A&lt;br /&gt;
&lt;br /&gt;
== Canonical Principle ==&lt;br /&gt;
A module is defined as &amp;#039;&amp;#039;data&amp;#039;&amp;#039; (specification), not as geometry.&lt;br /&gt;
CAD geometry is a compiled artifact produced deterministically from the spec.&lt;br /&gt;
&lt;br /&gt;
== Inputs ==&lt;br /&gt;
=== Required fields ===&lt;br /&gt;
* module.id&lt;br /&gt;
* module.width_in&lt;br /&gt;
* module.height_in&lt;br /&gt;
* module.stud_spacing_oc_in (default 24)&lt;br /&gt;
* plates.top_plate_count (default 2)&lt;br /&gt;
* plates.bottom_plate_count (default 1)&lt;br /&gt;
* sheathing.thickness_in (default 7/16), sheathing.side = &amp;quot;A&amp;quot;&lt;br /&gt;
* openings[] (optional)&lt;br /&gt;
&lt;br /&gt;
=== Opening fields ===&lt;br /&gt;
For each opening in openings[]:&lt;br /&gt;
* opening.id&lt;br /&gt;
* opening.type: &amp;quot;window&amp;quot; or &amp;quot;door&amp;quot;&lt;br /&gt;
* opening.rough_opening.width_in, height_in&lt;br /&gt;
* window: opening.sill_height_from_bottom_in&lt;br /&gt;
* placement:&lt;br /&gt;
** window: opening.x_from_left_in&lt;br /&gt;
** door: opening.centered_in_module=true OR opening.x_from_left_in&lt;br /&gt;
* header: lumber=&amp;quot;2x12&amp;quot;, members=2, bias_to_face=&amp;quot;A&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Coordinate System (CAD Convention) ==&lt;br /&gt;
* X = module width (left→right)&lt;br /&gt;
* Y = wall thickness (Face A at y=0; Face B at y=+5.5)&lt;br /&gt;
* Z = height (bottom at z=0)&lt;br /&gt;
&lt;br /&gt;
All schema lengths are in inches. Compiler converts to mm for FreeCAD internal units.&lt;br /&gt;
&lt;br /&gt;
== Output (Geometry Contract) ==&lt;br /&gt;
FreeCAD document (.FCStd) containing:&lt;br /&gt;
* Containers (groups):&lt;br /&gt;
** WallModule&lt;br /&gt;
*** Framing&lt;br /&gt;
**** Plates&lt;br /&gt;
**** Studs&lt;br /&gt;
**** Openings (per-opening subgroups)&lt;br /&gt;
*** Sheathing&lt;br /&gt;
* Solid bodies for each physical part:&lt;br /&gt;
** Plates, studs, kings, jacks, headers, sills, cripples&lt;br /&gt;
** OSB panels (as thin solids on Face A)&lt;br /&gt;
* Deterministic naming for downstream drawing + BOM automation:&lt;br /&gt;
** Example: TP_0, BP_0, STUD_03, W1_JACK_L, D1_HEADER_2PLY_2X12, OSB_00, etc.&lt;br /&gt;
&lt;br /&gt;
== Compiler Pipeline ==&lt;br /&gt;
=== Step 0: Validate Spec ===&lt;br /&gt;
* Confirm required fields exist&lt;br /&gt;
* Confirm module width/height are within allowed ranges (implementation-defined)&lt;br /&gt;
* Confirm door constraints (v0 default):&lt;br /&gt;
** single door module width must be 48&amp;quot; unless explicitly overridden&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Derive Constants ===&lt;br /&gt;
Assume nominal-to-actual conversions:&lt;br /&gt;
* 2x thickness = 1.5&amp;quot;&lt;br /&gt;
* 2x6 depth = 5.5&amp;quot;&lt;br /&gt;
* 2x12 depth = 11.25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Compute:&lt;br /&gt;
* wall_thickness = 5.5&amp;quot;&lt;br /&gt;
* plate_thickness = 1.5&amp;quot;&lt;br /&gt;
* stud_length = module.height_in - plate_thickness*(top_plate_count + bottom_plate_count)&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Place Plates ===&lt;br /&gt;
* Bottom plate(s) at z = 0..1.5&amp;quot;&lt;br /&gt;
* Top plate(s) at z = module.height_in - 1.5*top_plate_count .. module.height_in&lt;br /&gt;
* Door special case (v0): split bottom plate around door RO span&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Generate Base Stud Grid ===&lt;br /&gt;
Define stud centerlines with 24&amp;quot; OC:&lt;br /&gt;
* Always include end studs&lt;br /&gt;
* Interior studs at: x = x_start + n*OC&lt;br /&gt;
&lt;br /&gt;
Create studs as 1.5&amp;quot; x 5.5&amp;quot; x stud_length solids placed at:&lt;br /&gt;
* y = 0&lt;br /&gt;
* z = 1.5*bottom_plate_count&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Compile Openings (Replace Studs + Add Framing) ===&lt;br /&gt;
For each opening:&lt;br /&gt;
1. Compute RO rectangle:&lt;br /&gt;
* x0, x1 from placement + RO width&lt;br /&gt;
* z0, z1 from sill height (window) or 0 (door) + RO height&lt;br /&gt;
2. Remove any base studs whose x-span overlaps [x0, x1]&lt;br /&gt;
3. Add kings (full height) at the outside of the opening assembly&lt;br /&gt;
4. Add jacks (trimmers) at opening edges from bottom plates up to header bearing&lt;br /&gt;
5. Add header:&lt;br /&gt;
* length = RO.width + 2*1.5&amp;quot; (v0 bearing rule)&lt;br /&gt;
* depth = 11.25&amp;quot; (2x12)&lt;br /&gt;
* thickness = 3.0&amp;quot; (two 2x members laminated)&lt;br /&gt;
* biased to Face A: header placed at y=0..3.0&amp;quot;&lt;br /&gt;
6. Add cripples above header up to underside of top plates on the 24&amp;quot; grid&lt;br /&gt;
7. Window only:&lt;br /&gt;
* Add sill member at z = sill_height + 1.5&amp;quot; (v0)&lt;br /&gt;
* Add cripples below sill down to top of bottom plates&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Panelize OSB Sheathing on Face A ===&lt;br /&gt;
Place OSB as thin solids on Face A at y = -OSB_thickness..0.&lt;br /&gt;
&lt;br /&gt;
Height sourcing policy:&lt;br /&gt;
* If module.height_in &amp;lt;= 108&amp;quot;: use a single 9&amp;#039; sheet (cut to height)&lt;br /&gt;
* Else if module.height_in &amp;lt;= 120&amp;quot;: use a single 10&amp;#039; sheet (cut to height)&lt;br /&gt;
* Else: use 8&amp;#039; sheet + remainder pieces to reach full height&lt;br /&gt;
&lt;br /&gt;
Width policy (v0):&lt;br /&gt;
* If width &amp;lt;= 48&amp;quot;: one panel (rip to width)&lt;br /&gt;
* If width &amp;lt;= 96&amp;quot;: two panels (48&amp;quot; + remainder)&lt;br /&gt;
* If width &amp;gt; 96&amp;quot;: tile in 48&amp;quot; increments + remainder&lt;br /&gt;
&lt;br /&gt;
The panelizer outputs a list of rectangles {w,h,x,z} which become OSB solids.&lt;br /&gt;
&lt;br /&gt;
=== Step 6: Emit Geometry ===&lt;br /&gt;
The compiler creates FreeCAD objects using primitive solids (Part::Box or PartDesign solids):&lt;br /&gt;
* Each part is created as a separate object&lt;br /&gt;
* Each part has deterministic name and placement&lt;br /&gt;
* Objects are added into the group tree for downstream automation&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Recompute + Save ===&lt;br /&gt;
* doc.recompute()&lt;br /&gt;
* doc.saveAs(&amp;quot;&amp;lt;module.id&amp;gt;.FCStd&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Minimal Pseudocode ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spec = load(schema_instance)&lt;br /&gt;
validate(spec)&lt;br /&gt;
&lt;br /&gt;
W,H,OC = spec.module.width, spec.module.height, spec.module.stud_spacing_oc&lt;br /&gt;
top_n, bot_n = spec.plates.top_count, spec.plates.bottom_count&lt;br /&gt;
&lt;br /&gt;
stud_len = H - 1.5*(top_n + bot_n)&lt;br /&gt;
&lt;br /&gt;
create_plates(W,H,top_n,bot_n)&lt;br /&gt;
&lt;br /&gt;
stud_centers = make_stud_centers(W, OC)&lt;br /&gt;
base_studs = create_studs(stud_centers, stud_len)&lt;br /&gt;
&lt;br /&gt;
for opening in spec.openings:&lt;br /&gt;
    ro = compute_opening_rect(opening, W)&lt;br /&gt;
    delete_overlapping_studs(base_studs, ro.x0, ro.x1)&lt;br /&gt;
&lt;br /&gt;
    add_kings_and_jacks(ro)&lt;br /&gt;
    add_header(ro, members=2, size=&amp;quot;2x12&amp;quot;, bias=&amp;quot;FaceA&amp;quot;)&lt;br /&gt;
    add_cripples_above(ro)&lt;br /&gt;
&lt;br /&gt;
    if opening.type == &amp;quot;window&amp;quot;:&lt;br /&gt;
        add_sill(ro)&lt;br /&gt;
        add_cripples_below(ro)&lt;br /&gt;
&lt;br /&gt;
panels = panelize_osb(W,H, spec.sheathing.policy)&lt;br /&gt;
create_osb_solids(panels, face=&amp;quot;A&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
recompute_and_save()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Determinism Rules ==&lt;br /&gt;
To ensure compile reproducibility:&lt;br /&gt;
* No interactive sketching&lt;br /&gt;
* No manual edits downstream of compilation&lt;br /&gt;
* Stable naming conventions for every generated part&lt;br /&gt;
* Same spec input must produce identical part counts, placements, and names&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
This is a geometry compiler spec, not a structural engineering standard.&lt;br /&gt;
Structural detailing (nailing schedules, corner conditions, advanced header sizing, etc.) are layered as additional schema fields and compiler rules in later versions.&lt;/div&gt;</summary>
		<author><name>Marcin</name></author>
	</entry>
</feed>