### https://www.student.tugraz.at/scheicher/dm2/hu_4/hu_4_new.py
### grabbed:  2022-11-03 16:01:32
#################################


#####################################
### DM2_w22  #  AGruber@tugraz.at ###
### hu_04_startUP # infra_4_tetra ###
#####################################

##############################
import rhinoscriptsyntax as rs      ###
import random, time, sys            ###
rs.EnableRedraw(0)
sys.path.append("P:/")              ### add LW P:/ to rhino's default search path AND
sys.path.append("P:\WWW\default114\dm2")     ### add YOUR LW P:/WWW/user/ to rhino's default search path ...
import DM2_lib as dm                ### ... thus DM2_lib.py can be found !
##############################



dm.eA()                    ### same as: rs.DeleteObjects( rs.AllObjects() )
dm.eAA()


if 0:
    print "        /\\        "
    print "       / |\\       "
    print " TETR /__|_\\ EDER  h=a/3.0*(6.0**0.5) "
    print "_____/   |  \\______vulgo: \"hoehe ist gleich a durch 3 - mal wurzel aus 6\"\n"


if 1:
    pointsX = [[0, 0, 0], [0, 3, 0], [5, 3, 0]]
    if 0:
        ptA = dm.pntRandVec(-3, 3)
        ptB = dm.pntRandVec(-3, 3)
        ptX = dm.pntRandVec(-3, 3)
        dm.pointsX = [ptA, ptB, ptX]  ### check in another TAB !
        pointsX = [ptA, ptB, ptX]
    
    tetraCoords = dm.getTetraCoords( points=pointsX, flipH=1, flipAB=0, drawTetra=1, drawAll=0 )
    
    p0 = tetraCoords[0][0]
    p1 = tetraCoords[0][1]
    p2 = tetraCoords[0][2]
    
    pS = tetraCoords[1][2]
    
    #rs.AddCurve( [p0, p1,p2,pS], 1)
    
    kantenPaare = kPs = [ [[p0,p1], [p2,pS]],  [[p1,p2], [p0,pS]]]
    coords = []
    for pair in kPs[0:1]:
        for i in range(1001):
            cor0 = dm.pntInbetween( pair[0][0], pair[0][1], random.uniform(0,1) )
            cor1 = dm.pntInbetween( pair[1][0], pair[1][1], random.uniform(0,1) )
            corInnen = dm.pntInbetween( cor0, cor1, random.uniform(0,1) )
            coords.append( corInnen )
            #rs.AddPoints( [ corInnen ] )
            #if i%2000==0: rs.Redraw()
    rs.AddPoints( coords )
    

if 1:
    #rs.AddCurve(coords,1)
    coords = sorted(coords, key=lambda sortKey: (sortKey[2]) )
    #rs.AddCurve(coords,1)
    print round( coords[0][2], 2)
    print round(coords[-1][2], 2)
if 0:
    minZ = coords[0][2]
    maxZ = coords[-1][2]
    #rs.AddCurve( coords, 1)
    print len(coords)
    print "pnts", len(rs.ObjectsByType(1))
    for i,pnt in enumerate( rs.ObjectsByType(1) ):
        pass
        cor = rs.PointCoordinates(pnt)
        zVal = cor[2]
        col = abs(int(dm.reMap(zVal, minZ, maxZ, 100, 255)))
        if i % 50 == 0:
            print i, col
        rs.ObjectColor( pnt, [col,col,100] )

if 1:
    dm.eAA()
    rs.Redraw()
    pointsX = [[2, 0, 0], [1, 3, 0], [5, 2, 0],[2, 0, 10]]
    crv = rs.AddCurve( pointsX, 1)
    crv = rs.AddCurve( pointsX, 2)
if 1:
    ### curve DOMAIN
    dom = rs.CurveDomain(crv)
    print "*** domain : start =", dom[0], ".. end =", dom[1]
    pntX = rs.EvaluateCurve( crv, dom[1]*0.55 )
    #rs.AddPoint(pntX)

    anz = 88
    coords = []
