of thing" (recursion) being applied to your point case > freaky stuff and the likes. We only need a paranoid "loop" like this (that calls itself):
public void DoThisDoThat (ref DataTree<Curve> crvTree){
List<Curve> crvList = crvTree.Branch(loops -1).ToList();
for(int i = 0; i< crvList.Count-1;i++){
Curve c1 = crvList[i]; Curve c2 = crvList[i+1];
List<Curve> newCurves = DivideCurves(c1,c2,div,factor, mode);
crvTree.AddRange(newCurves, new GH_Path(loops);
}
loops++;
if(loops > maxLoops) return; // i.e. Adios Amigos
DoThisDoThat (ref crvTree);
}
…
ius, like the image below. I have a string with all of the 8 radii in a group of data. I was using the Divide Surface command, but there are two problems. First, the resulting points have a tree structure shown in the screenshot below, with {8; 2; 3}. How do I assign radius so that the six holes on the same panel has the same radius? The second problem is, the divide surface command generates points along the edges, too, where I don’t need any holes. How can I get rid of them?
…
I want to trace a parallel line to a2. This line cuts r3 at B.
At this point B I need to trace a new parallel line to a3 that cuts r2 at C...
and so on and so forth,
red lines are auxiliary lines parallels to green ones.
I think it could be get with a loop but I have no idea to do it.
Could anyone give me a clue?
Thanks a lot!!
…
not working, then this can be a limitation of Honeybee, not the Terrain shading mask component.You can authenticate the mask shape by using the Udeuschle panorama generator (I used the following Trento coordinates: lat:46.066667, long:11.116667):
Sketchup has a similar plugin for Trynsys3D terrain shading masks.
I gave a reply on your upper questions in here, in component's release topic, so that it would be useful for others users too.
Actually I tried also to create the mask of the mountain using the topography I imported from Sketchup and the Ladybug Shading Mask II component. In this way the shading effect is well noticeable, but the process of creating the mask from such a complex geometry is very slow.
I can make a component which will automatically generate the topography of the local terrain, for a given latitude/longitude, but you will have to wait some time. I am currently doing some repairing around my house and cottage, and I do not have any spare time.Have in mind that depending on the configuration of you PC, you may not be able to have the terrain radius of up to 100 km. While Terrain Shading Mask component actually creates this terrain, it does not add it to the grasshopper document. In your case the terrain will be added to the grasshopper document which may crash Rhino depending on your PC configuration (for example it crashes Rhino on my PC).…
r "virtual partitions" as follows:
What I mean "air walls" here, is derived from the description of the E+ documentation with the header of "Air wall, Open air connection between zones". (Page 17, http://apps1.eere.energy.gov/buildings/energyplus/pdfs/tips_and_tricks_using_energyplus.pdf)
As I understand, the term "air wall" used in E+ here refers to a description of something like "boundary condition" between adjacent interzone heat transfer surfaces, but not a kind of "construction or material" (like air space resistance or air gaps within a wall/double glazing window).
The main purpose of introducing the "air wall", is to simulate or approximate the airflow/convection/natural ventilation effect between multiple thermal zones which are connected by a large opening.
In my previous tests, using HBzones and GB, I managed to create the gbXML file which can be successfully imported to DB (without assigning any constructions within HB). And the adjacency condition can be recognized automatically by DB, even when I did not use the "Solve adjacencies" component in HB - shared surfaces between multiple thermal zones are recognized automatically by BD as "internal - partition"(which are standard partitions, but not virtual partitions).
In order to create/approximate "virtual partition", I need to manually draw a "hole" in the standard partition surface (fig.1&2). Again, the reason why we want to use "virtual partitions"(or "air wall") is that it allows airflow between multiple thermal zones which are connected by large openings and we could get different temperature of the each subdivided thermal zone which compose a large thermal zone.
My question is, if there is a possible way to simulate/approximate this kind of "virtual partitions"(or "air wall") in HBzones or in GB? If so, I would like to test if DB recognizes it or not. Actually, we expect that there is no need to involve any manual operations (like drawing a "hole" in the standard partition surface) in DB, due to an automatic optimization loop.
Thank you!
Best,
Ding
fig.1
fig.2
…
use for some typical reasons why solar access can be important:
Solar Access for Passive Solar Heating - The conditional statement should request sun vectors for any hours below the balance point of the building (the temperature at which the building starts requiring additional heating). For residences, this can be as high as 18C and for commercial/retail buildings with high internal heat gains, this can be as low as 10C. 16C is around what you might find for some residences with better insulation and is probably the reason why that is chosen in the file.
Solar Access for Outdoor Thermal Comfort - The conditional statement should request sun vectors for any hours below the lower limit of outdoor comfort (UTCI uses 9C for this lower limit).
Solar Access for Health of Plants/Trees in a Park/Garden - This is a bit of the opposite of the other metrics since you want hours of the warmer season. In this case, I usually use solar radiation as the annualHourlyData with the conditional statement and I request hours that are above a certain radiation level (where the plants are benefiting the most). I then use an analysisPeriod to get rid of any months of the year when the trees don't have leaves on them.
Hope this helps,
-Chris…
te some implications and questions so I will go one by one:
"Now I would like to use a single VRay material as a template for creating multiple identical materials"I hope this will work, but as VRay does not expose any SDK, I would not guarantee any specific result.
"Now I need to add them to the document material table"This is done with a reference to a document instance, such as the one you get with the code doc.Materials (both in C# and Vb.Net).
"I'm not going to learn C# to modify his script"That's a pity, it would be nice to pass on this troublemaker to somebody else! :)Btw, C# and Vb.Net are very very similar. This script could be written in Vb.Net too.
"Reference to a non-shared member requires an object reference. (line 96)"This only means that you need to access the Materials property on an instance, not on the type (class) name. Change that line using what is written at point 2.
"Do I understand that the material has to be assigned to a particular object in order to enter the Material Table?"No it does not. But if you call the _Purge command it will be removed if it does not have an object that references it.
"Can I assign it to a Layer instead?"You do not need to. But this would be achieved with doc.Layers[whichLayer].RenderMaterialIndex = materialIndex; in C# or doc.Layers(whichLayer).RenderMaterialIndex = materialIndex in Vb.Net.
"Any ideas? A better way to do this?"If you found a way to bypass the VRay SDK not being there, this should work.
"Giulio's component has a type hint defined as a Material"It does not any longer. The hint was there in earlier versions of Grasshopper, but now the hint has disappeared. This is not so bad, and it is also the only way you would be able to use either a Material instance already or a string for a material name.
"How was that done?"Probably it was done in an older version of Grasshopper. But which version are you using?
"I can't figure out how to cast the input as a Rhino.DocObjects.Material, so you can see that I have cast it as a compatible type in the first 2 lines... is there a cleaner way?"That sounds like a good way actually. Be sure your component responds properly when something wrong is inputted, though.Dim mTemp As Rhino.DocObjects.Material = CType(M, Rhino.DocObjects.Material)in one line might also work. See msdn for more conversion operators and functions.
I hope this helps,
- Giulio_______________giulio@mcneel.com…
ther math and logic. i can usually conceptualise what i want to do and cobble some semi working thing together but don't know which components to use and how to patch it. so i'm super happy to have someone who knows what he's doing to find this interesting.
and i'm glad you mention the fanned frets again, there is one input parameter that's still missing for the multiscale frets to be fully parametric, it's the angle of the nut or which fret should be straight. it depends a bit on personal preferences and playing posture what is more comfortable. so being able to adjust this easily would be cool. again i have no idea how the maths for that work or if you can just rotate each fret the same amount around it's middle point. The input either as fret number (for the straight fret) or as a simple slider from bridge to nut should do as input setting.
Here are the two extremes and the middle ground:
i've been thinkin today while analysing your patches and cleaning up my mess what exactly the monster should do.
Here are the input parameters needed, i think it's the complete list
scale length low E string
scale length high e string
fret angle/straight fret
string width at nut
string width at bridge
number of frets
fretboard overhang at nut (distance from string to fretboard bounds)
fretboard overhang at last fret
string gauges
string tensions
fretboard radius at nut (for compound radius fretboard radius at bridge is calculated with the stewmac formula)
fretwire crown width
fretwire crown height
action height at nut (distance between bottom of string and fretwire crown top)
action height at last fret
pickup 1 neck position
pickup 2 middle position
pickup 3 bridge position
nut width
the pickup positions should be used to draw circles for the magnet poles on each string so they are perfectly aligned and can be used for the pickup flatwork construction. ideally they would need a rotation control aligning the center line of the pickup so it's somewher between the last fret angle and bridge angle. personally i do this visually depending on the design i'm looking for, some people have huge theories on pickup positioning but personally i don't believe in it.
that should result in everything needed to quickly generate all the necessary construction curves or geometry for nut/fingerboard/frets/pickups. this is the core of what makes a guitar work, the more precise this dynamic system is the better the guitar plays and sounds.
i posted another thread trying to understand how i could use datasets form spreadsheets,databse, csv to organize the input parameters. What would make sense for the strings for example is hook into a spreadsheet with the different string sets, i attached one for the d'Addario NYXL string line which basically covers all combos that make sense.
The string tension is an interesting one, and implmenting it would sure be overkill albeit super interesting to try. it should be possible to extrapolate from the scale length of each string what the tension for a given string gauge of that string would be so that you could say 'i want a fully balanced set' or 'heavy top light bottom) and it would calculate which SKU from d'addario would best match the required tension. All the strings listed in the spreadsheet are available as single strings to buy.
i'm trying to reorganize everything which helps me understand it. i just discovered the 'hidden wires' feature which is great since once i understood what a certain block does or have finished one of my own, i can get the wires out of the way to carry on undistracted. a bit risky to hide so many wires but it makes it so much easier not to get completely lost :-)
btw, the 'fanned fret' term is trademarked, some guy tried to patent it in the 80's which is a bit silly since it has been done for centuries. there is a level of sophistication above this as well, check out http://www.truetemperament.com/ and that really is something else. it really is astounding how superior the tuning is on those wigglefrets, the problem is that it's rather awkward for string bending and also you can't easily recrown or level the frets when they are used. …
e matching with a dedicated component which creates combinations of items. You can find the [Cross Reference] component in the Sets.List panel.
When Grasshopper iterates over lists of items, it will match the first item in list A with the first item in list B. Then the second item in list A with the second item in list B and so on and so forth. Sometimes however you want all items in list A to combine with all items in list B, the [Cross Reference] component allows you to do this.
Here we have two input lists {A,B,C} and {X,Y,Z}. Normally Grasshopper would iterate over these lists and only consider the combinations {A,X}, {B,Y} and {C,Z}. There are however six more combinations that are not typically considered, to wit: {A,Y}, {A,Z}, {B,X}, {B,Z}, {C,X} and {C,Y}. As you can see the output of the [Cross Reference] component is such that all nine permutations are indeed present.
We can denote the behaviour of data cross referencing using a table. The rows represent the first list of items, the columns the second. If we create all possible permutations, the table will have a dot in every single cell, as every cell represents a unique combination of two source list indices:
Sometimes however you don't want all possible permutations. Sometimes you wish to exclude certain areas because they would result in meaningless or invalid computations. A common exclusion principle is to ignore all cells that are on the diagonal of the table. The image above shows a 'holistic' matching, whereas the 'diagonal' option (available from the [Cross Reference] component menu) has gaps for {0,0}, {1,1}, {2,2} and {3,3}:
If we apply this to our {A,B,C}, {X,Y,Z} example, we should expect to not see the combinations for {A,X}, {B,Y} and {C,Z}:
The rule that is applied to 'diagonal' matching is: "Skip all permutations where all items have the same list index". 'Coincident' matching is the same as 'diagonal' matching in the case of two input lists which is why I won't show an example of it here (since we are only dealing with 2-list examples), but the rule is subtly different: "Skip all permutations where any two items have the same list index".
The four remaining matching algorithms are all variations on the same theme. 'Lower triangle' matching applies the rule: "Skip all permutations where the index of an item is less than the index of the item in the next list", resulting in an empty triangle but with items on the diagonal.
'Lower triangle (strict)' matching goes one step further and also eliminates the items on the diagonal:
'Upper Triangle' and 'Upper Triangle (strict)' are mirror images of the previous two algorithms, resulting in empty triangles on the other side of the diagonal line:
…
go As New MRhinoGetObject()
go.SetCommandPrompt("Sélectionnez les deux arrêtes sur les pièces à serrer pour placer la Boulonnerie...")
go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.edge_object)
go.AcceptNothing()
go.GetObjects(2, 2)
If (go.CommandResult() <> IRhinoCommand.result.success) Then
C1 = go.CommandResult()
End If
Dim object_ref1 As MRhinoObjRef = go.Object(0)
Dim obj1 As IRhinoObject = object_ref1.Object()
Dim curve1 As OnCurve = object_ref1.Curve()
Dim object_ref2 As MRhinoObjRef = go.Object(1)
Dim obj2 As IRhinoObject = object_ref2.Object()
Dim curve2 As OnCurve = object_ref2.Curve()
C1 = curve1.NurbsCurve
C2 = curve2.NurbsCurve…