Over the past six years at Parametric Monkey, we’ve generated numerous ways to run solar access analysis for SEPP65 compliance. We’ve experimented with various workflows to find the simplest and most accurate method available. This tutorial will present what we believe is the best method to date – using Rhino.Inside Revit to provide accurate and fast results directly in Revit.
Background
When governments started mandating solar access analyses, such as those prescribed by NSW ‘State Environmental Planning Policy 65 – Design Quality of Residential Flat Development’ (SEPP 65), architects turned to the ‘views from sun‘ method. Setting up an axonometric view parallel to the sun vector made it possible to see which parts of the building were receiving sun. However, the limitation of this method is that it couldn’t tell you how many apartments were compliant. Architects had to jump between various views and guestimate if the areas received the minimum amount of sun. Moreover, the camera views were often aligned by sight and weren’t very accurate.
Seeing these challenges, we turned to Grasshopper and Ladybug as a means to improve efficiency and accuracy. Our first version focused on the conceptual massing stage. The script ran in Grasshopper, which meant that the model needed to be created in Rhino or imported into Rhino.
Following on from this, we created a detailed solar access analysis to run on individual rooms – much more in line with the actual legislative requirements. Revit geometry was extracted, the solar access analysis run in Grasshopper, and the results pushed back into Revit. While this method enabled yes/no compliance to be visualised and scheduled in Revit, it couldn’t provide the ‘heatmap’ visualisation within Revit.
Why not use Autodesk Insight or Dynamo?
Next, we explored the various options available to users wanting to stay within the Autodesk ecosystem. However, Autodesk’s Insight lighting analysis didn’t comply with SEPP65 requirements. Moreover, the Autodesk Visualisation Framework (AVF) used to visualise the results were transient, meaning results aren’t stored in the model – a tactic by Autodesk presumably to increase cloud credit churn. And finally, running the analysis directly within Dynamo was far too slow for large models.
Rhino.Inside Revit
With the release of Rhino.Inside Revit, a whole bunch of new possibilities have now emerged. While it is still necessary to have Rhino installed, we can now run Grasshopper directly in Revit and create native Revit elements. This change means that we can now combine the computational power of Grasshopper with the BIM capabilities of Revit.
We can now combine the computational power of Grasshopper with the BIM capabilities of Revit.
Ladybug Tools
In addition to switching to Rhino.Inside Revit, we’ve also revised the main computational logic by upgrading Ladybug, the go-to solution for environmental analyses. Back in November 2020, the Ladybug team released ‘Ladybug Tools’. This plug-in superseded the previous version, which has since been renamed to ‘Ladybug Legacy‘. The two versions are fundamentally different and generally not compatible. However, the two can be installed alongside one another without issues if you still have old scripts using the legacy plug-in.
As well as being more straightforward and faster, Ladybug Tools differs from the Legacy version in many ways. After much back-and-forth debating the best method, the ‘LB Sun Path’ component now returns vectors for the entire analysis period, making the solar access workflow far simpler. The legacy component, on the other hand, took the liberty of removing the last vector. As such, an analysis period of 9am to 3pm with 15min intervals would return 2:45pm as the last vector. To overcome this issue, an extra time step (15mins) needed to be added to the analysis period. This, in turn, complicated the heatmap visualisation and compliance calculations. However, this is all now much easier in the latest version of Ladybug.
Workflow
Taken as a whole, the revised workflow is far more comprehensive. Heatmaps can now be visualised within Revit, grid convergence is now included for accurate sun vectors, and best of all, results can be exported to the City of Sydney supplied compliance spreadsheet. Due to the nature of working with Revit, the workflow is a little involved but far faster and accurate than other methods.
Step 1 – Installation
Ensure you have Rhino 7 and Rhino.Inside Revit v1 installed. Refer here for detailed instructions.
To install Ladybug Tools, download it from the Food4Rhino website. The latest version is 1.3.0. It is important to use this version as there is a major bug in version 1.1.0. Next, follow the installation instructions here. This is a bit of an involved process, but alternatively, you can purchase a single-click install file.
Once installed, you should be able to see the ‘Ladybug’ tab in Grasshopper. However, when using Ladybug Tools with Rhino.Inside Revit, many users have reported Ladybug not being able to find the Ladybug Python libraries. To resolve this issue, simply run the Ladybug installer directly with Rhino.Inside Revit. To do this, go Rhino.Inside > Grasshopper > Grasshopper and then follow the Ladybug Tools installation instructions.
Next, we need to install TT Toolbox by CORE studio. This plug-in enables us to export data to a preformatted Excel spreadsheet. The other plug-in we need to install is EleFront by FRONT Inc. This plug-in enables us to filter geometry by type (brep, mesh, etc.). Once downloaded, right-click and unblock, then place them in the Components folder. To find this folder location, go File > Special Folders > Components Folder.
Step 2 – Set location
Before running the script, ensure that the Project Location has been set in Revit. Go Manage > Project Location > Location and set the project address. Note that the ‘use Daylight Savings time’ setting will not affect the script.
Step 3 – Shared parameters
Ensure that the relevant project/shared parameters have been loaded into the project and assigned to the ‘Room’ category. By default, the script will search for:
- ‘Compliant Solar’ which is a yes/no parameter capturing if a room receives the minimum number of hours of sun to comply (typically 2 or 3 hours), and
- ‘Zero Sun’ which is a yes/no parameter capturing if a room receives no sun whatsoever during the analysis period.
Step 4 – Set units to millimetres
Because the analysis is being conducted in Rhino and then pushed to Revit, we need to ensure the units are compatible. The latest versions of Rhino.Inside Revit now prompts you if this is not the case. Since our solar access script is set up for millimetres, we need to set both software to millimetres.
For Revit, go Manage > Settings > Project Units, and change the Length format to millimetres (mm).
For Rhino, go Rhino.Inside > Rhinoceros > Rhino options (arrow in the corner) > Units, and set the model units to millimetres.
Step 5 – Prepare context
Within Revit, it is necessary to prepare the context for the solar access analysis. Context is defined as anything that will cast a shadow. The easiest way to prepare the context is to set up a 3D view from which elements are referenced.
Using Visibility Graphics (VG) in conjunction with worksets and/or filters, turn off any unnecessary geometry. Essentially all we require are party walls, floors and roofs. Extraneous geometry such as planting, furniture, doors and mullions can all be hidden. Glass balustrades, windows and other glazing should also be excluded. However, since these are often modelled as walls, you will need to set up a filter to turn off only the glazed elements and not all the walls.
It is critical that the context model be as clean and minimal as possible to minimise computational time later in the workflow.
Step 6 – Prepare rooms
Ensure that all rooms to be analysed are bound and don’t contain any self-intersecting rooms. Otherwise, they will be excluded from the analysis. (Refer to our Dynamo Room Check graph to automate this process). Moreover, since we are using Yes/No shared parameters to record compliance, rooms to be analysed cannot be in a model group.
By default, the script references the ‘Room Category’ key schedule parameter. Only rooms where the value of this field contains ‘TERRACE’ or ‘BED’ will be included in the analysis. Therefore, this parameter needs to be populated.
If you plan on exporting the results to Excel (refer to Step 15), then the room ‘Number’ parameter also needs to be populated. The value should match with the corresponding terrace/apartment room so that the pairing can be calculated.
There are some optimisations that can be made to speed up the compute time:
Tip #1: Ensure that any context geometry is not grouped
It takes far longer to extract nested elements and their geometry.
Tip #2: Eliminate the use of room separation lines
If the room geometry creates adjacent coplanar surfaces, Ladybug merges these, meaning they need to be separated out downstream, which is extremely slow. The best way to avoid this is to ensure rooms don’t touch one another by separating them with a wall.
Step 7 – Delete and reset
Before running the script, we need to perform two critical tasks:
Reset shared parameters
The first is to activate and reset the shared parameter values loaded into the project in Step 3. Counter-intuitively, Yes/No parameters have three values – Yes, No, and Null. When the parameter is first created, the default value is null, which is indicated by being greyed out in the Properties Pallet.
To reset all of the values to No, we first need to set the parameter to Yes to activate it before setting them to No. In other words, this part of the script should be run even if the solar access script hasn’t yet been run. To do this, ensure that the yes/no parameters names to be reset are correct (#2 & #3). By default, the script looks for ‘Compliant Solar’ and ‘Zero Sun’. Next, double-click the ‘Reset rooms’ toggle (#1). All rooms in the project should now be reset to No.
Delete filled regions
The second task is to delete any previously created filled regions. This task needs to be done because the Create Filled Region user object used in the solar access analysis doesn’t have any element tracking. This limitation means that re-running the script will create duplicate elements. To prevent this, we need to delete the previously created elements first. To do this, check the filled region prefix input (#5). By default, any Filled Region instances whose type name contains ‘SOLAR ACCESS’ (not case sensitive) will be selected. Next, press the ‘Delete previous filled region’ button (#4). All solar access filled region instances should now be deleted from the model. Note that the script does not purge the Filled Region Types as these are needed downstream.
Step 8 – Disable Revit preview
Having the Grasshopper preview visible in Revit can dramatically slow down Rhino.Inside Revit. It is, therefore, recommended to set the preview to ‘off’ before launching the script. To do this, go Rhino Inside > Grasshopper > Off.

Step 9 – Define settings
In Revit, open up Grasshopper and the solar access script. Remember that opening the file outside of Rhino.Inside Revit and saving it will cause the wires to break (as Rhino.Inside Revit components are only available within Revit). To run the script, first define the settings:
- Define the grid convergence (#1). If your model is orientated to True North, this value is 0.
- Define the analysis period (#2-8). By default, this is 9am – 3pm, 21 June.
- Define the grid resolution (#9). Each room will be converted to a mesh with face dimensions approximately equal to this value. The lower the value, the higher the resolution of the analysis and the longer it will take to run.
- Define the offset from the floor (#10). This is the height the analysis mesh is offset. By default, this is 1000mm as per the Apartment Design Guide.
- Define the number of hours required to comply (#11). The default is 2 hours.
- Define the room name filter (non-case sensitive). Only rooms whose value contains this will be used in the analysis (#12). By default, the input includes ‘BED’ and ‘TERRACE’.
- Define the parameter name to reference (#13). By default, this is the ‘Room Category’ key schedule parameter.
- Define the yes/no shared parameters to write to for solar compliance and no sun (#14 & #15).
- Define the view type name filter (#16). Only Floor Plans whose Type matches this will be used for the filled region placement.
True North
The script collects the Project Site Location and uses its latitude and longitude to create a Ladybug location. Next, the project’s Angle to True North is returned and combined with the grid convergence input to define north for Ladybug. If your Revit model is orientated to the real True North, that is, the direction along the earth’s surface towards the geographic North Pole, then the grid convergence is 0. However, if your Revit model is orientated to Grid North, such as GDA2020_MGA56, you’ll need to factor in grid convergence.

Grid convergence
Depending on the location, grid convergence and can be positive or negative. For the script, negative values indicate True North is to the West of Grid North, while positive values indicate True North to the East of Grid North. Sydney, for example, has a Latitude of -33.89° which means it is in the Southern Hemisphere and a Longitude of 151.028°, which means it is located to the West of the Central Meridian (153°) in MGA zone 56. This means that True North is West of Grid North, with an angle of approximately -1°. If your survey doesn’t contain this information, many government agencies publish Geodetic Calculators to assist in calculating the grid convergence.

Step 10 – Reference building elements
Within your 3D context view (refer Step 5), right-click on the ‘select building context’ component (#17) and pick “select multiple graphical elements”, choose all of the building context (walls, floors, etc.), and then press “Finish”. The script collects all of the element’s geometry and filters out anything which isn’t a brep or mesh. This means if you accidentally include model lines or levels, they won’t be included in the analysis.
Step 11 – Reference context elements
Within your 3D context view (refer Step 5), right-click on the ‘select linked model’ component (#18) and pick “select multiple graphical elements”, choose the linked model instance, and then press “Finish”. Note that if more than one linked model needs to be referenced, some tweaks to the script are required, as currently linked geometry in Rhino.Inside needs to be orientated to the current project’s coordinate system.
Within your 3D context view (refer Step 5), right-click on the ‘select linked context elements’ component (#19) and pick “select multiple linked graphical elements”, choose all of the context elements (topography, massing, etc.), and then press “Finish”. The script collects all of the element’s geometry and filters out anything which isn’t a brep or mesh. This means if you accidentally include model lines or levels, they won’t be included in the analysis.

Step 12 – Run analysis
The script has several breakpoints to enable verification before proceeding to the next part.
- Double-click the ‘Import rooms’ toggle to enable (#20). This process should only take a few seconds. The script then collects all of the bounded rooms and filters them based on the room name filter (#12 & #13). Set the visualisation to ‘Analysis srf (rooms)’ (#23), and in Rhino, check that all the rooms you want to analyse are shown. The colour can be modified by changing the ‘Analysis srf (rooms)’ colour picker (#27).
- Double-click the ‘Import context’ toggle to enable (#21). This process should only take a few seconds, unless you have used model groups, in which case it could take a few minutes. Set the visualisation to ‘Context’ (#23), and in Rhino, check that all the context is shown. The colour can be modified by changing the ‘Context’ colour picker (#28).
- Double-click the ‘Run Solar Analysis’ toggle to enable (#22). Depending on the size of the model and the analysis grid resolution (#9), the analysis may take several minutes to run. Once finished, set the visualisation to ‘Heatmap’ (#23), and in Rhino, check that the analysis is shown correctly.
Before proceeding to the next step, check the error panel to make sure everything is OK. There should be no errors shown.
Visualise results
- To see complying vs non-complying, set the visualisation to ‘Comply vs non-comply area’ or ‘Comply vs non-comply room’ (#23). The colours can be modified by changing the ‘Complying’ (#24) and the ‘Non-complying’ (#25) colour pickers.
- To see the areas that receive no sun, set the visualisation to ‘No sun area’ or ‘No sun rooms’ (#23). The colour can be modified by changing the ‘No sun’ colour picker (#26).
- To see the areas affected by a single sun ray, set the visualisation to ‘Individual sun ray’ (#23). Next, select the time (#29) and the colour (#30). Note that the times are hardcoded based on 9am – 3pm with 15min intervals. If the analysis period has been modified (#2-#8), then these settings will be out of sync.
Step 13 – Push results to shared parameters
Once the analysis is complete, and you are satisfied with the results, we can push the results into the room’s shared parameters. To do this, double-click on the ‘Push to shared parameter’ toggle to enable (#31). The Yes/No parameters (#14 & #15) for each affected room will be updated to Yes. Other rooms should already be set to No from Step 7. Once this information is in the Revit model, view filters can be set up to visualise each room’s yes/no compliance.
Step 14 – Create filled regions (optional)
To visualise the solar access heatmap, we can create filled regions. To do this, double-click on the ‘Filled region prep check’ toggle to enable (#32). Once enabled, this will create the necessary, filled region types. Types are prefixed with ‘SOLAR ACCESS_’ then the number of hours, for example, ‘SOLAR ACCESS_2’. Types have a solid fill and are colour-coded based on the Ladybug colour scheme.
Because filled regions are view specific, the script finds the corresponding view based on the room’s level association. If, for example, the room was created on ‘LEVEL 1’, the script searches for the matching view based on the view’s associated level. Therefore, all the relevant floor plan views should already be created. If no view can be found, an error is returned in the Error Check Panel stating which level doesn’t have an associated view. Manually create the necessary views before proceeding to the next step.
Next, double-click the ‘Create filled region’ toggle to enable (#33). This operation could take several minutes to complete (10-15mins) as it populates the filled region instances. Where possible, adjacent co-planar areas are merged to minimise the number of instances. However, due to Revit API limitations, areas with interior holes, such as a room with a room bounding column in the middle, will contain multiple filled region instances even if all the area receives the same amount of sun. Once created, the line style of the filled regions are set to invisible lines to represent a smooth colour gradient.
Step 15 – Export results to Excel (optional)
The City of Sydney has an Excel template that is often required to illustrate solar access compliance. This is a pre-formatted file setup for 15min intervals. If desired, the script can write the results of the solar access analysis to this file. For this to work, the analysis period much match the Excel file, that is, 9am – 3pm at 15min intervals.
To export the results:
- Right-click on the ‘Excel file path’ component (#34), and select ‘one existing file’. Ensure that the Excel file is blank except for the various header information.
- Define the worksheet number (#35). The default is set to 1.
- Double-click on the ‘Write Excel’ toggle to enable (#36). This will open the Excel file and populate the data.
As the Excel schedule is structured to require a single value per room per time step, it represents an abstraction of the actual heatmap results. For each room, the script takes the mesh face that receives the most solar access. The centre point of this face this then checked at each time step, and the results reported. A ‘Y’ (YES) value represents that the mesh face is visible for that particular time step. Note that these values do not mean that the face is visible for the full 15 minutes. Column BB, however, does represent the total sun received.
Because of this method, some parts of the room may be visible during the same time step but not shown on the schedule. Despite this, the data written to the schedule is the most accurate interpretation of the intention of the legislation.
Step 16 – Reset Boolean toggles
Before closing the Grasshopper file, reset all of the Boolean toggles to False.
Conclusion
One of the surest ways to design better buildings is to undertake better analyses. However, often analyses are performed outside of the model authoring software, meaning that results tend to get ‘lost’ and fail to create a positive feedback loop. With the release of Rhino.Inside Revit, this need not be an issue. As shown above, numerous environmental analyses, including solar access, can all be performed inside Revit and the results stored within the Revit model.
To find out more about this script or our custom software development service, drop us a line and discover how we can automate your workflows.