es only have one raison d'être, which is to group types into logical chunks.
A Type is the definition of a class or a structure. Classes and structures are very similar entities (they can both contain any number of methods, properties and other types), but because they behave differently, you need to know which is which.
An Instance of a type is a single object that actually exists. For example, the class Human is the definition of what it means to be human. You are an instance of this class. I am a different instance of this class. Damien is yet another instance of this class. Every instance can assign unique values to all its properties and fields. If for example the type Human had a property for height, then in my case it would say 1.97m. In Damien's case it would be set to something much less, as Damien isn't anywhere near as handsome and tall as I am.
A Reference is a piece of information that tells you where a certain instance is. Think of a reference as an address. When you mail a letter (or e-mail), you must specify a valid and unambiguous address or the letter won't arrive. Similarly, every piece of data stored in the memory of your computer also has a unique address, but instead of "3670, Woodland Park Avenue, Seattle", it looks like this 0x12345678. Trying to access an instance through an invalid reference is like sending a letter without an address.
References are sometimes also called "variables", though sometimes the word variable is only used to indicate primitive types, such as Booleans, Integers and such. A reference is not the instance itself. Take the following code:
1. Dim crv As Rhino.Geometry.Curve
2. Dim dup As Rhino.Geometry.Curve
3. crv = GetACurveFromSomewhere()
4. dup = crv
5. If (dup IsNot Nothing) Then dup = dup.DuplicateCurve()
One lines (1) and (2) I declare two references, one is called "crv", the other "dup". Because Visual Basic is a strongly typed language, I can assign limitations to what sort of data crv and dup are allowed to reference. In this case they can only point to instances of the Rhino.Geometry.Curve class or any class which derives from Rhino.Geometry.Curve (such as Rhino.Geometry.NurbsCurve, or Rhino.Geometry.LineCurve).
On line (3) I assign an actual curve instance to the crv reference/variable. At least, assuming the GetACurveFromSomewhere() function actually returns a proper instance. If it doesn't, crv will remain a "null reference".
Line (4) is interesting, because both crv and dup will now point to the same curve instance. So even though there is only 1 curve in memory, both crv and dup provide access to it. This means that when we change the curve via crv, then dup will notice that change.
On line (5) two things happen. I want to duplicate my curve data so I can change the data via dup, without affecting the data available via crv. The best way to duplicate a curve (i.e. create a second curve in memory, that has the same shape as the first curve) is to use the DuplicateCurve() method on the Rhino.Geometry.Curve class. However I cannot call a method on an instance that doesn't exist, so before I do that, I need to check whether or not dup actually points to a real curve object, or whether it is a null reference.
Finally, it is also possible to have an instance of a class in memory, without any references to it. In this case nobody can reach that curve any more and it is essentially dead weight, taking up pointless memory. In C++ this is called a Memory Leak and it's considered a serious bug. In VB.NET and C# this memory will automatically be cleaned up by the .NET Garbage Collector. In my opinion the Garbage Collector is the single most important feature in .NET. It's what turns VB and C# from frustration central into a friendly and flexible coding platform.
--
David Rutten
david@mcneel.com
Poprad, Slovakia…
This is the actual reason I'm going through all this. I want to develop an algorithm that can be applied consistently and produce good results.
Here is a a little background. I'm working on my master's thesis in structural analysis. My thesis is on seismic behaviour of a roman temple in Portugal. I will be using a method of analysis suitable for block structures called the discrete element method. I am using a commercial code called 3DEC for this.
Now in order to the analysis I need to construct a 3D block model of my structure. I received a 3D scan of the entire structure (in *.wrl) format and spent a week trying to clean it up and slice it into the blocks that make up the structure. Now I want to use the scanned geometry of the blocks and describe a simplified prism around each that will represent the block in my analysis. I've attached a file with one of the columns in the temple. I think (at least with my tests so far) that it is representative of the all the blocks I'm dealing with.
Now my criteria for creation of the blocks:
I would like the contact area between the blocks to be as close as possible to the actual drum contact area,
I would like to get the volume of the blocks to be as close as possible (secondary to the contact area) to the volume of the actual drums in order to insure that the weight distribution in the structure is as close to reality as possible,
I would like the shape of the contact area to be as close to reality as possible
I order to satisfy all these requirements, I've done the following in my grasshopper file:
I take a section at the top and bottom of each of the drum meshes. I use this to extract the contact outline at the top and bottom of the drum. This is sometimes problematic and requires me to clean up the model and remove features that interfere.
Next I take each surface and try to fit a minimum circle around it. I try to do this because in my mind this is the best possible way to find the actual centre of the drum when there is cut outs and deterioration. This works well as long as more than half of the contact surface is still in its circular shape (third block from bottom in the example file doesn't satisfy this requirement and thus causes problems).
Knowing the centre, I use an algorithm I created in VB to search for one of the flutes on the contact profile. My ideas is that if I can find one of the flutes, I can then find the others by just going around at 30 degrees (there are 12 flutes) and find the location of all the flutes. In the VB code I've tried to explain my algorithm so I won't explain it here. I also think this algorithm is needlessly complicated and stupid as I'll explain later.
Once I've got one of the flutes, I just find the intersection of a line with at every 30 degrees with the outline curve.
Having all (12) points around the perimeter, I use an loop to scale the shape around the centre of the circle I found in step 1 to get the area within a tolerance value of the actual contact area (satisfying requirement 1). I was using HoopSnake before, but it required resetting every time so I decided to write my own thing.
I then connect the points on both top and bottom to get a solid block.
Now the problems are as follows:
Sometimes the algorithm doesn't find the best location as the starting point. As I said an important thing is that the circle is tangent to the flutes and that is true only if the column profile is larger than a half-circle.
The software I use requires convex blocks. I've tried to remedy this by using convex hull component before step 5 to insure the surfaces are convex.
I'm having issues sometimes with the alignment of top and bottom points. I think I just need to implement a component that sorts the points around a single basis so that there is no twisting.
I've been experimenting with convex hull as a general approach for defining the corner points, but I'm having problem take the convex hull curve and breaking it into a 12 sided polygon, preserving as much as possible the location of the flutes and the general shape of the contact surface.
I'm really sorry about the long post and complicated question. I hope someone can give some pointers on what I could try. I understand that this is not an easy question and that it is more a question of doing something rather than asking about grasshopper itself. My goal is to have an algorithm that I can explain as a general method for others to use in the future when dealing with these structures. This is only a small minor part of my thesis (the analysis is what is important) but it is taking a lot of time to figure out.
If you have any other questions, I would be more than happy to provide a better explanation. In the file I have created a region with all my input parameters. You can choose a different mesh from that point and change various settings. I hope that is self-explanatory.
Thanks for all your help,
Ali
BTW: I'm really sorry for the poor way I've done this stuff so far. I'm not a programmer and apart from some small macros in Excel I don't know much about this stuff. To add to that, I've just started with Rhino and Grasshopper about five days ago after almost pulling out all my hair trying to do this with AutoCAD!…
- nickname is rather the best approach - and not on active group, but that's irrelevant anyway).
Step back (assuming that you are talking about the "Tens_from_random_blah_blah" definition):
1. Engineering is the art of demystifying (or we are promising that anyway, he he). This means that you start defining (better: outlining) some topology for things based on some "generic" rules (like the ones applied for the masts,cables,cones etc etc). These things are kept in some kind of structure (Lists, DataTrees etc). Things are few in 99.99999% of cases (i.e. : even the biggest membrane "module" has, say, 20-50 masts per "module").
2. Then ... handling things "individually" (mostly modifying) becomes the most critical part. See this (an x "possible" solution by combining a myriad of "options" : a no cones membrane solution, in plain English):
3. But the above is impossible (for more than obvious reasons). You should deploy masts in some high/low sequence in order to achieve some meaningful convex/concave formation that could work.
4. This "works" : 5. This doesn't:
6. This works partially (the formation at the back is "flat" == undo able):
7. This is utterly kitsch (and faulty as the case6 - the back portion):
So it's quite obvious that without a (quite complex) capability to individually control things (in this occasion : mast heights) the whole definition is a waste of computer time. Additionally the more the solution is "demystified" (some curve is defined, some random points are created, some masts are in place, some cables appear etc etc) the more additional constrains are required in order to "narrow" the possibilities (In plain English : sliders should control other sliders as regards their min/max values, true/false, you/me etc etc).
Remember that we are talking about ONE (mast height) out of a myriad things that you should control "manually" (it's utterly pointless to mastermind some kind of "generic" rules - or use naive attractors etc etc) .You'll see the difference when I'll completely reform the definition by adding individual control upon anything.
PS: what about the blocks? (the real life stuff that actually make any solution possible). Can you imagine a 2nd set of "restrictions" imposed by "a child to his parent"? (Assembly/Component modeling , that is).
more soon
…
uick answers. Below you will find some suggestions, but don't think of them as rules and especially don't think of them as guarantees.
1. Choose a descriptive title for your post
Don't call your question "Help!" or "I have a problem" or "Deadline tonight!", but actually describe the problem you are having.
2. Be succinct but clear in your wording
People need to know some details about your problem in order to understand what sort of answers would satisfy you, but nobody cares about how angry your boss or how bad your teacher or how tight your deadline is. Talk about the problem and only the problem. If you don't speak English well, you should probably post in your native language as well as providing a Google Translation of your question.
3. Attach minimal versions of all the relevant files
If you have a GH/GHX file you have a question about, attach it to the post. Don't expect that people will recreate a file based on a screen-shot because that's a lot of pointless work. It's also a good idea to remove everything non-essential from a GH file. You can use the 'Internalise Data' menu option to cut everything to the left of a parameter:
If you're importing curves or Breps or meshes from Rhino, you can also internalise them so you won't have to post a 3DM file as well as a GH file. If you do attach large files, consider zipping them first. Do not use RAR, Ning doesn't handle it.
It is especially a good idea to post files that don't require any non-standard components if at all possible. Not everyone has Kangaroo or Hoopsnake or Geco installed so if your file relies on those components, it might not open correctly elsewhere.
4. Include a detailed image of the GH file if it makes sense
If your question is about a specific (group of) components, consider adding a screenshot of the file in the text of the post. You can use the Ctrl+Shift+Q feature in Grasshopper to quickly create nice screenshots with focus rectangles such as this:
5. Include links to online resources if possible
If you have a question about Schwarz Minimal surfaces, please link to a website which talks about these.
6. Create new topics rather than continuing old ones
It's usually better to start a fresh question, even if there's already a discussion that kinda sorta tangentially touches upon the same issue. Please link to that discussion, but start anew.
7. This is not a 'do my work for me' group
Many of us like to help, but it's good to see effort on our part being matched by effort on your part. Questions in the form of 'I need to do X but cannot be bothered to try and learn the software' will (and should) go unanswered.
7b. Similarly, questions in the form of 'How do I quickly recreate this facade that took a team of skilled professionals four months to figure out?' have a very low success rate.
--
David Rutten
Lead Grasshopper Development
Robert McNeel & Associates…
Added by David Rutten at 12:58pm on October 1, 2013
y interesting and smart way to construct surface. I tried some experiments out using a similar idea - take a developable surface which has a series of holes cut through it now offset that surface and unroll both of them, once both have been cut out insert a dowel into the holes (the dowel represents the offset distance). In the end the shape is recreated via tension and in that way there are some similarities. With your concept the thing I have trouble figuring out is how do you cut the variable angle kerfs. Are you using a 5-axis swarf cut, a cnc panel saw - how do you control this? It would be great to have a set of constraints which limit the number of possible angled cuts - these limits would equal the number of v-groove bits you have in the cnc - and then you could just cut the lines with the programmed tool which matches the given angle. Or maybe I am completely wrong, now I think I am wrong, about the execution and you are only changing the gap between each kerf and the angle of the side wall stays constant.
Anyway to answer your question catia can analyze the characteristics of a piece of formed material (this analysis is usually applied to sheet metal and to design forming tools)it's just a matter or defining the material to match that which you are using. Another possibility although not as numerically clear is using a simulation tool like Maya cloth or Virtools. I know this maybe less likely but you can define all sorts of materials in Maya and then simulate their behavior under numerous forces and constraints. I think it would work it's just how do you extrapolate the values Maya needs and then correlate them back into the cloth parameters. Once it yields the final formed mesh then further analysis could be performed in cosmos, ansys, or catia.
I have one other suggestion. In solidworks if you perform a lofted bend on a sheet metal part and then generate a flat pattern it creates a large set of bend lines representing how to perform the bending of an unusual shape using a metal brake. It seems like those bend lines could be machined with you technique to create lofted forms instead of extrusions.
What materials seem to work best so far, have you only been using wood (the purple stuff is probably not wood)?
If you are ever in Los Angeles I have a shop with a 3 axis and 5 axis router, a large vacuum bag, and all the other things to experiment on this and would be open to this.…
Amuse yourself by trying to figure what kind of series logic could deploy (or not) these room unit combos across the blue space grid shown.
2. Let's assume that surgery etc etc departments are sited in some ground floor and their requirement for rooms is variable ... meaning that some kind of heuristic GH approach must be applied here (for instance : fill the first level with rooms required by all departments with min distance from a given core and if more are required go to next floor etc etc).
The real room unit cluster looks like that (all units are prefab)
3. Voids in the whole cluster deployment (avoid Soviet type of bloc aesthetics) mean that culling could be challenge here (we need ...er..."visual" culling , so to speak)
4. After finishing some solution create custom preview(s) in order to visualize what dept owns what rooms.
5. If in trouble with Architectural things > relax > be cool > open 3d PDF > be a great Architect in just 10 easy steps.
PS: of course I know GH clusters...but as they are they violate my rule N1: never walk the walk if no return is possible, he he. But assuming that David could resolve the return issue (sure he can) this is NOT the answer for my "proposal" for multiple Canvas - again like multiple Views in any CAD stuff these days. Just imagine clusters with some serious hierarchy depth > where am I ? what input comes from what output?
I'll be back with a chaotic case (Series in complete anarchy) in order to demonstrate the critical necessity for a visual Tree Manager/Viewer (a visual thing within the GH visual thing). For manager read : decomposer, composer, visual identifier (per data item/branch) tree re-mapper, anything actually.
more soon (and a in depth analysis about what a Tree Manager/Viewer should do - in an ideal world, that is)
Cheers, Peter
…
which needs to go in the first line only.
Each value K is one element of the knot vector
XYZ is an individual control point. Each point gets its own line/string in the output list
R is the weight of the XYZ point defined in the same line
I can get all these data into separate lists easily enough using the buttons etc. But getting them into the proper order and moving stepwise down the data to generate the desired output string list is eluding me so far.
My thought is to make an array of columns.
Column one is a list of knot values.
Column two is a list of X values.
Column 3 = list of Y values
Column 4=z values
Column 5 is weight values
etc
The idea would be to read the first value in each list into a list of five elements, then make a string out of it. The second value of each column into a separate string on the next line, then the third value from each column into the third string in the output list and so on.The last few values in the output list will contain knot vector elements only, as there are more of these than there are control points. Some of these curves are very long, with many control points, like hundreds and hundreds.
It seems I should be able to pull the lists of interest and combine them into a tree somehow; so far all I have been able to manage is to get them into a single list by starting with control points, then weaving each list of interest successively into the growing list. I'm thinking I need to get the list for each parameter into an individual branch, then read a path across the branches at each index value. But I am missing something about the terminology. I have watched a few videos and it makes sense when people are pulling nested geometry out of models, but this is a little different. More of a data management issue. I'm sure if I wrestle with it I will get it, but it may not be pretty. Any pointers appreciated. A couple of approaches are attached. Not sure whether to loop a list subset through the data or do something else. Thanks,
Karl in LA…
urely; an inevitable symptom of developing a piece of software on what Generative Components was doing almost 10 years ago, and creating a generation of users who have the power but not the insight in to how to use these tools properly. Ever seeing, never perceiving.
@ André-Jacques BODIN: as answers so far seem to be coming via links, try this: http://www.bentley.com/en-US/Products/GenerativeComponents/
you can download the latest version for free and it is infinitely more superior to GH. The learning curve is steeper but worth it. Out of experience I can tell you that the problem you have would be solved via your own skill and intelligence in a matter of seconds, rather then clumsily relying on somebody else to write some code 'packaged' as a component, and ultimately restricting your capacity to explore novel design solutions in an intelligent way.
If you are going to work in practice then unfortunately GH becomes utterly useless as it can only really be used in the initial stages of design. Its merely a toy for students and hobbyists. If you are just starting out, invest your time more wisely and learn something which can be used over the entire life cycle of project. It's so versatile that you essentially have unlimited potential and all operations remain fully in your control, or put in another way; you're not restricted by the idiosyncrasies of another programmer who's 'components' might be totally unsuitable for a novel idea you may want to explore therefore killling it.
…
t you're trying to do something which is not possible. Some solutions spring to mind other than changing the messaging behaviour of the Tree Item component:
Have an option for all objects (not just Tree Item) that allows you to disregard warning and error feedback. Sometimes a component has warnings (or indeed errors) and yet it still functions as planned. This often also happens with auto-casting, for example if you're trying to find all the curves in some data. Pros: solves the same problem in the same way everywhere, Cons: yet another menu item and yet another thing to watch for.
A global switch that disables the warning and error colouration. Pros: easy fix, easy unfix. Cons: if you also disable message balloons then you can't see where errors are happening.
Add a component which filters valid paths and item indices which you could insert in front of the Tree Item component. Pros: a very Grasshopper standard solution, Cons: yet another esoteric component.
I've been thinking about changing the way branches and items are accessed. Basically wondering whether it makes more sense to combine the tree path and the item index into a single data-type "{0;0;2} (0 to 9)" which defines both the path and a range of items in that path. It could be made to work almost identical to current Tree Branch and Tree Item components but it could also do some other cool stuff in addition to that. For example you could have:
{0;0;1} which defines all the items in that branch
{0;0;1} (2) which defines the third item in that branch
{0;0;1} (0,1,2,4) which defines the first, second, third and fifth items in that branch
{0;0;1} (0 to 4) which defines the first 5 items in that branch
{0;0;1} (!3) which defines all items except the fourth in that branch
And I'm sure people can think of even more combinations of symbols and numbers that can be added. Most of this logic is already in place in the [Replace Branches] and [Split Tree] components.
--
David Rutten
david@mcneel.com
Poprad, Slovakia…
Added by David Rutten at 12:58am on January 27, 2013