1 // This is brl/bseg/betr/pro/processes/betr_set_event_trigger_data_process.cxx
2 //:
3 // \file
4 // \brief  A process for seting an event_trigger data to an event_trigger
5 //
6 
7 #include <iostream>
8 #include <fstream>
9 #include <string>
10 #include <bprb/bprb_func_process.h>
11 #ifdef _MSC_VER
12 #  include "vcl_msvc_warnings.h"
13 #endif
14 
15 #include <betr/betr_event_trigger.h>
16 #include "vpgl/vpgl_camera_double_sptr.h"
17 #include "vpgl/vpgl_camera.h"
18 #include "vpgl/vpgl_rational_camera.h"
19 #include "vpgl/vpgl_local_rational_camera.h"
20 
21 
22 namespace betr_set_event_trigger_partial_data_process_globals
23 {
24   constexpr unsigned n_inputs_ = 5;
25   constexpr unsigned n_outputs_ = 0;
26 }
27 
betr_set_event_trigger_partial_data_process_cons(bprb_func_process & pro)28 bool betr_set_event_trigger_partial_data_process_cons(bprb_func_process& pro)
29 {
30   using namespace betr_set_event_trigger_partial_data_process_globals;
31 
32   //process takes 5 inputs
33   std::vector<std::string> input_types_(n_inputs_);
34   input_types_[0] = "betr_event_trigger_sptr";// event_trigger
35   input_types_[1] = "vil_image_resource_sptr";// image
36   input_types_[2] = "vpgl_camera_double_sptr";// camera
37   input_types_[3] = "bool"; // is a reference object (or if false an event object)
38   input_types_[4] = "bool"; // keep reference data (false = clear reference data)
39 
40   // process has 0 outputs
41   std::vector<std::string> output_types_(n_outputs_);
42   return pro.set_input_types(input_types_) && pro.set_output_types(output_types_);
43 }
44 
betr_set_event_trigger_partial_data_process(bprb_func_process & pro)45 bool betr_set_event_trigger_partial_data_process(bprb_func_process& pro)
46 {
47   using namespace betr_set_event_trigger_partial_data_process_globals;
48 
49   // check number of inputs
50   if ( pro.n_inputs() < n_inputs_ ) {
51     std::cout << pro.name() << ": The input number should be " << n_inputs_<< std::endl;
52     return false;
53   }
54 
55   // get the inputs
56   // "cam" Assumed to be a global rational camera, projecting lon, lat, elv to (u,v)
57   unsigned i = 0;
58   betr_event_trigger_sptr event_trigger = pro.get_input<betr_event_trigger_sptr>(i++);
59   vil_image_resource_sptr imgr = pro.get_input<vil_image_resource_sptr>(i++);
60   vpgl_camera_double_sptr cam = pro.get_input<vpgl_camera_double_sptr>(i++);
61   bool is_reference = pro.get_input<bool>(i++);
62   bool keep_data = pro.get_input<bool>(i++);
63 
64   // check inputs
65   if(!event_trigger || !imgr || !cam)
66     return false;
67   if(!is_reference && keep_data) {
68     std::cout << "Cannot append event data to trigger" << std::endl;
69     return false;
70   }
71 
72   // convert the camera to local rational cameras using the origin of the event trigger
73   auto* rcam = dynamic_cast<vpgl_rational_camera<double>*>(cam.ptr());
74   if(!rcam)
75     return false;
76   vpgl_local_rational_camera<double>* lcam = new vpgl_local_rational_camera<double>(event_trigger->lvcs(),*rcam);
77   vpgl_camera_double_sptr cam_converted = dynamic_cast<vpgl_camera<double>*>(lcam);
78   if(!cam_converted)
79     return false;
80 
81   if (is_reference) {
82     event_trigger->set_ref_image(imgr,false,keep_data);
83     event_trigger->set_ref_camera(cam_converted,keep_data);
84   } else {
85     event_trigger->set_evt_image(imgr);
86     event_trigger->set_evt_camera(cam_converted);
87   }
88 
89   return true;
90 }
91