蚂蚁下载Melanie Stone's CAD & BIM blog! This platform will be primarily dedicated to Design Technology (especially as it relates to Facilities Management [FM / CAFM / CMMS]).


Happy Blogiversary! 15 Years.

So, spring is always a time of some type of growth and rebirth. I knew recently, when I reached my milestone workiversaries, that my blogiversary wasn't far behind. 

First, a small cheers for my 20th anniversary in a professional role, and in Facilities Data Management, as it was on the 28th of March, 2000, that I was hired on with the Facilities-Engineering department at Barnes-Jewish Hospital, consistently ranked one of the Top 10 Hospitals in the nation. It was a great place to 'grow up' in the industry, learning from everyone around me, and developing skills (databases, programming) that would serve me well in later roles.

Then, my 5th anniversary, also March 28th, of being hired by the wonderful team at InfoNarus. I am not exaggerating when I say that this was a life-saving occurrence and I will forever be in their debt. Obviously, having worked for them there, and with them in two prior jobs, I wouldn't hesitate to endorse them to anyone who is in search of a competent ARCHIBUS business partner to work with.

Which brings us to today! 
The 15th anniversary of this blog. I believe this post marks my 473rd article (aside from the ones published elsewhere, of course).

I suppose I can't count the guest authored articles as my own... although I did provide editing services (wanted or not ;) ) on each of them. 

Originally, I started this blog to save time over preparing the Word document and author chasing and editing of the Gatway AUG newsletter I had put out for years prior. But, it also gave me a wider platform for discussing Facilities issues. As I reminisced in my first post, the name of this site has also been a source of amusement for many, and, unlike my actual name, it never gets forgotten.

