Archive | CAD Management RSS for this section

Spring FLUG!



FLUG offers you the opportunity to make connections with industry peers, exhibitors, and even your own colleagues from other offices to solve a problem you recently encountered?

Engage in hands-on, face-to-face instruction with Industry experts who have faced similar challenges to yours.

  • Explore the many new product capabilities you aren’t using yet to determine how you can take advantage of them
  • Glean best practices and insider tips and tricks to create new efficiencies in your workflows
  • Collaborate with developers to extend the use of your software

For over 25 years, FLUG one of the countries longest running and most successful Users’ Conference and Training Events, offers you the tools to best leverage your software to better meet your strategic objectives, make the most of your resources, and stay ahead of your competition.

Check out our Agenda:

Visit our website, Under the Main Menu portion of the webpage you will find a link to for the current Spring Agenda. A few highlights include….

  • Tips and Tricks in MicroStation V8i
  • DWG Interoperability with MicroStation V8i
  • Point Clouds
  • AECOsim Building Designer
  • Bentley Navigator
  • Corridor Modeling
  • Autodesk Revit Architecture
  • Civil 3D Plans Production
  • GEOPAK Terrain

How do I register to attend FLUG?

That is easy, visit our website, Under the Main Menu portion of the webpage you will find a link to both the current Spring Agenda and to Registration. Click the Registration link and follow the guided registration process.

Hotel Information:
Radisson Resort at the Port
8701 Astronaut Blvd.
Cape Canaveral, FL 32920 Phone: (321) 784-0000 Visit us at The Radisson is using a new online registration system to reserve your discount FLUG rooms. For the FLUG Government Rate (ID required at check in) please use the following link, For the FLUG Non Government Rate please use the following link,

Upgrade or Re-write and Tech Manager Overload

by Mark Stefanchuk,

I have been working with an old MDL application that needs to be upgraded from MicroStation version 8.5 to the latest release. Ideally, I might want to re-write this app using the latest development tools so I can take advantage of the latest IDE, more easily integrate with supporting systems, and better support future maintenance efforts. As a technology manager however, there are other things to consider like training, testing, and deployment. If I keep the application within the MDL framework I eliminate end user re-training. This means the users are up and running as soon as you deliver the updated application. Testing and deployment issues on the other hand will still exist. But, if I just update the MDL I can keep the deployment the same and focus the testing on only the features that have been changed or fixed. I might also add some regression testing to check for the unexpected.  The result though, is less time spent and users are up and running sooner than later.

So, when would I re-write? If I have a choice and the technology doesn’t force the re-write then it would happen after I have satisfied the basic end user workflow with an upgrade. This assumes of course that I have the bandwidth on my team to support the re-write effort. Which leads me to another issue – tech manager overload.

Many of us work on our own, we don’t have a team. We develop, train, support, and configure. And, often we’re expected to design too! There’s no time during the work week to do the things that will make you a better technology manager, or make your CAD system perform better. To that I say, then you need help. And typically I get back, yes, but I’m not going to get it.

Really? Some of you will never be convinced, but for those who might I have a recommendation. Document all of the things you do on a day-to-day basis, and even those things you do weekly, monthly, or only a few times per year. Put time estimates to each of these tasks and account for where your time is spent during the week. You will see immediately if you have too much work to do. You will likely identify things you do that should be done by someone else, and things that simply aren’t important. Share this with your boss.

I can’t tell you how many times I’ve had the boss of a tech manager say they had no idea that he/she was doing that much work. But, I work hard, everyone says so. Sure, but they think they work hard too, and frankly they don’t really care until they don’t get what they want. That sounds harsh, but it’s human nature. The reality is that they don’t know how much you have to do for them. This includes your boss.

There are a number of reasons workload increases. One of the main causes is that we agree to take on tasks and responsibilities that add to that daily workload without any oversight or governance. We never ask if the new feature, process, or technology being requested adding value to our business or is it just a nice to have? And, we don’t look at how the new technology will impact our workload. We never, or rarely say no. We just do it, because for some reason we just assume we’re suppose to, it makes us feel good to help, be the hero, or worse, we assume someone else is keeping track of how much work we’re doing. I can assure you, if you aren’t telling anyone, no one knows.

It’s up to you to keep track and apply some system oversight. You’re the technology manager – ask why implementing the users request is important and have a good understanding of how it will impact your workload. Don’t just do it. Have a plan to support and maintain the request even if it seems small. And, share with your boss. Some bosses are just bad bosses – get a new job. But, most are reasonable and will get you the resources you need to effectively support your end users. They can only do that if they have visibility into your workload. Show them how much you are expected to do and you will get help.

