@@ -37,6 +37,7 @@ use std::time::Instant;
3737use cli:: {
3838 parse_args, print_help, print_version, CliArgs , ParseResult , SolverType ,
3939} ;
40+ use mmlogger:: Logger ;
4041use mmio:: bundle_writer:: { write_bundle_file, BundlePoint } ;
4142use mmio:: kuper_writer:: {
4243 extract_zxy_euler_angles, maya_pose_to_kuper, write_kuper_file,
@@ -115,7 +116,26 @@ fn run() -> Result<()> {
115116 }
116117 } ;
117118
118- run_camera_solve ( & args)
119+ #[ cfg( feature = "logging" ) ]
120+ {
121+ std:: fs:: create_dir_all ( & args. output_dir )
122+ . with_context ( || format ! ( "Failed to create output directory: {}" , args. output_dir) ) ?;
123+ let log_filename = match & args. prefix {
124+ Some ( prefix) => format ! ( "{}_solve.log" , prefix) ,
125+ None => "solve.log" . to_string ( ) ,
126+ } ;
127+ let log_path = format ! ( "{}/{}" , args. output_dir, log_filename) ;
128+ let file = std:: fs:: File :: create ( & log_path)
129+ . with_context ( || format ! ( "Failed to create log file: {}" , log_path) ) ?;
130+ let mut log = mmlogger:: TeeLogger :: new ( file, std:: io:: stderr ( ) ) ;
131+ run_camera_solve ( & args, & mut log)
132+ }
133+
134+ #[ cfg( not( feature = "logging" ) ) ]
135+ {
136+ let mut log = mmlogger:: NoOpLogger ;
137+ run_camera_solve ( & args, & mut log)
138+ }
119139}
120140
121141fn setup_thread_pool ( threads : Option < usize > ) -> Result < ( ) > {
@@ -233,7 +253,7 @@ impl IntermediateResultWriter for FileIntermediateResultWriter {
233253 }
234254}
235255
236- fn run_camera_solve ( args : & CliArgs ) -> Result < ( ) > {
256+ fn run_camera_solve < L : Logger > ( args : & CliArgs , logger : & mut L ) -> Result < ( ) > {
237257 let total_start = Instant :: now ( ) ;
238258
239259 // Load solver settings file if provided.
@@ -242,6 +262,7 @@ fn run_camera_solve(args: &CliArgs) -> Result<()> {
242262 if !args. quiet {
243263 println ! ( "Loading solver settings from: {}" , settings_path) ;
244264 }
265+ logger. log ( "INFO" , & format ! ( "Loading solver settings from: {}" , settings_path) ) ;
245266 let s = parse_mmsettings_file ( settings_path)
246267 . map_err ( |e| anyhow:: anyhow!( "{}" , e) ) ?;
247268 Some ( s)
@@ -284,6 +305,8 @@ fn run_camera_solve(args: &CliArgs) -> Result<()> {
284305 let ( file_info, mut markers) = parse_file ( & args. uv_file )
285306 . with_context ( || format ! ( "Failed to load UV file: {}" , args. uv_file) ) ?;
286307
308+ logger. log ( "INFO" , & format ! ( "Loaded {} markers from: {}" , markers. len( ) , args. uv_file) ) ;
309+
287310 if !args. quiet {
288311 println ! ( " Loaded {} markers" , markers. len( ) ) ;
289312 println ! ( " Format version: {:?}" , file_info. version) ;
@@ -534,6 +557,7 @@ fn run_camera_solve(args: &CliArgs) -> Result<()> {
534557 println ! ( ) ;
535558 println ! ( "Running camera solve..." ) ;
536559 }
560+ logger. log ( "INFO" , "Running camera solve..." ) ;
537561
538562 // Create intermediate result writer if enabled.
539563 let intermediate_writer: Option < Arc < dyn IntermediateResultWriter > > = if args
@@ -602,6 +626,14 @@ fn run_camera_solve(args: &CliArgs) -> Result<()> {
602626 None => camera_intrinsics,
603627 } ;
604628
629+ logger. log ( "INFO" , & format ! (
630+ "Solve completed in {:.2}s: {} cameras, {} bundles, mean_err={:.4}px" ,
631+ solve_duration. as_secs_f64( ) ,
632+ camera_poses. len( ) ,
633+ bundle_positions. len( ) ,
634+ quality_metrics. mean_reprojection_error,
635+ ) ) ;
636+
605637 if !args. quiet {
606638 println ! ( ) ;
607639 println ! ( "Solve completed!" ) ;
@@ -898,6 +930,8 @@ fn run_camera_solve(args: &CliArgs) -> Result<()> {
898930 println ! ( "Done!" ) ;
899931 }
900932
933+ logger. log ( "INFO" , & format ! ( "Total time: {:.2}s" , total_time_secs) ) ;
934+
901935 Ok ( ( ) )
902936}
903937
0 commit comments