
    ^j:                     .   d dl Z d dlm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 d d	l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  d dl!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZE d dlFmGZG d dlHmIZI d dlJmKZK d dlLmMZM d dlNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV  e j                  eX      ZYdZZdeeU   deQfd Z[d!e	eUeeU   f   defd"Z\	 dcd#eUd$e]d%e]deeU   fd&Z^d'eUfd(Z_d)eSdeVfd*Z`d)eSdeaeV   fd+Zb	 ddd,eVd-eeeV      deSfd.Zc G d/ d0ed      Zed1eeV   deeS   fd2Zfd)eSfd3Zgd4eVde]fd5Zhd1eeV   de]fd6Zid7d8d9eeR   d:e]deVfd;Zjd4eVdeVfd<Zkd4eVdeeR   fd=Zld>e-deRfd?Zmd@eRdefdAZn e*j                         Zpe	e-e4ef   ZqdBe?dCe?de/fdDZrdEe?de*fdFZs	 	 ded7 e?d d d        e=d d dG      dHdIetdJetdKetdLe]dMe?dNe=de	e,e/f   fdOZu	 	 ded7d  e?d d d        e=d d dG      dPdQetdRetdJetdKetdSe]dTetdMe?dNe=de	e.e/f   fdUZvd>e-de+fdVZwdWdXdYdZeqd[etd\exd]exdee*   f
d^ZydWdXdYd_e+d[etd\exd]exdee*   f
d`ZzdZeqd[etdee?   fdaZ{dZeqde|e-e	e4ef   f   fdbZ}y)f    N)chain)radians)IterableIteratorOptionalUnioncast)Bnd_Box)	BRep_ToolBRepAdaptor_Curve)
BRepBndLib)BRepBuilderAPI_MakeEdgeBRepBuilderAPI_MakeFace)BRepFeat)BRepGProp_Face)BRepLib_FindSurface)	BRepToolsBRepTools_WireExplorer)Convert_ParameterisationType)GC_MakeArcOfCircleGC_MakeArcOfEllipseGC_MakeCircleGC_MakeEllipseGC_MakeSegment)GCPnts_QuasiUniformDeflection)Geom_BezierCurveGeom_BSplineCurveGeom_Circle
Geom_CurveGeom_EllipseGeom_TrimmedCurve)GeomAbs_CurveTypeGeomAbs_Shape)GeomAdaptor_Curve)GeomConvertGeomConvert_ApproxCurve%GeomConvert_BSplineCurveToBezierCurve)gp_Ax1gp_Ax2gp_Circgp_Dirgp_Elipsgp_Pntgp_Trsfgp_Vec)ShapeExtend_WireData)ShapeFix_Face)Standard_Failure)StdFail_NotDone)TColgp_Array1OfPnt)TopAbs_Orientation)TopoDSTopoDS_BuilderTopoDS_CompoundTopoDS_EdgeTopoDS_FaceTopoDS_IteratorTopoDS_ShapeTopoDS_Wireg:0yE>shapesreturnc                     t               }t               }|j                  |       | D ]  }|j                  ||        |S N)r9   r8   MakeCompoundAdd)r?   compoundcomp_buildershapes       C/opt/ringagent/.cad-venv/lib/python3.12/site-packages/ocpsvg/ocp.pymake_compoundrI   K   sF     H!#Lh' *5)* O    shape_or_shapesc                 z    t               }t        | t              r| gn| D ]  }t        j                  ||        |S rB   )r
   
isinstancer=   r   AddOptimal_s)rK   bboxrG   s      rH   bounding_boxrP   V   sG     9D o|4 
-
 	t,- KrJ   rG   with_orientationwith_locationc              #      K   t        | ||      }|j                         r4|j                          |j                          |j                         r3yyw)z*Iterate sub shapes with `TopoDS_Iterator`.N)r<   MoreValueNext)rG   rQ   rR   iterators       rH   topoDS_iteratorrX   c   sA      u&6FH
--/nn --/s   AAAwire_or_edgec                 D    | j                         t        j                  k(  S rB   )Orientationr6   TopAbs_REVERSED)rY   s    rH   is_reversedr]   m   s    ##%);)K)KKKrJ   facec                 ,    t        j                  |       S )zFind the outer wire of a face.)r   OuterWire_s)r^   s    rH   face_outer_wirera   t   s      &&rJ   c                     t        |       }t        |       D cg c])  }|j                  |      rt        j                  |      + c}S c c}w )zFind the inner wires of a face.)ra   rX   IsSamer7   Wire)r^   outerws      rH   face_inner_wiresrg   y   s7    D!E$3D$9Qq%FKKNQQQs
   A
A

outer_wireinner_wiresc                     t        t        |       d      }|r!|D ]  }|j                  t        |              t        |j	                               }|j                          |j	                         S )z:Make a face from an outer wire and optional inner wire(s).T)r   closed_wirerD   r2   FaceFixOrientation)rh   ri   face_builder
inner_wireface_fixs        rH   face_from_wiresrq      sg     +;z+BDIL% 	6J[45	6 \..01H==?rJ   c                       e Zd Zy)InvalidWiresForFaceN)__name__
__module____qualname__ rJ   rH   rs   rs      s    rJ   rs   wiresc              #      K   t                 D ]  }t        |g      rt        d       t               st        d       fd} |       D cg c]  }t        |d      j	                          }}t        |      dk  rt        t        |      E d{    yi t        |      D ]^  \  }}t        |      D ]K  \  }}||k7  st        j                  ||      s#j                  |t                     j                  |       M ` i }t        t        |            D ]  }j                  |t                     }	t        |	      dz  rEt!        |	fd      }
|j                  |
g g f      \  }}|j#                  t%        ||                p|j                  |g g f      \  }}|j#                  t%        ||                 |j'                         D ]t  \  }}t        |      d	k(  rt        t)        |d
   |             /t*        j-                  dt        |             t/        ||      D ]  }t        t)        |              v yc c}w 7 w)zJMake faces from unorganized, possibly nested (but non-intersecting) wires.zinvalid wirezwires are not coplanarc               3   H   K   D ]  } t        t        |               y wrB   )ra   rq   )wirerx   s    rH   	fix_wiresz'faces_from_wire_soup.<locals>.fix_wires   s&      	9D!/$"788	9s   "T   Nc                 J    t        j                  | t                           S rB   )lengetset)iincluded_ins    rH   <lambda>z&faces_from_wire_soup.<locals>.<lambda>   s    C358Q4R rJ   )key   r   z&invalid nesting (found %d outer wires))listare_wires_coplanarrs   r   rl   r   mapensure_face_normal_up	enumerater   
