�
�Lhf7 � � � d Z ddlZddlZddlZddlmZmZmZmZm Z ddl
mZ ddlZddl
Z
ej d� � Z G d� d� � ZdS )z;
Board-related command implementations for KiCAD interface
� N)�Dict�Any�Optional�List�Tuple)�Image�kicad_interfacec �v � e Zd ZdZddeej fd�Zdee e
f dee e
f fd�Zdee e
f dee e
f fd�Zdee e
f dee e
f fd �Z
dee e
f dee e
f fd
�Zdee e
f dee e
f fd�Zdee e
f dee e
f fd�Zd
e defd�Zdede fd�ZdS )�
BoardCommandsz&Handles board-related KiCAD operationsN�boardc � � || _ dS )z'Initialize with optional board instanceN)r )�selfr s �*C:\repo\KiCAD-MCP\python\commands\board.py�__init__zBoardCommands.__init__ s
� ���
�
�
� �params�returnc � � | j sdddd�S |� d� � }|� d� � }|� dd� � }|�|�dd
dd�S |dk rdnd
}t ||z � � }t ||z � � }| j � � � }|� t j ||� � � � | j � |� � dd|� d|� d|� �|||d�d�S # t $ rG} t �
dt | � � � �� � ddt | � � d�cY d } ~ S d } ~ ww xY w)zSet the size of the PCB boardF�No board is loaded�Load or create a board first��success�message�errorDetails�width�height�unit�mmNzMissing dimensionsz"Both width and height are required�@B i���TzSet board size to �x� �r r r )r r �sizezError setting board size: zFailed to set board size)r �get�int�GetBoardEdgesBoundingBox�SetSize�pcbnew�VECTOR2I�SetBoardEdgesBoundingBox� Exception�logger�error�str)
r r r r r �scale�width_nm� height_nm� board_box�es
r �set_board_sizezBoardCommands.set_board_size s� � �/ ��:�
�$�3�$B�� � � �J�J�w�'�'�E��Z�Z��)�)�F��:�:�f�d�+�+�D��}���$�3�$H�� � � $�t�|�|�G�G��E��5�5�=�)�)�H��F�U�N�+�+�I� �
�;�;�=�=�I����f�o�h� �B�B�C�C�C�
�J�/�/� �:�:�:� �G��G�G��G�G��G�G�"�$� �� �� �
�� � � � ��L�L�>�c�!�f�f�>�>�?�?�?� �5� #�A���� �
�
�
�
�
�
����� ���s* �C5 �A C5 �BC5 �5
E�?<E�;E�Ec �( � | j sdddd�S |� d� � }|� d� � }|� d� � }|� d� � }|r|r|sdd d
d�S | j � � � }d}|dk r|�dd
dd�S t j |dz
z }n%|dk r
t j }n|dk rt j }|�dddd�S |� ||� � |� || � |� � � � | j �
|d� � dd|� �||||d�d�S # t $ rG}t �
dt |� � � �� � ddt |� � d�cY d}~S d}~ww xY w)zAdd a new layer to the PCBFr r r �name�type�position�numberzMissing parametersz%name, type, and position are requiredN�innerzMissing layer numberz#number is required for inner layers� �top�bottomzInvalid layer positionz,position must be 'top', 'bottom', or 'inner'Tz
Added layer: )r6 r7 r8 r9 �r r �layerzError adding layer: zFailed to add layer)r r$ �
GetLayerStackr( �In1_Cu�F_Cu�B_Cu�SetLayerName�SetLayerType�_get_layer_type�SetLayerEnabledr+ r, r- r. ) r r r6 �
layer_typer8 r9 �layer_stack�layer_idr3 s r � add_layerzBoardCommands.add_layerI s> � �E ��:�
�$�3�$B�� � � �:�:�f�%�%�D����F�+�+�J��z�z�*�-�-�H��Z�Z��)�)�F��
�z�
��
�$�3�$K�� � � �*�2�2�4�4�K� �H��7�"�"��>�#(�#9�(M�� � �
"�=�F�Q�J�7����U�"�"�!�;����X�%�%�!�;����$�7�$R�� � �
�$�$�X�t�4�4�4��$�$�X�t�/C�/C�J�/O�/O�P�P�P�
�J�&�&�x��6�6�6� �1�4�1�1� �&� (�$� � � � �
�� � � � ��L�L�8��A���8�8�9�9�9� �0� #�A���� �
�
�
�
�
�
����� ���s6 �E �AE �/(E �?E �A'E �
F�
<F�F�Fc � � | j sdddd�S |� d� � }|sdddd�S | j � |� � }|dk r
dd d
|� d�d�S | j � |� � dd
|� �||d�d�S # t $ rG}t
� dt |� � � �� � ddt |� � d�cY d}~S d}~ww xY w)z'Set the active layer for PCB operationsFr r r r? zNo layer specifiedzlayer parameter is requiredr zLayer not foundzLayer 'z' does not existTzSet active layer to: )r6 �idr>