Programmer’s Trick: Custom Number Rounding

Most programming languages have a function to round a number to the closest whole number using standard math rules. Anything fraction of a number < 1/2 typically rounds down and any fraction of a number >= 1/2 rounds up. In Visual Basic, there’s a “Round” function, C# has a “Round” method and Excel even has a “Round” function.

  • 1.0 already a whole number, rounded value remains 1.0
  • 1.25 rounds DOWN to 1.0
  • 1.49 rounds DOWN to 1.0
  • 1.5 rounds UP to 2.0
  • 1.75 rounds UP to 2.0
  • 2.0 already a whole number, rounded value remains 2.0
  • …etc…

Some languages lisp AutoLISP, doesn’t have a function that behaves like this. Instead, AutoLISP had a “FIX” function that rounds down, regardless of the fractional component.

  • 1.0 already a whole number, rounded down remains 1.0
  • 1.25 rounded down becomes 1.0
  • 1.49 rounded down becomes 1.0
  • 1.5 rounded won becomes 1.0
  • 1.75 rounded down becomes 1.0
  • 2.0 already a whole number, rounded down remains 2.0
  • …etc…

If you use a language like AutoLISP that only drops the fractional component of a number (essentially always rounding down) to function like real math rules, this is easily accomplished by simply adding 0.5 to the number before rounding. This changes the resulting rounded number to the same as traditional mathematics would round the numbers.

  • 1.0 + 0.5 = 1.5 rounded down becomes 1.0
  • 1.25 + 0.5 = 1.75 rounded down becomes 1.0
  • 1.49 + 0.5 = 1.99 rounded down becomes 1.0
  • 1.5 + 0.5 = 2.0 rounded down becomes 2.0
  • 1.75 + 0.5 = 2.25 rounded down becomes 2.0
  • 2.0 + 0.5 = 2.5 rounded down becomes 2.0
  • …etc…

So far, this is quite simple. But what if you wanted to round to the nearest 1/8? Or 1/2?  Again, many of the rounding functions in programming languages have the ability to round to a certain number of decimal places by specifying the number of decimal places as an argument to the rounding function. This works great on decimal values where you want to round to the nearest 1/10 (0.1), or 1/100 (0.01). However, this doesn’t work in other fraction that are not base 10. Rounding to the nearest 1/8 yields 3 decimals (0.125) but 2/8 (1/4) yields 2 decimal places (0.25) and 4/8 (1/2) yields in 1 decimal place (0.5). So how is this done?

Quite simply actually. You can use another technique which shifts the decimal. This moves the fractional component you want to keep to the left of the decimal and leaves the remaining fractional components to the right of the decimal where you can round them off. It sounds more complicated than it is.  Let’s look at how this works by focusing on 1/8 (0.125).

What happens when we multiply 1/8 (0.125) by a factor of 8? We get 1.0 which when rounded, stays 1.0, we then divide by 8 again which shifts the decimal back to where it belongs and we end up with out original number as follows…

0.125 * 8 = 1.0  rounded stays 1.0 / 8 = 0.125 (1/8)

Now let’s try this when the number is slightly larger….

0.126 * 8 = 1.008 rounded becomes 1.0 / 8 = 0.125 (1/8)

The key is…if you want to round to the nearest 1/8, you “MULTIPLY by 8, ROUND, then DIVIDE by 8″.  You can also use the inverse formula “DIVIDE by 1/8, ROUND, then MULTIPLY by 1/8″. Either formula works.

The same technique works if you want to round to the nearest 2 (even) or 3 (3, 6, 9, etc.).

  • 0.25 / 2 = 0.125 becomes 0.0 * 2 = 0.0
  • 0.5 / 2 = 0.25 rounded becomes 0.0 * 2 = 0.0
  • 1.0 / 2 = 0.5 rounded becomes 1.0 * 2 = 2.0
  • 1.99 / 2 = 0.995 rounded becomes 1.0 * 2 = 2.0
  • 2.00 / 2 =  1.0 rounded becomes 1.0 * 2 = 2.0
  • 2.99 / 2 = 1.495 rounded becomes 1.0 * 2 = 2.0
  • 3.0 / 2 = 1.5 rounded becomes 2.0 * 2 = 4.0
  • 3.5 / 2 = 1.75 rounded becomes 2.0 * 2 = 4.0

Using these techniques, you can quickly convert numbers into the rounded format of your liking, regardless of the programming language you use.

AutoCAD Selection Modes

AutoCAD does a lot of things for you automatically. Unless you’re an old timer from back in the DOS days, you may not be familiar with all the options you can choose from when presented with the “Select Objects:” prompt in AutoCAD, In days of old, AutoCAD displayed all of the options on the command line when going into selection mode. There were less options back then and a lot of what happens automatically now, you had to type the options for,

