is set up to manipulate strings into an STL file that is quite different from how Grasshopper defines meshes, in that an STL seems to define each face by XYZ points, Grasshopper wants a single list of all vertex points and then has an allied lists of topological connectivity according to vertex number, so for now I just hacked it to spit out points minus so many duplicates it generates for STL:
Right now it has an internal 3D trigonometric function I added input sliders to control, that creates surfaces that look a lot like molecular orbitals.
So how do I make a mesh? I failed to make a single mesh face from each STL face since AddMesh seems to want a list, so I tried making a single list and matching it with a simple ((1,2,3),(4,5,6),(7,8,9)...) array of connectivity but it hasn't worked yet since the STL list of vertices has duplicates that won't work for Grasshopper and removing the duplicates scrambles the connectivity relation.
After some work on this and seeing the output, I figure I could just randomly populate the mathematical function with points instead, unless it really gives a better mesh result than other routines. I'm not sure what to do with it yet, even if I get the mesh figured out.
import rhinoscriptsyntaximport RhinoPOINTS_CONTAINER =[]POINTS = []class Vector: # struct XYZ def __init__(self,x,y,z): self.x=x self.y=y self.z=z def __str__(self): return str(self.x)+" "+str(self.y)+" "+str(self.z) class Gridcell: # struct GRIDCELL def __init__(self,p,n,val): self.p = p # p=[8] self.n = n # n=[8] self.val = val # val=[8] class Triangle: # struct TRIANGLE def __init__(self,p1,p2,p3): self.p = [p1, p2, p3] # vertices # HACK TO GRAB VERTICES FOR PYTHON OUTPUT POINTS_CONTAINER.append( (p1.x,p1.y,p1.z) ) POINTS_CONTAINER.append( (p2.x,p2.y,p2.z) ) POINTS_CONTAINER.append( (p3.x,p3.y,p3.z) )# return a 3d list of values def readdata(f=lambda x,y,z:x*x+y*y+z*z,size=5.0,steps=11): m=int(steps/2) ki = [] for i in range(steps): kj = [] for j in range(steps): kd=[] for k in range(steps): kd.append(f(size*(i-m)/m,size*(j-m)/m,size*(k-m)/m)) kj.append(kd) ki.append(kj) return ki from math import sin,cos,exp,atan2 def lobes(x,y,z): try: theta = atan2(x,y) # sin t = o except: theta = 0 try: phi = atan2(z,y) except: phi = 0 r = x*x+y*y+z*z ct=cos(PARAMETER_A * theta) cp=cos(PARAMETER_B * phi) return ct*ct*cp*cp*exp(-r/10) def main(): data = readdata(lobes,10,40) isolevel = 0.1 #print(data) triangles=[] for i in range(len(data)-1): for j in range(len(data[i])-1): for k in range(len(data[i][j])-1): p=[None]*8 val=[None]*8 #print(i,j,k) p[0]=Vector(i,j,k) val[0] = data[i][j][k] p[1]=Vector(i+1,j,k) val[1] = data[i+1][j][k] p[2]=Vector(i+1,j+1,k) val[2] = data[i+1][j+1][k] p[3]=Vector(i,j+1,k) val[3] = data[i][j+1][k] p[4]=Vector(i,j,k+1) val[4] = data[i][j][k+1] p[5]=Vector(i+1,j,k+1) val[5] = data[i+1][j][k+1] p[6]=Vector(i+1,j+1,k+1) val[6] = data[i+1][j+1][k+1] p[7]=Vector(i,j+1,k+1) val[7] = data[i][j+1][k+1] grid=Gridcell(p,[],val) triangles.extend(PolygoniseTri(grid,isolevel,0,2,3,7)) triangles.extend(PolygoniseTri(grid,isolevel,0,2,6,7)) triangles.extend(PolygoniseTri(grid,isolevel,0,4,6,7)) triangles.extend(PolygoniseTri(grid,isolevel,0,6,1,2)) triangles.extend(PolygoniseTri(grid,isolevel,0,6,1,4)) triangles.extend(PolygoniseTri(grid,isolevel,5,6,1,4)) def t000F(g, iso, v0, v1, v2, v3): return [] def t0E01(g, iso, v0, v1, v2, v3): return [Triangle( VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]), VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]), VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3])) ] def t0D02(g, iso, v0, v1, v2, v3): return [Triangle( VertexInterp(iso,g.p[v1],g.p[v0],g.val[v1],g.val[v0]), VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]), VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2])) ] def t0C03(g, iso, v0, v1, v2, v3): tri=Triangle( VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3]), VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]), VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3])) return [tri,Triangle( tri.p[2], VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]), tri.p[1]) ] def t0B04(g, iso, v0, v1, v2, v3): return [Triangle( VertexInterp(iso,g.p[v2],g.p[v0],g.val[v2],g.val[v0]), VertexInterp(iso,g.p[v2],g.p[v1],g.val[v2],g.val[v1]), VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3])) ] def t0A05(g, iso, v0, v1, v2, v3): tri = Triangle( VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]), VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3]), VertexInterp(iso,g.p[v0],g.p[v3],g.val[v0],g.val[v3])) return [tri,Triangle( tri.p[0], VertexInterp(iso,g.p[v1],g.p[v2],g.val[v1],g.val[v2]), tri.p[1]) ] def t0906(g, iso, v0, v1, v2, v3): tri=Triangle( VertexInterp(iso,g.p[v0],g.p[v1],g.val[v0],g.val[v1]), VertexInterp(iso,g.p[v1],g.p[v3],g.val[v1],g.val[v3]), VertexInterp(iso,g.p[v2],g.p[v3],g.val[v2],g.val[v3])) return [tri, Triangle( tri.p[0], VertexInterp(iso,g.p[v0],g.p[v2],g.val[v0],g.val[v2]), tri.p[2]) ] def t0708(g, iso, v0, v1, v2, v3): return [Triangle( VertexInterp(iso,g.p[v3],g.p[v0],g.val[v3],g.val[v0]), VertexInterp(iso,g.p[v3],g.p[v2],g.val[v3],g.val[v2]), VertexInterp(iso,g.p[v3],g.p[v1],g.val[v3],g.val[v1])) ] trianglefs = {7:t0708,8:t0708,9:t0906,6:t0906,10:t0A05,5:t0A05,11:t0B04,4:t0B04,12:t0C03,3:t0C03,13:t0D02,2:t0D02,14:t0E01,1:t0E01,0:t000F,15:t000F} def PolygoniseTri(g, iso, v0, v1, v2, v3): triangles = [] # Determine which of the 16 cases we have given which vertices # are above or below the isosurface triindex = 0; if g.val[v0] < iso: triindex |= 1 if g.val[v1] < iso: triindex |= 2 if g.val[v2] < iso: triindex |= 4 if g.val[v3] < iso: triindex |= 8 return trianglefs[triindex](g, iso, v0, v1, v2, v3) def VertexInterp(isolevel,p1,p2,valp1,valp2): if abs(isolevel-valp1) < 0.00001 : return(p1); if abs(isolevel-valp2) < 0.00001 : return(p2); if abs(valp1-valp2) < 0.00001 : return(p1); mu = (isolevel - valp1) / (valp2 - valp1) return Vector(p1.x + mu * (p2.x - p1.x), p1.y + mu * (p2.y - p1.y), p1.z + mu * (p2.z - p1.z)) if __name__ == "__main__": main() # GRASSHOPPER PYTHON OUTPUTPOINTS = rhinoscriptsyntax.AddPoints(POINTS_CONTAINER)POINTS = rhinoscriptsyntax.CullDuplicatePoints(POINTS)…
you have a list that looks like this...
0. mesh_FromPoints
1. 7.0
2. 11.0
The SQL Format Rows will simply format the list items into a single string separated by commas: "mesh_FromPoints, 7.0, 11.0"
If you want to have multiple rows in a similar format, you will want to input a data tree that looks like...
{0}
0. mesh_FromPoints1
1. 7.0
2. 11.0
{1}
0. mesh_FromPoints2
1. 5.0
2. 20.0
{2}
0. mesh_FromPoints3
1. 20.0
2. 8.0
In which case the SQL Format Rows will give you a list of strings...
0. "mesh_FromPoints, 7.0, 11.0"
1. "mesh_FromPoints, 5.0, 20.0"
2. "mesh_FromPoints, 20.0, 8.0"
Hope this helps...
Nathan…
Angeles, which has 12% of the year made comfortable, and Shiraz, Iran, which also has 12% comfortable (assuming default parameters).
Jerusalem also makes sense to me. There is only a maximum possible 9% of the year that is inside the polygon (you'll see this if you set the timeConstant to a very high number). The default strategyPar makes 6% of these hours comfortable and 3% without cool enough temperatures in the previous hours. This seems reasonable to me.
I could be convinced to change the default time constant to 12 hours (instead of 8) as I know that 12 is the default of climate consultant but that seemed really idealized in my opinion. You'll need really high exposed mass and insulation without much internal heat gain to make conditions stable for more than 8 hours in my opinion.
As for the solarHeatCapacity, I get changes when I drop it down to 10 W/m2 or boost it up to 100 W/m2. It's definitely a parameter that operates on an "order of magnitude" scale and little tweaks to it won't change it too much. You can think of this number as representative of a lot of other physical properties: most notably the depth of the space being passively heated and the thermal mass of that space's materials that participate in heat exchange over the time constant. Climate consultant uses a default assumption of 30 W/m2 but, from my calculations, this is likely assuming a space that has a facade to floor area ratio that is greater than 1. If we say that we need to raise the temperature of 10 cm of an exposed concrete floor for passive heating purposes, and we have a facade-to-floor area ratio of 1:
Required solar flux = ((1 facade-to-floor ratio) x (0.1 m3 of concrete) x (2400 kg/m3 concrete density) x (880 J/kg-K concrete specific heat capacity)) / 3600 seconds/hour
This lands you with a required solar flux of 58 W, which is almost twice the 30 W climate consultant default. While me might say that not all 10 cm of concrete participates over the course of a default 8-hour time constant (most of the action is probably within the first 5 cm), we also have to account for things like transmittance of solar though the window, which, for triple pane, is probably only half of the incident solar. So 50 W seemed to be a more reasonable rule of thumb from my perspective, essentially assuming a facade-to-floor ratio of roughly 1 with 5 cm of concrete participating in an 8 hour heat exchange and a little more than half of solar heat getting through a fully glazed window.
Let me know if that makes sense or if you have any suggestions,
-Chris…
ate):
1) go to: https://github.com/mostaphaRoudsari/ladybug/2) click on "clone or download"/Download ZIP
3) Download and extract the folder wherever you want on your machine
4) Open the folder and open "userObjects"
5) you'll see something like this
6) open Grasshopper/File/Special Folders/User Object Folder
7) Select and delete all Ladybug components
8) Drag all components of the point 5) into the canvas of Grasshopper wherever you want or inside the "User Object Folder"... it is the same thing.
And it should be fine.
Let me know if it works.
Best
Antonello
…
will cover one of the latest and greatest topics from recent development. Although the webinars will be happening each Thursday around 12:30 Eastern Standard Time, registration will give you indefinite access to recordings of the webinars so that you can reference them when the time comes to apply them on your work!
The grand list of workshops is as follows:
1 - High-Quality Graphics, Visualizations and Animations with LadybugMarch 9th, 12:30 PM EST
2 - Brute Force Parametric Energy Modeling and Sensitivity Analyses in Early DesignMarch 23rd, 12:30 PM EST
3 - Wintertime Indoor Thermal Comfort Visualization - Eliminating Perimeter Heat with High-Performing FacadesMarch 30th, 12:30 PM EST
4 - Summertime Indoor Thermal Comfort Visualization - Setpoints and Blinds Up with Right Shade + ControlsApril 6th, 12:30 PM EST
5 - Condensation Modeling with HoneybeeApril 20th, 12:30 PM EST
6 - Urban Heat Island Modeling with DragonflyApril 27th, 12:30 PM EST
7 - Expanding Your Climate Data Sources with DragonflyMay 4th, 12:30 PM EST
8 - CFD Simulation with OpenFOAM, Rhino/Grasshopper and Butterfly (Advanced)May 11th, 12:30 PM EST
This series will have a similar arc as the one in the Fall, starting with basic topics and moving to advanced ones as we progress down the list. The first one will be accessible to all users regardless of prior experience and all of the workshops listed here will cover topics for which there is currently no tutorial video content. Hope that you can attend!…
me of the things I think are issues still:
-In general, I'm a bit confused about the relationship between Length and Strength in the Length(Line) goal (and ClampLength for that matter).
-The data matrix needs to be cut in half (triangle rather than square) so that the lines don't repeat. That is, the first point/category needs to connect to 9 other points, the second then needs to connect to 8 points, the third to 7, and so on. This is what I was trying to accomplish with the Explode Tree and Split List functions in the middle.
-Because of this, I'm losing track of the order of the data, and so I'm not completely sure whether the point/category labels are matching up to the right points/categories.
-A few of the values in the matrix are 0, and I'm concerned that this may interfere with things. My goal is for the higher numbered connections (like E-H) to be closer together, while the lower numbered connections (like D-E which is 0) to be the furthest away.
A couple of other notes:
-Right now, I have an Absolute component in there so that negative connections are treated the same (I'm hoping to color these later).
-I kept the ClampLength goal, though I'm not using it. Given my other requirements, this might be the best way to go, though I'm not sure.
Thanks!
…
mes complicated, I wish there was a tool (specifically a slider) in grasshopper that when I open a complex file, I could slide back and forth between steps of actions which has been done to make the definition.
lets say we could imagine it as an Undo/Redo slider that starts from the first action till the end of composing the definition. it would be a grate tool for those who want to learn by playing around and see what happens step by step. it might be useful for others too to clearly see the steps and manage more complex systems.
and If undo and redo consumes a lot of processing power (I am not sure) I have another Idea.
The slider could preview or unpreview components and actions from step 1 to N.
but it should hide the components which are unpreviewed so I I can easily see the relation between definition and what happens in rhino view-port.
In other word, when I set the slider on the lets say step 7 , all the components which are made and used after that ( step 8 to N) should be hidden from the grasshopper definition so I could simultaneously follow the steps both in rhino view-port and grasshopper view-port.
thanks guys
cheers…
hat will be the basis of creating lamella members. In the sketch I'll use the 8 m side as U and 6 m as V. The surface is divided into a grid comprised of 1 m² squares. This step is not strictly needed but I use it to calculate the spacing in each direction for trimming.
2. Remap the UV of the surface again to generate the grid for lamella members in each direction. This grid subdivisions will be twice the size of the basic grid from step 1. Before remapping the grid I'm pretty sure I trimmed off the ends of the surface in the U direction by 1/2 the grid division distance (1 m off each end in the sketch). Repeat this for V, but in the other direction.
3. Extract the diagonals in each of the grids from step 2. Connect points 0 & 2 to form on diagonal, and 1 & 3 for the other diagonal. This will create lines for generating the lamella ribs. You'll have to dig around my definition to see how that's done...it will be very difficult for me to type that out.
4. Others probably have cleaner methods of producing the same effect. I know I certainly didn't put much effort into cleaning up the definition.
--
Here are links to the definition & .3dm file. I'm not sure if this will work with the latest release of GH though....
http://www.funcstruction.com/lamella_trial/lamella_.3dm
http://www.funcstruction.com/lamella_trial/grid-5.gh
I'm not sure how much help I'll be. I haven't looked at this in a couple of years.…
Added by Che Yu Lin at 8:21pm on February 25, 2013
o sensor Shield V5.0 - 2 standard servos (plugged into pins 9 and 10 in the sensor shield) - 7.5V wall power supply - USB cable to computer
I'm running Rhino SR 8 on a 32 bit Windows Vista machine I have Version 0.9.0014 of grasshopper (the latest) and Firefly_Build_1.0067 I have flashed my Arduino board with the latest firefly firmata (updated September 10th, 2012)
I have checked that I am using the "MEGA write" box I have got the right bits going to the right pins and I have checked that they all have "servo" ticked instead of "digital" or "pwm"
My servos and board work perfectly well with the normal Arduino software, but just not any longer with firefly since my computer was switched off.
The port shows correctly as COM 4 and opens fine.
When I move the slider to control the servos, the TX light is on and the RX light flashes, but no servos move... (everything works with the sweep example in arduino though, so I have eliminated power and wiring issues)...
Any ideas what might be the problem?
I've tried re-installing, switching off and on many times, changing cables, trying a different board (also doesn't work any more with the duemilanove), trying all pins on the shield, trying one servo without the shield, trying one servo with the shield, lots of googling, lots of searching forums, unblocking the firefly installation files in explorer, lots of things... I'm all out of ideas... And very confused as it was working just a few days ago... Am I just missing something really obvious or could there be an issue with the software at my end?…
as one element.
Thank you
Comment by karamba on October 7, 2014 at 11:27pm
Hello Patricio, divide the beams in such a way that each boundary vertex of the shell becomes an endpoint of a beam segment.
Best, Clemens
Comment by Llordella Patricio on October 8, 2014 at 8:30amDelete Comment
Hi Clemens,
I did what you suggested but now assemble element doesn´t work properly. Could you please tell me how to fix it? Thanks in advance, Patricio
8-10-14losa%20cadena.gh
Comment by karamba on October 8, 2014 at 11:59am
Hi Patricio, if you flatten the 'Elem'-input at the 'Assemble'-component the definition works. The triangular shell elements have linear displacement interpolations whereas the beam deflections are exact. In order to get correct results you should refine the shell mesh.
Best, Clemens
Comment by Llordella Patricio on October 9, 2014 at 8:35amDelete Comment
Hello, succeeds in creating the mesh to the slab, and built the beam segment, but when I see the deformations are not expected because the beam is deformed as the slab.
Thanks for the help
PS: maybe I'm using the program for a type of structure that is not the most appropriate, as I saw in the examples of other structures. But this type of structure is that students taught
best regards
Patricio
9-10-14%20Example%201.gh
Comment by karamba on October 9, 2014 at 10:46am
You could use the 'Mesh Edges'-component to retrieve the naked edges and turn them into beams - see attached file:91014Example1_cp.gh
Best regards,
Clemens
Comment by Llordella Patricio on October 15, 2014 at 3:41pmDelete Comment
Dear clemens
I was doing a rough estimate of the deformation, and I can not achieve the same result with Karamba. When I make a rough estimate of the result with Karamba beams and mine are very similar, I think the problem is when I connect the shell, because there are no similar results.
I sent the GH file, and an image of the calculation
The structure is concrete The result I get is 0.58cm
thank youPatricio
15-10-14%20Example.gh
Comment by karamba yesterday
Dear Patricio,
try to increase the number of shell elements. As mentioned in the manual they are linear elements. A mesh that is too coarse leads to a response which is stiffer than the real structure.
Best,
Clemens
…