@willcgage/module-schematic 0.37.0 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -263,17 +263,17 @@ interface ModuleSchematicDoc {
263
263
  * Absent = the module keeps using its own `outline` exactly as before; this
264
264
  * is purely additive and nothing migrates on read. */
265
265
  sections?: SchematicSection[];
266
- /** Which compass axis the module actually runs along. The dispatcher panel
267
- * always draws LEFT→RIGHT — that's what makes a layout of modules read as one
268
- * strip — but a module built north/south should still be labelled N and S.
269
- * Absent = east/west. */
270
- orientation?: ModuleOrientation;
271
266
  /** @deprecated pre-grouping flat signals; read for back-compat. */
272
267
  signals?: SchematicSignal[];
273
268
  /** Authored mainline centre-line (module-local inches, open path with arcs).
274
269
  * Present = the owner drew the real shape; absent = derive from geometry.
275
270
  * Physical view only — the operations view stays derived (#2d-track). */
276
271
  mainPath?: BenchworkPoint[] | null;
272
+ /** Authored centre-line for MAIN 2 on a double-track module (module-local
273
+ * inches, open path with arcs). Present = the owner bent Main 2 to its real
274
+ * shape; absent = derive it as a lane offset from Main 1. Physical view only
275
+ * (#131). */
276
+ main2Path?: BenchworkPoint[] | null;
277
277
  }
278
278
  /** A benchwork-outline vertex, module-local inches. The edge from this vertex
279
279
  * to the NEXT one is a straight line, unless `bulge` is set — then it's a
@@ -284,20 +284,12 @@ interface BenchworkPoint {
284
284
  y: number;
285
285
  bulge?: number;
286
286
  }
287
- /** The compass axis a module runs along. Endplate A is the first label,
288
- * endplate B the second, so A→B reads left→right in the dispatcher panel
289
- * whichever axis it is. */
290
- type ModuleOrientation = "east-west" | "north-south";
291
- /** The compass letters for a module's two ends, A first. */
292
- declare function endLabels(o: ModuleOrientation | null | undefined): {
293
- a: string;
294
- b: string;
295
- };
296
- /** …spelled out, for a caption like "derived, South → North". */
297
- declare function endLabelsLong(o: ModuleOrientation | null | undefined): {
298
- a: string;
299
- b: string;
300
- };
287
+ /** NB: a module has NO compass direction of its own, deliberately. It has ends
288
+ * A and B. Direction is a property of the LAYOUT the same board can be
289
+ * installed running either way round, or on either axis, so a compass label
290
+ * stored here could only ever contradict the layout that placed it. Railroads
291
+ * do the same thing with timetable direction: the railroad declares which way
292
+ * is "east", not any one piece of track. Free-Dispatcher owns direction. */
301
293
  /** One bench-work section of a module (#96 phase 2). */
302
294
  interface SectionFootprint {
303
295
  id: string;
@@ -790,14 +782,14 @@ interface EditorState {
790
782
  /** The module's sections as named objects, each optionally carrying its own
791
783
  * outline (#96 phase 2). Empty = fall back to `outline` + `sectionBreaks`. */
792
784
  sections: SchematicSection[];
793
- /** Compass axis the module runs along; the panel still draws left→right. */
794
- orientation: ModuleOrientation;
795
785
  controlPoints: EditorControlPoint[];
796
786
  /** Rail-served industries — car-spot spans on a track (#industries). */
797
787
  industries: EditorIndustry[];
798
788
  /** Authored mainline centre-line (module-local inches) — empty = derive from
799
789
  * geometry. The owner-drawn real shape (#2d-track, physical view only). */
800
790
  mainPath: BenchworkPoint[];
791
+ /** Authored Main 2 centre-line (double-track only) — empty = lane offset (#131). */
792
+ main2Path: BenchworkPoint[];
801
793
  }
802
794
  /** Build the empty editor state for a module of the given length. */
803
795
  declare function emptyEditorState(lengthInches: number): EditorState;
@@ -1083,4 +1075,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
1083
1075
  heading: number;
1084
1076
  }>;
1085
1077
 
