Friday, March 7, 2008

Rhino Script- Triangle Subdivision




Option Explicit
'Script written by Natasha Harper
'Script version Friday, March 07, 2008 10:09:37 AM

Call Main()
Sub Main()
Call Rhino.AddLayer("New Triangles", RGB(255, 0, 0))
Rhino.CurrentLayer ("New Triangles")
arrTri = Rhino.GetObjects("Select triangles", 4)

Dim tript00,tript01,tript02, curve1, curve2, curve3, arrCVPoints
Dim arrTri, tri, arrArea, area, arrCP, triCP, arrPolypoints1, arrPolypoints2, arrPolypoints3
Dim LengthA, LengthB, LengthC, AMidPt, BMidPt, CMidPt


For Each tri In arrTri
arrArea = Rhino.CurveArea(tri)
area =(arrArea(0))
Dim triCoord : triCoord = Rhino.PolylineVertices (tri)
Dim distanceA : distanceA = Rhino.Distance(triCoord(0), triCoord(1))
Dim distanceB : distanceB = Rhino.Distance(triCoord(1), triCoord(2))
Dim distanceC : distanceC = Rhino.Distance(triCoord(2), triCoord(0))

LengthA = Rhino.AddLine(triCoord(0), triCoord(1))
LengthB = Rhino.AddLine(triCoord(1), triCoord(2))
LengthC = Rhino.AddLine(triCoord(2), triCoord(0))

AMidPt = Rhino.CurveMidPoint (LengthA)
BMidPt = Rhino.CurveMidPoint (LengthB)
CMidPt = Rhino.CurveMidPoint (LengthC)

If isNull(tri) Then
Call rhino. print("Error")


ElseIf area > 1000 And (distanceA < .5*distanceB Or distanceC < .5*distanceC) Then Dim arrShortSideA : arrShortSideA = Array(triCoord(2),BMidPt, CMidPt, triCoord(2)) Call Rhino.AddPolyline(arrShortSideA) Dim arrQuadA : arrQuadA = Array(triCoord(0), triCoord(1), BMidPt, CMidPt, TriCoord(0)) Dim polyQuadA : polyQuadA = Rhino.AddPolyline (arrQuadA) Dim QuadCenterA : QuadCenterA = Rhino.CurveAreaCentroid(polyQuadA) Dim arrQuad1A : arrQuad1A = array(triCoord(1), BMidPt, QuadCenterA(0), triCoord(1)) Dim arrQuad2A : arrQuad2A = Array(BMidPt, CMidPt, QuadCenterA(0), BMidPt) Dim arrQuad3A : arrQuad3A = Array(CMidPt, triCoord(0), QuadCenterA(0), CMidPt) Dim arrQuad4A : arrQuad4A = Array(triCoord(0), triCoord(1), QuadCenterA(0), triCoord(0)) Call Rhino.AddPolyline (arrQuad1A) Call Rhino.AddPolyline (arrQuad2A) Call Rhino.AddPolyline (arrQuad3A) Call Rhino.AddPolyline (arrQuad4A) Call Rhino.DeleteObject (polyQuadA) Call Rhino.DeleteObject (tri) ElseIf area > 1000 And (distanceB < .5* distanceA Or distanceC < .5*distanceC) Then Dim arrShortSideB : arrShortSideB = Array(triCoord(0),AMidPt, CMidPt, triCoord(0)) Call Rhino.AddPolyline(arrShortSideB) Dim arrQuadB : arrQuadB = Array(triCoord(1), triCoord(2), CMidPt, AMidPt, triCoord(1)) Dim polyQuadB : polyQuadB = Rhino.AddPolyline (arrQuadB) Dim QuadCenterB : QuadCenterB = Rhino.CurveAreaCentroid(polyQuadB) Dim arrQuad1B : arrQuad1B = Array(triCoord(1), triCoord(2), QuadCenterB(0), triCoord(1)) Dim arrQuad2B : arrQuad2B = Array(triCoord(2), CMidPt, QuadCenterB(0), triCoord(2)) Dim arrQuad3B : arrQuad3B = Array(CMidPt, AMidPt, QuadCenterB(0), CMidPt) Dim arrQuad4B : arrQuad4B = Array(AMidPt, triCoord(1), QuadCenterB(0), AMidPt) Call Rhino.AddPolyline (arrQuad1B) Call Rhino.AddPolyline (arrQuad2B) Call Rhino.AddPolyline (arrQuad3B) Call Rhino.AddPolyline (arrQuad4B) Call Rhino.DeleteObject (polyQuadB) Call Rhino.DeleteObject (tri) ElseIf area > 1000 And (distanceC < .5* distanceA Or distanceB < .5*distanceC) Then Dim arrShortSideC : arrShortSideC = Array(triCoord(1),AMidPt, BMidPt, triCoord(1)) Call Rhino.AddPolyline(arrShortSideC) Dim arrQuadC : arrQuadC = Array(triCoord(0), AMidPt, BMidPt, TriCoord(2), triCoord(0)) Dim polyQuadC : polyQuadC = Rhino.AddPolyline (arrQuadC) Dim QuadCenterC : QuadCenterC = Rhino.CurveAreaCentroid(polyQuadC) Dim arrQuad1C : arrQuad1C = Array(triCoord(2), triCoord(0), QuadCenterC(0), triCoord(2)) Dim arrQuad2C : arrQuad2C = Array(triCoord(0), AMidPt, QuadCenterC(0), triCoord(0)) Dim arrQuad3C : arrQuad3C = Array(AMidPt, BMidPt, QuadCenterC(0), AMidPt) Dim arrQuad4C : arrQuad4C = Array(BMidPt, triCoord(2), QuadCenterC(0), BMidPt) Call Rhino.AddPolyline (arrQuad1C) Call Rhino.AddPolyline (arrQuad2C) Call Rhino.AddPolyline (arrQuad3C) Call Rhino.AddPolyline (arrQuad4C) Call Rhino.DeleteObject (polyQuadC) Call Rhino.DeleteObject (tri) ElseIf area > 2000 Then
'Rhino.ObjectLayer (tri), "New Triangles"
arrCvPoints = Rhino.PolylineVertices (tri)