IsInside_s
setdefaultr   addranger   maxappendra   valuesrq   loggerwarningr   )rx   r{   r|   facesr   face_ijface_jouters_and_inners	ancestorsparent_i_innersouterspathr   s   `              @rH   faces_from_wire_soupr      s7     KE 6!4&)%n556 e$!":;;9
 ENKPD$T40557PEP
5zA~,e444')Ku% 8	6"5) 	8IAvAv(--ff=&&q#%044Q7	88
 QS3u: 5OOAsu-	y>A9*RSH)44XBxHIAvMM/%(34)44QRAIFAMM/%(345 ,224 Cv;!'q	6(JKK NNCS[Qff- C+OD,ABBCC1 Q 	5s/   I0I!I3#II.IIE7Ic                     t        j                  |       \  }}}}t               }t        |       j	                  ||z   dz  ||z   dz  t               |       |j                         dk  r| j                          | S )Nr}   r   )r   
UVBounds_sr0   r   Normalr.   ZReverse)r^   u0u1v0v1normals         rH   r   r      sg    ))$/NBBXF4bAR1}fhOxxzA~KrJ   r{   c                 ,    t        j                  |       S )zCheck whether a wire is closed.)r   
IsClosed_s)r{   s    rH   is_wire_closedr      s    %%rJ   c                 j    t        |       } |  xs$ t        t        |       d      j                         S )z!Check whether wires are coplanar.T)	OnlyPlane)r   r   rI   Found)rx   s    rH   r   r      s0    KE	V(u)=NTTVrJ   F)closededgesr   c                    t        t                     }| D ]  }|j                  |d        |j                         }|rt	        |      S |S )zXMake a single wire from known-continuous edges;
    with no reordering nor any checking.r   )r1   r>   AddOrientedWireAPIMakerk   )r   r   extendedger{   s        rH   wire_from_continuous_edgesr      sQ    
 "+-0F $4#$ D &;t0D0rJ   c                 r   t        |       r| S t        |       }	 t        |      x}}	 	 t        |      }# t        $ r Y nw xY wn# t        $ r | cY S w xY wt	        t        j                  |            }|j                  |j                               }t	        t        j                  |            }|j                  |j                               }|j                  |t              sQt               }|j                  | d       |j                  t        t        ||            d       |j!                         } | S )zEnsure a wire is closed.
    - if already closed return it untouched.
    - otherwise return a new wire with a closing segment appended.r   )r   rX   nextStopIterationr   r7   EdgerU   FirstParameterLastParameterIsEqual
_TOLERANCEr1   r   edge_from_curvesegment_curver   )r{   it
first_edge	last_edgeadaptorstartendr   s           rH   rk   rk      s   
 d		B	!%b)
Y H	  !    J 78GMM'0023EI 67G
----/
0C==j)%'4#?=e+DEqI!!#Ks0   A 5 A 	AA  AA AAc              #      K   t        |       }|j                         r4|j                          |j                          |j                         r3yyw)z,Iterate edges with `BRepTools_WireExplorer`.N)r   rT   CurrentrV   )r{   explorers     rH   wire_explorerr     s<     %d+H
--/   --/s   AAAcurvec                 4    t        |       j                         S rB   )r   r   r   s    rH   r   r     s    "5)..00rJ   r   c                     t        |       S rB   r   )r   s    rH   edge_to_curver     s    T""rJ   r   r   c                     	 t        | |      j                         S # t        t        f$ r}t	        d|  d| |      d }~ww xY w)Nz"could not make segment curve from z, )r   rU   r4   r3   
ValueError)r   r   es      rH   r   r   )  sQ    QeS)//11-. Q=eWBseLaPPQs    A=Acontrolsc                      t        |       }d|cxk  r	t        k  sn t        dt         d      t        d|      }t	        | d      D ]  \  }}|j                  ||        t        |      S )Nr}   z%bezier curve must have between 2 and z control pointsr   )r   BEZIER_MAX_DEGREEr   r5   r   SetValuer   )r   npolesr   controls        rH   bezier_curver   0  sw    HA&&&34E3FoV
 	
 q!$E!, #
7q'"# E""rJ   r   )reversedcenterr   radiusstart_angle	end_angler   r   r   c                b   t        t        t               |      |       }||k(  rt        |      j	                         }n.t        |t        |      t        |      |      j	                         }t               }|j                  t        |j                                      |j                  |       |S rB   )r+   r*   r.   r   rU   r   r   r/   SetTranslationr0   XYZ	Transform)	r   r   r   r   r   r   	circle_gpcircletrsfs	            rH   circle_curver   >  s     vx0&9I iy)//1#w{+WY-?

%' 	 9Dvzz|,-
TMrJ   )	clockwiserotationr   r   major_radiusminor_radiusr   r   c                   || kD  r|| }} d}nd}t        t        t               |      | |      }	|	j                  t	               t        |             ||k(  rt        |	      j                         }
n4t        |	t        ||z
        t        ||z
        |      j                         }
|
j                  t	        t               |      t        |             |
j                  t        |j                                      |
S )NZ   r   )r-   r*   r.   Rotater)   r   r   rU   r   	Translater0   r   )r   r   r   r   r   r   r   r   angle_adjustment
ellipse_gpellipses              rH   ellipse_curver   X  s     l"%1<l&62L,OJfh(8 9: i ,224%K"223I 001	

 %' 	 NN6&(F+WX->?fVZZ\*+NrJ   c                 J    t        j                  | t        j                        S rB   )r&   CurveToBSplineCurve_sr   Convert_RationalC1r   s    rH   curve_to_bspliner   }  s    ,,U4P4c4cddrJ      d   )
max_degreemax_segmentscurve_or_adaptor	tolerancer   r   c             #     K   t        |       \  }}|j                         }|t        j                  k(  rM|j	                  |j                               }|j	                  |j                               }t        ||       y |t        j                  k(  rt        t        |j                         j                               }	|	j                  |j                         |j                                |	j                         |kD  s|	j                         r!t!        t#        |	      |||      E d {    y |	 y |t        j$                  k(  rrt        t&        |j)                         j                               }
|
j                  |j                         |j                                t!        |
|||      E d {    y t#        |      }
|
j                  |j                         |j                                t+        |t,              r|
j/                  |j1                                t!        |
|||      E d {    y 7 7 7 
w)N)r   r   r   )curve_and_adaptorGetTyper#   GeomAbs_LinerU   r   r   r   GeomAbs_BezierCurver	   r   BezierCopySegmentDegree
IsRationalbspline_to_beziersr   GeomAbs_BSplineCurver   BSplinerM   r   r   Trsf)r   r   r   r   r   r   
curve_typer   r   bezierbsplines              rH   curve_to_beziersr    s     ''78NE7"J&333g4467mmG11345#&&	(<<	<&(8(=(=(?@w--/1F1F1HI==?Z'6+<+<+>) (%)#	   L	(==	=('//*;*@*@*BC..0'2G2G2IJ%!%	
 	
 	
 #5)..0'2G2G2IJg01glln-%!%	
 	
 	
1	
	
s8   D*I,H<-B	I6H?7A?I6I7I?IIr  c             #   "  K   t        t        | j                               } | j                  | j	                         | j                                | j                         dkD  s| j                         r]t        | |t        j                  ||      }|j                         r!|j                         r|j                         } nt        d|        t        |       }t!        |j#                               D ]  }|j%                  |dz           y w)Nr   )MaxSegments	MaxDegreezcould not approximate b-spline r   )r	   r   r  r  r   r   r  r	  r'   r$   
GeomAbs_C0IsDone	HasResultCurver   r(   r   NbArcsArc)r  r   r   r   approxbez_convertr   s          rH   r
  r
    s      $glln5GOOG**,g.C.C.EF~~!w113($$$ 
 ==?v//1llnG>wiHII7@K;%%'( %ooa!e$$%s   DDc             #     K   t        |       \  }}|j                         }|j                         }|j                         }|t        j
                  k(  r'|j                  |       |j                  |       y t        ||||      }|j                         r5t        |j                               D ]  }|j                  |dz           y t        d      w)Nr   zcould not convert to polyline)r  r   r   r  r#   r  rU   r   r  r   NbPointsr   )	r   r   _curver   r   r   r  pointsr   s	            rH   curve_to_polyliner!    s     
 ((89OFG""$E



!C"J&333mmE""mmC  .w	5#N==?6??,- *ll1q5))* <==s   CCc                     t        | t              r| t        |       fS t        | t              r| j                         | fS | j                         j                         | fS rB   )rM   r    r%   r  )r   s    rH   r  r    s`     "J/!23C!DDD	$&7	8%%')999%%'--/1AAArJ   )TTrB   )h  r#  )~logging	itertoolsr   mathr   typingr   r   r   r   r	   OCP.Bndr
   OCP.BRepr   OCP.BRepAdaptorr   OCP.BRepBndLibr   OCP.BRepBuilderAPIr   r   OCP.BRepFeatr   OCP.BRepGPropr   OCP.BRepLibr   OCP.BRepToolsr   r   OCP.Convertr   OCP.GCr   r   r   r   r   
OCP.GCPntsr   OCP.Geomr   r   r   r    r!   r"   OCP.GeomAbsr#   r$   OCP.GeomAdaptorr%   OCP.GeomConvertr&   r'   r(   OCP.gpr)   r*   r+   r,   r-   r.   r/   r0   OCP.ShapeExtendr1   OCP.ShapeFixr2   OCP.Standardr3   OCP.StdFailr4   
OCP.TColgpr5   
OCP.TopAbsr6   
OCP.TopoDSr7   r8   r9   r:   r;   r<   r=   r>   	getLoggerrt   r   r   rI   rP   boolrX   r]   ra   r   rg   rq   r   rs   r   r   r   r   r   rk   r   r   r   MaxDegree_sr   CurveOrAdaptorr   r   floatr   r   r   intr  r
  r!  tupler  rw   rJ   rH   <module>rG     s      < <   - % O ! ( + ; 4  5  9 - 
	 	 	 1 & ) ' ) )	 	 	 
		8	$ 
(<0 _ 
<,)??@

 OS+/GKlLl L'+ '+ '
R; R4+< R MQ*28K3H*I	* 	1C 5 1C(;:O 1Ch & & &
h{3   5:
1K 
1-1
1
1 k  k  F (= 1: 1+ 1# #(9 # 1$002 z#46GGHQ Qf Q1B Q#F #'7 #  
 Aq!_Aq!_ 
    ;))*: 	" Aq!_Aq!_""" " 	" " " " " <**+"JeJ e+< e 0
$0
 0
 	0

 0
 0
n %% % 	%
 % %6>$> > f	>.B$B
:u.0AABBCBrJ   