
    'j+                       d dl mZ d dlmZmZ d dlZd dlZd dlZd dl	m
ZmZmZ d dl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 d
lmZ  G d dej                   Z!ej"        j#        d z   Z$ej"        j#        dz   Z% G d de          Z& G d de&          Z' G d de&          Z( G d dej)                  Z* G d dej+                  Z,d&dZ-d'd"Z.d(d%Z/dS ))    )annotations)OptionalIterableN)QtCoreQtGui	QtWidgets)BackendBkPath2d
BkPoints2d	ImageData)Configuration)Color)BackendProperties)Vec2Matrix44)to_qpainter_pathc                  8     e Zd ZdZd fdZ	 dddZddZ xZS )_PointzTA dimensionless point which is drawn 'cosmetically' (scale depends on
    view)
    xfloatybrush	qg.QBrushc                    t                                                       t          j        ||          | _        d| _        |                     t          j        t          j	        j
                             |                     |           d S )Ng      ?)super__init__qcQPointFlocationradiussetPenqgQPenQtNoPensetBrush)selfr   r   r   	__class__s       S/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/addons/drawing/pyqt.pyr   z_Point.__init__   sk    
1a((BGBEK(()))e    Npainterqg.QPainteroptionqw.QStyleOptionGraphicsItemwidgetOptional[qw.QWidget]returnNonec                *   t          |                                          }| j        |z  }|                    |                                            |                    t          j        j                   |	                    | j
        ||           d S N)_get_x_scale	transformr    r&   r   r!   r   r$   r%   drawEllipser   )r'   r+   r-   r/   
view_scaler    s         r)   paintz_Point.paint    s{     "'"3"3"5"566
z)&&&ru{###DM66:::::r*   	qc.QRectFc                \    t          j        | j        t          j        dd                    S )N   )r   QRectFr   QSizeFr'   s    r)   boundingRectz_Point.boundingRect,   s     y	!Q888r*   )r   r   r   r   r   r   r4   r+   r,   r-   r.   r/   r0   r1   r2   )r1   r:   )__name__
__module____qualname____doc__r   r9   r@   __classcell__r(   s   @r)   r   r      sy               (,	
; 
; 
; 
; 
;9 9 9 9 9 9 9 9r*   r   r<   c                       e Zd ZdZd3 fdZd4 fd	Zd5d
Zd6dZej	        d6d            Z
d7dZd8dZd9dZd:dZd;dZd<d!Zd=d$Zd>d'Zd?d*Zd@d-ZdAd0ZdBd1ZdB fd2Z xZS )C_PyQtBackendz
    Abstract PyQt backend which uses the :mod:`PySide6` package to implement an
    interactive viewer. The :mod:`PyQt5` package can be used as fallback if the
    :mod:`PySide6` package is not available.
    sceneqw.QGraphicsScenec                   t                                                       || _        i | _        t	          j        t          j        j                  | _	        t	          j
        t          j        j                  | _        d S r4   )r   r   _scene_color_cacher"   r#   r   r$   r%   _no_lineQBrushNoBrush_no_fillr'   rJ   r(   s     r)   r   z_PyQtBackend.__init__<   sV    46,,	"%-00r*   configr   r1   r2   c                    |j         |                    d          }t                                          |           d S )NgQ?)min_lineweight)rV   with_changesr   	configure)r'   rT   r(   s     r)   rX   z_PyQtBackend.configureC   s@     ((((==F&!!!!!r*   c                    || _         d S r4   )rM   )r'   rJ   s     r)   	set_scenez_PyQtBackend.set_sceneH   s    r*   itemqw.QGraphicsItementity_handlestrc                f    |                      ||           | j                            |           d S r4   )set_item_datarM   addItemr'   r[   r]   s      r)   	_add_itemz_PyQtBackend._add_itemK   s4    4///D!!!!!r*   c                    d S r4    rb   s      r)   r`   z_PyQtBackend.set_item_dataO   s    r*   colorr   	qg.QColorc                F   	 | j         |         S # t          $ r Y nw xY wt          |          dk    rt          j        |          }nPt          |          dk    r.|dd         }|dd         }t          j        d| |           }nt          |          || j         |<   |S )N   	   r<   #)rN   KeyErrorlenr"   QColor	TypeError)r'   rf   qt_colorrgbalphas        r)   
