o
    /4i8                     @   sX   d Z ddlmZmZmZmZmZ ddlZddlZddl	Z	ddl
Z
G dd dZe ZdS )u9   
检测器注册中心
管理所有已注册的检测器
    )DictTypeOptionalListAnyNc                       s  e Zd ZdZdZdZ fddZdd Zd2ded	e	fd
dZ
dedee fddZd3dede	dee fddZdeeef fddZdedee fddZdefddZdd Zdedeeef fddZ	d4dededeeef deeef fd d!Zd"d# Zd$d% Zd4ded&edeeef fd'd(Zd2ded)e	deeef fd*d+Zdedeeef de	fd,d-Z		d5ded&edeeef de	fd.d/Zdedeeef fd0d1Z  ZS )6DetectorRegistryu   检测器注册中心NFc                    s"   | j du rtt| | | _ | j S )u   单例模式N)	_instancesuperr   __new__)cls	__class__ ;   D:\pyccd\极耳翻折-拆分\detectors\detector_registry.pyr
      s   
zDetectorRegistry.__new__c                 C   s<   | j si | _i | _tt| _i | _t	 | _
d| _ dS dS )u   初始化注册中心TN)_initialized	detectorsdetector_instancesloggingZ	getLogger__name__loggerparams_cache	threadingLock
cache_lockselfr   r   r   __init__   s   

zDetectorRegistry.__init__detector_class	overwritec                 C   sn   ddl m} t||std| | }|j}|| jv r'|s'td| d|| j|< | jd|  dS )u   
        注册检测器类
        
        Args:
            detector_class: 检测器类，必须继承BaseDetector
            overwrite: 是否覆盖已存在的检测器
           )BaseDetectoru&   检测器类必须继承BaseDetector: u   检测器已存在: u    ，使用overwrite=True来覆盖u   注册检测器: N)base_detectorr    
issubclass
ValueErrornamer   r   info)r   r   r   r    Ztemp_instancedetector_namer   r   r   register&   s   

zDetectorRegistry.registerr&   returnc              
   O   s~   || j vr| jd|  dS z| j | }||i |}|W S  ty> } z| jd| d|  W Y d}~dS d}~ww )u  
        创建检测器实例
        
        Args:
            detector_name: 检测器名称
            *args, **kwargs: 传递给检测器构造函数的参数
            
        Returns:
            检测器实例，如果不存在则返回None
        u   未找到检测器: Nu   创建检测器实例失败 : )r   r   error	Exception)r   r&   argskwargsr   instanceer   r   r   create_detector=   s   

z DetectorRegistry.create_detectorTcreate_if_not_existsc                 C   s8   || j v r
| j | S |r| |}|r|| j |< |S dS )u  
        获取检测器实例（单例模式）
        
        Args:
            detector_name: 检测器名称
            create_if_not_exists: 如果实例不存在是否创建
            
        Returns:
            检测器实例，如果不存在则返回None
        N)r   r0   )r   r&   r1   r.   r   r   r   get_detectorT   s   



zDetectorRegistry.get_detectorc                 C   
   | j  S )u~   
        获取所有已注册的检测器
        
        Returns:
            检测器名称到类的映射字典
        r   copyr   r   r   r   list_detectorsj      
zDetectorRegistry.list_detectorsc              
   C   s   | j |dd}|r| S || jv rAz| |}|r| W S W dS  ty@ } z| jd| d|  W Y d}~dS d}~ww dS )u   
        获取检测器信息
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            检测器信息字典，如果不存在则返回None
        F)r1   u   获取检测器信息失败 r)   N)r2   get_infor   r0   r+   r   r*   )r   r&   ZdetectorZtemp_detectorr/   r   r   r   get_detector_infos   s    



"z"DetectorRegistry.get_detector_infoc                 C   sV   || j v r	| j |= || jv r | j| }t|dr|  | j|= | jd|  dS )uc   
        注销检测器
        
        Args:
            detector_name: 检测器名称
        cleanupu   注销检测器: N)r   r   hasattrr:   r   r%   )r   r&   r.   r   r   r   
unregister   s   



zDetectorRegistry.unregisterc                 C   r3   )u   
        获取所有已注册的检测器
        
        Returns:
            Dict[str, Type]: 检测器名称到检测器类的映射
        r4   r   r   r   r   get_registered_detectors   r7   z)DetectorRegistry.get_registered_detectorsc                 C   s6   || j vri S | |}|rt|dr| S ddiS )u   
        获取指定检测器的可用函数列表
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            Dict[str, str]: 函数名称到描述的映射
        get_available_functionsdetectu   主检测函数)r   r2   r;   r>   )r   r&   detector_instancer   r   r   get_detector_functions   s   


z'DetectorRegistry.get_detector_functionsfunction_nameparamsc                 C   s   |  |}|std| | |}|r| }|| n|}t|dr-||||S |dkr7|||S td| d| )uH  
        调用检测器的指定函数
        
        Args:
            detector_name: 检测器名称
            function_name: 函数名称
            image: 输入图像
            params: 外部传入的参数（可选），会与缓存参数合并
            
        Returns:
            Dict: 检测结果
           检测器不存在: call_functionr?   u
   检测器 u    不支持函数: )r2   r#   get_detector_paramsr5   updater;   rE   r?   )r   r&   rB   imagerC   r@   Zcached_paramsZfinal_paramsr   r   r   call_detector_function   s   


