COD Script Updates – 2019.11.10

I’ve made a couple updates to the Autodesk Fabrication script libraries. If you use them, you can download updated versions from here.

Scripts Updated

  • Job Items
    • All Scripts updated to now include the Item Number which makes it easier to track back report entries to ITM’s in your job.
    • Fix a couple syntax issues in a few scripts which caused errors.
  • Revit Support Report
    • Added Reporting on Revit 2020 status
    • Changed CID/Pattern # 1175 from NO to YES.

Known Issues

End Location properties appear to be crashing 2020.1 Versions of Fabrication. Other versions may/may not crash as well.

Fabrication 2020.1 Update Released

Autodesk has released update 2020.1 for Autodesk Fabrication products CADmep, CAMduct and ESTmep. You can see the small token list of fixes here.

Really not much in the way of fixing the many legacy, multi-release defects that have been piling up. Still no word on the update to plug the security hole in Revit where you’re COST/LABOR data can be mined by others.

One thing to note about this release, it’s not an “Update” that patches your existing system. The Update requires a full install. That means that 2020 versions of CADmep, ESTmep, CAMduct as well as Tracker, CAMduct Components and Remote Entry need to be removed first.

I would NOT recommend installing the update from the Autodesk Desktop App. I’ve tested on multiple systems both personal and corporate and it gets hung indefinitely on the uninstall of the 2020 versions.

If you do want to install the update, I highly recommend uninstalling yourself before adding the 2020.1 versions. Even manual uninstalls of 2020 have been hit or miss. If they hang, they’re usually already uninstalled and using Task Manager to cancel the running MSIEXEC tasks is enough to finish the uninstalls. Best of luck!

DOS – Still Relevant

Not only is DOS still relevant, its often one of the quickest ways to get some things done.

On XtraCAD.com, someone recently asked how to get the system Date and Time in an Autodesk Fabrication COD script. I provided a solution that uses DOS commands inside a COD script. That solution is explained in more detail here.

DOS’s “Date” Command

Using DOS, we can use the “DATE” command with the “/T” Switch to output the current date to a DOS prompt.

The information given by this simple command is all we need. A script can easily read the data if the output is redirected to a data file.

We’ll get a little more ambitious and get particular on the formatting. We’ll remove the “Tue” and format the date in the format “yyyy.mm.dd”.

To do this, we can use the “FOR” command in DOS.

for /F "tokens=2-4 delims=/- " %A in ('date /T') do echo %C.%A.%B

The Red circled area is the command. It takes the data from the Date command and breaks it apart by the delimiters (DELIMS) which is spaces ( ), forward slashes (/) and dashes (-). You’ll note that the Date doesn’t actually contain any dashes so it’s just ignored.

The TOKENS specifies we want the 2nd thru 4th items of data. They will be assigned sequentially to variables starting with “%A”. The Green circled area is the resulting output ECHO’d to the DOS Window in the format we want.

  • %A = 2nd piece of data (month)
  • %B = 3rd piece of data (day)
  • %C = 4th piece of data (year)

Sending Data to a File

Now that have our DOS command, the next step is to send the output to a file on disk. Doing this will allow the COD script to read it back later.

For this purpose, we use a re-director to pump the data to a file. We simply append a suffix like this…

for /F "tokens=2-4 delims=/- " %A in ('date /T') do echo %C.%A.%B>"C:\Temp\COD Data.Txt"

A few notes about redirecting data to a file….

  1. We use double quotes around the file path and name in case it contains spaces. This way, DOS doesn’t interpret the space as a separator between commands.
  2. The Greater-Than (>) symbol is used to redirect output to a file. If the file already exists, it will be overwritten.
  3. Double Greater-Than (>>) symbols can be used to “append” to the end of an existing file. This is handy if you want to add more data to the same file. If the file doesn’t already exist, it will be created.

We Have DOS, Now for the COD Script

Now that we have our DOS syntax down, we can start writing out COD Script. To start, I typically generate a few variables that help me format things.

REM ------------------------------
REM DQ = Double Quote Character
REM CR = Carriage Return Character
REM ST = Single Tab Character
REM WF = Working File
REM ------------------------------

