@willcgage/module-schematic 0.68.0 → 0.70.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
@@ -447,6 +447,10 @@ interface ModuleFootprintInput {
447
447
  /** A balloon / return loop — the centre-line turns back on itself, so its far
448
448
  * end is the THROAT, not an endplate; only endplate A's face is emitted (#loop). */
449
449
  loop?: boolean;
450
+ /** Axial endplate configs (A first, then B), same as
451
+ * {@link ModuleGeometryInput.endplateConfigs}. `"none"` at B means the module
452
+ * presents no far endplate, so no face is emitted there (#184/#191). */
453
+ endplateConfigs?: ("single" | "double" | "none" | null | undefined)[];
450
454
  }
451
455
  interface OutlineFace {
452
456
  /** The endplate face's two corners + midpoint (the track point). */
@@ -673,6 +677,27 @@ declare function checkEndplateWidth(input: {
673
677
  config?: TrackConfig | "none" | null;
674
678
  trackOffsetInches?: number | null;
675
679
  }): EndplateWidthIssue[];
680
+ /**
681
+ * Whether a module presents NO far endplate — one conforming face only.
682
+ *
683
+ * ⭐ THE single definition. Three places had grown their own answer to this and
684
+ * drifted: `deriveEndplatePoses` (which knew about `dead_end` and `"none"`), the
685
+ * operations preview's end label, and `moduleFootprint`'s endplate faces — the
686
+ * last two using "is it a loop?" as a stand-in for "has it got two ends?", which
687
+ * was true until #184 and silently wrong after. Anything asking this must call
688
+ * THIS.
689
+ *
690
+ * Three ways to have one end, and they are genuinely different things: the
691
+ * geometry is a dead end; it's a balloon loop, whose far end is the throat and
692
+ * not a plate at all; or the owner said this end has no plate, which is how an
693
+ * *end of the line* or a *pocket* is authored — ordinary straight boards that
694
+ * simply stop, so no geometry type would ever say it for them.
695
+ */
696
+ declare function hasNoFarEndplate(input: {
697
+ geometryType?: string | null;
698
+ loop?: boolean;
699
+ endplateConfigs?: ("single" | "double" | "none" | null | undefined)[];
700
+ }): boolean;
676
701
  /**
677
702
  * Whether a doc is a balloon loop — **the authored flag, and only that**.
678
703
  *
@@ -1105,6 +1130,12 @@ interface ModuleFeatures {
1105
1130
  atFrac: number;
1106
1131
  doubleSide: "west" | "east";
1107
1132
  } | null;
1133
+ /** Whether the module presents a far endplate at all. False for an *end of
1134
+ * the line* or a *pocket*, which offer one conforming face and simply stop
1135
+ * (#184) — a renderer must not label that end, or it announces a plate the
1136
+ * module hasn't got and invites something to be coupled to it (#191). A loop
1137
+ * is separate: see {@link loop} and {@link loopInterchange}. */
1138
+ hasEndplateB: boolean;
1108
1139
  /** Lane extents across every feature (mains included; negative = outside
1109
1140
  * Main 1). Renderers size their vertical space from these. */
1110
1141
  laneMin: number;
@@ -1779,4 +1810,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
1779
1810
  heading: number;
1780
1811
  }>;
1781
1812
 
1782
- export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, type BenchworkPoint, type BranchConnector, CODE55_RAIL_HEIGHT_INCHES, type DimensionSource, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type FrogCasting, type GeometryType, type ImportedPart, 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 PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartSegment, RAIL_GAUGE_INCHES, type ReturnLoopGeometry, type ReturnLoopShape, 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 StoredTrackPart, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackPart, type TrackRole, type TurnoutClosure, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
1813
+ export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, type BenchworkPoint, type BranchConnector, CODE55_RAIL_HEIGHT_INCHES, type DimensionSource, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type FrogCasting, type GeometryType, type ImportedPart, 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 PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartSegment, RAIL_GAUGE_INCHES, type ReturnLoopGeometry, type ReturnLoopShape, 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 StoredTrackPart, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackPart, type TrackRole, type TurnoutClosure, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
package/dist/index.d.ts CHANGED
@@ -447,6 +447,10 @@ interface ModuleFootprintInput {
447
447
  /** A balloon / return loop — the centre-line turns back on itself, so its far
448
448
  * end is the THROAT, not an endplate; only endplate A's face is emitted (#loop). */
449
449
  loop?: boolean;
450
+ /** Axial endplate configs (A first, then B), same as
451
+ * {@link ModuleGeometryInput.endplateConfigs}. `"none"` at B means the module
452
+ * presents no far endplate, so no face is emitted there (#184/#191). */
453
+ endplateConfigs?: ("single" | "double" | "none" | null | undefined)[];
450
454
  }
