@@ -219,7 +219,7 @@ def clean_build_artifacts(self) -> None:
219219 With the current architecture, all build artifacts are contained within
220220 the build directory, so cleaning is simply removing that directory.
221221 """
222- print ("🧹 Cleaning build artifacts..." )
222+ print ("[CLEAN] Cleaning build artifacts..." )
223223
224224 # Remove the build directory - this contains all build artifacts
225225 if self .build_dir .exists ():
@@ -265,13 +265,13 @@ def resolve_plugin_selection(self) -> List[str]:
265265
266266 if result .warnings :
267267 for warning in result .warnings :
268- print (f"⚠️ Warning: { warning } " )
268+ print (f"[WARN] { warning } " )
269269
270270 if result .added_plugins :
271271 print (f"[OK] Added dependencies: { result .added_plugins } " )
272272
273273 if result .removed_plugins :
274- print (f"🚫 Removed incompatible plugins: { result .removed_plugins } " )
274+ print (f"[EXCLUDED] Removed incompatible plugins: { result .removed_plugins } " )
275275
276276 print (f"[OK] Final plugin selection: { result .final_plugins } " )
277277 return result .final_plugins
@@ -1027,7 +1027,7 @@ def _copy_visualizer_assets(self) -> None:
10271027 target_base_dir = self .output_dir .parent / 'plugins' / 'visualizer'
10281028
10291029 if not build_visualizer_dir .exists ():
1030- print (f"ℹ️ Visualizer assets directory not found: { build_visualizer_dir } (visualizer plugin may not be enabled)" )
1030+ print (f"[INFO] Visualizer assets directory not found: { build_visualizer_dir } (visualizer plugin may not be enabled)" )
10311031 return
10321032
10331033 total_files_copied = 0
@@ -1093,9 +1093,9 @@ def _copy_visualizer_assets(self) -> None:
10931093 print (f"[OK] Copied { font_count } font files" )
10941094
10951095 if total_files_copied > 0 :
1096- print (f"🎨 Successfully copied { total_files_copied } visualizer assets to { target_base_dir } " )
1096+ print (f"[OK] Successfully copied { total_files_copied } visualizer assets to { target_base_dir } " )
10971097 else :
1098- print (f"⚠️ No visualizer assets found to copy" )
1098+ print (f"[WARN] No visualizer assets found to copy" )
10991099
11001100 def _clean_duplicate_symbols (self , main_lib_path : Path , build_lib_dir : Path ) -> Dict [str , Any ]:
11011101 """
@@ -1399,18 +1399,19 @@ def _patch_zlib_cmake_for_windows(self) -> None:
13991399
14001400def get_default_plugins () -> List [str ]:
14011401 """
1402- Get the default set of plugins (only the 3 currently integrated plugins).
1402+ Get the default set of plugins (only the currently integrated plugins).
14031403
1404- Currently only 3 plugins are integrated into PyHelios:
1404+ Currently integrated plugins in PyHelios:
14051405 - visualizer: OpenGL-based 3D visualization
14061406 - weberpenntree: Procedural tree generation
14071407 - radiation: OptiX-accelerated ray tracing (GPU optional)
1408+ - energybalance: GPU-accelerated thermal modeling and energy balance
14081409
14091410 Returns:
14101411 List of default plugins
14111412 """
1412- # Only return the 3 plugins that are actually integrated into PyHelios
1413- integrated_plugins = ["visualizer" , "weberpenntree" , "radiation" ]
1413+ # Return the plugins that are actually integrated into PyHelios
1414+ integrated_plugins = ["visualizer" , "weberpenntree" , "radiation" , "energybalance" ]
14141415
14151416 # Filter by platform compatibility
14161417 default_plugins = []
@@ -1449,24 +1450,40 @@ def parse_plugin_selection(args) -> List[str]:
14491450 # 2. Apply exclusion flags
14501451 if args .nogpu :
14511452 # Remove GPU-dependent plugins
1453+ gpu_plugins = [p for p in selected_plugins
1454+ if PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).gpu_required ]
14521455 selected_plugins = [p for p in selected_plugins
14531456 if not PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).gpu_required ]
1457+ if gpu_plugins :
1458+ print (f"[EXCLUDED] GPU-dependent plugins excluded (--nogpu): { gpu_plugins } " )
14541459
14551460 if args .novis :
14561461 # Remove visualization plugins
1462+ vis_plugins = [p for p in selected_plugins
1463+ if any (dep in ["opengl" , "glfw" , "imgui" ]
1464+ for dep in PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).system_dependencies )]
14571465 selected_plugins = [p for p in selected_plugins
14581466 if not any (dep in ["opengl" , "glfw" , "imgui" ]
14591467 for dep in PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).system_dependencies )]
1468+ if vis_plugins :
1469+ print (f"[EXCLUDED] Visualization plugins excluded (--novis): { vis_plugins } " )
14601470
14611471 # 3. Apply additional exclusions
14621472 if args .exclude :
1473+ excluded_plugins = [p for p in selected_plugins if p in args .exclude ]
14631474 selected_plugins = [p for p in selected_plugins if p not in args .exclude ]
1475+ if excluded_plugins :
1476+ print (f"[EXCLUDED] Explicitly excluded plugins (--exclude): { excluded_plugins } " )
14641477
14651478
14661479 # 4. Check environment variables for additional exclusions
14671480 if os .environ .get ('PYHELIOS_EXCLUDE_GPU' , '' ).lower () in ['1' , 'true' , 'yes' ]:
1481+ env_gpu_plugins = [p for p in selected_plugins
1482+ if PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).gpu_required ]
14681483 selected_plugins = [p for p in selected_plugins
14691484 if not PLUGIN_METADATA .get (p , PluginMetadata ("" , "" , [], [], [], False , True , [], [])).gpu_required ]
1485+ if env_gpu_plugins :
1486+ print (f"[EXCLUDED] GPU-dependent plugins excluded (PYHELIOS_EXCLUDE_GPU): { env_gpu_plugins } " )
14701487
14711488 # 5. Return final plugin list
14721489 return selected_plugins
@@ -1657,7 +1674,7 @@ def main():
16571674 print (f"[ERROR] Invalid plugins: { validation ['invalid_plugins' ]} " )
16581675 print (f"Platform compatible: { validation ['platform_compatible' ]} " )
16591676 if validation ['platform_incompatible' ]:
1660- print (f"⚠️ Platform incompatible: { validation ['platform_incompatible' ]} " )
1677+ print (f"[WARN] Platform incompatible: { validation ['platform_incompatible' ]} " )
16611678
16621679 if validation ['system_dependencies' ]:
16631680 print ("\n System Dependencies:" )
@@ -1733,7 +1750,7 @@ def main():
17331750 # PyHelios automatically discovers libraries in the build directory
17341751
17351752 except Exception as e :
1736- print (f"⚠️ Warning: Could not load built library: { e } " )
1753+ print (f"[WARN] Could not load built library: { e } " )
17371754 if platform .system () != 'Windows' :
17381755 print (" Try setting LD_LIBRARY_PATH and running again:" )
17391756 print (f" export LD_LIBRARY_PATH=\" { args .output_dir } :$LD_LIBRARY_PATH\" " )
0 commit comments