modelscript/languages/step at main · modelscript/modelscript · GitHub
Skip to content

Latest commit

 

History

History

step

README.md

بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
In the name of Allah, the Compassionate, the Merciful

@modelscript/step

ISO 10303-21 STEP Clear Text Encoding (AP214 / AP242) CAD/CAE language package (.step, .stp, .p21) for ModelScript. Features a native WebAssembly GLR parser, StepWorkspaceIndex cross-file external reference resolver, B-Rep solid tessellation, assembly hierarchy & PMI/GD&T tolerance extraction (extractStepAssembly), automated Modelica MultiBody kinematic joint synthesis (mapStepToMultiBody), FEA/CFD mesh & study generation actions, step-mcp server tools, and 5 polyglot TGG rules.


Core Capabilities

  • ISO 10303-21 STEP Clear Text Encoding Parser (.step, .stp, .p21): Native WebAssembly GLR incremental parser (parser.wasm) generated by @modelscript/dsl (buildParser) covering HEADER (FILE_DESCRIPTION, FILE_NAME, FILE_SCHEMA) and DATA sections, entity instances (#10 = PRODUCT(...)), nested typed parameters, enumerations, and entity references.
  • StepWorkspaceIndex Cross-File External Reference Resolver: Implements IWorkspaceIndex to index STEP products, shapes, and assembly trees across multi-file CAD workspaces, resolving external file references (DOCUMENT_FILE, APPLIED_EXTERNAL_IDENTIFICATION_ASSIGNMENT, NEXT_ASSEMBLY_USAGE_OCCURRENCE) and caching OpenCascade (occt-import-js) tessellated 3D WebGL meshes.
  • AP214 / AP242 Assembly, Kinematic Joint & PMI/GD&T Extractor (extractStepAssembly): Extracts rich physical and geometric metadata into StepAssemblyModel:
    • Parts & Assembly Hierarchy: PRODUCT, PRODUCT_DEFINITION, MANIFOLD_SOLID_BREP, ADVANCED_BREP_SHAPE_REPRESENTATION, and parent-child NEXT_ASSEMBLY_USAGE_OCCURRENCE edges with 3D AXIS2_PLACEMENT_3D coordinate transforms (StepPlacement).
    • Kinematic Joints: REVOLUTE_PAIR, PRISMATIC_PAIR, CYLINDRICAL_PAIR, SPHERICAL_PAIR, PLANAR_PAIR, and FIXED_PAIR joint axes, origins, and travel limits (StepKinematicJoint).
    • Physical Mass & Inertia Properties: Volume, surface area, mass, center of mass ($\mathbf{r}{\text{CM}}$), and 3D inertia tensor ($I{11}, I_{22}, I_{33}, I_{21}, I_{31}, I_{32}$).
    • 3D PMI & GD&T Tolerances: AP242 geometric tolerances (FLATNESS_TOLERANCE, CYLINDRICITY_TOLERANCE, POSITION_TOLERANCE, PERPENDICULARITY_TOLERANCE, PARALLELISM_TOLERANCE, CONCENTRICITY_TOLERANCE, RUNOUT_TOLERANCE), datum features (DATUM), and datum reference frames (DATUM_SYSTEM).
  • Modelica MultiBody Kinematic Synthesis (mapStepToMultiBody): Maps extracted StepAssemblyModel parts, mass/inertia tensors, coordinate frame offsets, and kinematic pairs directly into MultiBodyAssembly descriptors (Parts.BodyShape, Joints.Revolute, Joints.Prismatic, Joints.Cylindrical, Joints.Spherical, Joints.Planar, Parts.FixedTranslation) for @modelscript/modelica's generateMultiBodyModelica.
  • Interactive CAD Viewer & FEA/CFD Mesh/Study Generation Actions:
    • open_cad_viewer: Opens the 3D WebGL assembly and solid B-Rep geometry viewer.
    • generate_multibody: Translates the STEP assembly into a runnable Modelica MultiBody model.
    • generate_fea_mesh & create_fea_setup: Discretizes 3D CAD solids into CalculiX .inp tetrahedral/hexahedral mesh decks and scaffolds .fea.mo structural verification studies.
    • generate_cfd_mesh & create_cfd_setup: Generates aerodynamic .su2 / .cfg computational meshes and scaffolds .cfd.mo steady-state CFD studies.
  • Model Context Protocol (step-mcp) Server: Exposes step_extract_entities and step_to_multibody tools to AI engineering agents.
  • 5 Bidirectional Polyglot TGG Rules: Synchronizes STEP products, properties, 3D placements, and kinematic joints with SysML v2 parts/ports and Modelica MultiBody joints.

Package Structure

Path Description
src/index.ts Public exports (stepLanguage, extractStepAssembly, StepWorkspaceIndex, physical-data, schema)
src/language.ts ISO 10303-21 grammar, writeback handler, 6 CAE/MultiBody actions, step-mcp server, LSP handlers, and 5 TGG rules
src/assembly-extractor.ts extractStepAssembly parser for AP214/AP242 parts, placements, kinematic pairs, mass properties, and PMI/GD&T
src/workspace-index.ts StepWorkspaceIndex multi-file symbol indexer, external reference resolver, and OpenCascade B-Rep mesh cache
src/physical-data.ts Data structures for StepAssemblyModel, StepPart, StepKinematicJoint, StepMassProperties, and StepGeometricTolerance
src/schema.ts STEP AP214/AP242 entity schema definitions and attribute descriptors
step-multibody-mapper.ts mapStepToMultiBody converter from StepAssemblyModel to Modelica MultiBodyAssembly
build.js Compiles src/language.ts into dist/parser.wasm and src-gen/bindings.js

Polyglot Triple Graph Grammar (TGG) Rules

@modelscript/step defines 5 bidirectional TGG rules in stepLanguage.polyglot.rules:

Rule Name Source (step) Target (sysml2 / modelica)
StepProductToSysML2Part ProductDefinition(name: prodName) sysml2: PartDefinition(declaredName: prodName)
StepPropertyToSysML2Attribute PropertyDefinition(name: propName, value: val) sysml2: AttributeUsage(declaredName: propName, defaultValue: val)
StepPlacementToSysML2Port Axis2Placement3D(name: frameName) sysml2: PortUsage(declaredName: frameName)
StepRevoluteJointToModelicaRevolute KinematicPair(name: jointName, pairType: "revolute") modelica: ComponentClause(name: jointName, typeSpecifier: "Modelica.Mechanics.MultiBody.Joints.Revolute")
StepPrismaticJointToModelicaPrismatic KinematicPair(name: jointName, pairType: "prismatic") modelica: ComponentClause(name: jointName, typeSpecifier: "Modelica.Mechanics.MultiBody.Joints.Prismatic")

Scripts

Command Description
npm run build Build WASM parser (node build.js) and compile TypeScript
npm run build:parser Force-rebuild parser.wasm and generated bindings
npm test Run STEP parser, assembly extractor, and MultiBody mapper tests
npm run lint Run ESLint across src/, tests/, and step-multibody-mapper.ts
npm run typecheck Run tsc --noEmit type verification
npm run clean Remove dist/, src-gen/, and .wasm build artifacts

Programmatic Usage

import { extractStepAssembly, StepWorkspaceIndex } from "@modelscript/step";
import { mapStepToMultiBody } from "@modelscript/step/mapper";
import { createWasmParser } from "@modelscript/step/parser";

// 1. Initialize WASM GLR parser for ISO 10303-21 STEP files
const wasmPath = require.resolve("@modelscript/step/parser.wasm");
const { parser } = await createWasmParser(wasmPath);
const tree = parser.parse(stepSourceText);

// 2. Extract AP214/AP242 assembly hierarchy, kinematic joints, mass properties & PMI/GD&T
const assembly = extractStepAssembly(stepSourceText);
console.log(assembly.parts.size, assembly.joints, assembly.tolerances);

// 3. Map STEP assembly to a Modelica MultiBody descriptor
const multiBody = mapStepToMultiBody("RoboticArm", assembly);

// 4. Index multi-file STEP assemblies in StepWorkspaceIndex
const index = new StepWorkspaceIndex();
index.indexFile("file:///workspace/RoboticArm.step", stepSourceText);