me logic produced by running the 2-d voronoi component.
From a given set of polylines we can extract the centers and this can drive both the voronoi component as well as provide the XYZ drill points for the cnc. The definition has a variety of different options. You need Lunchbox, Weaverbird, and Starling. I can't tell you how amazing these 3 tools are from a design perspective. They are extremely powerful so if you don't have these you must install them asap. You can get the tools at http://www.food4rhino.com/
This definition works by first choosing a grid type, next you choose voronoi type, and subdivision type. From the voronoi type list you can choose basic (just grid), truncation (uses truncation calculated via the image sampler), truncation dual (uses the dual of the truncated image based grid), and subdivision (takes the basic grid type and uses different subdivision shcemes). Each of these provide different patterns of polylines from which we can extract our drilling points. I am rather proud of this definition since the overall idea is one which is so simple it's easy to overlook - the idea that drilling with a ball end mill makes voronoi plots. Now when you combine that with all of these amazing tools it can go off right quick. The nice thing is the paatern you see on screen is the pattern that gets made by drilling wysiwyg cnc patterns.
VORONIO_DRILLing.gh
Here are some on screen patterns in process in the following order truncation, basic, subdivision:
here is a video moving over a machined example:
…
nd the challenge "Building the Invisible: Informing Digital Design with Real World Data". Information about each Workshop Cluster can be found here:
Cyber GardensUse the ForceUrban FeedsSuspended DreamsInteracting with the CityAgent ConstructionAuthored SensingPerforming SkinsResponsive Acoustic SurfacingHybrid Space Structure Typologies
The SmartGeometry 2011 Workshop will take place at CITA http://cita.karch.dk/
Applications to attend the SmartGeometry 2011 Workshop in Copenhagen will close on 31st January 2011. General Conference registration will open within 1 month.
We hope to see you there!
****************************************************
Workshop 28th-31st March
Shop Talk 1 April
Symposium 2 April
Reception 2 April
These events follow the highly successful previous SG events in Barcelona 2010, San Francisco 2009, Munich 2008, New York 2007, Cambridge/London, UK 2006 and multiple preceding events.
Click here for more info...
This year's Challenge is entitled:BUILDING THE INVISIBLEInforming Digital Design with Real World Data
THE PREMISEVast streams of data offer a rich resource for designers. By incorporating external information into our design processes the autonomy of the design is challenged. User data, energy calculations, embedded sensing, material and structural simulation, human behaviour and perception, particle flows and force fields allows design to be situated and responsive. From the simulation of megacities to the solid modelling of material systems, design has the potential to be informed by the real. Design sits not separate from is environment but inhabits an ecological system, open, dynamic and interdependent, diverse, partially self-organising, adaptive, and fragile. Across scale and within time we now have the chance to instil architecture with an immanent intelligence creating new relationships between the user, the built and its ecosphere.THE OPPORTUNITYSystems theorists suggest that data is only a raw material. It can be differentiated from information, knowledge and wisdom. Understanding is multi-levelled: understanding of relations, understanding of patterns, understanding of principles. As digital designers our challenge is in harnessing the power of computation to assist us in informing our design process. Computers help us collect, manage and analyse the environment and inform us about an abundance of data. Our challenge is to use these inputs in a meaningful way to help us make better informed design decisions.THE AIMSG 2011 explores how the incorporation of real world data challenges existing design thinking. The SG 2011 workshop aim is to create physical prototypes of design systems to be exhibited in the SG2011 exhibition.
The SmartGeometry Group is a not-for-profit educational organization dedicated to the use of computational tools in architecture and engineering. SG brings professionals, academics, and industry together to explore the next generation of digital design. SG Workshops are non-platform specific, believing it is the methodology, not the tool, that matters.
…
Added by Shane Burger at 11:23am on January 6, 2011
ponse Factor (dynamic serviceability criteria) for structures such as office floors which are often governed by dynamic considerations and sensitivity to accelerations. This response factor calculation node is then used in an optimisation loop (Hoopsnake) along with a Eurocode section sizing node to determine required sections from a standard database for a given geometry, support, and loading condition. We have done some work with the new version of Karamba and have a few questions regarding the eigenvectors and the normalisation thereof.
You have mentioned that the eigenvectors in Karamba are scaled to unity with respect to the mass matrix. In other words the eigenvectors form a mass orthonormal set, i.e. for mode r, the modal mass = [eigenvectorr]T . [mass matrix] . [eigenvectorr] = 1.
As you also mentioned, this implies that the length of each mode’s eigenvector = 1/Sqrt(m*) where m* is the modal mass in that mode. We have taken your modal analysis example and re-analysed it in Autodesk Robot to compare results. I have used a consistent mass matrix to calculate the results (I assume Karamba has used a lumped mass matrix for computational efficiency?). The results (frequencies, mass-normalised eigenvectors, modal masses, and mass participation factors) of this analysis are shown below:
mX,mY,mZ are the modal masses of the current mode calculated assuming unity-normalised eigenvectors (if they were calculated with mass-normalised eigenvectors, all of the modal masses would of necessity be 1).
miX,miY,miZ are the nodal modal masses (∑miX=mX)
Cur.mas.Ux gives the mass participation (%) of the current mode.
Modal mass and participation coefficients are calculated in Robot as described in this link. Dynamic analysis methods used by Robot are presented here – I used the subspace iteration method for the results above (but all methods give almost identical results as long as enough modes are calculated).
The above analysis shows a modal mass mY=40.5 kg (½ of the total mass) for the first mode. This result satisfies the basic theory: for mode n of a uniform simply-supported beam of span L and mass/unit length m, the (unity-normalised) mode shape is given by ɸ = sin (nπx/L), and the modal mass M* = m*Integral(Sin2(nπx/L),dx,[0,L]) = 0.5*m*L. In discrete form this is M* = ∑Mi*ɸi.
I attach a slight modification to your modal analysis example where I have attempted to back-calculate the modal mass from the length of the eigenvectors output for each mode. This seems to return low modal masses less than 1 – I was expecting them to be one (as the Karamba eigenvectors I am back-calculating from are mass-normalised). Would you be able to shed some light on this?
I also attempted to calculate the eigenvectors and modal masses in Karamba for the same 10m long beam, but with a 1000kg point mass at the centre of the beam, so I could compare the simpler three modes of that nodal mass with Robot. However I could not set the density of the beam to zero hence could not get pure modal results for the point mass. Should this be possible?
We also had a couple of requests (some already mentioned by email):
Is it possible to expose the eigenvectors as actual vectors at a requested number of divisions along each bar, similar to the section forces?
Is it possible to allow us to specify to Karamba which directions the mass is activated in? For example, for a floor structure you are often only concerned with the modes activating mass in a vertical direction, as one is aware that a composite topping will restrain the beams laterally and torsionally. This would not need to take the form of an additional node, but simply X-Y-Z radio boxes similar to the supports component. This could either be an implementation of a solution to the reduced dynamics problem in the selected direction, or simply cull out all modes which had mass participating in directions not selected (using for example the participation factors described below). The first option would be more technically accurate, as most structural systems are coupled.
I understand modal masses can be scaled arbitrarily and do not necessarily have any direct relationship to the real structure mass (they can be scaled). However one particular scaling of them is useful, often known as the ‘effective modal mass’. This is the set of modal masses which add up to the total mass and are directly related to the Modal Participation Factors (see e.g. Clough & Penzien pg. 308 or the link below). Can these factors for each mode be calculated as well in Karamba? This is useful for determining how ‘important’ each mode is and how they contribute to the dynamic response of the structure. This link describes well the calculation of effective modal masses and the modal participation factor.
Thanks again for Karamba - it is an extremely useful tool!
Kind regards,
Luke…
o my python component returning null despite running fine in the standalone python editor (i.e.: not through grasshopper).The original python script is as follows:
import randomimport rhinoscriptsyntax as rsrs.EnableRedraw(False)
def placeBuildings(curve, distance): pts=rs.DivideCurveLength(curve,5) counter=0 for myPoint in pts: counter=counter+1 #get the parmeter f current positision param=rs.CurveClosestPoint(curve,myPoint) #get teh tangent of this parameter tangent=rs.CurveTangent(curve,param) #calculate the angle of the tangent angle=rs.Angle((0,0,0),tangent) randomNumber=random.uniform(1,5) heightOfBuilding=random.uniform(4,40) rect=rs.AddRectangle(rs.WorldXYPlane(),randomNumber,2) rs.MoveObject(rect,(0,randomNumber,0)) hull=rs.ExtrudeCurveStraight(rect,(0,0,0),(0,0,heightOfBuilding)) rs.RotateObject(hull,(0,0,0),angle[0]) rs.MoveObject(hull,myPoint) #if counter%4: #rs.AddCircle(myPoint,3) #selection of curve#curveParameter=rs.GetCurveObject("sel curve")#curve=curveParameter[0]
curves=rs.GetCurveObject("select streets",4)distance=rs.GetInteger("distance?",4)for curve in curves: placeBuildings(curve,distance) rs.ReverseCurve(curve) placeBuildings(curve,distance)
When placed in grasshopper it is the following:
import randomimport rhinoscriptsyntax as rs
#randomNumber=random.uniform(1,5)#rs.AddCircle((0,randomNumber,0), 2)
def placeBuildings(curve, distance): pts=rs.DivideCurveLength(curve, 5) counter=0 for myPoint in pts: counter=counter+1 #get the parmeter f current positision param=rs.CurveClosestPoint(curve,myPoint) #get teh tangent of this parameter tangent=rs.CurveTangent(curve,param) #calculate the angle of the tangent angle=rs.Angle((0,0,0),tangent) randomNumber=random.uniform(1,5) heightOfBuilding=random.uniform(4,40) rect=rs.AddRectangle(rs.WorldXYPlane(),randomNumber,2) rs.MoveObject(rect,(0,randomNumber,0)) hull=rs.ExtrudeCurveStraight(rect,(0,0,0),(0,0,heightOfBuilding)) rs.RotateObject(hull,(0,0,0),angle[0]) rs.MoveObject(hull,myPoint)
#selection of curve#curveParameter=rs.GetCurveObject("sel curve")#curve=curveParameter[0]
curves=xdistance=y
for curve in curves: placeBuildings(curve,distance) rs.ReverseCurve(curve) placeBuildings(curve,distance)
I am unsure why there is no error being returned yet I cannot achieve any result other than null. Maybe someone could look at the script and tell me what is going wrong? I'm hoping to solve this before next Thursday so I might be asking for too much.
Much Appreciated.-A…
Added by Adem O'Byrne at 11:45am on October 9, 2014
n, so if you want Strings, be sure to encase them in double quotes:
Concat = " alcohol doesn't affect me"
● Added initialization code to the Cull Nth component.
● Added initialization code to the Cull Index component.
● Added initialization code to the Random Reduce component.
● Added initialization code to the Duplicate component.
● Added initialization code to the List Item component.
● Added initialization code to the Repeat Data component.
● Added initialization code to the Shift List component.
● Added initialization code to the Split List component.
● Added initialization code to the Sequence component.
● Added initialization code to the Constant E component.
● Added initialization code to the Constant Epsilon component.
● Added initialization code to the Factorial component.
● Added initialization code to the Fibonacci component.
● Added initialization code to the Golden Ratio component.
● Added initialization code to the Constant Pi component.
● Added initialization code to the Random component.
● Added initialization code to the Range component.
● Added initialization code to the Series component.
● Added initialization code to the Square component.
● Added initialization code to the Square Root component.
● Added initialization code to the Cube component.
● Added initialization code to the Cube Root component.
● Added initialization code to the Log10 component.
● Added initialization code to the Log component.
● Added initialization code to the Exponent component.
● Added initialization code to the Power of 2 component.
● Added initialization code to the Power of 10 component.
● Added initialization code to the Sine component.
● Added initialization code to the Sinc component.
● Added initialization code to the Cosine component.
● Added initialization code to the Tangent component.
● Added initialization code to the ArcSine component.
● Added initialization code to the ArcCosine component.
● Added initialization code to the ArcTangent component.
● Added initialization code to the Secant component.
● Added initialization code to the Cosecant component.
● Added initialization code to the Cotangent component.
● Added initialization code to the One over X component.
● Added initialization code to the Absolute component.
● Added initialization code to the Sign component.
● Added initialization code to the ToDegrees component.
● Added initialization code to the ToRadians component.
● Added initialization code to the N-Base log component.
● Added initialization code to the Smaller Than component.
● Added initialization code to the Larger Than component.
● Added initialization code to the Equal To component.
● Added initialization code to the Similar To component.
● Added initialization code to the Addition component.
● Added initialization code to the Subtraction component.
● Added initialization code to the Multiplication component.
● Added initialization code to the Division component.
● Added initialization code to the Integer Division component.
● Added initialization code to the Minimum component.
● Added initialization code to the Maximum component.
● Added initialization code to the Modulus component.
● Added initialization code to the Power component.
● Added initialization code to the Concatenate component.
● Added initialization code to the String Split component.
● Added initialization code to the String Join component.
● Added initialization code to the Evaluate Length component.
● Added initialization code to the Circle component.
● Added initialization code to the Circle CNR component.
● Added initialization code to the Arc component.
● Added initialization code to the Curve component.
● Added initialization code to the Interpolated Curve component.
● Added initialization code to the Offset Curve component.
● Added initialization code to the Offset Curve Loose component.
● Added initialization code to the Offset Curve On Surface component.
● Added initialization code to the Extend Curve component.
● Added initialization code to the Catenary component.
● Added initialization code to the Line SDL component.
● Added initialization code to the Fillet component.
● Added initialization code to the Fillet Distance component.
● Added initialization code to the Move component.
● Added initialization code to the Scale component.
● Added initialization code to the Mesh Plane component.
● Added initialization code to the Mesh Box component.
● Added initialization code to the Mesh Sphere component.
● Added initialization code to the Sphere component.
● Added initialization code to the Surface Offset component.
● Added initialization code to the Surface Offset Loose component.
● Added initialization code to the Divide Curve component.
● Added initialization code to the Divide Curve Length component.
● Added initialization code to the Divide Curve Distance component.
● Added initialization code to the Curve Frames component.
● Added initialization code to the Curve Perpendicular Frames component.
● Added initialization code to the Square Grid component.
● Added initialization code to the Rectangular Grid component.
● Added initialization code to the Vector Amplitude component.
--
David Rutten
david@mcneel.com
Poprad, Slovakia
…
façade) elements. The facade is of a value measured 13 seconds, depending on the value of the first element of change and jump to the next element to the next measurement, and change it. The creation of a value of 13 seconds have I done. My first question is, how do I do that all the 13 seconds, the next item is selected. My second Question is how I create the elements (loft-object like in the image 2) on the grid and they change. In my test, the elements twisted somehow. I hope for fast help thank you
grid (excerpt)
element
creation of a value
my test (the move-compoment is connected to the circuit of value generation)
my test …
t does not run inside the Grasshopper thread).
A way for components to subscribe to a "New solution at the earliest conveinience the next time a solution is finished". This may include a small pause for grasshopper to redraw the canvas; or a pause to prevent locked-up scenarios and unescapable stuff.
Multiple components should be able to subscribe to this, and they should be expired at the same time. (Right now I'm using solution #2: When having a lot of input this causes a racing condition, where one of the two components will be expired, causing a "turn based scenario".
A no-queue solution: Multiple calls during a solution should be collected into one batch of components / params that should be expired.
This is the code I've tried
1: Adding a new handler at the end of a solution
GH_Document.SolutionEndEventHandler handle = null; handle = delegate (Object sender, GH_SolutionEventArgs e) { // first get rid of our handler again GrasshopperDocument.SolutionEnd -= handle; if (GH_Document.IsEscapeKeyDown()) return; try { // ExpireSolution(true); } catch (Exception ex) { RhinoApp.WriteLine("Exception in SolutionEnd event: {0}", ex.ToString()); } };
2: The Ghowl UDP way:
if (_doc.SolutionState != GH_ProcessStep.Process && _udpClient != null && !_askingNewSolution) { GH_InstanceServer.DocumentEditor.BeginInvoke((Action)delegate() { if (_doc.SolutionState != GH_ProcessStep.Process) { _askingNewSolution = true; this.ExpireSolution(true); _askingNewSolution = false; } }); }
My use cases are:
A USB Hid listener (Should be able to handle e.g. two gamepads at the same time) sending commands to a component. Events can arrive at high speeds; and should be able to know when it's save to actually request a new solution
A form that sends keystrokes or commands to (multiple) components on the canvas (one per device).
An embedded webserver
Looping (like: Hoopsnake, anemone, etc. Sending data back to one or more parameters on the canvas)
For most of these problems I've got a solution where one of these components is working. But most of the time combining them results into misery.
These are my questions:
What does ScheduleSolution() do? I've tried to use it - but it's behaviour seems erratic. Most of the expirations arrive quite laggy.
What is the difference between ExpireSolution(true) and ExpireSolution(false)? When is it safe to call either of them?
How do I determine if it's safe to request a new solution?
Any thoughts on a generic way to solve this (Rather than each component subscribing to events, a way to subscribe to an expiration at the next earliest conveinience?)
…
.!
Feel free to ignore them, or to remove this thread.
They are just a couple of thoughts:
1st idea: It would be great to right click on a slider and reset it to a "original" value (maybe just a click on a little icon next to the name, so it is even faster).This can be handy when using Galapagos, as all the sliders gets changed...and the fastest way I found so far to reset them is to close and open the GH file.But I bet as Galapagos is so new... well... maybe this is something you already thought about!
2nd idea: Having parametric sliders (with inputs).Imagine you want a slider to vary from x to y... now you have to type in the values. It would be good to set set x and y with inputs.
This is actually very useful using Galapagos, but quite useless in all the other cases...
Probably than the best way to do this is to add a feature in Galapagos to use domains as inputs... but I read somewhere that you are working on this already!
3rd idea: Change the value (or range) of multiple sliders.Imagine you want all the sliders you have to be =2... and imagine to have 20 sliders... if you select them and right click on one, it will only change that one. (not the selection). Would be good to edit a selection. (or maybe there is a way and I don't know it?)
----
Well, don't know if that will help somehow, but they are just thoughts! ;)
Thanks if you will consider them!!!
Compliments again for the incredible hard work on GH!
Cheers,Fil…