triCP = Rhino.CurveAreaCentroid(tri)
arrCP = Rhino.AddPoints (triCP)
arrPolypoints1 = array(arrCVPoints(0),arrCVPoints(1), triCP(0), arrCVPoints(0))
arrPolypoints2 = array(arrCVPoints(1),arrCVPoints(2), triCP(0), arrCVPoints(1))
arrPolypoints3 = array(arrCVPoints(2),arrCVPoints(0), triCP(0), arrCVPoints(2))

Call Rhino.AddPolyline (arrPolypoints1)
Call Rhino.AddPolyline (arrPolypoints2)
Call Rhino.AddPolyline (arrPolypoints3)
Call Rhino.DeleteObject (tri)

End If

Call Rhino.DeleteObject (LengthA)
Call Rhino.DeleteObject (LengthB)
Call Rhino.DeleteObject (LengthC)


Next

End Sub

Thursday, March 6, 2008

Rhino Script - Closed Bladder from Curve





Option Explicit
'Script written by Katie Adee & Natasha Harper
'Script version Monday, March 03, 2008 10:25:36 PM

Call Main()
Sub Main()
Dim arrBladder,blad

arrBladder= Rhino.GetObjects("Select curves", 4)

For Each blad In arrBladder
Call Rhino.AddLayer("ConstLines3", 0,255,0)
Call Rhino.CurrentLayer ("ConstLines3")
Dim arrQuad, arrQuadPts, arrCentroid,arrCPt,arrAxis
Dim arrLine, arrPerpVec,arrVec,line, arrNegPerpVec
Dim arrPos, arrPosLine, arrNeg, arrNegLine,Morepts
arrQuad = Rhino.DivideCurve (blad,4)
arrQuadPts = Rhino.AddPoints(arrQuad)
arrCentroid = Rhino.CurveAreaCentroid (blad)
arrCPt = Rhino.AddPoints(arrCentroid)
arrAxis = Rhino.AddLine (arrQuad(0),arrQuad(2))
arrVec= Rhino.VectorAdd (arrQuad(0),arrQuad(2))
arrPosLine = Rhino.AddLine ( arrCentroid(0),arrQuad(1))
arrNegLine = Rhino.AddLine (arrCentroid(0),arrQuad(3))
arrPerpVec = Rhino.RotateObject( arrPosLine, arrCentroid(0),90, arrVec)
arrNegPerpVec = Rhino.RotateObject(arrNegLine,arrCentroid(0),90,arrVec)