if 0:
    for i in range(anz+1):
        pntX = rs.EvaluateCurve(crv,dom[1]/8*i)
        pntX = rs.EvaluateCurve(crv,dom[1]*random.uniform(0.2,0.8))
        coords.append(pntX)
    rs.AddPoints(coords)
if 0:
    for i in range(anz):
        p0 = random.choice(coords)
        p1 = random.choice(coords)
        pntX = dm.pntInbetween(p0,p1,0.5)
        pntX = dm.pntInbetween(p0,p1,random.uniform(0.2,0.8))
        rs.AddPoint(pntX)

if 1:
    #dm.eAA()
    ### curve NORMALebene 
    nPln = rs.CurvePerpFrame( crv, dom[1]*0.6 )
    rs.AddPoint( rs.EvaluateCurve(crv, dom[1]*0.6))
    #rs.AddPlaneSurface( nPln, 1, 1 )
    #rs.AddCircle(nPln, 1.0)
    rs.AddCurve(rs.DivideCurve( rs.AddCircle(nPln, 1.0), 8, 1),1)
if 1:
    pntX = rs.EvaluateCurve( crv, dom[1]*0.6 )
    nVec = dm.vecCurvePerpNormal(crv, crv_parameter=dom[1]*0.6, nor=[0, 1, 0])
    rs.ObjectColor( rs.AddLine(pntX, pntX + nVec), [200,0,0])
if 1:
    ### curve TANGENT
    tVec = rs.CurveTangent( crv, dom[1]*0.6 ) 
    nVec = rs.VectorRotate( tVec, 90.0, nPln[2] ) ### rotated tangent vec
    rs.ObjectColor( rs.AddLine(pntX, pntX+tVec), [0,0,200] )
    rs.ObjectColor( rs.AddLine(pntX, pntX+nVec), [0,200,0] )
    ### winkel btw LINES == pairs of coords 
    print rs.Angle2( [pntX, pntX+tVec], [pntX, pntX+nVec] )

    for i in range(anz):
        pntX = rs.EvaluateCurve( crv, dom[1]/anz*1 )
        tVec = rs.CurveTangent( crv, dom[1]/anz*1 )
        rs.ObjectColor(rs.AddLine(pntX,pntX+tVec),[0,200,200])


if 1:
    ### curveCLOSEST point
    pnt = [4,4,0]
    para = rs.CurveClosestPoint(crv, pnt)
    print "parameter",para
    cPnt = rs.EvaluateCurve( crv, dom[1]*para )
    rs.AddPoint( cPnt )
    rs.ObjectColor( rs.AddLine([0,0,0], cPnt), [0,200,200] )
if 0:
    ### points on curve
    coords = []
    anz = 64
    for i in range(1, anz):
        pntX = rs.EvaluateCurve( crv, dom[1]/anz*i )
        pntX = rs.EvaluateCurve( crv, dom[1]*random.uniform(0,1) )
        #rs.AddPoint( pntX )
        #rs.AddPoint( rs.EvaluateCurve( crv, dom[1]*random.uniform(0,1) ) )
    
        rs.Redraw()
    
    ### points and curves on plane
    coords = [ rs.EvaluateCurve( crv, dom[1]/anz*i ) for i in range(anz) ] ### smart listing 
    rs.AddPoints( coords )
    
    pairs = coords = [ [random.choice(coords), random.choice(coords)] for i in range(anz) ]
    print pairs[0]
    for pair in pairs:
        #rs.AddCurve( pair )
        for i in range(8):
            pntX = dm.pntInbetween( pair[0], pair[1],random.uniform(0.2, 0.9) )
            rs.AddPoint( pntX )
    rs.ZoomExtents()


###############################################
#___4_lazy_experts: automated capture to LW P:/
if 0:
    rs.ZoomExtents()
    rs.Command("-zoom Factor 0.95 enter", 0) # decrease zoom for better framing
    rs.Redraw()
    if  1:
        path = "P:/hu_04/images/"
        name = "tst.png"
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=1.5 DrawCPlaneAxes=No TransparentBackground=Yes "+path+name, 0)
        # .jpg and Scale=4 for webSite submission
        name = "tst_"+str(int(time.time()))+".jpg"
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=4 TransparentBackground=No  "+path+name, 0)
