j
1
c
e
h
k
2
f
-------------------------------------------------------------------------------------------------
To these...
0;0
0;1
0
a
i
------------------------------------------------------------
0;0
0;1
0;2
0
b
g
j
1
c
h
k
------------------------------------------------------------
0;0
0
d
1
e
2
f
------------------------------------------------------------
Thanx……
mponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: AntiprismComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: PrismComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: PrismComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: PyramidComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: PyramidComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LaplacianComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LaplacianComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LaplacianHCComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LaplacianHCComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: CatmullClarkComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: CatmullClarkComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LoopComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LoopComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: SplitPolygonsComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: SplitPolygonsComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: SplitQuadsComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: SplitQuadsComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: BevelEdgesComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: BevelEdgesComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: BevelVerticesComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: BevelVerticesComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: CarpetComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: CarpetComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: FrameComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: FrameComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: OffsetComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: OffsetComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: ThickenComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: ThickenComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: WindowComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: WindowComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
…
runs perfectly in rhino, yet not in grasshopper. I am using windows XP. Thanks in advance, any help will be great!
here's the typical error:
Object: AntiprismComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: AntiprismComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: PrismComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: PrismComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: PyramidComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: PyramidComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LaplacianComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LaplacianComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LaplacianHCComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LaplacianHCComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: CatmullClarkComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: CatmullClarkComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: LoopComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: LoopComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: SplitPolygonsComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: SplitPolygonsComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: SplitQuadsComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: SplitQuadsComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: BevelEdgesComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: BevelEdgesComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: BevelVerticesComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: BevelVerticesComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: CarpetComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: CarpetComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: FrameComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: FrameComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: OffsetComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: OffsetComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: ThickenComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: ThickenComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
Object: WindowComponent (level 1){ Exception has been thrown by the target of an invocation. TargetInvocationException}
Object: WindowComponent (level 2){ Method not found: 'Void Grasshopper.Kernel.GH_PersistentParam`1.SetPersistentData(**UNKNOWN TYPE**)'. MissingMethodException}
…
But not just any gum tree. The angophora, no less:
Why? Because I like nature, that's why. Every time I see new designs –especially architectural designs– it worries me that the natural environment is being taken over. Not just that, but even the new materials used in all product designs has to come from nature as well [read: mines].
So. People are forgetting that we still need trees and I believe that if someone sees a beautiful [read: established] tree in their architectural plans, they are going to be much more likely to build around it and not cut it down. That alone would no doubt increase the value of the house.
My thinking is that current tree models suck. They look unnatural and I think I know why. They're not random or organic enough. They're not detailed enough. That's basically my 'rationale' for this project. Just look at how different all of these tree trunks are!
So I am not being paid for this project. It's a personal project of mine. I'm just worried about the trunk shape for now — I'll worry about all the leaves... when I get to that.
I am a grasshopper beginner. Please keep that in mind. I am also fairly hopeless at traditional programming, but I find the visual approach of grasshopper much easier to grasp. So unfortunately I have gotten stuck and need some help, even just a clue, as to how to proceed.
That said, here is my current progress:
About a year ago, I started modelling with straight trunks using pipe sections, to see if I could get a very basic "tree" shape. And to see if I could join the segments together. Yes it works but it looks hopeless as you can imagine. Then I stopped for a long while. Now I'm back at it, hoping to improve a lot more.
I have already made one basic vertical nurbs curve with tangents at either end as the main "trunk".
I tried creating two ellipses at each end of the main trunk/curve and lofting between them but it omitted the main curve/rail. So it ended up being an elliptical trunk with straight sides which of course still didn't look right.
Then I divided the first main curve up into a number of segments. I think that is a better approach.
I have taken the parameters of the curve at each segment (probably the tangent, but I am unsure what the exact parameter is) and used that to form a basic angled plane at each segment/division.
I have been able to draw ellipses at each segment and rotate them onto the plane.
I was going to loft it together later on. A Curved loft with elliptical cross-sections looks much better than straight a pipe does, but still looks too unnatural.
I quickly realised that tree trunks are not elliptical, but rather, shaped more like 'kidneys'.
The next step was to create >3 points on each of those planes (spaced fairly evenly around the ellipse so as not to create a really funky/unwanted shape).
Maybe it would be better to model with a triangle or other polygon instead of an ellipse. I haven't got that far yet... because here is where I am getting stuck.
I managed to find a way of getting three roughly 'triangular' points along each that ellipse.
I also managed to create three nurbs cuves in the Z direction which intersected those three points, a bit like three seams down the side of the tree trunk, but couldn't figure out how to loft it all together.
I think it was the wrong approach anyway... I'd rather try to create a bunch of nurbs curves at each of the XY planes so as to get more control of the shape.
What I am trying to do now is create three roughly triangular-spaced points on a basic ellipse through which I can then draw a simple nurbs curve (think like a cross section of the trunk).
I would then like to add some XY-only randomness to the positions of those points. Not Z randomness, otherwise the trunk is going to get messed/kinked up. That's probably very important.
Then I would like to loft those nurbs curvs at each XY plane together forming the basic tree trunk, which also tapers based on some other variable (a non-linear factor, not simply distance from ground plane, perhaps something else?).
I have attached the GH file.
I am also open to suggestions if you have a better way of solving a problem. I would like to retain control over a lot of factor such as number of branches, spacing, average branch length, etc. My main contrsaints are that the entire thing has to be somewhat random and non-linear.
…
ng is deciding how and where to store your data. If you're writing textual code using any one of a huge number of programming languages there are a lot of different options, each with its own benefits and drawbacks. Sometimes you just need to store a single data point. At other times you may need a list of exactly one hundred data points. At other times still circumstances may demand a list of a variable number of data points.
In programming jargon, lists and arrays are typically used to store an ordered collection of data points, where each item is directly accessible. Bags and hash sets are examples of unordered data storage. These storage mechanisms do not have a concept of which data comes first and which next, but they are much better at searching the data set for specific values. Stacks and queues are ordered data structures where only the youngest or oldest data points are accessible respectively. These are popular structures for code designed to create and execute schedules. Linked lists are chains of consecutive data points, where each point knows only about its direct neighbours. As a result, it's a lot of work to find the one-millionth point in a linked list, but it's incredibly efficient to insert or remove points from the middle of the chain. Dictionaries store data in the form of key-value pairs, allowing one to index complicated data points using simple lookup codes.
The above is a just a small sampling of popular data storage mechanisms, there are many, many others. From multidimensional arrays to SQL databases. From readonly collections to concurrent k-dTrees. It takes a fair amount of knowledge and practice to be able to navigate this bewildering sea of options and pick the best suited storage mechanism for any particular problem. We did not wish to confront our users with this plethora of programmatic principles, and instead decided to offer only a single data storage mechanism.*
Data storage in Grasshopper
In order to see what mechanism would be optimal for Grasshopper, it is necessary to first list the different possible ways in which components may wish to access and store data, and also how families of data points flow through a Grasshopper network, often acquiring more complexity over time.
A lot of components operate on individual values and also output individual values as results. This is the simplest category, let's call it 1:1 (pronounced as "one to one", indicating a mapping from single inputs to single outputs). Two examples of 1:1 components are Subtraction and Construct Point. Subtraction takes two arguments on the left (A and B), and outputs the difference (A-B) to the right. Even when the component is called upon to calculate the difference between two collections of 12 million values each, at any one time it only cares about three values; A, B and the difference between the two. Similarly, Construct Point takes three separate numbers as input arguments and combines them to form a single xyz point.
Another common category of components create lists of data from single input values. We'll refer to these components as 1:N. Range and Divide Curve are oft used examples in this category. Range takes a single numeric domain and a single integer, but it outputs a list of numbers that divide the domain into the specified number of steps. Similarly, Divide Curve requires a single curve and a division count, but it outputs several lists of data, where the length of each list is a function of the division count.
The opposite behaviour also occurs. Common N:1 components are Polyline and Loft, both of which consume a list of points and curves respectively, yet output only a single curve or surface.
Lastly (in the list category), N:N components are also available. A fair number of components operate on lists of data and also output lists of data. Sort and Reverse List are examples of N:N components you will almost certainly encounter when using Grasshopper. It is true that N:N components mostly fall into the data management category, in the sense that they are mostly employed to change the way data is stored, rather than to create entirely new data, but they are common and important nonetheless.
A rare few components are even more complex than 1:N, N:1, or N:N, in that they are not content to operate on or output single lists of data points. The Divide Surface and Square Grid components want to output not just lists of points, but several lists of points, each of which represents a single row or column in a grid. We can refer to these components as 1:N' or N':1 or N:N' or ... depending on how the inputs and outputs are defined.
The above listing of data mapping categories encapsulate all components that ship with Grasshopper, though they do not necessarily minister to all imaginable mappings. However in the spirit of getting on with the software it was decided that a data structure that could handle individual values, lists of values, and lists of lists of values would solve at least 99% of the then existing problems and was thus considered to be a 'good thing'.
Data storage as the outcome of a process
If the problems of 1:N' mappings only occurred in those few components to do with grids, it would probably not warrant support for lists-of-lists in the core data structure. However, 1:N' or N:N' mappings can be the result of the concatenation of two or more 1:N components. Consider the following case: A collection of three polysurfaces (a box, a capped cylinder, and a triangular prism) is imported from Rhino into Grasshopper. The shapes are all exploded into their separate faces, resulting in 6 faces for the box, 3 for the cylinder, and 5 for the prism. Across each face, a collection of isocurves is drawn, resembling a hatching. Ultimately, each isocurve is divided into equally spaced points.
This is not an unreasonably elaborate case, but it already shows how shockingly quickly layers of complexity are introduced into the data as it flows from the left to the right side of the network.
It's no good ending up with a single huge list containing all the points. The data structure we use must be detailed enough to allow us to select from it any logical subset. This means that the ultimate data structure must contain a record of all the mappings that were applied from start to finish. It must be possible to select all the points that are associated with the second polysurface, but not the first or third. It must also be possible to select all points that are associated with the first face of each polysurface, but not any subsequent faces. Or a selection which includes only the fourth point of each division and no others.
The only way such selection sets can be defined, is if the data structure contains a record of the "history" of each data point. I.e. for every point we must be able to figure out which original shape it came from (the cube, the cylinder or the prism), which of the exploded faces it is associated with, which isocurve on that face was involved and the index of the point within the curve division family.
A flexible mechanism for variable history records.
The storage constraints mentioned so far (to wit, the requirement of storing individual values, lists of values, and lists of lists of values), combined with the relational constraints (to wit, the ability to measure the relatedness of various lists within the entire collection) lead us to Data Trees. The data structure we chose is certainly not the only imaginable solution to this problem, and due to its terse notation can appear fairly obtuse to the untrained eye. However since data trees only employ non-negative integers to identify both lists and items within lists, the structure is very amenable to simple arithmetic operations, which makes the structure very pliable from an algorithmic point of view.
A data tree is an ordered collection of lists. Each list is associated with a path, which serves as the identifier of that list. This means that two lists in the same tree cannot have the same path. A path is a collection of one or more non-negative integers. Path notation employs curly brackets and semi-colons as separators. The simplest path contains only the number zero and is written as: {0}. More complicated paths containing more elements are written as: {2;4;6}. Just as a path identifies a list within the tree, an index identifies a data point within a list. An index is always a single, non-negative integer. Indices are written inside square brackets and appended to path notation, in order to fully identify a single piece of data within an entire data tree: {2,4,6}[10].
Since both path elements and indices are zero-based (we start counting at zero, not one), there is a slight disconnect between the ordinality and the cardinality of numbers within data trees. The first element equals index 0, the second element can be found at index 1, the third element maps to index 2, and so on and so forth. This means that the "Eleventh point of the seventh isocurve of the fifth face of the third polysurface" will be written as {2;4;6}[10]. The first path element corresponds with the oldest mapping that occurred within the file, and each subsequent element represents a more recent operation. In this sense the path elements can be likened to taxonomic identifiers. The species {Animalia;Mammalia;Hominidea;Homo} and {Animalia;Mammalia;Hominidea;Pan} are more closely related to each other than to {Animalia;Mammalia; Cervidea;Rangifer}** because they share more codes at the start of their classification. Similarly, the paths {2;4;4} and {2;4;6} are more closely related to each other than they are to {2;3;5}.
The messy reality of data trees.
Although you may agree with me that in theory the data tree approach is solid, you may still get frustrated at the rate at which data trees grow more complex. Often Grasshopper will choose to add additional elements to the paths in a tree where none in fact is needed, resulting in paths that all share a lot of zeroes in certain places. For example a data tree might contain the paths:
{0;0;0;0;0}
{0;0;0;0;1}
{0;0;0;0;2}
{0;0;0;0;3}
{0;0;1;0;0}
{0;0;1;0;1}
{0;0;1;0;2}
{0;0;1;0;3}
instead of the far more economical:
{0;0}
{0;1}
{0;2}
{0;3}
{1;0}
{1;1}
{1;2}
{1;3}
The reason all these zeroes are added is because we value consistency over economics. It doesn't matter whether a component actually outputs more than one list, if the component belongs to the 1:N, 1:N', or N:N' groups, it will always add an extra integer to all the paths, because some day in the future, when the inputs change, it may need that extra integer to keep its lists untangled. We feel it's bad behaviour for the topology of a data tree to be subject to the topical values in that tree. Any component which relies on a specific topology will no longer work when that topology changes, and that should happen as seldom as possible.
Conclusion
Although data trees can be difficult to work with and probably cause more confusion than any other part of Grasshopper, they seem to work well in the majority of cases and we haven't been able to come up with a better solution. That's not to say we never will, but data trees are here to stay for the foreseeable future.
* This is not something we hit on immediately. The very first versions of Grasshopper only allowed for the storage of a single data point per parameter, making operations like [Loft] or [Divide Curve] impossible. Later versions allowed for a single list per parameter, which was still insufficient for all but the most simple algorithms.
** I'm skipping a lot of taxonometric classifications here to keep it simple.…
Added by David Rutten at 2:22pm on January 20, 2015
then passed to the file3dm.Write() Method when it's used? Turns out it will work in the Visual Studio IDE perfectly well like this, Now I'm just sorting out the best way to create a surface.
If I can ask one more question, what does file.Polish() do?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Rhino.Geometry;
using Rhino.FileIO;
using Rhino.Collections;
using Rhino;
namespace NurbsExample
{
class Program
{
static void Main(string[] args)
{
string output = "C:/WorkingFileExample.3dm";
RunScript(output);
}
private static void RunScript(string path)
{
File3dm file = new File3dm();
file.Polish();
for (int j = 0; j<=10; j++)
{
file.Objects.AddLine(new Line(j, 0, 5 - j, 5 + j, 0, j));
}
File3dmWriteOptions options = new File3dmWriteOptions();
options.SaveAnalysisMeshes = false;
options.SaveRenderMeshes = false;
options.SaveUserData = true;
file.Write(path, options);
}
}
}…
Added by Henry Jarvis at 6:33am on October 7, 2015
t. So here we go!
1. Honeybee is brown and not yellow [stupid!]...
As you probably remember Honeybee logo was initially yellow because of my ignorance about Honeybees. With the help of our Honeybee expert, Michalina, now the color is corrected. I promised her to update everyone about this. Below are photos of her working on the honeybee logo and the results of her study.
If you think I'm exaggerating by calling her a honeybee expert you better watch this video:
Thank you Michalina for the great work! :). I corrected the colors. No yellow anymore. The only yellow arrows represent sun rays and not the honeybee!
2. Yellow or brown, W[here]TH Honeybee is?
I know. It has been a long time after I posted the initial video and it is not fun at all to wait for a long time. Here is the good news. If you are following the Facebook page you probably now that the Daylighting components are almost ready.
Couple of friends from Grasshopper community and RADIANCE community has been helping me with testing/debugging the components. I still think/hope to release the daylighting components at some point in January before Ladybug gets one year old.
There have been multiple changes. I finally feel that the current version of Honeybee is simple enough for non-expert users to start running initial studies and flexible enough for advanced users to run advanced studies. I will post a video soon and walk you through different components.
I think I still need more time to modify the energy simulation components so they are not going to be part of the next release. Unfortunately, there are so many ways to set up and run a wrong energy simulation and I really don’t want to add one new GIGO app to the world of simulation. We already have enough of that. Moreover I’m still not quite happy with the workflow. Please bear with me for few more months and then we can all celebrate!
I recently tested the idea of connecting Grasshopper to OpenStudio by using OpenStudio API successfully. If nothing else, I really want to release the EnergyPlus components so I can concentrate on Grasshopper > OpenStudio development which I personally think is the best approach.
3. What about wind analysis?
I have been asked multiple times that if Ladybug will have a component for wind study. The short answer is YES! I have been working with EFRI-PULSE project during the last year to develop a free and open source web-based CFD simulation platform for outdoor analysis.
We had a very good progress so far and our rockstar Stefan recently presented the results of the work at the American Physical Society’s 66th annual DFD meeting and the results looks pretty convincing in comparison to measured data. Here is an image from the presentation. All the credits go to Stefan Gracik and EFRI-PULSE project.
The project will go live at some point next year and after that I will release the Butterfly which will let you prepare the model for the CFD simulation and send it to EFRI-PULSE project. I haven’t tried to run the simulations locally yet but I’m considering that as a further development. Here is how the component and the logo looks like right now.
4. Teaching resources
It has been almost 11 months from the first public release of Ladybug. I know that I didn't do a good job in providing enough tutorials/teaching materials and I know that I won’t be able to put something comprehensive together soon.
Fortunately, ladybug has been flying in multiple schools during the last year. Several design, engineering and consultant firms are using it and it has been thought in several workshops. As I checked with multiple of you, almost everyone told me that they will be happy to share their teaching materials; hence I started the teaching resources page. Please share your materials on the page. They can be in any format and any language. Thanks in advance!
I hope you enjoyed/are enjoying/will enjoy the longest night of the year. Happy Yalda!
Cheers,
-Mostapha
…
..
The problem is that using the index, adding a activies, the next activies change the index and then the link is wrong.
example: I need to connect to hotel function with house function, therefore i have 0 and 4 index in my panel.. So i have to extract the index linked to the alphabetical value to be able to draw lines between the points associated to the names of activities. Now if i add a new string between the values, the house activity hasn't the original index 4 but the new index 5. So the link will be not created between hotel and house but hotel e new activity in the index 4.
…