arrPos = rhino.DivideCurve (arrPosLine,2)
arrNeg = rhino.DivideCurve (arrNegLine,2)

Dim arrPosPoints,arrNegPoints, dblScaleMid, dblScaleEnd

arrPosPoints = rhino.addPoints( arrPos)
arrNegPoints = Rhino.AddPoints (arrNeg)
Call Rhino.AddLayer("Offsets3", 255,0,255)
Call Rhino.CurrentLayer ("Offsets3")
Dim arrLoft01,arrLoft02,arrLoft04,arrLoft05
Dim arrScale1, arrScale2
Dim arrL01,arrloft

arrScale1 = array(.1,.1,.1)
arrScale2 = array(.75,.75,.75)

arrLoft01= Rhino.CopyObject(blad, arrCentroid(0),arrPos(2))
Call Rhino.ScaleObject (arrLoft01, arrPos(2), arrScale1)
Call Rhino.ObjectLayer (arrLoft01,"offsets3")

arrLoft02= Rhino.CopyObject(blad, arrCentroid(0),arrPos(1))
Call Rhino.ScaleObject (arrLoft02, arrPos(2), arrScale2)
Call Rhino.ObjectLayer (arrLoft02,"offsets3")

arrLoft04= Rhino.CopyObject(blad, arrCentroid(0),arrNeg(1))
Call Rhino.ScaleObject (arrLoft04, arrNeg(2), arrScale2)
Call Rhino.ObjectLayer (arrLoft04,"offsets3")

arrLoft05= Rhino.CopyObject(blad, arrCentroid(0),arrNeg(2))
Call Rhino.ScaleObject (arrLoft05, arrNeg(2), arrScale1)
Call Rhino.ObjectLayer (arrLoft05,"offsets3")
Call Rhino.AddLayer ("BladderClosed", 255,0,100)
Call Rhino.CurrentLayer ("BladderClosed")
arrLoft = array(arrLoft01,arrLoft02,blad,arrLoft04,arrLoft05)

Call rhino.AddLoftSrf (arrLoft)

'Call rhino.SelectObject (arrloft01)
'Call rhino.command ("cap")









Next
End Sub

Rhino Script - Surface lofted Between Triangle and offset degree Curve




Option Explicit
'Script written by KatieAdee & NatashaHarper
'Script version Sunday, March 02, 2008 10:01:46 PM
Call Rhino.AddLayer("cv", RGB(255, 100, 0))
Call Rhino.CurrentLayer("cv")
Call Main()
Sub Main()
Dim arrTri,tri,arrCvPoints, arrBladder,surf, blad, loft
arrTri = Rhino.GetObjects("Select triangles", 4)

For Each tri In arrTri

If isNull(arrBladder) Then
Call rhino. print("Error")
Else
arrCvPoints=Rhino.PolylineVertices (tri)
arrBladder = Rhino.AddCurve (arrCvPoints,3)
blad = arrBladder
loft = array(tri,blad)
Call Rhino.AddLayer("PlanarSrf", RGB(10, 100, 50))

Surf= Rhino.AddLoftSrf (loft)
Call Rhino.ObjectLayer(Surf,"PlanarSrf")
End If


Next


End Sub

Rhino Script - Creating Midpoints of Lines




Option Explicit

'Script written by katieadee & NatashaHarper

