Skip to main content
Glama

OpenSCAD MCP Server

by jhacksman
renderer.cpython-312.pyc7.96 kB
� J��gD��|�ddlZddlZddlZddlmZmZmZddlmZm Z m Z eje �Z Gd�d�Zy)�N)�Dict�Any�Optional)�Image� ImageDraw� ImageFontc ��eZdZdZd�Zddedeeeefdefd�Z ddedeeeefdeeeffd�Z dd ed edefd �Z d eeefd edefd �Z y)�Rendererz� Handles rendering of OpenSCAD models to preview images. Implements multi-angle views and fallback rendering when headless mode fails. c�*�||_ddddd�|_y)z� Initialize the renderer. Args: openscad_wrapper: Instance of OpenSCADWrapper for generating previews z0,0,0,0,0,0,50z0,0,0,90,0,0,50z0,0,0,0,90,0,50z20,20,20,55,0,25,100)�front�top�right� perspectiveN)�openscad_wrapper� camera_angles)�selfrs �>/home/ubuntu/openscad-mcp-server/src/visualization/renderer.py�__init__zRenderer.__init__s$��!1���&�$�&�1�  ���N� scad_file� parameters�returnc�d� |jj|||jdd��}tjj |�r$tjj |�dkDr|S|j|�S#t$r�}tjdt|����tjj|�jd�d}tjj|jj|�d��}|j|�cYd}~Sd}~wwxYw) a Generate a preview image for a SCAD file. Args: scad_file: Path to the SCAD file parameters: Optional parameters to override in the SCAD file Returns: Path to the generated preview image r�800,600��camera_position� image_sizerzError generating preview: �.�.pngN)r�generate_previewr�os�path�exists�getsize�_create_placeholder_image� Exception�logger�error�str�basename�split�join� preview_dir)rrr� preview_file�e�model_ids rr zRenderer.generate_preview s�� @��0�0�A�A��� $� 2� 2�=� A�$� B��L��w�w�~�~�l�+������ �0M�PQ�0Q�#�#��5�5�l�C�C��� @� �L�L�5�c�!�f�X�>� ?��w�w�'�'� �2�8�8��=�a�@�H��7�7�<�<��(=�(=�(I�(I�h�Z�W[�K\�]�L��1�1�,�?� ?��  @�s%�A.B�1B� D/� BD*�$D/�*D/c ��i}tjj|�jd�d}|jj �D]�\}}tjj |jj|�d|�d��} |jj|||d��}tjj|�r(tjj|�dkDr|||<n|j||�||<��|S#t$rD}tjd|�dt!|����|j||�||<Yd }~��d }~wwxYw) a, Generate preview images from multiple angles. Args: scad_file: Path to the SCAD file parameters: Optional parameters to override in the SCAD file Returns: Dictionary mapping angle names to preview image paths rr�_rrrzError generating � preview: N)r!r"r*r+r�itemsr,rr-r r#r$r%r&r'r(r)) rrr�previewsr0� angle_namerr.r/s r�generate_multi_angle_previewsz&Renderer.generate_multi_angle_previewsAsH�����7�7�#�#�I�.�4�4�S�9�!�<��+/�+=�+=�+C�+C�+E� '�J���7�7�<�<��%�%�1�1��*�A�j�\��.��L�  `�#�4�4�E�E���$3�(� F� � ��7�7�>�>�,�/�B�G�G�O�O�L�4Q�TU�4U�+7�H�Z�(�,0�+I�+I�,�Xb�+c�H�Z�(��),F�4��� � `�� � �0�� �J�s�1�v�h�O�P�'+�'E�'E�l�T^�'_���$�� `�s�A;D� E�9E�E� output_pathr6c�|� tjddd��}tj|�}|j ddd��|j d d |��d��|j |�t jd |���|S#t$r-}t jd t|����|cYd }~Sd }~wwxYw)a3 Create a placeholder image when OpenSCAD rendering fails. Args: output_path: Path to save the placeholder image angle_name: Name of the camera angle for the placeholder Returns: Path to the created placeholder image �RGB�� �X���r?r?��color)�izPreview not available)rrr)�fill)rBi@zView: zCreated placeholder image: z"Error creating placeholder image: N) r�newr�Draw�text�saver'�infor&r(r))rr8r6�img�drawr/s rr%z"Renderer._create_placeholder_imageks��� ��)�)�E�:�_�E�C��>�>�#�&�D� �I�I�j�$9��I� K� �I�I�j�F�:�,�"7�i�I� H� �H�H�[� !� �K�K�5�k�]�C� D�� ��� � �L�L�=�c�!�f�X�F� G�� �� �s�BB� B;�"B6�0B;�6B;r5c �p� tjddd��}ddddd �}|j�D]f\}}||vs� tjj |�s�+ tj |�}|jd�}|j|||��h|j|�tjd |���|S#t$r.}tjd |�d t|����Yd }~��d }~wwxYw#t$r-}tjdt|����|cYd }~Sd }~wwxYw)a3 Create a composite image from multiple angle previews. Args: previews: Dictionary mapping angle names to preview image paths output_path: Path to save the composite image Returns: Path to the created composite image r:)i@i�r>r@)rr)r<r)rr=r;)rr r rzError processing r3NzCreated composite preview: z"Error creating composite preview: )rrDr4r!r"r#�open�resize�paster&r'r(r)rGrH) rr5r8rI� positionsr6� preview_path� angle_imgr/s r�create_composite_previewz!Renderer.create_composite_preview�s!�� ��)�)�E�<��G�C� &�!��#� �I�-5�N�N�,<�(� �L���*�r�w�w�~�~�l�/K�Y�$)�J�J�|�$<� �$-�$4�$4�Z�$@� �� � �)�Y�z�-B�C�-=� �H�H�[� !� �K�K�5�k�]�C� D�� �� %�Y�� � �'8�� �J�s�ST�v�h�%W�X�X��Y��� � �L�L�=�c�!�f�X�F� G�� �� �sL�9C?�C?�;C�,C?� C<�$C7�2C?�7C<�<C?�? D5�"D0�*D5�0D5)N)r) �__name__� __module__� __qualname__�__doc__rr)rrrr r7r%rR�rrr r s����  �"@�#�@�8�D��c��N�;S�@�_b�@�B(�s�(��QU�VY�[^�V^�Q_�H`�(�lp�qt�vy�qy�lz�(�T�S��c��^a��:)��c�3�h��)�c�)�VY�)rr )r!� subprocess�logging�typingrrr�PILrrr� getLoggerrSr'r rWrr�<module>r]s8�� ���&�&�+�+� �� � �8� $��h�hr

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jhacksman/OpenSCAD-MCP-Server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server