a
    ~i                    @   sx  d Z ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZ ejddd ejZd	d
 Zdd Zdd Zdd ZdddZdddZdd ZdddZdd ZdddZddd Zd!d" Zd#d$ Zd%d& Z dd'd(Z!d)d* Z"d+d, Z#d-d. Z$dd/d0Z%dd1d2Z&dd3d4Z'dd5d6Z(deeegfd7d8Z)dd9d:Z*dd;d<Z+dd=d>Z,d?d@ Z-dAdB Z.dCdD Z/dEdF Z0dGdH Z1dIdJ Z2dKdL Z3dMdN Z4dOdP Z5g Z6e6dQddfdRdSZ7ddTdUZ8ddWdXZ9ddYdZZ:dd\d]Z;d^d_ Z<d`da Z=e> dfdbdcZ?g ddg dedfdddfdgdhZ@ddidjZAddldmZBddpdqZCddsdtZDe

 aEdudv ZFddwdxZGddzd{ZHdd|d}ZId~d ZJdd ZKdd ZLg ddddfddZMdddZNdddZOdddZPeQddeRdddeQdde: ddeQddgddfddZSeQddeRdddeQdde: ddeQddgddfddZTdd ZUeV d ZWeX dkrejYZeWrejY[eWZ\e	j	]e\^dZ_e`deaej dd  d  e`deGde f  e`d g ddfddZbd Zc Zd Ze Zf ZgZhdd ZidddZjg dZkg dZlg dZmd ZnZod ZpZqd ZrZsdZtdZudZvdZwdZxdd Zyg ZzdddZ{e{dddddZzdddZ|dddZ}dddZ~e{ddddZzeydddeyeod ddeyeod eqd deydeqd deydddgZe~dddkdddddZdaeydddeydddeydddeydddggaetddfddńZed dS )za   |||  ver 20251106 by _diag 4 DM* @ I OI III @ TUGraz  ||| 2025 11 06 | added:divide, UN_coords    Ncombinationspermutations)productgh㈵>   )	tolerancein_model_unitsc                   C   s   t t   d S N)rsDeleteObjectsSelectedObjects r   r   P:\WWW\kokusaurus\dm2\DM_lib.pyeS$   s    r   c                   C   s   t t   t  d S r
   )r   SelectObjects
AllObjectsr   r   r   r   r   eV(   s    r   c                   C   s   t t   t   d S r
   )r   r   r   Redrawr   r   r   r   eA-   s    r   c                   C   s.   t t   t t   t  t   dS )z;Deletes Absolutely All objects, incl hidden and locked
    N)r   UnlockObjectsr   ShowObjectsr   r   r   r   r   r   eAA2   s    r   c                 C   s   t  }t   tt  }t dd |rTt  rTt  D ]}||v r<|| q<t t   |rpt | | rt	d|tt   d d S )NZ_selDupFz*** eDup() deletedzobjects ***)
r   r   UnselectAllObjectslenr   Commandremover   r   print)verboseselectedZvorherobjr   r   r   eDup;   s    r!   ffffff?c                 C   s0   t jdd t dt|  d d t   d S )Nr   allz-_zoom Factor  _enterF)r   ZoomExtentsr   strr   )Zprozr   r   r   zAO   s    r(   c                   C   s   t jdd d S )Nr   r#   )r   ZoomSelectedr   r   r   r   zSU   s    r*         ?c                 C   s(   t || }t ||}t | |}|S r
   )r   VectorSubtractVectorScale	VectorAdd)coord0coord1facveccoordr   r   r   pntInbetween^   s    r4   c              	   C   s"   t t t | |t | |S r
   )r   VectorUnitizeVectorCrossProductr,   )p0p1p2r   r   r   normVec3pntsd   s    r:   c                 C   s~   g }t || }t|d D ]2}|t | t |t||  t||  q|r^t | |rnt 	||  tt
| |S )z
    return = coords
    r   )r   r,   rangeappendr.   r-   floatr   	AddPointsAddLiner   )r/   r0   segmentscreate_pointsZcreate_linecoordsr2   ir   r   r   pntsInbetweenj   s    "rD   c                 C   sh  t | |g|}t ||}t | t t || d}t |t |d}t |t |d}t |t t ||d}	t |	t t | t ||g| d}
t |	t t | t ||g| d}||g}||
g}tt ||dt |	|
 t ||d }ds|rXt t 	|| ||| gdg d t 
|| |}t |t ||  |t || gS )z
    arguments:
        p0, p1, p2 .. 3 coords
        verbose 0/1 generate circle
    returns:
        list [center, radius]
    r+   i i`yz---r   r   d      rF   )r   LineClosestPointr,   r.   r-   r   DistanceLineLineIntersectionObjectColorAddCurvePlaneFromPoints	AddCircle)r7   r8   r9   r   Zp2NZp2NvecZp0p1MZp0p1NZp0p1_NZp1p2MZp1p2NZp1p2_NZline01Zline02centerZplnr   r   r   circumcircleOfTrianglez   s"    (("rP   c           	      C   sh   d}d}d}| D ](}||d 7 }||d 7 }||d 7 }qt | }|| }|| }|| }|||g}|S Nr   r      )r   )	rB   Zx_sumZy_sumZz_sumr3   numxyzr   r   r   pntCentroid   s    