'Script version Wednesday, February 27, 2008 3:13:01 PM


Dim baseCrv,arrCrvDomain,arrStartPt,arrEndPt,arrMidPt,arrPlane,circle,circRad

Call Rhino.AddLayer("Points", RGB(255, 0, 0))

Call Rhino.CurrentLayer("points")

baseCrv = rhino.GetObjects("select base Curves",4)
Call rhino.EnableRedraw(False)

Dim j

For j = 0 To UBound(baseCrv)


If Rhino.CurveLength(baseCrv(j))

arrCrvDomain = rhino.CurveDomain(baseCrv(j))

arrStartPt = rhino.EvaluateCurve(baseCrv(j),arrCrvDomain(0))

arrEndPt = rhino.EvaluateCurve(baseCrv(j),arrCrvDomain(1))

arrMidPt = rhino.evaluateCurve(baseCrv(j),(arrCrvDomain(1)-arrCrvDomain(0))/2)

Rhino.AddPoint (arrMidPt)


End If

Next


Call rhino.EnableRedraw(True)

Rhino Script #1 Curve Inside Triangle




Option Explicit'Script written by '

Script version Sunday, March 02, 2008 10:01:46 PM


Call Rhino.AddLayer("cv", RGB(255, 100, 0))

Call Rhino.CurrentLayer("cv")


Dim arrTri,tri, arrBladder, blad, loft, arrCvPoints


arrTri = Rhino.GetObjects("Select triangles", 4)

Call rhino.EnableRedraw(False)


For Each tri In arrTri If isNull(arrBladder) Then

Call rhino. print("Error")

Else

arrCvPoints=Rhino.PolylineVertices (tri)

arrBladder = Rhino.AddCurve (arrCvPoints,2)

End If

Next
Call rhino.EnableRedraw(True)


Processing Assignment










import processing.dxf.*;


/* Created: 2-9-08 Modified by Katie Adee and Natasha Harper Node/particle reorganization and connection logic based on distance thresholds */


import traer.physics.*;

import traer.animation.*;

import processing.opengl.*;


//global variables

final float NODE_SIZE = 5; //node diameter

final float EDGE_LENGTH = 10; //length of branching lines initially

final float EDGE_STRENGTH = 0.4;

//strength of spring (controls the amount of stretching possible)

final float SPACER_STRENGTH = 300; // controls the amount of reorganization


float vertDist = 20;

float camPosition = 1000;
ParticleSystem physics;

Smoother3D centroid;

Particle z;

Particle anchor;


// PROCESSING /////////////////////////////////////


boolean record;


void setup(){

//size( screen.width, screen.height);

size( 900,900, OPENGL);

smooth();

frameRate( 24 );

strokeWeight(1);

ellipseMode( CENTER );
physics = new ParticleSystem( 0, 1.0 );

centroid = new Smoother3D( 0.8 );

initialize();

}


void draw(){


if (record) {

beginRaw(DXF, "output-####.dxf");

}


if (mousePressed==true){

drawCamera(); }

else{

camera (width,height, 900, (width/2), (height/2), 0, 1, 1,1); }


physics.tick( 1.0 );

//within physics library, creates a counter to continue to make more nodes

( physics.numberOfParticles() > 1 )

updateCentroid();

centroid.tick();

background(255);

translate( width/2 , height/2 );

scale( centroid.z() );

translate( -centroid.x(), -centroid.y() );


drawLines();

drawNetwork();


if (record) {

endRaw(); record = false;

}
}


