I felt like writing down some fundamental concept of BIM for readers who may not be too familiar with it.

Building Information Modelling or Building Information Management (BIM) is a model-based process of creating and managing building information. It applies from planning stage to design, construction and operational stages of building projects. At the core of the BIM lies the 3D model of the building which is a virtual representation of completed project. This 3D model is the minimum requirement of ‘I’ in BIM. But one of common misconception of BIM, even among some architects and building professionals, is that BIM equals 3D model. A Building Information Model is a multi-dimensional structure of information that is built based on geometric models that represent building elements. A cylinder in a 3D model is merely a geometry visualized. Meanwhile a cylindrical geometry in BIM may have any project related information such as category of building elements, structural properties, cost, schedule of construction, etc. Seeing BIM as a 3D model is just like seeing a cylinder as a circle by looking at it in from one side only. BIM spans beyond 3-dimensional space.

Traditional building design process is carried out on a number of different platforms. Drawings are created with 2D drafting software such as AutoCAD, schedules are created in spreadsheet, visualization is done in other 3D tools and etc. 2D drawings are created individually per sheet, per floor plan, per sections and per discipline. This unlinked project information is naturally prone to human mistakes which lead to misalignment and clashes between different scope of building works.

BIM is a centralized and collaborative process. Every stakeholder is working around the model which becomes the single source of information, and that facilitates communication and collaboration between different stake holders which leads to increased efficiency and productivity in overall project scope.

Because BIM is centralized and collaborative process where all information is retrieved from, and updated back to a single source, it gives every stakeholder benefits of live information. Live information facilitates higher degree of coordination before the construction works commence. Digitized, structured and linked information enables the project team to respond to any project needs for reproduction of information more promptly whether it is a cost estimation, simulation, or even the change of design itself which affects everything else. All these leads to successful project delivery where project team has more control over the project.

Some of benefits from BIM implementation include the following:

]]>

Function getTwirlCrvs(isrf As surface, no_u As Integer, no_v As Integer, offset As Double) Dim returnpls As New list (Of polyline) Dim returncrvs As New list (Of curve) Dim ubtm As Double = isrf.Domain(0).Min Dim ulimit As Double = isrf.Domain(0).max Dim vbtm As Double = isrf.domain(1).min Dim vlimit As Double = isrf.domain(1).max For i As Integer = 0 To no_u Print("curve #" & i) Dim temppts As New list (Of point3d) For j As Integer = 0 To no_v Dim tempu As Double = i + (ulimit * offset * j) Dim tempv As Double = j Dim currentv As Double = vbtm + ((vlimit - vbtm) / no_v * tempv) Dim currentu As Double = ubtm + ((ulimit - ubtm)) / no_u * tempu currentu = doublediv(currentu, ulimit) If currentu < 0 Then currentu = ulimit + currentu End If Dim pt As point3d pt = isrf.PointAt(currentu, currentv) temppts.add(pt) Next Dim temppl As New polyline(temppts) Dim tempcrv As curve tempcrv = curve.CreateControlPointCurve(temppts, 3) returnpls.add(temppl) returncrvs.add(tempcrv) Next Return returncrvs End Function]]>

I recently made a quick script commonly used in 3D printed jewerly design for fun.

The function below will take a surface and parameters to get iso curves out of it.

To get the result you want, the input surface will have to be carefully modeled with consideration of direction of U and V on the surface.

As you can see in the script below, output curves will not exactly follow input surfaces as those are only approximated by creating curves from points on the surface.

Function getTwirlCrvs(isrf As surface, no_u As Integer, no_v As Integer, offset As Double) Dim returnpls As New list (Of polyline) Dim returncrvs As New list (Of curve) Dim ubtm As Double = isrf.Domain(0).Min Dim ulimit As Double = isrf.Domain(0).max Dim vbtm As Double = isrf.domain(1).min Dim vlimit As Double = isrf.domain(1).max For i As Integer = 0 To no_u Print("curve #" & i) Dim temppts As New list (Of point3d) For j As Integer = 0 To no_v Dim tempu As Double = i + (ulimit * offset * j) Dim tempv As Double = j Dim currentv As Double = vbtm + ((vlimit - vbtm) / no_v * tempv) Dim currentu As Double = ubtm + ((ulimit - ubtm)) / no_u * tempu currentu = doublediv(currentu, ulimit) If currentu < 0 Then currentu = ulimit + currentu End If Dim pt As point3d pt = isrf.PointAt(currentu, currentv) temppts.add(pt) Next Dim temppl As New polyline(temppts) Dim tempcrv As curve tempcrv = curve.CreateControlPointCurve(temppts, 3) returnpls.add(temppl) returncrvs.add(tempcrv) Next Return returncrvs End Function]]>

