Search
  • Sign In

Grasshopper

algorithmic modeling for Rhino

  • Home
    • Members
    • Listings
    • Ideas
  • View
    • All Images
    • Albums
    • Videos
    • Architecture Projects
    • Installations
    • Add-ons
  • Download
    • Rhino 7 w/Grasshopper
    • Add-ons
  • Forums/Support
    • Current Discussions
    • Legacy Forum
  • Learn
    • Getting Started
    • Online Reference
    • API documentation
    • Video Tutorials
    • Common Questions
    • Scripting and Coding
    • Books and Articles
  • Attend
  • My Page

Search Results - 分分快3最准高手助赢计划-『8TBH·COM』福利彩票开奖结果012期查询--2023年3月19日6时48分50秒.H5c2a3.5jexii16x-gov-hk

Topic: Creating a Component with a variable number of output parameters
the data structure of the input. I'll create a component that aims to write all the GH_Paths inside the input data structure into separate output parameters. I'll add a menu item to the component that allows users to synch the number of outputs with the current data. Note that there are some bugs I found related to Undo here, but I'll attempt to fix those asap. The mechanisms employed in this example are correct. Let's start with the Component class definition and the constructor: Public Class GH_ExampleComponent_VarOutput   Inherits GH_Component   Public Sub New()     MyBase.New("Extract Paths", "ExPath", "Extract all the paths from a tree", "Sets", "Tree")   End Sub End Class Now, the RegisterXXXXParams methods: Protected Overrides Sub RegisterInputParams(ByVal pManager As GH_Component.GH_InputParamManager)   pManager.Register_GenericParam("Tree", "T", "Data tree to examine", GH_ParamAccess.tree) End Sub Protected Overrides Sub RegisterOutputParams(ByVal pManager As GH_Component.GH_OutputParamManager)   'We'll add one output parameter, just to not have a jagged output.   pManager.Register_PathParam("Path 1", "1", "1st path in tree") End Sub SolveInstance() is somewhat special, but not very complicated: Protected Overrides Sub SolveInstance(ByVal DA As IGH_DataAccess)   'We have only one input parameter and it is set to Tree,    'so SolveInstance will only be called once for every solution.   'We don't actually need the data inside the input, we're only interested in the paths.   'So we don't actually need to call DA.GetDataTree, we can just go in and extract the    'paths directly:   Dim paths As IList(Of GH_Path) = Params.Input(0).VolatileData.Paths   'Abort if there is no tree.   If (paths.Count = 0) Then Return   'Post a warning if the number of output parameters does not    'equal the number of paths in the tree.   If (paths.Count < Params.Output.Count) Then AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "There are more outputs than paths in the tree.")   ElseIf (paths.Count > Params.Output.Count) Then AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "There are fewer outputs than paths in the tree.")   End If   'Iterate over all paths and assign to output parameters.   For i As Int32 = 0 To Math.Min(Params.Output.Count, paths.Count) - 1 DA.SetData(i, paths(i))   Next End Sub Adding a menu item to the component menu is relatively straightforward, however handling the menu command requires a fair bit of logic: Protected Overrides Sub Menu_AppendCustomComponentItems(ByVal iMenu As System.Windows.Forms.ToolStripDropDown)   'Add a single item to the component menu.   Menu_AppendGenericMenuItem(iMenu, "Synch outputs", AddressOf Menu_SynchOutputClicked) End Sub Private Sub Menu_SynchOutputClicked(ByVal sender As Object, ByVal e As EventArgs)   'Here we have to synch the number of output parameters with the number    'of paths in the volatile data tree in the input parameter.   'This requires a few steps:   '1. Determine whether something needs to happen at all.   '2. Record an undo event.   '3. Remove excess outputs or add missing outputs.   Dim paths As IList(Of GH_Path) = Params.Input(0).VolatileData.Paths   If (paths.Count = Params.Output.Count) Then Return 'yay, nothing needs to be done.   'Something needs to be done, record an undo state.   RecordUndoEvent("Synch output")   'We either have too few or too many outputs, determine which is the case.   If (paths.Count > Params.Output.Count) Then 'Add the missing outputs For i As Int32 = Params.Output.Count + 1 To paths.Count  Dim param As New Grasshopper.Kernel.Parameters.Param_GenericObject()  param.Name = "Path " & i.ToString()  param.NickName = i.ToString()  If (i.ToString.EndsWith("1")) Then param.Description = i.ToString() & "st path in tree"  ElseIf (i.ToString.EndsWith("2")) Then param.Description = i.ToString() & "nd path in tree"  ElseIf (i.ToString.EndsWith("3")) Then param.Description = i.ToString() & "rd path in tree"  Else param.Description = i.ToString() & "th path in tree"  End If  Params.RegisterOutputParam(param) Next   Else 'Remove excessive outputs Do  If (Params.Output.Count <= paths.Count) Then Exit Do  Dim param As IGH_Param = Params.Output(Params.Output.Count - 1)  Params.UnregisterOutputParameter(param) Loop   End If   Params.OnParametersChanged()   ExpireSolution(True) End Sub Finally, we must make sure that the component properly (de)serializes. This means we have to override the Write and Read methods and add additional information to the GHX archive: Public Overrides Function Write(ByVal writer As GH_IO.Serialization.GH_IWriter) As Boolean   'We must make sure that the number of output parameters is correctly stored.   'We'll use a special function on the GH_ComponentParamServer to accompish this   'without too much sweat.   Params.WriteParameterTypeData(writer)   Return MyBase.Write(writer) End Function Public Overrides Function Read(ByVal reader As GH_IO.Serialization.GH_IReader) As Boolean   'Very important, we must make sure all parameters exist before we    'start with the main deserialization.   Params.Clear()   Params.ReadParameterTypeData(reader)   Return MyBase.Read(reader) End Function I attached a VB file that contains the code outlined above. -- David Rutten david@mcneel.com Seattle, WA…
Added by David Rutten at 11:43pm on October 27, 2010
Comment on: Topic 'apply a pattern on a surface'
me of course!So I'll try to be as clear as possible.I have two problems.The form we have is a shade. I would like to close the shape of the top so she cancling to a bulb socket. For this, I want to keep a planar surface (the same surface asthe top of the basic shape without distortion but reduced (scale)), then connect themodified form (with the attractors points) to this surface. However, it must be dividethis surface on triangle to succeed have flat surface (because the shade is made of paper and then cut out of planar sheets).I managed to do it but very complicated and non-automatic by taking each point oneby one through lists items.Do you know a way to do it automatically and it still works even if we increase the number of facets of the form?I also have a problem with attractors points to 2 different places, to distort the basic shape and create the holes. I could wish to create as many attractors points what I want in my program but it is limited.Do you think it is possible to group all attractors points in only component (point) to make this automatic?In my program, I have managed to use several (3) points attractors to distort the basic shape using dispatch order if I want attractors for example 24 points, I wouldcreate 24 pieces of program which is quite disturb!For holes, the problem IS exactly the same.Do you have any ideas? (If you have time). Thanks a lot.Ines …
Added by Ines at 3:05am on January 26, 2012
Comment on: Topic 'Pain Points in Grasshopper'
r." I'm sorry to hear that, I take the interface and ease-of-use rather seriously so this sounds like a fundamental failure on my part. On the other hand, Grasshopper isn't supposed to be on a par with most other 3D programs. It is emphatically not meant for manual/direct modelling. If you would normally tackle a problem by drawing geometry by hand, Grasshopper is not (and should never be advertised as) a good alternative."What in other programs is a dialog box, is 8 or 10 components strung together in grasshopper. The wisdom for this I often hear among the grasshopper community is that this allows for parametric design."Grasshopper ships with about 1000 components (rounded to the nearest power of ten). I'm adding more all the time, either because new functionality has been exposed in the Rhino SDK or because a certain component makes a lot of sense to a lot of people. Adding pre-canned components that do the same as '8 or 10 components strung together' for the heck of it will balloon the total number of components everyone has to deal with. If you find yourself using the same 8 to 10 components together all the time, then please mention it on this forum. A lot of the currently existing components have been added because someone asked for it."[...] has a far cleaner and more intuitive interface. So does SolidWorks, Inventor, CATIA, NX, and a bunch of others."Again, GH was not designed to be an alternative to these sort of modellers. I don't like referring to GH as 'parameteric' as that term has been co-opted by relational modellers. I prefer to use 'algorithmic' instead. The idea behind parameteric seems to be that one models by hand, but every click exists within a context, and when the context changes the software figures out where to move the click to. The idea behind algorithmic is that you don't model by hand.This is not to say there is no value in the parametric approach. Obviously it is a winning strategy and many people love to use it. We have considered adding some features to GH that would make manual modelling less of a chore and we would still very much like to do so. However this is such a large chunk of work that we have to be very careful about investing the time. Before I start down this road I want to make sure that the choice I'm making is not 'lame-ass algorithmic modeller with some lame-ass parametrics tacked on' vs. 'kick-ass algorithmic modeller with no parametrics tacked on'. Visual Programming.I'm not exactly sure I understand your grievance here, but I suspect I agree. The visual part is front and centre at the moment and it should remain there. However we need to improve upon it and at the same time give programmers more tools to achieve what they want. Context sensitivity."There is no reason a program in 2014 should allow me to make decisions that will not work. For example, if a component input is in all cases incompatible with another component's output, I shouldn't be able to connect them."Unfortunately it's not as simple as that. Whether or not a conversion between two data types makes sense is often dependent on the actual values. If you plug a list of curves into a Line component, none of them may be convertible. Should I therefore not allow this connection to be made? What if there is a single curve that could be converted to a line? What if you want to make the connection now, but only later plan to add some convertible curves to the data? What you made the connection back when it was valid, but now it's no longer valid, wouldn't it be weird if there was a connection you couldn't make again?I've started work on GH2 and one of the first things I'm writing now is the new data-conversion logic. The goal this time around is to not just try and convert type A into type B, but include information about what sort of conversion was needed (straightforward, exotic, far-fetched. etc.) and information regarding why that type was assigned.You are right that under some conditions, we can be sure that a conversion will always fail. For example connecting a Boolean output with a Curve input. But even there my preferred solution is to tell people why that doesn't make sense rather than not allowing it in the first place. Sliders."I think they should be optional."They are optional."The “N” should turn into the number if set."What if you assign more than one integer? I think I'd rather see a component with inputs 'N', 'P' and 'X' rather than '5', '8' and '35.7', but I concede that is a personal preference."But if I plug it into something that'll only accept a 1, a  2, or a 3, that slider should self set accordingly."Agreed. Components."Give components a little “+” or a drawer on the bottom or something that by clicking, opens the component into something akin to a dialog box. This should give access to all of the variables in the component. I shouldn't have to r-click on each thing on a component to do all of the settings."I was thinking of just zooming in on a component would eventually provide easier ways to access settings and data."Could some of these items disappear if they are contextually inappropriate or gray out if they're unlikely?"It's almost impossible for me to know whether these things are 'unlikely' in any given situation. There are probably some cases where a suggestion along the lines of "Hey, this component is about to run 40,524 times. It seems like it would make sense to Graft the 'P' input." would be useful. Integration."Why isn't it just live geometry?"This is an unfortunate side-effect of the way the Rhino SDK was designed. Pumping all my geometry through the Rhino document would severely impact performance and memory usage. It also complicates the matter to an almost impossible degree as any command and plugin running in Rhino now has access to 'my' geometry."Maybe add more Rhino functionality to GH. GH has no 3D offset."That's the plan moving forward. A lot of algorithms in Rhino (Make2D, FilletEdge, Shelling, BlendSrf, the list goes on) are not available as part of the public SDK. The Rhino development team is going to try and rectify this for Rhino6 and beyond. As soon as these functions become available I'll start adding them to GH (provided they make sense of course).On the whole I agree that integration needs a lot of work, and it's work that has to happen on both sides of the isle. Documentation.Absolutely. Development for GH1 has slowed because I'm now working on GH2. We decided that GH1 is 'feature complete', basically to avoid feature creep. GH2 is a ground-up rewrite so it will take a long time until something is ready for testing. During this time, minor additions and of course bug fixes will be available for GH1, but on a much lower frequency.Documentation is woefully inadequate at present. The primer is being updated (and the new version looks great), but for GH2 we're planning a completely new help system. People have been hired to provide the content. With a bit of luck and a lot of work this will be one of the main selling points of GH2. 2D-ness."I know you'll disagree completely, but I'm sticking to this. How else could an omission like offsetsurf happen?"I don't fully disagree. A lot of geometry is either flat or happens inside surfaces. The reason there's no shelling (I'm assuming that's what you meant, there are two Offset Surface components in GH) is because (a) it's a very new feature in Rhino and doesn't work too well yet and (b) as a result of that isn't available to plugins. Organisation.Agreed. We need to come up with better ways to organise, document, version, share and simplify GH files. GH1 UI is ok for small projects (<100 components) but can't handle more complexity. Don't get me wrong, I appreciate the feedback, I really do, but I want to be honest and open about my own plans and where they might conflict with your wishes. Grasshopper is being used far beyond the boundaries of what we expected and it's clear that there are major shortcomings that must be addressed before too long. We didn't get it right with the first version, I don't expect we'll get it completely right with the second version but if we can improve upon the -say- five biggest drawbacks (performance, documentation, organisation, plugin management and no mac version) I'll be a happy puppy. -- David Rutten david@mcneel.com…
Added by David Rutten at 2:11am on August 2, 2014
Topic: Namespaces and layers
is the name of an existing layer and if so figures out the suffix 3 and creates a new layer Green4. In order to do this I have been reading up on the sample pages and the Rhinocommon SDK but I seem to be not grasping how to access certain members. I have written below how I think I would access the members. Can someone please explain why my logic is incorrect. I have a feeling I am not grasping the Structure of the classes. This is the sample code from the LayerTables find method page in the RhinocommonSDK Public Shared Function AddLayer(ByVal doc As Rhino.RhinoDoc) As Rhino.Commands.Result 'Does a layer with the same name already exist?  Dim layer_index As Integer = doc.Layers.Find(layer_name, True) Since the find method is part of the LayerTables class which is part of the Rhino.DocObjects.Tables namespace I would have thought the above would have been Rhino.DocObjects.Tables.LayerTables.Find(layer_name,True) thanks.…
Added by jon kontuly at 2:32pm on February 27, 2012
Topic: Butterfly beta release for Grasshopper and Dynamo
ly has finally metamorphosed to have all known major bugs fixed and is ready to be used by a larger number of people in our community. Butterfly is powered by OpenFOAM, which is a validated and open-source engine for Computational Fluid Dynamics (CFD). Primarily, Butterfly assists with exporting geometry and other input  parameters from the CAD + scripting interface to the OpenFOAM engine. The Grasshopper plugin supports live results visualization that updates as the CFD simulation iterates.  The Dynamo plugin supports results visualization once the analysis is over or paused. For installation instructions and guidance on getting started, check out the Butterfly wiki page. There, you can find step-by-step installation directions and tutorial videos. There also 3 YouTube playlists for getting you started with installing OpenFOAM for Windows and using Butterfly for Grasshopper and Butterfly for Dynamo. Similar to other ladybug tools, Butterfly uses an external validated engine (in this case, OpenFOAM) and you need to install it first to get the insect up-and-running.  However, unlike Radiance and EnergyPlus, OpenFOAM doesn’t have a native installation for Windows and it requires Linux to run. Accordingly, the current version of “OpenFOAM for Windows” uses a technology called docker to run a Linux virtual machine on your system, inside which OpenFOAM operates. While this sounds complicated, the good news is that all of this setup has been packaged into the installer for “OpenFOAM for Windows.”  So running this installer with all its defaults should give you everything you need. The bad news is that the installation can fail if you don’t check your Windows system properly beforehand or don’t follow every step carefully afterwards. You will also need to run Rhino, Revit, and OpenFOAM as an administrator to ensure Butterfly works properly (by right-clicking each launcher for the program and selecting “Run As Administrator").  This said, if you follow the steps carefully, you should have no issues with the installation. You can find some of the issues that people faced during the alpha testing and the solutions to them here. Butterfly is the first plugin that is fully developed based on the structure that I discussed before which consists of a core library and [+] libraries for specific software (in this case Grasshopper and Dynamo). We hope this structure to extend ladybug tools to more platforms by re-using the current code. We will provide a better documentation with more details on this matter in the near future but for now you can use the API for butterfly, butterfly_grasshopper and butterfly_dynamo for customizing or extending the current development. Finally, having access to a powerful CFD engine from inside parametric/generative modeling environments is a great power and as Spider-Man or Uncle Ben once said: “with great power comes great responsibility!” We believe in learning by doing and we don’t expect you to be a CFD expert to get started with butterfly however we expect you to educate yourself along the way. If you have never used OpenFOAM before here is a great presentation to get started. We also highly recommend checking out the official OpenFOAM User Guide that goes through most of its functionality. Finally, we have also collected a number of other learning resources on this page that can be a good starting point. We understand that you will have questions about the plugins which you can post to this forum or Dynamo discussion forum however CFD related issues and questions should be posted to CFD Online. I like to thank everyone who have helped us with the development and testing during the last year or so, and special thank to Theodore who single-handedly educated me through the process of migrating to OpenFOAM and developing butterfly. Butterfly wasn’t possible without Theodore! As always let us know about your comments and suggestions. Happy flying the butterfly! Happy Spring! …
Added by Mostapha Sadeghipour Roudsari to Ladybug Tools at 11:06am on March 20, 2017
Blog Post: Mantis Shrimp - new components

Grasshopper User Objects for importing Dynamo geometry:

  • Point
  • Line
  • Arc
  • Nurbs Curve
  • Ellipse
  • Circle
  • Data (strings, floats…
Added by konrad k sobon at 12:35pm on December 30, 2014
Blog Post: Evolutionary Principles applied to Problem Solving
This blog post is a rough approximation of the lecture I gave at the AAG10 conference in Vienna on September 21st 2010. Naturally it will be quite a different experience as the medium is quite…
Added by David Rutten at 3:27pm on September 24, 2010
Comment on: Topic 'Registering input parameters and passing the to SolveInstance'
ager As Grasshopper.Kernel.GH_Component.GH_InputParamManager)         pManager.AddTextParameter( "Name", "N", "String", GH_ParamAccess.item) pManager.AddPointParameter( "Point", "P", "Point3d", GH_ParamAccess.item)         pManager.AddGenericParameter( "Local Axis", "LA", "Null/Surface/Plane", GH_ParamAccess.item)         pManager.AddGenericParameter( "Support", "S", "I_Model_Support", GH_ParamAccess.item)         pManager.AddGenericParameter( "PointLoad", "PL", "List (of I_Model_PointLoad)", GH_ParamAccess.list)         pManager.AddGenericParameter( "Group", "G", "List (of (I_Model_Group)", GH_ParamAccess.list)     End Sub     Protected Overrides Sub RegisterOutputParams(ByVal pManager As Grasshopper.Kernel.GH_Component.GH_OutputParamManager)         pManager.AddGenericParameter( "Node", "N", "I_Model_Node",GH_ParamAccess.item)     End Sub     Protected Overrides Sub SolveInstance(ByVal DA As Grasshopper.Kernel.IGH_DataAccess)         Dim inName As String = Nothing         Dim inP As Point3d = Nothing         Dim inLA As Plane = Nothing         Dim inS As I_Model.I_Model_NodeSupport = Nothing         Dim inPL As New List(Of I_Model.I_Model_PointLoad)         Dim inG As New List(Of I_Model.I_Model_Group)         Dim outNode As I_Model.I_Model_Node         If Not DA.GetData(0, inName) Then Return         If Not DA.GetData(1, inP) Then Return         If Not DA.GetData(2, inLA) Then Return         If Not DA.GetData(3, inS) Then Return         If Not DA.GetData(4, inPL) Then Return         If Not DA.GetData(5, inG) Then Return         Dim IM_P As I_Model_Node         IM_P = New I_Model_Node(inP, Nothing, inName)         If Not DA.GetData(2, inLA) Then IM_P.SetLocalAxis(inLA)         If Not DA.GetData(3, inS) Then IM_P.SetSupport(inS)         If Not DA.GetData(4, inPL) Then             Dim PL As I_Model_PointLoad             For Each PL In inPL                 IM_P.AddPointLoad(PL)             Next         End If         If Not DA.GetData(5, inG) Then             Dim G As I_Model_Group             For Each G In inG                 IM_P.AddToGroup(G)             Next         End If         outNode = IM_P         DA.SetData(0, outNode)     End Sub …
Added by Daniel Bosia at 9:22am on January 11, 2013
Comment on: Topic 'Error when migrating to rhinoCommon'
B, out List<int> VVertexC, out List<int> SSupportVertex, out int FFaceCount, out int VVertexCount, out int EEdgeCount)         {               VVertex = new List<Point3d>(); VVertexA = new List<int>();             VVertexB = new List<int>();             VVertexC = new List<int>();             SSupportVertex = new List<int>();             FFaceCount = 0;             VVertexCount = 0;             EEdgeCount = 0;             //IOnMeshTopology mesh_top = null;             //IArrayOnMeshTopologyEdge edges = null;             //IArrayOnMeshTopologyFace Faces = null;             //IArrayOnMeshTopologyVertex vertices = null;             //Mesh.ConvertQuadsToTriangles();             Mesh mesh_top = null;             Rhino.Geometry.Collections. MeshTopologyEdgeList edges = null;             Rhino.Geometry.Collections. MeshFaceList Faces = null;             Rhino.Geometry.Collections. MeshTopologyVertexList vertices = null;             Rhino.Geometry.Collections. MeshFaceList meshFaseList;             meshFaseList = Mesh.Faces;             meshFaseList.ConvertQuadsToTriangles();                         ////////////////////////////////Mesh Operations             Point3f fpoint = new Point3f();             //mesh_top = Mesh.Topology();             //Faces = mesh_top.m_topf;             //vertices = mesh_top.m_topv;             //edges = mesh_top.m_tope;             mesh_top = Mesh;             Faces = mesh_top.Faces;             vertices = mesh_top.TopologyVertices;             edges = mesh_top.TopologyEdges;             for (int i = 0; i < vertices.Count(); i++)             { fpoint = mesh_top.TopVertexPoint(i);                 Point3d fto3d = new Point3d(fpoint.X, fpoint.Y, fpoint.Z);                 VVertex.Add(fto3d);             }             for (int i = 0; i < Faces.Count(); i++)             {                 Int32[] vertexArray = new Int32[3];                 mesh_top.GetTopFaceVertices(i, vertexArray);                 VVertexA.Add(VVertexCount + vertexArray[0]);                 VVertexB.Add(VVertexCount + vertexArray[1]);                 VVertexC.Add(VVertexCount + vertexArray[2]);             }             for (int i = 0; i < edges.Count; i++)             {                 //IOnMeshTopologyEdge mesh_edge = edges[i];                 Rhino.Geometry.Collections. MeshTopologyEdgeList mesh_edge = edges[i];                 if (mesh_edge.m_topf_count == 1)                 {                     int p1 = mesh_edge.get_m_topvi(1);                     SSupportVertex.Add(EEdgeCount + p1);                 }             }             FFaceCount = Faces.Count();             VVertexCount = vertices.Count();             EEdgeCount = edges.Count;         }…
Added by Jesper Thøger Christensen at 8:21am on May 15, 2013
  • 1
  • ...
  • 905
  • 906
  • 907
  • 908
  • 909
  • 910
  • 911
  • 912
  • 913
  • 914

About

Scott Davidson created this Ning Network.

Welcome to
Grasshopper

Sign In

Translate

Search

Photos

  • Wind Pavilion

    Wind Pavilion

    by Parametric House 0 Comments 0 Likes

  • Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    by June Lee 0 Comments 0 Likes

  • Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    by June Lee 1 Comment 0 Likes

  • Space Frame

    Space Frame

    by Parametric House 0 Comments 0 Likes

  • Voronoi Mesh

    Voronoi Mesh

    by Parametric House 0 Comments 0 Likes

  • Add Photos
  • View All
  • Facebook

Videos

  • Wind Pavilion

    Wind Pavilion

    Added by Parametric House 0 Comments 0 Likes

  • Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    Mobius Cutout Pavilion Rhino Grasshopper Tutorial

    Added by June Lee 0 Comments 0 Likes

  • Space Frame

    Space Frame

    Added by Parametric House 0 Comments 0 Likes

  • Voronoi Mesh

    Voronoi Mesh

    Added by Parametric House 0 Comments 0 Likes

  • Inflated Mesh

    Inflated Mesh

    Added by Parametric House 0 Comments 0 Likes

  • Tensile Structure

    Tensile Structure

    Added by Parametric House 0 Comments 0 Likes

  • Add Videos
  • View All
  • Facebook

© 2025   Created by Scott Davidson.   Powered by Website builder | Create website | Ning.com

Badges  |  Report an Issue  |  Terms of Service