
    v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y)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                   :    e Zd ZdZdZdZdej                  iZd Z	y)cq_directiveTr   alignc                    | j                   }| j                  }| j                  }dj                  |      }d}	 t	        j
                  |      j                         }|j                  r=t        j                  t        j                  |j                  j                              }n|j                  	 g }|j%                  dd      }d}d|v r|d   }|j'                  t(        t+               z  j-                  d             |j'                  ddg       |j'                  |j-                  d      D 	cg c]  }	d|	j/                         z   c}	       |j1                  d       t3        |      r+|j5                  ||j6                  j9                  d             g S # t        $ r, t        j                           t        j"                         }Y w xY wc c}	w )	N
z8Your Script Did not assign call build_output() function! leftr   ::    %sr   )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rstripappendleninsert_inputinput_linessource)
selfr   r   r   	plot_codeout_svgresultlines	txt_alignrows
             B/DATA/.local/lib/python3.12/site-packages/cadquery/cq_directive.pyrunzcq_directive.run   s   ,,,,** IIg&	
 M	-ZZ	*002F~~#**(()<)<)B)BC &&&	   //$+	g(Ih)0067dBZ 9NO9N#h-9NOPRu:&&um.G.G.N.Nq.QR	1  	-!**,G	-$ Ps   A8F 1G1GGN)
__name__
__module____qualname__has_contentrequired_argumentsoptional_argumentsr   	unchangedoption_specr:        r9   r   r      s*    K%%K0rD   r   c                   |    e Zd ZdZdZdZej                  ej                  ej                  ej                  dZ
d Zy)cq_directive_vtkTr   )heightwidthr   selectc                    | j                   }| j                  }| j                  }dj                  |      }	 t	        j
                  |      j                         }|j                  r|j                  r|j                  j                  }n|j                  |j                  dd         }t        |t              r|}nVt        |t              r"t        |j                  t!        t"               }n$t        |t!        t"               }n|j$                  g }t1        t3        |            }	|j5                  t6        j9                  |	d|j                  d	d
      |j                  dd      |j                  dd            j;                                |j5                  ddg       |j5                  |j=                  d      D 
cg c]  }
d|
j?                         z   c}
       |jA                  d       tC        |      r+|jE                  ||jF                  jI                  d             g S # t&        $ r8 t)        j*                          t        t-        j.                  ddd            }Y Xw xY wc c}
w )Nr   rI   r5   )colorz
CQGI error
      z!document.currentScript.parentNoder   r   rH   z100%rG   500px)dataelementr7   rH   rG   r   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
   r(   template_vtkformat
splitlinesr+   r,   r-   r.   r/   r0   r1   )r2   r   r   r   r3   r5   r!   assyr6   rO   r8   s              r9   r:   zcq_directive_vtk.run  s   ,,,,** IIg&		DZZ	*002F~~&&"//55E"JJw{{8X'FGEeX. Dv.#ELL}8MND#E1FGD&&& VD\";!++gv6kk'62{{8W5    jl	
 	dBZ 9NO9N#h-9NOPRu:&&um.G.G.N.Nq.QR	5  	D!H--lBBCD	D( Ps   CH) ?I-)=I*)I*N)r;   r<   r=   r>   r?   r@   r   length_or_unitless length_or_percentage_or_unitlessrA   rB   r:   rC   rD   r9   rF   rF     sC    K//<<%%&&	K6rD   rF   c                    | t         _        | j                  t         _        | j                  t         _        | j	                  dt
               | j	                  dt               | j                  d       | j                  d t               y )Ncq_plotcadqueryzvtk.js)body)	setupappconfigconfdiradd_directiver   rF   add_js_filerendering_code)ra   s    r9   r`   r`   R  s^    EI::ELKKEMi.j"23 OOHOOD~O.rD   )__doc__r$   jsonr   r^   r   r   r   r   r   r	   cadquery.occ_impl.assemblyr
   cadquery.occ_impl.jupyter_toolsr   docutils.parsers.rstr   r   r)   rf   rV   r   rF   r`   rC   rD   r9   <module>rl      s\   
   A A  - 9 6
`F$99 9xBy BJ
/rD   