About Mark Stefanchuk:
 Mark is a VP and senior consultant with CAD Management Resources, Inc. He divides his time between developing innovative custom software solutions and helping clients navigate complex design automation environments. If you would like to find out how he can assist you with your design technology he can be reached by contacting us at

Did Google Miss an Opportunity?

by Mark Stefanchuk,


I think this is interesting – Google has announced its next Pwnium hacking contest and they are offering $3.14159 million in prize money. I read this first on The Register. It’s awesome, right? Nerdy prize money for a nerdy contest. But get this, the contest date is set for March 7th. Huh? Why not March 14th? I guess this only makes sense in the U.S. and Canada where we start our dates with the month first (elsewhere they start with the day first), but still, 3.14. How could you resist? If I were the marketing lead I think I would have had to insist on March 14. Maybe there’s still time to reschedule. Know anyone at Google? Let them know that they should change the date. (Thanks to my friend Patrick who recently pointed out that March 14th should be national pie day.)

CADpilot – Key-in Window (MicroStation)

by Lorrie Mattor,

Do you prefer keying in a few shortcuts over clicking on menu items?  Then CADpilot’s Key-In functionality is just for you!

The CADpilot key-in window is used primarily to issue menu and button shortcuts but may also be used to issue MicroStation commands.

To bring up the key-in window, select the “\” (backslash) key.

Note:  For the CADpilot key-in window to load with the “\” key the current View needs to have focus and the Dialog With Focus 

icon is activated.  



Type the command shortcut into the Textbox and then select the Enter button.





CADpilot menu or button shortcuts require the “\” (backslash)

Standard MicroStation commands are executed without the “\” (backslash).


Lorrie is a Technical Consultant for specializing in CADpilot integration, system’s analysis, technical writing and data manipulation.

Managing Usability

by Mark Stefanchuk,

[Update: Be sure to check out Kim’s comment – a great alternative using the F1 key and choose none. Thanks Kim!]

I’ve been debating whether or not to share this with my MicroStation peeps. I hesitate because I don’t like to admit that sometimes I don’t adjust to change as quickly as I should, but also because this example has some conflict with features in MicroStation V8i that we wouldn’t introduce normally, especially if we don’t have to. What am I talking about?

Earlier this year I was working with a client helping them upgrade from MicroStation 2004 to V8i SS2. Not as big of a jump from V7 to V8, but big enough. Things were missing and commands didn’t work the same way. Years ago we could rely on commands that were in the previous version to work the same way in the new version. Today, it’s not that way. And seriously, there are good reasons for change, like productivity gains. I’m all for that. In this case however, it was clear that the user base missed some of the key operations that made MicroStation, well MicroStation and not AutoCAD.

For example, in older versions of MicroStation when you were done with a selection created using power selector you would use the right mouse button to deselect (reset). In V8i you just use the right mouse button (a datapoint in the view). That’s seems pretty easy. But if you have been drafting for years using the same workflow not being able to use something so simple as the reset button to deselect a selection set can be really frustrating.

Now, I was the consultant and I really wanted my client to be happy so I fixed it. I built an MDL application that would watch for reset. When the user clicks reset any active selection set would be removed. The command is very primitive, but I thought I would share in case you might have a similar issue. There’s not much to it – comments below.

#include    <mdl.h> 
#include    <tcb.h> 
#include    <dlogitem.h> 
#include    <dlogids.h> 
#include    <rscdefs.h> 
#include    <mdlerrs.h> 
#include    <userfnc.h> 
#include    <global.h> 
#include    <mselems.h> 
#include    <accudraw.h> 
#include    <cexpr.h> 
#include    <math.h> 
#include    <string.h>

#include    "ps_resetcmd.h" 
#include    "ps_reset.h" 
#include    "fdf.fdf"

