From ddb48c2a49c8cd9c89979050f1a542ef3c7aa4f7 Mon Sep 17 00:00:00 2001
From: mhby1g21 <mhby1g21@soton.ac.uk>
Date: Tue, 29 Oct 2024 13:10:30 +0000
Subject: [PATCH] fixed mesh split and flip normal ttest

---
 scripts/debug_tool/tabs/edge_net_tab.py | 251 +++++++++++++++---------
 1 file changed, 153 insertions(+), 98 deletions(-)

diff --git a/scripts/debug_tool/tabs/edge_net_tab.py b/scripts/debug_tool/tabs/edge_net_tab.py
index 754b68f..fc2446e 100644
--- a/scripts/debug_tool/tabs/edge_net_tab.py
+++ b/scripts/debug_tool/tabs/edge_net_tab.py
@@ -16,6 +16,7 @@ class EdgeNetTab:
         self.config_reader = config_reader
         self.edge_net_dir = self.config_reader.directories['edgeNetDir']
         self.output_dir = self.config_reader.directories['outputDir']
+        self.script_dir = self.config_reader.directories['scriptDir']
         
         # Updated default input directory
         self.input_dir = os.path.join(self.edge_net_dir, "Data", "Input")
@@ -396,46 +397,6 @@ class EdgeNetTab:
         self.update_status("All required files present for infer360.py")
         return True
 
-    def verify_mesh_split_inputs(self):
-        """Verify input files for mesh splitting"""
-        obj_file = os.path.join(self.edge_net_dir, "Input", "input_prediction.obj")
-        mtl_file = os.path.join(self.edge_net_dir, "Input", "input_prediction.mtl")
-        
-        missing_files = []
-        if not os.path.exists(obj_file):
-            missing_files.append("input_prediction.obj")
-        if not os.path.exists(mtl_file):
-            missing_files.append("input_prediction.mtl")
-            
-        if missing_files:
-            self.update_status("Missing required files for mesh splitting:")
-            for file in missing_files:
-                self.update_status(f"- {file}")
-            return False
-            
-        self.update_status("All required files present for mesh splitting")
-        return True
-
-    def verify_blender_flip_inputs(self):
-        """Verify input files for Blender flip"""
-        obj_file = os.path.join(self.output_dir, "Input_prediction_mesh.obj")
-        mtl_file = os.path.join(self.output_dir, "Input_prediction_mesh.mtl")
-        
-        missing_files = []
-        if not os.path.exists(obj_file):
-            missing_files.append("Input_prediction_mesh.obj")
-        if not os.path.exists(mtl_file):
-            missing_files.append("Input_prediction_mesh.mtl")
-            
-        if missing_files:
-            self.update_status("Missing required files for Blender flip:")
-            for file in missing_files:
-                self.update_status(f"- {file}")
-            return False
-            
-        self.update_status("All required files present for Blender flip")
-        return True
-
     def run_edge_net(self):
         if self.is_processing:
             messagebox.showwarning("Warning", "A process is already running!")
@@ -510,6 +471,7 @@ class EdgeNetTab:
         
         finally:
             self.is_processing = False
+            self.update_depth_preview()
 
     def _process_complete(self, success, error_message=None):
         """Handle process completion in the main thread"""
@@ -547,6 +509,23 @@ class EdgeNetTab:
         self.status_text.see(tk.END)
         
     def run_mesh_split(self):
+        if self.is_processing:
+            messagebox.showwarning("Warning", "A process is already running!")
+            return
+            
+        # Start processing in a separate thread
+        thread = threading.Thread(target=self._run_mesh_split_thread)
+        thread.daemon = True
+        thread.start()
+        
+        # Start progress bar
+        self.progress_bar.start(10)
+        self.is_processing = True
+        self.cancel_button.config(state='normal')
+        self.monitor_output()
+
+    def _run_mesh_split_thread(self):
+        """Run mesh splitting in a separate thread"""
         try:
             # Verify input files first
             if not self.verify_mesh_split_inputs():
@@ -558,39 +537,66 @@ class EdgeNetTab:
             original_dir = os.getcwd()
             os.chdir(self.edge_net_dir)
             
