
    ,j&                         d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZmZ d	Zd
ZdZ G d de          Z G d de          Zd ZdS )z1
A special directive for including a cq object.

    N)dumps)	exportersAssemblyCompoundColorSketch)cqgi)toJSON)DEFAULT_COLOR)
directives	Directivez

.. raw:: html

    <div class="cq" style="text-align:%(txt_align)s;float:left;">
        %(out_svg)s
    </div>
    <div style="clear:both;">
    </div>

a  
const RENDERERS = {};
var ID =  0;

const renderWindow = vtk.Rendering.Core.vtkRenderWindow.newInstance();
const openglRenderWindow = vtk.Rendering.OpenGL.vtkRenderWindow.newInstance();
renderWindow.addView(openglRenderWindow);

const rootContainer = document.createElement('div');
rootContainer.style.position = 'fixed';
//rootContainer.style.zIndex = -1;
rootContainer.style.left = 0;
rootContainer.style.top = 0;
rootContainer.style.pointerEvents = 'none';
rootContainer.style.width = '100%';
rootContainer.style.height = '100%';

openglRenderWindow.setContainer(rootContainer);

const interact_style = vtk.Interaction.Style.vtkInteractorStyleManipulator.newInstance();

const manips = {
    rot: vtk.Interaction.Manipulators.vtkMouseCameraTrackballRotateManipulator.newInstance(),
    pan: vtk.Interaction.Manipulators.vtkMouseCameraTrackballPanManipulator.newInstance(),
    zoom1: vtk.Interaction.Manipulators.vtkMouseCameraTrackballZoomManipulator.newInstance(),
    zoom2: vtk.Interaction.Manipulators.vtkMouseCameraTrackballZoomManipulator.newInstance(),
    roll: vtk.Interaction.Manipulators.vtkMouseCameraTrackballRollManipulator.newInstance(),
};

manips.rot.setUseFocalPointAsCenterOfRotation(true);
manips.zoom1.setControl(true);
manips.zoom2.setButton(3);
manips.roll.setShift(true);
manips.pan.setButton(2);

for (var k in manips){{
    interact_style.addMouseManipulator(manips[k]);
}};

const interactor = vtk.Rendering.Core.vtkRenderWindowInteractor.newInstance();
interactor.setView(openglRenderWindow);
interactor.initialize();
interactor.setInteractorStyle(interact_style);

document.addEventListener('DOMContentLoaded', function () {
    document.body.appendChild(rootContainer);
});

function updateViewPort(element, renderer) {
  const { innerHeight, innerWidth } = window;
  const { x, y, width, height } = element.getBoundingClientRect();
  const viewport = [
    x / innerWidth,
    1 - (y + height) / innerHeight,
    (x + width) / innerWidth,
    1 - y / innerHeight,
  ];
  renderer.setViewport(...viewport);
}

function recomputeViewports() {
  const rendererElems = document.querySelectorAll('.renderer');
  for (let i = 0; i < rendererElems.length; i++) {
    const elem = rendererElems[i];
    const { id } = elem;
    const renderer = RENDERERS[id];
    updateViewPort(elem, renderer);
  }
  renderWindow.render();
}

function resize() {
  rootContainer.style.width = `${window.innerWidth}px`;
  openglRenderWindow.setSize(window.innerWidth, window.innerHeight);
  recomputeViewports();
}

window.addEventListener('resize', resize);
document.addEventListener('scroll', recomputeViewports);


function enterCurrentRenderer(e) {
  interactor.bindEvents(document.body);
  interact_style.setEnabled(true);
  interactor.setCurrentRenderer(RENDERERS[e.target.id]);
}

function exitCurrentRenderer(e) {
  interactor.setCurrentRenderer(null);
  interact_style.setEnabled(false);
  interactor.unbindEvents();
}


function applyStyle(element) {
  element.classList.add('renderer');
  element.style.width = '100%';
  element.style.height = '100%';
  element.style.display = 'inline-block';
  element.style.boxSizing = 'border';
  return element;
}

window.addEventListener('load', resize);

function render(data, parent_element, ratio){

    // Initial setup
    const renderer = vtk.Rendering.Core.vtkRenderer.newInstance({ background: [1, 1, 1 ] });

    // iterate over all children children
    for (var el of data){
        var trans = el.position;
        var rot = el.orientation;
        var rgba = el.color;
        var shape = el.shape;

        // load the inline data
        var reader = vtk.IO.XML.vtkXMLPolyDataReader.newInstance();
        const textEncoder = new TextEncoder();
        reader.parseAsArrayBuffer(textEncoder.encode(shape));

        // setup actor,mapper and add
        const mapper = vtk.Rendering.Core.vtkMapper.newInstance();
        mapper.setInputConnection(reader.getOutputPort());
        mapper.setResolveCoincidentTopologyToPolygonOffset();
        mapper.setResolveCoincidentTopologyPolygonOffsetParameters(0.5,100);

        const actor = vtk.Rendering.Core.vtkActor.newInstance();
        actor.setMapper(mapper);

        // set color and position
        actor.getProperty().setColor(rgba.slice(0,3));
        actor.getProperty().setOpacity(rgba[3]);

        actor.rotateZ(rot[2]*180/Math.PI);
        actor.rotateY(rot[1]*180/Math.PI);
        actor.rotateX(rot[0]*180/Math.PI);

        actor.setPosition(trans);

        renderer.addActor(actor);

    };

    //add the container
    const container = applyStyle(document.createElement("div"));
    parent_element.appendChild(container);
    container.addEventListener('mouseenter', enterCurrentRenderer);
    container.addEventListener('mouseleave', exitCurrentRenderer);
    container.id = ID;

    renderWindow.addRenderer(renderer);
    updateViewPort(container, renderer);
    renderer.getActiveCamera().set({ position: [1, -1, 1], viewUp: [0, 0, 1] });
    renderer.resetCamera();

    RENDERERS[ID] = renderer;
    ID++;
};
aL  