int goFlag; // a flag to watch for active commands that might conflict
// the event watcher
Private int monitorQueue ( Inputq_element *queueElementP ) 
    char sCmd[256];         
    sprintf(sCmd, "%S", mdlState_getCurrentCommandName());     

    // Element Selection Active     
    if (strcmp(sCmd, "Element Selection") == 0)
        goFlag = 0;  

    // a quick a dirty way to watch for active command - be careful with upgrades because this might not be
    // supported in the future. - not very elegant but it works - I'm a little bull headed that way.
    if ((strcmp(sCmd, "Dimension Element") == 0) || (strcmp(sCmd, "Dimension Linear Size") == 0) 
        ||   (strcmp(sCmd, "Dimension Angle Size") == 0) || (strcmp(sCmd, "Dimension Ordinates") == 0) 
        ||   (strcmp(sCmd, "Change Dimension") == 0) ||   (strcmp(sCmd, "Drop Dimension Element") == 0)
        ||   (strcmp(sCmd, "Dimension Size Perpendicular to Points") == 0) ||   (strcmp(sCmd, "Dimension Diameter") == 0) 
        ||   (strcmp(sCmd, "Label Point Coordinate") == 0) || (strcmp(sCmd, "Dimension Symmetric") == 0) 
        ||   (strcmp(sCmd, "Dimension Half") == 0) || (strcmp(sCmd, "Dimension Chamfer Angle") == 0) 
        ||   (strcmp(sCmd, "Dimension Diameter Perpendicular") == 0) || (strcmp(sCmd, "Dimension Radius (Extended Leader)") == 0) 
        ||   (strcmp(sCmd, "Place Center Mark") == 0) || (strcmp(sCmd, "Dimension Radius") == 0) 
        ||   (strcmp(sCmd, "Dimension Arc Distance") == 0))  
        goFlag = 1; // the active command is a dim command so dont deselect on reset
       goFlag = 0; // ok to reset - conflict mitigated  

    // user clicked reset and conflict minimized so go for it
    if (queueElementP->hdr.cmdtype == RESET)  
        if (goFlag == 0)    
            mdlInput_sendKeyin ("powerselector deselect", 0, 0, NULL);
    return INPUT_ACCEPT;

// command entry
int main () 
    RscFileHandle   rfHandle;  
    goFlag = 0;

    mdlResource_openFile (&rfHandle, NULL, FALSE);

    if (mdlParse_loadCommandTable (NULL) == NULL)  
        mdlOutput_rscPrintf (MSG_ERROR, NULL, 0, 4);

    mdlInput_setMonitorFunction (MONITOR_ALL, monitorQueue);
    return  SUCCESS; 

The conflict was created by sending a command, i.e. powerselector deselect, when commands that you didn’t want to terminate using reset were active – like dimension commands. The easiest way to work around this was to set a flag. If one of the dimension commands is active then don’t deselect on reset. The code and compiled is on Put the ma in your mdlapps folder so it will load when MicroStation is loaded. You can also use the keyin mdl load ps_reset to load this app.

About Mark Stefanchuk: Mark is a VP and senior consultant with CAD Management Resources, Inc. He divides his time between developing innovative custom software solutions and helping clients navigate complex design automation environments. If you would like to find out how he can assist you with your design technology he can be reached by contacting us at

CAD Management – Resource Style

by Mark Stefanchuk,

Seth and I have been a somewhat focused on resources lately, but for good reason. Things like layers, blocks, and styles (lines, dimensions, tables) are assets that are created and recreated from project to project and it seems like this is a bit of extra work.

Of course we can use templates and standards, but there always seems to be a page setup or table style missing – one that we created for a project we were working on just last week. And boy wouldn’t it be great if I could get all of those things with a quick click.

The import of many of these assets is pretty straight forward code wise, so I’m going to “give away the store” (or just a small portion of the store) and show you how you can do this yourself. I’ll then introduce you to our next Exchange App that we expect will be ready by the end of November.

In this example I’m going to show you how to get text styles from an external DWT, DWS, or DWG file (the sourceDb) and bring these into the current DWG (the destDb). We will use VB.Net. Here’s the code listing. Comments embedded.

'use the following: 
Imports Autodesk.AutoCAD.Runtime 
Imports Autodesk.AutoCAD.ApplicationServices 
Imports CADAPP = Autodesk.AutoCAD.ApplicationServices.Application 
Imports Autodesk.AutoCAD.DatabaseServices 
Imports Autodesk.AutoCAD.EditorInput 

'string library_path => the file spec of the source dwt, dws, or dwg file 
'DuplicateRecordCloning clg => Replace or Ignore - how to handle text styles with the same name 
Private Sub cmr_getTextStyles(ByVal library_path As String, ByVal clg As DuplicateRecordCloning)
'connect to current database
Dim dm As DocumentCollection = CADAPP.DocumentManager
Dim doc As Document = dm.MdiActiveDocument
Dim ed As Editor = dm.MdiActiveDocument.Editor
Dim destDb As Database = dm.MdiActiveDocument.Database
Dim sourceDb As Database = New Database(False, True)

    Using dl As DocumentLock = doc.LockDocument()
    'connect to the external dwt, dws, or dwg
    sourceDb.ReadDwgFile(library_path, System.IO.FileShare.Read, True, "")

    'create a container for our text styles
    Dim textsToClone As ObjectIdCollection = New ObjectIdCollection()
    Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = sourceDb.TransactionManager

    'start a transaction with the external drawing
    Using tr As Transaction = tm.StartTransaction()

        'get the text style ids
        Dim ldt As TextStyleTable = TryCast(tm.GetObject(sourceDb.TextStyleTableId, _
            OpenMode.ForRead, False), TextStyleTable)

        'save the ids in an object collection
        For Each txtID As ObjectId In ldt

        ' Add text styles to the current drawing
        Dim mapping As IdMapping = New IdMapping()
        sourceDb.WblockCloneObjects(textsToClone, destDb.TextStyleTableId, mapping, clg, False)
        'commit the sourceDb transaction (even for read)
    End Using
