This commit is contained in:
Jason Stedwell
2026-06-17 16:03:26 -05:00
parent fa1e9b68c7
commit c1abe36822
99 changed files with 1562887 additions and 0 deletions
@@ -0,0 +1,286 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "mpmedia/step-processor/external-dimensional-diagram/v1",
"title": "ExternalDimensionalDiagram",
"description": "Schema for the external dimensional diagram sub-skill output. Designed for AI consumption, search indexing, and downstream documentation workflows (Odoo product data, CoWork, PDF assembly). All geometry values in millimeters. Imperial equivalents computed at export time.",
"type": "object",
"required": [
"schema_version", "generated_at", "source_path", "model_name",
"mode", "style", "engine_used", "units",
"overall_width", "overall_height", "overall_depth",
"bounding_box", "selected_parts", "excluded_parts",
"layout", "outputs", "warnings", "notes"
],
"properties": {
"schema_version": {
"type": "string",
"const": "1.0",
"description": "Schema version. Increment minor for additive changes, major for breaking changes."
},
"generated_at": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 UTC timestamp of generation run."
},
"source_path": {
"type": "string",
"description": "Absolute path to the source STEP file."
},
"model_name": {
"type": "string",
"description": "Human-readable product/model name. Sourced from datablock MD file if present, otherwise derived from filename stem."
},
"mode": {
"type": "string",
"enum": ["enclosure_only", "enclosure_plus_mounting", "mounting_only"],
"description": "Geometry scope mode used for this run."
},
"style": {
"type": "string",
"enum": ["line_drawing", "rendered"],
"description": "line_drawing = pure SVG wireframe/line art (MR28-style). rendered = rendered ISO views composited with dimensioned orthographic line views (MR16-style)."
},
"layout_mode": {
"type": "string",
"enum": ["single_sheet", "multi_page"],
"description": "single_sheet = all views on one SVG/PDF sheet. multi_page = one view per page, used for large/complex models or when any single view would be too dense at standard scale. Auto-selected based on model bounding box and view count unless overridden."
},
"engine_used": {
"type": "string",
"enum": ["build123d", "freecad"],
"description": "Geometry engine that successfully loaded and processed the file."
},
"fallback_invoked": {
"type": "boolean",
"description": "True if the primary engine (build123d) failed and the fallback was used."
},
"units": {
"type": "object",
"required": ["primary", "secondary"],
"properties": {
"primary": { "type": "string", "const": "mm" },
"secondary": {
"type": "string",
"const": "in",
"description": "Imperial inches shown in parentheses at reduced italic size where space allows."
}
}
},
"overall_width": { "type": "number", "description": "Overall external width in mm (X axis)." },
"overall_height": { "type": "number", "description": "Overall external height in mm (Z axis)." },
"overall_depth": { "type": "number", "description": "Overall external depth in mm (Y axis)." },
"bounding_box": {
"type": "object",
"required": ["x_min", "x_max", "y_min", "y_max", "z_min", "z_max"],
"properties": {
"x_min": { "type": "number" },
"x_max": { "type": "number" },
"y_min": { "type": "number" },
"y_max": { "type": "number" },
"z_min": { "type": "number" },
"z_max": { "type": "number" }
}
},
"active_area": {
"type": ["object", "null"],
"description": "Detected front-face aperture or screen cutout. Null if not detectable.",
"properties": {
"width": { "type": "number", "description": "mm" },
"height": { "type": "number", "description": "mm" },
"diagonal": { "type": "number", "description": "mm" },
"diagonal_inches": { "type": "number", "description": "Computed inches for display diagonal labeling." },
"offset_left": { "type": "number", "description": "mm from enclosure left edge" },
"offset_top": { "type": "number", "description": "mm from enclosure top edge" },
"detection_confidence": {
"type": "string",
"enum": ["high", "medium", "low"],
"description": "Confidence level of aperture detection."
}
}
},
"mounting_dimensions": {
"type": ["object", "null"],
"description": "Null if mode is enclosure_only or no mounting geometry detected.",
"properties": {
"pattern_type": {
"type": "string",
"enum": ["linear", "grid", "vesa", "custom", "unknown"],
"description": "Detected mounting hole pattern type."
},
"vesa_standard": {
"type": ["string", "null"],
"description": "e.g. VESA 100x100, VESA 200x200. Null if not a standard VESA pattern."
},
"hole_diameter": { "type": "number", "description": "mm. Null if mixed diameters." },
"hole_count": { "type": "integer" },
"spacing_x": { "type": ["number", "null"], "description": "Center-to-center horizontal spacing in mm." },
"spacing_y": { "type": ["number", "null"], "description": "Center-to-center vertical spacing in mm." },
"spacing_chain_x": {
"type": ["array", "null"],
"items": { "type": "number" },
"description": "Array of sequential horizontal spacings for chain dimensioning. e.g. [113, 200, 200, 200, 113]"
},
"spacing_chain_y": {
"type": ["array", "null"],
"items": { "type": "number" },
"description": "Array of sequential vertical spacings for chain dimensioning."
},
"offset_from_left": { "type": ["number", "null"] },
"offset_from_top": { "type": ["number", "null"] },
"offset_from_right": { "type": ["number", "null"] },
"offset_from_bottom": { "type": ["number", "null"] }
}
},
"mounting_variants": {
"type": ["array", "null"],
"description": "When the STEP file contains multiple mounting subassemblies (e.g. wall mount + ceiling mount + floor stand), each variant is listed here. Each can produce a separate diagram run.",
"items": {
"type": "object",
"required": ["variant_name", "part_ids"],
"properties": {
"variant_name": {
"type": "string",
"description": "Human-readable variant label. e.g. 'Wall Mount - VESA 200x200'"
},
"part_ids": {
"type": "array",
"items": { "type": "string" },
"description": "Part names/IDs from the assembly tree included in this variant."
},
"diagram_output": {
"type": ["string", "null"],
"description": "Path to the generated diagram for this variant, if rendered."
}
}
}
},
"selected_parts": {
"type": "array",
"items": { "type": "string" },
"description": "Part names included in the geometry scope for this run."
},
"excluded_parts": {
"type": "array",
"items": { "type": "string" },
"description": "Part names explicitly excluded (internal components, fasteners, etc.)."
},
"mapping_file_used": {
"type": ["string", "null"],
"description": "Path to the parts mapping JSON file used, if any."
},
"datablock": {
"type": "object",
"description": "Metadata shown in the diagram title/data block. Sourced from datablock MD file.",
"properties": {
"model_number": { "type": "string" },
"display_name": { "type": "string" },
"drawing_date": { "type": "string", "format": "date" },
"revision": { "type": "string" },
"drawn_by": { "type": "string" },
"company": { "type": "string" },
"units_note": { "type": "string", "default": "Dimensions in mm (in)" },
"scale": { "type": "string", "default": "NTS" },
"custom_fields": {
"type": "object",
"additionalProperties": { "type": "string" },
"description": "Any additional key-value pairs from the MD file to show in the data block."
}
}
},
"layout": {
"type": "object",
"description": "Describes the view layout used in the generated diagram.",
"required": ["views_included", "sheet_size"],
"properties": {
"views_included": {
"type": "array",
"items": {
"type": "string",
"enum": ["front", "rear", "left", "right", "top", "bottom", "isometric_front", "isometric_rear"]
},
"description": "Ordered list of views included in the diagram."
},
"sheet_size": {
"type": "string",
"enum": ["A4_landscape", "A4_portrait", "A3_landscape", "A3_portrait", "A2_landscape", "letter_landscape", "letter_portrait", "auto"],
"description": "Sheet size used. 'auto' selects based on model aspect ratio and view count."
},
"scale_ratio": {
"type": ["string", "null"],
"description": "e.g. '1:5', '1:10', 'NTS' (not to scale). NTS used when views are schematic rather than precise scale."
},
"dimension_style": {
"type": "string",
"enum": ["chain", "ordinate", "baseline"],
"description": "Dimensioning style used. chain = sequential (113-200-200-113). ordinate = from common datum. baseline = all from one edge."
},
"iso_style": {
"type": "string",
"enum": ["line_wireframe", "shaded_render", "none"],
"description": "Isometric view rendering approach."
}
}
},
"outputs": {
"type": "object",
"description": "Paths to all generated output files.",
"properties": {
"diagram_png": { "type": ["string", "null"] },
"diagram_pdf": { "type": ["string", "null"] },
"diagram_svg": { "type": ["string", "null"], "description": "Source SVG always retained alongside exports." },
"iso_png": { "type": ["string", "null"] },
"front_png": { "type": ["string", "null"] },
"side_png": { "type": ["string", "null"] },
"rear_png": { "type": ["string", "null"] },
"meta_json": { "type": "string", "description": "Path to this metadata JSON file." },
"variant_outputs": {
"type": ["array", "null"],
"items": {
"type": "object",
"properties": {
"variant_name": { "type": "string" },
"diagram_png": { "type": ["string", "null"] },
"diagram_pdf": { "type": ["string", "null"] },
"meta_json": { "type": ["string", "null"] }
}
}
}
}
},
"warnings": {
"type": "array",
"items": { "type": "string" },
"description": "Non-fatal issues encountered during generation. e.g. 'active area detection confidence: low', 'mounting holes not detected', 'fallback engine used'."
},
"notes": {
"type": "array",
"items": { "type": "string" },
"description": "Informational messages. e.g. 'Chinese part names translated', '3 mounting variants detected'."
}
}
}
+109
View File
@@ -0,0 +1,109 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "mpmedia/step-processor/parts-mapping/v1",
"title": "PartsMapping",
"description": "Mapping file that classifies parts from a STEP assembly tree. Used by the external diagram generator to determine geometry scope and labels. Supports Chinese-to-English normalization. One file per product model, stored alongside the STEP file or in a shared product data directory.",
"type": "object",
"required": ["model_number", "parts"],
"properties": {
"model_number": {
"type": "string",
"description": "Product model number this mapping applies to. e.g. 'MR28UW'"
},
"parts": {
"type": "object",
"description": "Keyed by original part name from STEP file (may be Chinese). Value is a classification object.",
"additionalProperties": {
"type": "object",
"required": ["english_name", "category"],
"properties": {
"english_name": {
"type": "string",
"description": "Translated/normalized English name. Used in diagrams and BOM."
},
"category": {
"type": "string",
"enum": ["enclosure", "mounting", "internal", "fastener", "display_panel", "cable", "other"],
"description": "Classification drives inclusion/exclusion logic per diagram mode."
},
"include_in_diagram": {
"type": "boolean",
"default": true,
"description": "Override flag. False = always exclude from diagrams regardless of mode."
},
"diagram_label": {
"type": ["string", "null"],
"description": "Optional custom label shown on the diagram for this part. If null, english_name is used."
},
"mounting_variant": {
"type": ["string", "null"],
"description": "If this part belongs to a specific mounting variant, name it here. e.g. 'Wall Mount VESA 200x200'. Parts with the same variant_name are shown/hidden together."
},
"notes": {
"type": "string",
"description": "Free-text notes for documentation or translator flags."
}
}
}
},
"mounting_variants": {
"type": ["array", "null"],
"description": "Named mounting configurations available in this STEP file. Each variant is a named group of mounting parts that should be shown together.",
"items": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"description": { "type": "string" },
"default": { "type": "boolean", "description": "True = use this variant when mode is enclosure_plus_mounting and no variant is specified." }
}
}
}
},
"examples": [
{
"model_number": "MR28UW",
"parts": {
"前面板": {
"english_name": "Front Panel",
"category": "enclosure",
"include_in_diagram": true,
"diagram_label": null,
"mounting_variant": null
},
"安装支架": {
"english_name": "Mounting Bracket",
"category": "mounting",
"include_in_diagram": true,
"diagram_label": "Wall Mount Bracket",
"mounting_variant": "Wall Mount"
},
"VESA板": {
"english_name": "VESA Plate 200x200",
"category": "mounting",
"include_in_diagram": true,
"diagram_label": "VESA 200x200 Plate",
"mounting_variant": "VESA Mount"
},
"螺钉M4": {
"english_name": "M4 Screw",
"category": "fastener",
"include_in_diagram": false,
"notes": "Internal fastener - exclude from all diagrams"
},
"主板": {
"english_name": "Main Board",
"category": "internal",
"include_in_diagram": false
}
},
"mounting_variants": [
{ "name": "Wall Mount", "description": "Standard wall mount bracket", "default": true },
{ "name": "VESA Mount", "description": "VESA 200x200 compatible plate", "default": false }
]
}
]
}