287 lines
11 KiB
JSON
287 lines
11 KiB
JSON
{
|
|
"$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'."
|
|
}
|
|
}
|
|
}
|