14def main(argv: list[str] |
None =
None) -> int:
19 argv: Command line arguments (defaults to sys.argv[1:])
22 Exit code (0 for success, non-zero for error)
24 parser = argparse.ArgumentParser(
26 description=
"Convert CSV thrust curve data to RASP .eng engine file format.",
27 formatter_class=argparse.RawDescriptionHelpFormatter,
31 python -m csv_to_eng --input curve.csv --output motor.eng
33 # With metadata overrides:
34 python -m csv_to_eng --input curve.csv --output motor.eng \\
35 --name "K1000" --diameter-mm 54 --length-mm 326 \\
36 --manufacturer "Acme Rocketry"
38 # Specify units explicitly:
39 python -m csv_to_eng --input curve.csv --output motor.eng \\
40 --thrust-units lbf --time-units ms
50 help=
"Input CSV file containing thrust curve data",
57 help=
"Output .eng file path",
61 metadata_group = parser.add_argument_group(
"Metadata Overrides")
62 metadata_group.add_argument(
66 help=
"Engine name (e.g., 'K1000')",
68 metadata_group.add_argument(
72 help=
"Engine diameter in millimeters",
74 metadata_group.add_argument(
78 help=
"Engine length in millimeters",
80 metadata_group.add_argument(
84 help=
"Propellant mass in kilograms",
86 metadata_group.add_argument(
90 help=
"Total loaded mass in kilograms",
92 metadata_group.add_argument(
96 help=
"Manufacturer name",
98 metadata_group.add_argument(
102 help=
"Delay charges (e.g., '6-10-14' or 'P' for plugged)",
106 units_group = parser.add_argument_group(
"Unit Specifications")
107 units_group.add_argument(
110 choices=[
"N",
"lbf"],
112 help=
"Thrust units in input CSV (default: auto-detect, fallback N)",
114 units_group.add_argument(
119 help=
"Time units in input CSV (default: auto-detect, fallback s)",
123 format_group = parser.add_argument_group(
"Format Options")
124 format_group.add_argument(
130 help=
"Output format (default: rasp)",
132 format_group.add_argument(
137 help=
"Decimal places for time values (default: 3)",
139 format_group.add_argument(
144 help=
"Decimal places for thrust values (default: 1)",
146 format_group.add_argument(
149 choices=[
"auto",
"none",
"row0_json"],
151 metavar=
"{auto,none,row0_json}",
152 help=
"Header detection mode (default: auto)",
155 args = parser.parse_args(argv)
158 if not args.input.exists():
159 print(f
"Error: Input file not found: {args.input}", file=sys.stderr)
166 eng_path=args.output,
168 diameter_mm=args.diameter_mm,
169 length_mm=args.length_mm,
171 prop_mass_kg=args.prop_mass_kg,
172 total_mass_kg=args.total_mass_kg,
173 manufacturer=args.manufacturer,
174 time_units=args.time_units,
175 thrust_units=args.thrust_units,
176 time_decimals=args.time_decimals,
177 thrust_decimals=args.thrust_decimals,
180 print(f
"Successfully converted: {args.input} -> {args.output}")
183 except FileNotFoundError
as e:
184 print(f
"Error: {e}", file=sys.stderr)
186 except ValueError
as e:
187 print(f
"Error: Invalid data - {e}", file=sys.stderr)
189 except Exception
as e:
190 print(f
"Error: Unexpected error - {e}", file=sys.stderr)