rW   c                 C   sF   g }|D ]}t | |}|t| qttt|| }t|d S Nr   )r   rI   r<   abszipsortedlist)originrB   distsr3   distzipped_listsr   r   r   pntsSortDistancePnt   s    ra   c                 C   sB   g }|D ]}t | |}|t| qttt|| }|d S rX   )r   DistanceToPlaner<   rY   rZ   r[   )planerB   r^   r3   r_   r`   r   r   r   pntsSortDistancePln   s    rd   c                 C   s   t | |S r
   )r   CurvePerpFrame)crvcrv_parameterr   r   r   plnCurvePerp   s    rh   c              
   C   s   t | t |t || S r
   )r   rI   EvaluateCurveCurveClosestPoint)pntrf   r   r   r   pntCurveDist   s    rl   c                 C   s   t | t || S )z
    arguments:  pnt: [x,y,z]
               line: [point, point] 
       return: distance of nearest point on LINE from tst_pnt
    )r   rI   rH   )rk   liner   r   r   pntLineDist   s    	rn   c                 C   s    t || }t |t || S )z|
    arguments: pnt: [x,y,z]
               crv: ID of curve
       return: pnt [x,y,z] on curve that is closest to pnt
    )r   rj   ri   )rk   rf   Zparar   r   r   pntCurveClosest   s    ro   c                 C   s   t | |}|d }|S Nr   )rh   )rf   rg   	prepframerk   r   r   r   pntCurvePerp   s    
rr   c                 C   s   t | |}t|d }|S rX   rh   r   r5   rf   rg   rq   r2   r   r   r   vecCurvePerpX   s    
ru   c                 C   s   t | |}t|d }|S )NrR   rs   rt   r   r   r   vecCurvePerpY   s    
rv   c                 C   s   t | |}t|d }|S N   rs   rt   r   r   r   vecCurvePerpZ   s    
ry   c                 C   s2   t | |}t|d }t||}t|}|S rw   )rh   r   r5   r6   )rf   rg   Znorrq   dirr2   r   r   r   vecCurvePerpNormal   s
    

r{   c                 C   s   t | |g d}|S )Nr   r   r   r{   rf   rg   r2   r   r   r   vecCurvePerpXY  s    r   c                 C   s   t | |g d}|S )Nr   r   r   r}   r~   r   r   r   vecCurvePerpXZ  s    r   c                 C   s   t | |g d}|S )Nr   r   r   r}   r~   r   r   r   vecCurvePerpYZ  s    r   c                 C   s,   t | d d t | d  d t | d  S )Nr   ,r   rR   )r'   rk   r   r   r   pnt2str  s    r   c                 C   s   | d | d dgS )Nr   r   r   r   r   r   r   pnt2XY0  s    r   c                 C   s   | d d| d gS )Nr   rR   r   r   r   r   r   pnt2XZ0  s    r   c                 C   s   d| d | d gS rQ   r   r   r   r   r   pnt2YZ0  s    r   c                 C   s   dd | D S )Nc                 S   s   g | ]}|qS r   r   ).0valr   r   r   
<listcomp>      zpnt2cor.<locals>.<listcomp>r   r   r   r   r   pnt2cor  s    r   c                 C   s   dd | D S )Nc                 S   s"   g | ]}|d  |d |d gqS )r   r   rR   r   )r   rk   r   r   r   r     r   zpnts2cors.<locals>.<listcomp>r   )pntsr   r   r   	pnts2cors  s    r   c                 C   s
   t | S r
   )r   coerce3dpoint)corr   r   r   cor2pnt   s    r   c                 C   sD   t | } t |}t |}d|  d | d | d }t|d d S )NzcPlane 3Point  z enterF)r   r   r   )r7   r8   r9   cmdr   r   r   
cPlane3pts#  s
    r   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )r   r   r   r   r   r   r   0  r   zpnts2XY0.<locals>.<listcomp>r   )rB   r   r   r   pnts2XY0/  s    r         ?c                 C   s   t | }tdD ]}|r"t|  tdd t| dD dd d}|rbt|dt | d	|d
 d  |d
 d |k r| |d
 d
 d
  qtdf ds|rtd|dt| d tt |  d |d
 d d  qq| S )Ni  c                 S   s$   g | ]}|t |d  |d gqS )r   r   )r   rI   )r   Zpairr   r   r   r   :  r   z#pntRemoveByDist.<locals>.<listcomp>rR   c                 S   s   | d S rX   r   )ZsortKeyr   r   r   <lambda>:  r   z!pntRemoveByDist.<locals>.<lambda>)keyzlen(coords)zmin r   r   zXXX pntRemoveByDist done z: cnt =zlen(coords) vorher/nachher /z
 - minDistz
XXXXXXXXXXXXXXXXXXXXXXXX)	r   r;   randomshuffler[   	combinater   r   r'   )rB   minDistZ	randomizer   Z	lenVorherrC   ZdistListr   r   r   pntRemoveByDist5  s    
  
<r   c           	   	   C   s   t | }t|  }}|g}tddD ]z}t  |}|}| D ]L}|d |d  |d |d   |d |d  |d |d    dk r:|}q:|| ||kr$ qq$||kr|rtd|dt|dtt|  d  |S )Nr   i'  r   z*** convHull: i=z: len convCoords=z(from zcoords))rW   minr;   escr<   r   r   r'   )		coordListr   ZavgstartarB   rC   obr   r   r   pntConvHullR  s     D
(r   c                    s    fddt |D S )Nc                    s$   g | ]} fd dt dD qS )c                    s   g | ]}t  qS r   r   uniformr   rC   r   r   r   r   r   h  r   z)pntRandVec.<locals>.<listcomp>.<listcomp>rx   r;   r   jr   r   r   r   h  r   zpntRandVec.<locals>.<listcomp>r   r   r   anzahlr   r   r   
pntRandVecg  s    r   c                    s    fddt dD S )z
        randVec (a=-1, b=1)
        Parameters:
            a: value von
            b: value bis
        Returns:
            list: [rnd(a,b), rnd(a,b), rnd(a,b)]
    c                    s   g | ]}t  qS r   r   r   r   r   r   r   u  r   zrandVec.<locals>.<listcomp>rx   r   r   r   r   r   randVecl  s    	r   rF   c                    s    fddt |D S )Nc                    s$   g | ]} fd dt dD qS )c                    s   g | ]}t  qS r   r   r   r   r   r   r   x  r   z,pntRandCoords.<locals>.<listcomp>.<listcomp>rx   r   r   r   r   r   r   x  r   z!pntRandCoords.<locals>.<listcomp>r   r   r   r   r   pntRandCoordsw  s    r   c                 C   s   t   t | dks$t | dkrRt dt|  d d t | }t dd t   t | dkrt | d t | }t | d	 |S )
N   i   @z_solidPtOn _selID z _enter _enterFz_pointsOff _enter   r   r   )r   r   
ObjectTyper   r'   ObjectGripLocationsEnableObjectGrips)objIDrB   r   r   r   getSurfacePointsz  s    

r   c                 C   s   t | td| td| S )N
   )mathfloorpow)numberZ	nachkommar   r   r   	mathRound  s    r   c                 C   s
  |dkrt dt  f tt }tt }dt|d d dt|d d dt|d d df }dt|d d dt|d d dt|d d df }ttt d}tjt d d}|rt d|||f  tt d tt d ||gS )	NrR   z.***
view: "%s" : [camPos], [targetPos], lens 
z
%s, %s, %sr   r   r   )	up_vectorzTdm.setCameraTarget( [%s], [%s], lens=%s, rota=0, upVec=[0,0,1] ) # ... danke, andi !)	r   r   CurrentViewViewCameraTargetViewCameraPlaner   roundViewCameraLensViewCameraUp)viewr   Zcamrc   ZcamPosZ	targetPosZlensValupVecr   r   r   getCameraTarget  s    88r   r   r   r   r|   2   c                 C   sz   t t  | | |r&t t  | |r:t t  | dsB|rZt dt| d d |rvt   tt  |d d S )Nr   z-_viewportproperties rotation z enter enterF)r   r   )	r   r   r   r   r   r   r'   r   r   )cameratargetZlensrotar   r   r   r   r   setCameraTarget  s    r   c                 C   s2  t jj }|std d S g }g }t|D ]b\}}|d urB|jrB|j}|r||| || |dkr||js|td|d| |s,td  d S q,| std d S dd	 tjjD }	|	D ]D}
| D ]:}tjj|}|j}||| |
 tjj||d
 qq|r"tdt| dt||  d  tjj  d S )Nz Failed to get display mode data!r   rR   	=z!XXX No valid display modes found!z'............XXX no objects selected XXXc                 S   s   g | ]
}|j qS r   )ActiveViewportID)r   r   r   r   r   r     r   z1SetObjDisplayModeAllViewports.<locals>.<listcomp>Fz...........zobjects set_2 DisplayMode: "")RhinoDisplayDisplayModeDescriptionGetDisplayModesr   	enumerateZPipelineLocked	LocalNamer<   r   r;   r   scdocViewsObjectsFind
AttributesZSetDisplayModeOverrideModifyAttributesr'   r   )ZobjIDsZdisplaymodeXr   Z
all_dmodesZvalid_dmodesZvalid_modenamesrC   ZdmodeZ
local_nameZvIDsZvIDr   ZobjRefattrr   r   r   SetObjDisplayModeAllViewports  s6    

 r   rx   c                 C   s  t jj }|dkr td d}|dkr2t jjj}|dkrDt jjj}|dkrVt jjj}|dkrht jjj	}|dkrzt jjj
}|dkrt jjj}|d	krt jjj}|d
krt jjj}|dkrt jjj}|dkrt jjj}|dkrt jjj}|dkrt jjj}|dkrt jjj}| dkr| tt jj krt jj t|  }||j_||j_t jj| dsj|rtd|t|  jd dd  d |dt| d  n:tt|D ],} ||  }||j_||j_t jj| qt| trt| dk r|t|  }| }|r<td td td td td td t|D ]\}}|j}	ds^|rDt|}
|dk rxd|
 }
t|
d t|	dd d dd   f td!t|| jjf td"t|| jj qDdS )#a  
        arguments:
                displayModeX: int .. number of displayMode
                rad  = 3 : point radius
                styl = 3 : point style
                verbose : quasselig
                point style:
                    https://developer.rhino3d.com/api/rhinocommon/rhino.display.pointstyle
                    0 ControlPoint "square with center"
                    1 RoundControlPoint "round with center"
                    2 Simple "solid square"
                    3 RoundSimple "solid circle"
        Standard displayModes_numbers
        0 Wireframe
        1 Shaded
        2 Rendered
        3 Ghosted
        4 XRay
        5 Technical
        6 Artistic
        7 Pen
        8 Arctic
        9 Raytraced
        10 etc ! 
       z"!!! print nix style>12 > set_2 "3"rx   r   r   rR               r   	   r      r$   z*** style "z"::::::::::::::    z PointRadius =z8geaendert, danke Eszter & danke Andi fuer PointStyle = "r   zPointStyle 0: square outlinezPointStyle 1: circle outlinezPointStyle 2: square solidzPointStyle 3: circle solidz PointStyle 4: square ActivePointzPointStyle 5: round ActivePointr   z = Nz:::::::::::::::::   zpointRadius=z/ pointStyle =)r   r   r   r   r   Z
PointStyleControlPointZRoundControlPointZSimpleZRoundSimpleZActivePointZRoundActivePointZArrowTipZHeartZChevronZTriangleXZPinZAsteriskr   intZDisplayAttributesPointRadiusZUpdateDisplayModeEnglishNamer'   r;   
isinstancer   )displayModeXradstylr   Zdisplay_modesZstyxZselected_descriptionZdisXrC   Zenglish_namerS   r   r   r   r     s\     D*r   Tr   c                 C   s@   t dd | dkr<dt| d t| d }t |d d S )Nz_PrintDisplay State=Off _enterFTz_PrintDisplay State=On Color=z Scale=r%   )r   r   r'   )statescaleZ	thicknesscolorr   r   r   r   printDisplay*  s    r    c                 C   sr   t d}g }t| r\t| D ]:\}}|sF|t t|| | q|t || qntd t | |S )Nr   z ***________no list > no textDots)r   EnableRedrawr   r   r<   
AddTextDotr'   r   )r   ZstrXZjustNameZRDstateZlisrC   ptr   r   r   textDots0  s    

r  c                   C   s   t   ad S r
   )timetimeXr   r   r   r   setTimeA  s    r  c                 C   s@   t t }|t t8 }| r6tdtt|d d  t|dS )Nztim: rR   sr   )r=   r  r  r   r'   r   )r   Ztimr   r   r   getTimeE  s
    r  0c                 C   s:   |t t|  }|dkr2t|D ]}|t|  } q t| S rp   )r   r'   r;   )r   signZsollLenanzrC   r   r   r   preNullO  s    r
  c                 C   s\   t | | t ||  }|| }|r8|||  |k r8|S |rP|||  |krP|S |||  S r
   )r=   )rC   ZiMinZiMaxZoMinZoMaxlimitZinFacZoutFacr   r   r   reMapW  s    r  c                 C   s   dd t | |D S )Nc                 S   s   g | ]}|qS r   r   )r   permr   r   r   r   c  r   zpermutate.<locals>.<listcomp>r   r\   rS   r   r   r   	permutateb  s    r  c                 C   s   dd t | |D S )Nc                 S   s   g | ]}|qS r   r   )r   combr   r   r   r   f  r   zcombinate.<locals>.<listcomp>r   r  r   r   r   r   e  s    r   c                   C   s   t d d S rX   )r   escape_testr   r   r   r   r   o  s    r   )i   r  r          c                 C   sx   | }t j| |dd t |r>t t | t t | t || t|g|R ||||d d t |  dS )zs
    newEmptyLayer( lay, color=[105,105,105], transe=0.0, gloss=0.0, refl=0.0 )
    new layer is set current !
    r   )parentZ_layMat)TGlossReflmatNamN)	r   AddLayerIsLayerr   ObjectsByLayerr   
LayerColor
rgbMat2LayCurrentLayer)Zlayr   ZtranseZglossZreflZlayXr   r   r   newEmptyLayers  s    
 r     nonec           
      C   s   | rt | }ntjj }t|}t|}t|}t ||||f t ||d  t 	||d  tjj| }	||	_
tjj|	|d |dkrd|||t|d |f }t || |S )a   Adds Material to Objects.
    Parameters:
      obj_id = Guid of Geometry in RhinoDoc
      Red[opt] = 0-255
      Green[opt] = 0-255
      Blue[opt] = 0-255
      Transparency[opt] = 0.0 - 1.0, 1.0 being transparent
      Glossiness[opt] = 0.0 - 255.0, 255.0 being glossy
      Reflectivity[opt] = 0.0 - 1.0, 1.0 being fully reflectant
      matName[opt] = Materialname as String
    Returns:
      Material index
    ư>   r   r!  mat_%s_%s_%s_%s_ind_%srF   )r   AddMaterialToObjectr   r   	MaterialsAddr   MaterialColorMaterialTransparencyMaterialShineReflectivityModifyMaterialName)
Zobj_idRGBr  r  r  r  indexnewMatr   r   r   
rgbMat2Obj  s    "r3  c           
      C   s   | rt | }ntjj }t | t|}t|}t|}tjj| }	||	_tjj	|	|d |dkrd|||t|d |f }t 
||||f t ||d  t ||d  t || |S )a   Adds Material to LAYER.
    Parameters:
      lay_nam = layerName
      Red[opt] = 0-255
      Green[opt] = 0-255
      Blue[opt] = 0-255
      Transparency[opt] = 0.0 - 1.0, 1.0 being transparent
      Glossiness[opt] = 0.0 - 1.0, 1.0 being glossy
      Reflectivity[opt] = 0.0 - 1.0, 1.0 being fully reflectant
      matName[opt] = Materialname as String
    Returns:
      Material index
    Tr!  r$  rF   r"  r#  )r   AddMaterialToLayerr   r   r&  r'  ResetMaterialr   r+  r,  r(  r)  r*  r-  )
Zlay_namr.  r/  r0  r  r  r  r  r1  r2  r   r   r   r    s    
"r  @   c              	   C   s  t dd}t dd}ddt ddg}g d}| }|dk rJd}td ||d 8 }| d | d dg}g }d	| }	t|D ]$}
t||	|
 g d
}|| qt |}g }||d  }tt|d d D ]<}
|d |d  ||
  |d |d  |d g}|| q|dt|d  D ]0}t	t|dg d
d|dg}|| q&|dt|d  D ]"}t|dg d
}|| qld}g d
}|r |}t d| d| t d| d| dg}||dg}t
|D ]\}
}t|||||
< qtt |t |}t|d |d }d|d< t
|D ]\}
}t	||||
< q<t|d}td tdt|  d t| d |d tdt| d t| d t| d  td ||gS )Nr   r   r   r   r   r   z&   *** anzahl coords set 8 (= minimum)r+   g     v@r|   r   rR   Z      gg?r   zD   *** *********** *********** *** DM2_w25 / hu_02 / square_&_circlez   *** setUp_hu_02(z, z) returned 2 arrays withz(pointCoords each: [coordsCir, coordsSqu]z   *** coordsSqu are rotated u   .0Â° @ axis [z, 1.0]z@   *** ********* *********** *** ************************* *****)r   r   r   r;   r   VectorRotater<   choicer   r.   r   r,   r   r'   )r   Z	rotateSquZrCircleZaCubeZmCubeZmCircler	  Z	vecRadialZ	coordsCirZdAngrC   r2   ZmovCube	coordsCubZdAr   Zrvecr   r   r   setUp_hu_02  s\    
. *

$,r<  r   r   Ah  c                    sR  d9 |d  |}|  }|dks0|dkrJtd d dgg }	g t|D ]}
t|D ]}|
 d |dk   | d |dk  }|dkr d	  |d	  dg |dks|
dks|
|d ks|dks||d kr|dkr |dg |dkrf|dkrf ddg qfqZd
 d d d g }	g }|dkrfddt|D }	fddt|d D }|dkrd}|	 |	dd D  |	 fddD  |	 fddD  |	dd D  |	 fddD  |d }|fddt|D  |fddt|D  |fddt|D  |fddt|D  |dd |d D  |dd |d D  |dkr<d}|	 |	 fddD  |	 fddD  |	 fd dD  |	d!d D  |	 fd"dD  |	 fd#dD  |	 fd$dD  |	 fd%dD  |	 fd&dD  |	 fd'dD  |	 fd(dD  |fd)dt|d* D  |fd+dt|d* D  |fd,dt|d* D  d d d d |dk  gt|	D ]$\}fd-dD |	|< qj|dkrd.}|rvg }|	D ]| q|d d  }	t|	}t|	}	|t|	 }g }|D ]| q|d d  }t|}t|D ]}|	t
| q |rntd/ td0| d1 tt|	 d2  td3 ||	gS |dkrN|rFtd4 t|d5krtd0| d6 tt| d7  t|d5k r>td0| d8 tt| d9 tt|d  d: tt|	 d9 tt|	d  d; tt|	t|	d   d7  td< ||	gS d S )=Nr   r   EF      r   r+   r=  r  LXz?;f?c                    s"   g | ]  fd dD qS )c              
      s*   g | ]"}t |d d   d  gqS r   r+   r   r.   r   dist_ptsedge_lenrC   r   r   r     r   z*setUp_hu_03.<locals>.<listcomp>.<listcomp>r   r   rB   rH  rI  rC   r   r     r   zsetUp_hu_03.<locals>.<listcomp>c                    s4   g | ],}t t t t td dt  qS r>  r?  r   r-   r5   r9  r   r   r   r   radiusr   r   r     r   rx   "F"_acesc              
   S   s*   g | ]"}t t |d g dg dqS r7  r   r   r   r.   r9  r   r   r   r   r   "  r   c              
      s,   g | ]$}t t |d g d ddgqS r7  r   r   r   r   rS  r   r   r   r   r   #  r   c              
      s,   g | ]$}t t |d g dd dgqS r7  r   r   rS  r   rV  r   r   r   $  r   c              
   S   s*   g | ]"}t t |d g dg dqS r7  rU  r   rS  r   r   r   r   r   %  r   c              
      s,   g | ]$}t t |d g dd d  gqS r   rU  rS  r   rV  r   r   r   &  r   rR   c                    s:   g | ]2}t t t  d d gtddg d qS r   r>  r?  r|   r   r-   r5   r9  r   r   r   rO  r   r   r   *  r   c                    s:   g | ]2}t t t d  d gtddg d qS r   r>  r?  r   r[  r   rO  r   r   r   +  r   c                    s:   g | ]2}t t t   d gtddg d qS r   r>  r?  )r   r   r   r[  r   rO  r   r   r   .  r   c                    s<   g | ]4}t t t    d gtddg d qS r   r>  r?  )r   r   r   r[  r   rO  r   r   r   /  r   c                 S   s   g | ]}t |d g dqS -   r   r   r9  r   r2   r   r   r   r   1  r   c                 S   s   g | ]}t |d g dqS ir   ra  rb  r   r   r   r   2  r   "E"_edgec              
      s,   g | ]$}t t |d g d ddgqS r7  r|   r   rS  r   rV  r   r   r   7  r   c              
      s,   g | ]$}t t |d g d  dgqS r8  r|   r   rS  r   rV  r   r   r   8  r   c              
      s,   g | ]$}t t |d g dd dgqS r7  )r   r   r   r   rS  r   rV  r   r   r   9  r   c              
   S   s*   g | ]"}t t |d g dg dqS rX  rS  r   r   r   r   r   ;  r   c              
      s,   g | ]$}t t |d g d ddgqS rT  rS  r   rV  r   r   r   <  r   c              
      s,   g | ]$}t t |d g d  dgqS rT  rS  r   rV  r   r   r   =  r   c              
      s,   g | ]$}t t |d g dd dgqS rT  rS  r   rV  r   r   r   >  r   c              
      s,   g | ]$}t t |d g dd d  gqS r   r|   rS  r   rV  r   r   r   @  r   c              
      s,   g | ]$}t t |d g d d gqS re  rS  r   rV  r   r   r   A  r   c              
      s,   g | ]$}t t |d g d   gqS r8  r|   rS  r   rV  r   r   r   B  r   c              
      s,   g | ]$}t t |d g dd  gqS rg  rS  r   rV  r   r   r   C  r   c                    s:   g | ]2}t t t  d d gtddg d qS rZ  r[  r   rO  r   r   r   F  r   r   c                    s:   g | ]2}t t t d  d gtddg d qS r\  r[  r   rO  r   r   r   G  r   c                    s:   g | ]2}t t t  d d gtddg d qS r   r>  r?  r   r[  r   rO  r   r   r   H  r   c              	      s"   g | ]}t t | qS r   rS  r   angleaxeposr   r   r   O  r   "A"_ll1   *** allInOne = 1 *****************************   *** _list :  coords each (Sph & Cub)R   *** ****************************************** DM2_w25 / hu_03 / spherification;   *** allInOne = 0 ***************************************r    | SPH == CUB ==  coords each	 | SPH = 	 lists a 	 | CUB =  == N   *** ************************************** DM2_w25 / hu_03 / spherificationupperr   r.   r;   r<   r   extendr   CullDuplicatePointsr   r   r:  r   r'   rI  Zanz_ptswhatrl  rm  rn  ZallInOner   r	  r;  rT   rU   YZ	coordsSphptsrC   tmpZlenxZdiffr   r   rl  rm  rB   rH  rI  rn  rP  r   setUp_hu_03   s    * 2




   &


 
 tr  c                    sR  d9 |d  |}|  }|dks0|dkrJtd d dgg }	g t|D ]}
t|D ]}|
 d |dk   | d |dk  }|dkr d	  |d	  dg |dks|
dks|
|d ks|dks||d kr|dkr |dg |dkrf|dkrf ddg qfqZd
 d d d g }	g }|dkrfddt|D }	fddt|d D }|dkrd}|	 |	dd D  |	 fddD  |	 fddD  |	dd D  |	 fddD  |d }|fddt|D  |fddt|D  |fddt|D  |fddt|D  |dd |d D  |dd |d D  |dkr<d}|	 |	 fddD  |	 fddD  |	 fd dD  |	d!d D  |	 fd"dD  |	 fd#dD  |	 fd$dD  |	 fd%dD  |	 fd&dD  |	 fd'dD  |	 fd(dD  |fd)dt|d* D  |fd+dt|d* D  |fd,dt|d* D  d d d d |dk  gt|	D ]$\}fd-dD |	|< qj|dkrd.}|rvg }|	D ]| q|d d  }	t|	}t|	}	|t|	 }g }|D ]| q|d d  }t|}t|D ]}|	t
| q |rntd/ td0| d1 tt|	 d2  td3 ||	gS |dkrN|rFtd4 t|d5krtd0| d6 tt| d7  t|d5k r>td0| d8 tt| d9 tt|d  d: tt|	 d9 tt|	d  d; tt|	t|	d   d7  td< ||	gS d S )=Nr   r   r@  rA  rB  r   r+   r=  r  rC  rD  c                    s"   g | ]  fd dD qS )c              
      s*   g | ]"}t |d d   d  gqS rE  rF  r   rG  r   r   r     r   z(coordsCub.<locals>.<listcomp>.<listcomp>r   rJ  rK  rL  r   r     r   zcoordsCub.<locals>.<listcomp>c                    s4   g | ],}t t t t td dt  qS rM  rN  r   rO  r   r   r     r   rx   rQ  c              
   S   s*   g | ]"}t t |d g dg dqS rR  rS  r   r   r   r   r     r   c              
      s,   g | ]$}t t |d g d ddgqS rT  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g dd dgqS rW  rS  r   rV  r   r   r     r   c              
   S   s*   g | ]"}t t |d g dg dqS rX  rS  r   r   r   r   r     r   c              
      s,   g | ]$}t t |d g dd d  gqS rY  rS  r   rV  r   r   r     r   rR   c                    s:   g | ]2}t t t  d d gtddg d qS rZ  r[  r   rO  r   r   r     r   c                    s:   g | ]2}t t t d  d gtddg d qS r\  r[  r   rO  r   r   r     r   c                    s:   g | ]2}t t t   d gtddg d qS r]  r[  r   rO  r   r   r     r   c                    s<   g | ]4}t t t    d gtddg d qS r^  r[  r   rO  r   r   r     r   c                 S   s   g | ]}t |d g dqS r_  ra  rb  r   r   r   r     r   c                 S   s   g | ]}t |d g dqS rc  ra  rb  r   r   r   r     r   rd  c              
      s,   g | ]$}t t |d g d ddgqS re  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g d  dgqS rf  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g dd dgqS rg  rS  r   rV  r   r   r     r   c              
   S   s*   g | ]"}t t |d g dg dqS rX  rS  r   r   r   r   r     r   c              
      s,   g | ]$}t t |d g d ddgqS rT  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g d  dgqS rT  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g dd dgqS rT  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g dd d  gqS rh  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g d d gqS re  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g d   gqS ri  rS  r   rV  r   r   r     r   c              
      s,   g | ]$}t t |d g dd  gqS rg  rS  r   rV  r   r   r     r   c                    s:   g | ]2}t t t  d d gtddg d qS rZ  r[  r   rO  r   r   r     r   r   c                    s:   g | ]2}t t t d  d gtddg d qS r\  r[  r   rO  r   r   r     r   c                    s:   g | ]2}t t t  d d gtddg d qS rj  r[  r   rO  r   r   r     r   c              	      s"   g | ]}t t | qS r   rS  r   rk  r   r   r     r   ro  rp  rq  rr  rs  rt  ru  r   rv  rw  rx  ry  rz  r{  r|  r}  r  r   r  r   r;  r  s    * 2




   &


 
 tr;  c                 C   s*   dt jv rt|  ndd l}||  d S )Nz2.7r   )sysversionreload	importlib)whichr  r   r   r   
reload_lib  s    

r  z	DM_lib.pyWindowsz%A, %B %d, %Y %H:%M:%Sz   |||  py_ver r   z' |||||||||||||||||||||| CC by-nc-sa |||z?   |||  DM_lib mini version imported in %ss             ||| 
%sz=   |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c                 C   s8   t | std dS t | |}t | | t | S )z

    z!!! curve ist not closedN)r   IsCurveClosedr   rj   	CurveSeamCurveStartPoint)ZcrvIDZ	set2pointZparamr   r   r   setCrvStartPoint  s    
r  c                     s   g d} t ddg}t t dg}dt dg}g dt ddgt t dgdt dgg}dd | |||fD }|dd |D  td t d t dkpt dk  td	 t d t dkpt dk  td
 t d t dk  g  fdd|D }t|S )Nr   r   c              
   S   sN   g | ]F}t |td  t dk td  t dk td  t dk gqS )rB  r   )r   r.   rI  r  lowerr   r   r   r   r     r   z makeDummyBox.<locals>.<listcomp>c                 S   s   g | ]}t |d d tgqS )r   )r   r.   rI  r   r   r   r   r     r   r+   fer   rR   r   c              	      s"   g | ]}t t |tt qS r   )r   r.   r9  rl  rm  r   ZposXr   r   r     r   )rI  r  rn  r  r  r   AddBox)r7   r8   r9   p3rB   r   r  r   makeDummyBox
  s    


"jr  333333?r   c
           B   	      s   t dg d ttd ds&|	r>td td td |	rntd ttg d||dggg d	 d
tdd t	|d |d  t	| d |d dg}
t
t	|d |d ddgdt	d
dt	d
dg}t
t	|d |d  ddgdt	d
dt	d
dg}g }g }|rdt	| d | d dg}dt	| d | d t	|d |d g}dt	| d |d t	|d |g}dt	|d |d t	|d |d g}dt	|d |d dg}nrd| d dg}d| d t	|d |d g}ddt	|d |g}d|d t	|d |d g}d|d dg}|||||g}|	rtt|	 g }tt|d |d |  }|	rtd|d |D ]}t||
}t||}t|
|}t||d d }t||d d }|| || |	rpt|
}t|}t|}t|} t|	 t| t|  t| t| t| t|d D ](}!t|!| }"t|||"}#||# qq||g}$g }$t|d D ]F}%g }&tdD ](}'|&||'d |d  |%d    q|$|& qg }(t|D ]}%tdD ]}'||'d |d  |%d   })||'d |d  |%d   }*||'d |d  |%d   }+||'d |d  |%d   },|)|*|+|,g}-|(|- q,q ttt|||  d d }.g }/tt|d |d |  }0t|d |d t|d |d t|d |d   }1tt|0|1 }2|0|2 }3|rt|.}0t|.d }2t|.d }3|	rtd|2d|3d t|0d D ]0}4t|4|0 }"t|d |d |"}#|/|# qt|0d D ]j}4|4|3k rt|4|3 }"t|d |d |"}#|/|# n.t|4|3 |2 }"t|d |d |"}#|/|# qg }5t|0D ]\}4|/|4d  })|/|4d  }*|/|4d |0d   }+|/|4d |0d   },|)|*|+|,g}-|5|- qLg }6tt|d |d |  }7t|d |d t|d |d t|d |d   }8tt|7|8 }9|7|9 }:|r@|.}7t|.d }9t|.d }:|	rVtd|9d|:d t|7d D ]0}4t|4|7 }"t|d |d |"}#|6|# qbt|7d D ]j}4|4|:k rt|4|: }"t|d |d |"}#|6|# n.t|4|: |9 }"t|d |d |"}#|6|# qg };t|7D ]\}4|6|4d  })|6|4d  }*|6|4d |7d   }+|6|4d |7d   },|)|*|+|,g}-|;|- qg }<|<|( |<|5 |<|; |	rt|d}=|	rt|d}>|		r@t|	 t|}?t|	d  t|? t|/}?t|	d  t|? t|6}?t|	d  t|? t|=|>g |	sL|
r||dg |		rtd  ttg d gg d t|<D ] \}@}- fdd|-D |<|@< 	qt|(D ] \}@}- fdd|-D |(|@< 	qt|5D ] \}@}- fdd|-D |5|@< 	qt|;D ] \}@}- fdd|-D |;|@< 
q
t|$D ] \}@} fdd|D |$|@< 
q4 fdd|D } fd d|/D }/ fd!d|6D }6|
r|$D ] }t|d t|	d"  
qn |	
r|<|(|5|;|$||/|6g}Atd#|Ad d d d$ |<|(|5|;|$||/|6gS )%a  
    Generate a small archetypal house, distorted along perspective algorithms
    A setup for the development of individual panels
    Inspired by
      Albrecht Duerer's "Underweysung" (1525)
      #https://de.wikipedia.org/wiki/Perspektive#Geschichte
      #https://en.wikipedia.org/wiki/Albrecht_Duerer
    And
      MVRDVs "Porterlodges for the National Park De Hoge Veluwe" (1996)
      https://mvrdv.com/projects/167/hoenderloo-lodge?photo=15877
      https://www.miesarch.com/work/2994
    Parameters:
      p_width (float, optional): Approx. panel width in units
      l_dist (float, optional): Approx. length of the lodge in units
      d_dist (float, optional): Approx. depth of the lodge in units
      h_dist (float, optional): Approx. height of the lodge in units
      x_pos (float, optional): Move origin of the lodge in x
      y_pos (float, optional): Move origin of the lodge in y
      d_grid (boolean, optional): Fixed depth grid on the the small sides
      d_distord (boolean, optional): Distord basic section of the house
      demo (boolean, optional): Run demo to get an object
      verbose (int, optional): talk & sleep / Print and depict generation of the lodge
    Returns:
      list(float): list[][][] of all panels, containing groups of 4 points
      list(float): list[][][] of just the sleeve's panels
      list(float): list[][][] of just the right section's panels
      list(float): list[][][] of just the left section's panels
      list(float): list[][][] of the sections, containing groups of 5 points
      list(float): list[][] of all the cvs on the sleeve
      list(float): list[][] of all the cvs on the right section
      list(float): list[][] of all the cvs on the left section
    Example:
      import dm2_lib as dm2
      all_data = dm2.getLodge( verbose=1000, demo=1 )
      panels = all_data[0]
      panels_sleeve = all_data[1]
      panels_right = all_data[2]
      panels_left = all_data[3]
      sections = all_data[4]
      cvs_sleeve= all_data[5]
      cvs_right= all_data[6]
      cvs_left= all_data[7]
    zLODGE::demorE   r   z	                      ________z 	                     /_/_/_|__\zA	### dmLODGE          |_|_|_|__|
	########################DM2_w25z{	### return [ panels, panels_sleeve, panels_right, panels_left, sections, cvs_sleeve, cvs_right, cvs_left ] => allData[] !
r   )rG   r      r   r   r   r   rR   rx   z1	the long sides / the sleeve will be separated inz	segments.r   z'	the section on the right is devided inandzpanels.z)	the section on the other end is split inz	new origin position =)rG   r   rG   c                    s   g | ]}t | qS r   rF  r   ZmovVecr   r   r   	  r   zgetLodge.<locals>.<listcomp>c                    s   g | ]}t | qS r   rF  r   r  r   r   r   
  r   c                    s   g | ]}t | qS r   rF  r   r  r   r   r     r   c                    s   g | ]}t | qS r   rF  r   r  r   r   r     r   c                    s   g | ]}t | qS r   rF  r   r  r   r   r     r   c                    s   g | ]}t | qS r   rF  r   rf   r  r   r   r     r   c                    s   g | ]}t | qS r   rF  r  r  r   r   r     r   c                    s   g | ]}t | qS r   rF  r  r  r   r   r     r   r   z/	### allData[0][0][0] = panels[0][0] = "p0" = [z] etc etc etc ... )r  r   r   r  r   rK   rL   r   randintr   PlaneFromNormalSleepr   rI   r,   r.   r?   PlaneCurveIntersectionr<   AddPointr>   DeleteObjectr;   r=   r4   r   r  r   )BZp_widthZl_distZd_distZh_distZpos_xZpos_yZd_gridZ	d_distordZdemor   Zfocusplane0plane1Zsection0Zsection1r   r   cdr  sectionZ
cvs_sleeveZsubdiv_lrk   r2   endZcrv_idZpierce0Zpierce1Zfoc_idZpnt_idZsection0_idsZsection1_idsr  r1   r3   sectionsur   vZpanels_sleeveZpnt0Zpnt1Zpnt2Zpnt3panelZsubdiv_dZ	cvs_rightZ	subdiv_d0Zfac_d0aZ
subdiv_d0aZ
subdiv_d0bpZpanels_rightZcvs_leftZ	subdiv_d1Zfac_d1aZ
subdiv_d1aZ
subdiv_d1bZpanels_leftZpanelsZsection0_idZsection1_idZcvs_idsrC   ZallDatar   r  r   getLodge  sd   ,$".(* 












& <
<












*****	r  )g&?gy޿r   )gy?g&?r   )g	@g `4@r   r   r   (         @g     U@g      6@     c@c                 C   sl   t rL| tks4|tks4|tks4| dk s4|dk s4|dk rLtd| ||d g dS t| |t  |t t   S d S )Nr   z.*** getUnoCoord: any parameter too big or neg:z? ______________***r   )UNerrorLDHr   UnoGridCoords)lr  hr   r   r   getUnoCoord:  s    4r  c           
      C   s   ||dk 7 }t | d  }g }t|D ]|}t|D ]n}t| D ]`}t}	t|	ttt| |d  }	t|	tt|| }	t|	dd|| g}	|	|	 q<q0q$|S )NrR   r   r   )
lenYr;   uno0r   r.   r-   unoXlenXunoYr<   )
r  r  r  fHZslab_spacingr  rV   rT   rU   r   r   r   r   getUnoGridCoordsD  s     r  )r  r  r  r  c                 C   s^   t t|t td  }t t| t td  }dd|t g}t 	t 	t 	t
|||}|S )Nr   r   )r   r-   r  r  depthr  r  slabsr  r.   r  )r  r  r  ZvecXZvecYZvecZZvecXYZr   r   r   gCb  s
    r  c                 C   s  d}d}d}d}d}t t tt tt ttg d t t tt tt tt	g d t t tt tddd| gg d	 t 
 d
 }t 
 d }t 
 d }td|d D ]X}	t |t tt	| |	  | rtd|d D ]$}
t t 
 d t tt|  qqtd|d D ]}t |dd|| g q(| rtd|d D ]D}	t |t tt	| |	  t t 
 d dd||d  g qZd S )Nr   r   '   r  r  )rG   r   r   )r   rG   r   r   )r   r   rG   rR   r   )r   rK   r?   r  r.   r-   r  r  r  r  r   r;   
CopyObject)ZshowAllr  r  floorsr  lenZZlinXZlinYZlinZrU   rT   r  r   r   r   UN_slabi  s,    ((*$r  r  c           #      C   s  t t tdddtddd }}t t tdddtddd }	}
g }g }g }g }g }g }t tdddtddd}t tdddtddd}t tdddtddd}t| | }t|| }t|| }|| }|| }t tdddtddd| }t|d D ]$}t|d D ]}t t tdddt |
|| dd|| g}t t tdddt |
||d  dd|| g}t t tdddt |
||d  dd||d  g}t t tdddt |
||d  dd||d  g}||||g} ||||g} |	|  |	|  q*qt|d D ]}t|d D ]}!t t tdddt |||! dd|| g}t t tdddt |||!d  dd|| g}t t tdddt |||!d  dd||d  g}t t tdddt |||!d  dd||d  g}||||g} |	|  |	|  q^qL|D ]0}"dd |"D } | 
  |	|  |	|  ql|D ]0}"dd |"D } | 
  |	|  |	|  qt|d D ]F}td|d D ].}!t t tdddt |
||d  t |||! }t t tdddt |
||d  t |||! }t t tdddt |
||d  t |||!d  }t t tdddt |
||d  t |||!d  }d	 |d
<  |d
<  |d
< |d
< ||||g} |	|  |	|  qq|rtd tdt|  d t| d t| d t| d t| d t| d t|d td td ||||||gS )Nr   r   r   rx   r  c                 S   s0   g | ](}t t td dd td d d |qS )r   rx   r   r.   r,   r  r   r   r   r   r     r   z$getUNpanelCoords.<locals>.<listcomp>c                 S   s0   g | ](}t t td ddtddd|qS )r   r   r  r   r   r   r   r     r      rR   z7    ### ################ DM2_w24 / hu_06 / UN_panellingz    ### getUNpanelCoords( anzL=z,anzH=z,anzD=z,stepL=z,stepH=z,stepD=z) ..zpanelCoordLists generated:z]    ### allPanels = [frontPanels, backPanels, sidePanels, upSidePanels, allPanels, topPanels]zR    ### ##########################################################################)r   r5   r,   r  rI   r   r;   r.   r-   r<   reverser   r'   r   )#anzLanzHanzDstepLstepHstepDr   depthVecdVec	lengthVeclVecfrontPanels
sidePanels
backPanelsupSidePanels	topPanels	allPanelsZlenLZlenDZlenHZanzYZanzZZanzXZdeltaLZdeltaHZdeltaDrV   rU   r7   r8   r9   r  rB   rT   r  r   r   r   getUNpanelCoords  s|    && 26::
26::


88<< 
Xr  )r  r  r  r  r  r  r      c              	   C   s  t tdk rdantd7 a|dkr&d}|dkr2d}tt t| d | d |d kr>t|  t| d | d }t	| d t| d | d |t| d | d g t	t| d | d | d t| d | d |g t	|t| d | d | d t| d | d g t	t| d | d |t| d | d | d g t t|d krpt|k rpt
tt||d n tdtt d	 tt t  tS )
NrR   r   r   i  r   rx   )r  	maxPanelsminHigz4*** ********* **********
*** recursive executions : z >> anzahl panels : )r   	recPanelscntr   r   r   rI   r   r4   r<   dividePanelr:  r   r'   )r  r  r  ZpMidr   r   r   r    s"    

2222 r  )r   )r"   )r+   )r   r   )r   )r+   )r+   )r+   )r+   )r+   )r+   )r+   )r+   )r   )r   r   r   )r   r   )r   r   rF   )r   r   )r   rx   rx   r   )Tr   r   r   )r   r   )r   )r  r   )r   )r   r   r   r   r  r   r  r!  )r   r   r   r   r  r  r  r!  )r6  r   )
r  r   r   r   r   r   r   r   r   r   )r   r   r  r  )r   r   r   )r   )r   r  rx   r   r   r   r   )r  rhinoscriptsyntaxr   scriptcontextr   r   r  osplatformdatetimer  r   r   	itertoolsr   r   r   UnitAbsoluteTolerancepir   r   r   r   r!   r(   r*   r4   r:   rD   rP   rW   ra   rd   rh   rl   rn   ro   rr   ru   rv   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   rB   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r
  r  r  r   r   r  r3  r  r<  r   r  r  r;  r  getcwdlibsystempathisfilegetmtimeZtimsfromtimestampstrftimeZsaveDatr   r'   r  rI  r  rn  rl  rm  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ZUnoBaseCoordsUnoPanelCoordsr  r  r:  r  r   r   r   r   r   <module>	   s   	

	


"	





	







-
S







 
$
:BrBn
  	


%
ZF.