DIM DQ = ascii(34)
DIM CR = ascii(10)
DIM ST = ascii(9)
DIM WF = "C:\Temp\COD Data.Txt"

Because some of our syntax contains double quotes, and because strings (text) in a COD script also contain double quotes, having multiple double quotes in a row can be confusing. Additionally, sometimes the script has trouble understanding where one string ends vs what’s a string containing a double quote.

To handle this, I set a variable (DQ) that will represent any double quote within a COD Script string. I also use a Carriage Return (CR) variable and a Single Tab (ST) variable for formatting purposes that you’ll see later.

Lastly, I also set a variable for the data file. It’s at the beginning, it’s easy to find and change without having to get in the middle of a lot of confusing formatted string data later.

Executing DOS From the Script

To execute an external command from a script, we can use the EXEC function.

EXEC(<“command”>, <execution mode>, <“command data/arguments”>)

Here’s the 3 pieces of data we’ll need…

  1. <command> = “CMD.EXE”
    This is the DOS Command Interpreter
  2. <execution mode> = exec_wait + exec_show_min
    These are a couple variables that tell the external program to “Wait” until finished before proceeding with the rest of the script and to minimize the Window.
  3. <command/arguments> = The Prior DOS Syntax (with modifications) goes here.

The CMD.EXE program takes an argument of “/C” followed by the command it’s going to execute which is our DOS Syntax. Pay close attention, because here’s where we’re going to have to break up the DOS commands and embed our variables for the embedded double quotes.

The below is a single “String” with double quotes on each end. It also has a lot of double quotes inside the text which will confuse you and your script. This below syntax is WRONG and needs to be corrected….

"/C for /F "tokens=2-4 delims=/- " %A in ('date /T') do echo %C.%A.%B>"C:\Temp\COD Data.Txt""

To do this, it’s easier to illustrate in color. We’re going to take one very long complicated string, and break it into several smaller strings when there’s double quotes within the string.

That is, where ever there’s a double quote within the string, we’re going to make a smaller string before and after, and piece them back together and use our DQ variable to embed the double quote between them.

This works for the first two double quotes. But at the end of the string, we’re going to do something a little different. Here, we want to remove file name and use the WF variable we set earlier to store the file name. And because the filename may have a path, we surround it with DQ variables to embed it in double quotes.

The next piece of code should look like this when we’re done. This will run our DOS command and dump the date to a file,

REM ---------------------
REM Get Date (yyyy.mm.dd)
REM ---------------------