_get_colorz_PyQtBackend._get_colorS   s    	$U++ 	 	 	D	u::??y''HHZZ1__!*C!A#JEy!1U!1C!1!122HHE"""#+% s    

propertiesr   qg.QPenc                    |j         dz  | j        j        z  }t          j        |                     |j                  |          }|                    d           |                    t          j
        j                   |S )z^Returns a cosmetic pen with applied lineweight but without line type
        support.
        g&S?T)
lineweightrT   lineweight_scalingr"   r#   rs   rf   setCosmeticsetJoinStyler   r$   	RoundJoin)r'   rt   pxpens       r)   _get_penz_PyQtBackend._get_pend   sj     "V+dk.LLgdooj&677<<)))
r*   r   c                p    t          j        |                     |          t          j        j                  S r4   )r"   rP   rs   r   r$   SolidPatternr'   rf   s     r)   _get_fill_brushz_PyQtBackend._get_fill_brusho   s%    y//1CDDDr*   c                    | j                             t          j        |                     |                               d S r4   )rM   setBackgroundBrushr"   rP   rs   r   s     r)   set_backgroundz_PyQtBackend.set_backgroundr   s4    &&ry1G1G'H'HIIIIIr*   posr   c                    |                      |j                  }t          |j        |j        |          }|                     ||j                   dS )z Draw a real dimensionless point.N)r   rf   r   r   r   rc   handle)r'   r   rt   r   r[   s        r)   
draw_pointz_PyQtBackend.draw_pointu   sJ    $$Z%566ceSUE**tZ./////r*   startendc                <   |                     |          r|                     ||           d S t          j        |j        |j        |j        |j                  }|                    |                     |                     |                     ||j	                   d S r4   )
iscloser   qwQGraphicsLineItemr   r   r!   r~   rc   r   )r'   r   r   rt   r[   s        r)   	draw_linez_PyQtBackend.draw_line{   s    == 	4OOE:.....'#%GGDKKj11222NN4!233333r*   linesIterable[tuple[Vec2, Vec2]]c                H   |                      |          }| j        }|D ]\  }}|                    |          r|                     ||           1t	          j        |j        |j        |j        |j                  }|                    |            |||j	                   dS )zDFast method to draw a bunch of solid lines with the same properties.N)
r~   rc   r   r   r   r   r   r   r!   r   )r'   r   rt   r}   add_lineser[   s           r)   draw_solid_linesz_PyQtBackend.draw_solid_lines   s     mmJ''> 	2 	2DAqyy|| 2:....+ACac13??C   z01111	2 	2r*   pathr
   c                .   t          |          dk    rd S t          j        t          |g                    }|                    |                     |                     |                    | j                   |                     ||j	                   d S Nr   )
rm   r   QGraphicsPathItemr   r!   r~   r&   rR   rc   r   )r'   r   rt   r[   s       r)   	draw_pathz_PyQtBackend.draw_path   s    t99>>F#$4dV$<$<==DMM*--...dm$$$tZ./////r*   pathsIterable[BkPath2d]c                f   t          |          }t          |          dk    rd S t          t          |                    }|                    |                     |                     |                    |                     |j                             | 	                    ||j
                   d S r   )listrm   _CosmeticPathr   r!   r~   r&   r   rf   rc   r   )r'   r   rt   _pathsr[   s        r)   draw_filled_pathsz_PyQtBackend.draw_filled_paths   s    
 ev;;!F-f5566DMM*--...d**:+;<<===tZ./////r*   pointsr   c                   |                      |j                  }t          j                    }|                                D ]4}|                    t          j        |j        |j	                             5t          |          }|                    | j                   |                    |           |                     ||j                   d S r4   )r   rf   r"   	QPolygonFverticesappendr   r   r   r   _CosmeticPolygonr!   rO   r&   rc   r   )r'   r   rt   r   polygonpr[   s          r)   draw_filled_polygonz _PyQtBackend.draw_filled_polygon   s     $$Z%566,.."" 	1 	1ANN2:ac13//0000((DM"""etZ./////r*   
