Skip to main content
Glama

MCP-Blender

by shdann
vefrank_blender_bridge.cpython-312.pyc17.9 kB
� ���h =��@�dZddlZddlZddlZddlmZddlmZmZm Z m Z ddl Z ddl Z ddl Z ejjdeee�j$j$��ddlmZddlmZGd�d�Zd �Zed k(rej2e��yy) zz VeFrank-Blender Bridge: Enhanced Integration Combines VeFrank's zero-token asset generation with Blender's visualization �N)�Path)�Dict�Any�Optional�List)�DynamicAssetGenerator)�list_available_componentsc �,�eZdZdZd�Zdefd�Zdeee fdeee ffd�Z ddededeee ffd �Z d ed edeee ffd �Z dd ed edeee ffd�Z d edeedeee ffd�Zddedeee ffd�Z ddedededeee ffd�Zddedeee ffd�Zy)�VeFrankBlenderBridgezJBridge between VeFrank's efficient generation and Blender's visualization.c�d�t�|_d|_d|_i|_ddgdd�|_y)N� localhosti�&r)�total_generated� cache_hits�generation_time_ms� token_usage)r� generator� blender_host� blender_port� assets_cache�generation_stats)�selfs �<D:\repos\VeFrank\VeFrank\mcp-blend\vefrank_blender_bridge.py�__init__zVeFrankBlenderBridge.__init__s:��.�0���'��� ������ ��"$�� ! ����returnc�� tjtjtj�}|jd�|j |j |j f�}|j�|dk(S#YyxYw)z$Check if Blender addon is connected.�rF)�socket�AF_INET� SOCK_STREAM� settimeout� connect_exrr�close)r�sock�results r�is_blender_connectedz)VeFrankBlenderBridge.is_blender_connected%si�� ��=�=�����1C�1C�D�D� �O�O�A� ��_�_�d�&7�&7��9J�9J�%K�L�F� �J�J�L��Q�;� �� ��s �A>B�B�commandc��lK� tj|j|j��d{���\}}t j |�}|j |jd��|j��d{���|j�|j��d{���|jd��d{���}|j��d{���t j|jd��S7��7��7�]7�F7�0#t$r}ddt|���d�cYd}~Sd}~wwxYw�w)zSend command to Blender addon.Nzutf-8i �errorz$Failed to communicate with Blender: ��status�message)�asyncio�open_connectionrr�json�dumps�write�encode�drainr#� wait_closed�read�loads�decode� Exception�str)rr'�reader�writer� command_json� response_data�es r�send_to_blenderz$VeFrankBlenderBridge.send_to_blender0s ���� �#*�#:�#:��!�!�4�#4�#4�$��N�F�F�  �:�:�g�.�L� �L�L��,�,�W�5� 6��,�,�.� � � �L�L�N��$�$�&� &� &�#)�+�+�d�"3�3�M��$�$�&� &� &��:�:�m�2�2�7�;�<� <��� !�� &��4�� &��� �!�A�#�a�&��J�� �� �s��D4�-D �D�AD �D�'D �)D�*D �D �D �D �'D �D4�D �D �D � D � D � D1�D,�&D1�'D4�,D1�1D4�component_type�variantc ���tj�}|�d|��}||jvr&|jdxxdz cc<|j|S |jj ||�}|ddk7r|S|j dg�}t d�|D�d�}t d �|D�d�}|r|sd d d �St|d �5} | j�} ddd�t|d �5} | j�} ddd�|j dd�} ddi} td�}|jdd��||�d�z }||�d�z }t|d�5} | j �ddd�t|d�5} | j �ddd�tj�|z dz}|jdj|�|jdxxdz cc<d||| | gt|�t|�d�|ddd�d�}||j|<|S#1swY��CxYw#1swY��+xYw#1swY��xYw#1swY��xYw#t$r}d t|�d �cYd}~Sd}~wwxYw)z7Generate component using VeFrank's zero-token approach.�_rrr+�success� files_createdc3�DK�|]}|jd�s�|���y�w)�.objN��endswith��.0�fs r� <genexpr>zBVeFrankBlenderBridge.generate_component_locally.<locals>.<genexpr>^�����D��1����F�1C�Q���� � Nc3�DK�|]}|jd�s�|���y�w)�.mtlNrHrJs rrMzBVeFrankBlenderBridge.generate_component_locally.<locals>.<genexpr>_rNrOr)z Failed to generate OBJ/MTL filesr*�r�shape�unknown� generatedTz../assets/3d_models/automotive)�parents�exist_okrGrQ�wi�rr)�obj�mtlr�dynamic_discovery)rr�method)r+r@rArS� dimensions� connectors�files�stats)�timerrr�generate_component�get�next�openr5r�mkdirr1�appendr9r8)rr@rA� start_time� cache_keyr%r_�obj_file�mtl_filerL� obj_content� mtl_contentrSr]� assets_dir�obj_path�mtl_path�generation_timer>s r�generate_component_locallyz/VeFrankBlenderBridge.generate_component_locallyIs����Y�Y�[� �&�&�a��y�1� � ��)�)� )� � !� !�,� /�1� 4� /��$�$�Y�/� /�J ��^�^�6�6�~�w�O�F��h��9�,�� ��J�J���3�E��D��D�d�K�H��D��D�d�K�H��8�%�A��� �h��$���f�f�h� �%��h��$���f�f�h� �%��J�J�w� �2�E�%�t�,�J��>�?�J� � � �T�D� � 9�!�~�&6�d�$;�;�H�!�~�&6�d�$;�;�H��h��$����� �$�%��h��$����� �$�%� $�y�y�{�Z�7�4�?�O� � !� !�"6� 7� >� >�� O� � !� !�"3� 4�� 9� 4�$�"0�"��(� ��x�=��x�=�� +:�#$�1���F�&,2�D� � �i� (��M�e%�$��%�$��%�$��%�$��>� �!��q�6�� �� �s��%I�7AI�8 I�H�I�)H#�:AI�H0�$I�8H<� B I�H �I�#H-�(I�0H9�5I�<I�I� I)� I$�I)�$I)ro�component_namec��K�|j�sddd�Sdtt|�j��|d�d�}|j |��d{���S7��w)z'Import generated OBJ file into Blender.r)�Blender not connectedr*� import_obj)�filepath�name��type�paramsN)r&r9r�absoluter?)rrorsr's r�import_to_blenderz&VeFrankBlenderBridge.import_to_blender�sf�����(�(�*�!�2�� �!���X�� 7� 7� 9�:�&�� ���)�)�'�2�2�2�2�s�AA�A�A� material_typec���K�|j�sddd�Sgd�ddd�gd�d d d�gd �d d d�gd �ddd�d�}|j||d�}d||d�d�}|j|��d{���S7��w)z%Apply realistic materials in Blender.r)rur*)�ffffff�?r�r���?��������?g�������?)� base_color�metallic� roughness)皙�����?r�r�r�gg333333�?)r�r�r�r�g333333�?)�333333�?r�g)\���(�?r�gffffff�?g�?)�metal�plastic�ceramic�aluminumr��apply_material)� object_name�materialryN)r&rcr?)rrsr~�material_presetsr�r's r�apply_materialsz$VeFrankBlenderBridge.apply_materials�s������(�(�*�!�2�� �3�� �� 3�� �� 3�� �� 6� �!��! ��.$�'�'� �7G��7P�Q��%�-�$�� ���)�)�'�2�2�2�2�s�A&A/�(A-�)A/r^c��zK�|j�sddd�Sd||d�d�}|j|��d{���S7��w)z#Add detailed connectors in Blender.r)rur*�add_connectors)r�r^ryN)r&r?)rrsr^r's r�add_connector_detailsz*VeFrankBlenderBridge.add_connector_details�sT�����(�(�*�!�2�� � %�-�(�� ���)�)�'�2�2�2�2�s �2;�9�;N� output_pathc���K�|j�sddd�S|s!dttj���d�}ddtt |�j ��id�}|j |��d {���S7��w) z/Capture screenshot of current Blender viewport.r)rur*zscreenshots/component_z.png�capture_viewportr�ryN)r&�intrar9rr|r?)rr�r's r�capture_screenshotz'VeFrankBlenderBridge.capture_screenshot�s������(�(�*�!�2�� � �2�3�t�y�y�{�3C�2D�D�I�K�'��s�4� �#4�#=�#=�#?�@�� ���)�)�'�2�2�2�2�s�A4A=�6A;�7A=� auto_importc���K�td|���td�td�|j||�}|ddk7r|Std|ddd �d ��td |d ���td |dd���|�rk|j��rZtd�|j|dd|��d{���}|j d�dk(�r%td�td�d|vrdnd}|j ||��d{���}|j d�dk(rtd|�d��|j d�rWtd�|j ||d��d{���}|j d�dk(rtdt|d��d��td�|j��d{���} | j d�dk(r+td�| j d �|d!<n td"�td#�td$�td%|ddd �d ��td&|dd���td'|jd(���td)|jd*���|S7���7��m7��7�ĭw)+z=Complete pipeline: Generate locally and visualize in Blender.z#VeFrank-Blender Bridge: Generating �2==================================================z3Step 1: Local generation using dynamic discovery...r+rDzSUCCESS: Generated in r`r�.1f�msz Shape: rSz Tokens: rz Step 2: Importing to Blender...r_rYNzSUCCESS: Imported to Blenderz Step 3: Applying materials...� alternatorr�r�zSUCCESS: Applied z materialr^z$ Step 4: Adding connector details...zSUCCESS: Added z connectorsz Step 5: Capturing screenshot...zSUCCESS: Screenshot saved�path� screenshotz2 INFO: Blender not connected - files saved locallyz Efficiency Report:z. Method: Dynamic discovery from vehicle JSONsz Generation Time: z Token Usage: z Cache Hits: rz Total Generated: r) �printrrr&r}rcr�r��lenr�r) rr@rAr�� local_result� import_resultr~�material_result�connector_result�screenshot_results r�generate_and_visualizez+VeFrankBlenderBridge.generate_and_visualize s����� �3�N�3C�D�E� �h�� �C�D��6�6�~�w�O� � �� !�Y� .�� � �&�|�G�'<�=Q�'R�SV�&W�WY�Z�[� � �,�w�/�0�1�2� � �<��0��?�@�A�B� �4�4�4�6� �5� 6�"&�"8�"8��W�%�e�,��#��M� � � ��*�i�7��4�5��7�8�.:�n�.L� �R[� �(,�(<�(<�"�M�)�#��#�&�&�x�0�I�=��-�m�_�I�F�G� �#�#�L�1��A�B�-1�-G�-G�&� �\�(B�.�(�$�(�+�+�H�5��B����L��4N�0O�/P�P[�\�]��9�:�*.�*A�*A�*C�$C�!�$�(�(��2�i�?��5�7�1B�1F�1F�v�1N�L��.� �G� H� �$�%� �>�@� �#�L��$9�:N�$O�PS�#T�TV�W�X� �� �W� 5�m� D�E�F�G� ��t�4�4�\�B�C�D�E� �#�D�$9�$9�:K�$L�#M�N�O���_��#��(��%D�sL�B6I:�8I/�9A I:�I2�AI:�!I5�"AI:�3I8�4B<I:�2I:�5I:�8I:� vehicle_jsonc��DK�|r|jj|�}n t�}tdt |��d��td�g}|D]<}td|���|j |d���d{���}|j |��>td�|D��}td �|D��}td �td �td |�d t |����td|d�d��td|r||z ndd�d��td�d|||d�S7���w)z&Generate all components for a vehicle.zBatch Generation: z componentsr�z Generating: F)r�Nc3�JK�|]}|jd�dk(s�d���y�w)r+rDrN�rc�rKrRs rrMz>VeFrankBlenderBridge.batch_generate_vehicle.<locals>.<genexpr>bs ����L�G�q�q�u�u�X��)�/K��G�s�#�#c3�K�|]:}|jd�dk(r$|jdi�jdd����<y�w)r+rDr`rrNr�r�s rrMz>VeFrankBlenderBridge.batch_generate_vehicle.<locals>.<genexpr>csA����J�!(�A�A�E�E�(�O�y�,H����w��+�/�/�0D�a�H�!(�s�AAz3 ==================================================zBatch Generation Complete:z Successful: �/z Total Time: r�r�z Average Time: rzms per componentz Total Tokens: 0rD)r+�components_generated� total_time_ms�results)r�discover_from_jsonr r�r�r�rg�sum)rr�� componentsr�� componentr%� successful� total_times r�batch_generate_vehiclez+VeFrankBlenderBridge.batch_generate_vehiclePs:���� ����:�:�<�H�J�2�4�J� �"�3�z�?�"3�;�?�@� �h����#�I� �N�9�+�.� /��6�6�y�e�6�T�T�F� �N�N�6� "�$� �L�G�L�L� ��J�!(�J�J� � �o�� �*�,� ��z�l�!�C� �O�+<�=�>� ��z�#�.�b�1�2� � �*��J�!6�!�C� P�P`�a�b� �!�#� �$.�'��  � �U�s�A7D �9D�:B%D )�auto)r�)N)r�T)�__name__� __module__� __qualname__�__doc__r�boolr&rr9rr?rrr}r�rr�r�r�r��rrr r sN��T�  � �d� ��T�#�s�(�^���S�#�X���428�V��V�+.�V�<@��c��N�V�p3��3�/2�3�7;�C��H�~�3�*29�+3�C�+3�+.�+3�=A�#�s�(�^�+3�Z3�#�3�/3�D�z�3�>B�3��8�n�3�&3�C�3�4��S��>�3�*4:�8<�E�3�E�-0�E�15�E�AE�c�3�h��E�N" ��" ��S�RU�X��" rr c ��0K�ddl}|jd��}|jdddd� �|jd d d � �|jddd��|jdtd��|jddd��|j �}t �}|j r8t�}tdt|��d��|D]}td|����y|jr$|j|j��d{���}y|j|j|j��d{���}|ddk(rKtd�|dj!�D])\}}td|�dt#|�j$����+yy7��7�Z�w) zMain entry point for testing.rNzVeFrank-Blender Bridge)� descriptionr��?r�zComponent type to generate)�nargs�default�helpz --variantr�zComponent variant)r�r�z--batch� store_truezGenerate all components)�actionr�z --vehiclez&Vehicle JSON file for batch generation)rzr�z--listzList available componentsz Available Components (z):z - r+rDz Files created:r_z z: )�argparse�ArgumentParser� add_argumentr9� parse_argsr �listr r�r��batchr��vehicler�r�rA�itemsrrx) r��parser�args�bridger��compr%� file_typer�s r�mainr�us������ � $� $�1I� $� J�F� ��� �3� �8��:� ��� �V�/��1� ��� �,�5��7� ��� �#�D��F� �����7��9� � � � �D� !� #�F� �y�y�.�0� � �(��Z��(9��<�=��D� �D���-� �� ����4�4�T�\�\�B�B���4�4� �N�N�D�L�L� � �� �(� �y� (� �$� &�#)�'�?�#8�#8�#:�� �4���9�+�R��T� ���'8�9�:�$;� )�C�� �s%�DF� F� .F�9F�:AF�F�__main__)r�r/�sysr-�pathlibr�typingrrrrr� subprocessrar��insertr9�__file__�parent�utils.asset_generator_dynamicrr r r�r��runr�rr�<module>r�s����  � ���,�,� �� �������3�t�H�~�,�,�3�3�4�5�?�C�\ �\ �~ $;�N �z���G�K�K����r

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/shdann/mcp-blend'

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