451
455
  interface OutlineFace {
452
456
  /** The endplate face's two corners + midpoint (the track point). */
@@ -673,6 +677,27 @@ declare function checkEndplateWidth(input: {
673
677
  config?: TrackConfig | "none" | null;
674
678
  trackOffsetInches?: number | null;
675
679
  }): EndplateWidthIssue[];
680
+ /**
681
+ * Whether a module presents NO far endplate — one conforming face only.
682
+ *
683
+ * ⭐ THE single definition. Three places had grown their own answer to this and
684
+ * drifted: `deriveEndplatePoses` (which knew about `dead_end` and `"none"`), the
685
+ * operations preview's end label, and `moduleFootprint`'s endplate faces — the
686
+ * last two using "is it a loop?" as a stand-in for "has it got two ends?", which
687
+ * was true until #184 and silently wrong after. Anything asking this must call
688
+ * THIS.
689
+ *
690
+ * Three ways to have one end, and they are genuinely different things: the
691
+ * geometry is a dead end; it's a balloon loop, whose far end is the throat and
692
+ * not a plate at all; or the owner said this end has no plate, which is how an
693
+ * *end of the line* or a *pocket* is authored — ordinary straight boards that
694
+ * simply stop, so no geometry type would ever say it for them.
695
+ */
696
+ declare function hasNoFarEndplate(input: {
697
+ geometryType?: string | null;
698
+ loop?: boolean;
699
+ endplateConfigs?: ("single" | "double" | "none" | null | undefined)[];
700
+ }): boolean;
676
701
  /**
677
702
  * Whether a doc is a balloon loop — **the authored flag, and only that**.
678
703
  *
@@ -1105,6 +1130,12 @@ interface ModuleFeatures {
1105
1130
  atFrac: number;
1106
1131
  doubleSide: "west" | "east";
1107
1132
  } | null;
1133
+ /** Whether the module presents a far endplate at all. False for an *end of
1134
+ * the line* or a *pocket*, which offer one conforming face and simply stop
1135
+ * (#184) — a renderer must not label that end, or it announces a plate the
1136
+ * module hasn't got and invites something to be coupled to it (#191). A loop
1137
+ * is separate: see {@link loop} and {@link loopInterchange}. */
1138
+ hasEndplateB: boolean;
1108
1139
  /** Lane extents across every feature (mains included; negative = outside
1109
1140
  * Main 1). Renderers size their vertical space from these. */
1110
1141
  laneMin: number;
@@ -1779,4 +1810,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
1779
1810
  heading: number;
1780
1811
  }>;
1781
1812
 
