Thoughts of a Recovering Architect
Hello, my name is Dan Audette, and I’m a recovering architect.
Hello, Dan
Every architect has a story of how they became interested in buildings, whether by exposure from family members in the field or a favorite memory of a building or space. They may have loved drawing or building with Legos. HGTV probably has a part to play. In my wife’s case, her family moved around a lot, so they needed to look for houses often enough that it became a bonding moment between her and her mother as they imagined themselves living in each space.
I never thought about architecture as a career until I looked at the University of Illinois Urbana-Champaign college application. It wanted me to pick a Major right then and there. This was difficult for me, my entire future hinging on this moment. I did very well in school in all subjects and some subjects I enjoyed more than others. I despised writing, ironically enough, but that’s a subject for a future post. I see my kids having difficulty choosing between chocolate milk or apple juice, and I remember this moment every time. What to choose?
Finally, my mother said, “Why not architecture? You like to draw, and you’re good at math.”
I drew Pokémon characters, and we all know how much math we do as architects.
Nonetheless, that’s what I chose.
Fast forward 13 years, and my professional journey took a detour, leading me from the conventional world of architecture to the fascinating realm of Design Technology.
So, why am I penning down these thoughts? Why open a window to my world?
Transitions teach. They bring with them revelations, challenges, joys, and frustrations. As I shifted gears, I discovered insights and stories worth sharing not just as an architect or a technologist but as a voracious reader, an avid gamer, a music enthusiast, a curious observer, a lifelong learner, and, importantly, as a dad.
Through “Thoughts of a Recovering Architect,” I hope to weave the tapestry of my experiences, musings, and life’s little lessons. It will be messy, but I invite you to join me on this expedition — to explore, reflect, and rediscover.
Welcome to my journey.
What I’m Working On
Dynamo Script: Room Center-er
This script has been around almost as long as Dynamo has. I probably found it on the Dynamo Forum, as it took a few years for me to become proficient in Dynamo. It recently received a lot of traffic, so I decided to re-market it to the office.
The tool is simple. Find the centroid of the Room, and put the center of the Room element there.
Mapping out the step looks something like this:
- Get all of the rooms in the project.
- Get the shape of the Room to find the centroid of the form.
- Determine if the centroid is inside the room geometry or not.
This is important because, in an L-shaped room, the centroid could exist outside the Room’s boundaries. We don’t want to move Room elements there.
4. Move the Room Centers to the centroid.
To get the Rooms, I used the All Elements of Category node. I like to get the Category using the Category.ByName node instead of the Categories pick list. I prefer this method because new categories have been added to Dynamo in the past, and these additions would change my selection to something else.
Rooms are 3D objects, so I used the Elements.Solids node to get that shape, and then the Solid.Centroid to get the shape’s centroid. Since the Room element is a 3D object, the centroid will be above the floor elevation. I don’t care about the Z-axis here, so I grab each centroid’s X and Y Coordinates and use them to construct a new point where Z = 0.
There’s a handy little node called Room.IsInsideRoom that takes that Z-adjusted point and checks whether or not it’s in the Room itself. The data tree came out wonky, so I flattened it and used it as the Test in the If node. If True, push the Z-adjusted point through. If False, push a null value.
Finally, I used the Element.SetLocation node to input the Room elements and the Geometry (Z-adjusted point).
Does anyone handle odd-shaped rooms differently? Is there something else I can do other than ignore them? Would love to hear.
Dynamo Script: Room Tag Center-er
The companion script to the above moves Room Tags to that new center point. I keep the two separate since Room Tags are used per view, so instead of re-centering the centered Room on each sheet view, you only have to affect the Room Tags in the views you care about.
The steps looked like this:
- Get all Room Tags in the view.
- Get the Room Tags’ host Room element.
- Get the Room elements’ set location (possibly determined by the script above)
- Move the Tag to that location.
I get all of the Room Tags in much the same way I did Room elements, except Room Tags, or all tags, for that matter, exist in single views. So, I changed the node to All Elements of Category in View. I plug in my desired Category. The View that I want to affect is the one I’m looking at, the one that is active in Revit. You can use the Document.ActiveView, which asks for the current Document. I use the Document.Current node to fill in the blanks.
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
import Autodesk
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
roomtags = UnwrapElement(IN[0])
elementlist = list()
for tag in roomtags:
try:
trID = tag.TaggedRoomId
if trID.HostElementId.IntegerValue != -1:
elementlist.append(doc.GetElement(trID.HostElementId))
elif trID.LinkedElementId.IntegerValue != -1:
linkdoc = doc.GetElement(trID.LinkInstanceId).GetLinkDocument()
elementlist.append(linkdoc.GetElement(trID.LinkedElementId))
else:
elementlist.append(None)
except:
elementlist.append(None)
OUT = elementlist
This is the tricky bit. I need to figure out which Rooms each of these Tags is hosted to. I could not find an OOTB (out-of-the-box) node to accomplish this (hopefully I’m wrong?), but plenty of 3rd party packages do.
Managing Dynamo Scripts across a 60-person office is complicated enough without making sure everyone has up-to-date packages on top of it. I recreate the 3rd party nodes in a Python node as much as I can.
I do my best to give credit in the notes of the Python code to the original Author, but this script was long before I thought to do such things. I feel bad about it, as looking at the style this code is written in is not my own. If anyone knows the Author, please let me know!
With the Tag’s Host Rooms, I can quickly get the location of the Room element with Element.GetLocation.
Then, use that location to move the Tags with the Element.SetLocation.
Snack Shack Bot
As a Design Technology Specialist in a 60-person architecture firm, the scope of my work gets a bit stretchy, as you’ll find out following me. I wear many hats. Database builder, Data Visualizer, SharePoint manager, etc. This is one of the more fun things I’ve had the opportunity to do.
Our office moved to a new location this past summer. Moving gave us an excellent opportunity to declutter, and someone had the idea to eliminate the Snack Shack tracker spreadsheet taped on the refrigerator door.
We keep many snacks in the office available for purchase ($0.50 — $1.00), and when you take a snack, you put a mark by your name, and at the end of the month, your total is calculated, and you pay up.
Amidst this decluttering, one staff member wanted to do away with the paper on the fridge and came to me asking for help.
We built a Form using MS Forms and put it in MS Teams. We also made a QR Code to scan at the point of sale, a quick way to log snacks.
To track totals, I created a Spreadsheet Log and used MS Power Automate to add to the spreadsheet every time the Form response was submitted.
I first grab the Form and set a trigger action: When a new response is submitted.
I next grabbed the responses from the Form submissions: Get response details.
I then took the response details and had them added to my Spreadsheet Log: Add a row into a table.
We got this far, and we launched it. It was mostly successful, but we received two pieces of feedback. First, people were concerned people were forgetting to log their snacks and wanted to be able to see how much everyone spends per month. This had a dual benefit of users seeing how much they’ve paid to keep their budgets in check.
Recently, another staff member thought it would be cool if people got a receipt notification in MS Teams after their snacks were logged. Cool, I’ve never built a chatbot before. Let’s do it.
It was actually straightforward.
Using the Developer Portal inside of MS Teams, I started an Adaptive Card. Using the tools to create a little notification. It spits out JSON code that I’ll need a bit later, which is very handy for those who still need to get into JSON (ahem).
The longest part was figuring out what little robot mascot to use. I decided to use the AI image generator Midjourney.
With that done, I now needed to use my Bot in my original Power Automate script to send the receipt.
Using Post Card in a chat or channel, I can plug in that JSON code and swap in my Power Automate variables for the person’s name and number of snacks, and done.
Now I get this notification every time I log a snack!
However, looking at this now, it is not 2017, so I may have to swap out another variable in the JSON. Snack Shack Bot v2.0!
What I’m Reading
This book humorously critiques optimistic philosophers, institutions, and societal norms. Despite facing repeated misfortunes, Candide clings to the belief that “all is for the best.” Its satirical take on human nature and societal values shows its enduring relevance and wit.
I mean, a character gets half her butt cut off. If that doesn’t get you to read it, I don’t know what will.
What I’m Listening To
Portugal. The Man
Once immersed in the indie music scene, parenthood shifted my focus. While unfamiliar with this band, their melodies have captivated me, becoming my go-to on Spotify for the past month.
What I’m Playing
I love the depth of open-world games like Assassin’s Creed Origins. I enjoyed navigating its Egyptian realm, confronting foes stealthily and directly. However, my gaming time has dwindled with parenthood, making such expansive journeys longer endeavors.
And spoiler alert for an older game: it wasn’t just Brutus; I, too, played a part in Caesar’s demise.
What I’m Learning
Ancient Egypt The Egyptian Podcast
Assassin’s Creed games, set amidst historical events, unveil gaps in my understanding of world history. While familiar with popular facets of Ancient Egypt, like pyramids and Cleopatra, I’ve delved deeper to grasp lesser-known details: ordinary Egyptians’ lives, beliefs, and interactions. Surprisingly, I hadn’t realized the interconnectedness of Egypt, Greece, and Rome or that many scholars believe the pyramids weren’t built by enslaved people.
For a deeper dive into Egypt, I recommend The Egyptian Podcast.
What I’m Looking At
I received an Ooni Pizza Oven and have been experimenting weekly. My challenge isn’t just the learning curve but also the relentless mosquitos. I installed a bat house four years ago, hoping bats would curb the mosquito population. Yet, I see no signs of occupancy. Wouldn’t I see guano? Should I reconsider its placement or add more houses?
Bats would eat well in my neighborhood.
What My Kids Are Doing
My wife and I decided to sign Primera (6) and Segunda (4) for soccer this fall.
Segunda has always been our more active kid, climbing everything and bouncing off the walls. She’s been captivated by organized sports played around her.
Four weeks in, we’re giving up. Segunda has refused to play. If we can get her onto the field, she won’t participate. She wants to sit in my lap and watch her sister. I get it. I also don’t want to leave the house early on a Saturday morning to go out in the cold, wet weather.
Primera, on the other hand, has grown to like playing soccer. She’s always had trouble with transitions and has sensory processing challenges. Despite her willingness to go, her body can’t reach the threshold. Cleats aren’t comfortable. Shin guards feel funny. My family sees photos of her playing and immediately concludes that we need to keep her safer, offering to pay for shin guards and cleats, which isn’t the problem. She’ll wear shin guards after getting her first kick to the shins…or quit. Actually, she’ll just quit.
Once she’s there, she’s great…until she starts to lose. Our perfectionist daughter has such high expectations of herself and others that are impossible to meet. The scrimmage games are a little too chaotic for her neat and orderly vision of the world.
For now, she’s made a friend, settled into the defensive position, and chats away.
My kids may not be into sports, but they come by that naturally.
What I’m Thinking About
Patterns in human nature span from Ancient Egypt to Voltaire’s era to today. Humans crave stability, as seen in Egypt’s “Ma’at,” my daughter, and Candide’s quest for order amidst chaos. Yet, our optimism often blinds us to realism, evident in Candide’s relentless hope and modern challenges like climate change. However, our resilience, demonstrated by Candide’s characters and Egypt’s adaptability, suggests that as long as basic needs are met, humanity finds a way forward.