void drawNetwork(){

// finds a node within the system and draws a new node branching from that point

noStroke();

for ( int i = 0; i <>
Particle v = physics.getParticle( i );
stroke (.1);

fill(0,0,100,75);

ellipse( v.position().x(), v.position().y(), NODE_SIZE+15, NODE_SIZE +15);

//fill(150,30);

//ellipse( v.position().x(), v.position().y(), NODE_SIZE+55, NODE_SIZE +55);

//stroke (255,0,0);

fill(0,150);

ellipse( v.position().x(), v.position().y(), NODE_SIZE, NODE_SIZE );


translate (0,0,vertDist*.5);

fill(100,0,0,75);

ellipse( v.position().x(), v.position().y(), NODE_SIZE+15, NODE_SIZE +15);

//fill(150,30);

//ellipse( v.position().x(), v.position().y(), NODE_SIZE+55, NODE_SIZE +55);

fill(0,150);

ellipse( v.position().x(), v.position().y(), NODE_SIZE, NODE_SIZE );
translate (0,0,vertDist*-.5);


translate (0,0,vertDist);

fill(0,100,0,75);

ellipse( v.position().x(), v.position().y(), NODE_SIZE+15, NODE_SIZE +15);

//fill(150,30);

//ellipse( v.position().x(), v.position().y(), NODE_SIZE+55, NODE_SIZE +55);

fill(0,150);

ellipse( v.position().x(), v.position().y(), NODE_SIZE, NODE_SIZE );
translate (0,0,vertDist*-1);


translate (0,0,vertDist*2);

fill(100,75);

ellipse( v.position().x(), v.position().y(), NODE_SIZE+15, NODE_SIZE +15);

//fill(150,30);

//ellipse( v.position().x(), v.position().y(), NODE_SIZE+55, NODE_SIZE +55);

fill(0,150);

ellipse( v.position().x(), v.position().y(), NODE_SIZE, NODE_SIZE );
translate (0,0,vertDist*-2);


stroke(0);

strokeWeight(1);

line(v.position().x(), v.position().y(),0,v.position().x(), v.position().y(),vertDist);

line(v.position().x(), v.position().y(),vertDist,v.position().x(), v.position().y(),vertDist*2);

}


// draw branching lines that connect each new node

stroke(0);

strokeWeight (2);

beginShape( LINES );

for ( int i = 0; i <>
Spring e = physics.getSpring( i );

Particle a = e.getOneEnd();

Particle b = e.getTheOtherEnd();

vertex( a.position().x(), a.position().y(),0 );

vertex( b.position().x(), b.position().y(),0 );

vertex( a.position().x(), a.position().y(),vertDist*.5 );

vertex( b.position().x(), b.position().y(),vertDist*.5 );

vertex( a.position().x(), a.position().y(),vertDist );

vertex( b.position().x(), b.position().y(),vertDist );

vertex( a.position().x(), a.position().y(),vertDist*2 );

vertex( b.position().x(), b.position().y(),vertDist*2 );

}

endShape();

}



// drawing connection lines based on a distance threshold for secondary organizations

void drawLines(){

for ( int i = 0; i <>
for ( int j = 0; j <>
Particle d= physics.getParticle(i);

Particle e= physics.getParticle(j);

float distance= dist (d.position().x(), d.position().y(),e.position().x(), e.position().y());
if((distance>=45)&&(distance<60)){>
strokeWeight(1);

stroke(200,0,0);

//line(d.position().x(), d.position().y(),0,e.position().x(), e.position().y(),0); l

ine(d.position().x(), d.position().y(), 0 ,e.position().x(), e.position().y(), vertDist*.5);

line(d.position().x(), d.position().y(),vertDist*.5 ,e.position().x(), e.position().y(),vertDist); line(d.position().x(), d.position().y(),vertDist ,e.position().x(), e.position().y(),vertDist*2);

}

if((distance>=40)&&(distance<50)){>
strokeWeight(1);

stroke(0,200,0);

//line(d.position().x(), d.position().y(),0,e.position().x(), e.position().y(),0);

//line(d.position().x(), d.position().y(), 0 ,e.position().x(), e.position().y(), vertDist);

//line(d.position().x(), d.position().y(),vertDist ,e.position().x(), e.position().y(),vertDist*2);

}

if((distance>=80)&&(distance<110)){>
strokeWeight(1);

stroke(0,0,200);

//line(d.position().x(), d.position().y(),0,e.position().x(), e.position().y(),0);

// line(d.position().x(), d.position().y(), 0 ,e.position().x(), e.position().y(), vertDist);

line(d.position().x(), d.position().y(),vertDist*2 ,e.position().x(), e.position().y(),vertDist*2);

}

}

}

}


