Background Intro
Hi all. I’ve been reading topics here on and off for the last 15 months since I started using Rhino (aside from a few weeks of playing with v1.1 25 years ago). In that time I’ve used Rhino to design and build an 8’ x 20’ laser cutter, including modelling parts for 3D printing, and to draw and build a frame to support a winter snow cover for a 26’ boat. I’ve also used OpenNest in Grasshopper to nest frame components on 4’ x 8’ sheets of plywood.
For the last number of months, on and off, I’ve been trying to use Grasshopper to create a template for a panelized fabric cover to cover the combined boat and cover support frame. I’ve made some progress in identifying boundaries and contour lines, but could use some help in making progress in panelizing the surface into developable surfaces that can be cut from 60" (1524mm) rolls of fabric.
I’m trained as a software engineer, with 37 years of programming experience, but mainly with scripting languages (primarily Perl… was once a major contributor to Apache SpamAssassin) and PLC ladder logic, so am not afraid of implementing things in custom components if required.
Goal
Take a mesh of a boat (generated from a 3D scan of a boat) and support frame polysurface objects drawn in Rhino (located on/above the boat mesh) and generate developable panels that enclose the combined boat mesh and support frame polysurface objects to create a winter cover for a boat.
Further Goal Details
- Allow for some amount of fabric stretch (or overall cover looseness) when determining combined object boundaries to allow for/ignore small protrusions.
- Protrusions should be identified so that they can be reinforced.
- Cover should be mostly “tight” around the combined boat and frame objects.
- Cover only needs to go “down to” the chine of the boat (the edge that transitions from the vertical sides to the bottom of the boat). This edge could be identified manually if needed.
- Cover should cover/enclose the swim platform on the rear of the boat.
- Panels can only be about 57" (1448mm) wide plus 3" (75mm) for seem allowances. Narrower panels can be used where needed. As can darts, etc.
- Panel length can be unlimited, but ideally 17’ (5200mm) or less. A seem along the frame ridge beam would be OK.
- Identify where panels make large angle changes around the covered (“wrapped”) objects so that reinforcement can be added to the panel.
- Possibly align vertical panel edges with vertical members of the support frame. Otherwise (and additionally) identify where the panels fall on the vertical members of the support frame so that the panels can be reinforced.
Pictures for Reference
Note: Some of the ground support stands have been trimmed out of the model in subsequent screen shots and the internalized Grasshopper file data.
My Progress So Far
- Blue curves are fit to some contour 3D-points imported with the boat mesh scan (mainly used to make up for gaps in the 3D scan of the railing towards the front).
- Red “horizontal” curves (“A-Frame connecting lines”) are identified with some Python3 custom components.
- Red “vertical” contours wrapping boat mesh and frame are convex hulls (that have been further processed to simplify them).
- Generated convex hulls of boat mesh and frame on three planes and then generated convex hulls that encompass those convex hulls.
- Intersection points of the convex hulls to identify potential panel edges.
Grasshopper
This is what my Grasshopper document currently looks like:
Grasshopper file with inputs internalized: Convex Hull Slices - v2 - Internalized.gh (saved to OneDrive; too big for forum upload) Note: It takes about 43 minutes to run on my computer (11th Gen Core i7-1185G7 with RTX A500 GPU).
I’m Stuck
I’m sort of stuck here. My thought process was to identify the 3D boundaries of the boat mesh and cover frame objects (which I’ve done… sort of a 3D “tight extents” of the object… perhaps more of a “stretch wrap” than a “shrink wrap”) and then try to panelize it… automagically. I’d like to be able to produce cover templates for other boat meshes and cover frames, so looking for a way to do it without a lot of manual steps.
I don’t expect anyone to completely solve the problem for me (but if someone can, perhaps I could compensate them for their time), but could certainly use and would much appreciate some advice and pointers. I’m very open to someone telling me that my approach is totally wrong.
Absent a better (more correct, faster) way to go about it, my next step would probably be to throw a genetic algorithm at it to try to panelize along the convex hull slice intersections.
Thanks for reading all this way.