1782
- export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, type BenchworkPoint, type BranchConnector, CODE55_RAIL_HEIGHT_INCHES, type DimensionSource, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type FrogCasting, type GeometryType, type ImportedPart, 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 PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartSegment, RAIL_GAUGE_INCHES, type ReturnLoopGeometry, type ReturnLoopShape, 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 StoredTrackPart, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackPart, type TrackRole, type TurnoutClosure, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
1813
+ export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, type BenchworkPoint, type BranchConnector, CODE55_RAIL_HEIGHT_INCHES, type DimensionSource, type DrawCrossing, type DrawCrossover, type DrawIndustry, type DrawSignal, type DrawTrack, type DrawTurnout, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, type EditorBranch, type EditorControlPoint, type EditorCpSignal, type EditorCrossing, type EditorIndustry, type EditorState, type EditorTrack, type EditorTurnout, type EndplateBConfig, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_TRACK_SPACING_INCHES, type FrogCasting, type GeometryType, type ImportedPart, 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 PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartSegment, RAIL_GAUGE_INCHES, type ReturnLoopGeometry, type ReturnLoopShape, 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 StoredTrackPart, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackPart, type TrackRole, type TurnoutClosure, type TurnoutKind, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
package/dist/index.js CHANGED
@@ -483,9 +483,10 @@ function moduleFootprint(input) {
483
483
  return {
484
484
  centerline,
485
485
  band: benchworkBand(centerline, widthA, widthB, offA, offB),
486
- // A loop's centre-line ends at the throat, not a far endplate — keep only
487
- // endplate A's face (the far face would be a spurious plate at the throat).
488
- endplateFaces: input.loop ? endplateFaceSegments(centerline, widthA, widthB, offA, offB).slice(0, 1) : endplateFaceSegments(centerline, widthA, widthB, offA, offB),
486
+ // Only emit a face where the module actually presents one. A loop's
487
+ // centre-line ends at the THROAT, and an end of the line / pocket simply
488
+ // stops a far face there is a plate the module hasn't got (#191).
489
+ endplateFaces: hasNoFarEndplate(input) ? endplateFaceSegments(centerline, widthA, widthB, offA, offB).slice(0, 1) : endplateFaceSegments(centerline, widthA, widthB, offA, offB),
489
490
  outline: sectionOutlines.length || !authored ? null : sampleBenchworkOutline(authored),
490
491
  // The donut hole, arc-sampled — only when there's a solid outline to punch it
491
492
  // out of (a sectioned module isn't a donut). Renderers cut it from `outline`.
@@ -531,6 +532,9 @@ function endplateWidthFor(widths, id) {
531
532
  const w = widths?.[id];
532
533
  return typeof w === "number" && w > 0 ? w : FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES;
533
534
  }
535
+ function hasNoFarEndplate(input) {
536
+ return input.geometryType === "dead_end" || input.loop === true || input.endplateConfigs?.[1] === "none";
537
+ }
534
538
  function isLoopDoc(doc) {
535
539
  return doc.loop === true;
536
540
  }
@@ -1868,6 +1872,7 @@ function moduleFeatures(doc) {
1868
1872
  crossings,
1869
1873
  crossovers,
1870
1874
  branchConnectors,
1875
+ hasEndplateB: doc.endplates.some((e) => e.id === "B"),
1871
1876
  industries,
1872
1877
  laneMin: Math.min(...allLanes),
1873
1878
  laneMax: Math.max(...allLanes)
@@ -1990,7 +1995,7 @@ function deriveEndplatePoses(geo) {
1990
1995
  trackOffsets: offsetsFor(cfg(0), half)
1991
1996
  })
1992
1997
  );
1993
- const noB = geo.geometryType === "dead_end" || geo.loop === true || geo.endplateConfigs?.[1] === "none";
1998
+ const noB = hasNoFarEndplate(geo);
1994
1999
  const end = sectionedEndPose({ sections: geo.sections });
1995
2000
  if (!noB && end) {
1996
2001
  poses.push(
@@ -2141,6 +2146,6 @@ function poseOverridesFromDoc(doc) {
2141
2146
  return out;
2142
2147
  }
2143
2148
 
2144
- export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, CODE55_RAIL_HEIGHT_INCHES, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, 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, RAIL_GAUGE_INCHES, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
2149
+ export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, CODE55_RAIL_HEIGHT_INCHES, ENDPLATE_FASCIA_CLEAR_INCHES, ENDPLATE_LEAD_INCHES, 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, RAIL_GAUGE_INCHES, TIE_HALF_LENGTH_INCHES, TURNOUT_LEAD_INCHES_PER_FROG, WHOLE_MODULE_SECTION_ID, asModuleSchematic, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTransition, carCapacity, checkEndplateWidth, deriveEndplatePoses, divergeSideForHand, docToState, emptyEditorState, endplateFaceSegments, endplateLead, endplateTrackOffsetFor, endplateTrackOffsetInches, endplateWidthInches, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, leadInchesForSize, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partOutlineAtFrog, pastFrogInchesForSize, pathLengthInches, poseNeedsManual, poseOverridesFromDoc, remapPos, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionedCenterline, sectionedEndPose, sliceCenterline, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutPartForSize };
2145
2150
  //# sourceMappingURL=index.js.map
2146
2151
  //# sourceMappingURL=index.js.map