-            cmd = f'call "{self.config_reader.config["condaDir"]}\\condabin\\activate.bat" {self.config_reader.config["materialEnv"]} && python "{self.edge_net_dir}\\replace.py"'
-            
-            process = subprocess.Popen(
-                cmd,
-                stdout=subprocess.PIPE,
-                stderr=subprocess.PIPE,
-                shell=True,
-                text=True
-            )
-            stdout, stderr = process.communicate()
-            
-            if process.returncode != 0:
-                raise Exception(f"Mesh splitting failed: {stderr}")
+            try:
+                # Construct and run command
+                cmd = (f'call "{self.config_reader.config["condaDir"]}\\Scripts\\activate.bat" '
+                      f'{self.config_reader.config["materialEnv"]} && '
+                      f'python replace.py')
                 
-            # Verify output files were created
-            output_obj = os.path.join(self.output_dir, "Input_prediction_mesh.obj")
-            output_mtl = os.path.join(self.output_dir, "Input_prediction_mesh.mtl")
-            
-            if not (os.path.exists(output_obj) and os.path.exists(output_mtl)):
-                raise Exception("Mesh splitting did not generate expected output files")
-            
-            self.update_status("Mesh splitting completed successfully")
-            self.split_status.config(text="✓ Complete", foreground="green")
+                self.update_status(f"Executing command:\n{cmd}")
+                
+                if self.run_process_with_output(cmd, "Mesh Splitting") != 0:
+                    raise Exception("Mesh splitting process failed")
+                
+                # Verify output files were created
+                output_obj = os.path.join(self.output_dir, "Input_prediction_mesh.obj")
+                
+                if not (os.path.exists(output_obj)):
+                    raise Exception("Mesh splitting did not generate expected output files")
+                
+                self.tab.after(0, self._split_complete, True)
+                
+            finally:
+                os.chdir(original_dir)
                 
         except Exception as e:
-            self.update_status(f"Error in mesh splitting: {str(e)}")
-            self.split_status.config(text="✗ Failed", foreground="red")
-            messagebox.showerror("Error", f"Mesh splitting failed: {str(e)}")
+            self.tab.after(0, self._split_complete, False, str(e))
+        
         finally:
-            if original_dir:
-                os.chdir(original_dir)
+            self.is_processing = False
+
+    def _split_complete(self, success, error_message=None):
+        """Handle mesh split completion in the main thread"""
+        self.progress_bar.stop()
+        self.cancel_button.config(state='disabled')
+        self.operation_label.config(text="")
+        
+        if success:
+            self.update_status("Mesh splitting completed successfully")
+            self.split_status.config(text="✓ Complete", foreground="green")
+        else:
+            self.update_status(f"Error in mesh splitting: {error_message}")
+            self.split_status.config(text="✗ Failed", foreground="red")
+            messagebox.showerror("Error", f"Mesh splitting failed: {error_message}")
 
     def run_blender_flip(self):
+        if self.is_processing:
+            messagebox.showwarning("Warning", "A process is already running!")
+            return
+            
+        # Start processing in a separate thread
+        thread = threading.Thread(target=self._run_blender_flip_thread)
+        thread.daemon = True
+        thread.start()
+        
+        # Start progress bar
+        self.progress_bar.start(10)
+        self.is_processing = True
+        self.cancel_button.config(state='normal')
+        self.monitor_output()
+
+    def _run_blender_flip_thread(self):
+        """Run blender flip in a separate thread"""
         try:
             # Verify input files first
             if not self.verify_blender_flip_inputs():
@@ -600,42 +606,91 @@ class EdgeNetTab:
             self.flip_status.config(text="Running...", foreground="orange")
             
             original_dir = os.getcwd()
-            os.chdir(self.edge_net_dir)
-            
-            cmd = (f'call "{self.config_reader.config["condaDir"]}\\condabin\\activate.bat" '
-                  f'{self.config_reader.config["unityEnv"]} && '
-                  f'python "{os.path.join(self.config_reader.directories["scriptDir"], "blenderFlip.py")}" '
-                  f'"{os.path.join(self.output_dir, "Input_prediction_mesh.obj")}"')
+            os.chdir(self.config_reader.directories['scriptDir'])
             