1086
- export { type BenchworkPoint, type BranchConnector, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type GeometryType, type IndustryLabelMode, type IndustrySpot, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleOrientation, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OutlineFace, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionFootprint, type SectionRelativePos, type SignalFacing, type SignalSide, type TrackConfig, type TrackRole, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endLabels, endLabelsLong, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
1078
+ export { type BenchworkPoint, type BranchConnector, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type GeometryType, type IndustryLabelMode, type IndustrySpot, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OutlineFace, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionFootprint, type SectionRelativePos, type SignalFacing, type SignalSide, type TrackConfig, type TrackRole, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
package/dist/index.d.ts CHANGED
@@ -263,17 +263,17 @@ interface ModuleSchematicDoc {
263
263
  * Absent = the module keeps using its own `outline` exactly as before; this
264
264
  * is purely additive and nothing migrates on read. */
265
265
  sections?: SchematicSection[];
266
- /** Which compass axis the module actually runs along. The dispatcher panel
267
- * always draws LEFT→RIGHT — that's what makes a layout of modules read as one
268
- * strip — but a module built north/south should still be labelled N and S.
269
- * Absent = east/west. */
270
- orientation?: ModuleOrientation;
271
266
  /** @deprecated pre-grouping flat signals; read for back-compat. */
272
267
  signals?: SchematicSignal[];
273
268
  /** Authored mainline centre-line (module-local inches, open path with arcs).
274
269
  * Present = the owner drew the real shape; absent = derive from geometry.
275
270
  * Physical view only — the operations view stays derived (#2d-track). */
276
271
  mainPath?: BenchworkPoint[] | null;
272
+ /** Authored centre-line for MAIN 2 on a double-track module (module-local
273
+ * inches, open path with arcs). Present = the owner bent Main 2 to its real
274
+ * shape; absent = derive it as a lane offset from Main 1. Physical view only
275
+ * (#131). */
276
+ main2Path?: BenchworkPoint[] | null;
277
277
  }
278
278
  /** A benchwork-outline vertex, module-local inches. The edge from this vertex
279
279
  * to the NEXT one is a straight line, unless `bulge` is set — then it's a
@@ -284,20 +284,12 @@ interface BenchworkPoint {
284
284
  y: number;
285
285
  bulge?: number;
286
286
  }
287
- /** The compass axis a module runs along. Endplate A is the first label,
288
- * endplate B the second, so A→B reads left→right in the dispatcher panel
289
- * whichever axis it is. */
290
- type ModuleOrientation = "east-west" | "north-south";
291
- /** The compass letters for a module's two ends, A first. */
292
- declare function endLabels(o: ModuleOrientation | null | undefined): {
293
- a: string;
294
- b: string;
295
- };
296
- /** …spelled out, for a caption like "derived, South → North". */
297
- declare function endLabelsLong(o: ModuleOrientation | null | undefined): {
298
- a: string;
299
- b: string;
300
- };
287
+ /** NB: a module has NO compass direction of its own, deliberately. It has ends
288
+ * A and B. Direction is a property of the LAYOUT the same board can be
289
+ * installed running either way round, or on either axis, so a compass label
290
+ * stored here could only ever contradict the layout that placed it. Railroads
291
+ * do the same thing with timetable direction: the railroad declares which way
292
+ * is "east", not any one piece of track. Free-Dispatcher owns direction. */
301
293
  /** One bench-work section of a module (#96 phase 2). */
302
294
  interface SectionFootprint {
303
295
  id: string;
@@ -790,14 +782,14 @@ interface EditorState {
790
782
  /** The module's sections as named objects, each optionally carrying its own
791
783
  * outline (#96 phase 2). Empty = fall back to `outline` + `sectionBreaks`. */
792
784
  sections: SchematicSection[];
793
- /** Compass axis the module runs along; the panel still draws left→right. */
794
- orientation: ModuleOrientation;
795
785
  controlPoints: EditorControlPoint[];
796
786
  /** Rail-served industries — car-spot spans on a track (#industries). */
797
787
  industries: EditorIndustry[];
798
788
  /** Authored mainline centre-line (module-local inches) — empty = derive from
799
789
  * geometry. The owner-drawn real shape (#2d-track, physical view only). */
800
790
  mainPath: BenchworkPoint[];
791
+ /** Authored Main 2 centre-line (double-track only) — empty = lane offset (#131). */
792
+ main2Path: BenchworkPoint[];
801
793
  }
802
794
  /** Build the empty editor state for a module of the given length. */
803
795
  declare function emptyEditorState(lengthInches: number): EditorState;
@@ -1083,4 +1075,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
1083
1075
  heading: number;
1084
1076
  }>;
1085
1077
 
1086
- export { type BenchworkPoint, type BranchConnector, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type GeometryType, type IndustryLabelMode, type IndustrySpot, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleOrientation, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OutlineFace, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionFootprint, type SectionRelativePos, type SignalFacing, type SignalSide, type TrackConfig, type TrackRole, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endLabels, endLabelsLong, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
1078
+ export { type BenchworkPoint, type BranchConnector, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type GeometryType, type IndustryLabelMode, type IndustrySpot, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OutlineFace, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionFootprint, type SectionRelativePos, type SignalFacing, type SignalSide, type TrackConfig, type TrackRole, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
package/dist/index.js CHANGED
@@ -7,12 +7,6 @@ function endplateWidthInches(ep) {
7
7
  const w = ep?.widthInches;
8
8
  return typeof w === "number" && w > 0 ? w : FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES;
9
9
  }
10
- function endLabels(o) {
11
- return o === "north-south" ? { a: "S", b: "N" } : { a: "W", b: "E" };
12
- }
13
- function endLabelsLong(o) {
14
- return o === "north-south" ? { a: "South", b: "North" } : { a: "West", b: "East" };
15
- }
16
10
  function benchworkOutline(doc) {
17
11
  const pts = (doc?.outline ?? []).filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.y)).map((p) => ({
18
12
  x: p.x,
@@ -563,10 +557,10 @@ function emptyEditorState(lengthInches) {
563
557
  outline: [],
564
558
  sectionBreaks: [],
565
559
  sections: [],
566
- orientation: "east-west",
567
560
  controlPoints: [],
568
561
  industries: [],
569
- mainPath: []
562
+ mainPath: [],
563
+ main2Path: []
570
564
  };
571
565
  }
572
566
  function isTransitionTurnout(t) {
@@ -592,15 +586,17 @@ function main2Track(state) {
592
586
  const bothDouble = state.configA === "double" && state.configB === "double";
593
587
  const sws = state.turnouts.filter((t) => isTransitionTurnout(t) && t.divergeTrack === MAIN2_TRACK_ID).sort((a, b) => a.pos - b.pos);
594
588
  const lane = state.mainsSwapped ? 0 : 1;
589
+ const authored = state.main2Path.length >= 2 ? { path: state.main2Path } : {};
595
590
  if (bothDouble || !sws.length) {
596
- return { id: MAIN2_TRACK_ID, role: "main", lane, from: "A", to: "B" };
591
+ return { id: MAIN2_TRACK_ID, role: "main", lane, from: "A", to: "B", ...authored };
597
592
  }
598
593
  const track = (fromPos, toPos) => ({
599
594
  id: MAIN2_TRACK_ID,
600
595
  role: "main",
601
596
  lane,
602
597
  fromPos,
603
- toPos
598
+ toPos,
599
+ ...authored
604
600
  });
605
601
  if (state.configA === "double") return track(0, sws[0].pos);
606
602
  if (state.configB === "double") return track(sws[0].pos, state.lengthInches);
@@ -800,11 +796,9 @@ function stateToDoc(state, recordNumber) {
800
796
  // Sections as objects — emitted only once the owner has some, so a module
801
797
  // that never used them keeps exactly the doc it had before (#96 phase 2).
802
798
  ...state.sections.length ? { sections: moduleSections({ sections: state.sections }) } : {},
803
- // Emitted only when it isn't the east/west default, so existing docs are
804
- // byte-identical.
805
- ...state.orientation === "north-south" ? { orientation: state.orientation } : {},
806
799
  // Authored mainline path (module-local inches); only when it's a real path.
807
- ...state.mainPath.length >= 2 ? { mainPath: state.mainPath } : {}
800
+ ...state.mainPath.length >= 2 ? { mainPath: state.mainPath } : {},
801
+ ...state.main2Path.length >= 2 ? { main2Path: state.main2Path } : {}
808
802
  };
809
803
  }
810
804
  function docToState(doc, fallbackLength, moduleTracks = []) {
@@ -889,6 +883,8 @@ function docToState(doc, fallbackLength, moduleTracks = []) {
889
883
  ...Number.isFinite(p.bulge) && p.bulge ? { bulge: p.bulge } : {}
890
884
  }));
891
885
  const mainPath = trackPath(d.mainPath) ?? [];
886
+ const main2Track_ = (d.tracks ?? []).find((t) => t.id === MAIN2_TRACK_ID);
887
+ const main2Path = trackPath(d.main2Path ?? main2Track_?.path) ?? [];
892
888
  return {
893
889
  lengthInches: len,
894
890
  loop,
@@ -909,8 +905,8 @@ function docToState(doc, fallbackLength, moduleTracks = []) {
909
905
  outline,
910
906
  sectionBreaks: (d.sectionBreaks ?? []).filter((n) => Number.isFinite(n)).map((n) => sc(n)),
911
907
  sections: moduleSections(d),
912
- orientation: d.orientation === "north-south" ? "north-south" : "east-west",
913
908
  mainPath,
909
+ main2Path,
914
910
  crossings: (d.crossings ?? []).map((x) => ({
915
911
  id: x.id,
916
912
  name: x.name ?? "",
@@ -1424,6 +1420,6 @@ function poseOverridesFromDoc(doc) {
1424
1420
  return out;
1425
1421
  }
1426
1422
 
1427
- export { FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, MAIN2_TRACK_ID, MAIN_TRACK_ID, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endLabels, endLabelsLong, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
1423
+ export { FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, MAIN2_TRACK_ID, MAIN_TRACK_ID, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, fromSectionRelative, geometryTurnDegrees, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, poseNeedsManual, poseOverridesFromDoc, remapPos, sampleBenchworkOutline, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, toSectionRelative, trackPath };
1428
1424
  //# sourceMappingURL=index.js.map
1429
1425
  //# sourceMappingURL=index.js.map