Dim shit As New Mesh Dim gridptsflat As New list (Of point3d) Dim gridpts2D As New list (Of list (Of point3d)) Dim intervalx As Double = x / numx Dim intervaly As Double = y / numy Print(intervalx) Print(intervaly) 'Grid For i As Integer = 0 To numx Dim gridpts1D As New list (Of point3d) For j As Integer = 0 To numy Dim temppt As New point3d(intervalx * i, intervaly * j, 0) Print(temppt.ToString) Dim z1,z2,z3 As Double 'set Z z1 = getSine(para1.item(0), para1.item(1), cp1.DistanceTo(temppt), para1.item(2)) z2 = getSine(para2.item(0), para2.item(1), cp2.DistanceTo(temppt), para2.item(2)) z3 = getSine(para3.item(0), para3.item(1), cp3.DistanceTo(temppt), para3.item(2)) 'fade out Dim fo1 As Double = 1 - (cp1.DistanceTo(temppt) / para1.item(3)) If fo1 < 0 Then fo1 = 0 z1 = z1 * fo1 Dim fo2 As Double = 1 - (cp2.DistanceTo(temppt) / para2.item(3)) If fo2 < 0 Then fo2 = 0 z2 = z2 * fo2 Dim fo3 As Double = 1 - (cp3.DistanceTo(temppt) / para3.item(3)) If fo3 < 0 Then fo3 = 0 z3 = z3 * fo3 'set amp Z temppt.Z = z1 + z2 + z3 'save pts shit.vertices.add(temppt) gridptsflat.add(temppt) gridpts1D.add(temppt) Next gridpts2D.add(gridpts1D) Next 'Make Cloth Dim remainder As Integer For i As Integer = 0 To gridptsflat.count - numy - 3 math.divrem(i + 1, numy + 1, remainder) If i <> 0 And remainder = 0 Then 'Print("oh, shit") Else shit.Faces.AddFace(i, i + 1, i + numy + 2, i + numy + 1) 'Print(i & "," & i + 1 & "," & i + y + 2 & "," & i + y + 1) End If Next Function getSine(wavelength As Double, amplitude As Double, inputx As Double, shifty As Double) Dim result As Double result = math.Sin(inputx / (wavelength / (2 * math.PI)) - shifty) * amplitude Return result End Function]]>

This mesh model can be easily modeled with 3DS wave modifier.

Here’s a sample code to achieve the same result with Rhino SDK.

The sample is taking three points of origin of sine waves.

Dim shit As New Mesh Dim gridptsflat As New list (Of point3d) Dim gridpts2D As New list (Of list (Of point3d)) Dim intervalx As Double = x / numx Dim intervaly As Double = y / numy Print(intervalx) Print(intervaly) 'Grid For i As Integer = 0 To numx Dim gridpts1D As New list (Of point3d) For j As Integer = 0 To numy Dim temppt As New point3d(intervalx * i, intervaly * j, 0) Print(temppt.ToString) Dim z1,z2,z3 As Double 'set Z z1 = getSine(para1.item(0), para1.item(1), cp1.DistanceTo(temppt), para1.item(2)) z2 = getSine(para2.item(0), para2.item(1), cp2.DistanceTo(temppt), para2.item(2)) z3 = getSine(para3.item(0), para3.item(1), cp3.DistanceTo(temppt), para3.item(2)) 'fade out Dim fo1 As Double = 1 - (cp1.DistanceTo(temppt) / para1.item(3)) If fo1 < 0 Then fo1 = 0 z1 = z1 * fo1 Dim fo2 As Double = 1 - (cp2.DistanceTo(temppt) / para2.item(3)) If fo2 < 0 Then fo2 = 0 z2 = z2 * fo2 Dim fo3 As Double = 1 - (cp3.DistanceTo(temppt) / para3.item(3)) If fo3 < 0 Then fo3 = 0 z3 = z3 * fo3 'set amp Z temppt.Z = z1 + z2 + z3 'save pts shit.vertices.add(temppt) gridptsflat.add(temppt) gridpts1D.add(temppt) Next gridpts2D.add(gridpts1D) Next 'Make Cloth Dim remainder As Integer For i As Integer = 0 To gridptsflat.count - numy - 3 math.divrem(i + 1, numy + 1, remainder) If i <> 0 And remainder = 0 Then 'Print("oh, shit") Else shit.Faces.AddFace(i, i + 1, i + numy + 2, i + numy + 1) 'Print(i & "," & i + 1 & "," & i + y + 2 & "," & i + y + 1) End If Next Function getSine(wavelength As Double, amplitude As Double, inputx As Double, shifty As Double) Dim result As Double result = math.Sin(inputx / (wavelength / (2 * math.PI)) - shifty) * amplitude Return result End Function]]>

Apollonius circle in Cartesian coordinate system

Apollonius circle on spherical coordinate system

]]>

Tangent circles in Cartesian coordinate system

Tangent circles on spherical coordinate system

]]>

Original plank before folding

]]>

In the age of digital design, designers are destined to face the process of rationalizing the form after a lengthy foreplay of form making in order to fabricate it into an actual product. Ironically, some designers/architects these days fully exploit the capability of freeform design to irrational extreme and put another effort and cost in rationalizing the form therewith. Many of these rationalization processes deal with panelizing the freeform surface such as approximating designed surfaces to developable surfaces, or even more brutally, irregular triangulation.

A4 Chair is designed with the reversed concept – origami approach. A single strip of surface is folded into shape a chair in consideration of utilizing bendable materials like bentwood or plexiglass. This does not only ensure developability of the final form (into a single piece of surface material!) but also renders fluidity of final form.

Sketch a chair

Final Sketch – A whole sheet of A4 paper is folded into a chair

Digitized Sketch

A grasshopper sketch is created to digitize the hand sketch. This gh sketch makes it possible to visualize folded form real time and ensure that the model (folded and unfolded) is actually within desired constraint.

With this custom vb.net component, form making process boils down to adjusting end points of fold lines along 1 dimensional axis and corresponding folding angles.

Grasshopper Sketch for fold sketching

Final Form

Original plank before folding

The Hive WIP #2

All the stiffness of modeling environment and constraints in BIM modeling process sometimes give you frustration and less freedom in modeling but in the end it actually results more accurate, parametric (and therefore flexible) model. So the issue should be when to implement BIM after concept design stage.

]]>

1:200, styrene and plexiglass

Model built by András Jakó & Lajos Schläffer www.limesmodel.hu

Click below images to enlarge.

]]>