What to do next in ArqiShap3D?

Hi everyone!

I’ve recently uploaded the newer version of ArqiShap3D after a long while. I’ve added some roof modelling components which I’m extremely proud of. I was able to develop a roof modelling algorithm which is really fast because it works with plane intersections instead of sweeping or brep splitting. And I want to keep on working on developing ArqiShap3D even further.

I opened this thread to ask for feedback from the community. What do you think about the current state of ArqiShap3D? What do you think I should be working on next? Do you think there are some unnecessary tools? Have you encountered any major or minor bugs? Would you like some tutorials on how to use some of the components? What do you think about how some of the components are designed to be used? What would you think about bringing some of ArqiShap3D’s functionality directly into Rhino? etc…

Any feedback is appreciated. Thanks in advance!

1 Like

Hi, I think your post unfortunately fell between the cracks.
In the past, I was trying to make some tools for the roofs, but later I discovered other people’s attempts and I realized that it’s not an easy task at all. Your solution to the roofs is the best I have seen so far. It’s awesome that I can specify roof angles one by one.
I needed such a roof tool and I will use it for my project. I haven’t learned the full functionality of your plugin yet, but I also like your stair tool.

  1. I wonder if your roof tool could be further developed. From what I saw, sometimes for some angle numbers roof can’t be constructed. I can be like: 28 degrees – ok, 29 – wrong, 30 – ok again.

It seems to me that many fails happen when too many roof faces meet at one vertex - often very simple, “perfect” shapes fail.
It would be great if you could eliminate these bugs to make it fully robust.

Example of that behavior:
arqi roof 1.gh (6.0 KB)

A couple that also fails:
arqi fail.gh (3.8 KB)

arqi fail2.gh (3.8 KB)

  1. I can use some external components to investigate roof brep topology but if you are looking for ideas maybe you can implement them in your plugin? Similarly as you can deconstruct stairs one could deconstruct a roof to get flat roof ridges, angled roof ridges, and other data that would help further stylize the roof, like making a “dutch gable” roof.

  2. The more challenging task probably would be the ability, to create non-planar roofs. For example, based on arcs where one direction of the surface is higher than the 1st degree.

Going further with that, boolean toggle to force horizontal roof ridges using non-parallel curve input edges?

Non-planar roof faces higlighted

  1. Using a curve as a roof footprint and option to construct a roof from top to bottom? While keeping the roof faces planar and at the same time forcing roof ridges to be non-angled (flat horizontally) -constructing the roof in a way that bottom edges will be non-flat.

roof faces.3dm (483.8 KB)

Normal way of constructing roof - note the slanted one roof ridge and flat base of the roof.

  1. Because Model Roof components works in a ways that making inner courtyards is not possible, with just one step. This is however possible to workaround by splitting “O” shaped boundary into two “C” and combine results at the end.

I also noticed some errors during opening Grasshopper related to your plugin. I don’t know if it interferes with how it works.

1 Like

Hi Jakub,

Thanks for the detailed feedback. I’m glad to know that someone actually liked it and uses it. I’m also quite thankful of how the roofing tool ended up being and I can also say that it wasn’t an easy task. Initially, I thought it would take around a couple of weeks, but as I encountered more and more problems and special cases, I had to change the algorithm entirely and it ended up taking around 3 months.

About your suggestions:

  1. Thanks for bringing these bugs to my attention. During the testing process, I can only try out a small portion of many possible roof forms, and as I encounter bugs, I try to solve them as much as I can. I will look into these in more detail when I will have time.
    (And contrary to what one might think, one of the hardest things to solve was the intersections that occur with these perfect shapes…)

  2. Deconstructing the roof elements is a great idea, and it shouldn’t be complicated at all. I will certanly add this to the list.

  3. Because the roofing tool currently works based on plane-plane, plane-line and line-line intersections (this is why it’s so fast), it would be very difficult to adjust the algorithm to also take into account non-planar roof forms. It should be possible but I’m affraid it can be a coding challenge as big as the roofing component itself.
    Forcing horizontal roof ridges could be possible, but I think one problem that can arise from this would be the fact that; sometimes when a roof ridge will be forced to become horizontal, it could break the horizontality of some of the already horizontal adjacent roof ridges (especially if that non-horizontal roof ridge segment is not at the ends of the entire roof ridge) and some of the roof faces might need to be broken up to pieces or have their slopes changed for the connected roof ridge to be horizontal.

  4. For constructing the roof from top to bottom, I think we would still need to know the heights of the roof ridges; and we could know this either by solving the component for once and then adjusting the the roof ridges to be horizontal (then this would be the same as forcing the roof ridges to be horizontal like in your previous suggestion), or by a detailed user input of the ridge curves, with their correct elevations with respect to the roof edge curves (in this option, the roof angles and edge curve corner heights might need to be changed by the algorithm for the roof ridges to meet with the roof edge curves, and the fact that user will enter the ridge curves, the ridge curves could get crazy shapes which we would need to do a lot of checks to see if we can actually solve it in the beginning).
    (I couldn’t open the rhino file because it was created in rhino 8, but I tried to understand what you described from the screenshots you’ve attached.)

  5. Inner courtyards should also be possible but again, I would need to change how some parts of the algorithm works substantially without breaking any part of the code.

About the bug:
I will take a look at it and hopefully fix it in the next version.

About what I’m working on now:
I started rewriting some of the components I’ve developed earlier and currently I’m working on a wall component which is more simplified and more restrictive than the current version in ArqiShap3d but solves the intersections better and works much faster (100s of times faster for some cases!). After this I’m planning on working on producing the wall opennings in a much faster way and then solve some problems in the staircase component (It doesn’t work perfectly on a lot of cases) and possibly add landings to the staircase component. Because I will be starting a new project with a client this week, I don’t know how much time I will have to work on ArqiShap3d and hopefully continue developing it at least slowly and steadily.