-            process = subprocess.Popen(
-                cmd,
-                stdout=subprocess.PIPE,
-                stderr=subprocess.PIPE,
-                shell=True,
-                text=True
-            )
-            stdout, stderr = process.communicate()
-            
-            if process.returncode != 0:
-                raise Exception(f"Blender flip failed: {stderr}")
+            try:
+                # Construct and run command
+                cmd = (f'call "{self.config_reader.config["condaDir"]}\\Scripts\\activate.bat" '
+                      f'{self.config_reader.config["unityEnv"]} && '
+                      f'python blenderFlip.py '
+                      f'"{os.path.join(self.output_dir, "Input_prediction_mesh.obj")}"')
                 
-            # Verify output files were created
-            output_obj = os.path.join(self.output_dir, "final_output_scene_mesh.obj")
-            output_mtl = os.path.join(self.output_dir, "final_output_scene_mesh.mtl")
-            
-            if not (os.path.exists(output_obj) and os.path.exists(output_mtl)):
-                raise Exception("Blender flip did not generate expected output files")
-            
-            self.update_status("Blender flip completed successfully")
-            self.flip_status.config(text="✓ Complete", foreground="green")
+                self.update_status(f"Executing command:\n{cmd}")
+                
+                if self.run_process_with_output(cmd, "Blender Flip") != 0:
+                    raise Exception("Blender flip process failed")
+                
+                # Verify output files were created
+                output_obj = os.path.join(self.output_dir, "final_output_scene_mesh.obj")
+                
+                if not (os.path.exists(output_obj)):
+                    raise Exception("Blender flip did not generate expected output files")
+                
+                self.tab.after(0, self._flip_complete, True)
+                
+            finally:
+                os.chdir(original_dir)
                 
         except Exception as e:
-            self.update_status(f"Error in Blender flip: {str(e)}")
-            self.flip_status.config(text="✗ Failed", foreground="red")
-            messagebox.showerror("Error", f"Blender flip failed: {str(e)}")
+            self.tab.after(0, self._flip_complete, False, str(e))
+        
         finally:
-            if original_dir:
-                os.chdir(original_dir)
+            self.is_processing = False
+
+    def _flip_complete(self, success, error_message=None):
+        """Handle blender flip completion in the main thread"""
+        self.progress_bar.stop()
+        self.cancel_button.config(state='disabled')
+        self.operation_label.config(text="")
+        
+        if success:
+            self.update_status("Blender flip completed successfully")
+            self.flip_status.config(text="✓ Complete", foreground="green")
+        else:
+            self.update_status(f"Error in Blender flip: {error_message}")
+            self.flip_status.config(text="✗ Failed", foreground="red")
+            messagebox.showerror("Error", f"Blender flip failed: {error_message}")
+
+    def verify_mesh_split_inputs(self):
+        """Verify input files for mesh splitting"""
+        required_files = {
+            'input_prediction.obj': os.path.join(self.output_dir, "Input_prediction.obj")
+        }
+        
+        missing_files = []
+        for name, path in required_files.items():
+            if not os.path.exists(path):
+                missing_files.append(f"{name} ({path})")
+                
+        if missing_files:
+            self.update_status("Missing required files for mesh splitting:")
+            for file in missing_files:
+                self.update_status(f"- {file}")
+            return False
+            
+        self.update_status("All required files present for mesh splitting")
+        return True
+
+    def verify_blender_flip_inputs(self):
+        """Verify input files for Blender flip"""
+        required_files = {
+            'Input_prediction_mesh.obj': os.path.join(self.output_dir, "Input_prediction_mesh.obj")
+        }
+        
+        missing_files = []
+        for name, path in required_files.items():
+            if not os.path.exists(path):
+                missing_files.append(f"{name} ({path})")
+                
+        if missing_files:
+            self.update_status("Missing required files for Blender flip:")
+            for file in missing_files:
+                self.update_status(f"- {file}")
+            return False
+            
+        self.update_status("All required files present for Blender flip")
+        return True
+    
     def run_all_steps(self):
         """Run all EdgeNet processing steps in sequence"""
         try:
-- 
GitLab