Today, there’s a lot more options so AutoCAD no longer displays them unless you type an invalid entry. Even then not all the options are displayed. Many of the options now are default behavior making the options less critical in operating AutoCAD efficiently. None the less, they are often helpful. Here’s a chart of the options available. A description of each option follows. For more detailed information, you can refer to AutoCAD’s Online Help using the following link.

AliasOptionModal / Single Use
ALLEverythingSingle Use
CCrossingSingle Use
CPCrossing PolygonSingle Use
GGroupSingle Use
LLastSingle Use
PPreviousSingle Use
UUndoSingle Use
WWindowSingle Use
WPWindow PolygonSingle Use
  • Add (A) – Default mode for selection in AutoCAD. As you repeatedly pick items, they are ADDED to the selection set you are building. Stays in effect until switching to REMOVE mode.
  • All (AL) – Single use option that selects ALL objects in your AutoCAD drawing even if not displayed outside the current drawing area. Object on layers that are OFF and/or LOCKED will still be selected. Objects on layers that are FROZEN will not be selected.
  • Auto (AU) – Default mode for selection in AutoCAD. It’s combination of two other AutoCAD selection modes combined. SINGLE if you pick on an object, it will be selected. If you don’t pick on an object, BOX selection mode will be a CROSSING if the second point is to the left of the first selected point or a WINDOW selection  if the second point is to the right.
  • Crossing (C) – Single use selection mode where you pick two points to form a rectangle. Anything completely within or crossing the rectangle, regardless of the order or direction the points are picked is selected.
  • Crossing Polygon (CP) – Single use selection mode where you picks a series of points to form a polygon. Any object completely within or crossing the polygon will be selected.
  • Group (G) – Single use selection mode that allows you to type the name of a group to add the objects in that group to your selection. When specifying the names of unnamed groups, you must include the asterisk (*) prefix in the automatically assigned anonymous name AutoCAD gives it.
  • Last (L) – Single use selection mode that allows you to select the most recently added object in the drawing that’s visible, in the current drawing space and who’s layer is not off or frozen.
  • Multiple (M) – Modal selection mode used to selects objects individually without highlighting them for performance when selecting complex objects. When finished selecting objects you don’t want to highlight, press Enter and you’ll be returned to the default AutoCAD selection mode and still in the select objects prompt.
  • Object (O) – Default selection mode in AutoCAD where you select objects. Use this option to exit the SUBOBJECT selection mode.
  • Previous (P) – Single use selection that selects everything that was in the previous selection set (assuming the previous selection set wasn’t erased).
  • Remove (R) – Modal selection mode that cancels the default ADD mode to remove objects from your selection set. Most useful when it’s faster to select everything (ALL) and remove what you don’t want selected than it is to select everything you do want selected.
  • Single (Si) – In addition to being a single use selection modem, you can only select one object and the select objects prompt is terminated. If you fail to select an object in SINGLE mode, you are switched to BOX mode.
  • SubObject (SO) –  Model selection that allows you to select edges, faces, etc of complex objects. When in SubObject mode, you can no longer select Objects without using the OBJECT option to return to that selection mode.
  • Undo (U) – Single selection mode that removes the most recently added object (or objects if they were selected as a group) from the selection you’re building. Can be used repeatedly to keep removing object(s) in the reverse order they were added.
  • Window (W) – Single use selection mode where you pick two points to form a rectangle. Anything completely within the rectangle, regardless of the order or direction the points are picked is selected. Unlike CROSSING, anything that crosses the window will not be selected.
  • Window Polygon (WP) – Single use selection mode where you picks a series of points to form a polygon. Any object completely within the polygon will be selected. Unlike CROSSING POLYGON, anything that crosses the polygon will not be selected.

AGC BIM Forum & AGC BuildCon

The Associated General Contractors of America (AGC) is hosting 2 separate events in the same location.

  • BIM Forum is held a few times a year. This years theme is “Building Coordination: Expending the new standard”.
  • BuildCon 2017 is held annually. This years theme is “Lean Come to Life: The Impact of Prefabrication on the People”

Both events are being help in Dallas, TX on November 6-8, 2017 at the Sheraton Dallas Hotel. You can register for the events here.

MEP System Congestion & Complexity visibility in Revit

The Mechanical Contractors Association of America‘s (MCAA) non-profit foundation MCREF is working to release a Revit tool to help analyze and visualize complexity and congestion in a Revit model. The utility will be free and is expected to be released at the MCAA Technology Conference in Austin, TX on November 8, 2017.