void drawCamera(){

int rotation =mouseX;

int rotation2=mouseY;

float eyeZ = sin(radians(rotation2))*camPosition;

float newlength = cos(radians(rotation2))*camPosition;

float eyeX = cos(radians(rotation))*newlength;

float eyeY = sin(radians(rotation))*newlength;

camera(eyeX,eyeY,eyeZ,screen.width/2,screen.height/2,0,0,0,-1);

}


void keyPressed(){

if ( key == 'c' )

//clears screen and resets the script {

initialize();

return;

}
if (key == 's') //saves a jpeg of the screen when the s key is pressed

{

saveFrame ("nodes-####.jpg"); }
if (key == 'r') record = true;

if ( key == ' ' ) //when spacebar is pressed, a new node is added

{ addNode(); return; }

}


void mousePressed(){

if ( mousePressed == true)

{

drawCamera(); }

else { camera (width,height, 900, (width/2), (height/2), 0, 1, 1,1);

}

}


void updateCentroid()

// whenever system is reorganized or scaled, node positions have to be updated

{

float xMax = Float.NEGATIVE_INFINITY,

xMin = Float.POSITIVE_INFINITY,

yMin = Float.POSITIVE_INFINITY,

yMax = Float.NEGATIVE_INFINITY;


for ( int i = 0; i <>
Particle p = physics.getParticle( i );

xMax = max( xMax, p.position().x() );

xMin = min( xMin, p.position().x() );

yMin = min( yMin, p.position().y() );

yMax = max( yMax, p.position().y() );
}

float deltaX = xMax-xMin;

float deltaY = yMax-yMin;
if ( deltaY > deltaX )

centroid.setTarget( xMin + 0.5*deltaX, yMin +0.5*deltaY, height/(deltaY+50) );
else

centroid.setTarget( xMin + 0.5*deltaX, yMin +0.5*deltaY, width/(deltaX+50) );}


void addSpacersToNode( Particle p, Particle r ){

//reorganizes nodes so that they are as spaced out as possible within its connectionns

for ( int i = 0; i <>
Particle q = physics.getParticle( i );

if ( p != q && p != r )

physics.makeAttraction( p, q, -SPACER_STRENGTH, 20 );

//the negative sign makes particles repel rather than attract

}}


void makeEdgeBetween( Particle a, Particle b )

//creates a spring between node and new node

{

physics.makeSpring( a, b, EDGE_STRENGTH, EDGE_STRENGTH, random(25,40));}



void initialize()

//this function clears the screen and resets function

{

physics.clear();

physics.makeParticle();

centroid.setValue( 0, 0, 1.0 );

}


void addNode() //function that adds a new node everytime spacebar is pressed

{

Particle p = physics.makeParticle();
if (int(physics.numberOfParticles()) <= 10){

Particle q = physics.getParticle( (int)random(0, physics.numberOfParticles()-1) );

while ( q == p ) q = physics.getParticle( (int)random(0, physics.numberOfParticles()-1) );


addSpacersToNode( p, q );

makeEdgeBetween( p, q );

p.moveTo( q.position().x() + random( -1, 1 ), q.position().y() + random( -1, 1 ), 0 );

line (p.position().x(),p.position().y(),q.position().x(),q.position().y());

}

else{
Particle q = physics.getParticle( (int)random(physics.numberOfParticles()-11, physics.numberOfParticles()-1) );

while ( q == p ) q = physics.getParticle( (int)random(physics.numberOfParticles()-11, physics.numberOfParticles()-1) );

addSpacersToNode( p, q );

makeEdgeBetween( p, q );

p.moveTo( q.position().x() + random( -1, 1 ), q.position().y() + random( -1, 1 ), 0 );

line (p.position().x(),p.position().y(),q.position().x(),q.position().y());

}
}