In the meantime, I would also appreciate any comments on how some of the other components and systems work in ArqiShap3d. After developing them, I starting doubting their necessity but I wonder if they are useful to anyone (I mean all the other tools except the architecture tools) and if I should remove some of them.

Have you seen this topic?

I haven’t seen it before but thanks for the notice.

I didn’t take a detailed look at it but I think if he used an algorithm which is based on sweeping an angled curve along the boundary roof curves and intersecting the resulting breps, this might make it difficult to solve for roof faces with different angles while making it super easy to solve for roofs with non-linear boundary edges and roofs with holes.

You can always turn any non-linear curve to polylines and plug it into ArqiShap3d’s roof component, and it (hopefully) should mostly work without any problems but I would have to implement a different solution for roofs with holes (or “O” shaped roofs).

You stated that you solve your roofs in 2D. This reminded me of the methods of roof-solving I’ve learned in school.

Are they similar to the methods of descriptive geometry?

Descriptive geometry method of solving the roof

Solving the roof with a neighbor (the direction of the roof should take away the rain from the neighbor’s wall


I like what you did with Stairs, that you create 2D stairs and convert them by other components into 3D. I wonder if it would be possible to output 2D roofs - deconstruct them, maybe rebuild some of the curves construct back to 2D Roof object, and finally translate it into 3D. Given that the topology and height data would not be corrupted during these manipulations, maybe it would allow the user to rebuild some polylines into e.g. arcs and thus receive nice surfaces of the 3D roof.

1 Like

Check out straight-skeleton algorithm :slight_smile: Straight skeleton - Wikipedia

Hi,
I know about straight skeleton, but only seen implementations that can produce roofs with equally angled slopes. But you pushed me a bit to search slightly different
I’ve found this article about the method for roofs with various slopes, but unfortunately, I can’t do anything with it :smiling_face_with_tear:

https://www.sciencedirect.com/science/article/pii/S0010448517301240

I will post it in the Old Town Roofs and leave this topic to the discussion about AriqShap3D.

1 Like

Although the algorithm I used is quite similar to the one you’ve shown in this image, everything actually happens in 3D.

(I’m sharing part of the image you shared, which I will refer to later on:)

Step by step, the process looks like this:

  1. The planes are tilted according to the roof segment angles,
  2. Adjacent planes are intersected to get the intersection lines (similar to lines that are label as 1-2, 2-3, 3-4,… in the diagram you’ve sent)
  3. All adjacent intersection lines are intersected to get the intersection points,
  4. All intersection points are sorted according to heights (and one or two more parameters in case the heights are the same)
  5. The lowest intersection point is used to finalize the intersection lines that it’s associated with,
  6. New intersection line is produced between the two roof surface planes which are at the either side of the roof face/faces which is in the middle (similar to finalizing point A and point H, and producing new lines between the surfaces of 2-6, 4-6 which are at the either sides of surfaces 1 and 5)
  7. The new intersection line is intersected with the adjacent intersection lines,
  8. These new intersection points are also added to the intersection points list,
  9. And the intersection points list is sorted again and the process is repeated until there are no finalized intersection lines or intersection points or roof faces left.

Although the general outline of the algorithm is pretty straightforward, there are a lot of edge cases that needs to be solved which makes the algorithm get much more complicated.

And each step of the loop looks something like this:

roof loop steps

I also skimmed the wikipedia page and the article you’ve sent about the “straight skeleton” method. I’m somewhat familiar with research papers but because these topics in similar articles are analyzed with a lot of mathematical (?) terminology, I usually find them difficult to understand.

But aside from this, I remember trying a similar algorithm to the straight skeleton method (not knowing that was the name), but in that trial, I had to: offset each roof segment’s outer edge with a finite amount related with that segment’s slope (which makes sure that it can solve for multi angled faces) and after each offset step, I had to check if the offsetted curves are intersecting with each other, and if so, do more steps to solve these intersections. But the difficult part with this algorithm was getting the right offset amount (the shrinkage speed of the boundary curves). If I was to use a very small amount, that would result in too many offset and intersection checking operations and If I used a number that’s too large, then there would be a chance that more than one intersections could occure after each offset step, and if these multiple intersections would interfere with each other, it would complicate the matters even further.

I think the method I’m using right now might be better (if I’ve understood that part of the article correctly) because it doesn’t rely on finite icrements and doesn’t try to solve the roof firstly on 2D and then on 3D.

Hi guys, (@Czaja, @martinsiegrist, @w.radaczynski )

I recently uploaded two new versions of ArqiShap3D, if you haven’t got a chance to check it out yet.

In v0.4.0, I developed a new algorithm for modelling walls, which is a bit more restrictive but much more faster. It doesn’t allow for custom wall section geometries and only works with layer thicknesses and wall height data (like any BIM software) but it can solve wall intersections almost 200 times faster than the older version.

In v0.4.1, I got a chance to look into the roof modelling algorithm for a few weeks and I think I solved the problems with the symmetrical or regular formed roofs.

If you happen to get a chance to check the newer versions out, I would appreciate the feedback.

1 Like

Thank you, I will try to test the roofs thoroughly.
I had a few saved grasshopper definitions that failed in the previous version, so far they are looking good and it’s a good sign.
When it comes to the Wall functionality, I need to study your plugin a bit more to understand it. Give me some time and I might write something about it too.

No worries. I probably won’t be able to look into the components again for some time anyways.