This site has played a role in most of the jobs I have obtained, allowing me to be visible and help others and display competence (and a wicked sense of humor, which, let's face it, is totally why everyone has hired me or rehired me to work with them).
Show your knowledge folks, even though looking back at my older articles sometimes embarrasses me, as my writing has matured and I have more professional experience to draw from, I still had something to contribute, and it has paid off, no regrets.

Thanks for coming along for the ride!
(I did think about making a list of all of the software I have used, or at least written about, in the past 15 years, but, let's face it, even under quarantine, ain't nobody got time for that.)

images courtesy of vectorstock.com


Methods of polylining and Boundary/BPOLY

So, as a Facilities person using AutoCAD (although Revit can sometimes be finicky about 'bounding' properties and having to manually add/adjust bounding lines, too), polylining is a must for all of us.

I still occasionally run across users who are not familiar with the Boundary command (or BPoly).

I use this command to create polylines from enclosed areas, but, you can also create Regions with it. 

Obviously, in this process, you have to be aware of the polylining standards being used. Whether it is BOMA or some client-specific method. 

If you're plining an area with a predictable pattern (such as a cube farm), setting up construction lines (CONSTRUCTION LINE or RAY) at the midpoint of the walls can be a way to provide yourself with enclosed areas to use the Boundary (BOUNDARY or BPOLY) command on. 
Make sure you have a distinct layer set as Current, so that you can isolate it (LAYISO). 

Annoyingly, in Autocad 2021, it appears that the default LAYISO behavior is to lock layers, rather than the prior default of turning them off, so you'll have to LAYISO > S to change the settings to O. 

If they are the same size, I tend to just draw a rectangle and copy or array as appropriate.

If you have less regular areas, such as an office suite or cafeteria, you will most likely  manually polyline the smaller spaces, then use Boundary on the remaining open space (lobby or seating). 

Just remember handy tools like the M2P OSNAP, where you can click two points and your pline will snap to the midpoint between them, so you can use RECTANG instead of PL to make your bounding lines, where appropriate. 

I actually set up an M2P shortcut on my tool palette, just so I can keep clicking along. 

When working in a busy drawing, I tend to keep my running osnaps to a minimum so I don't snap to the wrong thing, and just select more specific snaps from my TP when they are required. 

So, once you have your surrounding spaces polylined to make an enclosed space, then you can use BPOLY. 

Here the cyan line is my exterior gross, the magenta represents the interior gross line, the blue is for the room boundaries and the yellow is a pair of break lines that prevents islands (Tririga would show an island space as a Child space, but, I believe ARCHIBUS and FM:Systems would freak out about it, islands are a no-no. And, though I am currently a Tririga user, we still avoid islands and do not utilize child spaces with our client.). I feel pretty safe with with an 1/8" gap (.1 if you want to save on the keyboard input). 

A tip for generating the exterior gross line is by using the AREA command. 

My next step would be to select the interior gross line, a room boundary and one of the yellow breaklines and type LAYISO, so all of the other layers are turned OFF. Run the boundary command, select a point inside of the area, and your polyline is generated. 

Confused about the difference between freezing a layer and turning it off?

Now, I did have a reader tell me awhile back that he created a VBA program that would isolate to the desired layers and start the boundary command. I have done a bit of VBA in the past and even had the honor of assisting Lee Ambrosius in his programming labs at AU for years, but, I haven't quite gotten around to making my own program. 
But, even if you're not comfortable with programming, you could also speed things up by isolating these layers and use the Layer States dropdown on the expanded Layers panel on the home tab of the ribbon to create a new layer state and while in the Layer States Manager, Export that setting to import into other drawings
Because, of course, if you're using CAFM/IWMS, you are using the exact same layer names every time.

Happy Polylining, folks! 


Company looking to fill a lot of occupancy planning & related roles

My company sent out another email today, asking for referrals for a host of occupancy planning roles. That tells me these positions are hot.

It took me awhile to get hired on here (massive company and it's hard to get to know the right people in HR at times, and my experiences are a bit limited), but, if anyone is interested in one (or more) of the roles, please let me know, I can start the referral process on our side and get the name of the recruiter in charge of the posting. That will really speed up the process.
(if you don't already have other contact information for me, feel free to email melanie.stone at am.jll.com)

There are locations listed, specific skills and hiring managers might make remote work possible for some of them, you'll just have to inquire and find out.
I adore my team, who are all based in California, and while I don't work with the folks at the local JLL office, they've all been very welcoming.

If these occupancy, space planning or cad manager roles are not up your alley, feel free to search our other open positions, I'd be willing to refer on them as well (there are 95 openings currently with the word CAD in the title).



One of my colleagues has been posting these awesome videos, setting up really old hardware and operating systems, and running old CAD programs.
His channel is called RetroCAD, and he announces his new videos on Twitter.

So, Robert pinged me and asked if I had or knew of anyone who had an older version of ARCHIBUS.
Now, y'all know I spent most of my illustrious career working in the Facilities Engineering department of one of our nation's top 10 hospitals. Each time we moved our offices (Milton has nothing on us lol), we were put into smaller and smaller spaces and had to purge things. So, I was allowed to bring home a few things that might have otherwise ended up in the dumpster.
Some old digitizer tablets and pucks, some middle-aged Autocad versions & advertisements AND one really old binder of ARCHIBUS F.I.M.S., with a shipping date of 1993.
I'm thrilled that my Shaan Hurley-esque hoarding of arcane architectural artifacts has not been for naught.

Facilities Management is sort of the step-child of the AEC industry, and CAFM (computer-aided facilities management) software does not get a lot of air-time compared to design software, so this is exciting for me.

So, you know how much our industry LOVES acronyms.

BUT, I have a new favorite!

Random Online Videodisk Emulation Retrieval
Awesome. lol. Fetch that data!

I hope you enjoy his videos as much as I did. And that, like me, you can appreciate how far user interfaces and relational data has come in the past 20-30 years.


Turning Off or Freezing a Layer in Autocad, what's the difference?

Awhile back, I was training a client on how to prepare his files in Autocad, prior to registering them in his CAFM/IWMS system, ARCHIBUS. My colleague, James Castruccio, introduced me and spoke very highly of my cad expertise to the gentleman I was training. While I was conducting the training, over a GoToMeeting, he was performing other work on the project and just listening in.

There was a point at which I was in the Layer Properties Manager dialog box and James piped up with a question, stating that he had always wondered why we sometimes freeze layers and other times turn them off, and could I educate him as to the differences?

You know, I have been doing this for so long, and have never had to articulate that before, having just sort of internalized the situations in which I would use one over the other.

Reflecting back on the topic, in the past, there were more functionality differences, before computing power and refresh rates, etc caught up to the functions of a full featured CAD program, but, I will try to focus on what is still applicable in more modern releases.

How are Freezing and Turning Off a Layer Similar? 
Let's start with the things these two options have in common? 

  1. Makes a layer invisible to the user
  2. Control from the Ribbon (Layers Panel of the Home tab)
  3. Control from the Layer Properties Manager
  4. Invoke from the Command Line interface
    1. LAYFRZ
    2. LAYOFF
  5. DWG Compare ignores layers that are Off or Frozen
How are they Different? 
LAYOFF - Autocad's memory still holds the geometry
LAYFRZ - Autocad forgets the entities 
               - this can speed up panning, zooming and regenerating
               - is ignored by Extents
               - is ignored during Rendering
TIP: When attaching an XREF, it is a good idea to have a dedicated layer for each one. So, you can easily FREEZE the layer and hide all of the external reference's layers, allowing an easy ZE or publish to extents, focusing only on the contents of the drawing you are working in.
LAYON - Does not force a regeneration of the drawing
LAYTHW - Forces a regen

OFF - Can be made the current layer
FROZEN - Cannot be made current

WARNING: When your current layer is turned OFF, any objects you create or insert will immediately become invisible and remain that way, until you turn the layer back on.
FROZEN - Entities are not selectable by any means or methods
OFF - Layers may be selected using the ALL option

WARNING: If you use the ALL option of the SELECT command, and choose to move or erase objects, even the objects on OFF layers will be affected.
OFF - Blocks with multiple layers might still be partially visible, even if the layer the block is inserted on has been turned OFF
FROZEN - Freezing the layer of a block will make all entities invisible

FROZEN - Layers can be frozen by Viewport
OFF - Cannot be controlled independently by VP

Other Layer Controls: 

LAYISO invokes the OFF option, not the FROZEN option

LOCK - Unlike freezing or turning off a layer, when you lock a layer, it is still visible, just not able to be manipulated at all

If I have missed any differences or caveats to these to functions, please let me know in the comments.

Oh, and just to prove my street cred as someone who knows her layers, here is a t-shirt that my colleague The CAD Geek had made for me when we went toe to toe as the head of families for AutoCAD Family Feud at AU 2016. Thanks for the great conversation piece, Donnie! 


Saving time: Optimizing a Dull Structural Task with Dynamo

I have the pleasure today of hosting a guest blog post, from a longtime Twitter friend that I was fortunate enough to meet up with in person this year, Tom Kunsman! As if working in this industry isn't cool enough, we also bond over our love of Legos and Space Science! 

Before we get to Tom's article on saving time with Dynamo, here are some links to past articles from guest authors: 

Saving time: Optimizing a Dull Structural Task with Dynamo 

Dynamo is often used to not just create parametricgeometry, but to optimize workflows and maximize project efficiency.

Recently, I was working on astructural project and was slogging through one of those very repetitive tasks.This was, of course, the manual editing of a dimension on a beam system, inorder to place the label below them which specifies the number of structural membersand spacing required between them.

As I trudged through this task,I realized that Dynamo could be leveraged to perform this task, in less timethan it would take to do manually. The data for all the members and spacing wasavailable in the system family parameters already, so all we had to do was finda way to tap into it and put it where we want it.  

1.     Beam Framing Systemsand Their Parameters

First, let’s look at a framingbay, to understand what information we are trying to gather (notice the values belowthe dimension segments).

Initially, when I began workingthrough this problem, I was going to have users select the beam system, thenthe dimension, but relating the two pieces of data proved difficult.

One of the more frustratingaspects of Revit is the inability to access all of the parameters with in aproject, when you want to use them in tags or with other parameters. Take alook at the parameters of the beam system. Note that “Centerline Spacing” isgrayed out, which means that the user cannot modify this value.

Thankfully, with Dynamo, we can access this information, along withthe “Number of Lines” value, to apply to the dimension spacing.

NOTE: This access hasthe added benefit of eliminating the opportunity for user error.

1.     Building aSolution in Dynamo

Instead of continuing to attemptto find native Revit options, I decided to turn to the amazing Dynamo communityof users. And, since I was using custom nodes from a package called Rhythm, Isought assistance directly from the package author, John Pierson.

After brainstorming for a bit,we came up with this simple graph:

We’ll take a look at each groupof nodes, by function, to understand the logic.

A.     Gathering UserInputs

The first step in our process isto select the multi-segment dimension that we wish to have the beam systemvalues written to. This can be done with a simple Select Model Element node and a NumberSlider node. Keep reading, if you aren’t sure why I included the numberslider.

TIP: Renaming a nodecan be done simply by double-clicking on the title of the node and typing in anew label. Renaming nodes can help new Dynamo users more quickly understandwhich nodes require user input or selection.

I have renamed the “Select ModelElement” node to read “Select Dimension”, and “Number Slider” has been changedto “Buffer for Dimension”.

A.     Collect andCompare Beam Systems

Next, we need to grab thestructural beam systems, along with their bounding boxes. This is accomplishedthrough the use of the following nodes: Categories,All Elements of Category and Element.BoundingBox.

A.     Projecting thePoint and Generating the Bounding Box

Obtaining the underlyinggeometry of a multi-segment dimension is difficult. The end result actuallyplaces a point at the mid-point of each segment, and then copyies and offsetsthat point until it intersects the beam system.

With this method, Dynamo canunderstand which segment of a dimension corresponds to which beam system.Basically, we are playing laser tag with the dimension and the beam systems,which actually mimics what a user would do manually.
  1. Find the related dimension string
  2. Scan over and locate the beam system to pull data from
  3. Push the data to the dimension string

    By using the Dimension.GetCurve node, we can place apoint at the mid-point and then generate a curve along the normal vector fromthat point. This is where the “buffer for dimension” Number Slider gets input to the Geometry.Translatenode.

    This translate node placesanother dynamo point at a distance away from the midpoint of each of theselected multi-segment dimensions, which is how we are able to grab the relatedbeam system. Since the dimension will not intersect the system, we simplyproject a point of our own towards it.

    The last node in this group isthe BoundingBox.ByGeometry. Thisgenerates the bounding box of the point that was offset from the mid-point ofthe dimension line. We will then look to see if the bounding box of this pointintersects with the bounding box of the beam system.

    A.     Select Objectsto Check

    The next step is performed bythis group of nodes, which does an intersection check between the boundingboxes.

    In the BoundingBox.Intersects node we input the Structural Beam Systemcollection to the boundingBox inputand for the other input we use thedata from dimension point and translation group that was mentioned above.

    Flowing from the BoundingBox.Intersects node we use the IndexOf node.

    We also use a Code Block node witha true statement. So, we are ONLYselecting beam systems that do intersect with the offset midpoint of theselected dimension.

    The remaining nodes: List.AllIndicesOf, List.RemoveItemAtIndex and the second Code Block, with the value of negative one, will remove any BeamSystem that may have been misplaced or does not have a corresponding dimension.

    A.     Get the Indexof the Beam System

    Next, we need to get the BeamSystem index, and for that we can use the List.GetItemAtIdexnode.

    For the list port we feed a wire from the All Elements of Category from when we had selected all of the beamsystems.
    With the index port we wire in thelist output from the List.RemoveItemAtIndexnode. Again, this just helps to eliminateany misplaced beam systems in the current view.

    A.     Obtain the DimensionValue of the Beam System

    We need to get the dimensionvalue of the beam system, which is where this group of nodes comes in.

    The first step in getting thedimension value of the beam system is to use the Element.Parameters to get the parameters.

    Next, we need to get the Stringvalue from that object with the Stringfrom Object node. This enables us to search for and isolate just thecenterline spacing.

    After converting to a string, wecan then search for the centerline spacing by using String.Contains and a CodeBlock with “Centerline Spacing”.

    NOTE: Dynamo and Revit requireexact spelling and case sensitivity.

    This can be done with the List.FilterByBoolMask node. The String.Split node groups the CenterlineSpacing with the associated value associated with the spacing. This is helpfulbecause we get the user-understandable value of the dimension and not thedecimal value.

    A.     Assemble theString

    Now it’s time to build thestring (text value) that will be written below the dimension value.

    In the first part of this groupwe have the Rhythm node BeamSystem.Members,which obtains the framing members from the beam system. For the Beamsystem input port, we connect a wirefrom the List.GetItemAtIndex node while we were .

    This gets connected to the Count node, allowing us to obtain thenumber of beams from the framing system.

    From the group where we obtainedthe dimensional value of the beam spacing (the centerline spacing), we connectthe String.Split to the List.LastItem, since we only need thespacing value from that list.

    You can use a simple + (addition) node and a Code Block to add one to the number oflines. This is what builds our custom below value for dimensions (the part whichused to be manual).

    In our final step, we need touse the Dimension.SetBelowValue nodefrom the Rhythm package. For the dimensionport, we feed in the Dimension line that we picked all the way back in thebeginning of this logic, with the SelectDimension node.

    Finally, for the belowValue port, we feed in the wirefrom the Code Block where we had added the count of the number of beams and the spacing.

    A.    Placing the Annotation

    After the user runs this script,Revit places a Dynamo point at the midpoint of each segment of themulti-segment dimension line as well as a Dynamo point offset from that point.

    NOTE: Thisoffset point needs to be within the beam system you are trying to reference. 

    NOTE: Remember our“buffer dimension”? This buffer dimension may need to be modified depending onhow far the user has placed the dimension line from the beam system.

    1.     Summarizing ourDynamo Solution

    So, the next time you need tospecify the number of members in a framing system, and the spacing betweenthem, keep in mind that you can automate the process with the following Dynamoworkflow:

    A.    Have the usermake selections and input the required tolerance
    B.    Collect andcompare your beam systems
    C.    Project pointsand generate corresponding bounding boxes
    D.    Select objectsto check
    E.    Obtain theindex of the beam system
    F.    Assemble thedata string
    G.   Place the datastring below it’s related dimension

    Stepping through your process ina Dynamo graph is important, because not every project is the same. Buildingflexibility into our graphs in this manner sets us up for success. As always, Iwould encourage you to test any script like this out on a test project, beforeusing it in production.

    I hope this example candemonstrate to any structural designers and engineers who may not already beaware, just how they might be able use Dynamo on a project with beam systems. Thatmight spark other ideas, too, because utilizing a script on a mundane task canalso save so much time and effort.

    Much of the logic behind this solutionwas provided by John Pierson. Using my initial thoughts andthe resulting idea for improvement, John was able to expand upon what Iprovided and assist with the onerous task of obtaining the dimension geometry.

    TomKunsman is a structural designer with over 20 years’ experience andcontinues to find ways to utilize Dynamo in structural and other disciplines. Hehas experience in BIM Execution Plans BxP, Revit family content creation in alldisciplines, and continues learning how to adopt or improve established BIMworkflows. 
    Twitter: @tkunsman 

    JohnPierson is a Design Technology Specialist at Parallax Team and a Revitcertified professional for all disciplines. He is an active member of theDynamo community and currently manages the Dynamo package called Rhythm. 

    Before you go, please take 3 minutes out of your day to participate in the AUGI Annual Salary Survey. https://www.surveymonkey.com/r/2019AUGISalarySurvey


    BIM 360 Ops - Will it feed data back to Revit?

    So, as much buzz as there is around BIM 360 Ops, as a facilities person, my primary concern is longevity and keeping things relevant.

    While I know that you can export data from Revit to Ops, I was not sure whether changes you make in Ops can feed back to the Revit model.

    So, I ran across this post in the Autodesk Discussion Groups:
    Push New Data from Ops back to the Revit Model

    The answer provided by katie.murff was that Ops does not (yet) have an API. Although, she did say that a workaround would be to export the information from BIM 360 Ops to a spreadsheet and then import it into Revit.

    I suppose it would be up to the people involved in the process and the scale of the data changes as to whether that would be more efficient than just updating the data in both applications manually.