Exec("cmd.exe", exec_wait + exec_show_min, "/C for /F " + DQ + "tokens=2-4 delims=/- " + DQ + " %A in ('date /T') do echo %C.%A.%B>" + DQ + WF + DQ

Reading Our Data File

Now that we’ve dumped the data file to disk, we can read it back in from the COD script using the following code…

DIM myDate
Object myFile as File (WF, forinput+istext)
myDate = myFile.Readline()
myFile.Close()

This code opens the file and reads its data and saves it to a variable. You’ll also note that this code doesn’t add extra double quotes around the WF “Working File” variable. That’s because they aren’t needed here, and will in fact cause problems. The COD Script language is actually better at handling files with and without spaces because it uses a comma (,) as it’s data separator between the file name and file read modes.

Displaying Our Data

Last, we can display the data in a simple debug dialog. Here, you’ll see I make use of the ST variable to place a single tab between the data purely for formatting purposes.

Debug "Date:" + ST + myDate

The Bigger Picture

The following code takes all the above principals and goes a little further. With everything you’ve learned, you should be able to figure out what it’s doing and how. It’s doing all the same things plus a little extra…

  1. Also writing TIME and the USERNAME of the currently logged in Windows User to the data file.
  2. It’s “Appending” the TIME and USERNAME using “>>” instead of “>” that DATE uses.
  3. It’s reading 3 lines of our data file
  4. The data file is deleted after it’s read leaving our system clean of temporary files.
  5. The data is displayed by also using the CR (Carriage Return) variable to start new lines for the additional pieces of data.
REM ------------------------------
REM DQ = Double Quote Character
REM CR = Carriage Return Character
REM ST = Single Tab Character
REM WF = Working File
REM ------------------------------

DIM DQ = ascii(34)
DIM CR = ascii(10)
DIM ST = ascii(9)
DIM WF = "C:\Temp\COD Data.Txt"

REM ---------------------
REM Get Date (yyyy.mm.dd)
REM Get Time (hh:mm)
REM Get User (login name)
REM ---------------------

Exec("cmd.exe", exec_wait + exec_show_min, "/C for /F " + DQ + "tokens=2-4 delims=/- " + DQ + " %A in ('date /T') do echo %C.%A.%B>" + DQ + WF + DQ)
Exec("cmd.exe", exec_wait + exec_show_min, "/C for /F " + DQ + "tokens=1-2 delims=: " + DQ + " %A in ('time /T') do echo %A:%B>>" + DQ + WF + DQ)
Exec("cmd.exe", exec_wait + exec_show_min, "/C echo %username%>>" + DQ + WF + DQ)

REM ---------
REM Read Data
REM ---------

DIM myDate
DIM myTime
DIM myUser

Object myFile as File (WF, forinput+istext)

myDate = myFile.Readline()
myTime = myFile.Readline()
myUser = myFile.Readline()
myFile.Close()

REM ----------------
REM Delete Data File
REM ----------------
Exec("cmd.exe", exec_default + exec_show_min, "/C DEL " + DQ + WF + DQ)

REM ------------
REM Display Data
REM ------------

Debug "Date:" + ST + myDate + CR + "Time:" + ST + mytime + CR + "User:" + ST + myUser

Whole program can be downloaded here…

COD Script Updates – Part 2

I didn’t plan up updating scripts again so soon but I found a couple more undocumented properties. I thought I’d post them sooner rather than later.

The two ITM properties I found are “BOX” and “E-Tag“.

BOX is only visible from CAMduct. It’s intended purpose appears to be for specifying a “Box” for the ITM in question for shipping purposes but you could use it or anything. Despite it being visible only in CAMduct, using COD Scripts, you can read and write it from ESTmep or CADmep too.

E-TAG is visible from any of the Fabrication products. It’s used for Equipment Tags. You can see both properties from here if in CAMduct or only E-Tag is ESTmep or CADmep.

Scripts Updated

  • All Debug Scripts – Nothing major, just formatting in the comments section.
  • WriteAll_Props (Job).cod – Updated to support BOX & E-TAG properties.
  • WriteAll_Props (Library).cod – Updated to support BOX & E-TAG properties.

Scripts Added

  • Debug ITEM Box.cod
  • Debug ITEM E-Tag.cod
  • WriteAllBox (Job).cod
  • WriteAllETag (Job).cod
  • WriteAllBox (Library).cod
  • WriteAllETag (Library).cod

You can download the *current* versions here.

Scripting property reference has also been updated here.

COD Script Updates

I’ve made a couple updates to the Autodesk Fabrication script libraries. If you use them, you can download updated versions from here.

Scripts Updated

  • Debug
    • Debug ITEM Library.cod
    • Debug ITEM Sealant.cod
  • Job Items
    • WriteAllLibrary (Job).cod
    • WriteAllSealant (Job).cod
    • WriteAll_Props (Job).cod
  • Library Items
    • WriteAllLibraries (Library).cod
    • WriteAllSealant (Library).cod
    • WriteAll_Props (Library).cod

Issues Corrected

Issue 1: Scripts accessing the “Library” property were failing on CID/Pattern 2199. Scripts have been updated to watch for this and report it as an ‘Unknown‘ Library.

Issue 2: Some CID/Patterns can be configured to be pipework or duct work depending on the “Pipework” option’s “Yes/No” status. Scripts were updated to properly report or ignore this property depending on the Sealant value being present.

If the option is set to “Yes“, the pattern is a pipework item. If set to “No”, the pattern is a sheet metal item. Sheet metal items contain the “Sealant” property where as Pipework items do not.

This condition is present in the following CID/Patterns…

149838 902110112381239
12401241124212471248

Special thanks to Kyle Speropoulos of MMC Contractors in Kansas City for alerting me to this issue.

Autodesk Product Install Order

Back in the day, I briefly worked for an Autodesk reseller. This particular reseller was classified as an “Education Reseller”. In short, this meant they were one of a few resellers that sold Autodesk products into the educational market (high schools, universities etc.).

As you can imagine, a school would likely have most of not all the products. Back then, Autodesk provided a complete list of all the products and their recommended install order. Fast forward to today, they’ve either gotten incredibly lazy or in all their massive layoffs over the years, the domain knowledge is gone. I suspect both.

Autodesk’s Recommendation

Take a look at Autodesk’s current recommended install order from this link. which was last updated 6/6/2018 at the time of this writing. In the event the link changes, here’s what they say…

What’s wrong is that they tell you within the same product year, the install order doesn’t matter. This is outright false for many reasons. They try to note a couple “exceptions” stating that if there’s any add-ins, the base product should be installed first. But which products have add-ins to what other products?

CADmep is obviously running on top of AutoCAD so AutoCAD should be installed first. That seems obvious. But Navis also installs Exporters depending which products it finds and it doesn’t always show up in an Add-ins tab. So this is less obvious. Buy there’s also other dependencies that are even more obscure. Should you install Revit or Inventor? Should either go before or after 3ds Max? This is less obvious to most users.

This is really why someone would ask that question. It’s a real dis-service then to start out telling them it doesn’t matter. In fact, it matters most of the time, and it doesn’t matter as the “Special consideration”.

Determining The Real Install Order

There’s a few ways to handle this. If you’ve been around a while and had one of the old “Design Suites”, install in the same order as the Design Suite did. But note that this did change between product years and types of Suites. Plant Deign Suite 2013 for instance installed Autodesk before Revit where as Building Design Suite 2016 installed Revit before AutoCAD.

One of the other ways is to look at the install media folders to see if you can find any dependencies. Take for example 3ds Max. Look in the x86 or x64 folders and you’ll see references to Revit and Inventor.

This means we should install Revit and Inventor before installing 3ds Max. But what if we’re using both Inventor and Revit? Which of those goes first?

You’ll see the RXI folder in the install files. Hard to tell what it is. When you drill into the folder, there’s just a single MSI. If you right-click on it and select Properties and do to the Details tab, you can see it’s Revit Interoperability for Revit. Other folders deeper in the structure also confirm this by their naming,

Based on this findings, it suggests installing Revit first so Inventor can see it and install the Interoperability tools.

Here’s My Order

So, if you’re an Autodesk Fabrication user, here’s what I typically do (and why)….

  1. Revit (doesn’t seem to depend on anything else)
  2. AutoCAD (I can’t find a dependency for AutoCAD. But anything with an Object Enabler will want it here and it’s a core product so as a matter of safety, I install it early just in case)
  3. AutoCAD based Verticals like MEP, Arch, etc. (These use AutoCAD as its core. I’ve not checked dependencies between verticals but it’s likely safe to install them in any order. I usually do Arch first if I’m going to include it as MEP is built on top of Arch but it’s really not needed as MEP installs what it needs)
  4. Inventor (because of the Revit dependency covered earlier)
  5. 3ds Max (because of the Revit/Inventor dependencies)
  6. Navis – Freedom/Simulate/Manage (Navis exporters only install for products already installed so we install this toward the end)
  7. Fabrication CADmep (allows CADmep Object Enablers to install for Acad, Navis, etc.)
  8. Fabrication – EST/CAM/etc. (order doesn’t matter)

If there’s anything on the list you don’t use, just skip it. If you happen to install Navis before some of the dependent products, just use “Add/Remove Programs” in Windows Control Panel to modify the install to include new exporters or download the Exporter installs separately from Autodesk’s web site.

Fabrication 2020 Resources Updated

Resource information for Autodesk Fabrication has been updated. They now include information on the 2020 version of CADmep, ESTmep and CAMduct. In short, nothing has changed.

The FabViewer Command Reference did have one new command added. However, this was not new to the 2020 version. The CADmep 2019.1 update added a command which was missed previously.

Pages that were updated are the following…

Autodesk Fabrication: Best Practice #10

Don’t use Ancillaries with Breakpoints inside an Ancillary Kit.

Ancillaries are virtual items you can add to your Fabrication configuration. ESTmep users use Ancillaries to help quantify cost and labor. Material quantification for purchasing and/or fabrication is another use for Ancillaries. These are virtual items because they typically don’t affect modeling or coordination. They aren’t even typically drawn yet they are critical to your fabrication as a purchased, fabricated or installed item.

Database view of an Ancillary entry

At times, you many need multiple Ancillaries associated with an item. However the fabrication software typically only allows you to assign a single ancillary to an item or database entry like a connector. For this reason, Autodesk Fabrication includes a type of entry called an “Ancillary Kit” in which you place multiple Ancillaries.

These Ancillary Kits are where you can group multiple Ancillaries that are often used together. A Bolt, Nut and Washers are a good example of an Ancillary Kit.

Database view of an Ancillary Kit entry

Ancillary / Kit Breakpoints

Often, Ancillary items are defined by the size of the item they are associated with. As an example, a flange gasket would be different depending on the type and size of flange it’s used with. You can configure an Ancillary to have Breakpoints to reference a different parts depending on the size of the item the Ancillary is associated with.

Database view of an Ancillary with Breakpoints

Just like Ancillariess, an Ancillary Kit can also have Breakpoints. Using a flange as our example again, depending on the type and size of a flange, or what it’s connecting to (another flange, valve, pump) it can have different bolt/nut sizes and quantities. You would manage this using an Ancillary Kit with Breakpoints.

Database view of an Ancillary Kit with Breakpoints

Nested Breakpoints

If you watched the example images closely, you can see Autodesk’s own database breaks this Best Practice rule. The rule is to never add Ancillaries that use Breakpoints to an Ancillary Kit. Here’s how to keep that straight…

  • Yes – Ancillary in Ancillary Kit
  • No – Ancillary w/Breakpoints in Ancillary Kit
  • Yes – Ancillary in Ancillary Kit with breakpoints
  • No – Ancillary w/Breakpoints in Ancillary Kit w/Breakpoints

I’ve not tested Autodesk’s configuration for reporting accuracy. I have enough work managing my own fabrication configuration. However I did create a sample of my own and submitted to Autodesk support. After demonstrating inconsistent results with my sample, their recommended guidance was not to use Ancillaries with Breakpoints in an Ancillary Kit.

Based on testing in other data sets, I would say this is sound advice. Even if you can get it to work, the setup and configuration is less intuitive and confusing. Your Ancillary Kit can reference different Ancillary types using different Breakpoint criteria. The Ancillary Kit could also have conflicting Breakpoint criteria (e.g. Length x Width vs Diameter) compared to the Ancillary.

Keeping this Best Practice can create more Ancillary entries as well as make building Ancillary Kits a little more time consuming. But the results will be more predictable and what’s really happening in your configuration will be more obvious and less obscure. Even where Breakpointed Ancillaries do function within an Ancillary Kit, it’s advised to avoid this where possible.

Autodesk Fabrication 2020 Installer Issues

If you use network licenses or create network deployments of CADmep, CAMduct or ESTmep you may encounter errors. Autodesk incorrectly pathed the Network License Manager files in the SETUP.INI files.

Even if you are using Stand Alone or User Based Subscription licenses but build Network Deployments, if you configure the deployment to include all components in the deployment (recommended if you plan on modifying the deployment later) you can encounter errors.

To correct the errors, you can replace the SETUP.INI files that are part of the installation with the ones provided in the following ZIP file…

Before you overwrite your installation’s SETUP.INI file, it’s a good idea to backup the original. The root of my installation folder looks like this…

At some point, I would expect Autodesk will update their download data and provide the proper files. Because of this, I would highly recommend NOT replacing the SETUP.INI files unless you encounter issues.

What’s Different?

If you’re curious what’s different between the two, you can open the INI files in Notepad or other text editor and view them there.

The original file contains this at the end of one of the entries…

Third-Party Component Open Source EULAs:x64\en-US\Tools\NLM.msi

The new SETUP.INI files have updated it to this…

Third-Party Component Open Source EULAs:x86\AdskLicensing\NLM\x64\NLM.msi

Fabrication – Attacher Tip #2

Here’s another simple Attacher tip for Fabrication products. If you hold down the Shift key while clicking on the Attacher arrow in CADmep, ESTmep or CAMduct,. the arrow rotates the opposite direction.


Clicking the Attacher – Notice it Rotates in the “Clockwise” Direction

Clicking the Attacher – Notice it Rotates in the “Counter-Clockwise” Direction