z'DetectorRegistry.call_detector_functionc                 C   s   t | j S )u   
        获取所有已注册检测器的名称列表
        
        Returns:
            List[str]: 检测器名称列表
        )listr   keysr   r   r   r   list_detector_names   s   z$DetectorRegistry.list_detector_namesc                 C   sv   | j  D ]}t|dr|  q| j  | j   | j | j  W d   n1 s.w   Y  | j	d dS )u   清空所有注册的检测器r:   Nu   清空所有检测器注册)
r   valuesr;   r:   r   clearr   r   r   r%   )r   r.   r   r   r   rN      s   


zDetectorRegistry.clearconfig_file_pathc           
   
   C   sN  |  |}|s| jd|  i S | }|du r0t|dr$| }n| d}tjd|}|	 }tj
|rz,t|ddd}t|}W d   n1 sRw   Y  || | jd	|  W n% ty }	 z| jd
|	 d W Y d}	~	nd}	~	ww | jd|  | j || j|< W d   |S 1 sw   Y  |S )u  
        加载检测器参数到缓存
        
        Args:
            detector_name: 检测器名称
            config_file_path: 配置文件路径，如果为None则使用默认路径
            
        Returns:
            Dict[str, Any]: 合并后的参数字典
        rD   Nget_config_filename_params.jsonconfigrutf-8encodingu   已加载检测器配置: u   加载检测器配置失败: u   ，使用默认参数u,   配置文件不存在，使用默认参数: )r2   r   r*   get_default_parametersr;   rP   ospathjoinr5   existsopenjsonloadrG   r%   r+   Zwarningr   r   )
r   r&   rO   r@   Zdefault_paramsconfig_filenameZmerged_paramsfZjson_paramsr/   r   r   r   load_detector_params   s:   




 
z%DetectorRegistry.load_detector_paramsreloadc                 C   sZ   | j  |s|| jv r| j|  W  d   S W d   n1 s#w   Y  | |S )u
  
        获取检测器参数（从缓存或重新加载）
        
        Args:
            detector_name: 检测器名称
            reload: 是否强制重新加载参数
            
        Returns:
            Dict[str, Any]: 检测器参数字典
        N)r   r   r5   ra   )r   r&   rb   r   r   r   rF   "  s    
z$DetectorRegistry.get_detector_paramsc                 C   sj   || j vr| jd|  dS | j | | j|< W d   n1 s%w   Y  | jd|  dS )u   
        更新检测器参数缓存
        
        Args:
            detector_name: 检测器名称
            params: 新的参数字典
            
        Returns:
            bool: 更新是否成功
        rD   FNu    已更新检测器参数缓存: T)r   r   r*   r   r5   r   r%   )r   r&   rC   r   r   r   update_detector_params4  s   
z'DetectorRegistry.update_detector_paramsc              
   C   sR  |du r6| j ' || jvr | jd| d 	 W d   dS | j|  }W d   n1 s1w   Y  |du rU| |}t|drI| }n| d}tj	
d|}tjtj	|dd	 z,t|d
dd}tj||ddd W d   n1 s|w   Y  | jd|  W dS  ty } z| jd|  W Y d}~dS d}~ww )uc  
        保存检测器参数到文件
        
        Args:
            detector_name: 检测器名称
            config_file_path: 配置文件路径，如果为None则使用默认路径
            params: 要保存的参数字典，如果为None则使用缓存中的参数
            
        Returns:
            bool: 保存是否成功
        Nu   参数缓存中没有检测器 u
    的参数FrP   rQ   rR   T)exist_okwrT   rU      )indentZensure_asciiu   已保存检测器参数: u   保存检测器参数失败: )r   r   r   r*   r5   r2   r;   rP   rX   rY   rZ   makedirsdirnamer\   r]   dumpr%   r+   )r   r&   rO   rC   r@   r_   r`   r/   r   r   r   save_detector_paramsI  s4   




z%DetectorRegistry.save_detector_paramsc                 C   sL   | j  || jvr| | | j|i W  d   S 1 sw   Y  dS )u   
        获取用于TreeViewer的参数（返回缓存的引用，允许直接修改）
        
        Args:
            detector_name: 检测器名称
            
        Returns:
            Dict[str, Any]: 参数字典的引用
        N)r   r   ra   get)r   r&   r   r   r   get_params_for_tree_viewert  s
   


$z+DetectorRegistry.get_params_for_tree_viewer)F)T)N)NN) r   
__module____qualname____doc__r   r   r
   r   r   boolr'   strr   objectr0   r2   r   r6   r9   r<   r=   rA   r   rI   rL   rN   ra   rF   rc   rk   rm   __classcell__r   r   r   r   r      sB    		


#	  .

"+r   )rp   typingr   r   r   r   r   r   r   r]   rX   r   detector_registryr   r   r   r   <module>   s      
}