Estimating the total number of robotic cleaning devices required for a given solar array layout in ACAD/C3D

Hi all, I’m trying to automate a task which currently goes as follows:

  1. Drawing is a large solar array layout in ACAD (several block references of 4-5 main types of blocks)
  2. Several fully automated cleaning robots will be installed covering entire layout such that a bot goes from one end of a column until the other (north to south in this case)
  3. If a gap is encountered in the middle (for inverters, roads, etc), then the path of that particular robot will terminate at the gap and another robot will be installed for the next run and so on until the end
  4. Two types of robots are available - one for less than 200m runs and one for greater than that.

The goal is to estimate the total number of both types of robots required.

I’m attempting to put together a dynamo script in C3D and have done the first step of getting the geometry associated to all block references. From here, I wanted to seek your guidance on how to approach this. My current line of thought is to check for every column’s x coordinate - the corresponding y min, y max & y for intermediate gap points. Then draw lines, count them and group by length.

Does this make sense? Is there a better way to achieve this?

This seems possible but I suggest breaking your task down and asking discrete questions along the way to get good answers. It may be difficult to get a good response to a task like this.


It’s almost a certainty that you could have done this very easily at the time of creation, as the necessary guidelines would be in place then.

Assuming all the grids are equally aligned on the same axis, but could have different starting points for the run (if not you likely failed at optimization and you might be missing a few panels), you can take the origin and rotation of any one panel, and then array some lines on that axis with the known offset; Based on what I can see in the layouts above, this would give you the primary axis of each row of panels.

Next take the rectangle for each panel, and offset the shape by the spacing you have between any two panels; the shapes should overlap once you’re done. Use the offset curves to generate a surface by patch, and union the surfaces into a single polysurface.

This polysurface can then be intersected with each of the lines, and you will have a resulting set of lines which will be the length of each run.

You may need to create subsets for each “block” in the neighborhood to reduce computational overhead, and to reduce issues which may occur as blocks shift origins to optimize fit.


Thanks for the heads up, Shaun! Will be mindful of this and break it down to simpler tasks one at a time.