Skip to main content
Glama

OpenSCAD MCP Server

by jhacksman
code_generator.cpython-312.pyc9.53 kB
� ���g�%��p�ddlZddlZddlZddlmZmZmZmZmZeje �Z Gd�d�Z y)�N)�Dict�Any�List�Tuple�Optionalc��eZdZdZdedefd�Zdedeeefdefd�Zd edeeefdefd �Z d e eeefdefd �Z deeefdeeeffd �Z dedeeefdefd�Z y)�OpenSCADCodeGeneratorz� Generates OpenSCAD code from natural language descriptions and parameters. Implements translation of requirements to OpenSCAD primitives and modules. �scad_templates_dir� output_dirc��||_||_tj|d��ddddddd d d d d ddd� |_dddddddddddddd� |_y) z� Initialize the code generator. Args: scad_templates_dir: Directory containing SCAD template files output_dir: Directory to store generated SCAD files T)�exist_ok�parametric_cube�parametric_sphere�parametric_cylinder� hollow_box� rounded_box�rounded_container�tube�cone�wedge�rounded_cylinder�torus�hexagonal_prism�text_3d) �cube�sphere�cylinder�boxr� containerrrrrrr�text�width�depth�height�radius� thickness�segments�center� inner_radius� outer_radius� corner_radiusr �size�font) r!r"r#r$r%r&r'r(r)r*r r+r,N)r r �os�makedirs�shape_module_map� parameter_map)�selfr r s �=/home/ubuntu/openscad-mcp-server/src/models/code_generator.py�__init__zOpenSCADCodeGenerator.__init__s���#5���$��� � � �J��.�&�)�-��(�,���� 2��0��! ���$����$�"��*�*�,���� ���� model_type� parameters�returnc���ttj��}tjj |j |�d��}|jj|�}|std|����|j|�}|j||�}t|d�5}|j|�ddd�tjd|���|S#1swY�#xYw)a! Generate OpenSCAD code for a given model type and parameters. Args: model_type: Type of model to generate parameters: Dictionary of parameters for the model Returns: Path to the generated SCAD file �.scad�Unsupported model type: �wNzGenerated OpenSCAD code: )�str�uuid�uuid4r-�path�joinr r/�get� ValueError�_map_parameters�_generate_scad_code�open�write�logger�info) r1r5r6�model_id� scad_file� module_name� scad_params� scad_code�fs r2� generate_codez#OpenSCADCodeGenerator.generate_code>s����t�z�z�|�$���G�G�L�L����X�J�e�2D�E� ��+�+�/�/� �;� ���7� �|�D�E� E��*�*�:�6� ��,�,�[�+�F� ��)�S� !�Q� �G�G�I� �"� � � �/� �{�;�<��� "� !�s �%C�C"rJc��tjj|�std|����t |d�5}|j �}ddd�d}|j j�D] \}}|vs� |}n|s td��|j|�}|j||�} t |d�5}|j| �ddd�tjd|���|S#1swY��xYw#1swY�/xYw)a  Update an existing SCAD file with new parameters. Args: scad_file: Path to the SCAD file to update parameters: New parameters to apply Returns: Path to the updated SCAD file zSCAD file not found: �rNz7Could not determine module name from existing SCAD filer;zUpdated OpenSCAD code: )r-r?�exists�FileNotFoundErrorrE�readr/�itemsrBrCrDrFrGrH) r1rJr6rNrMrK� shape_type�modulerL� updated_codes r2� update_codez!OpenSCADCodeGenerator.update_code_s����w�w�~�~�i�(�#�&;�I�;�$G�H� H��)�S� !�Q�����I�"�� �"&�"7�"7�"=�"=�"?� �J����"�$� ��#@� ��V�W� W��*�*�:�6� ��/�/� �[�I� ��)�S� !�Q� �G�G�L� !�"� � � �-�i�[�9�:���1"� !��("� !�s�C/�;C;�/C8�;D� operationsc ��ttj��}tjj |j |�d��}dtjj |jd��d�}d}t|�D�]%\}}|jd�}|jdi�} |jd�} |jd �} |jj|�} | std |����|j| �} d j | j�D��cgc] \}}|�d |����c}}�}|d k(r+| r | }|| �d�z }| r|d| �d| �d|�d�z }��|d| �d|�d�z }��| r| |k7r|r|dz }| }|| �d�z }| r|d| �d| �d|�d�z }��|d| �d|�d�z }��(|r|dz }t|d�5}|j|�ddd�t j#d|���|Scc}}w#1swY�)xYw)a� Combine multiple models using CSG operations. Args: operations: List of operations, each containing: - model_type: Type of model - parameters: Parameters for the model - operation: CSG operation (union, difference, intersection) - transform: Optional transformation to apply Returns: Path to the generated SCAD file r9z// Combined model include <�basic_shapes.scadz>; Nr5r6� operation� transformr:�, �=rz() { z � �(�); z} z} r;z"Generated combined OpenSCAD code: )r<r=r>r-r?r@r r � enumeraterAr/rBrCrUrErFrGrH)r1rZrIrJrM� current_op�i�opr5r6r]r^rKrL�k�v� params_strrNs r2�combine_modelsz$OpenSCADCodeGenerator.combine_models�sU���t�z�z�|�$���G�G�L�L����X�J�e�2D�E� � � �'�'�,�,�t�.�.�0C� D� E�F�� � � ��z�*�E�A�r���� �-�J���� �b�1�J����{�+�I����{�+�I��/�/�3�3�J�?�K�� �#;�J�<�!H�I�I��.�.�z�:�K����;�;L�;L�;N�#O�;N�4�1�a�q�c��1�#�J�;N�#O�P�J��A�v��!*�J��I�;�g�!6�6�I���4� �{�!�K�=��*��T�!R�R�I��4� �}�A�j�\��!F�F�I���j�!8�!�!�W�,� �!*�J��I�;�g�!6�6�I���4� �{�!�K�=��*��T�!R�R�I��4� �}�A�j�\��!F�F�I�S+�X � �� �I��)�S� !�Q� �G�G�I� �"� � � �8�� �D�E����K$P�B"� !�s�,G6 �G<�<Hc�~�i}|j�D]�\}}|jj||�}t|t�rt |�j �||<�Ot|t �rD|j �dk(s|j �dk(r|j �||<��d|�d�||<��|||<��|S)z7Map natural language parameters to OpenSCAD parameters.�true�false�")rUr0rA� isinstance�boolr<�lower)r1r6rL�param�value� scad_params r2rCz%OpenSCADCodeGenerator._map_parameters�s���� �&�,�,�.�L�E�5��+�+�/�/��u�=�J��%��&�*-�e�*�*:�*:�*<� �J�'��E�3�'��;�;�=�F�*�e�k�k�m�w�.F�.3�k�k�m�K� �+�12�%���l�K� �+�*/� �J�'�/� �r4rKc�:�dtjj|jd��d�}|j �D]\}}||�d|�d�z }�|d|�d�z }|j �D�cgc] }|�d|���� }}|d j|�z }|d z }|Scc}w) z4Generate OpenSCAD code for a module with parameters.z$// Generated OpenSCAD code include <r\z>; // Parameters z = z; z // Model rbr`r_rc)r-r?r@r rU�keys)r1rKr6rMrsrt� param_lists r2rDz)OpenSCADCodeGenerator._generate_scad_code�s��� � �'�'�,�,�t�.�.�0C� D� E�F�� �'�,�,�.�L�E�5� �E�7�#�e�W�C�0� 0�I�/� �|�K�=��2�2� �7A�o�o�6G�H�6G�U���q���(�6G� �H��T�Y�Y�z�*�*� ��V�� ���� Is�-BN)�__name__� __module__� __qualname__�__doc__r<r3rrrOrYrrkrCrD�r4r2r r s���� . �3�. �C�. �`����c�3�h���C��B'�S�'�d�3��8�n�'��'�RN��d�3��8�n�)=�N�#�N�`�$�s�C�x�.��T�#�s�(�^��,�s���S�#�X���SV�r4r ) r-�loggingr=�typingrrrrr� getLoggerryrGr r}r4r2�<module>r�s2�� �� �3�3� �� � �8� $��|�|r4

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