@@ -137,6 +137,7 @@ impl CurveFitApp {
137137 Ok ( FitWorkerMessage :: Stopped ) => {
138138 self . fit_in_progress = false ;
139139 self . reset_fit_timer ( ) ;
140+ self . clear_fit_export_state ( ) ;
140141 self . active_fit_points = None ;
141142 self . finalize_replay_after_fit_stopped ( ) ;
142143 if !self . discard_fit_worker_updates {
@@ -151,6 +152,10 @@ impl CurveFitApp {
151152 self . fit_in_progress = false ;
152153 let fit_points = self . active_fit_points . take ( ) ;
153154 if !self . discard_fit_worker_updates {
155+ let point_count = fit_points
156+ . as_ref ( )
157+ . map ( Points :: len)
158+ . unwrap_or ( self . residual_plot_points . len ( ) ) ;
154159 if let Some ( points) = fit_points. as_ref ( ) {
155160 self . update_parametric_result_metrics ( points, & result. params ) ;
156161 let metrics = calculate_iteration_metrics_with_quantization (
@@ -170,11 +175,13 @@ impl CurveFitApp {
170175 result. params . clone ( ) ,
171176 ) ;
172177 self . finalize_replay_after_fit_completion ( ) ;
173- self . fit_result = Some ( result) ;
174178 self . complete_fit_timer_successfully ( ) ;
179+ self . store_parametric_fit_export_record ( & result, point_count) ;
180+ self . fit_result = Some ( result) ;
175181 self . status = Some ( StatusMessage :: FitCompleted ) ;
176182 } else {
177183 self . reset_fit_timer ( ) ;
184+ self . clear_fit_export_state ( ) ;
178185 self . set_fit_stopped_status_if_fitting ( ) ;
179186 }
180187 keep_receiver = false ;
@@ -183,6 +190,7 @@ impl CurveFitApp {
183190 Ok ( FitWorkerMessage :: SplineFinished { result, metrics } ) => {
184191 self . fit_in_progress = false ;
185192 if !self . discard_fit_worker_updates {
193+ let point_count = result. residuals . len ( ) ;
186194 let knot_y = result. knots . iter ( ) . map ( |knot| knot[ 1 ] ) . collect :: < Vec < _ > > ( ) ;
187195 let spline_plot_curve =
188196 Self :: plot_points_from_pairs ( result. curve . iter ( ) . copied ( ) ) ;
@@ -194,11 +202,13 @@ impl CurveFitApp {
194202 ) ;
195203 self . upsert_spline_replay_frame ( result. iterations , spline_plot_curve) ;
196204 self . finalize_replay_after_fit_completion ( ) ;
197- self . spline_result = Some ( result) ;
198205 self . complete_fit_timer_successfully ( ) ;
206+ self . store_spline_fit_export_record ( & result, point_count) ;
207+ self . spline_result = Some ( result) ;
199208 self . status = Some ( StatusMessage :: FitCompleted ) ;
200209 } else {
201210 self . reset_fit_timer ( ) ;
211+ self . clear_fit_export_state ( ) ;
202212 self . set_fit_stopped_status_if_fitting ( ) ;
203213 }
204214 self . active_fit_points = None ;
@@ -208,6 +218,7 @@ impl CurveFitApp {
208218 Ok ( FitWorkerMessage :: Failed ( error) ) => {
209219 self . fit_in_progress = false ;
210220 self . reset_fit_timer ( ) ;
221+ self . clear_fit_export_state ( ) ;
211222 self . active_fit_points = None ;
212223 if !self . discard_fit_worker_updates {
213224 self . status = Some ( StatusMessage :: Error ( error) ) ;
@@ -221,6 +232,7 @@ impl CurveFitApp {
221232 Err ( TryRecvError :: Disconnected ) => {
222233 self . fit_in_progress = false ;
223234 self . reset_fit_timer ( ) ;
235+ self . clear_fit_export_state ( ) ;
224236 self . active_fit_points = None ;
225237 if !self . discard_fit_worker_updates {
226238 self . status = Some ( StatusMessage :: Error (
@@ -323,6 +335,7 @@ impl CurveFitApp {
323335 Err ( error) => {
324336 self . fit_in_progress = false ;
325337 self . reset_fit_timer ( ) ;
338+ self . clear_fit_export_state ( ) ;
326339 self . status = Some ( StatusMessage :: Error ( error) ) ;
327340 self . active_fit_points = None ;
328341 break ;
@@ -354,13 +367,18 @@ impl CurveFitApp {
354367 Ok ( params) => params,
355368 Err ( error) => {
356369 self . reset_fit_timer ( ) ;
370+ self . clear_fit_export_state ( ) ;
357371 self . status = Some ( StatusMessage :: Error ( error) ) ;
358372 self . active_fit_points = None ;
359373 break ;
360374 }
361375 } ;
362376 }
363377 let fit_points = self . active_fit_points . take ( ) ;
378+ let point_count = fit_points
379+ . as_ref ( )
380+ . map ( Points :: len)
381+ . unwrap_or ( self . residual_plot_points . len ( ) ) ;
364382 if let Some ( points) = fit_points. as_ref ( ) {
365383 let ( mse, rmse) = calculate_metrics_with_quantization (
366384 points,
@@ -384,14 +402,16 @@ impl CurveFitApp {
384402 }
385403 self . upsert_parametric_replay_frame ( result. iterations , result. params . clone ( ) ) ;
386404 self . finalize_replay_after_fit_completion ( ) ;
387- self . fit_result = Some ( result) ;
388405 self . complete_fit_timer_successfully ( ) ;
406+ self . store_parametric_fit_export_record ( & result, point_count) ;
407+ self . fit_result = Some ( result) ;
389408 self . status = Some ( StatusMessage :: FitCompleted ) ;
390409 break ;
391410 }
392411 Ok ( IncrementalFitStep :: Cancelled ) => {
393412 self . fit_in_progress = false ;
394413 self . reset_fit_timer ( ) ;
414+ self . clear_fit_export_state ( ) ;
395415 self . finalize_replay_after_fit_stopped ( ) ;
396416 self . status = Some ( StatusMessage :: FitStopped ) ;
397417 self . active_fit_points = None ;
@@ -400,6 +420,7 @@ impl CurveFitApp {
400420 Err ( error) => {
401421 self . fit_in_progress = false ;
402422 self . reset_fit_timer ( ) ;
423+ self . clear_fit_export_state ( ) ;
403424 self . status = Some ( StatusMessage :: Error ( error. to_string ( ) ) ) ;
404425 self . active_fit_points = None ;
405426 break ;
@@ -426,6 +447,7 @@ impl CurveFitApp {
426447 }
427448 Ok ( IncrementalSplineFitStep :: Finished { result, metrics } ) => {
428449 self . fit_in_progress = false ;
450+ let point_count = result. residuals . len ( ) ;
429451 let knot_y = result. knots . iter ( ) . map ( |knot| knot[ 1 ] ) . collect :: < Vec < _ > > ( ) ;
430452 let spline_plot_curve =
431453 Self :: plot_points_from_pairs ( result. curve . iter ( ) . copied ( ) ) ;
@@ -434,15 +456,17 @@ impl CurveFitApp {
434456 . append_spline ( result. iterations , metrics, & knot_y) ;
435457 self . upsert_spline_replay_frame ( result. iterations , spline_plot_curve) ;
436458 self . finalize_replay_after_fit_completion ( ) ;
437- self . spline_result = Some ( result) ;
438459 self . complete_fit_timer_successfully ( ) ;
460+ self . store_spline_fit_export_record ( & result, point_count) ;
461+ self . spline_result = Some ( result) ;
439462 self . status = Some ( StatusMessage :: FitCompleted ) ;
440463 self . active_fit_points = None ;
441464 break ;
442465 }
443466 Ok ( IncrementalSplineFitStep :: Cancelled ) => {
444467 self . fit_in_progress = false ;
445468 self . reset_fit_timer ( ) ;
469+ self . clear_fit_export_state ( ) ;
446470 self . finalize_replay_after_fit_stopped ( ) ;
447471 self . status = Some ( StatusMessage :: FitStopped ) ;
448472 self . active_fit_points = None ;
@@ -451,6 +475,7 @@ impl CurveFitApp {
451475 Err ( error) => {
452476 self . fit_in_progress = false ;
453477 self . reset_fit_timer ( ) ;
478+ self . clear_fit_export_state ( ) ;
454479 self . status = Some ( StatusMessage :: Error ( error. to_string ( ) ) ) ;
455480 self . active_fit_points = None ;
456481 break ;
@@ -634,6 +659,7 @@ impl CurveFitApp {
634659 return ;
635660 }
636661
662+ self . fit_optimizer_method = self . optimizer_method ;
637663 self . last_right_panel_fit_snapshot = Some ( self . capture_right_panel_fit_snapshot ( ) ) ;
638664 self . auto_refit_pending_rerun = false ;
639665
0 commit comments