image_datar   c           	     D   |j         }|j        }|j        \  }}}|dk    sJ ||z  }t          j        t          j        |d                    }t          j        t          j        |j	        |||t          j        j
        j                            }	t          j                    }
|
                    |	           |
                    t           j        j        j                   |
                    t+          |                     |                     |
|j                   d S )N   r   )axis)imager6   shapenpascontiguousarrayflipr"   QPixmapQImagedataFormatFormat_RGBA8888r   QGraphicsPixmapItem	setPixmapsetTransformationModer   r$   TransformationModeSmoothTransformationsetTransform_matrix_to_qtransformrc   r   )r'   r   rt   r   r6   heightwidthdepthbytes_per_rowpixmapr[   s              r)   
draw_imagez_PyQtBackend.draw_image   s    (	${uzzzz$RWU%;%;%;<<I
	 0 
 
 %''v""25#;#PQQQ/	::;;;tZ./////r*   c                8    | j                                          d S r4   )rM   clearr?   s    r)   r   z_PyQtBackend.clear   s    r*   c                    t                                                       | j                            | j                                                   d S r4   )r   finalizerM   setSceneRectitemsBoundingRect)r'   r(   s    r)   r   z_PyQtBackend.finalize   sC      !>!>!@!@AAAAAr*   )rJ   rK   )rT   r   r1   r2   )rJ   rK   r1   r2   r[   r\   r]   r^   r1   r2   )rf   r   r1   rg   )rt   r   r1   ru   )rf   r   r1   r   )rf   r   )r   r   rt   r   r1   r2   )r   r   r   r   rt   r   r1   r2   )r   r   rt   r   )r   r
   rt   r   r1   r2   )r   r   rt   r   r1   r2   )r   r   rt   r   r1   r2   )r   r   rt   r   r1   r2   )r1   r2   )rB   rC   rD   rE   r   rX   rZ   rc   abcabstractmethodr`   rs   r~   r   r   r   r   r   r   r   r   r   r   r   rF   rG   s   @r)   rI   rI   5   s        1 1 1 1 1 1" " " " " "
   " " " " 	      "	 	 	 	E E E EJ J J J0 0 0 04 4 4 42 2 2 2 0 0 0 00 0 0 0
0 
0 
0 
00 0 0 0,   B B B B B B B B B Br*   rI   c                  0     e Zd ZdZ	 dd fdZddZ xZS )PyQtBackendaM  
    Backend which uses the :mod:`PySide6` package to implement an interactive
    viewer. The :mod:`PyQt5` package can be used as fallback if the :mod:`PySide6`
    package is not available.

    Args:
        scene: drawing canvas of type :class:`QtWidgets.QGraphicsScene`,
            if ``None`` a new canvas will be created
    NrJ   Optional[qw.QGraphicsScene]c                p    t                                          |pt          j                               d S r4   r   r   r   QGraphicsScenerS   s     r)   r   zPyQtBackend.__init__   1     	5""3"5"566666r*   r[   r\   r]   r^   r1   r2   c                    t          d | j        d d         D                       }| j        }|                    t          |           |                    t
          |           d S )Nc              3      K   | ]	\  }}|V  
d S r4   re   ).0r   propss      r)   	<genexpr>z,PyQtBackend.set_item_data.<locals>.<genexpr>   s&      FF81eQFFFFFFr*   )tupleentity_stackcurrent_entitysetDataCorrespondingDXFEntityCorrespondingDXFParentStack)r'   r[   r]   parent_stackr   s        r)   r`   zPyQtBackend.set_item_data   sb    FFt/@"/EFFFFF,+^<<<0,?????r*   r4   rJ   r   r   rB   rC   rD   rE   r   r`   rF   rG   s   @r)   r   r      sm          .27 7 7 7 7 7 7@ @ @ @ @ @ @ @r*   r   c                  0     e Zd ZdZ	 dd fdZddZ xZS )PyQtPlaybackBackenda  
    Backend which uses the :mod:`PySide6` package to implement an interactive
    viewer. The :mod:`PyQt5` package can be used as fallback if the :mod:`PySide6`
    package is not available.

    This backend can be used a playback backend for the :meth:`replay` method of the
    :class:`Player` class

    Args:
        scene: drawing canvas of type :class:`QtWidgets.QGraphicsScene`,
            if ``None`` a new canvas will be created
    NrJ   r   c                p    t                                          |pt          j                               d S r4   r   rS   s     r)   r   zPyQtPlaybackBackend.__init__   r   r*   r[   r\   r]   r^   r1   r2   c                <    |                     t          |           d S r4   )r   r   rb   s      r)   r`   z!PyQtPlaybackBackend.set_item_data  s    +];;;;;r*   r4   r   r   r   rG   s   @r)   r   r      se          .27 7 7 7 7 7 7< < < < < < < <r*   r   c                  $     e Zd Z	 dd fd
Z xZS )r   Nr+   r,   r-   r.   r/   r0   r1   r2   c                n    t          | |           t                                          |||           d S r4   _set_cosmetic_brushr   r9   r'   r+   r-   r/   r(   s       r)   r9   z_CosmeticPath.paint  5     	D'***gvv.....r*   r4   rA   rB   rC   rD   r9   rF   rG   s   @r)   r   r     G        
 (,	/ / / / / / / / / / /r*   r   c                  $     e Zd Z	 dd fd
Z xZS )r   Nr+   r,   r-   r.   r/   r0   r1   r2   c                n    t          | |           t                                          |||           d S r4   r   r   s       r)   r9   z_CosmeticPolygon.paint  r   r*   r4   rA   r   rG   s   @r)   r   r     r   r*   r   r[   qw.QAbstractGraphicsShapeItemr+   r,   r1   r2   c                    |                                  }|                    |                                                                d                             dd                     |                     |           dS )z[like a cosmetic pen, this sets the brush pattern to appear the same independent of the viewr   r<   r   N)r   r   r6   invertedscaler&   )r[   r+   r   s      r)   r   r   !  sl     JJLLE 
w((**3355a8>>q"EEFFFMM%r*   tqg.QTransformr   c                    t          j        |                                 |                                 z  |                                 |                                 z  z             S r4   )mathsqrtm11m21)r   s    r)   r5   r5   ,  sA    9QUUWWquuww&15577)::;;;r*   matrixr   c                B    t          j        |                                  S )at  Qt also uses row-vectors so the translation elements are placed in the
    bottom row.

    This is only a simple conversion which assumes that although the
    transformation is 4x4,it does not involve the z axis.

    A more correct transformation could be implemented like so:
    https://stackoverflow.com/questions/10629737/convert-3d-4x4-rotation-matrix-into-2d
    )r"   
QTransformget_2d_transformation)r   s    r)   r   r   0  s     =&668899r*   )r[   r   r+   r,   r1   r2   )r   r   r1   r   )r   r   r1   r   )0
__future__r   typingr   r   r   r   numpyr   ezdxf.addons.xqtr   r   r   r"   r   r   ezdxf.addons.drawing.backendr	   r
   r   r   ezdxf.addons.drawing.configr   ezdxf.addons.drawing.type_hintsr   ezdxf.addons.drawing.propertiesr   
ezdxf.mathr   r   ezdxf.npshapesr   QAbstractGraphicsShapeItemr   r$   UserRoler   r   rI   r   r   r   r   QGraphicsPolygonItemr   r   r5   r   re   r*   r)   <module>r     su   # " " " " " % % % % % % % % 



      G G G G G G G G G G Q Q Q Q Q Q Q Q Q Q Q Q 5 5 5 5 5 5 1 1 1 1 1 1 = = = = = = % % % % % % % % + + + + + +9 9 9 9 9R* 9 9 9: !+  enq0 [B [B [B [B [B7 [B [B [B|@ @ @ @ @, @ @ @6< < < < <, < < <:/ / / / /B( / / // / / / /r. / / /   < < < <
: 
: 
: 
: 
: 
:r*   