It was developed in partnership with BuildingSP, a San Francisco based software company.

Click here for article or more information

Applied Software acquires long standing CADmep reseller TSI

And then there was one….

TSI – From Startup to Market Domination to Decline

Long before Autodesk acquired UK based MAP Software LTD, their products were not well known in the US. Technical Sales International (TSI) was started by some folks with a long history at QuickPen. They left and went out on their own to become the US reseller of CADduct, CADmech, CAMduct and ESTmep. It was through their efforts that what we now know as the Autodesk Fabrication product line became a major force in the market place for MEP sub-contractors.

But with all things, times change. Autodesk acquired MAP Software in the end of 2011 and soon opened up the Autodesk sales channel. This eliminated TSI’s exclusive right to sell the software in the US and other territories and many customers moved their software subscriptions to other resellers who they likely already had an existing relationship with for many of their other Autodesk products. It was Autodesk’s fragmentation of a small niche market that started TSI’s decline.

Enter Applied Software

While other resellers could now sell Autodesk Fabrication, another well establish Texas based reseller DC CADD saw an opportunity. DC CADD quickly snapped up some of the top talent as TSI downsized. DC CADD made the investment in staff and marketing and position itself well. DC CADD later re-branded itself as Enceptia as they went from regional reseller to a national player. Ultimately, Enceptia’s owner was looking to retire and sold to Applied Software.

With the market fragmentation caused by Autodesk, TSI’s owners started focusing on their own product called SysQue which runs inside Revit. This focus and their SysQue product ultimately created a conflict of interest as they were taking a different direction than Autodesk for Revit Fabrication in the MEP trades. As SysQue started to gain traction TSI’s owner’s ultimately led them to split off SysQue as a separate company and sell their stake in TSI to one of the employees. This allowed them to focus exclusively on their product and not be distracted with the requirements Autodesk places on their resellers.

An Uphill Battle Lost

Ultimately, I suspect the marketing power of Applied Software, combined with the fragmented customer base was a tough battle for TSI. The MEP market is a pretty small community where everybody knows everybody and many of the familiar names nationally and globally recognized as “Experts”, were working for Applied Software or moved over to the SysQue company (who themselves were later acquired by Trimble).

Related Press Releases:

Autodesk University 2017 Registration now open

Autodesk’s annual conference is now open for registration.  Roughly 10,000 people attend the annual gathering in Las Vegas. The Conference runs from Tuesday, November 14 through Thursday, November 16th. There are also several other “Pre Conference” conferences like the MEP and Structural Fabricators forum that are held on Monday, November 13. You can Register Here.

I’ll be speaking in 5 sessions this year. Look for them in your interested in attending any of them.

  • MEP & Structural Fabricators Forum – Las Vegas, NV / November 13, 2017
    • MSF125131 – Fabrication: 60 Tips in 60 Minutes
    • MSF125141 – Fabrication Parts in Revit: 30 Tips in 60 Minutes
    • MSF125163-L – Give Your Fabrication Database a Health Checkup
  • Autodesk University 2017 – Las Vegas, NV / November 14-16, 2017
    • CS129155 – Fabrication: 60 Tips in 60 Minutes (Repeat)
    • SD125181 – Advanced AutoLISP: From Hack to Expert


CADmep User Specific Spooling

Autodesk Fabrication CADmep does a great job of spooling. One of the issues with spooling affects companies that have their configuration located on a network resource. More specifically, if your fabrication configuration’s MAP.INI file is located in a location shared by multiple users, as each user performs spooling, you they can over write the Spooling names/numbers because they are all reading/writing to the same SPOOL.INI folder which controls spooling settings.

One of the undocumented changes you can make is to have each user point to their own SPOOL.INI file in their own folder. This avoids and conflict when multiple people are spooling at the same time. To make this change, a simple registry edit is needed. Now, editing the registry makes a lot of users nervious if they’re not familiar with such hacks, but don’t worry. This registry edit is fairly safe if you’re careful and here’s why….

  1. You’re not editing an existing setting or deleting a setting. You’re adding a new setting. If you type something wrong, your system and software simply don’t find what they’re looking for and continue on their way.
  2. There’s a few main areas in the registry, the location you make this one is user specific and tied to your Windows profile. If it gets corrupt (unlikely if you’re careful) your company IT person can create a new Windows profile for you.

So let’s get started….

Do you need this solution?

The best way to determine if you need this solution is to look where CADmep is loading your configuration from. You can do this by looking at the path for the configuration you’re using. If your configuration path lists a shared location on your network, this solution may help you. If your configuration location is on you local drive like below, this solution is most likely of little benefit to you. This path is where your configuration’s MAP.INI file is located. The MAP.INI file is what tells CADmep where all the parts of your database are located. The same folder that holds this MAP.INI file is where the SPOOL.INI file is located by default.