End Using
Catch ex As Autodesk.AutoCAD.Runtime.Exception
End Try
End Sub

You can use this same pattern for dimension styles, multi-leader styles, table styles, line types, and page sets. Layers, and blocks are similar but require some extra effort.

So, what about that next app? Seth and I have been working on a new app for Autodesk Exchange and expect to have it published shortly. So, if you don’t want to tackle importing resources yourself then you can download our version. DWG Resource Importer consolidates these operations into a convenient palette allowing you to quickly import resources from templates, standard files, and drawing files. Here’s what you can expect to see.

Select the resources to import – layers, blocks, line styles, dimension, and more…

Import the resources and if you want to refer back to the report later you can save it.

There’s no reason anyone on your team should have to recreate resources from project to project. Whether you develop your own import palette or use one like DWG Resource Importer your team will save production hours.

About Mark Stefanchuk: Mark is a VP and senior consultant with CAD Management Resources, Inc. He divides his time between developing innovative custom software solutions and helping clients navigate complex design automation environments. If you would like to find out how he can assist you with your design technology he can be reached by contacting us at

Multiple Resources (AutoCAD)

by Mark Stefanchuk,

Seth’s last blog, Resources Resources…, was great! In particular this bit of information really caught my attention.

The Files tab lists the folders that AutoCAD will use to search for resource files (a.k.a. Support Paths), drivers, CUI files, tool palettes, and so on.  There are also user-defined settings such as the  dictionary file used for checking spelling.  Paths are searched in the order that they are listed in the Options dialog box, and if the same file exists in different folders, the first instance found is used.

Ok, so that got me thinking. How do I know if there is more than one file with the same name in my paths folders and is the file I want loaded in the right place? My first thought was to just look in each folder and see if there are duplicates. But, turns out there are a lot of files in these folders. I’m going to need a better way. I could write a vb script to look in each support folder and compare all of the files dumping the results to some output file, but I kind of want to be able to debug my profile folders when I’m in AutoCAD. To do that we will need a different approach.

I decided to build a plug-in. If you’re not familiar with .Net plugins for AutoCAD check out Autodesks “My First Plug-in” tutorials. Really well done. You don’t need the wizard, and you can find the AutoCAD references in the AutoCAD program files folder. There are a lot of on-line tutorials for VB.Net or C# – either programming language can be used to create an AutoCAD plugin. I’ll let you do your own googling to find what you need.

Here are some pointers for getting the support file information from AutoCAD. We will start by just figuring out what our support files are.

Your class will need to reference and Import the following:

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Interop

In your class you will need a new command to show the support paths.

<CommandMethod("SHOWSP")> _
Public Shared Sub ShowSupPaths()
    Dim acadApp As AcadApplication = Application.AcadApplication
End Sub

Compile this to create a dll that you can netload (just like in the plug-in tutorials). After you netload you can use the command SHOWSP which will display a message box similar to this one.

It’s not very pretty and you can find the same information using the built in OP (options) command. So, what we really want is to get a list of file names from each folder and then compare them to one another to see if they show up more than once. What can we do? The first thing to notice is that the support paths are separated by a semi-colon. That gives us a way to “split” the string into an array of folders. We can then use System.IO to get directory info which we can use to list the file names. Something like this…

Dim sPaths() As String
sPaths = acadApp.Preferences.Files.SupportPath.Split(";")
For Each s As String In sPaths
    Dim di As DirectoryInfo = New DirectoryInfo(s + "\")
    For Each f As FileInfo In di.GetFiles()

In this example I have added the file names to a list box. You can loop through the list items to check for duplicates and output to another list box. I took it a step further and built a Palette. In the top panel I added a tree view so that I have a way to step though the folders and files. In the bottom panel I list the files that show up more than once.

I also added a double click feature to open a window and select the file in the folder it resides in so that I have a quick way to compare files. Finally, I decided to add an extension filter so that I can debug just cuix, or lsp files.

We’re looking into posting this on the Autodesk Exchange. So, if you don’t want to dig deeper and try to write it yourself I hope to have this submitted and available in the next few weeks.

About Mark Stefanchuk: Mark is a VP and senior consultant with CAD Management Resources, Inc. He divides his time between developing innovative custom software solutions and helping clients navigate complex design automation environments. If you would like to find out how he can assist you with your design technology he can be reached by contacting us at