.. raw:: html

    <div class="cq-vtk"
     style="text-align:{txt_align};float:left;border: 1px solid #ddd; width:{width}; height:{height}">
       <script>
       var parent_element = {element};
       var data = {data};
       render(data, parent_element);
       </script>
    </div>
    <div style="clear:both;">
    </div>

c                   2    e Zd ZdZdZdZdej        iZd Z	dS )cq_directiveTr   alignc                    | j         }| j        }| j        }d                    |          }d}	 t	          j        |                                          }|j        r1t          j	        t          j
        |j        j                            }n|j        n6# t          $ r) t          j                     t          j                    }Y nw xY wg }|                    dd          }d}d|v r|d         }|                    t(          t+                      z                      d                     |                    ddg           |                    d |                    d          D                        |                    d           t1          |          r.|                    ||j                            d                     g S )	N
z8Your Script Did not assign call build_output() function! leftr   ::c                 <    g | ]}d |                                 z  S z    %srstrip.0rows     O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/cadquery/cq_directive.py
<listcomp>z$cq_directive.run.<locals>.<listcomp>  %    OOO#h-OOO    r   )optionscontentstate_machinejoinr	   parsebuildsuccessr   getSVG
toCompoundfirst_resultshape	exception	Exception	traceback	print_exc
format_excreplaceextendtemplatelocalssplitappendleninsert_inputinput_linessource)	selfr!   r"   r#   	plot_codeout_svgresultlines	txt_aligns	            r   runzcq_directive.run   s   ,,* IIg&&	
 M	-Z	**0022F~ '#*()<)BCC  &&	   	- 	- 	-!!!*,,GGG	-  //$++	g(Ih)0066777dBZ   OO9N9NOOOPPPRu:: 	S&&um.G.N.Nq.Q.QRRR	s   A%B 0CCN)
__name__
__module____qualname__has_contentrequired_argumentsoptional_argumentsr   	unchangedoption_specrA    r    r   r   r      sC        K%K0 0 0 0 0r    r   c                   V    e Zd ZdZdZdZej        ej        ej	        ej	        dZ
d ZdS )cq_directive_vtkTr   )heightwidthr   selectc                 
   | j         }| j        }| j        }d                    |          }	 t	          j        |                                          }|j        r|j        r|j        j	        }n!|j
        |                    dd                   }t          |t                    r|}n]t          |t                    r#t          |j        t!          t"                     }n%t          |t!          t"                     }n|j        nF# t&          $ r9 t)          j                     t          t-          j        ddd                    }Y nw xY wg }t1          t3          |                    }	|                    t6                              |	d|                    d	d
          |                    dd          |                    dd                                                               |                    ddg           |                    d |                    d          D                        |                    d           tA          |          r.|!                    ||j"        #                    d                     g S )Nr   rO   r>   )colorz
CQGI error
      z!document.currentScript.parentNoder   r   rN   z100%rM   500px)dataelementr@   rN   rM   r   r   c                 <    g | ]}d |                                 z  S r   r   r   s     r   r   z(cq_directive_vtk.run.<locals>.<listcomp>I  r   r    r   )$r!   r"   r#   r$   r	   r%   r&   r'   r*   r+   envget
isinstancer   r   _facesr   r   r,   r-   r.   r/   r   makeTextr   r
   r2   template_vtkformat
splitlinesr5   r6   r7   r8   r9   r:   )
r;   r!   r"   r#   r<   r>   r+   assyr?   rU   s
             r   rA   zcq_directive_vtk.run  s`   ,,* IIg&&		DZ	**0022F~ '& H"/5EE"Jw{{8X'F'FGEeX.. H DDv.. H#EL}8MNNNDD#E1FGGGDD&& 	D 	D 	D!!!H-lBBBCCDDD	D
 VD\\"";!++gv66kk'622{{8W55     jll	
 	
 	
 	dBZ   OO9N9NOOOPPPRu:: 	S&&um.G.N.Nq.Q.QRRR	s   CD A EEN)rB   rC   rD   rE   rF   rG   r   length_or_unitless length_or_percentage_or_unitlessrH   rI   rA   rJ   r    r   rL   rL     sX        K/<%&	 K6 6 6 6 6r    rL   c                 0   | t           _        | j        t           _        | j        t           _        |                     dt
                     |                     dt                     |                     d           |                     d t                     d S )Ncq_plotcadqueryzvtk.js)body)	setupappconfigconfdiradd_directiver   rL   add_js_filerendering_code)rh   s    r   rg   rg   R  sx    EI:ELKEMi...j"2333 OOHOOD~O.....r    )__doc__r.   jsonr   re   r   r   r   r   r   r	   cadquery.occ_impl.assemblyr
   cadquery.occ_impl.jupyter_toolsr   docutils.parsers.rstr   r   r3   rm   r]   r   rL   rg   rJ   r    r   <module>rs      s5   
           A A A A A A A A A A A A A A       - - - - - - 9 9 9 9 9 9 6 6 6 6 6 6 6 6
`F$9 9 9 9 99 9 9 9xB B B B By B B BJ
/ 
/ 
/ 
/ 
/r    