Your Configuration selection dialog shows where the MAP.INI is located.

Here, you can see by default, the SPOOL.INI file is located in the same folder the configuration (MAP.INI file). If you don’t see a SPOOL.INI, you’ve likely never performed spooling or your systems had already been configured. When this location is in a shared network location used by many users, they all read and write from the same SPOOL.INI folder and this can cause conflicts if multiple people are spooling at the same time.

By Default, the SPOOL.INI is created in the same folder as MAP.INI.

Changing the SPOOL.INI location

To change the SPOOL.INI location, you need to edit the registry and create a new entry. Start the Registry Editor by pressing the Windows key on your keyboard and typing “Regedit“. This will call up the Registry editor. You’ll want to navigate to the following location…

HKEY_CURRENT_USER\Software\Autodesk\Fabrication 2018\CADmep

A few things to note….

  1. The HKEY_CURRENT_USER section in the registry is very similar to HKEY_LOCAL_MACHINE. Make sure you edit the HKEY_CURRENT_USER section of the registry as the other location will not work.
  2. The HKEY_CURRENT_USER section in the registry is User specific. Edits here will work for the currently logged in user. If another user logs into Windows on the same computer, this section will need to be edited again for the setting to apply to that user.
  3. This setting is also version specific. Change the “2018” in these examples to the version your you are using. If you are using multiple versions of CADmep, you’ll want to make this change for each version.
  4. This setting is global in scope for the user who’s currently logged into Windows when you make this change. It is NOT specific to the database configuration they are using. When you redirect CADmep to a new location for it’s SPOOL.INI file, it applies for any and all configurations that this user loads in that version of CADmep.
  5. The folder you specify must already exist. It won’t be created for you. You’ll get an error when spooling if this is the case.
  6. The SPOOL.INI does not need to exist, CADmep will make a new one using it’s defaults if there isn’t one already there. If you have one already setup, you can copy it to this location and CADmep will use it.

To change the location of SPOOL.INI location, create a String Value named SpooliniFolder (this is not CaSe SeNsItIvE). A string value will show REG_SZ in the type column. In the data column, you’ll enter the path where you want this particulars user’s SPOOL.INI file. You’ll want to make sure folders are separated by double backslashes or singe forward slashes. The path should also have the ending slashes. Here’s a quick chart of valid and invalid path formats for your reference.

Local Path formatUNC Path FormatValid Path

When you are done, your registry should look like the following image.

Registry configured to redirect CADmep to a new folder for it’s SPOOL.INI.

Because CADmep read and writes to the SPOOL.INI file each time it spools, this is one of the few settings you can make that take effect immediately without having to restart CADmep. You can see the new folder and SPOOL.INI below after the chages have been made.

SPOOL.INI is now located in a new folder for the user currently logged into Windows.

Rethink what’s possible

Many of the companies I run into that do not have their MAP.INI file located on a network resource, keep it locally specifically because of issues like the spooling conflict with multiple users sharing the same SPOOL.INI. They often would like to have their MAP.INI are other setting located on a network to maintain consistently in settings and easy of support but don’t, viewing the tradeoff worth it to eliminate the spooling conflicts. If your Fabrication configuration points to a local MAP.INI, you may want to consider the above solution if Spooling conflicts was the reason for your current fabrication configuration setup.

Autodesk Fabrication Resources

I’ve posted a number of Autodesk Fabrication resources for anyone using Autodesk Fabrication CADmep, EDTmep, CAMduct or Fabrication parts in Revit. You can find them using the Resources menu or by following the link here. You can also find this same information on the site In the future, I’ll be compiling and posting additional resources that I’ve collected over the last several years in the course of administering Autodesk Fabrication databases for some large MEP firms.

Fabrication Resources…
  • History of Autodesk Fabrication build numbers for all the versions, service packs and product updates.
  • Pattern/CID Number history lists which Pattern Numbers (CID’s) are supported in which versions of the Fabrication products.
  • Revit Support history lists which Pattern Numbers (CID’s) are supported by which Revit versions.
  • CADmep command history lists which commands where added/removed from the different CADmep versions.
  • AutoLISP function history lists which versions of CADmep support which CADmep specific AutoLISP functions.
  • FabViewer command history lists the commands supported for the FabViewer in each version of Fabrication products.
  • Post Processor history lists which post processors are supported in each version and/or servicepack/update of the Fabrication Products
    • Decoiler/Coil Line Posts (DPL’s)
    • Plasma/Laser/Router/Waterjet Posts (VPL’s)