EG/plugins/user/vegetation_ecosystem/editor/eco_editor.py
2025-12-12 16:16:15 +08:00

1131 lines
42 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
生态编辑器
提供可视化界面用于编辑和调整生态系统参数
"""
import time
from typing import Dict, Any, List, Optional
import json
class EcoEditor:
"""
生态编辑器
提供可视化界面用于编辑和调整生态系统参数,包括植被、动物、环境等
"""
def __init__(self, plugin):
"""
初始化生态编辑器
Args:
plugin: 植被和生态系统插件实例
"""
self.plugin = plugin
self.enabled = False
self.initialized = False
# 编辑器配置
self.editor_config = {
'auto_preview': True,
'realtime_update': True,
'preview_quality': 'medium',
'history_limit': 50,
'snap_to_grid': True,
'grid_size': 1.0
}
# 编辑模式
self.edit_modes = {
'vegetation': {'name': '植被编辑', 'description': '编辑植被参数和分布'},
'animals': {'name': '动物编辑', 'description': '编辑动物种群和行为'},
'environment': {'name': '环境编辑', 'description': '编辑环境因子和地形影响'},
'ecosystem': {'name': '生态系统编辑', 'description': '编辑生态系统参数和关系'},
'seasons': {'name': '季节编辑', 'description': '编辑季节参数和效果'},
'interactions': {'name': '交互编辑', 'description': '编辑生态系统交互参数'},
'visualization': {'name': '可视化编辑', 'description': '编辑可视化效果参数'}
}
self.current_edit_mode = 'vegetation'
# 参数分组
self.parameter_groups = {
'vegetation': ['growth_rate', 'reproduction_rate', 'preferred_conditions', 'competition_factor'],
'animals': ['reproduction_rate', 'mortality_rate', 'mobility', 'preferred_food', 'territory_size'],
'environment': ['temperature', 'humidity', 'soil_fertility', 'light_level', 'water_level'],
'ecosystem': ['biodiversity_index', 'stability_index', 'productivity_rate', 'carrying_capacity'],
'seasons': ['season_duration', 'temperature_modifier', 'growth_factor', 'light_duration'],
'interactions': ['herbivory_rate', 'seed_dispersal_rate', 'pollination_rate', 'competition_intensity'],
'visualization': ['render_distance', 'effect_intensity', 'color_scheme', 'transparency']
}
# 编辑历史
self.edit_history = []
self.history_position = -1
# 选择系统
self.selected_objects = []
self.selection_mode = 'single' # 'single', 'multiple', 'area'
# 工具系统
self.tools = {
'select': {'name': '选择工具', 'description': '选择和编辑对象'},
'spawn': {'name': '生成工具', 'description': '生成植被或动物'},
'paint': {'name': '绘制工具', 'description': '绘制植被分布'},
'erase': {'name': '擦除工具', 'description': '擦除植被或动物'},
'modify': {'name': '修改工具', 'description': '修改对象属性'},
'analyze': {'name': '分析工具', 'description': '分析生态系统状态'}
}
self.current_tool = 'select'
# 预览数据
self.preview_data = None
self.preview_dirty = False
# 工具状态
self.is_editing = False
self.selected_parameter = None
# 分析数据
self.analysis_data = {
'last_analysis': None,
'analysis_timestamp': 0,
'analysis_results': {}
}
# 统计信息
self.stats = {
'edits_made': 0,
'undos_performed': 0,
'redos_performed': 0,
'total_edit_time': 0.0,
'average_edit_time': 0.0,
'objects_selected': 0
}
# UI组件引用在实际实现中会连接到GUI
self.ui_components = {
'toolbar': None,
'properties_panel': None,
'preview_window': None,
'parameter_sliders': None,
'history_panel': None,
'selection_info': None,
'analysis_panel': None
}
print("✓ 生态编辑器已创建")
def initialize(self) -> bool:
"""
初始化生态编辑器
Returns:
是否初始化成功
"""
try:
self.initialized = True
print("✓ 生态编辑器初始化完成")
return True
except Exception as e:
print(f"✗ 生态编辑器初始化失败: {e}")
import traceback
traceback.print_exc()
return False
def enable(self) -> bool:
"""
启用生态编辑器
Returns:
是否启用成功
"""
try:
if not self.initialized:
print("✗ 生态编辑器未初始化")
return False
self.enabled = True
print("✓ 生态编辑器已启用")
return True
except Exception as e:
print(f"✗ 生态编辑器启用失败: {e}")
import traceback
traceback.print_exc()
return False
def disable(self):
"""禁用生态编辑器"""
try:
self.enabled = False
print("✓ 生态编辑器已禁用")
except Exception as e:
print(f"✗ 生态编辑器禁用失败: {e}")
import traceback
traceback.print_exc()
def finalize(self):
"""清理生态编辑器资源"""
try:
self.disable()
self.initialized = False
print("✓ 生态编辑器资源已清理")
except Exception as e:
print(f"✗ 生态编辑器资源清理失败: {e}")
import traceback
traceback.print_exc()
def update(self, dt: float):
"""
更新生态编辑器状态
Args:
dt: 时间增量
"""
try:
if not self.enabled:
return
# 更新预览
if self.preview_dirty and self.editor_config['auto_preview']:
self._update_preview()
# 处理实时更新
if self.editor_config['realtime_update']:
self._handle_realtime_updates()
except Exception as e:
print(f"✗ 生态编辑器更新失败: {e}")
import traceback
traceback.print_exc()
def _update_preview(self):
"""更新预览显示"""
try:
# 在实际实现中,这里会更新预览窗口
self.preview_dirty = False
except Exception as e:
print(f"✗ 预览更新失败: {e}")
def _handle_realtime_updates(self):
"""处理实时更新"""
try:
# 在实际实现中,这里会处理实时编辑更新
pass
except Exception as e:
print(f"✗ 实时更新处理失败: {e}")
def set_edit_mode(self, mode: str):
"""
设置编辑模式
Args:
mode: 编辑模式
"""
if mode in self.edit_modes:
self.current_edit_mode = mode
print(f"✓ 编辑模式设置为: {self.edit_modes[mode]['name']}")
else:
print(f"✗ 无效的编辑模式: {mode}")
def get_edit_modes(self) -> Dict[str, Dict[str, str]]:
"""
获取可用的编辑模式
Returns:
编辑模式字典
"""
return self.edit_modes.copy()
def get_current_edit_mode(self) -> str:
"""
获取当前编辑模式
Returns:
当前编辑模式
"""
return self.current_edit_mode
def set_parameter(self, parameter_name: str, value: Any):
"""
设置参数值
Args:
parameter_name: 参数名称
value: 参数值
"""
try:
# 保存当前状态到历史记录
self._save_state_to_history()
# 根据编辑模式应用参数
if self.current_edit_mode == 'vegetation' and self.plugin.vegetation_manager:
# 处理植被参数
veg_types = self.plugin.vegetation_manager.get_vegetation_types()
for veg_type in veg_types:
veg_info = self.plugin.vegetation_manager.get_vegetation_info(veg_type)
if veg_info and parameter_name in veg_info:
# 在实际实现中会更新植被参数
pass
elif self.current_edit_mode == 'animals' and self.plugin.animal_simulator:
# 处理动物参数
animal_species = self.plugin.animal_simulator.get_animal_species()
for species in animal_species:
animal_info = self.plugin.animal_simulator.get_animal_info(species)
if animal_info and parameter_name in animal_info:
# 在实际实现中会更新动物参数
pass
elif self.current_edit_mode == 'environment' and self.plugin.vegetation_manager:
# 处理环境参数
env_factors = self.plugin.vegetation_manager.get_environment_factors()
if parameter_name in env_factors:
env_factors[parameter_name] = value
self.plugin.vegetation_manager.update_environment_factors(env_factors)
elif self.current_edit_mode == 'ecosystem' and self.plugin.ecosystem_manager:
# 处理生态系统参数
self.plugin.ecosystem_manager.set_ecosystem_parameter(parameter_name, value)
elif self.current_edit_mode == 'seasons' and self.plugin.seasonal_effects:
# 处理季节参数
if parameter_name == 'season_duration':
current_season = self.plugin.seasonal_effects.get_current_season()
self.plugin.seasonal_effects.set_season_duration(current_season, value)
elif self.current_edit_mode == 'interactions' and self.plugin.ecosystem_interactions:
# 处理交互参数
self.plugin.ecosystem_interactions.set_interaction_parameter(parameter_name, value)
elif self.current_edit_mode == 'visualization':
# 处理可视化参数
if self.plugin.eco_visualizer:
# 处理基础可视化参数
pass
if self.plugin.advanced_visuals:
# 处理高级可视化参数
if parameter_name in ['render_distance', 'effect_intensity', 'transparency']:
config = self.plugin.advanced_visuals.get_visualization_config()
config[parameter_name] = value
self.plugin.advanced_visuals.set_visualization_config(config)
elif parameter_name == 'color_scheme':
self.plugin.advanced_visuals.set_color_scheme(value)
# 标记预览需要更新
self.preview_dirty = True
# 更新统计信息
self.stats['edits_made'] += 1
print(f"✓ 参数 '{parameter_name}' 设置为: {value}")
except Exception as e:
print(f"✗ 参数设置失败: {e}")
import traceback
traceback.print_exc()
def get_parameter(self, parameter_name: str) -> Any:
"""
获取参数值
Args:
parameter_name: 参数名称
Returns:
参数值
"""
try:
# 根据编辑模式获取参数
if self.current_edit_mode == 'vegetation' and self.plugin.vegetation_manager:
# 获取植被参数
pass
elif self.current_edit_mode == 'animals' and self.plugin.animal_simulator:
# 获取动物参数
pass
elif self.current_edit_mode == 'environment' and self.plugin.vegetation_manager:
env_factors = self.plugin.vegetation_manager.get_environment_factors()
return env_factors.get(parameter_name)
elif self.current_edit_mode == 'ecosystem' and self.plugin.ecosystem_manager:
return self.plugin.ecosystem_manager.get_ecosystem_parameter(parameter_name)
elif self.current_edit_mode == 'seasons' and self.plugin.seasonal_effects:
if parameter_name == 'season_duration':
current_season = self.plugin.seasonal_effects.get_current_season()
season_info = self.plugin.seasonal_effects.get_season_info(current_season)
if season_info:
return season_info.get('duration', 90)
elif self.current_edit_mode == 'interactions' and self.plugin.ecosystem_interactions:
params = self.plugin.ecosystem_interactions.get_interaction_parameters()
return params.get(parameter_name)
elif self.current_edit_mode == 'visualization':
if self.plugin.advanced_visuals:
config = self.plugin.advanced_visuals.get_visualization_config()
if parameter_name in config:
return config[parameter_name]
elif parameter_name == 'color_scheme':
return config.get('color_scheme', 'default')
except Exception as e:
print(f"✗ 参数获取失败: {e}")
import traceback
traceback.print_exc()
return None
def _save_state_to_history(self):
"""保存当前状态到历史记录"""
try:
# 创建状态快照
state_snapshot = {
'timestamp': time.time(),
'edit_mode': self.current_edit_mode,
'vegetation_params': {},
'animal_params': {},
'environment_params': {},
'ecosystem_params': {},
'season_params': {},
'interaction_params': {},
'visualization_params': {}
}
# 保存植被参数
if self.plugin.vegetation_manager:
veg_types = self.plugin.vegetation_manager.get_vegetation_types()
for veg_type in veg_types:
veg_info = self.plugin.vegetation_manager.get_vegetation_info(veg_type)
if veg_info:
state_snapshot['vegetation_params'][veg_type] = veg_info.copy()
# 保存动物参数
if self.plugin.animal_simulator:
animal_species = self.plugin.animal_simulator.get_animal_species()
for species in animal_species:
animal_info = self.plugin.animal_simulator.get_animal_info(species)
if animal_info:
state_snapshot['animal_params'][species] = animal_info.copy()
# 保存环境参数
if self.plugin.vegetation_manager:
state_snapshot['environment_params'] = self.plugin.vegetation_manager.get_environment_factors().copy()
# 保存生态系统参数
if self.plugin.ecosystem_manager:
state_snapshot['ecosystem_params'] = self.plugin.ecosystem_manager.get_ecosystem_parameters().copy()
# 保存季节参数
if self.plugin.seasonal_effects:
current_season = self.plugin.seasonal_effects.get_current_season()
season_info = self.plugin.seasonal_effects.get_season_info(current_season)
if season_info:
state_snapshot['season_params'] = season_info.copy()
# 保存交互参数
if self.plugin.ecosystem_interactions:
state_snapshot['interaction_params'] = self.plugin.ecosystem_interactions.get_interaction_parameters().copy()
# 保存可视化参数
if self.plugin.advanced_visuals:
state_snapshot['visualization_params'] = self.plugin.advanced_visuals.get_visualization_config().copy()
# 添加到历史记录
if self.history_position < len(self.edit_history) - 1:
# 如果当前不在历史记录末尾,截断后续记录
self.edit_history = self.edit_history[:self.history_position + 1]
self.edit_history.append(state_snapshot)
self.history_position += 1
# 限制历史记录数量
if len(self.edit_history) > self.editor_config['history_limit']:
self.edit_history.pop(0)
self.history_position -= 1
except Exception as e:
print(f"✗ 状态保存失败: {e}")
import traceback
traceback.print_exc()
def undo(self) -> bool:
"""
撤销操作
Returns:
是否撤销成功
"""
try:
if not self.enabled:
print("✗ 生态编辑器未启用")
return False
if self.history_position <= 0:
print("✗ 没有可撤销的操作")
return False
# 移动到前一个历史状态
self.history_position -= 1
# 恢复状态
self._restore_state_from_history()
# 更新统计信息
self.stats['undos_performed'] += 1
print("✓ 撤销操作完成")
return True
except Exception as e:
print(f"✗ 撤销操作失败: {e}")
import traceback
traceback.print_exc()
return False
def redo(self) -> bool:
"""
重做操作
Returns:
是否重做成功
"""
try:
if not self.enabled:
print("✗ 生态编辑器未启用")
return False
if self.history_position >= len(self.edit_history) - 1:
print("✗ 没有可重做的操作")
return False
# 移动到下一个历史状态
self.history_position += 1
# 恢复状态
self._restore_state_from_history()
# 更新统计信息
self.stats['redos_performed'] += 1
print("✓ 重做操作完成")
return True
except Exception as e:
print(f"✗ 重做操作失败: {e}")
import traceback
traceback.print_exc()
return False
def _restore_state_from_history(self):
"""从历史记录恢复状态"""
try:
if self.history_position < 0:
return
# 获取历史状态
state = self.edit_history[self.history_position]
# 恢复参数
if self.plugin.vegetation_manager and state['vegetation_params']:
# 在实际实现中会恢复植被参数
pass
if self.plugin.animal_simulator and state['animal_params']:
# 在实际实现中会恢复动物参数
pass
if self.plugin.vegetation_manager and state['environment_params']:
self.plugin.vegetation_manager.update_environment_factors(state['environment_params'])
if self.plugin.ecosystem_manager and state['ecosystem_params']:
for param_name, param_value in state['ecosystem_params'].items():
self.plugin.ecosystem_manager.set_ecosystem_parameter(param_name, param_value)
if self.plugin.seasonal_effects and state['season_params']:
# 在实际实现中会恢复季节参数
pass
if self.plugin.ecosystem_interactions and state['interaction_params']:
# 恢复交互参数
for param_name, param_value in state['interaction_params'].items():
self.plugin.ecosystem_interactions.set_interaction_parameter(param_name, param_value)
if self.plugin.advanced_visuals and state['visualization_params']:
# 恢复可视化参数
self.plugin.advanced_visuals.set_visualization_config(state['visualization_params'])
# 标记预览需要更新
self.preview_dirty = True
except Exception as e:
print(f"✗ 状态恢复失败: {e}")
import traceback
traceback.print_exc()
def clear_history(self):
"""清空历史记录"""
try:
self.edit_history.clear()
self.history_position = -1
print("✓ 历史记录已清空")
except Exception as e:
print(f"✗ 历史记录清空失败: {e}")
import traceback
traceback.print_exc()
def get_parameter_groups(self) -> Dict[str, List[str]]:
"""
获取参数分组
Returns:
参数分组字典
"""
return self.parameter_groups.copy()
def get_parameters_in_group(self, group_name: str) -> List[str]:
"""
获取组中的参数列表
Args:
group_name: 组名称
Returns:
参数列表
"""
return self.parameter_groups.get(group_name, []).copy()
def set_editor_config(self, config: Dict[str, Any]):
"""
设置编辑器配置
Args:
config: 配置字典
"""
self.editor_config.update(config)
print(f"✓ 编辑器配置已更新: {self.editor_config}")
def get_editor_config(self) -> Dict[str, Any]:
"""
获取编辑器配置
Returns:
配置字典
"""
return self.editor_config.copy()
def set_tool(self, tool_name: str):
"""
设置当前工具
Args:
tool_name: 工具名称
"""
if tool_name in self.tools:
self.current_tool = tool_name
print(f"✓ 当前工具设置为: {self.tools[tool_name]['name']}")
else:
print(f"✗ 无效的工具: {tool_name}")
def get_tools(self) -> Dict[str, Dict[str, str]]:
"""
获取可用工具
Returns:
工具字典
"""
return self.tools.copy()
def get_current_tool(self) -> str:
"""
获取当前工具
Returns:
当前工具名称
"""
return self.current_tool
def select_object(self, object_id: Any, multi_select: bool = False):
"""
选择对象
Args:
object_id: 对象ID
multi_select: 是否多选
"""
try:
if multi_select:
if object_id not in self.selected_objects:
self.selected_objects.append(object_id)
else:
self.selected_objects = [object_id]
self.stats['objects_selected'] = len(self.selected_objects)
print(f"✓ 对象已选择: {object_id}")
except Exception as e:
print(f"✗ 对象选择失败: {e}")
def deselect_object(self, object_id: Any):
"""
取消选择对象
Args:
object_id: 对象ID
"""
try:
if object_id in self.selected_objects:
self.selected_objects.remove(object_id)
self.stats['objects_selected'] = len(self.selected_objects)
print(f"✓ 对象已取消选择: {object_id}")
except Exception as e:
print(f"✗ 对象取消选择失败: {e}")
def clear_selection(self):
"""清空选择"""
try:
self.selected_objects.clear()
self.stats['objects_selected'] = 0
print("✓ 选择已清空")
except Exception as e:
print(f"✗ 选择清空失败: {e}")
def get_selected_objects(self) -> List[Any]:
"""
获取选中的对象
Returns:
选中的对象列表
"""
return self.selected_objects.copy()
def set_selection_mode(self, mode: str):
"""
设置选择模式
Args:
mode: 选择模式 ('single', 'multiple', 'area')
"""
if mode in ['single', 'multiple', 'area']:
self.selection_mode = mode
print(f"✓ 选择模式设置为: {mode}")
else:
print(f"✗ 无效的选择模式: {mode}")
def get_selection_mode(self) -> str:
"""
获取选择模式
Returns:
选择模式
"""
return self.selection_mode
def get_stats(self) -> Dict[str, Any]:
"""
获取统计信息
Returns:
统计信息字典
"""
# 更新平均编辑时间
total_edits = self.stats['edits_made'] + self.stats['undos_performed'] + self.stats['redos_performed']
if total_edits > 0:
self.stats['average_edit_time'] = self.stats['total_edit_time'] / total_edits
return self.stats.copy()
def reset_stats(self):
"""重置统计信息"""
self.stats = {
'edits_made': 0,
'undos_performed': 0,
'redos_performed': 0,
'total_edit_time': 0.0,
'average_edit_time': 0.0,
'objects_selected': 0
}
print("✓ 生态编辑器统计信息已重置")
def export_editor_state(self, filename: str) -> bool:
"""
导出编辑器状态
Args:
filename: 文件名
Returns:
是否导出成功
"""
try:
# 创建状态数据
state_data = {
'editor_config': self.editor_config,
'current_edit_mode': self.current_edit_mode,
'current_tool': self.current_tool,
'parameter_groups': self.parameter_groups,
'timestamp': time.time()
}
# 保存为JSON文件
with open(filename, 'w', encoding='utf-8') as f:
json.dump(state_data, f, ensure_ascii=False, indent=2)
print(f"✓ 编辑器状态已导出到: {filename}")
return True
except Exception as e:
print(f"✗ 编辑器状态导出失败: {e}")
import traceback
traceback.print_exc()
return False
def import_editor_state(self, filename: str) -> bool:
"""
导入编辑器状态
Args:
filename: 文件名
Returns:
是否导入成功
"""
try:
# 读取JSON文件
with open(filename, 'r', encoding='utf-8') as f:
state_data = json.load(f)
# 应用状态
if 'editor_config' in state_data:
self.set_editor_config(state_data['editor_config'])
if 'current_edit_mode' in state_data:
self.set_edit_mode(state_data['current_edit_mode'])
if 'current_tool' in state_data:
self.set_tool(state_data['current_tool'])
print(f"✓ 编辑器状态已从 {filename} 导入")
return True
except Exception as e:
print(f"✗ 编辑器状态导入失败: {e}")
import traceback
traceback.print_exc()
return False
def set_ui_component(self, component_name: str, component: Any):
"""
设置UI组件引用
Args:
component_name: 组件名称
component: 组件引用
"""
if component_name in self.ui_components:
self.ui_components[component_name] = component
print(f"✓ UI组件 '{component_name}' 已设置")
else:
print(f"✗ 无效的UI组件名称: {component_name}")
def refresh_ui(self):
"""刷新UI显示"""
try:
# 在实际实现中这里会更新所有UI组件的显示
print("✓ UI刷新完成")
except Exception as e:
print(f"✗ UI刷新失败: {e}")
def show_preview_window(self):
"""显示预览窗口"""
try:
# 在实际实现中,这里会创建并显示预览窗口
print("✓ 预览窗口已显示")
except Exception as e:
print(f"✗ 预览窗口显示失败: {e}")
def hide_preview_window(self):
"""隐藏预览窗口"""
try:
# 在实际实现中,这里会隐藏预览窗口
print("✓ 预览窗口已隐藏")
except Exception as e:
print(f"✗ 预览窗口隐藏失败: {e}")
def update_preview_window(self):
"""更新预览窗口内容"""
try:
# 在实际实现中,这里会更新预览窗口的内容
print("✓ 预览窗口已更新")
except Exception as e:
print(f"✗ 预览窗口更新失败: {e}")
def apply_preset(self, preset_name: str):
"""
应用预设
Args:
preset_name: 预设名称
"""
try:
if self.plugin.preset_manager:
self.plugin.preset_manager.apply_preset(preset_name)
self.preview_dirty = True
print(f"✓ 预设 '{preset_name}' 已应用")
else:
print("✗ 预设管理器不可用")
except Exception as e:
print(f"✗ 预设应用失败: {e}")
import traceback
traceback.print_exc()
def save_current_as_preset(self, preset_name: str, description: str = '') -> str:
"""
将当前配置保存为预设
Args:
preset_name: 预设名称
description: 预设描述
Returns:
预设ID
"""
try:
if self.plugin.preset_manager:
preset_id = self.plugin.preset_manager.create_terrain_preset_from_current(preset_name, description)
print(f"✓ 当前配置已保存为预设: {preset_name}")
return preset_id
else:
print("✗ 预设管理器不可用")
return ''
except Exception as e:
print(f"✗ 预设保存失败: {e}")
import traceback
traceback.print_exc()
return ''
def spawn_vegetation(self, vegetation_type: str, position: tuple, count: int = 1):
"""
生成植被
Args:
vegetation_type: 植被类型
position: 位置
count: 数量
"""
try:
if not self.plugin.vegetation_manager:
print("✗ 植被管理器不可用")
return
if vegetation_type not in self.plugin.vegetation_manager.get_vegetation_types():
print(f"✗ 无效的植被类型: {vegetation_type}")
return
# 保存当前状态到历史记录
self._save_state_to_history()
spawned_count = 0
for i in range(count):
# 添加随机偏移
if count > 1:
offset_x = random.uniform(-2.0, 2.0)
offset_z = random.uniform(-2.0, 2.0)
spawn_position = (position[0] + offset_x, position[1], position[2] + offset_z)
else:
spawn_position = position
instance_id = self.plugin.vegetation_manager.create_vegetation_instance(
vegetation_type, spawn_position
)
if instance_id >= 0:
spawned_count += 1
print(f"✓ 已生成 {spawned_count}{vegetation_type}")
self.stats['edits_made'] += 1
except Exception as e:
print(f"✗ 植被生成失败: {e}")
import traceback
traceback.print_exc()
def remove_selected_objects(self):
"""移除选中的对象"""
try:
if not self.plugin.vegetation_manager:
print("✗ 植被管理器不可用")
return
# 保存当前状态到历史记录
self._save_state_to_history()
removed_count = 0
for obj_id in self.selected_objects:
# 假设所有选中对象都是植被实例
if self.plugin.vegetation_manager.remove_vegetation_instance(obj_id):
removed_count += 1
self.clear_selection()
print(f"✓ 已移除 {removed_count} 个对象")
self.stats['edits_made'] += 1
except Exception as e:
print(f"✗ 对象移除失败: {e}")
import traceback
traceback.print_exc()
def analyze_ecosystem(self) -> Dict[str, Any]:
"""
分析生态系统状态
Returns:
分析结果字典
"""
try:
analysis_results = {
'timestamp': time.time(),
'biodiversity': 0.0,
'health_index': 0.0,
'stability': 0.0,
'total_species': 0,
'total_population': 0,
'resource_availability': 0.0
}
# 收集生态系统数据
if self.plugin.ecosystem_manager:
system_state = self.plugin.ecosystem_manager.get_system_state()
analysis_results['health_index'] = system_state.get('health_index', 0.0)
analysis_results['stability'] = self.plugin.ecosystem_manager.get_stability_index()
analysis_results['biodiversity'] = self.plugin.ecosystem_manager.get_biodiversity_index()
if self.plugin.vegetation_manager:
veg_stats = self.plugin.vegetation_manager.get_stats()
analysis_results['total_species'] += len(veg_stats.get('vegetation_by_type', {}))
analysis_results['total_population'] += veg_stats.get('total_vegetation', 0)
if self.plugin.animal_simulator:
animal_stats = self.plugin.animal_simulator.get_stats()
analysis_results['total_species'] += len(animal_stats.get('animals_by_species', {}))
analysis_results['total_population'] += animal_stats.get('total_animals', 0)
if self.plugin.vegetation_manager:
env_factors = self.plugin.vegetation_manager.get_environment_factors()
# 简化的资源可用性计算
resource_score = (
env_factors.get('temperature', 50) / 100 * 0.25 +
env_factors.get('humidity', 50) / 100 * 0.25 +
env_factors.get('soil_fertility', 0.5) * 0.25 +
env_factors.get('water_level', 0.5) * 0.25
)
analysis_results['resource_availability'] = resource_score
# 保存分析结果
self.analysis_data['last_analysis'] = analysis_results
self.analysis_data['analysis_timestamp'] = analysis_results['timestamp']
self.analysis_data['analysis_results'] = analysis_results
print("✓ 生态系统分析完成")
return analysis_results
except Exception as e:
print(f"✗ 生态系统分析失败: {e}")
import traceback
traceback.print_exc()
return {}
def get_last_analysis(self) -> Optional[Dict[str, Any]]:
"""
获取上次分析结果
Returns:
上次分析结果或None
"""
return self.analysis_data['last_analysis']
def export_analysis_report(self, filename: str) -> bool:
"""
导出分析报告
Args:
filename: 文件名
Returns:
是否导出成功
"""
try:
analysis = self.get_last_analysis()
if not analysis:
print("✗ 没有可用的分析数据")
return False
# 创建报告数据
report_data = {
'analysis_report': analysis,
'editor_state': {
'edit_mode': self.current_edit_mode,
'tool': self.current_tool,
'timestamp': time.time()
}
}
# 保存为JSON文件
with open(filename, 'w', encoding='utf-8') as f:
json.dump(report_data, f, ensure_ascii=False, indent=2)
print(f"✓ 分析报告已导出到: {filename}")
return True
except Exception as e:
print(f"✗ 分析报告导出失败: {e}")
import traceback
traceback.print_exc()
return False
def toggle_visualization_type(self, visualization_type: str):
"""
切换可视化类型启用状态
Args:
visualization_type: 可视化类型
"""
try:
if self.plugin.advanced_visuals:
# 获取当前状态
vis_types = self.plugin.advanced_visuals.get_visualization_types()
if visualization_type in vis_types:
current_state = vis_types[visualization_type]['enabled']
self.plugin.advanced_visuals.set_visualization_type_enabled(visualization_type, not current_state)
print(f"✓ 可视化类型 '{visualization_type}'{'启用' if not current_state else '禁用'}")
else:
print(f"✗ 无效的可视化类型: {visualization_type}")
else:
print("✗ 高级可视化模块不可用")
except Exception as e:
print(f"✗ 可视化类型切换失败: {e}")
def capture_visualization_screenshot(self, filename: str = None) -> str:
"""
捕获可视化截图
Args:
filename: 文件名
Returns:
截图文件路径
"""
try:
if self.plugin.advanced_visuals:
return self.plugin.advanced_visuals.capture_visualization_screenshot(filename)
else:
print("✗ 高级可视化模块不可用")
return ""
except Exception as e:
print(f"✗ 可视化截图捕获失败: {e}")
return ""