
    Og+                       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jD                  jF                  d z   Z$ejD                  jF                  dz   Z% G d de      Z& G d de&      Z' G d de&      Z( G d dejR                        Z* G d dejV                        Z,	 	 	 	 	 	 ddZ-ddZ.ddZ/y)    )annotations)OptionalIterableN)QtCoreQtGui	QtWidgets)BackendBkPath2d
BkPoints2d	ImageData)Configuration)Color)BackendProperties)Vec2Matrix44)to_qpainter_pathc                  F     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)
    c                    t         |           t        j                  ||      | _        d| _        | j                  t        j                  t        j                  j                               | j                  |       y )Ng      ?)super__init__qcQPointFlocationradiussetPenqgQPenQtNoPensetBrush)selfxybrush	__class__s       ^/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/addons/drawing/pyqt.pyr   z_Point.__init__   sP    

1a(BGGBEEKK()e    c                   t        |j                               }| j                  |z  }|j                  | j	                                |j                  t        j                  j                         |j                  | j                  ||       y N)_get_x_scale	transformr   r!   r%   r   r   r   r    drawEllipser   )r"   painteroptionwidget
view_scaler   s         r'   paintz_Point.paint    sc     "'"3"3"56
z)&ruu{{#DMM66:r(   c                j    t        j                  | j                  t        j                  dd            S )N   )r   QRectFr   QSizeFr"   s    r'   boundingRectz_Point.boundingRect,   s!    yy		!Q88r(   )r#   floatr$   r9   r%   	qg.QBrushr*   r.   qg.QPainterr/   zqw.QStyleOptionGraphicsItemr0   zOptional[qw.QWidget]returnNone)r=   z	qc.QRectF)__name__
__module____qualname____doc__r   r2   r8   __classcell__r&   s   @r'   r   r      sB     (,	
;
; ,
; %	
;
 

;9r(   r   r4   c                       e Zd ZdZd fdZd fdZddZddZej                  dd       Z
ddZddZdd	Zdd
ZddZddZ	 	 	 	 ddZddZ	 	 	 	 	 	 d dZ	 	 	 	 	 	 d!dZd"dZd#dZd# fdZ xZS )$_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.
    c                   t         |           || _        i | _        t	        j
                  t        j                  j                        | _	        t	        j                  t        j                  j                        | _        y r*   )r   r   _scene_color_cacher   r   r   r   r    _no_lineQBrushNoBrush_no_fillr"   scener&   s     r'   r   z_PyQtBackend.__init__<   sM    46,		"%%--0r(   c                `    |j                   |j                  d      }t        |   |       y )NgQ?)min_lineweight)rQ   with_changesr   	configure)r"   configr&   s     r'   rS   z_PyQtBackend.configureC   s/      ((((=F&!r(   c                    || _         y r*   )rH   )r"   rO   s     r'   	set_scenez_PyQtBackend.set_sceneH   s	    r(   c                ^    | j                  ||       | j                  j                  |       y r*   )set_item_datarH   addItemr"   itementity_handles      r'   	_add_itemz_PyQtBackend._add_itemK   s$    4/D!r(   c                     y r*    rZ   s      r'   rX   z_PyQtBackend.set_item_dataO   s    r(   c                &   	 | j                   |   S # t        $ r Y nw xY wt        |      dk(  rt        j                  |      }n>t        |      dk(  r%|dd }|dd }t        j                  d| |       }nt        |      || j                   |<   |S )N   	   r4   #)rI   KeyErrorlenr   QColor	TypeError)r"   colorqt_colorrgbalphas        r'   
_get_colorz_PyQtBackend._get_colorS   s    	$$U++ 		u:?yy'HZ1_!*C!AJEyy1UGC5!12HE""#+% s    	c                $   |j                   dz  | j                  j                  z  }t        j                  | j                  |j                        |      }|j                  d       |j                  t        j                  j                         |S )z^Returns a cosmetic pen with applied lineweight but without line type
        support.
        g&S?T)
lineweightrT   lineweight_scalingr   r   rl   rh   setCosmeticsetJoinStyler   r   	RoundJoin)r"   
propertiespxpens       r'   _get_penz_PyQtBackend._get_pend   si     ""V+dkk.L.LLggdooj&6&67<)
r(   c                |    t        j                  | j                  |      t        j                  j
                        S r*   )r   rK   rl   r   r   SolidPatternr"   rh   s     r'   _get_fill_brushz_PyQtBackend._get_fill_brusho   s&    yy/1C1CDDr(   c                ~    | j                   j                  t        j                  | j	                  |                   y r*   )rH   setBackgroundBrushr   rK   rl   ry   s     r'   set_backgroundz_PyQtBackend.set_backgroundr   s&    &&ryy1G'HIr(   c                    | j                  |j                        }t        |j                  |j                  |      }| j                  ||j                         y)z Draw a real dimensionless point.N)rz   rh   r   r#   r$   r]   handle)r"   posrs   r%   r[   s        r'   
draw_pointz_PyQtBackend.draw_pointu   sB    $$Z%5%56ceeSUUE*tZ../r(   c                D   |j                  |      r| j                  ||       y t        j                  |j                  |j
                  |j                  |j
                        }|j                  | j                  |             | j                  ||j                         y r*   )
iscloser   qwQGraphicsLineItemr#   r$   r   rv   r]   r   )r"   startendrs   r[   s        r'   	draw_linez_PyQtBackend.draw_line{   sk    ==OOE:.''#%%GDKKj12NN4!2!23r(   c                b   | j                  |      }| j                  }|D ]  \  }}|j                  |      r| j                  ||       *t	        j
                  |j                  |j                  |j                  |j                        }|j                  |        |||j                          y)zDFast method to draw a bunch of solid lines with the same properties.N)
rv   r]   r   r   r   r   r#   r$   r   r   )r"   linesrs   ru   add_lineser[   s           r'   draw_solid_linesz_PyQtBackend.draw_solid_lines   s     mmJ'>> 	2DAqyy|:.++ACCacc133?C z001	2r(   c                   t        |      dk(  ry t        j                  t        |g            }|j	                  | j                  |             |j                  | j                         | j                  ||j                         y Nr   )
re   r   QGraphicsPathItemr   r   rv   r!   rM   r]   r   )r"   pathrs   r[   s       r'   	draw_pathz_PyQtBackend.draw_path   sa    t9>##$4dV$<=DMM*-.dmm$tZ../r(   c                ,   t        |      }t        |      dk(  ry t        t        |            }|j	                  | j                  |             |j                  | j                  |j                               | j                  ||j                         y r   )listre   _CosmeticPathr   r   rv   r!   rz   rh   r]   r   )r"   pathsrs   _pathsr[   s        r'   draw_filled_pathsz_PyQtBackend.draw_filled_paths   sr    
 ev;!-f56DMM*-.d**:+;+;<=tZ../r(   c                   | j                  |j                        }t        j                         }|j	                         D ];  }|j                  t        j                  |j                  |j                               = t        |      }|j                  | j                         |j                  |       | j                  ||j                         y r*   )rz   rh   r   	QPolygonFverticesappendr   r   r#   r$   _CosmeticPolygonr   rJ   r!   r]   r   )r"   pointsrs   r%   polygonpr[   s          r'   draw_filled_polygonz _PyQtBackend.draw_filled_polygon   s     $$Z%5%56,,." 	1ANN2::acc133/0	1(DMM"etZ../r(   c           	        |j                   }|j                  }|j                  \  }}}|dk(  sJ ||z  }t        j                  t        j
                  |d            }t        j                  t        j                  |j                  |||t        j                  j                  j                              }	t        j                         }
|
j                  |	       |
j                  t         j"                  j$                  j&                         |
j)                  t+        |             | j-                  |
|j.                         y )N   r   )axis)imager,   shapenpascontiguousarrayflipr   QPixmapQImagedataFormatFormat_RGBA8888r   QGraphicsPixmapItem	setPixmapsetTransformationModer   r   TransformationModeSmoothTransformationsetTransform_matrix_to_qtransformr]   r   )r"   
image_datars   r   r,   heightwidthdepthbytes_per_rowpixmapr[   s              r'   
draw_imagez_PyQtBackend.draw_image   s      ((	${{uzz$$RWWU%;<II

		  00
 %%'v""255#;#;#P#PQ/	:;tZ../r(   c                8    | j                   j                          y r*   )rH   clearr7   s    r'   r   z_PyQtBackend.clear   s    r(   c                    t         |           | j                  j                  | j                  j	                                y r*   )r   finalizerH   setSceneRectitemsBoundingRect)r"   r&   s    r'   r   z_PyQtBackend.finalize   s-      !>!>!@Ar(   )rO   qw.QGraphicsScene)rT   r   r=   r>   )rO   r   r=   r>   r[   zqw.QGraphicsItemr\   strr=   r>   )rh   r   r=   z	qg.QColor)rs   r   r=   zqg.QPen)rh   r   r=   r:   )rh   r   )r   r   rs   r   r=   r>   )r   r   r   r   rs   r   r=   r>   )r   zIterable[tuple[Vec2, Vec2]]rs   r   )r   r
   rs   r   r=   r>   )r   zIterable[BkPath2d]rs   r   r=   r>   )r   r   rs   r   r=   r>   )r   r   rs   r   r=   r>   )r=   r>   )r?   r@   rA   rB   r   rS   rV   r]   abcabstractmethodrX   rl   rv   rz   r}   r   r   r   r   r   r   r   r   r   rC   rD   s   @r'   rF   rF   5   s    1"
" 	 "	EJ042*2 &2 00'05F0	0
0 
0.?
0	
00,B Br(   rF   c                  2     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
    c                P    t         |   |xs t        j                                y r*   r   r   r   QGraphicsScenerN   s     r'   r   zPyQtBackend.__init__         	5""3"3"56r(   c                    t        d | j                  d d D              }| j                  }|j                  t        |       |j                  t
        |       y )Nc              3  &   K   | ]	  \  }}|  y wr*   r_   ).0r   propss      r'   	<genexpr>z,PyQtBackend.set_item_data.<locals>.<genexpr>   s     F81eQFs   )tupleentity_stackcurrent_entitysetDataCorrespondingDXFEntityCorrespondingDXFParentStack)r"   r[   r\   parent_stackr   s        r'   rX   zPyQtBackend.set_item_data   sH    Ft/@/@"/EFF,,+^<0,?r(   r*   rO   zOptional[qw.QGraphicsScene]r   r?   r@   rA   rB   r   rX   rC   rD   s   @r'   r   r      s      .27*7@r(   r   c                  2     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
    c                P    t         |   |xs t        j                                y r*   r   rN   s     r'   r   zPyQtPlaybackBackend.__init__   r   r(   c                0    |j                  t        |       y r*   )r   r   rZ   s      r'   rX   z!PyQtPlaybackBackend.set_item_data  s    +];r(   r*   r   r   r   rD   s   @r'   r   r      s     .27*7<r(   r   c                  2     e Zd Z	 d	 	 	 	 	 	 	 d fdZ xZS )r   c                @    t        | |       t        | 	  |||       y r*   _set_cosmetic_brushr   r2   r"   r.   r/   r0   r&   s       r'   r2   z_CosmeticPath.paint       	D'*gvv.r(   r*   r;   r?   r@   rA   r2   rC   rD   s   @r'   r   r     8    
 (,	// ,/ %	/
 
/ /r(   r   c                  2     e Zd Z	 d	 	 	 	 	 	 	 d fdZ xZS )r   c                @    t        | |       t        | 	  |||       y r*   r   r   s       r'   r2   z_CosmeticPolygon.paint  r   r(   r*   r;   r   rD   s   @r'   r   r     r   r(   r   c                    | j                         }|j                  |j                         j                         d   j	                  dd             | j                  |       y)z[like a cosmetic pen, this sets the brush pattern to appear the same independent of the viewr   r4   r   N)r%   r   r,   invertedscaler!   )r[   r.   r%   s      r'   r   r   !  sO     JJLE 
w((*335a8>>q"EFMM%r(   c                    t        j                  | j                         | j                         z  | j                         | j                         z  z         S r*   )mathsqrtm11m21)ts    r'   r+   r+   ,  s8    99QUUWquuw&1557)::;;r(   c                B    t        j                  | 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)matrixs    r'   r   r   0  s     ==&66899r(   )r[   zqw.QAbstractGraphicsShapeItemr.   r<   r=   r>   )r   qg.QTransformr=   r9   )r   r   r=   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   rF   r   r   r   r   QGraphicsPolygonItemr   r   r+   r   r_   r(   r'   <module>r     s    # % 
   G G Q Q 5 1 = % +9R** 9: !+  eennq0 [B7 [B|@, @6<, <:/B(( //r.. /
'2=	<
:r(   