Update (2021-01-03): I've written more on BeckerCAD, and why you probably shouldn't buy it. Go read the sequel.
Occasionally I run into an interesting piece of software while doing unrelated things, and this time I stumbled upon a Windows-only “BeckerCAD 12 3D Pro” application on sale in SoftMaker store, a company developing the blazing fast Linux/Windows/Mac OS X SoftMaker Office suite, and a free FreeOffice version of one.
I like Google Docs as much as the next guy, but sometimes I enjoy looking at what else is out there. So I bought a license to the office suite that I’ve had my eyes on for some time, and put a $20 BeckerCAD12 3D Pro in the cart along for the ride.
BeckerCAD’s installation process suggested installing it into a folder at the root of the drive, and there’s a reason for that - this application does not respect the non-writable nature of modern “Program Files” folder, so it suggests using a location that is not locked down.
Since I tagged this post as “the hard way”, I did not go that default route.
BeckerCAD is a 32-bit Win32 program, so it should really be installed into
Program Files (x86). With this change, the installation proceeds as expected, but you get a slew of error messages related to inability to creating files (including a Python stacktrace), reading files, initializing DLLs, etc on startup.
Based on SysInternals ProcessMonitor, throughout its runtime, BeckerCAD writes data to:
%ProgramFiles(x86)%\BeckerCAD12\Program\Database\* %ProgramFiles(x86)%\BeckerCAD12\Program\Python\Lib\site-packages\win32com\gen_py\* %ProgramFiles(x86)%\BeckerCAD12\Program\Python\Lib\site-packages\win32com\gen_py\dicts.dat %ProgramFiles(x86)%\BeckerCAD12\Program\Python\CADdyPython.log %ProgramFiles(x86)%\BeckerCAD12\Program\Bin\webBrowser.MES %ProgramFiles(x86)%\BeckerCAD12\Program\Bin\startAssistent.MES %ProgramFiles(x86)%\BeckerCAD12\Program\Bin\Buildings.MES %ProgramFiles(x86)%\BeckerCAD12\Program\Bin\CADdyWebExport.MES %ProgramFiles(x86)%\BeckerCAD12\User\TMP\* %ProgramFiles(x86)%\BeckerCAD12\User\UIBECKER.SYS
I did not like how it wrote to those folders, especially the
Program\Bin one. Even though the binary was compiled in 2019, it was using practices from pre-2007 era, when Windows Vista introduced restrictions on applications writing to their installation folder within Program Files. Now, by default, the installer would have put this application in the root folder, which is exempt from these restrictions, but I still felt uneasy granting the application access to overwrite whatever it wants in its installation directory. That’s how random corruptions happen.
When Microsoft restricted access to Program Files on Windows Vista, they created UAC Virtualization. This enabled 32-bit Win32 applications to work as expected even with restrictions in place, because Windows would redirect writes to the files into
Now, Becker3D 12 Pro is a 32-bit application. Why doesn’t it get redirected?
UAC Virtualization document states:
The presence of the trustInfo element in a manifest (which you can see in the excerpted string dump of Firewallsettings.exe below), denotes an executable that was written for Windows Vista and the requestedElevationLevel element nests within it.
Targeting your application for Windows brings additional details:
Adding trustInfo isn't essential, but it is highly recommended, even when your app doesn't need any particular UAC-related behavior. In particular, if you don't add trustInfo at all, then 32-bit x86 versions of your app will be subject to UAC file virtualization, which allows writes to administrator-privileged folders like the Windows system folders to succeed when they would otherwise fail, but redirects them to a user-specific "VirtualStore" folder.
Okay, let’s look at the manifest. mt.exe is a binary from Windows SDK that deals with manifests, extracting the manifest from BeckerCAD.exe shows:
> & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\mt.exe' -inputresource:"C:\Program Files (x86)\BeckerCAD12\Program\Bin\BeckerCAD.exe" -out:.\Projects\BeckerCAD.exe.manifest -nologo
<!-- .\Projects\BeckerCAD.exe.manifest --> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="126.96.36.199" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> </assembly>
So the application declares that it does not explicitly need to run as administrator (
level="asInvoker"), yet it needs to write to its installation directory. The manifest also does not pass validation because it is missing
> & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\mt.exe' -manifest .\Projects\BeckerCAD.exe.manifest -validate_manifest -nologo .\Projects\BeckerCAD.exe.manifest : general error 10100ba: The manifest is missing the definition identity.
mt.exe is a tool for updating the manifest in the resources, so I added the missing identity information, dropped the
trustInfo node and attempted to update the configuration.
<!-- Updated .\Projects\BeckerCAD.exe.manifest --> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="BeckerCAD" version="2019.0.0.1" processorArchitecture="x86"> </assemblyIdentity> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="188.8.131.52" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>
> 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\mt.exe' '-updateresource:.\Projects\BeckerCAD.exe;#1' -manifest .\Projects\BeckerCAD.exe.manifest
Unfortunately for me,
mt.exe does a merge of the existing manifest and the incoming one, so I kept getting trustInfo in the final binary. Eventually I realized I needed to edit the original resource, so I opened the binary in Visual Studio and updated
RT_MANIFEST entry to remove
trustInfo node completely, then did the
updateresource described above to have a new shiny manifest that passes validation.
I put the updated binary into
Becker3D12\Program\Bin, started it, expecting things to blow up spectacularly, and instead I got a fully working application, and
%APPDATA%\VirtualStore showed all the redirected files.
However, upon exit, I got an exception that
UIBECKER.SYS could not be opened.
UIBECKER.SYS was not being redirected, and that file contains UI configuration. Ideally, it should have been written to the User folder, but I have a suspicion there’s a filter in VirtualStore that does not allow redirection of SYS files, which is an extension used for device drivers.
BeckerCAD documentation suggested that this file gets created either in User directory or in a working directory of the application, based on this quote from “Installing the current version in a folder of an earlier version” help section:
Erase the files containing general defaults for the user interface:
These are in ...USER or in the directory which you specified as the working directory, when you connected the program.
%APPDATA%\BeckerCAD12 folder and changing the shortcut to use it as a startup directory made the application write
UIBECKER.SYS into a non-redirected folder in my profile.
However, launching the application by opening .mod files would still trigger the error on exit.
It turned out that the registry entries for opening .mod and .tpl files that the installer planted in my Windows registry had a
-HOME parameter which was hardcoded to the User location in my Program Files, so I needed to change that as well. You can’t use environment variables in
REG_SZ field, so I had to craft a .reg file with
REG_EXPAND_SZ which used
%APPDATA%\BeckerCAD12 as a
HOME parameter, and it worked.
Windows Registry Editor Version 5.00 ; This sets all open commands to ; "C:\Program Files (x86)\BeckerCAD12\Program\Bin\BeckerCAD.exe" "-HOME:%APPDATA%\BeckerCAD12" "%1" ; %APPDATA%\BeckerCAD12 must exist before the program can use it [HKEY_CLASSES_ROOT\CADdy++ Maschinenbau MOD\shell\open\command] @=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,\ 00,46,00,69,00,6c,00,65,00,73,00,20,00,28,00,78,00,38,00,36,00,29,00,5c,00,\ 42,00,65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,31,00,32,00,5c,00,50,\ 00,72,00,6f,00,67,00,72,00,61,00,6d,00,5c,00,42,00,69,00,6e,00,5c,00,42,00,\ 65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,2e,00,65,00,78,00,65,00,22,\ 00,20,00,22,00,2d,00,48,00,4f,00,4d,00,45,00,3a,00,25,00,41,00,50,00,50,00,\ 44,00,41,00,54,00,41,00,25,00,5c,00,42,00,65,00,63,00,6b,00,65,00,72,00,43,\ 00,41,00,44,00,31,00,32,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00 [HKEY_CLASSES_ROOT\CADdy++ Maschinenbau MOD\shell\Open with BeckerCAD - 32 Bit\command] @=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,\ 00,46,00,69,00,6c,00,65,00,73,00,20,00,28,00,78,00,38,00,36,00,29,00,5c,00,\ 42,00,65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,31,00,32,00,5c,00,50,\ 00,72,00,6f,00,67,00,72,00,61,00,6d,00,5c,00,42,00,69,00,6e,00,5c,00,42,00,\ 65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,2e,00,65,00,78,00,65,00,22,\ 00,20,00,22,00,2d,00,48,00,4f,00,4d,00,45,00,3a,00,25,00,41,00,50,00,50,00,\ 44,00,41,00,54,00,41,00,25,00,5c,00,42,00,65,00,63,00,6b,00,65,00,72,00,43,\ 00,41,00,44,00,31,00,32,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00 [HKEY_CLASSES_ROOT\CADdy++ Maschinenbau TPL\shell\open\command] @=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,\ 00,46,00,69,00,6c,00,65,00,73,00,20,00,28,00,78,00,38,00,36,00,29,00,5c,00,\ 42,00,65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,31,00,32,00,5c,00,50,\ 00,72,00,6f,00,67,00,72,00,61,00,6d,00,5c,00,42,00,69,00,6e,00,5c,00,42,00,\ 65,00,63,00,6b,00,65,00,72,00,43,00,41,00,44,00,2e,00,65,00,78,00,65,00,22,\ 00,20,00,22,00,2d,00,48,00,4f,00,4d,00,45,00,3a,00,25,00,41,00,50,00,50,00,\ 44,00,41,00,54,00,41,00,25,00,5c,00,42,00,65,00,63,00,6b,00,65,00,72,00,43,\ 00,41,00,44,00,31,00,32,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00
Okay, What About The App Itself?
Back in the university, I had a Technical Drawing course which required us to draw things on paper to start, and then somehow learn a CAD tool, heavily hinting towards Autodesk’s AutoCAD. When introduced to that piece of software, I felt completely out of my comfort zone because everything worked in a way that I did not expect. It wasn’t a tool you pick up and run with. I resorted to using OpenOffice Draw to create printable drawings, and then migrated to QCAD. For some minor 3D explorations I’ve only ever used Blender, which was, and still is too powerful for me, so I am definitely not a power user of any CAD package.
BeckerCAD by Markt+Technik Verlag GmbH appears to be a rebranded CADdy++ “basic” application by DataSolid, who also sells an “economy”, and “Mechanical Design Professional” variants, that are much more expensive, and that’s the first advantage of BeckerCAD, the cost. The documentation covers all items I’ve search for, however the English localization suffers from numerous translation issues where words are technically correct, but a native spearker would not have used them in such context. If you speak German, then you are likely to find the German version top be perfectly fine. “Determine a line object” is “Select a line object”, and “Dimensions [...] are displayed lowlighted” is “dimensions [...] are greyed-out”.
Another thing is that the icons are not distinct enough. While there aren’t colorblind issues that blocked me, there are icons that look almost the same that do different things.
Tooltips are also unhelpful e.g. in the Model Explorer an icon with a “Hidden Lines” tooltip means setting the type of the currently selected layer to “Hidden Lines”, and you need to go into documentation to realize that.
Who Is It For?
Neither CADdy++ nor BeckerCAD are in any way popular on the internet. I found a German CAD.de forum, where people were discussing CADdy++, a few YouTube videos by DataSolid describing CADdy++, and a small set of third-party tutorials, so your best reference will most likely be the example projects bundled with the package. Educational content about SolidWorks, AutoCAD, FreeCAD, TurboCAD, CorelCAD, Onshape, Siemens NX, and SketchUp (which I also tried) dwarfs BeckerCAD. To be fair, all packages above except FreeCAD also cost more, but it is important to consider what capabilities you will get. BeckerCAD is a traditional non-parametric CAD, while more expensive editions of CADdy++ support parametric modeling, and other packages also support direct modeling.
The majority of CAD applications are now licensed via subscriptions. Solidworks, AutoCAD and other Autodesk apps, SketchUp, Siemens NX, are all subscription-only. BricsCAD has both a subscription and a perpetual license starting from $560 for a 2D version. IronCAD pricing is not disclosed on their website, which is a red flag. A tinkerer who needs a CAD for occasional use but does not want a recurring subscription might want a cheap (or with FreeCAD, a free) alternative.
BeckerCAD requires an Internet access to activate the application, which will become a problem when the activation servers go offline. There’s also no quick way to unbind the license from an offline computer, which may be a problem in case the device gets stolen or becomes inoperable because of hardware failure. I got a license for 3 computers, which is nice.
Can you use it to make 2D drawings and 3D models? Yes, definitely. A follow up blog post will tell a story of the thing on the right once I get the latest version printed in the local 3D print shop. It took me a week to go through tutorials, a day to create the design, a day to get the first 3D-printed version, and another day to figure out why my measurements were slightly off... well, we’ll see how it goes with my second attempt.
Once you learn the basics, and learn to consult the manual heavily, the layout becomes usable, operations start making sense. It handles 2D and 3D drawings and solid operations, at least to my eye, albeit with visible screen repaint events in 2D mode. It stores data in its own proprietary .mod format, but can export and import ACIS SAT files, STL files, and claims support for DWG files. I did not have any, so I looked up Autodesk sample files, and the conversion produced the drawing.
The fonts were definitely an issue, however even Autodesk’s online viewer complained their Gear_Pump_Subassy.dwg sample was missing fonts:
It can also create a web page for your model.
It does not have constraints support or model animation, and promotional images do not match renders you get in 3D. There is no simulation for material properties, or direct modeling in 3D, but it is likely that the user of this package is not looking for all that. I would like some sort of unwedging the models from one another as part of collision checks, but for now I have to get by with three screaming message boxes (you can see the scaling issue with the icons here).
If anybody from DataSolid or MuT would ever stumble upon this post, the items that I'd like to see fixed are:
Better English documentation and translation of the UI elements.
Respect Program Files restrictions by using user profile or even ProgramData files that need to be updated. Better yet, a Windows Store app which is forced to abide by those restrictions.
HiDPI support and proper scaling - some elements overlap with others when scaling is controlled by application, and all elements are blurry if system controls the scaling on HiDPI screens. Some icons in dialog windows remain extremely small and are hard to distinguish.
Icons with a consistent style and distinguishing features.
Reduced number of exclamation points in the UI!
And with that I conclude my BeckerCAD review and will go spend some time drawing lines Relativ to Foot Point.