@willcgage/module-schematic 0.97.1 → 0.101.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.cjs +409 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +220 -1
- package/dist/index.d.ts +220 -1
- package/dist/index.js +407 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -677,6 +677,12 @@ interface ModuleFootprintInput {
|
|
|
677
677
|
/** A balloon / return loop — the centre-line turns back on itself, so its far
|
|
678
678
|
* end is the THROAT, not an endplate; only endplate A's face is emitted (#loop). */
|
|
679
679
|
loop?: boolean;
|
|
680
|
+
/**
|
|
681
|
+
* The document already places track along a main (see {@link
|
|
682
|
+
* moduleCenterline}). Set from the doc's own `tracks`; without it a module
|
|
683
|
+
* whose track was authored before it had a geometry draws as a bare board.
|
|
684
|
+
*/
|
|
685
|
+
hasPlacedTrack?: boolean;
|
|
680
686
|
/** Axial endplate configs (A first, then B), same as
|
|
681
687
|
* {@link ModuleGeometryInput.endplateConfigs}. `"none"` at B means the module
|
|
682
688
|
* presents no far endplate, so no face is emitted there (#184/#191). */
|
|
@@ -2151,6 +2157,19 @@ interface PartExtent {
|
|
|
2151
2157
|
aheadOfPoints: number;
|
|
2152
2158
|
/** Frog → the far end. How much turnout there still is past the frog. */
|
|
2153
2159
|
pastFrog: number;
|
|
2160
|
+
/**
|
|
2161
|
+
* Frog → the NEAR end of the tie strip.
|
|
2162
|
+
*
|
|
2163
|
+
* ⭐⭐ **THIS IS THE ONE A BODY IS MEASURED BACK FROM.** A document's `pos` is
|
|
2164
|
+
* the FROG (Will, 2026-07-27), so a turnout occupies
|
|
2165
|
+
* `[pos − behindFrog, pos + pastFrog]`. Anchoring on the points instead put
|
|
2166
|
+
* every turnout body `lead` too far along — 3.59″ on an Atlas #7.
|
|
2167
|
+
*
|
|
2168
|
+
* ⚠️ Falls back to `behindPoints` when the frog was never measured: without a
|
|
2169
|
+
* frog reading there is nowhere to anchor, and the points is the only landmark
|
|
2170
|
+
* left. `pastFrog` degrades the same way, so the pair stays consistent.
|
|
2171
|
+
*/
|
|
2172
|
+
behindFrog: number;
|
|
2154
2173
|
}
|
|
2155
2174
|
/**
|
|
2156
2175
|
* A part's real extent, or **null when it hasn't been measured**.
|
|
@@ -2744,6 +2763,35 @@ declare function snapPiece(moving: TrackPiece, others: TrackPiece[], library?: T
|
|
|
2744
2763
|
* owner's curve to reach something is not a fit, it is a guess.
|
|
2745
2764
|
*/
|
|
2746
2765
|
declare function fitFlexBetween(piece: TrackPiece, others: TrackPiece[], library?: TrackPart[], withinInches?: number): TrackPiece | null;
|
|
2766
|
+
/** A run cut in two to let a piece in. */
|
|
2767
|
+
interface RunInsertion {
|
|
2768
|
+
/** The whole set: the host shortened, the new piece, and the remainder. */
|
|
2769
|
+
pieces: TrackPiece[];
|
|
2770
|
+
/** The run that was cut, and the piece that went into it. */
|
|
2771
|
+
hostId: string;
|
|
2772
|
+
insertedId: string;
|
|
2773
|
+
}
|
|
2774
|
+
/**
|
|
2775
|
+
* Drop a piece ONTO a run and cut the run to take it.
|
|
2776
|
+
*
|
|
2777
|
+
* ⭐ Will, 2026-07-27: *"When I drop a turnout on the track, it should cut the
|
|
2778
|
+
* track there and automatically snap to the new joints."* Snapping alone cannot
|
|
2779
|
+
* do this: the middle of a run has no open joint, so there is nothing to snap
|
|
2780
|
+
* TO — the joints have to be made by cutting, which is exactly what a builder
|
|
2781
|
+
* does with a razor saw.
|
|
2782
|
+
*
|
|
2783
|
+
* ⚠️ ONLY FLEX CAN BE CUT. A turnout or a sectional piece is a moulding: you
|
|
2784
|
+
* cannot saw one in half and have two of anything. Dropping onto one is refused
|
|
2785
|
+
* rather than fudged.
|
|
2786
|
+
*
|
|
2787
|
+
* ⚠️ AND THE PIECE HAS TO FIT. It consumes length along the run — a #7 is six
|
|
2788
|
+
* inches of it — so an insertion that would run off the end is refused instead
|
|
2789
|
+
* of silently producing a remainder of negative length.
|
|
2790
|
+
*/
|
|
2791
|
+
declare function insertIntoRun(pieces: TrackPiece[], fresh: TrackPiece, at: {
|
|
2792
|
+
x: number;
|
|
2793
|
+
y: number;
|
|
2794
|
+
}, library?: TrackPart[], withinInches?: number): RunInsertion | null;
|
|
2747
2795
|
/** A route the walk found: a continuous run of pieces a train can travel. */
|
|
2748
2796
|
interface GraphRoute {
|
|
2749
2797
|
id: string;
|
|
@@ -2893,6 +2941,177 @@ declare function deriveGraphDoc(doc: ModuleSchematicDoc, library?: TrackPart[]):
|
|
|
2893
2941
|
doc: ModuleSchematicDoc;
|
|
2894
2942
|
warnings: string[];
|
|
2895
2943
|
};
|
|
2944
|
+
/**
|
|
2945
|
+
* What a turnout in a 1-D document would become as a piece — or what it is
|
|
2946
|
+
* missing before it can become anything.
|
|
2947
|
+
*
|
|
2948
|
+
* ⭐⭐ **IDENTITY IS THE GATE, NOT GEOMETRY.** This is the thing that surprised
|
|
2949
|
+
* us and it is worth stating plainly: converting a drawn module to pieces is
|
|
2950
|
+
* blocked far more often by not knowing WHICH TURNOUT IT IS than by any missing
|
|
2951
|
+
* measurement. Across the production database not one turnout names a part, and
|
|
2952
|
+
* most state no frog number either — so for those there is nothing to look up.
|
|
2953
|
+
* No amount of measuring fixes that; only the owner knows what they laid, which
|
|
2954
|
+
* is exactly why conversion asks instead of guessing.
|
|
2955
|
+
*/
|
|
2956
|
+
interface TurnoutIdentity {
|
|
2957
|
+
/** The turnout's id in the document. */
|
|
2958
|
+
id: string;
|
|
2959
|
+
name?: string | null;
|
|
2960
|
+
pos: number;
|
|
2961
|
+
/** The frog number the document states, if any. */
|
|
2962
|
+
size?: number | null;
|
|
2963
|
+
/** A part the document already names — the strongest possible answer. */
|
|
2964
|
+
statedPartId?: string | null;
|
|
2965
|
+
/** The part this turnout converts to; null = the owner has to say. */
|
|
2966
|
+
partId: string | null;
|
|
2967
|
+
/** How `partId` was arrived at. */
|
|
2968
|
+
from: "named" | "frog-number" | "unresolved";
|
|
2969
|
+
/**
|
|
2970
|
+
* The weakest provenance behind the chosen part's geometry, so a caller can
|
|
2971
|
+
* tell a turnout placed from real readings from one placed off a catalogue
|
|
2972
|
+
* figure. Null when unresolved.
|
|
2973
|
+
*/
|
|
2974
|
+
source: DimensionSource | null;
|
|
2975
|
+
/** Why it cannot be resolved — null when it can. */
|
|
2976
|
+
why: string | null;
|
|
2977
|
+
/**
|
|
2978
|
+
* Parts the owner could reasonably pick, best first: an exact frog match
|
|
2979
|
+
* ahead of the rest. Only PLACEABLE parts are offered — listing one that
|
|
2980
|
+
* cannot be drawn would be an answer that does not answer.
|
|
2981
|
+
*/
|
|
2982
|
+
candidates: string[];
|
|
2983
|
+
}
|
|
2984
|
+
/** Something that stops a whole document converting, whatever the owner says. */
|
|
2985
|
+
interface ConversionBlocker {
|
|
2986
|
+
/** `crossing` · `curved-turnout` · `loop` — the shapes with no piece to be. */
|
|
2987
|
+
kind: string;
|
|
2988
|
+
/** The document object it came from, where there is one. */
|
|
2989
|
+
ref?: string;
|
|
2990
|
+
why: string;
|
|
2991
|
+
}
|
|
2992
|
+
/**
|
|
2993
|
+
* A track the document draws but nothing in it connects — no turnout diverges
|
|
2994
|
+
* onto it.
|
|
2995
|
+
*
|
|
2996
|
+
* ⚠️⚠️ **THE 1-D MODEL TOLERATES THIS AND THE GRAPH CANNOT.** A siding is drawn
|
|
2997
|
+
* from its `lane` and its `fromPos`/`toPos` alone, so a document can carry a
|
|
2998
|
+
* named, capacity-bearing yard track that joins nothing at all and still look
|
|
2999
|
+
* completely normal. Real ones do: Idaho Falls Grain Yard has five yard tracks
|
|
3000
|
+
* and not one turnout. A piece, by contrast, has to be joined to something.
|
|
3001
|
+
*
|
|
3002
|
+
* So these are surfaced rather than converted. Dropping them would lose an
|
|
3003
|
+
* owner's named track and its capacity silently, and inventing a turnout to
|
|
3004
|
+
* reach it would be exactly the fabrication ADR 0001 forbids — the owner is the
|
|
3005
|
+
* only one who knows where it actually joins.
|
|
3006
|
+
*/
|
|
3007
|
+
interface OrphanTrack {
|
|
3008
|
+
id: string;
|
|
3009
|
+
trackName?: string;
|
|
3010
|
+
role: TrackRole;
|
|
3011
|
+
why: string;
|
|
3012
|
+
}
|
|
3013
|
+
interface ModuleConversionReport {
|
|
3014
|
+
/** Already authored as pieces — there is nothing to convert. */
|
|
3015
|
+
alreadyGraph: boolean;
|
|
3016
|
+
/**
|
|
3017
|
+
* The rebuild can be offered. False when {@link blockers} is non-empty: those
|
|
3018
|
+
* are shapes no answer can supply, so offering would promise something that
|
|
3019
|
+
* cannot finish.
|
|
3020
|
+
*/
|
|
3021
|
+
offerable: boolean;
|
|
3022
|
+
/**
|
|
3023
|
+
* True when the rebuild could run right now with nothing asked.
|
|
3024
|
+
*
|
|
3025
|
+
* ⚠️ Requires BOTH that every turnout resolves and that no track is orphaned.
|
|
3026
|
+
* Checking only the turnouts claimed four production modules were ready when
|
|
3027
|
+
* converting them would have quietly dropped nine named tracks.
|
|
3028
|
+
*/
|
|
3029
|
+
readyWithoutAsking: boolean;
|
|
3030
|
+
turnouts: TurnoutIdentity[];
|
|
3031
|
+
/** Ids of the turnouts the owner must identify first. */
|
|
3032
|
+
unanswered: string[];
|
|
3033
|
+
orphanTracks: OrphanTrack[];
|
|
3034
|
+
blockers: ConversionBlocker[];
|
|
3035
|
+
}
|
|
3036
|
+
/**
|
|
3037
|
+
* What would happen if this document were rebuilt as pieces — WITHOUT rebuilding
|
|
3038
|
+
* anything.
|
|
3039
|
+
*
|
|
3040
|
+
* This exists so an owner can be shown the offer and its cost before they accept
|
|
3041
|
+
* it (ADR 0001 amendment, 2026-07-27: conversion is opt-in PER MODULE, never
|
|
3042
|
+
* silent). It is pure, cheap, reads no geometry, and is safe to run on every
|
|
3043
|
+
* module in a list.
|
|
3044
|
+
*
|
|
3045
|
+
* ⚠️ **A document with a graph is NOT re-reported.** It is already the thing
|
|
3046
|
+
* conversion produces.
|
|
3047
|
+
*/
|
|
3048
|
+
declare function moduleConversionReport(doc: ModuleSchematicDoc, library?: TrackPart[]): ModuleConversionReport;
|
|
3049
|
+
/**
|
|
3050
|
+
* What the owner said when offered the rebuild.
|
|
3051
|
+
*
|
|
3052
|
+
* ⭐ **ONE ANSWER FOR THE WHOLE MODULE.** Owners lay one kind of turnout
|
|
3053
|
+
* throughout, or at most two, so asking per turnout asks the same question eight
|
|
3054
|
+
* times on a yard. The module-wide answer IS the question; `overrides` is for the
|
|
3055
|
+
* odd one out. (Will's call, 2026-07-27 — it turns 41 questions across the
|
|
3056
|
+
* production database into 14.)
|
|
3057
|
+
*/
|
|
3058
|
+
interface ConversionAnswers {
|
|
3059
|
+
/** "The turnouts on this module are…" — a part id from the library. */
|
|
3060
|
+
turnoutPartId?: string | null;
|
|
3061
|
+
/** The exceptions, by turnout id. Beats {@link turnoutPartId}. */
|
|
3062
|
+
overrides?: Record<string, string>;
|
|
3063
|
+
}
|
|
3064
|
+
interface DocToGraphResult {
|
|
3065
|
+
/** The graph to store, or null when the document could not be converted. */
|
|
3066
|
+
graph: NonNullable<ModuleSchematicDoc["graph"]> | null;
|
|
3067
|
+
/** Why the whole conversion was refused — null when it ran. */
|
|
3068
|
+
refused: string | null;
|
|
3069
|
+
/**
|
|
3070
|
+
* Track the conversion could not lay, each with a reason.
|
|
3071
|
+
*
|
|
3072
|
+
* ⚠️ **A REAL LOSS, AND THE OWNER MUST SEE IT.** Unshown, a "successful"
|
|
3073
|
+
* rebuild would quietly be missing a named siding.
|
|
3074
|
+
*/
|
|
3075
|
+
notLaid: {
|
|
3076
|
+
id: string;
|
|
3077
|
+
why: string;
|
|
3078
|
+
}[];
|
|
3079
|
+
warnings: string[];
|
|
3080
|
+
}
|
|
3081
|
+
/**
|
|
3082
|
+
* Rebuild a 1-D document as a graph of placed pieces.
|
|
3083
|
+
*
|
|
3084
|
+
* ⭐ **THE OWNER ASKED FOR THIS ONE MODULE** (ADR 0001 amendment, 2026-07-27).
|
|
3085
|
+
* Nothing calls it on a schedule, on load, or in bulk. Conversion supplies
|
|
3086
|
+
* geometry the 1-D document never recorded, which is what the original
|
|
3087
|
+
* constraint forbade doing behind an owner's back; done in front of them, having
|
|
3088
|
+
* shown them {@link moduleConversionReport} and taken their answer, it is an
|
|
3089
|
+
* edit they made.
|
|
3090
|
+
*
|
|
3091
|
+
* ⚠️ **STRAIGHT HOSTS ONLY.** A run is laid along its host's axis, so a module
|
|
3092
|
+
* whose main is DRAWN with bends is refused rather than quietly straightened.
|
|
3093
|
+
* Every module in production today has a straight main; the refusal is there so
|
|
3094
|
+
* the first curved one is a message and not a flattened drawing.
|
|
3095
|
+
*
|
|
3096
|
+
* ⭐ **PIECES CHAIN FROM MEASURED JOINTS, NOT FROM ABSOLUTE ARITHMETIC.** Each
|
|
3097
|
+
* piece is placed, its real joints are read back with {@link placedJoints}, and
|
|
3098
|
+
* the next starts from one of those. Connection then holds BY CONSTRUCTION
|
|
3099
|
+
* rather than by two independent calculations agreeing to within
|
|
3100
|
+
* {@link JOINT_SNAP_INCHES} — a hundredth of an inch is far too tight to hit by
|
|
3101
|
+
* coincidence.
|
|
3102
|
+
*
|
|
3103
|
+
|
|
3104
|
+
* ⭐ A TURNOUT'S THROAT GOES AT `pos − frogOffset`: a document's `pos` is the
|
|
3105
|
+
* That is the inverse of what {@link walkTrackGraph} reports, which is the only
|
|
3106
|
+
* thing that makes convert-then-derive an identity. It is deliberately NOT
|
|
3107
|
+
* {@link turnoutOccupiedSpan}'s anchor, and the two disagree by
|
|
3108
|
+
* `lead − pointsOffset` — 2.97″ on an Atlas #7. That disagreement is real and
|
|
3109
|
+
* unresolved: see the note on {@link moduleConversionReport}. Because of it the
|
|
3110
|
+
* flex gaps here are measured off the placed pieces' OWN joints rather than
|
|
3111
|
+
* through the 1-D helper, so whichever anchor turns out to be right, the track
|
|
3112
|
+
* still meets the turnout it was cut for.
|
|
3113
|
+
*/
|
|
3114
|
+
declare function docToGraph(doc: ModuleSchematicDoc, answers?: ConversionAnswers, library?: TrackPart[]): DocToGraphResult;
|
|
2896
3115
|
/** A frog casting's parts, in TURNOUT-LOCAL inches: `x` = distance past the
|
|
2897
3116
|
* points, `y` = lateral offset from the through route. */
|
|
2898
3117
|
interface FrogCasting {
|
|
@@ -3174,4 +3393,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
|
|
|
3174
3393
|
heading: number;
|
|
3175
3394
|
}>;
|
|
3176
3395
|
|
|
3177
|
-
export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, BUMPER_DRAWN_INCHES, type BenchworkPoint, type BranchConnector, CLEARANCE_SPACING_INCHES, CODE55_RAIL_HEIGHT_INCHES, DEFAULT_FLEX_PART_ID, 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 EndplateEdge, type EndplateEdgePose, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FAST_TRACKS_N_ME55, FAST_TRACKS_N_ME55_CROSSOVERS, FLEX_TRACK_PARTS, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_MAIN_MIN_RADIUS_INCHES, FREEMO_REVERSE_CURVE_STRAIGHT_INCHES, FREEMO_TRACK_SPACING_INCHES, type FlexPiece, type FlexPieceEnd, type FrogCasting, GENERIC_END_OF_TRACK, type GeometryType, type GraphAnchor, type GraphConflict, type GraphConnection, type GraphDocInput, type GraphDocResult, type GraphRoute, type GraphTurnout, type GraphWalk, type ImportedPart, type IndustryLabelMode, type IndustrySpot, JOINT_SNAP_INCHES, type LanePinch, 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 OccupiedSpan, type OutlineFace, PINCH_EASE_INCHES, type PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartGeometry, type PartJoint, type PartJointRole, type PartSegment, type PieceSnap, type PlacedJoint, RAIL_GAUGE_INCHES, type ResolvedAnchor, type ReturnLoopGeometry, type ReturnLoopShape, type RouteSpan, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionEnd, type SectionEndAssessment, type SectionFootprint, type SectionJointAssessment, type SectionRelativePos, type SignalFacing, type SignalSide, type SpanOverhang, type StoredTrackPart, TIE_HALF_LENGTH_INCHES, TRACK_PART_KINDS, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackGraph, type TrackPart, type TrackPiece, type TrackRole, type TurnoutClosure, type TurnoutKind, type UsableCapacity, WHOLE_MODULE_SECTION_ID, asModuleSchematic, assessSectionEnd, assessSectionJoint, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTrackGraph, buildTransition, carCapacity, checkEndplateWidth, clearancePointPastFrogInches, crossoverPinches, deriveEndplatePoses, deriveGraphDoc, divergeSideForHand, docToState, emptyEditorState, endplateCentreOffsetInches, endplateEdgePose, endplateFaceSegments, endplateLead, endplateTrackOffsetInches, endplateWidthInches, fitFlexBetween, flexPartFor, flexParts, flexPieces, flexRunEnd, flexUsage, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, graphToDoc, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, laneOffsetAt, leadInchesForSize, maxFlexPieceInches, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partGeometry, partGeometryGap, partOutlineAtFrog, partsPlaceable, pastFrogInchesForSize, pathLengthInches, pieceHand, piecePartNumber, pieceRoutePaths, placedJoints, poseNeedsManual, poseOverridesFromDoc, remapPos, resizeFlexPiece, resolveGraphAnchor, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionalArcInches, sectionedCenterline, sectionedEndPose, sliceCenterline, snapPiece, spanOverhang, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutFacing, turnoutOccupiedSpan, turnoutPartForSize, usableCapacity, walkTrackGraph };
|
|
3396
|
+
export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, BUMPER_DRAWN_INCHES, type BenchworkPoint, type BranchConnector, CLEARANCE_SPACING_INCHES, CODE55_RAIL_HEIGHT_INCHES, type ConversionAnswers, type ConversionBlocker, DEFAULT_FLEX_PART_ID, type DimensionSource, type DocToGraphResult, 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 EndplateEdge, type EndplateEdgePose, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FAST_TRACKS_N_ME55, FAST_TRACKS_N_ME55_CROSSOVERS, FLEX_TRACK_PARTS, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_MAIN_MIN_RADIUS_INCHES, FREEMO_REVERSE_CURVE_STRAIGHT_INCHES, FREEMO_TRACK_SPACING_INCHES, type FlexPiece, type FlexPieceEnd, type FrogCasting, GENERIC_END_OF_TRACK, type GeometryType, type GraphAnchor, type GraphConflict, type GraphConnection, type GraphDocInput, type GraphDocResult, type GraphRoute, type GraphTurnout, type GraphWalk, type ImportedPart, type IndustryLabelMode, type IndustrySpot, JOINT_SNAP_INCHES, type LanePinch, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleConversionReport, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OccupiedSpan, type OrphanTrack, type OutlineFace, PINCH_EASE_INCHES, type PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartGeometry, type PartJoint, type PartJointRole, type PartSegment, type PieceSnap, type PlacedJoint, RAIL_GAUGE_INCHES, type ResolvedAnchor, type ReturnLoopGeometry, type ReturnLoopShape, type RouteSpan, type RunInsertion, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionEnd, type SectionEndAssessment, type SectionFootprint, type SectionJointAssessment, type SectionRelativePos, type SignalFacing, type SignalSide, type SpanOverhang, type StoredTrackPart, TIE_HALF_LENGTH_INCHES, TRACK_PART_KINDS, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackGraph, type TrackPart, type TrackPiece, type TrackRole, type TurnoutClosure, type TurnoutIdentity, type TurnoutKind, type UsableCapacity, WHOLE_MODULE_SECTION_ID, asModuleSchematic, assessSectionEnd, assessSectionJoint, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTrackGraph, buildTransition, carCapacity, checkEndplateWidth, clearancePointPastFrogInches, crossoverPinches, deriveEndplatePoses, deriveGraphDoc, divergeSideForHand, docToGraph, docToState, emptyEditorState, endplateCentreOffsetInches, endplateEdgePose, endplateFaceSegments, endplateLead, endplateTrackOffsetInches, endplateWidthInches, fitFlexBetween, flexPartFor, flexParts, flexPieces, flexRunEnd, flexUsage, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, graphToDoc, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, insertIntoRun, isLoopDoc, isTransitionTurnout, laneOffsetAt, leadInchesForSize, maxFlexPieceInches, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleConversionReport, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partGeometry, partGeometryGap, partOutlineAtFrog, partsPlaceable, pastFrogInchesForSize, pathLengthInches, pieceHand, piecePartNumber, pieceRoutePaths, placedJoints, poseNeedsManual, poseOverridesFromDoc, remapPos, resizeFlexPiece, resolveGraphAnchor, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionalArcInches, sectionedCenterline, sectionedEndPose, sliceCenterline, snapPiece, spanOverhang, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutFacing, turnoutOccupiedSpan, turnoutPartForSize, usableCapacity, walkTrackGraph };
|
package/dist/index.d.ts
CHANGED
|
@@ -677,6 +677,12 @@ interface ModuleFootprintInput {
|
|
|
677
677
|
/** A balloon / return loop — the centre-line turns back on itself, so its far
|
|
678
678
|
* end is the THROAT, not an endplate; only endplate A's face is emitted (#loop). */
|
|
679
679
|
loop?: boolean;
|
|
680
|
+
/**
|
|
681
|
+
* The document already places track along a main (see {@link
|
|
682
|
+
* moduleCenterline}). Set from the doc's own `tracks`; without it a module
|
|
683
|
+
* whose track was authored before it had a geometry draws as a bare board.
|
|
684
|
+
*/
|
|
685
|
+
hasPlacedTrack?: boolean;
|
|
680
686
|
/** Axial endplate configs (A first, then B), same as
|
|
681
687
|
* {@link ModuleGeometryInput.endplateConfigs}. `"none"` at B means the module
|
|
682
688
|
* presents no far endplate, so no face is emitted there (#184/#191). */
|
|
@@ -2151,6 +2157,19 @@ interface PartExtent {
|
|
|
2151
2157
|
aheadOfPoints: number;
|
|
2152
2158
|
/** Frog → the far end. How much turnout there still is past the frog. */
|
|
2153
2159
|
pastFrog: number;
|
|
2160
|
+
/**
|
|
2161
|
+
* Frog → the NEAR end of the tie strip.
|
|
2162
|
+
*
|
|
2163
|
+
* ⭐⭐ **THIS IS THE ONE A BODY IS MEASURED BACK FROM.** A document's `pos` is
|
|
2164
|
+
* the FROG (Will, 2026-07-27), so a turnout occupies
|
|
2165
|
+
* `[pos − behindFrog, pos + pastFrog]`. Anchoring on the points instead put
|
|
2166
|
+
* every turnout body `lead` too far along — 3.59″ on an Atlas #7.
|
|
2167
|
+
*
|
|
2168
|
+
* ⚠️ Falls back to `behindPoints` when the frog was never measured: without a
|
|
2169
|
+
* frog reading there is nowhere to anchor, and the points is the only landmark
|
|
2170
|
+
* left. `pastFrog` degrades the same way, so the pair stays consistent.
|
|
2171
|
+
*/
|
|
2172
|
+
behindFrog: number;
|
|
2154
2173
|
}
|
|
2155
2174
|
/**
|
|
2156
2175
|
* A part's real extent, or **null when it hasn't been measured**.
|
|
@@ -2744,6 +2763,35 @@ declare function snapPiece(moving: TrackPiece, others: TrackPiece[], library?: T
|
|
|
2744
2763
|
* owner's curve to reach something is not a fit, it is a guess.
|
|
2745
2764
|
*/
|
|
2746
2765
|
declare function fitFlexBetween(piece: TrackPiece, others: TrackPiece[], library?: TrackPart[], withinInches?: number): TrackPiece | null;
|
|
2766
|
+
/** A run cut in two to let a piece in. */
|
|
2767
|
+
interface RunInsertion {
|
|
2768
|
+
/** The whole set: the host shortened, the new piece, and the remainder. */
|
|
2769
|
+
pieces: TrackPiece[];
|
|
2770
|
+
/** The run that was cut, and the piece that went into it. */
|
|
2771
|
+
hostId: string;
|
|
2772
|
+
insertedId: string;
|
|
2773
|
+
}
|
|
2774
|
+
/**
|
|
2775
|
+
* Drop a piece ONTO a run and cut the run to take it.
|
|
2776
|
+
*
|
|
2777
|
+
* ⭐ Will, 2026-07-27: *"When I drop a turnout on the track, it should cut the
|
|
2778
|
+
* track there and automatically snap to the new joints."* Snapping alone cannot
|
|
2779
|
+
* do this: the middle of a run has no open joint, so there is nothing to snap
|
|
2780
|
+
* TO — the joints have to be made by cutting, which is exactly what a builder
|
|
2781
|
+
* does with a razor saw.
|
|
2782
|
+
*
|
|
2783
|
+
* ⚠️ ONLY FLEX CAN BE CUT. A turnout or a sectional piece is a moulding: you
|
|
2784
|
+
* cannot saw one in half and have two of anything. Dropping onto one is refused
|
|
2785
|
+
* rather than fudged.
|
|
2786
|
+
*
|
|
2787
|
+
* ⚠️ AND THE PIECE HAS TO FIT. It consumes length along the run — a #7 is six
|
|
2788
|
+
* inches of it — so an insertion that would run off the end is refused instead
|
|
2789
|
+
* of silently producing a remainder of negative length.
|
|
2790
|
+
*/
|
|
2791
|
+
declare function insertIntoRun(pieces: TrackPiece[], fresh: TrackPiece, at: {
|
|
2792
|
+
x: number;
|
|
2793
|
+
y: number;
|
|
2794
|
+
}, library?: TrackPart[], withinInches?: number): RunInsertion | null;
|
|
2747
2795
|
/** A route the walk found: a continuous run of pieces a train can travel. */
|
|
2748
2796
|
interface GraphRoute {
|
|
2749
2797
|
id: string;
|
|
@@ -2893,6 +2941,177 @@ declare function deriveGraphDoc(doc: ModuleSchematicDoc, library?: TrackPart[]):
|
|
|
2893
2941
|
doc: ModuleSchematicDoc;
|
|
2894
2942
|
warnings: string[];
|
|
2895
2943
|
};
|
|
2944
|
+
/**
|
|
2945
|
+
* What a turnout in a 1-D document would become as a piece — or what it is
|
|
2946
|
+
* missing before it can become anything.
|
|
2947
|
+
*
|
|
2948
|
+
* ⭐⭐ **IDENTITY IS THE GATE, NOT GEOMETRY.** This is the thing that surprised
|
|
2949
|
+
* us and it is worth stating plainly: converting a drawn module to pieces is
|
|
2950
|
+
* blocked far more often by not knowing WHICH TURNOUT IT IS than by any missing
|
|
2951
|
+
* measurement. Across the production database not one turnout names a part, and
|
|
2952
|
+
* most state no frog number either — so for those there is nothing to look up.
|
|
2953
|
+
* No amount of measuring fixes that; only the owner knows what they laid, which
|
|
2954
|
+
* is exactly why conversion asks instead of guessing.
|
|
2955
|
+
*/
|
|
2956
|
+
interface TurnoutIdentity {
|
|
2957
|
+
/** The turnout's id in the document. */
|
|
2958
|
+
id: string;
|
|
2959
|
+
name?: string | null;
|
|
2960
|
+
pos: number;
|
|
2961
|
+
/** The frog number the document states, if any. */
|
|
2962
|
+
size?: number | null;
|
|
2963
|
+
/** A part the document already names — the strongest possible answer. */
|
|
2964
|
+
statedPartId?: string | null;
|
|
2965
|
+
/** The part this turnout converts to; null = the owner has to say. */
|
|
2966
|
+
partId: string | null;
|
|
2967
|
+
/** How `partId` was arrived at. */
|
|
2968
|
+
from: "named" | "frog-number" | "unresolved";
|
|
2969
|
+
/**
|
|
2970
|
+
* The weakest provenance behind the chosen part's geometry, so a caller can
|
|
2971
|
+
* tell a turnout placed from real readings from one placed off a catalogue
|
|
2972
|
+
* figure. Null when unresolved.
|
|
2973
|
+
*/
|
|
2974
|
+
source: DimensionSource | null;
|
|
2975
|
+
/** Why it cannot be resolved — null when it can. */
|
|
2976
|
+
why: string | null;
|
|
2977
|
+
/**
|
|
2978
|
+
* Parts the owner could reasonably pick, best first: an exact frog match
|
|
2979
|
+
* ahead of the rest. Only PLACEABLE parts are offered — listing one that
|
|
2980
|
+
* cannot be drawn would be an answer that does not answer.
|
|
2981
|
+
*/
|
|
2982
|
+
candidates: string[];
|
|
2983
|
+
}
|
|
2984
|
+
/** Something that stops a whole document converting, whatever the owner says. */
|
|
2985
|
+
interface ConversionBlocker {
|
|
2986
|
+
/** `crossing` · `curved-turnout` · `loop` — the shapes with no piece to be. */
|
|
2987
|
+
kind: string;
|
|
2988
|
+
/** The document object it came from, where there is one. */
|
|
2989
|
+
ref?: string;
|
|
2990
|
+
why: string;
|
|
2991
|
+
}
|
|
2992
|
+
/**
|
|
2993
|
+
* A track the document draws but nothing in it connects — no turnout diverges
|
|
2994
|
+
* onto it.
|
|
2995
|
+
*
|
|
2996
|
+
* ⚠️⚠️ **THE 1-D MODEL TOLERATES THIS AND THE GRAPH CANNOT.** A siding is drawn
|
|
2997
|
+
* from its `lane` and its `fromPos`/`toPos` alone, so a document can carry a
|
|
2998
|
+
* named, capacity-bearing yard track that joins nothing at all and still look
|
|
2999
|
+
* completely normal. Real ones do: Idaho Falls Grain Yard has five yard tracks
|
|
3000
|
+
* and not one turnout. A piece, by contrast, has to be joined to something.
|
|
3001
|
+
*
|
|
3002
|
+
* So these are surfaced rather than converted. Dropping them would lose an
|
|
3003
|
+
* owner's named track and its capacity silently, and inventing a turnout to
|
|
3004
|
+
* reach it would be exactly the fabrication ADR 0001 forbids — the owner is the
|
|
3005
|
+
* only one who knows where it actually joins.
|
|
3006
|
+
*/
|
|
3007
|
+
interface OrphanTrack {
|
|
3008
|
+
id: string;
|
|
3009
|
+
trackName?: string;
|
|
3010
|
+
role: TrackRole;
|
|
3011
|
+
why: string;
|
|
3012
|
+
}
|
|
3013
|
+
interface ModuleConversionReport {
|
|
3014
|
+
/** Already authored as pieces — there is nothing to convert. */
|
|
3015
|
+
alreadyGraph: boolean;
|
|
3016
|
+
/**
|
|
3017
|
+
* The rebuild can be offered. False when {@link blockers} is non-empty: those
|
|
3018
|
+
* are shapes no answer can supply, so offering would promise something that
|
|
3019
|
+
* cannot finish.
|
|
3020
|
+
*/
|
|
3021
|
+
offerable: boolean;
|
|
3022
|
+
/**
|
|
3023
|
+
* True when the rebuild could run right now with nothing asked.
|
|
3024
|
+
*
|
|
3025
|
+
* ⚠️ Requires BOTH that every turnout resolves and that no track is orphaned.
|
|
3026
|
+
* Checking only the turnouts claimed four production modules were ready when
|
|
3027
|
+
* converting them would have quietly dropped nine named tracks.
|
|
3028
|
+
*/
|
|
3029
|
+
readyWithoutAsking: boolean;
|
|
3030
|
+
turnouts: TurnoutIdentity[];
|
|
3031
|
+
/** Ids of the turnouts the owner must identify first. */
|
|
3032
|
+
unanswered: string[];
|
|
3033
|
+
orphanTracks: OrphanTrack[];
|
|
3034
|
+
blockers: ConversionBlocker[];
|
|
3035
|
+
}
|
|
3036
|
+
/**
|
|
3037
|
+
* What would happen if this document were rebuilt as pieces — WITHOUT rebuilding
|
|
3038
|
+
* anything.
|
|
3039
|
+
*
|
|
3040
|
+
* This exists so an owner can be shown the offer and its cost before they accept
|
|
3041
|
+
* it (ADR 0001 amendment, 2026-07-27: conversion is opt-in PER MODULE, never
|
|
3042
|
+
* silent). It is pure, cheap, reads no geometry, and is safe to run on every
|
|
3043
|
+
* module in a list.
|
|
3044
|
+
*
|
|
3045
|
+
* ⚠️ **A document with a graph is NOT re-reported.** It is already the thing
|
|
3046
|
+
* conversion produces.
|
|
3047
|
+
*/
|
|
3048
|
+
declare function moduleConversionReport(doc: ModuleSchematicDoc, library?: TrackPart[]): ModuleConversionReport;
|
|
3049
|
+
/**
|
|
3050
|
+
* What the owner said when offered the rebuild.
|
|
3051
|
+
*
|
|
3052
|
+
* ⭐ **ONE ANSWER FOR THE WHOLE MODULE.** Owners lay one kind of turnout
|
|
3053
|
+
* throughout, or at most two, so asking per turnout asks the same question eight
|
|
3054
|
+
* times on a yard. The module-wide answer IS the question; `overrides` is for the
|
|
3055
|
+
* odd one out. (Will's call, 2026-07-27 — it turns 41 questions across the
|
|
3056
|
+
* production database into 14.)
|
|
3057
|
+
*/
|
|
3058
|
+
interface ConversionAnswers {
|
|
3059
|
+
/** "The turnouts on this module are…" — a part id from the library. */
|
|
3060
|
+
turnoutPartId?: string | null;
|
|
3061
|
+
/** The exceptions, by turnout id. Beats {@link turnoutPartId}. */
|
|
3062
|
+
overrides?: Record<string, string>;
|
|
3063
|
+
}
|
|
3064
|
+
interface DocToGraphResult {
|
|
3065
|
+
/** The graph to store, or null when the document could not be converted. */
|
|
3066
|
+
graph: NonNullable<ModuleSchematicDoc["graph"]> | null;
|
|
3067
|
+
/** Why the whole conversion was refused — null when it ran. */
|
|
3068
|
+
refused: string | null;
|
|
3069
|
+
/**
|
|
3070
|
+
* Track the conversion could not lay, each with a reason.
|
|
3071
|
+
*
|
|
3072
|
+
* ⚠️ **A REAL LOSS, AND THE OWNER MUST SEE IT.** Unshown, a "successful"
|
|
3073
|
+
* rebuild would quietly be missing a named siding.
|
|
3074
|
+
*/
|
|
3075
|
+
notLaid: {
|
|
3076
|
+
id: string;
|
|
3077
|
+
why: string;
|
|
3078
|
+
}[];
|
|
3079
|
+
warnings: string[];
|
|
3080
|
+
}
|
|
3081
|
+
/**
|
|
3082
|
+
* Rebuild a 1-D document as a graph of placed pieces.
|
|
3083
|
+
*
|
|
3084
|
+
* ⭐ **THE OWNER ASKED FOR THIS ONE MODULE** (ADR 0001 amendment, 2026-07-27).
|
|
3085
|
+
* Nothing calls it on a schedule, on load, or in bulk. Conversion supplies
|
|
3086
|
+
* geometry the 1-D document never recorded, which is what the original
|
|
3087
|
+
* constraint forbade doing behind an owner's back; done in front of them, having
|
|
3088
|
+
* shown them {@link moduleConversionReport} and taken their answer, it is an
|
|
3089
|
+
* edit they made.
|
|
3090
|
+
*
|
|
3091
|
+
* ⚠️ **STRAIGHT HOSTS ONLY.** A run is laid along its host's axis, so a module
|
|
3092
|
+
* whose main is DRAWN with bends is refused rather than quietly straightened.
|
|
3093
|
+
* Every module in production today has a straight main; the refusal is there so
|
|
3094
|
+
* the first curved one is a message and not a flattened drawing.
|
|
3095
|
+
*
|
|
3096
|
+
* ⭐ **PIECES CHAIN FROM MEASURED JOINTS, NOT FROM ABSOLUTE ARITHMETIC.** Each
|
|
3097
|
+
* piece is placed, its real joints are read back with {@link placedJoints}, and
|
|
3098
|
+
* the next starts from one of those. Connection then holds BY CONSTRUCTION
|
|
3099
|
+
* rather than by two independent calculations agreeing to within
|
|
3100
|
+
* {@link JOINT_SNAP_INCHES} — a hundredth of an inch is far too tight to hit by
|
|
3101
|
+
* coincidence.
|
|
3102
|
+
*
|
|
3103
|
+
|
|
3104
|
+
* ⭐ A TURNOUT'S THROAT GOES AT `pos − frogOffset`: a document's `pos` is the
|
|
3105
|
+
* That is the inverse of what {@link walkTrackGraph} reports, which is the only
|
|
3106
|
+
* thing that makes convert-then-derive an identity. It is deliberately NOT
|
|
3107
|
+
* {@link turnoutOccupiedSpan}'s anchor, and the two disagree by
|
|
3108
|
+
* `lead − pointsOffset` — 2.97″ on an Atlas #7. That disagreement is real and
|
|
3109
|
+
* unresolved: see the note on {@link moduleConversionReport}. Because of it the
|
|
3110
|
+
* flex gaps here are measured off the placed pieces' OWN joints rather than
|
|
3111
|
+
* through the 1-D helper, so whichever anchor turns out to be right, the track
|
|
3112
|
+
* still meets the turnout it was cut for.
|
|
3113
|
+
*/
|
|
3114
|
+
declare function docToGraph(doc: ModuleSchematicDoc, answers?: ConversionAnswers, library?: TrackPart[]): DocToGraphResult;
|
|
2896
3115
|
/** A frog casting's parts, in TURNOUT-LOCAL inches: `x` = distance past the
|
|
2897
3116
|
* points, `y` = lateral offset from the through route. */
|
|
2898
3117
|
interface FrogCasting {
|
|
@@ -3174,4 +3393,4 @@ declare function poseOverridesFromDoc(doc: ModuleSchematicDoc): Record<string, {
|
|
|
3174
3393
|
heading: number;
|
|
3175
3394
|
}>;
|
|
3176
3395
|
|
|
3177
|
-
export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, BUMPER_DRAWN_INCHES, type BenchworkPoint, type BranchConnector, CLEARANCE_SPACING_INCHES, CODE55_RAIL_HEIGHT_INCHES, DEFAULT_FLEX_PART_ID, 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 EndplateEdge, type EndplateEdgePose, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FAST_TRACKS_N_ME55, FAST_TRACKS_N_ME55_CROSSOVERS, FLEX_TRACK_PARTS, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_MAIN_MIN_RADIUS_INCHES, FREEMO_REVERSE_CURVE_STRAIGHT_INCHES, FREEMO_TRACK_SPACING_INCHES, type FlexPiece, type FlexPieceEnd, type FrogCasting, GENERIC_END_OF_TRACK, type GeometryType, type GraphAnchor, type GraphConflict, type GraphConnection, type GraphDocInput, type GraphDocResult, type GraphRoute, type GraphTurnout, type GraphWalk, type ImportedPart, type IndustryLabelMode, type IndustrySpot, JOINT_SNAP_INCHES, type LanePinch, 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 OccupiedSpan, type OutlineFace, PINCH_EASE_INCHES, type PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartGeometry, type PartJoint, type PartJointRole, type PartSegment, type PieceSnap, type PlacedJoint, RAIL_GAUGE_INCHES, type ResolvedAnchor, type ReturnLoopGeometry, type ReturnLoopShape, type RouteSpan, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionEnd, type SectionEndAssessment, type SectionFootprint, type SectionJointAssessment, type SectionRelativePos, type SignalFacing, type SignalSide, type SpanOverhang, type StoredTrackPart, TIE_HALF_LENGTH_INCHES, TRACK_PART_KINDS, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackGraph, type TrackPart, type TrackPiece, type TrackRole, type TurnoutClosure, type TurnoutKind, type UsableCapacity, WHOLE_MODULE_SECTION_ID, asModuleSchematic, assessSectionEnd, assessSectionJoint, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTrackGraph, buildTransition, carCapacity, checkEndplateWidth, clearancePointPastFrogInches, crossoverPinches, deriveEndplatePoses, deriveGraphDoc, divergeSideForHand, docToState, emptyEditorState, endplateCentreOffsetInches, endplateEdgePose, endplateFaceSegments, endplateLead, endplateTrackOffsetInches, endplateWidthInches, fitFlexBetween, flexPartFor, flexParts, flexPieces, flexRunEnd, flexUsage, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, graphToDoc, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, isLoopDoc, isTransitionTurnout, laneOffsetAt, leadInchesForSize, maxFlexPieceInches, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partGeometry, partGeometryGap, partOutlineAtFrog, partsPlaceable, pastFrogInchesForSize, pathLengthInches, pieceHand, piecePartNumber, pieceRoutePaths, placedJoints, poseNeedsManual, poseOverridesFromDoc, remapPos, resizeFlexPiece, resolveGraphAnchor, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionalArcInches, sectionedCenterline, sectionedEndPose, sliceCenterline, snapPiece, spanOverhang, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutFacing, turnoutOccupiedSpan, turnoutPartForSize, usableCapacity, walkTrackGraph };
|
|
3396
|
+
export { ATLAS_CODE55_N, BUILT_IN_TRACK_PARTS, BUMPER_DRAWN_INCHES, type BenchworkPoint, type BranchConnector, CLEARANCE_SPACING_INCHES, CODE55_RAIL_HEIGHT_INCHES, type ConversionAnswers, type ConversionBlocker, DEFAULT_FLEX_PART_ID, type DimensionSource, type DocToGraphResult, 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 EndplateEdge, type EndplateEdgePose, type EndplatePose, type EndplateTrackIssue, type EndplateWidthIssue, FAST_TRACKS_N_ME55, FAST_TRACKS_N_ME55_CROSSOVERS, FLEX_TRACK_PARTS, FREEMO_ENDPLATE_TRACK_FASCIA_CLEARANCE_INCHES, FREEMO_ENDPLATE_WIDTH_MIN_INCHES, FREEMO_ENDPLATE_WIDTH_RECOMMENDED_INCHES, FREEMO_MAIN_MIN_RADIUS_INCHES, FREEMO_REVERSE_CURVE_STRAIGHT_INCHES, FREEMO_TRACK_SPACING_INCHES, type FlexPiece, type FlexPieceEnd, type FrogCasting, GENERIC_END_OF_TRACK, type GeometryType, type GraphAnchor, type GraphConflict, type GraphConnection, type GraphDocInput, type GraphDocResult, type GraphRoute, type GraphTurnout, type GraphWalk, type ImportedPart, type IndustryLabelMode, type IndustrySpot, JOINT_SNAP_INCHES, type LanePinch, MAIN2_TRACK_ID, MAIN_TRACK_ID, type ModuleConversionReport, type ModuleFeatures, type ModuleFootprint, type ModuleFootprintInput, type ModuleGeometryInput, type ModuleSchematicDoc, type ModuleTrackRow, N_CAR_LENGTH_INCHES, N_SCALE_RATIO, type OccupiedSpan, type OrphanTrack, type OutlineFace, PINCH_EASE_INCHES, type PartAngle, type PartDimension, type PartEnd, type PartExtent, type PartGeometry, type PartJoint, type PartJointRole, type PartSegment, type PieceSnap, type PlacedJoint, RAIL_GAUGE_INCHES, type ResolvedAnchor, type ReturnLoopGeometry, type ReturnLoopShape, type RouteSpan, type RunInsertion, type SchematicBlock, type SchematicControlPoint, type SchematicCrossing, type SchematicEndplate, type SchematicEndplateTrack, type SchematicIndustry, type SchematicSection, type SchematicSignal, type SchematicTrack, type SchematicTurnout, type SectionAdjacency, type SectionEnd, type SectionEndAssessment, type SectionFootprint, type SectionJointAssessment, type SectionRelativePos, type SignalFacing, type SignalSide, type SpanOverhang, type StoredTrackPart, TIE_HALF_LENGTH_INCHES, TRACK_PART_KINDS, TURNOUT_LEAD_INCHES_PER_FROG, type TrackConfig, type TrackGraph, type TrackPart, type TrackPiece, type TrackRole, type TurnoutClosure, type TurnoutIdentity, type TurnoutKind, type UsableCapacity, WHOLE_MODULE_SECTION_ID, asModuleSchematic, assessSectionEnd, assessSectionJoint, benchworkBand, benchworkOutline, buildCrossover, buildPassingSiding, buildTrackGraph, buildTransition, carCapacity, checkEndplateWidth, clearancePointPastFrogInches, crossoverPinches, deriveEndplatePoses, deriveGraphDoc, divergeSideForHand, docToGraph, docToState, emptyEditorState, endplateCentreOffsetInches, endplateEdgePose, endplateFaceSegments, endplateLead, endplateTrackOffsetInches, endplateWidthInches, fitFlexBetween, flexPartFor, flexParts, flexPieces, flexRunEnd, flexUsage, frogCasting, frogNumberFromName, fromSectionRelative, geometryTurnDegrees, graphToDoc, hasNoFarEndplate, importedPartToTrackPart, inchesToScaleFeet, insertIntoRun, isLoopDoc, isTransitionTurnout, laneOffsetAt, leadInchesForSize, maxFlexPieceInches, mergeImportedParts, mergeStoredParts, moduleCenterline, moduleConversionReport, moduleFeatures, moduleFootprint, moduleLengthFromSections, moduleSections, nextId, parseXtpLibrary, partExtent, partExtentForSize, partGeometry, partGeometryGap, partOutlineAtFrog, partsPlaceable, pastFrogInchesForSize, pathLengthInches, pieceHand, piecePartNumber, pieceRoutePaths, placedJoints, poseNeedsManual, poseOverridesFromDoc, remapPos, resizeFlexPiece, resolveGraphAnchor, returnLoop, sampleBenchworkOutline, samplePartSegments, samplePath, scaleFeetToInches, sectionAdjacency, sectionBand, sectionBreaksFromSections, sectionComponents, sectionFootprints, sectionNeighbours, sectionSpans, sectionSpansOrWhole, sectionalArcInches, sectionedCenterline, sectionedEndPose, sliceCenterline, snapPiece, spanOverhang, stateToDoc, storedPartToTrackPart, toSectionRelative, trackMeetsEndplateIssues, trackPart, trackPath, turnoutClosure, turnoutFacing, turnoutOccupiedSpan, turnoutPartForSize, usableCapacity, walkTrackGraph };
|