diff --git a/docs/parity.md b/docs/parity.md new file mode 100644 index 00000000..95b7bba5 --- /dev/null +++ b/docs/parity.md @@ -0,0 +1,398 @@ +# Fusion command parity + +Generated by `cargo xtask parity` from `xtask/data/fusion-catalog.tsv` (the toolbar commands of Fusion's Design workspace, ids and names only) and the live command registry (`solvecraft-cli commands`). A command counts as live when SolveCraft registers the same command id. This measures breadth, not depth; see ROADMAP.md and docs/oracle.md for depth. + +**SOLID + SKETCH: 46 / 291 commands live (16%).** All Design tabs: 95 / 1175 (8%). Registered commands: 67. + +| Tab | Panel | Live | Total | % | +|---|---|---:|---:|---:| +| SOLID | CREATE | 7 | 35 | 20% | +| SOLID | MODIFY | 7 | 32 | 22% | +| SOLID | ASSEMBLE | 0 | 21 | 0% | +| SOLID | CONFIGURE | 0 | 3 | 0% | +| SOLID | CONSTRUCT | 0 | 20 | 0% | +| SOLID | INSPECT | 1 | 25 | 4% | +| SOLID | INSERT | 0 | 11 | 0% | +| SOLID | SELECT | 0 | 15 | 0% | +| SOLID | POSITION | 0 | 2 | 0% | +| SKETCH | CREATE | 16 | 41 | 39% | +| SKETCH | MODIFY | 2 | 12 | 17% | +| SKETCH | CONSTRAINTS | 11 | 15 | 73% | +| SKETCH | CONFIGURE | 0 | 3 | 0% | +| SKETCH | INSPECT | 1 | 25 | 4% | +| SKETCH | INSERT | 0 | 13 | 0% | +| SKETCH | ASSEMBLE | 0 | 1 | 0% | +| SKETCH | SELECT | 0 | 15 | 0% | +| SKETCH | FINISH SKETCH | 1 | 2 | 50% | +| SURFACE | CREATE | 1 | 25 | 4% | +| SURFACE | MODIFY | 6 | 26 | 23% | +| SURFACE | ASSEMBLE | 0 | 20 | 0% | +| SURFACE | CONFIGURE | 0 | 3 | 0% | +| SURFACE | CONSTRUCT | 0 | 20 | 0% | +| SURFACE | INSPECT | 1 | 25 | 4% | +| SURFACE | INSERT | 0 | 11 | 0% | +| SURFACE | SELECT | 0 | 15 | 0% | +| SURFACE | POSITION | 0 | 2 | 0% | +| MESH | CREATE | 0 | 5 | 0% | +| MESH | PREPARE | 0 | 4 | 0% | +| MESH | MODIFY | 4 | 30 | 13% | +| MESH | ASSEMBLE | 0 | 21 | 0% | +| MESH | CONFIGURE | 0 | 3 | 0% | +| MESH | CONSTRUCT | 0 | 20 | 0% | +| MESH | INSPECT | 1 | 25 | 4% | +| MESH | INSERT | 0 | 10 | 0% | +| MESH | SELECT | 0 | 10 | 0% | +| MESH | EXPORT | 0 | 1 | 0% | +| MESH | POSITION | 0 | 2 | 0% | +| FORM | CREATE | 1 | 14 | 7% | +| FORM | MODIFY | 2 | 31 | 6% | +| FORM | SYMMETRY | 0 | 6 | 0% | +| FORM | UTILITIES | 0 | 5 | 0% | +| FORM | CONSTRUCT | 0 | 20 | 0% | +| FORM | INSPECT | 1 | 25 | 4% | +| FORM | INSERT | 0 | 13 | 0% | +| FORM | ASSEMBLE | 0 | 1 | 0% | +| FORM | SELECT | 0 | 15 | 0% | +| FORM | FINISH FORM | 0 | 1 | 0% | +| SHEET METAL | CREATE | 2 | 19 | 11% | +| SHEET METAL | MODIFY | 6 | 21 | 29% | +| SHEET METAL | ASSEMBLE | 0 | 20 | 0% | +| SHEET METAL | CONFIGURE | 0 | 3 | 0% | +| SHEET METAL | CONSTRUCT | 0 | 20 | 0% | +| SHEET METAL | INSPECT | 1 | 25 | 4% | +| SHEET METAL | INSERT | 0 | 11 | 0% | +| SHEET METAL | SELECT | 0 | 15 | 0% | +| SHEET METAL | REFOLD | 0 | 1 | 0% | +| SHEET METAL | POSITION | 0 | 2 | 0% | +| PLASTIC | SETUP | 0 | 2 | 0% | +| PLASTIC | CREATE | 7 | 35 | 20% | +| PLASTIC | MODIFY | 7 | 32 | 22% | +| PLASTIC | ASSEMBLE | 0 | 20 | 0% | +| PLASTIC | CONFIGURE | 0 | 3 | 0% | +| PLASTIC | CONSTRUCT | 0 | 20 | 0% | +| PLASTIC | INSPECT | 1 | 26 | 4% | +| PLASTIC | INSERT | 0 | 11 | 0% | +| PLASTIC | SELECT | 0 | 15 | 0% | +| PLASTIC | POSITION | 0 | 2 | 0% | +| ASSEMBLY | INSERT | 0 | 8 | 0% | +| ASSEMBLY | CREATE | 1 | 8 | 12% | +| ASSEMBLY | RELATIONSHIPS | 0 | 11 | 0% | +| ASSEMBLY | MOTION | 0 | 3 | 0% | +| ASSEMBLY | MODIFY | 4 | 11 | 36% | +| ASSEMBLY | CONTACT | 0 | 2 | 0% | +| ASSEMBLY | CONFIGURE | 0 | 3 | 0% | +| ASSEMBLY | CONSTRUCT | 0 | 20 | 0% | +| ASSEMBLY | INSPECT | 1 | 25 | 4% | +| ASSEMBLY | SELECT | 0 | 15 | 0% | +| ASSEMBLY | POSITION | 0 | 2 | 0% | +| MANAGE | ASSIGN | 0 | 1 | 0% | +| MANAGE | RELEASE | 0 | 2 | 0% | +| MANAGE | BOM | 0 | 2 | 0% | +| MANAGE | PROCESS MANAGEMENT | 0 | 3 | 0% | +| MANAGE | TASK MANAGEMENT | 0 | 3 | 0% | +| UTILITIES | MODELING TOOLS | 0 | 1 | 0% | +| UTILITIES | MAKE | 0 | 1 | 0% | +| UTILITIES | NEST | 0 | 1 | 0% | +| UTILITIES | ADD-INS | 0 | 2 | 0% | +| UTILITIES | UTILITY | 1 | 3 | 33% | +| UTILITIES | INSPECT | 1 | 24 | 4% | +| UTILITIES | CREATE PMI | 0 | 4 | 0% | +| UTILITIES | SELECT | 0 | 15 | 0% | +| UTILITIES | POSITION | 0 | 2 | 0% | + +## Live (SOLID, SKETCH) + +- SOLID › CREATE › Create Sketch (`SketchCreate`) +- SOLID › CREATE › Extrude (`Extrude`) +- SOLID › CREATE › Revolve (`Revolve`) +- SOLID › CREATE › Box (`PrimitiveBox`) +- SOLID › CREATE › Cylinder (`PrimitiveCylinder`) +- SOLID › CREATE › Sphere (`PrimitiveSphere`) +- SOLID › CREATE › Torus (`PrimitiveTorus`) +- SOLID › MODIFY › Fillet (`FusionFilletEdgesCommand`) +- SOLID › MODIFY › Chamfer (`FusionChamferCommand`) +- SOLID › MODIFY › Combine (`FusionCombineCommand`) +- SOLID › MODIFY › Move/Copy (`FusionMoveCommand`) +- SOLID › MODIFY › Delete (`FusionDeleteCommand`) +- SOLID › MODIFY › Change Parameters (`ChangeParameterCommand`) +- SOLID › MODIFY › Compute All (`FusionComputeAllCommand`) +- SOLID › INSPECT › Measure (`MeasureCommand`) +- SKETCH › CREATE › Line (`DrawPolyline`) +- SKETCH › CREATE › 2-Point Rectangle (`ShapeRectangleTwoPoint`) +- SKETCH › CREATE › 3-Point Rectangle (`ShapeRectangleThreePoint`) +- SKETCH › CREATE › Center Rectangle (`ShapeRectangleCenter`) +- SKETCH › CREATE › Center Diameter Circle (`CircleCenterRadius`) +- SKETCH › CREATE › 2-Point Circle (`CircleTwoPoint`) +- SKETCH › CREATE › 3-Point Circle (`CircleThreePoint`) +- SKETCH › CREATE › 3-Point Arc (`ArcThreePoint`) +- SKETCH › CREATE › Center Point Arc (`ArcCenterTwoPoint`) +- SKETCH › CREATE › Circumscribed Polygon (`ShapePolygonCircumscribed`) +- SKETCH › CREATE › Inscribed Polygon (`ShapePolygonInscribed`) +- SKETCH › CREATE › Edge Polygon (`ShapePolygonEdge`) +- SKETCH › CREATE › Center to Center Slot (`ShapeSlotCenterToCenter`) +- SKETCH › CREATE › Overall Slot (`ShapeSlotOverall`) +- SKETCH › CREATE › Point (`DrawPoint`) +- SKETCH › CREATE › Sketch Dimension (`SketchDimension`) +- SKETCH › MODIFY › Move/Copy (`FusionMoveCommand`) +- SKETCH › MODIFY › Change Parameters (`ChangeParameterCommand`) +- SKETCH › CONSTRAINTS › Horizontal/Vertical (`ConstraintHorizontalVertical`) +- SKETCH › CONSTRAINTS › Coincident (`ConstraintCoincident`) +- SKETCH › CONSTRAINTS › Tangent (`ConstraintTangent`) +- SKETCH › CONSTRAINTS › Equal (`ConstraintEqual`) +- SKETCH › CONSTRAINTS › Parallel (`ConstraintParallel`) +- SKETCH › CONSTRAINTS › Perpendicular (`ConstraintPerpendicular`) +- SKETCH › CONSTRAINTS › Fix/UnFix (`ConstraintFix`) +- SKETCH › CONSTRAINTS › MidPoint (`ConstraintMidPoint`) +- SKETCH › CONSTRAINTS › Concentric (`ConstraintConcentric`) +- SKETCH › CONSTRAINTS › Collinear (`ConstraintCollinear`) +- SKETCH › CONSTRAINTS › Symmetry (`ConstraintSymmetry`) +- SKETCH › INSPECT › Measure (`MeasureCommand`) +- SKETCH › FINISH SKETCH › Finish Sketch (`SketchStop`) + +## Not yet (SOLID, SKETCH) + +- SOLID › CREATE › Create Form (`TSplineBaseFeatureCreationCommand`) +- SOLID › CREATE › Derive (`PushDeriveCommand`) +- SOLID › CREATE › Automated Modeling (`AutomatedModelingCommand`) +- SOLID › CREATE › Sweep (`Sweep`) +- SOLID › CREATE › Loft (`SolidLoft`) +- SOLID › CREATE › Rib (`FusionRibCommand`) +- SOLID › CREATE › Web (`FusionWebCommand`) +- SOLID › CREATE › Emboss (`EmbossCmd`) +- SOLID › CREATE › Hole (`FusionHoleCommand`) +- SOLID › CREATE › Thread (`FusionThreadCommand`) +- SOLID › CREATE › Coil (`PrimitiveCoil`) +- SOLID › CREATE › Pipe (`PrimitivePipe`) +- SOLID › CREATE › Bounding Solid (`StockModelCommand`) +- SOLID › CREATE › Rectangular Pattern (`PatternRectangular`) +- SOLID › CREATE › Circular Pattern (`PatternCircular`) +- SOLID › CREATE › Pattern on Path (`PatternOnPath`) +- SOLID › CREATE › Geometric Pattern (`FusionPatternGeometricCommand`) +- SOLID › CREATE › Mirror (`MirrorCommand`) +- SOLID › CREATE › Thicken (`FusionSurfaceThickenCommand`) +- SOLID › CREATE › Boundary Fill (`SurfaceSculpt`) +- SOLID › CREATE › Find Features (`FusionFindFeaturesCommand`) +- SOLID › CREATE › Fluid Volume (`EnclosureCommand`) +- SOLID › CREATE › Create Base Feature (`BaseFeatureCreationCommand`) +- SOLID › CREATE › Create Linked PCB (`PCBExternalComponentCreationCmd`) +- SOLID › CREATE › Derive PCB (`PCBDeriveCmd`) +- SOLID › CREATE › Create Unlinked PCB (`PCBCreateCmd`) +- SOLID › CREATE › Joint Origin (`JointOrigin`) +- SOLID › CREATE › Generate Timeline (`TimelineBuilderCommand`) +- SOLID › MODIFY › Press Pull (`FusionPressPullCommand`) +- SOLID › MODIFY › Edit Face (`EditFaceCommand`) +- SOLID › MODIFY › Shell (`FusionShellBodyCommand`) +- SOLID › MODIFY › Draft (`FusionDraftCommand`) +- SOLID › MODIFY › Scale (`ModifyScale`) +- SOLID › MODIFY › Offset Face (`FusionOffsetFacesCommand`) +- SOLID › MODIFY › Replace Face (`FusionReplaceFaceCommand`) +- SOLID › MODIFY › Split Face (`FusionSplitFaceCommand`) +- SOLID › MODIFY › Split Body (`FusionSplitBodyCommand`) +- SOLID › MODIFY › Silhouette Split (`FusionPartingLineSplitCmd`) +- SOLID › MODIFY › Align (`AlignCmd`) +- SOLID › MODIFY › Remove (`SoftDeleteCommand`) +- SOLID › MODIFY › Arrange (`ArrangeCommand`) +- SOLID › MODIFY › Remove Features (`FusionRemoveFeaturesCommand`) +- SOLID › MODIFY › Remove Faces (`FusionRemoveFacesCommand`) +- SOLID › MODIFY › Replace with Primitives (`ReplaceWithPrimitivesCommand`) +- SOLID › MODIFY › Volumetric Lattice (`VolFieldCreateLatticeCommand`) +- SOLID › MODIFY › Volumetric Texture (`VolFieldTextureCommand`) +- SOLID › MODIFY › VolFieldModifyModelCommand (`VolFieldModifyModelCommand`) +- SOLID › MODIFY › Physical Material (`PhysicalMaterialCommand`) +- SOLID › MODIFY › Appearance (`AppearanceCommand`) +- SOLID › MODIFY › Manage Materials (`MaterialCommand`) +- SOLID › MODIFY › Compute Unresolved (`FusionComputeUnresolvedCommand`) +- SOLID › MODIFY › Convert (`TSpline2BRepCommand`) +- SOLID › MODIFY › Bill of Materials (`MaterializedBomHybridCmd`) +- SOLID › ASSEMBLE › Insert Component (`FusionImportCommandFromToolbar`) +- SOLID › ASSEMBLE › New Component (`FusionCreateNewComponentCommand`) +- SOLID › ASSEMBLE › Duplicate With Joints (`FusionDuplicateWithJointsCommand`) +- SOLID › ASSEMBLE › Constrain Components (`AssemblyMateCommand`) +- SOLID › ASSEMBLE › Align Constraint (`AlignConstraintCmd`) +- SOLID › ASSEMBLE › Angle Constraint (`AngleConstraintCmd`) +- SOLID › ASSEMBLE › Center Constraint (`MidplaneConstraintCmd`) +- SOLID › ASSEMBLE › Tangent Constraint (`TangentConstraintCmd`) +- SOLID › ASSEMBLE › Joint Constraint (`JointConstraintCmd`) +- SOLID › ASSEMBLE › Joint (`JointAssembleCmdNew`) +- SOLID › ASSEMBLE › As-Built Joint (`JointAsBuiltCmd`) +- SOLID › ASSEMBLE › As-Built Constraint (`AsBuiltConstraintCmd`) +- SOLID › ASSEMBLE › Rigid Group (`RigidGroupCmd`) +- SOLID › ASSEMBLE › Drive Joints (`FusionMoveJointsCommand`) +- SOLID › ASSEMBLE › Motion Link (`FusionMotionRelationshipCommand`) +- SOLID › ASSEMBLE › Motion Study (`FusionMotionStudyCommand`) +- SOLID › ASSEMBLE › Enable Contact Sets (`EnableContactSetsCmd`) +- SOLID › ASSEMBLE › Enable All Contact (`EnableAllContactCmd`) +- SOLID › ASSEMBLE › Disable Contact (`DisableAllContactCmd`) +- SOLID › ASSEMBLE › New Contact Set (`ContactSetCmd`) +- SOLID › CONFIGURE › Configure (`FusionStartDesignConfigModeCmd`) +- SOLID › CONFIGURE › Display Configuration Table (`FusionShowDesignConfigPanelCmd`) +- SOLID › CONFIGURE › Create Configuration Rules (`FusionConfigurationRulesCmd`) +- SOLID › CONSTRUCT › User Coordinate System (UCS) (`CoordinateSystemCommand`) +- SOLID › CONSTRUCT › Offset Plane (`ConstructionPlaneOffsetFromPlaneCommand`) +- SOLID › CONSTRUCT › Plane at Angle (`ConstructionPlaneAtAngleCommand`) +- SOLID › CONSTRUCT › Tangent Plane (`ConstructionTangentPlaneCommand`) +- SOLID › CONSTRUCT › Midplane (`ConstructionMidPlaneCommand`) +- SOLID › CONSTRUCT › Perpendicular Plane (`ConstructionPlanePerpendicularToPlaneCommand`) +- SOLID › CONSTRUCT › Plane Through Two Edges (`ConstructionPlaneFromTwoEdgesCommand`) +- SOLID › CONSTRUCT › Plane Through Three Points (`ConstructionPlaneFromThreePointsCommand`) +- SOLID › CONSTRUCT › Plane Along Path (`ConstructionPlaneAlongPathCommand`) +- SOLID › CONSTRUCT › Axis Through Cylinder/Cone/Torus (`ConstructionAxisThroughCylinderCommand`) +- SOLID › CONSTRUCT › Axis Perpendicular To Face (`ConstructionAxisNormalToFaceCommand`) +- SOLID › CONSTRUCT › Axis Through Two Planes (`ConstructionAxisFromTwoPlanesCommand`) +- SOLID › CONSTRUCT › Axis Through Two Points (`ConstructionAxisThroughTwoPointsCommand`) +- SOLID › CONSTRUCT › Axis Through Edge (`ConstructionAxisThroughEdgeCommand`) +- SOLID › CONSTRUCT › Point At Vertex (`ConstructionPointFromPointCommand`) +- SOLID › CONSTRUCT › Point Through Two Edges (`ConstructionPointThroughTwoEdgesCommand`) +- SOLID › CONSTRUCT › Point Through Three Planes (`ConstructionPointFromThreePlanesCommand`) +- SOLID › CONSTRUCT › Point At Center Of Circle/Sphere/Torus (`ConstructionPointFromCircleOrSphereCommand`) +- SOLID › CONSTRUCT › Point At Edge And Plane (`ConstructionPointAtEdgeAndPlaneCommand`) +- SOLID › CONSTRUCT › Point Along Path (`ConstructionPointAlongPathCommand`) +- SOLID › INSPECT › Interference (`InterferenceCheckCommand`) +- SOLID › INSPECT › Section Analysis (`FusionHalfSectionViewCommand`) +- SOLID › INSPECT › Curvature Comb Analysis (`FusionCurvatureCombAnalysisCommand`) +- SOLID › INSPECT › Curvature Map Analysis (`FusionCurvatureMapAnalysisCommand`) +- SOLID › INSPECT › Draft Analysis (`FusionDraftAnalysisCommand`) +- SOLID › INSPECT › Environment Map Analysis (`FusionEnvironmentMapAnalysisCommand`) +- SOLID › INSPECT › Isocurve Analysis (`FusionIsoCurveAnalysisCommand`) +- SOLID › INSPECT › Validate (`FusionSurfaceValidateCommand`) +- SOLID › INSPECT › Zebra Analysis (`FusionZebraAnalysisCommand`) +- SOLID › INSPECT › Accessibility Analysis (`FusionAccessibilityAnalysisCommand`) +- SOLID › INSPECT › Center of Mass (`FusionCenterOfMassCommand`) +- SOLID › INSPECT › Minimum Radius Analysis (`FusionMinimumRadiusAnalysisCommand`) +- SOLID › INSPECT › Component Connection Analysis (`FusionComponentConnectionAnalysisCommand`) +- SOLID › INSPECT › DOF Analysis (`FusionDOFAnalysisCommand`) +- SOLID › INSPECT › Edit Component Connection Analysis (`FusionEditComponentConnectionAnalysisCommand`) +- SOLID › INSPECT › Fastener Stack Analysis (`FusionFastenerStackAnalysisCommand`) +- SOLID › INSPECT › Find Similar Components (`SimilarPartsCommand`) +- SOLID › INSPECT › Navigator (`GraphViewCmd`) +- SOLID › INSPECT › Display Component Colors (`FusionViewColorCyclingToggleCmd`) +- SOLID › INSPECT › Display Mesh Face Groups (`FacegroupsToggleCmd`) +- SOLID › INSPECT › Assembly Statistics (`FusionAssemblyStatisticsCommand`) +- SOLID › INSPECT › Change Summary (`ShowChangeAwarenessToolbarCmd`) +- SOLID › INSPECT › History (`ShowHistoryToolbarCmd`) +- SOLID › INSPECT › Sustainability Insights (`GravityClimate_ManufacturingSustainabilityInsights_MainDialog`) +- SOLID › INSERT › Decal (`FusionAddEditDecalCommand`) +- SOLID › INSERT › Canvas (`FusionAddCanvasCommand`) +- SOLID › INSERT › Insert T-Spline (`TSplineImportCommand`) +- SOLID › INSERT › Insert SVG (`SketchImportSVG`) +- SOLID › INSERT › Insert DXF (`ImportDxfFileCommand`) +- SOLID › INSERT › Insert Mesh (`ParaMeshInsertAlignCommand`) +- SOLID › INSERT › Insert Fastener (`FusionFastenersCommand`) +- SOLID › INSERT › Insert Derive (`PullDeriveCommand`) +- SOLID › INSERT › Insert McMaster-Carr Component (`InsertMcMasterCarrComponentCommand`) +- SOLID › INSERT › Insert a manufacturer part (`cadenasparts4cad`) +- SOLID › INSERT › Insert TraceParts Supplier Components (`traceparts_insert`) +- SOLID › ASSEMBLE › Add To Assembly (`NewAssemblyFromPartCommand`) +- SOLID › SELECT › Select (`SelectCommand`) +- SOLID › SELECT › Window Selection (`selectWindow`) +- SOLID › SELECT › Freeform Selection (`selectFreeForm`) +- SOLID › SELECT › Paint Selection (`selectPaint`) +- SOLID › SELECT › Select By Name (`SelectByNameCommand`) +- SOLID › SELECT › Select By Boundary (`SelectByBoundaryCommand`) +- SOLID › SELECT › Select By Size (`FusionSelectBodiesBySizeCommand`) +- SOLID › SELECT › Invert Selection (`SelectByInvertCommand`) +- SOLID › SELECT › Seed And Boundary (`FusionSelectSeedAndBoundaryFacesCommand`) +- SOLID › SELECT › Component Drag (`FusionDragCompControlsCmd`) +- SOLID › SELECT › Select Body Priority (`SelectBodyPriorityCommand`) +- SOLID › SELECT › Select Face Priority (`SelectFacePriorityCommand`) +- SOLID › SELECT › Select Edge Priority (`SelectEdgePriorityCommand`) +- SOLID › SELECT › Select Component Priority (`SelectComponentPriorityCommand`) +- SOLID › SELECT › Selection Filters (`SelectionFilterCommand`) +- SOLID › POSITION › Capture Position (`SnapshotCmd`) +- SOLID › POSITION › Revert Position (`AsBuiltPositionsCmd`) +- SKETCH › CREATE › Midpoint Line (`SketchMidpointLine`) +- SKETCH › CREATE › SketchConstrainer (`SketchConstrainer`) +- SKETCH › CREATE › 2-Tangent Circle (`CircleTanTanRadius`) +- SKETCH › CREATE › 3-Tangent Circle (`CircleThreeTangent`) +- SKETCH › CREATE › Tangent Arc (`ArcTangent`) +- SKETCH › CREATE › Ellipse (`CircleElipse`) +- SKETCH › CREATE › Center Point Slot (`ShapeSlotCenterPoint`) +- SKETCH › CREATE › Three Point Arc Slot (`ShapeArcSlotThreePoint`) +- SKETCH › CREATE › Center Point Arc Slot (`ShapeArcSlotCenterTwoPoint`) +- SKETCH › CREATE › Fit Point Spline (`DrawSpline`) +- SKETCH › CREATE › Control Point Spline (`DrawCVMSpline3D`) +- SKETCH › CREATE › Control Point Spline (`DrawCVMSpline5D`) +- SKETCH › CREATE › Conic Curve (`ConicCurveCmd`) +- SKETCH › CREATE › Text (`MTextCmd`) +- SKETCH › CREATE › Fit Curves to Mesh Section (`FitCurvesToSectionCommand`) +- SKETCH › CREATE › Mirror (`MirrorSketchCommand`) +- SKETCH › CREATE › Circular Pattern (`CircularSketchPatternCommand`) +- SKETCH › CREATE › Rectangular Pattern (`RectangularSketchPatternCommand`) +- SKETCH › CREATE › Project (`ProjectNewCmd`) +- SKETCH › CREATE › Intersect (`IntersectCmd`) +- SKETCH › CREATE › Spun Profile (`SpunProfileCmd`) +- SKETCH › CREATE › Include 3D Geometry (`Include3DGeometry`) +- SKETCH › CREATE › Project To Surface (`ProjectToSurface`) +- SKETCH › CREATE › Intersection Curve (`IntersectionCurve`) +- SKETCH › CREATE › Isoparametric Curve (`SketchIsoparametricCurve`) +- SKETCH › MODIFY › Fillet (`FilletSketchCmd`) +- SKETCH › MODIFY › Equal Distance Chamfer (`ChamferSketchEqualDistance`) +- SKETCH › MODIFY › Distance and Angle Chamfer (`ChamferSketchDistanceAngle`) +- SKETCH › MODIFY › Two Distance Chamfer (`ChamferSketchDistanceDistance`) +- SKETCH › MODIFY › Blend Curve (`BlendG1CurveSketchCmd`) +- SKETCH › MODIFY › Offset (`Offset`) +- SKETCH › MODIFY › Trim (`TrimSketchCmd`) +- SKETCH › MODIFY › Extend (`ExtendSketchCmd`) +- SKETCH › MODIFY › Break (`BreakSketchCmd`) +- SKETCH › MODIFY › Sketch Scale (`SketchScaleCmd`) +- SKETCH › CONSTRAINTS › AutoConstrain (`SketchAutoConstraintAndDimCmd`) +- SKETCH › CONSTRAINTS › AutoConstrain from datum (`SketchAutoConstraintAndDimFromDatumCmd`) +- SKETCH › CONSTRAINTS › Curvature (`ConstraintSmooth`) +- SKETCH › CONSTRAINTS › Polygon (`SketchPolygonConstraintCmd`) +- SKETCH › CONFIGURE › Configure (`FusionStartDesignConfigModeCmd`) +- SKETCH › CONFIGURE › Display Configuration Table (`FusionShowDesignConfigPanelCmd`) +- SKETCH › CONFIGURE › Create Configuration Rules (`FusionConfigurationRulesCmd`) +- SKETCH › INSPECT › Interference (`InterferenceCheckCommand`) +- SKETCH › INSPECT › Section Analysis (`FusionHalfSectionViewCommand`) +- SKETCH › INSPECT › Curvature Comb Analysis (`FusionCurvatureCombAnalysisCommand`) +- SKETCH › INSPECT › Curvature Map Analysis (`FusionCurvatureMapAnalysisCommand`) +- SKETCH › INSPECT › Draft Analysis (`FusionDraftAnalysisCommand`) +- SKETCH › INSPECT › Environment Map Analysis (`FusionEnvironmentMapAnalysisCommand`) +- SKETCH › INSPECT › Isocurve Analysis (`FusionIsoCurveAnalysisCommand`) +- SKETCH › INSPECT › Validate (`FusionSurfaceValidateCommand`) +- SKETCH › INSPECT › Zebra Analysis (`FusionZebraAnalysisCommand`) +- SKETCH › INSPECT › Accessibility Analysis (`FusionAccessibilityAnalysisCommand`) +- SKETCH › INSPECT › Center of Mass (`FusionCenterOfMassCommand`) +- SKETCH › INSPECT › Minimum Radius Analysis (`FusionMinimumRadiusAnalysisCommand`) +- SKETCH › INSPECT › Component Connection Analysis (`FusionComponentConnectionAnalysisCommand`) +- SKETCH › INSPECT › DOF Analysis (`FusionDOFAnalysisCommand`) +- SKETCH › INSPECT › Edit Component Connection Analysis (`FusionEditComponentConnectionAnalysisCommand`) +- SKETCH › INSPECT › Fastener Stack Analysis (`FusionFastenerStackAnalysisCommand`) +- SKETCH › INSPECT › Find Similar Components (`SimilarPartsCommand`) +- SKETCH › INSPECT › Navigator (`GraphViewCmd`) +- SKETCH › INSPECT › Display Component Colors (`FusionViewColorCyclingToggleCmd`) +- SKETCH › INSPECT › Display Mesh Face Groups (`FacegroupsToggleCmd`) +- SKETCH › INSPECT › Assembly Statistics (`FusionAssemblyStatisticsCommand`) +- SKETCH › INSPECT › Change Summary (`ShowChangeAwarenessToolbarCmd`) +- SKETCH › INSPECT › History (`ShowHistoryToolbarCmd`) +- SKETCH › INSPECT › Sustainability Insights (`GravityClimate_ManufacturingSustainabilityInsights_MainDialog`) +- SKETCH › INSERT › Decal (`FusionAddEditDecalCommand`) +- SKETCH › INSERT › Canvas (`FusionAddCanvasCommand`) +- SKETCH › INSERT › Insert T-Spline (`TSplineImportCommand`) +- SKETCH › INSERT › Insert SVG (`SketchImportSVG`) +- SKETCH › INSERT › Insert DXF (`ImportDxfFileCommand`) +- SKETCH › INSERT › Insert Mesh (`ParaMeshInsertAlignCommand`) +- SKETCH › INSERT › Insert Component (`FusionImportCommandFromToolbar`) +- SKETCH › INSERT › Insert Fastener (`FusionFastenersCommand`) +- SKETCH › INSERT › Duplicate With Joints (`FusionDuplicateWithJointsCommand`) +- SKETCH › INSERT › Insert Derive (`PullDeriveCommand`) +- SKETCH › INSERT › Insert McMaster-Carr Component (`InsertMcMasterCarrComponentCommand`) +- SKETCH › INSERT › Insert a manufacturer part (`cadenasparts4cad`) +- SKETCH › INSERT › Insert TraceParts Supplier Components (`traceparts_insert`) +- SKETCH › ASSEMBLE › Add To Assembly (`NewAssemblyFromPartCommand`) +- SKETCH › SELECT › Select (`SelectCommand`) +- SKETCH › SELECT › Window Selection (`selectWindow`) +- SKETCH › SELECT › Freeform Selection (`selectFreeForm`) +- SKETCH › SELECT › Paint Selection (`selectPaint`) +- SKETCH › SELECT › Select By Name (`SelectByNameCommand`) +- SKETCH › SELECT › Select By Boundary (`SelectByBoundaryCommand`) +- SKETCH › SELECT › Select By Size (`FusionSelectBodiesBySizeCommand`) +- SKETCH › SELECT › Invert Selection (`SelectByInvertCommand`) +- SKETCH › SELECT › Seed And Boundary (`FusionSelectSeedAndBoundaryFacesCommand`) +- SKETCH › SELECT › Component Drag (`FusionDragCompControlsCmd`) +- SKETCH › SELECT › Select Body Priority (`SelectBodyPriorityCommand`) +- SKETCH › SELECT › Select Face Priority (`SelectFacePriorityCommand`) +- SKETCH › SELECT › Select Edge Priority (`SelectEdgePriorityCommand`) +- SKETCH › SELECT › Select Component Priority (`SelectComponentPriorityCommand`) +- SKETCH › SELECT › Selection Filters (`SelectionFilterCommand`) +- SKETCH › FINISH SKETCH › Finish with AutoConstrain (`SketchAutoConstrainAndFinish`) diff --git a/xtask/data/fusion-catalog.tsv b/xtask/data/fusion-catalog.tsv new file mode 100644 index 00000000..6e1aea4b --- /dev/null +++ b/xtask/data/fusion-catalog.tsv @@ -0,0 +1,1177 @@ +# Fusion Design workspace toolbar: tab, panel, command id, command name (ids and names only). +# Regenerate with `cargo xtask parity --refresh` (needs the local plan/fusion/menu-tree.json). +SOLID CREATE SketchCreate Create Sketch +SOLID CREATE TSplineBaseFeatureCreationCommand Create Form +SOLID CREATE PushDeriveCommand Derive +SOLID CREATE AutomatedModelingCommand Automated Modeling +SOLID CREATE Extrude Extrude +SOLID CREATE Revolve Revolve +SOLID CREATE Sweep Sweep +SOLID CREATE SolidLoft Loft +SOLID CREATE FusionRibCommand Rib +SOLID CREATE FusionWebCommand Web +SOLID CREATE EmbossCmd Emboss +SOLID CREATE FusionHoleCommand Hole +SOLID CREATE FusionThreadCommand Thread +SOLID CREATE PrimitiveBox Box +SOLID CREATE PrimitiveCylinder Cylinder +SOLID CREATE PrimitiveSphere Sphere +SOLID CREATE PrimitiveTorus Torus +SOLID CREATE PrimitiveCoil Coil +SOLID CREATE PrimitivePipe Pipe +SOLID CREATE StockModelCommand Bounding Solid +SOLID CREATE PatternRectangular Rectangular Pattern +SOLID CREATE PatternCircular Circular Pattern +SOLID CREATE PatternOnPath Pattern on Path +SOLID CREATE FusionPatternGeometricCommand Geometric Pattern +SOLID CREATE MirrorCommand Mirror +SOLID CREATE FusionSurfaceThickenCommand Thicken +SOLID CREATE SurfaceSculpt Boundary Fill +SOLID CREATE FusionFindFeaturesCommand Find Features +SOLID CREATE EnclosureCommand Fluid Volume +SOLID CREATE BaseFeatureCreationCommand Create Base Feature +SOLID CREATE PCBExternalComponentCreationCmd Create Linked PCB +SOLID CREATE PCBDeriveCmd Derive PCB +SOLID CREATE PCBCreateCmd Create Unlinked PCB +SOLID CREATE JointOrigin Joint Origin +SOLID CREATE TimelineBuilderCommand Generate Timeline +SOLID MODIFY FusionPressPullCommand Press Pull +SOLID MODIFY EditFaceCommand Edit Face +SOLID MODIFY FusionFilletEdgesCommand Fillet +SOLID MODIFY FusionChamferCommand Chamfer +SOLID MODIFY FusionShellBodyCommand Shell +SOLID MODIFY FusionDraftCommand Draft +SOLID MODIFY ModifyScale Scale +SOLID MODIFY FusionCombineCommand Combine +SOLID MODIFY FusionOffsetFacesCommand Offset Face +SOLID MODIFY FusionReplaceFaceCommand Replace Face +SOLID MODIFY FusionSplitFaceCommand Split Face +SOLID MODIFY FusionSplitBodyCommand Split Body +SOLID MODIFY FusionPartingLineSplitCmd Silhouette Split +SOLID MODIFY FusionMoveCommand Move/Copy +SOLID MODIFY AlignCmd Align +SOLID MODIFY FusionDeleteCommand Delete +SOLID MODIFY SoftDeleteCommand Remove +SOLID MODIFY ArrangeCommand Arrange +SOLID MODIFY FusionRemoveFeaturesCommand Remove Features +SOLID MODIFY FusionRemoveFacesCommand Remove Faces +SOLID MODIFY ReplaceWithPrimitivesCommand Replace with Primitives +SOLID MODIFY VolFieldCreateLatticeCommand Volumetric Lattice +SOLID MODIFY VolFieldTextureCommand Volumetric Texture +SOLID MODIFY VolFieldModifyModelCommand VolFieldModifyModelCommand +SOLID MODIFY PhysicalMaterialCommand Physical Material +SOLID MODIFY AppearanceCommand Appearance +SOLID MODIFY MaterialCommand Manage Materials +SOLID MODIFY ChangeParameterCommand Change Parameters +SOLID MODIFY FusionComputeAllCommand Compute All +SOLID MODIFY FusionComputeUnresolvedCommand Compute Unresolved +SOLID MODIFY TSpline2BRepCommand Convert +SOLID MODIFY MaterializedBomHybridCmd Bill of Materials +SOLID ASSEMBLE FusionImportCommandFromToolbar Insert Component +SOLID ASSEMBLE FusionCreateNewComponentCommand New Component +SOLID ASSEMBLE FusionDuplicateWithJointsCommand Duplicate With Joints +SOLID ASSEMBLE AssemblyMateCommand Constrain Components +SOLID ASSEMBLE AlignConstraintCmd Align Constraint +SOLID ASSEMBLE AngleConstraintCmd Angle Constraint +SOLID ASSEMBLE MidplaneConstraintCmd Center Constraint +SOLID ASSEMBLE TangentConstraintCmd Tangent Constraint +SOLID ASSEMBLE JointConstraintCmd Joint Constraint +SOLID ASSEMBLE JointAssembleCmdNew Joint +SOLID ASSEMBLE JointAsBuiltCmd As-Built Joint +SOLID ASSEMBLE AsBuiltConstraintCmd As-Built Constraint +SOLID ASSEMBLE RigidGroupCmd Rigid Group +SOLID ASSEMBLE FusionMoveJointsCommand Drive Joints +SOLID ASSEMBLE FusionMotionRelationshipCommand Motion Link +SOLID ASSEMBLE FusionMotionStudyCommand Motion Study +SOLID ASSEMBLE EnableContactSetsCmd Enable Contact Sets +SOLID ASSEMBLE EnableAllContactCmd Enable All Contact +SOLID ASSEMBLE DisableAllContactCmd Disable Contact +SOLID ASSEMBLE ContactSetCmd New Contact Set +SOLID CONFIGURE FusionStartDesignConfigModeCmd Configure +SOLID CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +SOLID CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +SOLID CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +SOLID CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +SOLID CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +SOLID CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +SOLID CONSTRUCT ConstructionMidPlaneCommand Midplane +SOLID CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +SOLID CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +SOLID CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +SOLID CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +SOLID CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +SOLID CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +SOLID CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +SOLID CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +SOLID CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +SOLID CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +SOLID CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +SOLID CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +SOLID CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +SOLID CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +SOLID CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +SOLID INSPECT MeasureCommand Measure +SOLID INSPECT InterferenceCheckCommand Interference +SOLID INSPECT FusionHalfSectionViewCommand Section Analysis +SOLID INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +SOLID INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +SOLID INSPECT FusionDraftAnalysisCommand Draft Analysis +SOLID INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +SOLID INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +SOLID INSPECT FusionSurfaceValidateCommand Validate +SOLID INSPECT FusionZebraAnalysisCommand Zebra Analysis +SOLID INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +SOLID INSPECT FusionCenterOfMassCommand Center of Mass +SOLID INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +SOLID INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +SOLID INSPECT FusionDOFAnalysisCommand DOF Analysis +SOLID INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +SOLID INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +SOLID INSPECT SimilarPartsCommand Find Similar Components +SOLID INSPECT GraphViewCmd Navigator +SOLID INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +SOLID INSPECT FacegroupsToggleCmd Display Mesh Face Groups +SOLID INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +SOLID INSPECT ShowChangeAwarenessToolbarCmd Change Summary +SOLID INSPECT ShowHistoryToolbarCmd History +SOLID INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +SOLID INSERT FusionAddEditDecalCommand Decal +SOLID INSERT FusionAddCanvasCommand Canvas +SOLID INSERT TSplineImportCommand Insert T-Spline +SOLID INSERT SketchImportSVG Insert SVG +SOLID INSERT ImportDxfFileCommand Insert DXF +SOLID INSERT ParaMeshInsertAlignCommand Insert Mesh +SOLID INSERT FusionFastenersCommand Insert Fastener +SOLID INSERT PullDeriveCommand Insert Derive +SOLID INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +SOLID INSERT cadenasparts4cad Insert a manufacturer part +SOLID INSERT traceparts_insert Insert TraceParts Supplier Components +SOLID ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +SOLID SELECT SelectCommand Select +SOLID SELECT selectWindow Window Selection +SOLID SELECT selectFreeForm Freeform Selection +SOLID SELECT selectPaint Paint Selection +SOLID SELECT SelectByNameCommand Select By Name +SOLID SELECT SelectByBoundaryCommand Select By Boundary +SOLID SELECT FusionSelectBodiesBySizeCommand Select By Size +SOLID SELECT SelectByInvertCommand Invert Selection +SOLID SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +SOLID SELECT FusionDragCompControlsCmd Component Drag +SOLID SELECT SelectBodyPriorityCommand Select Body Priority +SOLID SELECT SelectFacePriorityCommand Select Face Priority +SOLID SELECT SelectEdgePriorityCommand Select Edge Priority +SOLID SELECT SelectComponentPriorityCommand Select Component Priority +SOLID SELECT SelectionFilterCommand Selection Filters +SOLID POSITION SnapshotCmd Capture Position +SOLID POSITION AsBuiltPositionsCmd Revert Position +SKETCH CREATE DrawPolyline Line +SKETCH CREATE SketchMidpointLine Midpoint Line +SKETCH CREATE SketchConstrainer SketchConstrainer +SKETCH CREATE ShapeRectangleTwoPoint 2-Point Rectangle +SKETCH CREATE ShapeRectangleThreePoint 3-Point Rectangle +SKETCH CREATE ShapeRectangleCenter Center Rectangle +SKETCH CREATE CircleCenterRadius Center Diameter Circle +SKETCH CREATE CircleTwoPoint 2-Point Circle +SKETCH CREATE CircleThreePoint 3-Point Circle +SKETCH CREATE CircleTanTanRadius 2-Tangent Circle +SKETCH CREATE CircleThreeTangent 3-Tangent Circle +SKETCH CREATE ArcThreePoint 3-Point Arc +SKETCH CREATE ArcCenterTwoPoint Center Point Arc +SKETCH CREATE ArcTangent Tangent Arc +SKETCH CREATE ShapePolygonCircumscribed Circumscribed Polygon +SKETCH CREATE ShapePolygonInscribed Inscribed Polygon +SKETCH CREATE ShapePolygonEdge Edge Polygon +SKETCH CREATE CircleElipse Ellipse +SKETCH CREATE ShapeSlotCenterToCenter Center to Center Slot +SKETCH CREATE ShapeSlotOverall Overall Slot +SKETCH CREATE ShapeSlotCenterPoint Center Point Slot +SKETCH CREATE ShapeArcSlotThreePoint Three Point Arc Slot +SKETCH CREATE ShapeArcSlotCenterTwoPoint Center Point Arc Slot +SKETCH CREATE DrawSpline Fit Point Spline +SKETCH CREATE DrawCVMSpline3D Control Point Spline +SKETCH CREATE DrawCVMSpline5D Control Point Spline +SKETCH CREATE ConicCurveCmd Conic Curve +SKETCH CREATE DrawPoint Point +SKETCH CREATE MTextCmd Text +SKETCH CREATE FitCurvesToSectionCommand Fit Curves to Mesh Section +SKETCH CREATE MirrorSketchCommand Mirror +SKETCH CREATE CircularSketchPatternCommand Circular Pattern +SKETCH CREATE RectangularSketchPatternCommand Rectangular Pattern +SKETCH CREATE ProjectNewCmd Project +SKETCH CREATE IntersectCmd Intersect +SKETCH CREATE SpunProfileCmd Spun Profile +SKETCH CREATE Include3DGeometry Include 3D Geometry +SKETCH CREATE ProjectToSurface Project To Surface +SKETCH CREATE IntersectionCurve Intersection Curve +SKETCH CREATE SketchIsoparametricCurve Isoparametric Curve +SKETCH CREATE SketchDimension Sketch Dimension +SKETCH MODIFY FilletSketchCmd Fillet +SKETCH MODIFY ChamferSketchEqualDistance Equal Distance Chamfer +SKETCH MODIFY ChamferSketchDistanceAngle Distance and Angle Chamfer +SKETCH MODIFY ChamferSketchDistanceDistance Two Distance Chamfer +SKETCH MODIFY BlendG1CurveSketchCmd Blend Curve +SKETCH MODIFY Offset Offset +SKETCH MODIFY TrimSketchCmd Trim +SKETCH MODIFY ExtendSketchCmd Extend +SKETCH MODIFY BreakSketchCmd Break +SKETCH MODIFY SketchScaleCmd Sketch Scale +SKETCH MODIFY FusionMoveCommand Move/Copy +SKETCH MODIFY ChangeParameterCommand Change Parameters +SKETCH CONSTRAINTS SketchAutoConstraintAndDimCmd AutoConstrain +SKETCH CONSTRAINTS SketchAutoConstraintAndDimFromDatumCmd AutoConstrain from datum +SKETCH CONSTRAINTS ConstraintHorizontalVertical Horizontal/Vertical +SKETCH CONSTRAINTS ConstraintCoincident Coincident +SKETCH CONSTRAINTS ConstraintTangent Tangent +SKETCH CONSTRAINTS ConstraintEqual Equal +SKETCH CONSTRAINTS ConstraintParallel Parallel +SKETCH CONSTRAINTS ConstraintPerpendicular Perpendicular +SKETCH CONSTRAINTS ConstraintFix Fix/UnFix +SKETCH CONSTRAINTS ConstraintMidPoint MidPoint +SKETCH CONSTRAINTS ConstraintConcentric Concentric +SKETCH CONSTRAINTS ConstraintCollinear Collinear +SKETCH CONSTRAINTS ConstraintSymmetry Symmetry +SKETCH CONSTRAINTS ConstraintSmooth Curvature +SKETCH CONSTRAINTS SketchPolygonConstraintCmd Polygon +SKETCH CONFIGURE FusionStartDesignConfigModeCmd Configure +SKETCH CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +SKETCH CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +SKETCH INSPECT MeasureCommand Measure +SKETCH INSPECT InterferenceCheckCommand Interference +SKETCH INSPECT FusionHalfSectionViewCommand Section Analysis +SKETCH INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +SKETCH INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +SKETCH INSPECT FusionDraftAnalysisCommand Draft Analysis +SKETCH INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +SKETCH INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +SKETCH INSPECT FusionSurfaceValidateCommand Validate +SKETCH INSPECT FusionZebraAnalysisCommand Zebra Analysis +SKETCH INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +SKETCH INSPECT FusionCenterOfMassCommand Center of Mass +SKETCH INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +SKETCH INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +SKETCH INSPECT FusionDOFAnalysisCommand DOF Analysis +SKETCH INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +SKETCH INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +SKETCH INSPECT SimilarPartsCommand Find Similar Components +SKETCH INSPECT GraphViewCmd Navigator +SKETCH INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +SKETCH INSPECT FacegroupsToggleCmd Display Mesh Face Groups +SKETCH INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +SKETCH INSPECT ShowChangeAwarenessToolbarCmd Change Summary +SKETCH INSPECT ShowHistoryToolbarCmd History +SKETCH INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +SKETCH INSERT FusionAddEditDecalCommand Decal +SKETCH INSERT FusionAddCanvasCommand Canvas +SKETCH INSERT TSplineImportCommand Insert T-Spline +SKETCH INSERT SketchImportSVG Insert SVG +SKETCH INSERT ImportDxfFileCommand Insert DXF +SKETCH INSERT ParaMeshInsertAlignCommand Insert Mesh +SKETCH INSERT FusionImportCommandFromToolbar Insert Component +SKETCH INSERT FusionFastenersCommand Insert Fastener +SKETCH INSERT FusionDuplicateWithJointsCommand Duplicate With Joints +SKETCH INSERT PullDeriveCommand Insert Derive +SKETCH INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +SKETCH INSERT cadenasparts4cad Insert a manufacturer part +SKETCH INSERT traceparts_insert Insert TraceParts Supplier Components +SKETCH ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +SKETCH SELECT SelectCommand Select +SKETCH SELECT selectWindow Window Selection +SKETCH SELECT selectFreeForm Freeform Selection +SKETCH SELECT selectPaint Paint Selection +SKETCH SELECT SelectByNameCommand Select By Name +SKETCH SELECT SelectByBoundaryCommand Select By Boundary +SKETCH SELECT FusionSelectBodiesBySizeCommand Select By Size +SKETCH SELECT SelectByInvertCommand Invert Selection +SKETCH SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +SKETCH SELECT FusionDragCompControlsCmd Component Drag +SKETCH SELECT SelectBodyPriorityCommand Select Body Priority +SKETCH SELECT SelectFacePriorityCommand Select Face Priority +SKETCH SELECT SelectEdgePriorityCommand Select Edge Priority +SKETCH SELECT SelectComponentPriorityCommand Select Component Priority +SKETCH SELECT SelectionFilterCommand Selection Filters +SKETCH FINISH SKETCH SketchStop Finish Sketch +SKETCH FINISH SKETCH SketchAutoConstrainAndFinish Finish with AutoConstrain +SURFACE CREATE FusionCreateNewComponentCommand New Component +SURFACE CREATE SketchCreate Create Sketch +SURFACE CREATE TSplineBaseFeatureCreationCommand Create Form +SURFACE CREATE PushDeriveCommand Derive +SURFACE CREATE SurfaceExtrude Extrude +SURFACE CREATE SurfaceRevolve Revolve +SURFACE CREATE SurfaceSweep Sweep +SURFACE CREATE SurfaceLoft Loft +SURFACE CREATE FusionSurfacePatchCommand Patch +SURFACE CREATE FusionSurfaceRuledCommand Ruled +SURFACE CREATE FusionSurfaceOffsetCommand Offset +SURFACE CREATE SurfPrimitiveBox Box +SURFACE CREATE SurfPrimitiveCylinder Cylinder +SURFACE CREATE SurfPrimitiveSphere Sphere +SURFACE CREATE SurfPrimitiveTorus Torus +SURFACE CREATE SurfPrimitiveCoil Coil +SURFACE CREATE SurfPrimitivePipe Pipe +SURFACE CREATE PatternRectangular Rectangular Pattern +SURFACE CREATE PatternCircular Circular Pattern +SURFACE CREATE PatternOnPath Pattern on Path +SURFACE CREATE FusionPatternGeometricCommand Geometric Pattern +SURFACE CREATE MirrorCommand Mirror +SURFACE CREATE FusionSurfaceThickenCommand Thicken +SURFACE CREATE SurfaceSculpt Boundary Fill +SURFACE CREATE JointOrigin Joint Origin +SURFACE MODIFY FusionPressPullCommand Press Pull +SURFACE MODIFY EditFaceCommand Edit Face +SURFACE MODIFY FusionFilletEdgesCommand Fillet +SURFACE MODIFY FusionChamferCommand Chamfer +SURFACE MODIFY FusionSurfaceTrimCommand Trim +SURFACE MODIFY FusionSurfaceUntrimCommand Untrim +SURFACE MODIFY FusionExtendCommand Extend +SURFACE MODIFY FusionSurfaceStitchCommand Stitch +SURFACE MODIFY FusionSurfaceUnStitchCommand Unstitch +SURFACE MODIFY FusionSurfaceMergeCommand Merge +SURFACE MODIFY FusionSurfaceReverseNormalCommand Reverse Normal +SURFACE MODIFY ModifyScale Scale +SURFACE MODIFY FusionSplitFaceCommand Split Face +SURFACE MODIFY FusionSplitBodyCommand Split Body +SURFACE MODIFY FusionMoveCommand Move/Copy +SURFACE MODIFY AlignCmd Align +SURFACE MODIFY FusionDeleteCommand Delete +SURFACE MODIFY SoftDeleteCommand Remove +SURFACE MODIFY TSpline2BRepCommand Convert +SURFACE MODIFY PhysicalMaterialCommand Physical Material +SURFACE MODIFY AppearanceCommand Appearance +SURFACE MODIFY MaterialCommand Manage Materials +SURFACE MODIFY ChangeParameterCommand Change Parameters +SURFACE MODIFY FusionComputeAllCommand Compute All +SURFACE MODIFY FusionComputeUnresolvedCommand Compute Unresolved +SURFACE MODIFY MaterializedBomHybridCmd Bill of Materials +SURFACE ASSEMBLE FusionImportCommandFromToolbar Insert Component +SURFACE ASSEMBLE FusionDuplicateWithJointsCommand Duplicate With Joints +SURFACE ASSEMBLE AssemblyMateCommand Constrain Components +SURFACE ASSEMBLE AlignConstraintCmd Align Constraint +SURFACE ASSEMBLE AngleConstraintCmd Angle Constraint +SURFACE ASSEMBLE MidplaneConstraintCmd Center Constraint +SURFACE ASSEMBLE TangentConstraintCmd Tangent Constraint +SURFACE ASSEMBLE JointConstraintCmd Joint Constraint +SURFACE ASSEMBLE JointAssembleCmdNew Joint +SURFACE ASSEMBLE JointAsBuiltCmd As-Built Joint +SURFACE ASSEMBLE AsBuiltConstraintCmd As-Built Constraint +SURFACE ASSEMBLE RigidGroupCmd Rigid Group +SURFACE ASSEMBLE FusionMoveJointsCommand Drive Joints +SURFACE ASSEMBLE FusionMotionRelationshipCommand Motion Link +SURFACE ASSEMBLE FusionMotionStudyCommand Motion Study +SURFACE ASSEMBLE EnableContactSetsCmd Enable Contact Sets +SURFACE ASSEMBLE EnableAllContactCmd Enable All Contact +SURFACE ASSEMBLE DisableAllContactCmd Disable Contact +SURFACE ASSEMBLE ContactSetCmd New Contact Set +SURFACE CONFIGURE FusionStartDesignConfigModeCmd Configure +SURFACE CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +SURFACE CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +SURFACE CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +SURFACE CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +SURFACE CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +SURFACE CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +SURFACE CONSTRUCT ConstructionMidPlaneCommand Midplane +SURFACE CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +SURFACE CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +SURFACE CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +SURFACE CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +SURFACE CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +SURFACE CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +SURFACE CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +SURFACE CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +SURFACE CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +SURFACE CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +SURFACE CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +SURFACE CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +SURFACE CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +SURFACE CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +SURFACE CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +SURFACE INSPECT MeasureCommand Measure +SURFACE INSPECT InterferenceCheckCommand Interference +SURFACE INSPECT FusionHalfSectionViewCommand Section Analysis +SURFACE INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +SURFACE INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +SURFACE INSPECT FusionDraftAnalysisCommand Draft Analysis +SURFACE INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +SURFACE INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +SURFACE INSPECT FusionSurfaceValidateCommand Validate +SURFACE INSPECT FusionZebraAnalysisCommand Zebra Analysis +SURFACE INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +SURFACE INSPECT FusionCenterOfMassCommand Center of Mass +SURFACE INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +SURFACE INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +SURFACE INSPECT FusionDOFAnalysisCommand DOF Analysis +SURFACE INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +SURFACE INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +SURFACE INSPECT SimilarPartsCommand Find Similar Components +SURFACE INSPECT GraphViewCmd Navigator +SURFACE INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +SURFACE INSPECT FacegroupsToggleCmd Display Mesh Face Groups +SURFACE INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +SURFACE INSPECT ShowChangeAwarenessToolbarCmd Change Summary +SURFACE INSPECT ShowHistoryToolbarCmd History +SURFACE INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +SURFACE INSERT FusionAddEditDecalCommand Decal +SURFACE INSERT FusionAddCanvasCommand Canvas +SURFACE INSERT TSplineImportCommand Insert T-Spline +SURFACE INSERT SketchImportSVG Insert SVG +SURFACE INSERT ImportDxfFileCommand Insert DXF +SURFACE INSERT ParaMeshInsertAlignCommand Insert Mesh +SURFACE INSERT FusionFastenersCommand Insert Fastener +SURFACE INSERT PullDeriveCommand Insert Derive +SURFACE INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +SURFACE INSERT cadenasparts4cad Insert a manufacturer part +SURFACE INSERT traceparts_insert Insert TraceParts Supplier Components +SURFACE ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +SURFACE SELECT SelectCommand Select +SURFACE SELECT selectWindow Window Selection +SURFACE SELECT selectFreeForm Freeform Selection +SURFACE SELECT selectPaint Paint Selection +SURFACE SELECT SelectByNameCommand Select By Name +SURFACE SELECT SelectByBoundaryCommand Select By Boundary +SURFACE SELECT FusionSelectBodiesBySizeCommand Select By Size +SURFACE SELECT SelectByInvertCommand Invert Selection +SURFACE SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +SURFACE SELECT FusionDragCompControlsCmd Component Drag +SURFACE SELECT SelectBodyPriorityCommand Select Body Priority +SURFACE SELECT SelectFacePriorityCommand Select Face Priority +SURFACE SELECT SelectEdgePriorityCommand Select Edge Priority +SURFACE SELECT SelectComponentPriorityCommand Select Component Priority +SURFACE SELECT SelectionFilterCommand Selection Filters +SURFACE POSITION SnapshotCmd Capture Position +SURFACE POSITION AsBuiltPositionsCmd Revert Position +MESH CREATE FusionCreateNewComponentCommand New Component +MESH CREATE ParaMeshInsertAlignCommand Insert Mesh +MESH CREATE ParaMeshTessellateCommand Tessellate +MESH CREATE ParaMeshPlanarSectionCommand Create Mesh Section Sketch +MESH CREATE ParaMeshEmptyBaseFeatureCommand Create Base Mesh Feature +MESH PREPARE ParaMeshRepairCommand Repair +MESH PREPARE ParaMeshCalculateFaceGroupsCommand Generate Face Groups +MESH PREPARE ParaMeshMergeFaceGroupsCommand Combine Face Groups +MESH PREPARE ParaMeshCreateFaceGroupCommand Create Face Group +MESH MODIFY ParaMeshBaseFeatureCreateCommand Direct Edit +MESH MODIFY ParaMeshRemeshCommand Remesh +MESH MODIFY ParaMeshReduceCommand Reduce +MESH MODIFY ParaMeshPlaneCutCommand Plane Cut +MESH MODIFY ParaMeshHollowCommand Shell +MESH MODIFY ParaMeshCombineCommand Combine +MESH MODIFY ParaMeshSmoothCommand Smooth +MESH MODIFY ParaMeshSmoothBoundaryCommand Smooth Boundary +MESH MODIFY ParaMeshReverseNormalsCommand Reverse Normal +MESH MODIFY ParaMeshCloseCracksCommand Close Cracks +MESH MODIFY ParaMeshEraseAndFillCommand Erase And Fill +MESH MODIFY ParaMeshBridgeCommand Bridge +MESH MODIFY ParaMeshAlignCommand Mesh Align +MESH MODIFY ParaMeshAttractToReferenceCommand Attract to Reference +MESH MODIFY ParaMeshTextureCommand Texture Extrude +MESH MODIFY ParaMeshExtractCommand Separate +MESH MODIFY FusionMoveCommand Move/Copy +MESH MODIFY ParaMeshScaleCommand Scale Mesh +MESH MODIFY FusionDeleteCommand Delete +MESH MODIFY ParaMeshRemoveCommand Remove +MESH MODIFY ParaMeshConvertCommand Convert Mesh +MESH MODIFY ParaMeshToQuadMeshCommand Convert To Quad Mesh +MESH MODIFY VolFieldCreateLatticeCommand Volumetric Lattice +MESH MODIFY VolFieldTextureCommand Volumetric Texture +MESH MODIFY VolFieldModifyModelCommand VolFieldModifyModelCommand +MESH MODIFY PhysicalMaterialCommand Physical Material +MESH MODIFY AppearanceCommand Appearance +MESH MODIFY ChangeParameterCommand Change Parameters +MESH MODIFY FusionComputeAllCommand Compute All +MESH MODIFY MaterializedBomHybridCmd Bill of Materials +MESH ASSEMBLE FusionImportCommandFromToolbar Insert Component +MESH ASSEMBLE FusionDuplicateWithJointsCommand Duplicate With Joints +MESH ASSEMBLE AssemblyMateCommand Constrain Components +MESH ASSEMBLE AlignConstraintCmd Align Constraint +MESH ASSEMBLE AngleConstraintCmd Angle Constraint +MESH ASSEMBLE MidplaneConstraintCmd Center Constraint +MESH ASSEMBLE TangentConstraintCmd Tangent Constraint +MESH ASSEMBLE JointConstraintCmd Joint Constraint +MESH ASSEMBLE JointAssembleCmdNew Joint +MESH ASSEMBLE JointAsBuiltCmd As-Built Joint +MESH ASSEMBLE AsBuiltConstraintCmd As-Built Constraint +MESH ASSEMBLE JointOrigin Joint Origin +MESH ASSEMBLE RigidGroupCmd Rigid Group +MESH ASSEMBLE FusionMoveJointsCommand Drive Joints +MESH ASSEMBLE FusionMotionRelationshipCommand Motion Link +MESH ASSEMBLE FusionMotionStudyCommand Motion Study +MESH ASSEMBLE EnableContactSetsCmd Enable Contact Sets +MESH ASSEMBLE EnableAllContactCmd Enable All Contact +MESH ASSEMBLE DisableAllContactCmd Disable Contact +MESH ASSEMBLE ContactSetCmd New Contact Set +MESH CONFIGURE FusionStartDesignConfigModeCmd Configure +MESH CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +MESH CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +MESH CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +MESH CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +MESH CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +MESH CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +MESH CONSTRUCT ConstructionMidPlaneCommand Midplane +MESH CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +MESH CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +MESH CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +MESH CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +MESH CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +MESH CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +MESH CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +MESH CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +MESH CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +MESH CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +MESH CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +MESH CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +MESH CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +MESH CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +MESH CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +MESH INSPECT MeasureCommand Measure +MESH INSPECT InterferenceCheckCommand Interference +MESH INSPECT FusionHalfSectionViewCommand Section Analysis +MESH INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +MESH INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +MESH INSPECT FusionDraftAnalysisCommand Draft Analysis +MESH INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +MESH INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +MESH INSPECT FusionSurfaceValidateCommand Validate +MESH INSPECT FusionZebraAnalysisCommand Zebra Analysis +MESH INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +MESH INSPECT FusionCenterOfMassCommand Center of Mass +MESH INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +MESH INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +MESH INSPECT FusionDOFAnalysisCommand DOF Analysis +MESH INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +MESH INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +MESH INSPECT SimilarPartsCommand Find Similar Components +MESH INSPECT GraphViewCmd Navigator +MESH INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +MESH INSPECT FacegroupsToggleCmd Display Mesh Face Groups +MESH INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +MESH INSPECT ShowChangeAwarenessToolbarCmd Change Summary +MESH INSPECT ShowHistoryToolbarCmd History +MESH INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +MESH INSERT FusionAddEditDecalCommand Decal +MESH INSERT FusionAddCanvasCommand Canvas +MESH INSERT TSplineImportCommand Insert T-Spline +MESH INSERT SketchImportSVG Insert SVG +MESH INSERT ImportDxfFileCommand Insert DXF +MESH INSERT FusionFastenersCommand Insert Fastener +MESH INSERT PullDeriveCommand Insert Derive +MESH INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +MESH INSERT cadenasparts4cad Insert a manufacturer part +MESH INSERT traceparts_insert Insert TraceParts Supplier Components +MESH ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +MESH SELECT SelectCommand Select +MESH SELECT selectWindow Window Selection +MESH SELECT selectFreeForm Freeform Selection +MESH SELECT selectPaint Paint Selection +MESH SELECT ParaMeshShowSelectionPanelCmd Mesh Palette +MESH SELECT SelectBodyPriorityCommand Select Body Priority +MESH SELECT SelectFacePriorityCommand Select Face Priority +MESH SELECT SelectEdgePriorityCommand Select Edge Priority +MESH SELECT SelectComponentPriorityCommand Select Component Priority +MESH SELECT SelectionFilterCommand Selection Filters +MESH EXPORT ThreeDprintCmdDef 3D Print +MESH POSITION SnapshotCmd Capture Position +MESH POSITION AsBuiltPositionsCmd Revert Position +FORM CREATE FusionCreateNewComponentCommand New Component +FORM CREATE SketchCreate Create Sketch +FORM CREATE TSplinePrimitiveBoxCommand Box +FORM CREATE TSplinePrimitivePlaneCommand Plane +FORM CREATE TSplinePrimitiveCylinderCommand Cylinder +FORM CREATE TSplinePrimitiveSphereCommand Sphere +FORM CREATE TSplinePrimitiveTorusCommand Torus +FORM CREATE TSplinePrimitiveQuadBallCommand Quadball +FORM CREATE TSplinePrimitivePipe Pipe +FORM CREATE TSplineAppendFaceCommand Face +FORM CREATE TSplineExtrudeCommand Extrude +FORM CREATE TSplineRevolveCommand Revolve +FORM CREATE TSplineSweepCommand Sweep +FORM CREATE TSplineLoft Loft +FORM MODIFY TSplineEditCommand Edit Form +FORM MODIFY TSplineEditByCurveCmd Edit By Curve +FORM MODIFY TSplineInsertEdgeCommand Insert Edge +FORM MODIFY TSplineSubsetCmd Subdivide +FORM MODIFY TSplineInsertPointCommand Insert Point +FORM MODIFY TSplineMergeEdgeCmd Merge Edge +FORM MODIFY TSplineBridgeSubDCmd Bridge +FORM MODIFY TSplineFillHoleCmd Fill Hole +FORM MODIFY TSplineEraseAndFillCmd Erase And Fill +FORM MODIFY TSplineWeldCommand Weld Vertices +FORM MODIFY TSplineUnWeldCommand UnWeld Edges +FORM MODIFY TSplineCreasedEdgeCommand Crease +FORM MODIFY TSplineUnCreaseEdgeCmd UnCrease +FORM MODIFY TSplineBevelEdgeCommand Bevel Edge +FORM MODIFY TSplineSlideEdgeCommand Slide Edge +FORM MODIFY TSplineSmoothCmd Smooth +FORM MODIFY TSplineCylindrifyCmd Cylindrify +FORM MODIFY TSplinePullSubDCmd Pull +FORM MODIFY TSplineFlattenSubDCmd Flatten +FORM MODIFY TSplineStraightenCmd Straighten +FORM MODIFY TSplineMatchCmd Match +FORM MODIFY TSplineInterpolateSubDCmd Interpolate +FORM MODIFY TSplineThickenCommand Thicken +FORM MODIFY TSplineFreezeCmd Freeze +FORM MODIFY TSplineUnFreezeCmd UnFreeze +FORM MODIFY FusionMoveCommand Move/Copy +FORM MODIFY AlignCmd Align +FORM MODIFY FusionDeleteCommand Delete +FORM MODIFY PhysicalMaterialCommand Physical Material +FORM MODIFY AppearanceCommand Appearance +FORM MODIFY MaterialCommand Manage Materials +FORM SYMMETRY TSplineInternalMirrorSymmetryCmd Mirror - Internal +FORM SYMMETRY TSplineInternalCircularSymmetryCmd Circular - Internal +FORM SYMMETRY TSplineReflectionMirrorSymmetryCmd Mirror - Duplicate +FORM SYMMETRY TSplineReflectionCircularSymmetryCmd Circular - Duplicate +FORM SYMMETRY TSplineClearSymmetryCommand Clear Symmetry +FORM SYMMETRY TSplineIsolateSymmetryCmd Isolate Symmetry +FORM UTILITIES TSplineToggleTessModeCmd Display Mode +FORM UTILITIES TSplineRepairBodyCmd Repair Body +FORM UTILITIES TSplineMakeUniformCmd Make Uniform +FORM UTILITIES TSpline2BRepCommand Convert +FORM UTILITIES TSplineCapSettingCommand Enable Better Performance +FORM CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +FORM CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +FORM CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +FORM CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +FORM CONSTRUCT ConstructionMidPlaneCommand Midplane +FORM CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +FORM CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +FORM CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +FORM CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +FORM CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +FORM CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +FORM CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +FORM CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +FORM CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +FORM CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +FORM CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +FORM CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +FORM CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +FORM CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +FORM CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +FORM INSPECT MeasureCommand Measure +FORM INSPECT InterferenceCheckCommand Interference +FORM INSPECT FusionHalfSectionViewCommand Section Analysis +FORM INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +FORM INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +FORM INSPECT FusionDraftAnalysisCommand Draft Analysis +FORM INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +FORM INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +FORM INSPECT FusionSurfaceValidateCommand Validate +FORM INSPECT FusionZebraAnalysisCommand Zebra Analysis +FORM INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +FORM INSPECT FusionCenterOfMassCommand Center of Mass +FORM INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +FORM INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +FORM INSPECT FusionDOFAnalysisCommand DOF Analysis +FORM INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +FORM INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +FORM INSPECT SimilarPartsCommand Find Similar Components +FORM INSPECT GraphViewCmd Navigator +FORM INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +FORM INSPECT FacegroupsToggleCmd Display Mesh Face Groups +FORM INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +FORM INSPECT ShowChangeAwarenessToolbarCmd Change Summary +FORM INSPECT ShowHistoryToolbarCmd History +FORM INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +FORM INSERT FusionAddEditDecalCommand Decal +FORM INSERT FusionAddCanvasCommand Canvas +FORM INSERT TSplineImportCommand Insert T-Spline +FORM INSERT SketchImportSVG Insert SVG +FORM INSERT ImportDxfFileCommand Insert DXF +FORM INSERT ParaMeshInsertAlignCommand Insert Mesh +FORM INSERT FusionImportCommandFromToolbar Insert Component +FORM INSERT FusionFastenersCommand Insert Fastener +FORM INSERT FusionDuplicateWithJointsCommand Duplicate With Joints +FORM INSERT PullDeriveCommand Insert Derive +FORM INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +FORM INSERT cadenasparts4cad Insert a manufacturer part +FORM INSERT traceparts_insert Insert TraceParts Supplier Components +FORM ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +FORM SELECT SelectCommand Select +FORM SELECT selectWindow Window Selection +FORM SELECT selectFreeForm Freeform Selection +FORM SELECT selectPaint Paint Selection +FORM SELECT SelectByNameCommand Select By Name +FORM SELECT SelectByBoundaryCommand Select By Boundary +FORM SELECT FusionSelectBodiesBySizeCommand Select By Size +FORM SELECT SelectByInvertCommand Invert Selection +FORM SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +FORM SELECT FusionDragCompControlsCmd Component Drag +FORM SELECT SelectBodyPriorityCommand Select Body Priority +FORM SELECT SelectFacePriorityCommand Select Face Priority +FORM SELECT SelectEdgePriorityCommand Select Edge Priority +FORM SELECT SelectComponentPriorityCommand Select Component Priority +FORM SELECT SelectionFilterCommand Selection Filters +FORM FINISH FORM TSplineBaseFeatureStop Finish Form +SHEET METAL CREATE FusionCreateNewComponentCommand New Component +SHEET METAL CREATE SketchCreate Create Sketch +SHEET METAL CREATE FusionSheetMetalFlangeCommand Flange (Base/Edge/Contour) +SHEET METAL CREATE FusionSheetMetalHemFlangeCommand Hem +SHEET METAL CREATE FusionSheetMetalLoftCommand Lofted Flange +SHEET METAL CREATE SheetMetalFoldCmd Fold +SHEET METAL CREATE ConvertToSheetMetalCmd Convert to Sheet Metal +SHEET METAL CREATE DMConvertToSheetMetalCmd Convert to Sheet Metal +SHEET METAL CREATE PushDeriveCommand Derive +SHEET METAL CREATE Extrude Extrude +SHEET METAL CREATE FusionHoleCommand Hole +SHEET METAL CREATE FusionThreadCommand Thread +SHEET METAL CREATE PatternRectangular Rectangular Pattern +SHEET METAL CREATE PatternCircular Circular Pattern +SHEET METAL CREATE PatternOnPath Pattern on Path +SHEET METAL CREATE FusionPatternGeometricCommand Geometric Pattern +SHEET METAL CREATE MirrorCommand Mirror +SHEET METAL CREATE FusionSheetMetalFlatPatternCmd Create Flat Pattern +SHEET METAL CREATE JointOrigin Joint Origin +SHEET METAL MODIFY FusionSheetmetalUnfoldCommand Unfold +SHEET METAL MODIFY FusionSheetMetalRulesCommand Sheet Metal Rules +SHEET METAL MODIFY FusionSheetMetalRulesLibraryCommand Sheet Metal Rules Library +SHEET METAL MODIFY FusionSheetMetalCornerCommand Corner Closure +SHEET METAL MODIFY FusionJoinByBendCommand Join by bend +SHEET METAL MODIFY FusionSheetMetalRipCommand Rip +SHEET METAL MODIFY FusionSheetMetalFilletCommand Sheet Metal Fillet +SHEET METAL MODIFY FusionSheetMetalChamferCommand Sheet Metal Chamfer +SHEET METAL MODIFY FusionFilletEdgesCommand Fillet +SHEET METAL MODIFY FusionChamferCommand Chamfer +SHEET METAL MODIFY FusionMoveCommand Move/Copy +SHEET METAL MODIFY AlignCmd Align +SHEET METAL MODIFY FusionDeleteCommand Delete +SHEET METAL MODIFY SoftDeleteCommand Remove +SHEET METAL MODIFY PhysicalMaterialCommand Physical Material +SHEET METAL MODIFY AppearanceCommand Appearance +SHEET METAL MODIFY MaterialCommand Manage Materials +SHEET METAL MODIFY ChangeParameterCommand Change Parameters +SHEET METAL MODIFY FusionComputeAllCommand Compute All +SHEET METAL MODIFY FusionComputeUnresolvedCommand Compute Unresolved +SHEET METAL MODIFY MaterializedBomHybridCmd Bill of Materials +SHEET METAL ASSEMBLE FusionImportCommandFromToolbar Insert Component +SHEET METAL ASSEMBLE FusionDuplicateWithJointsCommand Duplicate With Joints +SHEET METAL ASSEMBLE AssemblyMateCommand Constrain Components +SHEET METAL ASSEMBLE AlignConstraintCmd Align Constraint +SHEET METAL ASSEMBLE AngleConstraintCmd Angle Constraint +SHEET METAL ASSEMBLE MidplaneConstraintCmd Center Constraint +SHEET METAL ASSEMBLE TangentConstraintCmd Tangent Constraint +SHEET METAL ASSEMBLE JointConstraintCmd Joint Constraint +SHEET METAL ASSEMBLE JointAssembleCmdNew Joint +SHEET METAL ASSEMBLE JointAsBuiltCmd As-Built Joint +SHEET METAL ASSEMBLE AsBuiltConstraintCmd As-Built Constraint +SHEET METAL ASSEMBLE RigidGroupCmd Rigid Group +SHEET METAL ASSEMBLE FusionMoveJointsCommand Drive Joints +SHEET METAL ASSEMBLE FusionMotionRelationshipCommand Motion Link +SHEET METAL ASSEMBLE FusionMotionStudyCommand Motion Study +SHEET METAL ASSEMBLE EnableContactSetsCmd Enable Contact Sets +SHEET METAL ASSEMBLE EnableAllContactCmd Enable All Contact +SHEET METAL ASSEMBLE DisableAllContactCmd Disable Contact +SHEET METAL ASSEMBLE ContactSetCmd New Contact Set +SHEET METAL CONFIGURE FusionStartDesignConfigModeCmd Configure +SHEET METAL CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +SHEET METAL CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +SHEET METAL CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +SHEET METAL CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +SHEET METAL CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +SHEET METAL CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +SHEET METAL CONSTRUCT ConstructionMidPlaneCommand Midplane +SHEET METAL CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +SHEET METAL CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +SHEET METAL CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +SHEET METAL CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +SHEET METAL CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +SHEET METAL CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +SHEET METAL CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +SHEET METAL CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +SHEET METAL CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +SHEET METAL CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +SHEET METAL CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +SHEET METAL CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +SHEET METAL CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +SHEET METAL CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +SHEET METAL CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +SHEET METAL INSPECT MeasureCommand Measure +SHEET METAL INSPECT InterferenceCheckCommand Interference +SHEET METAL INSPECT FusionHalfSectionViewCommand Section Analysis +SHEET METAL INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +SHEET METAL INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +SHEET METAL INSPECT FusionDraftAnalysisCommand Draft Analysis +SHEET METAL INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +SHEET METAL INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +SHEET METAL INSPECT FusionSurfaceValidateCommand Validate +SHEET METAL INSPECT FusionZebraAnalysisCommand Zebra Analysis +SHEET METAL INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +SHEET METAL INSPECT FusionCenterOfMassCommand Center of Mass +SHEET METAL INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +SHEET METAL INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +SHEET METAL INSPECT FusionDOFAnalysisCommand DOF Analysis +SHEET METAL INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +SHEET METAL INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +SHEET METAL INSPECT SimilarPartsCommand Find Similar Components +SHEET METAL INSPECT GraphViewCmd Navigator +SHEET METAL INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +SHEET METAL INSPECT FacegroupsToggleCmd Display Mesh Face Groups +SHEET METAL INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +SHEET METAL INSPECT ShowChangeAwarenessToolbarCmd Change Summary +SHEET METAL INSPECT ShowHistoryToolbarCmd History +SHEET METAL INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +SHEET METAL INSERT FusionAddEditDecalCommand Decal +SHEET METAL INSERT FusionAddCanvasCommand Canvas +SHEET METAL INSERT TSplineImportCommand Insert T-Spline +SHEET METAL INSERT SketchImportSVG Insert SVG +SHEET METAL INSERT ImportDxfFileCommand Insert DXF +SHEET METAL INSERT ParaMeshInsertAlignCommand Insert Mesh +SHEET METAL INSERT FusionFastenersCommand Insert Fastener +SHEET METAL INSERT PullDeriveCommand Insert Derive +SHEET METAL INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +SHEET METAL INSERT cadenasparts4cad Insert a manufacturer part +SHEET METAL INSERT traceparts_insert Insert TraceParts Supplier Components +SHEET METAL ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +SHEET METAL SELECT SelectCommand Select +SHEET METAL SELECT selectWindow Window Selection +SHEET METAL SELECT selectFreeForm Freeform Selection +SHEET METAL SELECT selectPaint Paint Selection +SHEET METAL SELECT SelectByNameCommand Select By Name +SHEET METAL SELECT SelectByBoundaryCommand Select By Boundary +SHEET METAL SELECT FusionSelectBodiesBySizeCommand Select By Size +SHEET METAL SELECT SelectByInvertCommand Invert Selection +SHEET METAL SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +SHEET METAL SELECT FusionDragCompControlsCmd Component Drag +SHEET METAL SELECT SelectBodyPriorityCommand Select Body Priority +SHEET METAL SELECT SelectFacePriorityCommand Select Face Priority +SHEET METAL SELECT SelectEdgePriorityCommand Select Edge Priority +SHEET METAL SELECT SelectComponentPriorityCommand Select Component Priority +SHEET METAL SELECT SelectionFilterCommand Selection Filters +SHEET METAL REFOLD FusionSheetmetalRefoldCommand Refold +SHEET METAL POSITION SnapshotCmd Capture Position +SHEET METAL POSITION AsBuiltPositionsCmd Revert Position +PLASTIC SETUP FusionAssignPlasticRuleCommand Assign Plastic Rule +PLASTIC SETUP FusionManagePlasticRuleCommand Manage Plastic Rules +PLASTIC CREATE FusionCreateNewComponentCommand New Component +PLASTIC CREATE SketchCreate Create Sketch +PLASTIC CREATE TSplineBaseFeatureCreationCommand Create Form +PLASTIC CREATE PushDeriveCommand Derive +PLASTIC CREATE Extrude Extrude +PLASTIC CREATE Revolve Revolve +PLASTIC CREATE Sweep Sweep +PLASTIC CREATE SolidLoft Loft +PLASTIC CREATE FusionRibCommand Rib +PLASTIC CREATE FusionWebCommand Web +PLASTIC CREATE EmbossCmd Emboss +PLASTIC CREATE FusionBossCommand Boss +PLASTIC CREATE FusionSnapFitCommand Snap Fit +PLASTIC CREATE FusionLipCommand Lip +PLASTIC CREATE FusionRestCommand Rest +PLASTIC CREATE FusionHoleCommand Hole +PLASTIC CREATE FusionThreadCommand Thread +PLASTIC CREATE PrimitiveBox Box +PLASTIC CREATE PrimitiveCylinder Cylinder +PLASTIC CREATE PrimitiveSphere Sphere +PLASTIC CREATE PrimitiveTorus Torus +PLASTIC CREATE PrimitiveCoil Coil +PLASTIC CREATE PrimitivePipe Pipe +PLASTIC CREATE PatternRectangular Rectangular Pattern +PLASTIC CREATE PatternCircular Circular Pattern +PLASTIC CREATE PatternOnPath Pattern on Path +PLASTIC CREATE FusionPatternGeometricCommand Geometric Pattern +PLASTIC CREATE MirrorCommand Mirror +PLASTIC CREATE FusionSurfaceThickenCommand Thicken +PLASTIC CREATE SurfaceSculpt Boundary Fill +PLASTIC CREATE BaseFeatureCreationCommand Create Base Feature +PLASTIC CREATE PCBExternalComponentCreationCmd Create Linked PCB +PLASTIC CREATE PCBDeriveCmd Derive PCB +PLASTIC CREATE PCBCreateCmd Create Unlinked PCB +PLASTIC CREATE JointOrigin Joint Origin +PLASTIC MODIFY FusionPressPullCommand Press Pull +PLASTIC MODIFY EditFaceCommand Edit Face +PLASTIC MODIFY FusionFilletEdgesCommand Fillet +PLASTIC MODIFY FusionChamferCommand Chamfer +PLASTIC MODIFY FusionShellBodyCommand Shell +PLASTIC MODIFY FusionDraftCommand Draft +PLASTIC MODIFY ModifyScale Scale +PLASTIC MODIFY FusionCombineCommand Combine +PLASTIC MODIFY FusionOffsetFacesCommand Offset Face +PLASTIC MODIFY FusionReplaceFaceCommand Replace Face +PLASTIC MODIFY FusionSplitFaceCommand Split Face +PLASTIC MODIFY FusionSplitBodyCommand Split Body +PLASTIC MODIFY FusionPartingLineSplitCmd Silhouette Split +PLASTIC MODIFY FusionMoveCommand Move/Copy +PLASTIC MODIFY AlignCmd Align +PLASTIC MODIFY FusionDeleteCommand Delete +PLASTIC MODIFY SoftDeleteCommand Remove +PLASTIC MODIFY ArrangeCommand Arrange +PLASTIC MODIFY FusionRemoveFeaturesCommand Remove Features +PLASTIC MODIFY FusionRemoveFacesCommand Remove Faces +PLASTIC MODIFY ReplaceWithPrimitivesCommand Replace with Primitives +PLASTIC MODIFY VolFieldCreateLatticeCommand Volumetric Lattice +PLASTIC MODIFY VolFieldTextureCommand Volumetric Texture +PLASTIC MODIFY VolFieldModifyModelCommand VolFieldModifyModelCommand +PLASTIC MODIFY PhysicalMaterialCommand Physical Material +PLASTIC MODIFY AppearanceCommand Appearance +PLASTIC MODIFY MaterialCommand Manage Materials +PLASTIC MODIFY ChangeParameterCommand Change Parameters +PLASTIC MODIFY FusionComputeAllCommand Compute All +PLASTIC MODIFY FusionComputeUnresolvedCommand Compute Unresolved +PLASTIC MODIFY TSpline2BRepCommand Convert +PLASTIC MODIFY MaterializedBomHybridCmd Bill of Materials +PLASTIC ASSEMBLE FusionImportCommandFromToolbar Insert Component +PLASTIC ASSEMBLE FusionDuplicateWithJointsCommand Duplicate With Joints +PLASTIC ASSEMBLE AssemblyMateCommand Constrain Components +PLASTIC ASSEMBLE AlignConstraintCmd Align Constraint +PLASTIC ASSEMBLE AngleConstraintCmd Angle Constraint +PLASTIC ASSEMBLE MidplaneConstraintCmd Center Constraint +PLASTIC ASSEMBLE TangentConstraintCmd Tangent Constraint +PLASTIC ASSEMBLE JointConstraintCmd Joint Constraint +PLASTIC ASSEMBLE JointAssembleCmdNew Joint +PLASTIC ASSEMBLE JointAsBuiltCmd As-Built Joint +PLASTIC ASSEMBLE AsBuiltConstraintCmd As-Built Constraint +PLASTIC ASSEMBLE RigidGroupCmd Rigid Group +PLASTIC ASSEMBLE FusionMoveJointsCommand Drive Joints +PLASTIC ASSEMBLE FusionMotionRelationshipCommand Motion Link +PLASTIC ASSEMBLE FusionMotionStudyCommand Motion Study +PLASTIC ASSEMBLE EnableContactSetsCmd Enable Contact Sets +PLASTIC ASSEMBLE EnableAllContactCmd Enable All Contact +PLASTIC ASSEMBLE DisableAllContactCmd Disable Contact +PLASTIC ASSEMBLE ContactSetCmd New Contact Set +PLASTIC CONFIGURE FusionStartDesignConfigModeCmd Configure +PLASTIC CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +PLASTIC CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +PLASTIC CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +PLASTIC CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +PLASTIC CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +PLASTIC CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +PLASTIC CONSTRUCT ConstructionMidPlaneCommand Midplane +PLASTIC CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +PLASTIC CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +PLASTIC CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +PLASTIC CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +PLASTIC CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +PLASTIC CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +PLASTIC CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +PLASTIC CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +PLASTIC CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +PLASTIC CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +PLASTIC CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +PLASTIC CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +PLASTIC CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +PLASTIC CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +PLASTIC CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +PLASTIC INSPECT MeasureCommand Measure +PLASTIC INSPECT InterferenceCheckCommand Interference +PLASTIC INSPECT FusionHalfSectionViewCommand Section Analysis +PLASTIC INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +PLASTIC INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +PLASTIC INSPECT FusionDraftAnalysisCommand Draft Analysis +PLASTIC INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +PLASTIC INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +PLASTIC INSPECT FusionSurfaceValidateCommand Validate +PLASTIC INSPECT FusionZebraAnalysisCommand Zebra Analysis +PLASTIC INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +PLASTIC INSPECT FusionCenterOfMassCommand Center of Mass +PLASTIC INSPECT DesignAdviceCmd Design Advice +PLASTIC INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +PLASTIC INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +PLASTIC INSPECT FusionDOFAnalysisCommand DOF Analysis +PLASTIC INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +PLASTIC INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +PLASTIC INSPECT SimilarPartsCommand Find Similar Components +PLASTIC INSPECT GraphViewCmd Navigator +PLASTIC INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +PLASTIC INSPECT FacegroupsToggleCmd Display Mesh Face Groups +PLASTIC INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +PLASTIC INSPECT ShowChangeAwarenessToolbarCmd Change Summary +PLASTIC INSPECT ShowHistoryToolbarCmd History +PLASTIC INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +PLASTIC INSERT FusionAddEditDecalCommand Decal +PLASTIC INSERT FusionAddCanvasCommand Canvas +PLASTIC INSERT TSplineImportCommand Insert T-Spline +PLASTIC INSERT SketchImportSVG Insert SVG +PLASTIC INSERT ImportDxfFileCommand Insert DXF +PLASTIC INSERT ParaMeshInsertAlignCommand Insert Mesh +PLASTIC INSERT FusionFastenersCommand Insert Fastener +PLASTIC INSERT PullDeriveCommand Insert Derive +PLASTIC INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +PLASTIC INSERT cadenasparts4cad Insert a manufacturer part +PLASTIC INSERT traceparts_insert Insert TraceParts Supplier Components +PLASTIC ASSEMBLE NewAssemblyFromPartCommand Add To Assembly +PLASTIC SELECT SelectCommand Select +PLASTIC SELECT selectWindow Window Selection +PLASTIC SELECT selectFreeForm Freeform Selection +PLASTIC SELECT selectPaint Paint Selection +PLASTIC SELECT SelectByNameCommand Select By Name +PLASTIC SELECT SelectByBoundaryCommand Select By Boundary +PLASTIC SELECT FusionSelectBodiesBySizeCommand Select By Size +PLASTIC SELECT SelectByInvertCommand Invert Selection +PLASTIC SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +PLASTIC SELECT FusionDragCompControlsCmd Component Drag +PLASTIC SELECT SelectBodyPriorityCommand Select Body Priority +PLASTIC SELECT SelectFacePriorityCommand Select Face Priority +PLASTIC SELECT SelectEdgePriorityCommand Select Edge Priority +PLASTIC SELECT SelectComponentPriorityCommand Select Component Priority +PLASTIC SELECT SelectionFilterCommand Selection Filters +PLASTIC POSITION SnapshotCmd Capture Position +PLASTIC POSITION AsBuiltPositionsCmd Revert Position +ASSEMBLY INSERT FusionImportCommandFromToolbar Insert Component +ASSEMBLY INSERT FusionFastenersCommand Insert Fastener +ASSEMBLY INSERT FusionDuplicateWithJointsCommand Duplicate With Joints +ASSEMBLY INSERT PullDeriveCommand Insert Derive +ASSEMBLY INSERT FusionAddEditDecalCommand Decal +ASSEMBLY INSERT FusionAddCanvasCommand Canvas +ASSEMBLY INSERT NewAssemblyFromPartCommand Add To Assembly +ASSEMBLY INSERT InsertMcMasterCarrComponentCommand Insert McMaster-Carr Component +ASSEMBLY CREATE FusionCreateNewComponentCommand New Component +ASSEMBLY CREATE SketchCreate Create Sketch +ASSEMBLY CREATE PatternRectangular Rectangular Pattern +ASSEMBLY CREATE PatternCircular Circular Pattern +ASSEMBLY CREATE PatternOnPath Pattern on Path +ASSEMBLY CREATE FusionPatternGeometricCommand Geometric Pattern +ASSEMBLY CREATE PCBExternalComponentCreationCmd Create Linked PCB +ASSEMBLY CREATE PushDeriveCommand Derive +ASSEMBLY RELATIONSHIPS AssemblyMateCommand Constrain Components +ASSEMBLY RELATIONSHIPS AlignConstraintCmd Align Constraint +ASSEMBLY RELATIONSHIPS AngleConstraintCmd Angle Constraint +ASSEMBLY RELATIONSHIPS MidplaneConstraintCmd Center Constraint +ASSEMBLY RELATIONSHIPS TangentConstraintCmd Tangent Constraint +ASSEMBLY RELATIONSHIPS JointConstraintCmd Joint Constraint +ASSEMBLY RELATIONSHIPS JointAssembleCmdNew Joint +ASSEMBLY RELATIONSHIPS JointAsBuiltCmd As-Built Joint +ASSEMBLY RELATIONSHIPS AsBuiltConstraintCmd As-Built Constraint +ASSEMBLY RELATIONSHIPS JointOrigin Joint Origin +ASSEMBLY RELATIONSHIPS RigidGroupCmd Rigid Group +ASSEMBLY MOTION FusionMoveJointsCommand Drive Joints +ASSEMBLY MOTION FusionMotionRelationshipCommand Motion Link +ASSEMBLY MOTION FusionMotionStudyCommand Motion Study +ASSEMBLY MODIFY FusionMoveCommand Move/Copy +ASSEMBLY MODIFY AlignCmd Align +ASSEMBLY MODIFY FusionDeleteCommand Delete +ASSEMBLY MODIFY SoftDeleteCommand Remove +ASSEMBLY MODIFY ArrangeCommand Arrange +ASSEMBLY MODIFY MaterializedBomCmd Bill of Materials +ASSEMBLY MODIFY ChangeParameterCommand Change Parameters +ASSEMBLY MODIFY PhysicalMaterialCommand Physical Material +ASSEMBLY MODIFY AppearanceCommand Appearance +ASSEMBLY MODIFY MaterialCommand Manage Materials +ASSEMBLY MODIFY FusionComputeAllCommand Compute All +ASSEMBLY CONTACT EnableContactSetsCmd Enable Contact Sets +ASSEMBLY CONTACT EnableAllContactCmd Enable All Contact +ASSEMBLY CONFIGURE FusionStartDesignConfigModeCmd Configure +ASSEMBLY CONFIGURE FusionShowDesignConfigPanelCmd Display Configuration Table +ASSEMBLY CONFIGURE FusionConfigurationRulesCmd Create Configuration Rules +ASSEMBLY CONSTRUCT CoordinateSystemCommand User Coordinate System (UCS) +ASSEMBLY CONSTRUCT ConstructionPlaneOffsetFromPlaneCommand Offset Plane +ASSEMBLY CONSTRUCT ConstructionPlaneAtAngleCommand Plane at Angle +ASSEMBLY CONSTRUCT ConstructionTangentPlaneCommand Tangent Plane +ASSEMBLY CONSTRUCT ConstructionMidPlaneCommand Midplane +ASSEMBLY CONSTRUCT ConstructionPlanePerpendicularToPlaneCommand Perpendicular Plane +ASSEMBLY CONSTRUCT ConstructionPlaneFromTwoEdgesCommand Plane Through Two Edges +ASSEMBLY CONSTRUCT ConstructionPlaneFromThreePointsCommand Plane Through Three Points +ASSEMBLY CONSTRUCT ConstructionPlaneAlongPathCommand Plane Along Path +ASSEMBLY CONSTRUCT ConstructionAxisThroughCylinderCommand Axis Through Cylinder/Cone/Torus +ASSEMBLY CONSTRUCT ConstructionAxisNormalToFaceCommand Axis Perpendicular To Face +ASSEMBLY CONSTRUCT ConstructionAxisFromTwoPlanesCommand Axis Through Two Planes +ASSEMBLY CONSTRUCT ConstructionAxisThroughTwoPointsCommand Axis Through Two Points +ASSEMBLY CONSTRUCT ConstructionAxisThroughEdgeCommand Axis Through Edge +ASSEMBLY CONSTRUCT ConstructionPointFromPointCommand Point At Vertex +ASSEMBLY CONSTRUCT ConstructionPointThroughTwoEdgesCommand Point Through Two Edges +ASSEMBLY CONSTRUCT ConstructionPointFromThreePlanesCommand Point Through Three Planes +ASSEMBLY CONSTRUCT ConstructionPointFromCircleOrSphereCommand Point At Center Of Circle/Sphere/Torus +ASSEMBLY CONSTRUCT ConstructionPointAtEdgeAndPlaneCommand Point At Edge And Plane +ASSEMBLY CONSTRUCT ConstructionPointAlongPathCommand Point Along Path +ASSEMBLY INSPECT MeasureCommand Measure +ASSEMBLY INSPECT InterferenceCheckCommand Interference +ASSEMBLY INSPECT FusionHalfSectionViewCommand Section Analysis +ASSEMBLY INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +ASSEMBLY INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +ASSEMBLY INSPECT FusionDraftAnalysisCommand Draft Analysis +ASSEMBLY INSPECT FusionEnvironmentMapAnalysisCommand Environment Map Analysis +ASSEMBLY INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +ASSEMBLY INSPECT FusionSurfaceValidateCommand Validate +ASSEMBLY INSPECT FusionZebraAnalysisCommand Zebra Analysis +ASSEMBLY INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +ASSEMBLY INSPECT FusionCenterOfMassCommand Center of Mass +ASSEMBLY INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +ASSEMBLY INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +ASSEMBLY INSPECT FusionDOFAnalysisCommand DOF Analysis +ASSEMBLY INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +ASSEMBLY INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +ASSEMBLY INSPECT SimilarPartsCommand Find Similar Components +ASSEMBLY INSPECT GraphViewCmd Navigator +ASSEMBLY INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +ASSEMBLY INSPECT FacegroupsToggleCmd Display Mesh Face Groups +ASSEMBLY INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +ASSEMBLY INSPECT ShowChangeAwarenessToolbarCmd Change Summary +ASSEMBLY INSPECT ShowHistoryToolbarCmd History +ASSEMBLY INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +ASSEMBLY SELECT SelectCommand Select +ASSEMBLY SELECT selectWindow Window Selection +ASSEMBLY SELECT selectFreeForm Freeform Selection +ASSEMBLY SELECT selectPaint Paint Selection +ASSEMBLY SELECT SelectByNameCommand Select By Name +ASSEMBLY SELECT SelectByBoundaryCommand Select By Boundary +ASSEMBLY SELECT FusionSelectBodiesBySizeCommand Select By Size +ASSEMBLY SELECT SelectByInvertCommand Invert Selection +ASSEMBLY SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +ASSEMBLY SELECT FusionDragCompControlsCmd Component Drag +ASSEMBLY SELECT SelectBodyPriorityCommand Select Body Priority +ASSEMBLY SELECT SelectFacePriorityCommand Select Face Priority +ASSEMBLY SELECT SelectEdgePriorityCommand Select Edge Priority +ASSEMBLY SELECT SelectComponentPriorityCommand Select Component Priority +ASSEMBLY SELECT SelectionFilterCommand Selection Filters +ASSEMBLY POSITION SnapshotCmd Capture Position +ASSEMBLY POSITION AsBuiltPositionsCmd Revert Position +MANAGE ASSIGN PIMAssignItemNumberCmd Assign Item Number +MANAGE RELEASE PIMQuickReleaseCmd Quick Release +MANAGE RELEASE PIMECOReleaseCmd Release with Change Order +MANAGE BOM MaterializedBomCmd Bill of Materials +MANAGE BOM MaterializedBomHybridCmd Bill of Materials +MANAGE PROCESS MANAGEMENT PIMGoToDashboardCmd Dashboard +MANAGE PROCESS MANAGEMENT PIMGoToItemDetailsCmd Details +MANAGE PROCESS MANAGEMENT PIMGoToChangeOrderCmd Change Orders +MANAGE TASK MANAGEMENT TaskManagementOpenTasksCmd Open tasks in web +MANAGE TASK MANAGEMENT TaskManagementCreateTaskCmd Create new task +MANAGE TASK MANAGEMENT TaskManagementRelatedTasksCmd Related tasks +UTILITIES MODELING TOOLS ModelingToggleCmdDef Modeling Tools +UTILITIES MAKE ThreeDprintCmdDef 3D Print +UTILITIES NEST MSFNestAuthoringCmd Nest Preparation +UTILITIES ADD-INS ScriptsManagerCommand Scripts and Add-Ins... +UTILITIES ADD-INS ExchangeAppStoreCommand Design and Make Marketplace +UTILITIES UTILITY MaterialCommand Manage Materials +UTILITIES UTILITY FusionManageThreadsLibraryCommand Manage Threads Library +UTILITIES UTILITY FusionComputeAllCommand Compute All +UTILITIES INSPECT MeasureCommand Measure +UTILITIES INSPECT InterferenceCheckCommand Interference +UTILITIES INSPECT FusionHalfSectionViewCommand Section Analysis +UTILITIES INSPECT FusionCurvatureCombAnalysisCommand Curvature Comb Analysis +UTILITIES INSPECT FusionCurvatureMapAnalysisCommand Curvature Map Analysis +UTILITIES INSPECT FusionDraftAnalysisCommand Draft Analysis +UTILITIES INSPECT FusionIsoCurveAnalysisCommand Isocurve Analysis +UTILITIES INSPECT FusionSurfaceValidateCommand Validate +UTILITIES INSPECT FusionZebraAnalysisCommand Zebra Analysis +UTILITIES INSPECT FusionAccessibilityAnalysisCommand Accessibility Analysis +UTILITIES INSPECT FusionCenterOfMassCommand Center of Mass +UTILITIES INSPECT FusionMinimumRadiusAnalysisCommand Minimum Radius Analysis +UTILITIES INSPECT FusionComponentConnectionAnalysisCommand Component Connection Analysis +UTILITIES INSPECT FusionDOFAnalysisCommand DOF Analysis +UTILITIES INSPECT FusionEditComponentConnectionAnalysisCommand Edit Component Connection Analysis +UTILITIES INSPECT FusionFastenerStackAnalysisCommand Fastener Stack Analysis +UTILITIES INSPECT SimilarPartsCommand Find Similar Components +UTILITIES INSPECT GraphViewCmd Navigator +UTILITIES INSPECT FusionViewColorCyclingToggleCmd Display Component Colors +UTILITIES INSPECT FacegroupsToggleCmd Display Mesh Face Groups +UTILITIES INSPECT FusionAssemblyStatisticsCommand Assembly Statistics +UTILITIES INSPECT ShowChangeAwarenessToolbarCmd Change Summary +UTILITIES INSPECT ShowHistoryToolbarCmd History +UTILITIES INSPECT GravityClimate_ManufacturingSustainabilityInsights_MainDialog Sustainability Insights +UTILITIES CREATE PMI HoleThreadNoteCommand Hole/Thread Note +UTILITIES CREATE PMI LeaderLineNoteCommand Note +UTILITIES CREATE PMI DimensionNoteCommand Sizes and Dimensions +UTILITIES CREATE PMI GeometricToleranceNoteCommand Geometric Tolerancing +UTILITIES SELECT SelectCommand Select +UTILITIES SELECT selectWindow Window Selection +UTILITIES SELECT selectFreeForm Freeform Selection +UTILITIES SELECT selectPaint Paint Selection +UTILITIES SELECT SelectByNameCommand Select By Name +UTILITIES SELECT SelectByBoundaryCommand Select By Boundary +UTILITIES SELECT FusionSelectBodiesBySizeCommand Select By Size +UTILITIES SELECT SelectByInvertCommand Invert Selection +UTILITIES SELECT FusionSelectSeedAndBoundaryFacesCommand Seed And Boundary +UTILITIES SELECT FusionDragCompControlsCmd Component Drag +UTILITIES SELECT SelectBodyPriorityCommand Select Body Priority +UTILITIES SELECT SelectFacePriorityCommand Select Face Priority +UTILITIES SELECT SelectEdgePriorityCommand Select Edge Priority +UTILITIES SELECT SelectComponentPriorityCommand Select Component Priority +UTILITIES SELECT SelectionFilterCommand Selection Filters +UTILITIES POSITION SnapshotCmd Capture Position +UTILITIES POSITION AsBuiltPositionsCmd Revert Position diff --git a/xtask/src/assets.rs b/xtask/src/assets.rs new file mode 100644 index 00000000..3628d757 --- /dev/null +++ b/xtask/src/assets.rs @@ -0,0 +1,39 @@ +//! `cargo xtask assets`: every non-code asset in the repository must have a row in +//! ATTRIBUTION.md (author, source, licence). Icons are drawn in code and need no file. + +use std::path::Path; + +const ASSET_EXT: &[&str] = &["png", "jpg", "jpeg", "svg", "ico", "icns", "ttf", "otf", "woff", "woff2", "gif", "bmp", "webp", "wav", "mp3", "stl", "step", "stp", "obj"]; +const SKIP_DIRS: &[&str] = &["target", ".git", "plan", "dist"]; + +fn walk(dir: &Path, root: &Path, out: &mut Vec) { + let Ok(rd) = std::fs::read_dir(dir) else { return }; + for e in rd.flatten() { + let p = e.path(); + let name = e.file_name().to_string_lossy().to_string(); + if p.is_dir() { + if !SKIP_DIRS.contains(&name.as_str()) && !name.starts_with('.') { + walk(&p, root, out); + } + } else if let Some(ext) = p.extension().map(|x| x.to_string_lossy().to_ascii_lowercase()) + && ASSET_EXT.contains(&ext.as_str()) + && let Ok(rel) = p.strip_prefix(root) + { + out.push(rel.to_string_lossy().replace('\\', "/")); + } + } +} + +pub fn run(root: &Path) -> Result<(), String> { + let attribution = std::fs::read_to_string(root.join("ATTRIBUTION.md")).map_err(|e| format!("ATTRIBUTION.md: {e}"))?; + let mut files = Vec::new(); + walk(root, root, &mut files); + files.sort(); + let missing: Vec<&String> = files.iter().filter(|f| !attribution.contains(f.as_str())).collect(); + if missing.is_empty() { + println!("assets: {} asset file(s), all attributed", files.len()); + Ok(()) + } else { + Err(format!("assets missing from ATTRIBUTION.md:\n{}", missing.iter().map(|m| format!(" {m}")).collect::>().join("\n"))) + } +} diff --git a/xtask/src/layers.rs b/xtask/src/layers.rs new file mode 100644 index 00000000..7d1252d4 --- /dev/null +++ b/xtask/src/layers.rs @@ -0,0 +1,321 @@ +//! Dependency layering rules (plan/architecture.md §3). +//! +//! Adapted from CADCraft's xtask (MIT OR Apache-2.0), see ATTRIBUTION.md. +//! +//! The rule engine works on a small, metadata-independent model so it can be +//! unit-tested; `from_metadata` builds that model from `cargo metadata`. + +use serde_json::Value; + +/// Where a workspace crate sits. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Class { + /// Regular layered crate. + Layer(u8), + /// Layer 0, and additionally may depend on no workspace crate at all. + Standalone, + /// Test tooling: may depend on anything up to L5 (it sits at L6 for rule + /// purposes); other crates may use it only as a dev-dependency. + Testkit, + /// Binaries and build tooling: exempt from the rules. + Exempt, +} + +impl Class { + fn layer(self) -> Option { + match self { + Class::Layer(l) => Some(l), + Class::Standalone => Some(0), + Class::Testkit => Some(6), + Class::Exempt => None, + } + } +} + +/// The layering table. Names are package names without the `solvecraft-` +/// prefix. +pub const TABLE: &[(&str, Class)] = &[ + ("geom", Class::Layer(0)), + ("sketch", Class::Layer(1)), + ("kernel", Class::Layer(1)), + ("render", Class::Layer(1)), + ("doc", Class::Layer(2)), + ("io", Class::Layer(3)), + ("engine", Class::Layer(4)), + ("ui-egui", Class::Layer(5)), + ("testkit", Class::Testkit), + // apps and tooling + ("solvecraft", Class::Exempt), + ("cli", Class::Exempt), + ("xtask", Class::Exempt), +]; + +/// Explicit orderings *within* a layer (earlier may be used by later). +pub const INTRA_LAYER_ORDER: &[&[&str]] = &[]; + +fn intra_layer_allowed(from: &str, to: &str) -> bool { + let (from, to) = (short_name(from), short_name(to)); + INTRA_LAYER_ORDER.iter().any(|chain| match (chain.iter().position(|n| *n == from), chain.iter().position(|n| *n == to)) { + (Some(f), Some(t)) => t < f, + _ => false, + }) +} + +/// External crates that constitute a UI toolkit / windowing dependency. +/// Entries ending in `*` are prefixes. +pub const UI_CRATES: &[&str] = &["egui", "eframe", "egui-wgpu", "wgpu", "winit", "egui_kittest", "rfd", "bevy*"]; + +/// First layer allowed to use UI crates. +pub const UI_MIN_LAYER: u8 = 5; + +pub fn short_name(pkg: &str) -> &str { + pkg.strip_prefix("solvecraft-").unwrap_or(pkg) +} + +pub fn classify(pkg: &str) -> Option { + let s = short_name(pkg); + TABLE.iter().find(|(n, _)| *n == s).map(|(_, c)| *c) +} + +fn is_ui_crate(name: &str) -> bool { + UI_CRATES.iter().any(|p| match p.strip_suffix('*') { + Some(prefix) => name.starts_with(prefix), + None => name == *p, + }) +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DepKind { + Normal, + Dev, + Build, +} + +#[derive(Debug, Clone)] +pub struct Dep { + pub name: String, + pub kind: DepKind, + /// `true` if the dependency is a workspace member. + pub workspace: bool, +} + +#[derive(Debug, Clone)] +pub struct Crate { + pub name: String, + pub deps: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Violation { + Unregistered { krate: String }, + Upward { krate: String, dep: String, from: u8, to: u8, kind: DepKind }, + StandaloneHasWorkspaceDep { krate: String, dep: String }, + TestkitAsNormalDep { krate: String }, + UiBelowL5 { krate: String, dep: String, layer: u8 }, +} + +impl std::fmt::Display for Violation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Violation::Unregistered { krate } => { + write!(f, "{krate}: unknown workspace crate; register it in xtask/src/layers.rs TABLE (see plan/architecture.md §3)") + } + Violation::Upward { krate, dep, from, to, kind } => { + write!(f, "{krate} (L{from}) -> {dep} (L{to}) [{kind:?}]: may only depend on strictly lower layers") + } + Violation::StandaloneHasWorkspaceDep { krate, dep } => { + write!(f, "{krate}: standalone crate must not depend on workspace crate {dep}") + } + Violation::TestkitAsNormalDep { krate } => { + write!(f, "{krate}: solvecraft-testkit may only be a dev-dependency") + } + Violation::UiBelowL5 { krate, dep, layer } => { + write!(f, "{krate} (L{layer}) depends on UI crate `{dep}`; UI toolkits are only allowed in L5+") + } + } + } +} + +/// Check all rules. Returns violations sorted for stable output. +pub fn check(crates: &[Crate]) -> Vec { + let mut out = Vec::new(); + for c in crates { + let Some(class) = classify(&c.name) else { + out.push(Violation::Unregistered { krate: c.name.clone() }); + continue; + }; + if class == Class::Exempt { + continue; + } + let layer = class.layer().unwrap_or(0); + for d in &c.deps { + // Self dev-dependencies (e.g. to enable features in tests) are fine. + if d.name == c.name { + continue; + } + if d.workspace { + if class == Class::Standalone { + out.push(Violation::StandaloneHasWorkspaceDep { krate: c.name.clone(), dep: d.name.clone() }); + continue; + } + match classify(&d.name) { + // Unregistered deps are reported on their own entry. + None => {} + Some(Class::Testkit) => { + if d.kind != DepKind::Dev { + out.push(Violation::TestkitAsNormalDep { krate: c.name.clone() }); + } + } + Some(dc) => { + let to = dc.layer().unwrap_or(u8::MAX); + if to >= layer && !(to == layer && intra_layer_allowed(&c.name, &d.name)) { + out.push(Violation::Upward { + krate: c.name.clone(), + dep: d.name.clone(), + from: layer, + to: if to == u8::MAX { 7 } else { to }, + kind: d.kind, + }); + } + } + } + } else if layer < UI_MIN_LAYER && is_ui_crate(&d.name) { + out.push(Violation::UiBelowL5 { krate: c.name.clone(), dep: d.name.clone(), layer }); + } + } + } + out.sort_by_key(|v| v.to_string()); + out.dedup(); + out +} + +/// Build the model from `cargo metadata --format-version 1 --no-deps`. +pub fn from_metadata(meta: &Value) -> Result, String> { + let pkgs = meta["packages"].as_array().ok_or("metadata: no packages array")?; + let members: Vec<&str> = pkgs.iter().filter_map(|p| p["name"].as_str()).collect(); + let mut out = Vec::new(); + for p in pkgs { + let name = p["name"].as_str().ok_or("package without name")?.to_owned(); + let mut deps = Vec::new(); + for d in p["dependencies"].as_array().into_iter().flatten() { + let dname = d["name"].as_str().unwrap_or_default().to_owned(); + let kind = match d["kind"].as_str() { + Some("dev") => DepKind::Dev, + Some("build") => DepKind::Build, + _ => DepKind::Normal, + }; + let workspace = members.contains(&dname.as_str()) || d["path"].is_string(); + deps.push(Dep { name: dname, kind, workspace }); + } + out.push(Crate { name, deps }); + } + out.sort_by(|a, b| a.name.cmp(&b.name)); + Ok(out) +} + +pub fn describe(class: Option) -> String { + match class { + Some(Class::Layer(l)) => format!("L{l}"), + Some(Class::Standalone) => "L0 standalone".into(), + Some(Class::Testkit) => "testkit".into(), + Some(Class::Exempt) => "exempt".into(), + None => "UNREGISTERED".into(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn c(name: &str, deps: &[(&str, DepKind, bool)]) -> Crate { + Crate { name: name.into(), deps: deps.iter().map(|(n, k, w)| Dep { name: (*n).into(), kind: *k, workspace: *w }).collect() } + } + use DepKind::*; + + #[test] + fn clean_downward_graph_passes() { + let g = [ + c("solvecraft-geom", &[("kurbo", Normal, false)]), + c("solvecraft-doc", &[("solvecraft-geom", Normal, true)]), + c("solvecraft-engine", &[("solvecraft-doc", Normal, true), ("solvecraft-testkit", Dev, true)]), + c("solvecraft-ui-egui", &[("solvecraft-engine", Normal, true), ("egui", Normal, false)]), + c("solvecraft-cli", &[("solvecraft-ui-egui", Normal, true)]), + ]; + assert!(check(&g).is_empty(), "{:?}", check(&g)); + } + + #[test] + fn upward_dependency_flagged() { + let v = check(&[c("solvecraft-doc", &[("solvecraft-engine", Normal, true)])]); + assert!(matches!(v[..], [Violation::Upward { from: 2, to: 4, .. }])); + } + + #[test] + fn sideways_dependency_flagged() { + let v = check(&[c("solvecraft-kernel", &[("solvecraft-sketch", Normal, true)])]); + assert!(matches!(v[..], [Violation::Upward { from: 1, to: 1, .. }])); + } + + #[test] + fn self_dev_dependency_ignored() { + assert!(check(&[c("solvecraft-doc", &[("solvecraft-doc", Dev, true)])]).is_empty()); + } + + #[test] + fn upward_dev_dependency_flagged() { + let v = check(&[c("solvecraft-geom", &[("solvecraft-doc", Dev, true)])]); + assert!(matches!(v[..], [Violation::Upward { kind: Dev, .. }])); + } + + #[test] + fn ui_crates_below_l6_flagged() { + for dep in ["egui", "eframe", "winit", "egui_kittest", "rfd", "bevy_ecs", "bevy"] { + let v = check(&[c("solvecraft-engine", &[(dep, Normal, false)])]); + assert!(matches!(v[..], [Violation::UiBelowL5 { layer: 4, .. }]), "{dep}"); + } + assert!(check(&[c("solvecraft-engine", &[("egui_extras_not", Normal, false)])]).is_empty()); + assert!(check(&[c("solvecraft-ui-egui", &[("winit", Normal, false)])]).is_empty()); + } + + #[test] + fn unregistered_crate_is_error() { + let v = check(&[c("solvecraft-mystery", &[])]); + assert!(matches!(&v[..], [Violation::Unregistered { krate }] if krate == "solvecraft-mystery")); + assert!(v[0].to_string().contains("register")); + } + + #[test] + fn testkit_only_as_dev_dependency() { + let v = check(&[c("solvecraft-doc", &[("solvecraft-testkit", Normal, true)])]); + assert!(matches!(v[..], [Violation::TestkitAsNormalDep { .. }])); + assert!(check(&[c("solvecraft-doc", &[("solvecraft-testkit", Dev, true)])]).is_empty()); + assert!(check(&[c("solvecraft-testkit", &[("solvecraft-engine", Normal, true)])]).is_empty()); + } + + #[test] + fn apps_and_xtask_exempt() { + for app in ["solvecraft", "solvecraft-cli", "xtask"] { + assert!(check(&[c(app, &[("egui", Normal, false), ("solvecraft-ui-egui", Normal, true)])]).is_empty()); + } + } + + #[test] + fn metadata_parsing() { + let meta: Value = serde_json::from_str( + r#"{"packages":[ + {"name":"solvecraft-doc","dependencies":[ + {"name":"solvecraft-geom","kind":null,"path":"/x/crates/geom"}, + {"name":"serde","kind":null}, + {"name":"proptest","kind":"dev"}]}, + {"name":"solvecraft-geom","dependencies":[]} + ]}"#, + ) + .unwrap(); + let g = from_metadata(&meta).unwrap(); + assert_eq!(g.len(), 2); + let doc = g.iter().find(|c| c.name == "solvecraft-doc").unwrap(); + assert!(doc.deps[0].workspace && !doc.deps[1].workspace); + assert_eq!(doc.deps[2].kind, Dev); + assert!(check(&g).is_empty()); + } +} diff --git a/xtask/src/main.rs b/xtask/src/main.rs index f328e4d9..ef0f6929 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -1 +1,177 @@ -fn main() {} +//! Workspace tooling: `cargo xtask `. +//! +//! Pure Rust (std + serde_json). External tools (`cargo`) are invoked through +//! `std::process::Command`. + +mod assets; +mod layers; +mod parity; + +use std::path::{Path, PathBuf}; +use std::process::{Command, ExitCode}; + +const USAGE: &str = "\ +usage: cargo xtask + +commands: + layers enforce the crate dependency layering (plan/architecture.md §3) + assets check that every non-code asset file is attributed in ATTRIBUTION.md + parity [--refresh] + recompute Fusion command parity in docs/parity.md (--refresh rebuilds + xtask/data/fusion-catalog.tsv from plan/fusion/menu-tree.json) + oracle replay plan/fusion/oracle/*/recipe.json and compare with measure.json; + writes docs/oracle.md + ci fmt --check, clippy -D warnings, test, assets, layers (stops at first failure) +"; + +fn main() -> ExitCode { + let args: Vec = std::env::args().skip(1).collect(); + let rest: Vec<&str> = args.iter().skip(1).map(String::as_str).collect(); + let result = match args.first().map(String::as_str) { + Some("layers") => cmd_layers(), + Some("assets") => assets::run(&root()), + Some("parity") => parity::run(&root(), rest.contains(&"--refresh")), + Some("oracle") => cmd_oracle(), + Some("ci") => cmd_ci(), + Some("-h" | "--help" | "help") | None => { + print!("{USAGE}"); + Ok(()) + } + Some(other) => Err(format!("unknown command `{other}`\n\n{USAGE}")), + }; + match result { + Ok(()) => ExitCode::SUCCESS, + Err(e) => { + eprintln!("error: {e}"); + ExitCode::FAILURE + } + } +} + +/// Workspace root (parent of the xtask crate). +pub fn root() -> PathBuf { + let here = Path::new(env!("CARGO_MANIFEST_DIR")); + here.parent().unwrap_or(here).to_path_buf() +} + +pub fn cargo() -> Command { + let mut c = Command::new(std::env::var("CARGO").unwrap_or_else(|_| "cargo".into())); + c.current_dir(root()); + c +} + +fn run(mut cmd: Command, what: &str) -> Result<(), String> { + eprintln!("$ {what}"); + let status = cmd.status().map_err(|e| format!("{what}: failed to spawn: {e}"))?; + if status.success() { Ok(()) } else { Err(format!("{what}: exited with {status}")) } +} + +pub fn metadata() -> Result { + let out = cargo().args(["metadata", "--format-version", "1", "--no-deps"]).output().map_err(|e| format!("cargo metadata: {e}"))?; + if !out.status.success() { + return Err(format!("cargo metadata failed:\n{}", String::from_utf8_lossy(&out.stderr))); + } + serde_json::from_slice(&out.stdout).map_err(|e| format!("cargo metadata: bad JSON: {e}")) +} + +fn cmd_layers() -> Result<(), String> { + let crates = layers::from_metadata(&metadata()?)?; + println!("Dependency layering (plan/architecture.md §3)\n"); + println!("{:<28} {:<14} workspace deps", "crate", "layer"); + for c in &crates { + let ws: Vec = c + .deps + .iter() + .filter(|d| d.workspace) + .map(|d| { + let k = match d.kind { + layers::DepKind::Normal => "", + layers::DepKind::Dev => " (dev)", + layers::DepKind::Build => " (build)", + }; + format!("{}{k}", layers::short_name(&d.name)) + }) + .collect(); + println!("{:<28} {:<14} {}", c.name, layers::describe(layers::classify(&c.name)), ws.join(", ")); + } + let violations = layers::check(&crates); + println!(); + if violations.is_empty() { + println!("OK: {} crates, no layering violations.", crates.len()); + Ok(()) + } else { + println!("{} violation(s):", violations.len()); + for v in &violations { + println!(" - {v}"); + } + Err(format!("{} layering violation(s)", violations.len())) + } +} + +/// Run the CLI's oracle replay over every case directory and write docs/oracle.md. +fn cmd_oracle() -> Result<(), String> { + let dir = root().join("plan/fusion/oracle"); + let mut cases: Vec = std::fs::read_dir(&dir) + .map_err(|e| format!("{}: {e} (the oracle data is local, in plan/fusion/oracle)", dir.display()))? + .flatten() + .map(|e| e.path()) + .filter(|p| p.join("recipe.json").is_file() && p.join("measure.json").is_file()) + .collect(); + cases.sort(); + if cases.is_empty() { + return Err("no oracle cases with recipe.json and measure.json".into()); + } + let mut cmd = cargo(); + cmd.args(["run", "-q", "--release", "-p", "solvecraft-cli", "--", "oracle", "--json"]); + for c in &cases { + cmd.arg(c); + } + let out = cmd.output().map_err(|e| format!("solvecraft-cli: {e}"))?; + let results: serde_json::Value = serde_json::from_slice(&out.stdout).map_err(|e| format!("oracle JSON: {e}\n{}", String::from_utf8_lossy(&out.stderr)))?; + let list = results.as_array().cloned().unwrap_or_default(); + let pass = list.iter().filter(|r| r["pass"].as_bool().unwrap_or(false)).count(); + let skipped = list.iter().filter(|r| r["skipped"].as_bool().unwrap_or(false)).count(); + let mut md = format!( + "# Fusion oracle\n\nGenerated by `cargo xtask oracle`. Each case is a part built in Fusion (recipe and measurements kept locally in `plan/fusion/oracle/`, not committed). SolveCraft replays the recipe through its command engine and compares body count, volume and area (relative tolerance 1e-3) and face/edge/vertex counts (exact).\n\n**{pass} / {} cases pass** ({skipped} need features not implemented yet).\n\n| Case | Result | Notes |\n|---|---|---|\n", + list.len() + ); + for r in &list { + let status = if r["pass"].as_bool().unwrap_or(false) { + "pass" + } else if r["skipped"].as_bool().unwrap_or(false) { + "not yet" + } else { + "FAIL" + }; + let mut notes: Vec = r["checks"] + .as_array() + .into_iter() + .flatten() + .filter(|c| !c["ok"].as_bool().unwrap_or(false)) + .map(|c| format!("{}: got {} want {}", c["check"].as_str().unwrap_or(""), c["got"], c["want"])) + .collect(); + if let Some(e) = r["error"].as_str() { + notes.push(e.replace('|', "/")); + } + md += &format!("| {} | {status} | {} |\n", r["case"].as_str().unwrap_or(""), notes.join("; ")); + } + std::fs::write(root().join("docs/oracle.md"), md).map_err(|e| format!("docs/oracle.md: {e}"))?; + println!("oracle: {pass}/{} cases pass ({skipped} not yet supported) → docs/oracle.md", list.len()); + Ok(()) +} + +fn cmd_ci() -> Result<(), String> { + let mut c = cargo(); + c.args(["fmt", "--all", "--", "--check"]); + run(c, "cargo fmt --check")?; + let mut c = cargo(); + c.args(["clippy", "--workspace", "--all-targets", "--release", "--", "-D", "warnings"]); + run(c, "cargo clippy -D warnings")?; + let mut c = cargo(); + c.args(["test", "--workspace", "--release"]); + run(c, "cargo test")?; + assets::run(&root())?; + cmd_layers()?; + eprintln!("ci: all gates passed"); + Ok(()) +} diff --git a/xtask/src/parity.rs b/xtask/src/parity.rs new file mode 100644 index 00000000..55b529d0 --- /dev/null +++ b/xtask/src/parity.rs @@ -0,0 +1,173 @@ +//! `cargo xtask parity`: Fusion Design-workspace command parity. +//! +//! `xtask/data/fusion-catalog.tsv` lists the toolbar commands of Fusion's Design workspace as +//! `tab \t panel \t command id \t command name` (ids and names only, nothing else). It is +//! derived from the local, uncommitted `plan/fusion/menu-tree.json` with `--refresh`. A catalog +//! entry is live when SolveCraft registers a command with the same id. + +use std::path::Path; +use std::process::Command; + +use serde_json::Value; + +/// Design workspace tabs in the catalog (menu-tree tab id, display name). +const TABS: &[(&str, &str)] = &[ + ("SolidTab", "SOLID"), + ("SketchTab", "SKETCH"), + ("SurfaceTab", "SURFACE"), + ("ParaMeshOuterTab", "MESH"), + ("FormTab", "FORM"), + ("SheetMetalTab", "SHEET METAL"), + ("PlasticTab", "PLASTIC"), + ("AssemblyTab", "ASSEMBLY"), + ("ManageTab", "MANAGE"), + ("ToolsTab", "UTILITIES"), +]; + +/// The tabs the headline number counts (M0 scope). +const HEADLINE: &[&str] = &["SOLID", "SKETCH"]; + +#[derive(Clone, Debug)] +pub struct Entry { + pub tab: String, + pub panel: String, + pub id: String, + pub name: String, +} + +fn clean(s: &str) -> String { + s.replace(['\t', '\n', '\r'], " ").trim().to_string() +} + +fn walk(controls: &[Value], defs: &[Value], tab: &str, panel: &str, out: &mut Vec) { + for c in controls { + match c["type"].as_str() { + Some("CommandControl") => { + let id = c["command"]["id"].as_str().or(c["id"].as_str()).unwrap_or(""); + if id.is_empty() { + continue; + } + let name = c["command"]["name"] + .as_str() + .filter(|n| !n.is_empty()) + .or_else(|| defs.iter().find(|d| d["id"].as_str() == Some(id)).and_then(|d| d["name"].as_str())) + .unwrap_or(id); + if !out.iter().any(|e| e.tab == tab && e.id == id) { + out.push(Entry { tab: tab.into(), panel: panel.into(), id: clean(id), name: clean(name) }); + } + } + Some("DropDownControl") => walk(c["controls"].as_array().map(Vec::as_slice).unwrap_or(&[]), defs, tab, panel, out), + _ => {} + } + } +} + +/// Catalog entries from Fusion's menu-tree JSON. +pub fn from_menu_tree(v: &Value) -> Vec { + let defs = v["commandDefinitions"].as_array().map(Vec::as_slice).unwrap_or(&[]); + let mut out = Vec::new(); + for (tid, tname) in TABS { + let tab = &v["tabs"][format!("DesignProductType/{tid}")]; + for p in tab["panels"].as_array().into_iter().flatten() { + let panel = clean(p["name"].as_str().unwrap_or("")).to_uppercase(); + walk(p["controls"].as_array().map(Vec::as_slice).unwrap_or(&[]), defs, tname, &panel, &mut out); + } + } + out +} + +pub fn parse_catalog(s: &str) -> Vec { + s.lines() + .filter(|l| !l.starts_with('#') && !l.trim().is_empty()) + .filter_map(|l| { + let mut it = l.split('\t'); + Some(Entry { tab: it.next()?.into(), panel: it.next()?.into(), id: it.next()?.into(), name: it.next().unwrap_or("").into() }) + }) + .collect() +} + +pub fn run(root: &Path, refresh: bool) -> Result<(), String> { + let cat_path = root.join("xtask/data/fusion-catalog.tsv"); + if refresh { + let mt = root.join("plan/fusion/menu-tree.json"); + let s = std::fs::read_to_string(&mt).map_err(|e| format!("{}: {e}", mt.display()))?; + let v: Value = serde_json::from_str(&s).map_err(|e| format!("menu-tree.json: {e}"))?; + let entries = from_menu_tree(&v); + let mut out = String::from("# Fusion Design workspace toolbar: tab, panel, command id, command name (ids and names only).\n# Regenerate with `cargo xtask parity --refresh` (needs the local plan/fusion/menu-tree.json).\n"); + for e in &entries { + out += &format!("{}\t{}\t{}\t{}\n", e.tab, e.panel, e.id, e.name); + } + std::fs::create_dir_all(root.join("xtask/data")).map_err(|e| e.to_string())?; + std::fs::write(&cat_path, out).map_err(|e| format!("{}: {e}", cat_path.display()))?; + println!("parity: catalog refreshed with {} entries", entries.len()); + } + let catalog = parse_catalog(&std::fs::read_to_string(&cat_path).map_err(|e| format!("{}: {e}", cat_path.display()))?); + let out = Command::new(std::env::var("CARGO").unwrap_or_else(|_| "cargo".into())) + .current_dir(root) + .args(["run", "-q", "--release", "-p", "solvecraft-cli", "--", "commands"]) + .output() + .map_err(|e| format!("solvecraft-cli: {e}"))?; + let cmds: Value = serde_json::from_slice(&out.stdout).map_err(|e| format!("commands JSON: {e}"))?; + let ids: Vec = cmds.as_array().into_iter().flatten().filter_map(|c| c["id"].as_str().map(str::to_string)).collect(); + let live = |e: &Entry| ids.iter().any(|i| *i == e.id); + let pct = |a: usize, b: usize| if b == 0 { 0.0 } else { 100.0 * a as f64 / b as f64 }; + + let head: Vec<&Entry> = catalog.iter().filter(|e| HEADLINE.contains(&e.tab.as_str())).collect(); + let head_live = head.iter().filter(|e| live(e)).count(); + let all_live = catalog.iter().filter(|e| live(e)).count(); + let mut md = format!( + "# Fusion command parity\n\nGenerated by `cargo xtask parity` from `xtask/data/fusion-catalog.tsv` (the toolbar commands of Fusion's Design workspace, ids and names only) and the live command registry (`solvecraft-cli commands`). A command counts as live when SolveCraft registers the same command id. This measures breadth, not depth; see ROADMAP.md and docs/oracle.md for depth.\n\n**SOLID + SKETCH: {head_live} / {} commands live ({:.0}%).** All Design tabs: {all_live} / {} ({:.0}%). Registered commands: {}.\n\n| Tab | Panel | Live | Total | % |\n|---|---|---:|---:|---:|\n", + head.len(), + pct(head_live, head.len()), + catalog.len(), + pct(all_live, catalog.len()), + ids.len() + ); + let mut groups: Vec<(String, String, usize, usize)> = Vec::new(); + for e in &catalog { + let l = usize::from(live(e)); + match groups.iter_mut().find(|g| g.0 == e.tab && g.1 == e.panel) { + Some(g) => { + g.2 += l; + g.3 += 1; + } + None => groups.push((e.tab.clone(), e.panel.clone(), l, 1)), + } + } + for (t, p, l, n) in &groups { + md += &format!("| {t} | {p} | {l} | {n} | {:.0}% |\n", pct(*l, *n)); + } + md += "\n## Live (SOLID, SKETCH)\n\n"; + for e in head.iter().filter(|e| live(e)) { + md += &format!("- {} › {} › {} (`{}`)\n", e.tab, e.panel, e.name, e.id); + } + md += "\n## Not yet (SOLID, SKETCH)\n\n"; + for e in head.iter().filter(|e| !live(e)) { + md += &format!("- {} › {} › {} (`{}`)\n", e.tab, e.panel, e.name, e.id); + } + std::fs::write(root.join("docs/parity.md"), md).map_err(|e| format!("docs/parity.md: {e}"))?; + println!("parity: SOLID+SKETCH {head_live}/{} ({:.0}%), all tabs {all_live}/{} → docs/parity.md", head.len(), pct(head_live, head.len()), catalog.len()); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn catalog_from_menu_tree() { + let v: Value = serde_json::from_str( + r#"{"commandDefinitions":[{"id":"B","name":"Bee"}],"tabs":{"DesignProductType/SolidTab":{"panels":[{"name":"Create","controls":[ + {"type":"CommandControl","id":"A","command":{"id":"A","name":"Aye"}}, + {"type":"SeparatorControl","id":"s"}, + {"type":"DropDownControl","id":"d","controls":[{"type":"CommandControl","id":"B","command":{"id":"B"}}]}]}]}}}"#, + ) + .unwrap(); + let e = from_menu_tree(&v); + assert_eq!(e.len(), 2); + assert_eq!((e[0].tab.as_str(), e[0].panel.as_str(), e[0].id.as_str(), e[0].name.as_str()), ("SOLID", "CREATE", "A", "Aye")); + assert_eq!(e[1].name, "Bee"); + let tsv = "# c\nSOLID\tCREATE\tA\tAye\n"; + assert_eq!(parse_catalog(tsv).len(), 1); + } +}