Let’s talk basics:Revit Addons are written in C# and are windows .dll
files.pyRevit is written as an IronPython module. (actually a bit more complex than that)Revit doesn’t have an option to run external python scripts.
Thus, we need a way to teach Revit how to run a python script when it’s starting up.
The solution was to create a custom C# addin to create a python engine and run a script. We’ll call this addin pyRevitLoader.dll
. I wanted to keep this addin as simple as possible since it’s the only statically-compiled piece of code in this project. The rest of the task of loading pyRevit were assigned to a loader python script that is being run by the loader addin.
So:pyRevitLoader.dll
is a simple C# addin for Revit that runs python scriptspyRevitLoader.dll
loads pyRevitLoader.py
at startup.pyRevitLoader.py
sets up the environment and loads pyRevit.
It’s that simple really. See the sources below.
From here on, the documentation page for the pyrevit.loader module will take you through all the steps of parsing extensions, making dll assemblies and creating the user interface for the parsed extensions.
Here is the full source of pyRevitLoader.py
. The docstring explains how it works.
# -*- coding: utf-8 -*-
#pylint: disable=C0103,W1401,E0401,E0602
"""
██▓███▓██ ██▓ ██▀███ ▓█████ ██▒ █▓ ██▓▄▄▄█████▓
▓██░ ██▒██ ██▒▓██ ▒ ██▒▓█ ▀▓██░ █▒▓██▒▓ ██▒ ▓▒
▓██░ ██▓▒▒██ ██░▓██ ░▄█ ▒▒███ ▓██ █▒░▒██▒▒ ▓██░ ▒░
▒██▄█▓▒ ▒░ ▐██▓░▒██▀▀█▄ ▒▓█ ▄ ▒██ █░░░██░░ ▓██▓ ░
▒██▒ ░ ░░ ██▒▓░░██▓ ▒██▒░▒████▒ ▒▀█░ ░██░ ▒██▒ ░
▒▓▒░ ░ ░ ██▒▒▒ ░ ▒▓ ░▒▓░░░ ▒░ ░ ░ ▐░ ░▓ ▒ ░░
░▒ ░ ▓██ ░▒░ ░▒ ░ ▒░ ░ ░ ░ ░ ░░ ▒ ░ ░
░░ ▒ ▒ ░░ ░░ ░ ░ ░░ ▒ ░ ░
░ ░ ░ ░ ░ ░ ░
░ ░ ░
This is the starting point for pyRevit. At Revit loads the PyRevitLoader.dll
addon at startup. This dll then creates an ironpython engine and runs
pyRevitLoader.py (this script). It's the job of this script to setup the
environment for the pyrevit module (pyrevitlib\\pyrevit) and load a new pyRevit
session. This script needs to add the directory path of the pyrevit lib folder
so the pyrevit module can be imported and used.
"""
import sys
import os.path as op
# add the library location to the system search paths
repo_path = op.dirname(op.dirname(op.dirname(__file__)))
sys.path.append(op.join(repo_path, 'pyrevitlib'))
# now pyrevit can be imported
from pyrevit.loader import sessionmgr
# ask sessionmgr to start a new session
sessionmgr.load_session()
The source code for pyRevitLoader addin is under