<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-9632187</atom:id><lastBuildDate>Tue, 09 Mar 2010 18:19:39 +0000</lastBuildDate><title>Outside The Box</title><description>Random thoughts about AutoCAD, ObjectARX, and the meaning of life.&lt;br&gt;All Original Content Copyright 2006 - 2008 Owen Wengerd, All Rights Reserved</description><link>http://otb.manusoft.com/index.htm</link><managingEditor>owenw@manusoft.com (Owen Wengerd)</managingEditor><generator>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-4678526565143039990</guid><pubDate>Tue, 09 Mar 2010 18:05:00 +0000</pubDate><atom:updated>2010-03-09T13:19:39.579-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>ManuSoft</category><title>RIP Alan Kalameja</title><description>I saw in the March 8 edition of the &lt;a href="http://www.tenlinks.com/news/tl_daily.htm"&gt;TenLinks Daily newsletter&lt;/a&gt; that &lt;a href="http://www.postandcourier.com/news/2010/mar/06/deaths-summary/"&gt;Alan Kalameja passed away&lt;/a&gt; at age 55. Condolences to his family. Alan hired me to write test questions for an AutoCAD certification exam in the early '90s (I don't recall which version, but probably either R12 or R13). That was one of my first real contracting jobs. Although it wasn't very glamorous, it made me feel important, and undoubtedly helped focus my fledgling consulting business on AutoCAD. Thanks, Alan, for giving me that opportunity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-4678526565143039990?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2010/03/rip-alan-kalameja.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5685699791898279181</guid><pubDate>Sun, 17 Jan 2010 17:40:00 +0000</pubDate><atom:updated>2010-01-17T13:42:42.703-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>nostalgia</category><title>Google killed the radio star</title><description>This post is inspired by a conversation I had with a nephew, and it hearkens to the same nostalgic emotions engendered by &lt;a href="http://en.wikipedia.org/wiki/Video_Killed_the_Radio_Star"&gt;the first music video on MTV&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was a young inquisitive child growing up in the 70s in an Amish household. Without access to modern technology, I struggled at age 11 to build an oscillator circuit by using sheet metal cut from an old stovepipe, a 9 volt battery fitted into a piece of 2x6 pine, dynamite wire scavenged from the nearby strip mine, and a speaker and 555 timer IC that I cut out of some electronic equipment dug out of the local garbage dump.&lt;br /&gt;&lt;br /&gt;The achievement was incredible considering the circumstances, but thinking back, I have very little recollection of the actual consummation of the project. I assume I probably showed it proudly to my friends, who would have been awestruck, but completely ignorant of how it worked or why it was important to me. I simply don't remember what I did with the project after it was complete.&lt;br /&gt;&lt;br /&gt;What I do remember fondly is the struggle to achieve; the thrill of the hunt. I struggled to get information. I had obtained a prized 555, but I had to wait for weeks until the next trip to the city so I could stop by Radio Shack to get a pinout of the 555 along with circuit diagrams showing how to use it. Then I had to find components. I had long since built a treasure trove of capacitors and resistors that I had salvaged from discarded electronics, along with a pot full of potentiometers that I could use to adjust the oscillator frequency, but I still had to scavenge for some missing components.&lt;br /&gt;&lt;br /&gt;The challenges of the quest made the final result more satisfying. It was the search for the holy grail that etched itself into my memory; I barely remember the grail itself.&lt;br /&gt;&lt;br /&gt;Over the holidays during a family gathering, one of my Amish nephews was anxious to pick my brain. He explained that someone had told him that it's possible to convert an electric motor into a generator, and so he set out on a quest to build a generator from an old electric motor and a small gasoline engine. The quest involved several letters mailed back and forth between people he knew that might have information about how to go about the task. He tried and tried, but could not get his generator to work.&lt;br /&gt;&lt;br /&gt;I explained to him how he needed to remove the external circuitry from his motor so that it wouldn't foul up the results; how he can add a rectifier and a regulator to generate direct current output. The excitement over this new discovery was written all over the young man's face as he anticipated more adventure.&lt;br /&gt;&lt;br /&gt;On the way home, I thought to myself that Google could quickly and easily have provided the answers that my nephew sought. But then it occurred to me that Google would also have deprived him of the struggle and adventure of discovery that motivates him to continue the quest.&lt;br /&gt;&lt;br /&gt;I wonder how many young minds are missing out on the supreme adventure of discovery because we live in a modern culture where all the knowledge in the universe is seemingly already at our fingertips, just a Google search away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5685699791898279181?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2010/01/google-killed-radio-star.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-7310920168504600980</guid><pubDate>Tue, 12 Jan 2010 01:32:00 +0000</pubDate><atom:updated>2010-01-11T20:48:33.919-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ObjectARX</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>Visual Studio</category><title>Visual Studio 2010 and VC Build Hook</title><description>Many of you use my &lt;a href="http://www.manusoft.com/Resources/ARXTips/Index.stm#VCBuildHook"&gt;VC Build Hook utility&lt;/a&gt; to target multiple versions of AutoCAD from a single solution in Visual Studio 2008. Visual Studio 2010 now includes a new feature called &lt;a href="http://blogs.msdn.com/vcblog/archive/2009/12/08/c-native-multi-targeting.aspx"&gt;native multi-targeting&lt;/a&gt; that performs the same function as VC Build Hook. The new feature works great for using build tools back to VC 7.1, but it does not work with VC 7, which is required for targeting AutoCAD versions 2006 and earlier.&lt;br /&gt;&lt;br /&gt;The problem is that VC 7 chokes on Unicode response files. In earlier versions of Visual Studio you could set a project property to select Unicode or ANSI response files, but that property has been removed in Visual Studio 2010. I have been told by a Microsoft engineer that the problem will be addressed in SP1, presumably by adding that project property back.&lt;br /&gt;&lt;br /&gt;The moral of the story is that you'll need to wait for SP1 before you'll be able to use the VC 7 build tools from within the Visual Studio 2010 IDE. I am not planning to update VC Build Hook to support Visual Studio 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-7310920168504600980?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2010/01/visual-studio-2010-and-vc-build-hook.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-8590168231513922539</guid><pubDate>Thu, 24 Dec 2009 17:12:00 +0000</pubDate><atom:updated>2009-12-24T13:20:53.843-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>ObjectARX</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>Bricscad</category><title>Automatic LISP Loading</title><description>There are a myriad of ways to load AutoLISP applications in AutoCAD, including acaddoc.lsp, an .mnl file, the Startup Suite, and manually by various means. For application developers wishing to deploy their applications to others, all of these methods have drawbacks. The ideal solution should be easy to implement in an installation program, require minimal or zero changes to the user's AutoCAD configuration, work the same way across all versions of AutoCAD, and easily undone when the application is uninstalled.&lt;br /&gt;&lt;br /&gt;ObjectARX application developers have long used registry demand loading to load their applications automatically, either when AutoCAD starts or when the user enters a command that the application defines. Registry demand loading is relatively easy to set up and meets the other requirements for an ideal solution, except for one problem: it works only with ObjectARX modules (or with .NET modules in AutoCAD 2006 and later).&lt;br /&gt;&lt;br /&gt;Many years ago, I created a solution to this problem by building a small stub ObjectARX module that did nothing but load an associated LISP file. This effectively allows the registry demand loading mechanism to be used for loading a LISP file. If you develop AutoLISP applications that could benefit from registry demand loading, then I have a Christmas present for you: &lt;a href="http://www.manusoft.com/Software/Freebies/Index.stm#ADSARX"&gt;LspLoad.zip&lt;/a&gt; contains a complete suite of newly updated stub modules for all versions of AutoCAD from AutoCAD 2000 to AutoCAD 2010, plus modules for Bricscad 9 and 10, which also supports registry demand loading.&lt;br /&gt;&lt;br /&gt;To use the stub modules, just rename them so that the base filename matches your application's main LISP filename, then install them in the same folder as the LISP file and create the registry demand load entries. The only work you have to do is to get the stub module to load. You can simply drag and drop the appropriate stub module into a running instance of AutoCAD in order to test it.&lt;br /&gt;&lt;br /&gt;Creating the demand loading registry keys is not difficult, but it may require some programming. I write custom actions for my installation programs that enumerate all installed AutoCAD versions and flavors, and set up the demand load keys for every one. However you do it, the final result should look something like this (for AutoCAD 2010 on my system):&lt;br /&gt;&lt;a href="http://otb.manusoft.com/uploaded_images/RegDLoad.png"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 223px; CURSOR: hand" border="0" alt="" src="http://otb.manusoft.com/uploaded_images/RegDLoadThumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this screen shot, I created an application called "!LspLoadTest" (the "!" was added just so it displayed at the beginning of the list). I added the minimum required subkeys. The LOADER string value is set to the complete path of the stub module, and LOADCTRLS is set to a value of 2, which means I want the application loaded when AutoCAD starts. LOADCTRLS is a bit coded value; for use with LspLoad, it's only useful values are 2 or 4. A value of 4 means "load when my command is invoked"; this mode requires a COMMANDS subkey that lists the defined commands.&lt;br /&gt;&lt;br /&gt;The way it works is very simple. In the example above, you can see that I renamed the module (but left the ".18.x64.arx" so that I can tell it apart). I then added !LspLoadTest.lsp to the W:\LspLoad folder. That file contained the following:&lt;br /&gt;&lt;blockquote&gt;(princ "\nThis test file loaded from ")&lt;br /&gt;(princ (if GetPathOf!LspLoadTest (GetPathOf!LspLoadTest) "&lt;unkown&gt;"))&lt;br /&gt;(princ)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Now when I start AutoCAD 2010, I see on the command line:&lt;br /&gt;&lt;blockquote&gt;This test file loaded from W:\LspLoad\&lt;/blockquote&gt;&lt;br /&gt;These files are free to use for any purpose. Have a great holiday, everyone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-8590168231513922539?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/12/automatic-lisp-loading.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-7984936359463688392</guid><pubDate>Wed, 11 Nov 2009 20:10:00 +0000</pubDate><atom:updated>2009-11-11T15:56:15.786-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>banks</category><title>Evil Banks</title><description>A lot of you are probably having to cut back on your expenses to make ends meet in this economic downturn. I've drastically reduced my discretionary spending, postponed the purchase of new office equipment, and investigated less expensive alternatives to a lot of my monthly expense items. I've also been streamlining and reorganizing my finances, which inevitably involves a lot of contact with banks.&lt;br /&gt;&lt;br /&gt;Kean Walmsley's post about his recent &lt;a href="http://through-the-interface.typepad.com/through_the_interface/2009/11/turing-test-for-live-bank-chat-failed.html"&gt;bank customer service issue&lt;/a&gt; motivated me to post about one of my recent bank experiences.&lt;br /&gt;&lt;br /&gt;First of all, I'm here to tell you that banks do make mistakes. I'm sure that the vast majority of the time when your check book doesn't balance, it was you that made a mistake, and not the bank. But if you are cursed like I am, then banks delight in creating phantom overdrafts and charging you exorbitant overdraft fees, then, when confronted with their error, apologizing and refunding the fees (&lt;em&gt;after&lt;/em&gt; the damage is done and all those bounced checks have caused you to incur returned check charges from your creditors). That has happened twice to me in the past two months, with two different banks and two completely unrelated accounts.&lt;br /&gt;&lt;br /&gt;In both cases, the bank eventually fixed the error, but I'm still out the returned check charges and whatever damage that has done to my credit rating.&lt;br /&gt;&lt;br /&gt;One of the "returned" payments was a credit card payment. Of course, I did not get notified about this until the day &lt;em&gt;after&lt;/em&gt; the payment due date, so it was too late to fix the problem in time to prevent another exorbitant late fee from being charged by the credit card bank.&lt;br /&gt;&lt;br /&gt;Obviously the returned check triggered some alarms at the credit card bank, because I started receiving phone calls begging me to make a payment immediately. Irritated, I decided to make the credit card bank wait until the next due date before making the replacement payment. I figured my late fee bought me that extra time, so I might as well use it. My patience paid off: after a few futile attempts at collecting their late payment, the bank offered to refund the late fee if I made an immediate payment. &lt;em&gt;That's what I'm talking about!&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-7984936359463688392?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/11/evil-banks.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5762919495977519013</guid><pubDate>Wed, 23 Sep 2009 23:31:00 +0000</pubDate><atom:updated>2009-09-23T20:31:23.452-04:00</atom:updated><title>ArxDbg Utility</title><description>ArxDbg is the name of a sample project that has been included with the ObjectARX SDK for many years. It's primary purpose is to demonstrate how to use the ObjectARX API, but it is a complete free-standing utility in its own right. ObjectARX programmers often use this utility during development for testing and exercising their application code, but it can be useful to anybody, not just programmers.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://otb.manusoft.com/uploaded_images/ArxDbgMenu.png"&gt;&lt;img style="margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 381px;" src="http://otb.manusoft.com/uploaded_images/ArxDbgMenuThumb.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the UI consists of a single context menu. One of my favorite features is the ability to spelunk through a drawing database, looking at every object and its relationships to other objects. The command is ArxDbgSnoopDb, or you can select 'Database Info...' in the ArxDbg context menu.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://otb.manusoft.com/uploaded_images/ArxDbgUI.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://otb.manusoft.com/uploaded_images/ArxDbgUIThumb.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;There is no documentation, but anyone with a basic familiarity with the AutoCAD object model can figure out what most of the commands do. &lt;a href="http://otb.manusoft.com/files/ArxDbg.zip"&gt;ArxDbg.zip&lt;/a&gt; [1 Mb] includes versions of the utility for all versions of AutoCAD from AutoCAD 2000 through AutoCAD 2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5762919495977519013?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/09/arxdbg-utility.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-6991000788221638491</guid><pubDate>Mon, 03 Aug 2009 18:38:00 +0000</pubDate><atom:updated>2009-08-07T16:58:31.922-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>security</category><title>AutoCAD Missing Language Pack Drawing File Corruption</title><description>I've been chasing a drawing corruption problem on behalf of a customer. The problem manifests itself by causing a "Missing Language Pack" dialog to display when the drawing is opened (but only in Windows XP with no language packs installed -- my Vista installation apparently has all the language packs installed). Installing the language packs "fixes" the problem, in that the drawing files open without error.&lt;br /&gt;&lt;br /&gt;However, the real problem is that some drawing objects were corrupted in memory, and corrupt data was subsequently written to the .dwg file. My customer thinks the corruption might be linked to a virus that they were infected with (and have since eliminated). I have a copy of the virus for testing, but I have not been able to catch it in the act of corrupting an open drawing file. Therefore, I cannot conclusively link the virus with the corruption.&lt;br /&gt;&lt;br /&gt;So, I need your help. Have you recently noticed a "Missing Language Pack" dialog appearing in drawing files that have opened fine in the past? Has your virus scanner recently detected an AutoCAD related virus? If you have, please &lt;a href="mailto:owenw@manusoft.com?subject=Language%20Pack%20Corruption"&gt;send me an email&lt;/a&gt; describing your situation and AutoCAD versions involved. I would like to determine conclusively whether the virus is causing drawing file corruption, and if so, whether the corruption is always in the same location of the drawing file.&lt;br /&gt;&lt;br /&gt;[Update: Autodesk has released a technical document with &lt;a href="http://usa.autodesk.com/getdoc/id=TS13717811"&gt;information about the virus&lt;/a&gt;. See also &lt;a href="http://autodesk.blogs.com/between_the_lines/2009/08/malicious-code-alert-acadvlx-and-solution.html"&gt;Shaan Hurley's blog post&lt;/a&gt;.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-6991000788221638491?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/08/autocad-language-pack-drawing-file.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-1201753337590308152</guid><pubDate>Wed, 08 Jul 2009 14:05:00 +0000</pubDate><atom:updated>2009-07-08T10:23:53.226-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>ManuSoft</category><title>If you want it done right...</title><description>I've proved once again that if you want it done right, you have to do it yourself. The ManuSoft web site is fully functional again after my longtime ISP had a major network meltdown. I waited for two weeks for them to repair it, then finally moved to a different provider. The new provider's promised "24/7 tech support" turned out to mean "24 hours to respond, 7 days to fix" every problem, not to mention that I would need to provide step by step instructions to their techs so they could configure the server the way I needed. After two weeks of that, I gave up and configured my own server and now host it myself.&lt;br /&gt;&lt;br /&gt;Let this be a warning to all of you hosting web sites with reputable providers, or storing your data somewhere in the cloud. I paid big bucks every month to my old provider for secure servers, redundant power supplies, managed and air conditioned server rooms, nightly backups, 99% uptime, etc., but they still lost everything. Almost a month later they still haven't restored their customers' data. Luckily, I make my own backups.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-1201753337590308152?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/07/if-you-want-it-done-right.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5772696575020526189</guid><pubDate>Mon, 30 Mar 2009 23:13:00 +0000</pubDate><atom:updated>2009-06-28T22:23:42.493-04:00</atom:updated><title>Disable InfoCenter in AutoCAD 2010</title><description>In case you missed it, &lt;a href="http://discussion.autodesk.com/forums/thread.jspa?threadID=721735&amp;amp;tstart=1"&gt;Tony Tanzillo has posted instructions&lt;/a&gt; for disabling the InfoCenter in AutoCAD 2010. AutoCAD 2010 starts faster when the InfoCenter is disabled.&lt;br /&gt;&lt;br /&gt;To make it easy, I've created an AutoLISP file that defines commands named DisableInfoCenter and EnableInfoCenter:&lt;br /&gt;&lt;a href="http://otb.manusoft.com/files/DisableInfoCenter.LSP"&gt;DisableInfoCenter.LSP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alternatively, you can just paste the following lisp at the AutoCAD command line to disable it and be done with it. Note that you need to restart AutoCAD for the change to take effect.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;(vl-load-com)(vl-registry-write (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\InfoCenter") "InfoCenterOn" 0)&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5772696575020526189?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/03/disable-infocenter-in-autocad-2010.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5130084498602403709</guid><pubDate>Sat, 28 Mar 2009 21:54:00 +0000</pubDate><atom:updated>2009-03-28T19:25:20.082-04:00</atom:updated><title>ObjectARX 2010: Dealing With Missing Exports</title><description>In the new ObjectARX 2010 SDK, Autodesk has added some new virtual member functions that are not exported as they should be. For example, the AcGiFaceData class has had two new virtual functions added for setting and getting the face transparency:&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;class&lt;/span&gt; AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; public&lt;/span&gt; AcRxObject&lt;b&gt;&lt;span style="color:#663300;"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="color:#999999;"&gt;&lt;br /&gt;//[... deleted for brevity]&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;  ACDB_PORT&lt;span style="color:#990000;"&gt; virtual&lt;/span&gt; AcDbObjectId&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; materials&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  ACDB_PORT&lt;span style="color:#990000;"&gt; virtual&lt;/span&gt; AcGiMapper&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; mappers&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#990000;"&gt;  virtual&lt;/span&gt;&lt;span style="color:#ff6633;"&gt; void&lt;/span&gt; setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;const&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; *&lt;/span&gt;&lt;/b&gt;transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;);&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;  virtual&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;/strong&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;private&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  AcGiImpFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt; *&lt;/span&gt;&lt;/b&gt;mpAcGiImpFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, whoever added the new functions neglected to prefix them with the ACDB_PORT macro. ACDB_PORT evaluates to __declspec(export), which tells the compiler to export the function. Since the macro is missing, the new functions are not exported from acdb18.dll.&lt;br /&gt;&lt;br /&gt;Since these are virtual functions, you won't have any problems calling them through a pointer to an AcGiFaceData object that was constructed by AutoCAD. The problem arises when you derive a class from AcGiFaceData. Since the functions are not exported, the linker has no way of resolving their address for creating the virtual function table of your derived class. This results in linker errors:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;acrxEntryPoint.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall AcGiFaceData::setTransparency(class AcCmTransparency const *)" (?setTransparency@AcGiFaceData@@UAEXPBVAcCmTransparency@@@Z)&lt;br /&gt;acrxEntryPoint.obj : error LNK2001: unresolved external symbol "public: virtual class AcCmTransparency * __thiscall AcGiFaceData::transparency(void)const " (?transparency@AcGiFaceData@@UBEPAVAcCmTransparency@@XZ)&lt;/blockquote&gt;Following is an example that results in these errors:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;class&lt;/span&gt; AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; public&lt;/span&gt; AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;() {}&lt;br /&gt; ~&lt;/span&gt;&lt;/b&gt;AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;() {}&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt; Test&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The only solution is to provide an implementation of the missing functions. In this case, it could be accomplished by something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#990000;"&gt;class&lt;/span&gt; AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; public&lt;/span&gt; AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;() :&lt;/span&gt;&lt;/b&gt; mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; NULL&lt;b&gt;&lt;span style="color:#663300;"&gt; ) {}&lt;br /&gt; ~&lt;/span&gt;&lt;/b&gt;AcGiFaceDataEx&lt;b&gt;&lt;span style="color:#663300;"&gt;() {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; delete&lt;/span&gt; mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;; }&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; virtual&lt;/span&gt;&lt;span style="color:#ff6633;"&gt; void&lt;/span&gt; setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;const&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; *&lt;/span&gt;&lt;/b&gt;transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;)&lt;br /&gt; {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;  delete&lt;/span&gt; mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; = (&lt;/span&gt;&lt;/b&gt;transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;?&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; new&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;( *&lt;/span&gt;&lt;/b&gt;transparency&lt;b&gt;&lt;span style="color:#663300;"&gt; ) :&lt;/span&gt;&lt;/b&gt; NULL&lt;b&gt;&lt;span style="color:#663300;"&gt;);&lt;br /&gt; }&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; virtual&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt; return&lt;/span&gt; mpTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;; }&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt; Test&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;This will fix the linker errors, but there is no guarantee that it will work as intended. AutoCAD might access its internal transparency value directly without calling through the member functions, which means it would never "see" the transparency set through the replacement member functions. Furthermore, the addition of the new pointer member changes the size of the class, which causes AcGiFaceDataEx arrays to have a different memory footprint than AcGiFaceData arrays. Lastly, what if Autodesk fixes the problem in a future AutoCAD service pack?&lt;br /&gt;&lt;br /&gt;The ideal solution should not change the size of the class. It should check at runtime whether the function is exported, then use the exported function if it exists. That way, code that is written now will use the exported function if and when it becomes available in a future version of AutoCAD. When the function is not exported, an alternate implementation must be provided. This is not an unusual scenario, and the solution I present for the specific case of AcGiFaceData can be adapted to the more general problem.&lt;br /&gt;&lt;br /&gt;In the AcGiFaceData case, the missing functions are virtual functions. Knowing this, it is possible to use a trick to get the address of the real function. In the code below, the function getAcGiFaceData_vtable() constructs a temporary AcGiFaceData object, from which it extracts a pointer to the object's virtual function table. The virtual function table is just an array of function pointers, so the address of the desired function can be obtained by indexing into the virtual function table. The question is, how far? By counting virtual functions and data members starting from the top of the class hierarchy: in this case, 6 virtual functions in AcRxObject plus 16 virtual functions in AcGiFaceData = 22.&lt;br /&gt;&lt;br /&gt;Note that obtaining a function pointer this way relies on Visual C++ implementation details, but this is safe to do since all ObjectARX modules must be compiled in Visual C++.&lt;br /&gt;&lt;br /&gt;Following is my solution to the missing AcGiFaceData functions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#000099;"&gt;#pragma warning(push)&lt;br /&gt;#pragma warning(disable: 4608)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#990000;"&gt;template&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;lt;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; typename&lt;/span&gt; Src&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; typename&lt;/span&gt; Dest&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Dest force_cast&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; Src src&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; union&lt;/span&gt; _convertor&lt;b&gt;&lt;span style="color:#663300;"&gt; {&lt;/span&gt;&lt;/b&gt; Dest d&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt; Src s&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt; _convertor&lt;b&gt;&lt;span style="color:#663300;"&gt;() :&lt;/span&gt;&lt;/b&gt; d&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;0&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;),&lt;/span&gt;&lt;/b&gt; s&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;0&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;) {} }&lt;/span&gt;&lt;/b&gt; convertor&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt; convertor&lt;b&gt;&lt;span style="color:#663300;"&gt;.&lt;/span&gt;&lt;/b&gt;s&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; src&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; return&lt;/span&gt; convertor&lt;b&gt;&lt;span style="color:#663300;"&gt;.&lt;/span&gt;&lt;/b&gt;d&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;#pragma warning(pop)&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;static&lt;/span&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; getAcGiFaceData_vtable&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; static&lt;/span&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; = *(&lt;/span&gt;&lt;/b&gt;FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;**)&amp;amp;&lt;/span&gt;&lt;/b&gt;AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; return&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; (&lt;/span&gt;&lt;/b&gt;rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt;?&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; :&lt;/span&gt;&lt;/b&gt; NULL&lt;b&gt;&lt;span style="color:#663300;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff6633;"&gt;&lt;br /&gt;&lt;br /&gt;void&lt;/span&gt; AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; transparency&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; typedef&lt;/span&gt;&lt;span style="color:#ff6633;"&gt; void&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; (&lt;/span&gt;&lt;/b&gt;AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;::*&lt;/span&gt;&lt;/b&gt;F_setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;)(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;* );&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; static&lt;/span&gt; F_setTransparency pfSetTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; force_cast&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt; F_setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;gt;(&lt;/span&gt;&lt;/b&gt;GetProcAddress&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; GetModuleHandleA&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#009900;"&gt; "acdb18.dll"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;),&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#009900;"&gt; "?setTransparency@AcGiFaceData@@UEAAXPEBVAcCmTransparency@@@Z"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; ));&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;( !&lt;/span&gt;&lt;/b&gt;pfSetTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;br /&gt; {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;  static&lt;/span&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; getAcGiFaceData_vtable&lt;b&gt;&lt;span style="color:#663300;"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;  if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;   pfSetTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; force_cast&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt; F_setTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;gt;(&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;22&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;] );&lt;br /&gt; }&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; pfSetTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;br /&gt;  (&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;this&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;-&amp;gt;*&lt;/span&gt;&lt;/b&gt;pfSetTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;)(&lt;/span&gt;&lt;/b&gt; transparency&lt;b&gt;&lt;span style="color:#663300;"&gt; );&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;::&lt;/span&gt;&lt;/b&gt;transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; typedef&lt;/span&gt; AcCmTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;* (&lt;/span&gt;&lt;/b&gt;AcGiFaceData&lt;b&gt;&lt;span style="color:#663300;"&gt;::*&lt;/span&gt;&lt;/b&gt;F_transparency&lt;b&gt;&lt;span style="color:#663300;"&gt;)()&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt; const&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt; static&lt;/span&gt; F_transparency pfTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; force_cast&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt; F_transparency&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;gt;(&lt;/span&gt;&lt;/b&gt;GetProcAddress&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; GetModuleHandleA&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#009900;"&gt; "acdb18.dll"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;),&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#009900;"&gt; "?transparency@AcGiFaceData@@UEBAPEAVAcCmTransparency@@XZ"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; ));&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;( !&lt;/span&gt;&lt;/b&gt;pfTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;br /&gt; {&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;&lt;br /&gt;  static&lt;/span&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;*&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; getAcGiFaceData_vtable&lt;b&gt;&lt;span style="color:#663300;"&gt;();&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;  if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;   pfTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; =&lt;/span&gt;&lt;/b&gt; force_cast&lt;b&gt;&lt;span style="color:#663300;"&gt;&amp;lt;&lt;/span&gt;&lt;/b&gt; FARPROC&lt;b&gt;&lt;span style="color:#663300;"&gt;,&lt;/span&gt;&lt;/b&gt; F_transparency&lt;b&gt;&lt;span style="color:#663300;"&gt; &amp;gt;(&lt;/span&gt;&lt;/b&gt; rfVTable&lt;b&gt;&lt;span style="color:#663300;"&gt;[&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#999900;"&gt;23&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;] );&lt;br /&gt; }&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;(&lt;/span&gt;&lt;/b&gt; pfTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt; )&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;  return&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt; (&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#990000;"&gt;this&lt;/span&gt;&lt;b&gt;&lt;span style="color:#663300;"&gt;-&amp;gt;*&lt;/span&gt;&lt;/b&gt;pfTransparency&lt;b&gt;&lt;span style="color:#663300;"&gt;)();&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt; return&lt;/span&gt; NULL&lt;b&gt;&lt;span style="color:#663300;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5130084498602403709?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/03/objectarx-2010-dealing-with-missing.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-2349897646375811573</guid><pubDate>Wed, 25 Mar 2009 05:55:00 +0000</pubDate><atom:updated>2009-03-25T03:47:46.163-04:00</atom:updated><title>What's New in the AutoCAD 2010 EULA</title><description>Everyone else is discussing all the cool new features in AutoCAD 2010, so I decided to have a look at what's new in the EULA (End User License Agreement). I compared the AutoCAD 2010 EULA for US/Canada to the AutoCAD 2009 EULA. I won't divulge the process I used to automate the comparison, because the odds are pretty good that I violated the EULA somewhere along the way, and I want plausible deniability.&lt;br /&gt;&lt;br /&gt;The first change I noticed is that the AutoCAD 2010 EULA contains more shouting. The 2009 EULA started out in a fairly mellow mixed case with a few shouts thrown in for effect, but the 2010 EULA dispenses with the lower case and launches right into a multi-paragraph avalanche of screaming block letters. Apparently nobody was listening, so they turned up the volume.&lt;br /&gt;&lt;br /&gt;Substantively, there are a number of very interesting changes. The following was added to the preamble:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SOFTWARE OBTAINED FROM THIRD PARTIES THAT HAVE NOT BEEN AUTHORIZED OR ALLOWED BY AUTODESK, DIRECTLY OR INDIRECTLY, TO SUPPLY SOFTWARE IS LIKELY TO HAVE BEEN MADE AVAILABLE IN VIOLATION OF AUTODESK’S RIGHTS. IN SUCH AN EVENT, AUTODESK IS NOT OBLIGATED TO ISSUE AN ACTIVATION CODE OR OTHERWISE PERMIT YOU TO INSTALL OR USE THE SOFTWARE.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Next time you're eyeing that used copy of AutoCAD 2010 on eBay, be warned that Autodesk is not obligated to permit you to install or use the software. They don't come right out and say that they won't allow it, so maybe they won't mind -- but then what's the point of including this clause? &lt;a href="http://www.cadcourt.com/Docket/207cv01189.aspx"&gt;Tim Vernor&lt;/a&gt; won't be very happy about this change.&lt;br /&gt;&lt;br /&gt;Moving along, I see that they added a definition for "Uninstall", defining it as "to destroy or remove". The definition of "User Documentation" was very slightly changed from "...after You acquire or Install the Software..." to "...when or after You acquire or Install the Software...". Incidentally, did you know that Autodesk considers an AutoCAD reseller's invoice to be "user documentation"?&lt;br /&gt;&lt;br /&gt;Rounding out changes in definitions is a change in the definition of "You". Yes, Autodesk has redefined "You" whether "you" like it or not.&lt;br /&gt;&lt;br /&gt;I could go on and on about small wording changes, and while it would be interesting to contemplate why each change was made (and how many scheming lawyers it took to do it), we'd risk missing the forest for the trees.&lt;br /&gt;&lt;br /&gt;Section 2.1, "License Grant", contains ominous new language. The following has been added:&lt;br /&gt;&lt;blockquote&gt;You may Access the application programming interfaces that may be included with or in the Software or otherwise available from Autodesk for use with the Software (“API’s”) to develop programs, modules, components or functionality that (i) are compatible with and are used and/or interfaced with the Software and (ii) contribute significant value-added functionality or enhancements to the Software (“API Modules”) provided You may Install and Access such API Modules solely on Computers where a licensed copy of the Software is also installed and further provided such Installation and Access is solely in connection with Your Installation and Access of the Software and solely for Your internal business needs. You may not redistribute all or any portion of an API Module.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Read that again. That's right, you may not write any "programs, modules, components, or functionality" unless they "contribute significant value-added functionality or enhancements" to AutoCAD. Furthermore, if you do manage to write a program that adds significant functionality, you may not redistribute all or any part of it. What are those guys smoking out there in California?&lt;br /&gt;&lt;br /&gt;Finally at the end of section 2.1, they changed "No license is granted under the terms of this Agreement if You did not lawfully acquire the Software" to "No license is granted under the terms of this Agreement if You did not lawfully acquire the Software from Autodesk or from a third party who has been permitted or authorized by Autodesk either directly or indirectly to supply the Software". Take &lt;em&gt;that&lt;/em&gt; Tim Vernor!&lt;br /&gt;&lt;br /&gt;In another nod to the Vernor case, section 2.3, "Upgrades", adds a new requirement to "destroy all Autodesk Materials relating to the Previous Version or, upon request by Autodesk, return all such Autodesk Materials relating to the Previous Version to Autodesk or the company from which they were acquired". This is important language that could persuade a court to view an AutoCAD purchase as a license instead of a sale, thereby giving Autodesk the power to control the secondary market.&lt;br /&gt;&lt;br /&gt;Interestingly, section 2.4, "Crossgrades", requires that the previous software be uninstalled within 60 days, but has no requirement that it be destroyed. However, new language in section 2.7, "Termination", which requires the software to be destroyed "upon termination of the license grant or this Agreement", apparently covers both cases.&lt;br /&gt;&lt;br /&gt;A funny change in section 3.2.3, "Transfers", appears to close a loophole. The AutoCAD 2009 EULA disallowed transfers to "any other person"; the AutoCAD 2010 EULA disallows transfers to "any other person or legal entity". Considering a license transfer? Make sure it's to an illegal entity!&lt;br /&gt;&lt;br /&gt;Section 4, "ALL RIGHTS RESERVED", was rewritten. The rewrite introduced a grammatical error ("and You have not other rights"), but otherwise I don't see that much changed. It still ends with the now familiar directive that "The Software and User Documentation are licensed, not sold."&lt;br /&gt;&lt;br /&gt;Finally, the infamous "audit clause" has been revised. Not the way you may have hoped, I'm sad to report. Luckily the change was a minor one that doesn't make the clause any more overbearing than it already was.&lt;br /&gt;&lt;br /&gt;Isn't change wonderful?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-2349897646375811573?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/03/whats-new-in-autocad-2010-eula.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>11</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-8272980228769128533</guid><pubDate>Sun, 01 Mar 2009 23:03:00 +0000</pubDate><atom:updated>2009-03-06T21:34:29.427-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>legal</category><title>Software Licensing: A Case For Reform</title><description>I want to consider software licensing practices in general, but with the specific facts and history in the &lt;a href="http://www.cadcourt.com/Docket/207cv01189.aspx"&gt;Vernor vs. Autodesk lawsuit&lt;/a&gt; as a backdrop.&lt;br /&gt;&lt;br /&gt;In the Vernor case, Tim Vernor purchased several boxes of AutoCAD software, and never even read, let alone agreed to, the terms of the license agreement inside the box. When Vernor listed the AutoCAD software for sale on Ebay, Autodesk sent Ebay a notice that claimed Vernor's auction violated Autodesk's copyright. In order to benefit from the safe harbor provisions of the Digital Millennium Copyright Act (&lt;a href="http://en.wikipedia.org/wiki/Dmca"&gt;DMCA&lt;/a&gt;), Ebay was obligated to remove the auctions. Vernor responded by filing a lawsuit accusing Autodesk of making false copyright violation claims.&lt;br /&gt;&lt;br /&gt;Additional facts have since come to light. For one, we've learned that the AutoCAD software that Vernor purchased had been &lt;a href="http://www.cadcourt.com/NewsFeed/tabid/53/EntryID/50/Default.aspx"&gt;previously upgraded to a newer version&lt;/a&gt;. Vernor did not know this when he purchased the software; and in any case, it's not clear that this fact has any bearing on the outcome of the suit.&lt;br /&gt;&lt;br /&gt;Given this set of facts, let's analyze the Vernor case not from a purely legal perspective, but from a more abstract "moral" perspective. After all, society is the ultimate arbitrator of what is wrong and what is right with respect to our laws. We ultimately determine whether laws are fair by whether we follow them willingly (and whether we put pressure on our legislatures to change them).&lt;br /&gt;&lt;br /&gt;Steve Johnson opines that &lt;a href="http://www.blog.cadnauseam.com/2009/02/21/vernor-v-autodesk-why-i-think-autodesk-is-right/"&gt;Autodesk is morally right&lt;/a&gt; in the Vernor case, because the software Vernor purchased was "tainted" due to having been upgraded by the original owner. &lt;strike&gt;In Steve's view...&lt;/strike&gt; &lt;em&gt;[see Steve's comment below where he chides me for ascribing this view to him - O.W.]&lt;/em&gt; Presumably, one who holds this view sees Vernor's original purchase as akin to someone purchasing stolen goods. With stolen goods, the law (and hopefully our moral compass) recognizes that the purchaser of the stolen goods has no legal right to them.&lt;br /&gt;&lt;br /&gt;Autodesk offered the original owner a discounted price for a newer version of AutoCAD in exchange for a promise to destroy the older version. The original owner reneged on its promise to destroy the old version, and sold it to an unwitting buyer instead.&lt;br /&gt;&lt;br /&gt;It follows that both Autodesk and Tim Vernor were treated unfairly by the company that sold the AutoCAD software to Vernor. Despite the company's history of using pirated software, Autodesk gave them the benefit of the doubt when selling them a discounted upgrade. Vernor, by all accounts, had no idea and no way of knowing that the software he purchased had been previously upgraded. This is a recipe for disaster.&lt;br /&gt;&lt;br /&gt;Unfortunately, this sort of disaster is all too common. In many cases, software users simply don't read license agreements. If they do read license agreements, they don't understand them. After all, most of us are not lawyers, and we can't reasonably be expected to hire a lawyer to evaluate the license agreements of every software product we use. How then can we be expected to follow them exactly and without fail?&lt;br /&gt;&lt;br /&gt;Consider that it's entirely possible that the company from which Vernor bought his AutoCAD software had no idea that they had agreed to destroy the upgraded AutoCAD software. At least from a moral perspective, we can have some sympathy for the company if they honestly had no idea they were violating any agreements when they sold the software to Vernor.&lt;br /&gt;&lt;br /&gt;Could Autodesk have required the upgraded AutoCAD software to be returned, or required certification by an independent "software recycler" that it had been destroyed? Sure they could have. In fact, such requirements did exist in the early days of software license agreements. Had Autodesk done so, the Vernor court would probably have concluded that AutoCAD was licensed, not sold.&lt;br /&gt;&lt;br /&gt;Why even require the old version to be destroyed when upgrading? If we stop using the old version, why shouldn't we be allowed to sell it at market value? Doesn't recycling old software make just as much sense as recycling old tires? We have been conditioned to believe that discounted upgrades are good for us, but are they really?&lt;br /&gt;&lt;br /&gt;Would we accept a legal regime under which tire manufacturers could force us to destroy our old tires as part of the new tire purchase agreement? Oh, you say, that comparison isn't valid because tires eventually wear out of their own accord, whereas old software continues working forever! First of all, old software doesn't continue working forever. How many people still use &lt;a href="http://en.wikipedia.org/wiki/VisiCalc"&gt;VisiCalc&lt;/a&gt;? Furthermore, what would this line of reasoning conclude about potential tires of the future that last forever? We'd have to start licensing tires instead of purchasing them!&lt;br /&gt;&lt;br /&gt;What would happen if software vendors could not legally prevent "used" software from being resold on the open market, no matter how it was purchased or upgraded? For one, it would increase competition, because new versions of software would be competing not only against software from other vendors, but also against older versions of itself. In a world where software is priced based on what the market will bear, the net effect would be lower prices and higher quality (not to mention less frequent "upgrades") for all software.&lt;br /&gt;&lt;br /&gt;I think the Vernor case is just one example illustrating how the current software licensing system has sprung a leak, and is in need of repair. Can it be patched, or does it need to be replaced? Can the bleeding be stopped at the ankle, or should it be stopped it at the neck? This is a classical case of the &lt;a href="http://otb.manusoft.com/2009/02/petcock-problem.htm"&gt;Petcock Problem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Software industry advocates like the Business Software Alliance (&lt;a href="http://www.bsa.org"&gt;BSA&lt;/a&gt;) proclaim that the solution is educating consumers. Education may be important, but I think that "educating consumers" should not be left to an industry alliance.&lt;br /&gt;&lt;br /&gt;I have some ideas about how the system can be reformed, but I think we have to start by recognizing that there's a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-8272980228769128533?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/03/software-licensing-case-for-reform.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>10</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-4466162594224658810</guid><pubDate>Sun, 01 Mar 2009 22:48:00 +0000</pubDate><atom:updated>2009-03-01T18:03:10.664-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>legal</category><title>Software Licensing: Who's On First?</title><description>I'm a firm supporter of intellectual property rights. I fully support the rights of software publishers to own and profit from their creative work. I make my living as both a consumer of software and a publisher of software, so my views on software licensing reflect what I consider to be a healthy symbiosis between producers and consumers.&lt;br /&gt;&lt;br /&gt;Intellectual property laws are (or should be) designed to protect this symbiotic relationship for the public good. The patent system is designed not to protect patent owners from pirates, but to promote inventions and improvements on previous inventions that benefit the public. The fact that patent laws do help to protect patent owners from pirates is merely a side effect of the underlying goal of promoting the public interest. We, the public, grant exclusive rights to patent owners for a specific time in exchange for them making public the details of their invention. Innovative inventors can thus build on a body of previously published inventions rather than starting from scratch. This system of "open source" innovation speeds the evolution of technology, and everybody benefits from it.&lt;br /&gt;&lt;br /&gt;Copyright laws must be viewed in the same light. Copyright laws are designed to promote and enhance the public good by encouraging the production and publication of creative works. In exchange for giving copyright owners certain rights for a certain period of time, the public gets to enjoy and build upon a body of creative work. Some argue that the benefit of copyright protection provides a financial incentive to create the works in the first place, and that without such an incentive the works would never be produced at all. While this is undoubtedly true, consider that there are other ways to provide financial incentives (by providing government grants, for example), so I think it's important to view this aspect of copyright protection as a consequence of the goal to promote the public interest, not as a goal in and of itself.&lt;br /&gt;&lt;br /&gt;Copyright laws have long recognized a need to prevent copyrights from being abused by providing exceptions to the protection they afford to publishers. The &lt;a href="http://en.wikipedia.org/wiki/Fair_use"&gt;Fair Use doctrine&lt;/a&gt; is the most common such exception in US copyright law. The First Sale doctrine (or "exhaustion rule" in some jurisdictions) is another example of a limitation on copyrights. These exceptions and limitations evolved in response to attempts by copyright owners to abuse copyrights in a way that contravened their purpose of promoting the public interest.&lt;br /&gt;&lt;br /&gt;Software licenses are a relatively new phenomenon, but they rely on very old law: &lt;a href="http://en.wikipedia.org/wiki/Contract_law"&gt;contract law&lt;/a&gt;. It is important to understand that a software license agreement is a contract. The commercial software publisher agrees to give us limited and conditional copy rights and authorizes us to use the software in exchange for a fee. If the license agreement that we agreed to authorizes us to install and use the software on one computer, but we install it on ten computers, then we are violating both contract and copyright law (because we copied the software without permission). If the license agreement that we agreed to forbids us to resell the software to someone else, but we decide not to use the software ourselves and sell it anyway, we are violating only contract law (because we made no unauthorized copies).&lt;br /&gt;&lt;br /&gt;There are several contract law issues typically encountered with software license agreements.&lt;br /&gt;&lt;br /&gt;First, typical commercial software license agreements suffer from their unilateral nature. The contract is drawn up by the publisher with no negotiation or input from the consumer. Some question whether these are valid contracts in the first place, because they lack the "meeting of the minds" element that some judicial interpretations of contract law require.&lt;br /&gt;&lt;br /&gt;Second, software license agreements are not usually consummated until after the sale, when the software is finally installed. We purchase the software, essentially committing to our side of the bargain before we even know the terms of the contract to which we must eventually agree in order to use the software. This is inherently unfair, and there are still many unsettled questions about whether or not such a contract can ever be equitable and enforceable.&lt;br /&gt;&lt;br /&gt;If you've been following the &lt;a href="http://www.cadcourt.com/Docket/207cv01189.aspx"&gt;Vernor vs. Autodesk lawsuit&lt;/a&gt;, you'll know that the US federal district court in that case ruled that AutoCAD software was sold, not licensed, and therefore subject to the &lt;a href="http://en.wikipedia.org/wiki/First-sale_doctrine"&gt;First Sale Doctrine&lt;/a&gt;. The First Sale Doctrine says, in essence, that a publisher cannot contractually restrict the downstream resale or distribution of a copyrighted work beyond the "first sale". The court, at least in its initial ruling, rejected Autodesk's argument that AutoCAD was licensed, and therefore exempt from the First Sale doctrine. It should be noted that the Vernor lawsuit is far from over, and this first sale decision could well change before the dust settles.&lt;br /&gt;&lt;br /&gt;The courts will eventually reach a final decision in the specific case of Vernor vs. Autodesk, but why was this lawsuit even necessary in the first place? It's difficult to envision any outcome in which every injury is rectified. It could even be argued that everybody loses, no matter the outcome. And this is just one case in one jurisdiction.&lt;br /&gt;&lt;br /&gt;In the end, the final result of the Vernor case may not have much impact on how software is sold. It ultimately comes down to us, the union of consumers, to decide what kind of system we want. Unfortunately, right now we're doing the &lt;a href="http://otb.manusoft.com/2009/02/software-limbo.htm"&gt;software limbo&lt;/a&gt; while we wait faithfully for the next service pack. I think that we need more than a service pack. A system restore might be in order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-4466162594224658810?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/03/software-licensing-whos-on-first.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-7519342395740630204</guid><pubDate>Fri, 27 Feb 2009 15:51:00 +0000</pubDate><atom:updated>2009-02-27T11:29:38.275-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>legal</category><category domain='http://www.blogger.com/atom/ns#'>CAD Industry</category><title>The Software Limbo</title><description>Bruce Schneier argues that &lt;a href="http://www.schneier.com/blog/archives/2009/02/privacy_in_the.html"&gt;data is the pollution of the information age&lt;/a&gt;, and "just as 100 years ago people ignored pollution in our rush to build the Industrial Age, today we're ignoring data in our rush to build the Information Age."&lt;br /&gt;&lt;br /&gt;Software is still surfing the wave of technology revolution. In the tug-of-war between producers and consumers, the producers are still pulling the rope and consumers are just hanging on.&lt;br /&gt;&lt;br /&gt;Just as the coal mines, steel mills, and sweat shops of the burgeoning industrial age led to organized labor and labor laws, the consumers of the information age will eventually need to come to grips with the predatory practices of greedy software barons through collective bargaining and regulation.&lt;br /&gt;&lt;br /&gt;You've all heard the old software vs. car argument, right? Is buying software like buying a car? Or is it like leasing a car? Or are cars just a bad analogy, because software isn't like cars at all?&lt;br /&gt;&lt;br /&gt;Is software really different, or have we just been conditioned to believe that it's different?&lt;br /&gt;&lt;br /&gt;The problem is that we're still coming to terms with software, both legally and morally. Software companies have had a clear advantage in this information age frontier, and they have used their advantage to mold the software model to their liking. The software industry has successfully convinced us that software is licensed, not sold, and that because it is licensed, the old rules don't apply.&lt;br /&gt;&lt;br /&gt;Indeed, it seems like software license agreements have been around forever. We've accepted them, adapted to them, and basically ignored them. In the meantime, software companies have added more restrictions to their license agreements, lobbied legislators to create new laws that protect the restrictions, and quietly begun building case law in support of the software license regime.&lt;br /&gt;&lt;br /&gt;This is the software limbo. How low can we go? When will the laborers of the information age unite and say "enough is enough"?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-7519342395740630204?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/02/software-limbo.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-1191268682369638506</guid><pubDate>Tue, 24 Feb 2009 19:56:00 +0000</pubDate><atom:updated>2009-02-24T16:12:22.449-05:00</atom:updated><title>The Petcock Problem</title><description>Many years ago, I worked for the small town where I grew up. My title was Street Commissioner. This is a very small town, and I was a part time employee with one helper. Basically, I was the guy what fixed things. We had a very old network of water pipes that supplied water from several wells. The water system leaked in many places. Occasionally, a small leak turned into a big leak, and something had to be done about it.&lt;br /&gt;&lt;br /&gt;You might think that the first response to a big water leak would be to close the water valves in order to isolate the leak and prevent the loss of valuable water. Not so fast!&lt;br /&gt;&lt;br /&gt;First of all, in an interconnected network that had been upgraded and patched by piecework for many decades, it wasn't always possible for small localized segments to be isolated, and turning off the water for a large area would inevitably lead to discord.&lt;br /&gt;&lt;br /&gt;Second, closing even a single valve caused pressures throughout the system to change. Any pressure change anywhere in the system had the potential to cause new failures at weak points, which would just compound the problem.&lt;br /&gt;&lt;br /&gt;Furthermore, at some point repairs could be counterproductive and completely replacing parts of the network would be the best option. This would require time for the town council to approve the funds, and for contractors to be hired, and for the work to be scheduled and completed -- all while the leaking water is causing collateral damage to the roadway and inconveniencing the affected residents with low water pressure.&lt;br /&gt;&lt;br /&gt;Eventually the big leak had to be repaired, and the water had to be turned off &lt;em&gt;somewhere&lt;/em&gt; before the repair could be completed. The decision about where and how to accomplish this was not a simple decision, due to the competing factors involved, and the practical realities a small town is faced with.&lt;br /&gt;&lt;br /&gt;I call this problem the Petcock Problem. Imagine &lt;a href="http://en.wikipedia.org/wiki/Petcock"&gt;petcock valves&lt;/a&gt; scattered throughout a network of pipes. I call this the Petcock Problem because petcock valves typically have three positions, analogous to the notion of closing, opening, or redirecting connections on the network in order to isolate a fault.&lt;br /&gt;&lt;br /&gt;The Petcock Problem would apply in many situations involving complex networks, such as when a tree knocks down a power line or when an internet router dies. Sometimes the best solution is to isolate the fault to the most localized part of the network possible, thereby inconveniencing the least number of people at the expense of putting the larger network at greater risk of a much larger catastrophe. Sometimes the best solution is to shut down the entire network temporarily, thereby inconveniencing everybody that relies on the network, but removing any risk of further degradation while repairs are completed. Most of the time the best solution is somewhere in between these extremes. As the network ages and faults become more commonplace, at some point the best solution is to scrap the entire network and build a new one.&lt;br /&gt;&lt;br /&gt;This is the Petcock Problem, or "How do you stop the bleeding?". The solution involves balancing several variables, some of which are known quantities, some of which are wild guesses, and some of which are potentially very chaotic (in that a small change in value could have an unpredictable impact on the outcome).&lt;br /&gt;&lt;br /&gt;[Disclaimer: I'm sure that the study of &lt;a href="http://en.wikipedia.org/wiki/Network_topology"&gt;network topologies&lt;/a&gt; has its own terms of art and well researched algorithms for describing and solving these types of problems. I'm not claiming to have some new revelation about networks here. This is just my own little custom worldview.]&lt;br /&gt;&lt;br /&gt;In a future post I will explain how the Petcock Problem applies to something as diverse as the &lt;a href="http://www.cadcourt.com/Docket/207cv01189.aspx"&gt;Vernor lawsuit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-1191268682369638506?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/02/petcock-problem.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5100839410926571439</guid><pubDate>Thu, 12 Feb 2009 19:35:00 +0000</pubDate><atom:updated>2009-02-12T14:46:40.186-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>digital signature</category><category domain='http://www.blogger.com/atom/ns#'>protection</category><category domain='http://www.blogger.com/atom/ns#'>DWF</category><category domain='http://www.blogger.com/atom/ns#'>security</category><title>Autodesk Design Review 2010 Snake Oil Alert</title><description>From a &lt;a href="http://dwf.blogs.com/beyond_the_paper/2009/02/autodesk-design-review-2010-new-features-overview.html"&gt;new features overview of Autodesk Design Review 2010&lt;/a&gt; comes the following snake oil claim:&lt;br /&gt;&lt;blockquote&gt;Digital Signatures&lt;br /&gt;To help secure your data, you can now digitally sign DWFx files.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As I've &lt;a href="http://otb.manusoft.com/2008/12/design-file-locking-and-snake-oil.htm"&gt;explained before&lt;/a&gt;, digital signatures do not provide data security; they simply authenticate the person that applied the signature. Digital signatures are a welcome feature with many potential uses, but data security is not one of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5100839410926571439?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/02/autodesk-design-review-2010-snake-oil.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-7683255260976334092</guid><pubDate>Wed, 28 Jan 2009 17:00:00 +0000</pubDate><atom:updated>2009-02-26T00:06:58.510-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>discussion groups</category><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><title>Autodesk Discussion Group Facelift Offer</title><description>My participation in the &lt;a href="http://www.autodesk.com/discussion"&gt;Autodesk discussion groups&lt;/a&gt; has been severely curtailed since the notorious "upgrade" a few months ago. One of the &lt;a href="http://www.blog.cadnauseam.com/2008/10/21/the-autodesk-discussion-groups-are-awful/"&gt;many problems&lt;/a&gt; introduced by the upgrade is the loss of formatting. It's now virtually impossible to post messages that include inline AutoLISP or ObjectARX code without them being reformatted into unreadable garbage. Even attaching the code as a file is difficult (the "solution" is to rename files with a .txt extension!) As a result, many queries for programming help go unanswered. Autodesk has &lt;a href="http://discussion.autodesk.com/forums/ann.jspa?annID=125"&gt;made an attempt to provide a fix&lt;/a&gt;, but a survey of the posts in any of the programming groups shows that &lt;a href="http://otb.manusoft.com/Newsgroup%20needs%20complete%20overhaul.htm"&gt;it's not working&lt;/a&gt;*.&lt;br /&gt;&lt;br /&gt;* [Thread has been removed by Autodesk, so link was changed to point to archived thread.]&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.cadalyst.com/cadalyst/News/Autodesk-Announces-Restructuring/ArticleStandard/Article/detail/575955?contextCategoryId=3046"&gt;recently announced layoffs and related cost cutting measures at Autodesk&lt;/a&gt; have dimmed my hopes for a resolution. Therefore, I've decided to offer my services to fix the problem. Autodesk, I'm offering to donate my time to fix your discussion group software. Just give me access to a development and testing platform, and the right to modify or rewrite the code.&lt;br /&gt;&lt;br /&gt;Readers, can I get an "Amen"?&lt;br /&gt;&lt;a href="http://otb.manusoft.com/Newsgroup%20needs%20complete%20overhaul.htm"&gt;Newsgroup%20needs%20complete%20overhaul.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-7683255260976334092?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/01/autodesk-discussion-group-facelift.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>15</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-897751118920711899</guid><pubDate>Sat, 24 Jan 2009 22:07:00 +0000</pubDate><atom:updated>2009-01-24T17:42:02.909-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>ObjectARX</category><title>AECOPEN Utility</title><description>James Maeding of Hunsaker &amp; Associates contacted me recently about an irritating problem that his users have with the AECOPEN command in Land Desktop. The AECOPEN command replaces the core AutoCAD OPEN command in AEC verticals. The problem they have is that AECOPEN displays an initial project dialog that requires users to press a [Browse] button to open the file browser dialog. Since they want to browse for a file every time they use the AECOPEN command, James wondered if I could create some code to automatically "press" the Browse button every time the AECOPEN command is issued.&lt;br /&gt;&lt;br /&gt;I whipped up a little utility for AutoCAD 2007-2009 based products to do what James wanted, and it is now available on my &lt;a href="http://www.manusoft.com/Software/Freebies/Index.stm#ADSARX"&gt;freebies page&lt;/a&gt; as AecAutoOpen.zip. When the ARX module is loaded, AECOPEN behaves as if the user had immediately pressed the [Browse] button on the project dialog. If the [Ctrl] key is pressed, AECOPEN reverts to its original behavior.&lt;br /&gt;&lt;br /&gt;Why not just use the built in OPEN command instead? The AECOPEN command has some important side effects, according to James.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-897751118920711899?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2009/01/aecopen-utility.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-637917550282019300</guid><pubDate>Mon, 22 Dec 2008 23:15:00 +0000</pubDate><atom:updated>2009-10-06T15:36:42.488-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>programming</category><category domain='http://www.blogger.com/atom/ns#'>CUI</category><title>Missing Menu Madness</title><description>&lt;p&gt;One of my many complaints about about the CUI system introduced in AutoCAD 2006 is that it's not very friendly to third party developers. In my opinion, it's not very friendly to end users either, but I digress...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;One example of the unfriendly CUI is the case where a third party application installs a partial menu. In the pre-CUI days, adding a partial menu was an easy way to add an application specific menu to AutoCAD without making any changes to the end user's existing menu files. If the application was later uninstalled, the uninstall script could remove its menu and clean up the registry, leaving no trace behind. CUI breaks that scenario.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;When a partial menu is loaded into AutoCAD 2006 and later, the CUI system actually writes a reference to the new partial menu into the main .cui file. To make matters worse, there is no clean way to programmatically remove those references because there is no deterministic way to locate all the .cui files used by a specific instance of AutoCAD from an uninstall script running outside of AutoCAD.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This would not be the end of the world if AutoCAD simply ignored references to missing files, but it doesn't. When the CUI command starts, it detects the missing files and displays an obnoxious message box that must be dismissed before the command will continue.&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 105px; TEXT-ALIGN: center" alt="Unable to open file 'c:\program files\manusoft\superpurge\spurge2004.cui'" src="http://otb.manusoft.com/uploaded_images/MissingMenu1.png" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then to top it off, AutoCAD displays a second message box that also must be dismissed.&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 128px; TEXT-ALIGN: center" alt="Unable to locate 'spurge2004.cui'. This file is defined in the main CUI file, but has been moved, renamed, or deleted from the following location: c:\program files\manusoft\superpurge\spurge2004.cui To reload this file, type cuiload on the command line." src="http://otb.manusoft.com/uploaded_images/MissingMenu2.png" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I think it should be obvious even to an untrained UI designer how ridiculous this is.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In AutoCAD 2006 and 2007, the solution is to dutifully dismiss both dialogs, then when the CUI dialog finally appears, click [Apply] to rewrite the .cui file without the missing partial menu references. In AutoCAD 2008 and 2009, you have to first expand the 'Partial CUI Files' node in the Customization tab, then right-click on the unresolved partial menu file and select 'Unload CUI File', then click [Apply].&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-637917550282019300?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/12/missing-menu-madness.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-8464470781583922585</guid><pubDate>Sat, 06 Dec 2008 19:52:00 +0000</pubDate><atom:updated>2008-12-06T17:23:42.908-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>CADVault</category><category domain='http://www.blogger.com/atom/ns#'>CADLock</category><category domain='http://www.blogger.com/atom/ns#'>legal</category><category domain='http://www.blogger.com/atom/ns#'>digital signature</category><category domain='http://www.blogger.com/atom/ns#'>AU 2008</category><category domain='http://www.blogger.com/atom/ns#'>encryption</category><category domain='http://www.blogger.com/atom/ns#'>security</category><title>Design File Locking and Snake Oil Security</title><description>The increased sharing of electronic CAD data (ala &lt;a href="http://en.wikipedia.org/wiki/Building_Information_Modeling"&gt;BIM&lt;/a&gt;) holds a lot of promise, but it also exposes companies and individuals to additional liability and risk. This additional risk is coming into focus more and more as &lt;a href="http://otb.manusoft.com/2007/01/autocad-drawing-files-possession-is-910.htm"&gt;actual cases of costly legal battles&lt;/a&gt; confront engineers and architects.&lt;br /&gt;&lt;br /&gt;The June 2008 &lt;a href="http://www.augi.com/autocad/results.asp?cycle=ACAD008"&gt;AUGI wishlist results&lt;/a&gt; contain "Design File Locking" as the top wish by a substantial margin, and Shaan Hurley lists it as number 3 in the &lt;a href="http://autodesk.blogs.com/between_the_lines/2008/12/au-2008-wednesday-autocad-wish-list.html"&gt;AU 2008 AutoCAD wish list&lt;/a&gt;. Clearly, interest in file and IP security has been growing steadily.&lt;br /&gt;&lt;br /&gt;As demand for IP security grows, there are sure to be snake oil security vendors trying to cash in on it. I received a spam email a few days ago from SafeNet, Inc. promising "a cost-effective and easy to integrate solution that provides reliable and effective security through the use of digital signatures." Whenever I see such statements with a long string of buzzwords, my snake oil alarm goes on alert. Digital signatures are for authentication and establishing trust -- they cannot and do not provide "reliable and effective security", although I suppose they could be used by a system that does.&lt;br /&gt;&lt;br /&gt;In the last year or two, a number of companies have claimed to market software that "secures" AutoCAD DWG files. When I see such a claim, it invariably refers to software that creates an anonymous unequally scaled MINSERT entity. These can be created or "exploded" with a few lines of AutoLISP code. Frequently these companies claim to "encrypt" the drawing, which may sound sexy, but is an outright lie. If this is a level of "security" that meets your needs, at least use one of the many free versions posted throughout the internet (&lt;a href="http://www.dotsoft.com/freestuff.htm"&gt;DETER.VLX from DotSoft&lt;/a&gt; is one I know of).&lt;br /&gt;&lt;br /&gt;There are solutions, but they always require changes in the workflow process that involve difficult tradeoffs and careful evaluation of what is technically feasible and practical versus the costs of implementing the changes. There is no such thing as installing a single piece of software to instantly solve the problem. If you are looking for ways to protect intellectual property in your drawing files, don't be fooled by snake oil security vendors.&lt;br /&gt;&lt;br /&gt;Disclaimer: One of my hats is the president of &lt;a href="http://www.cadlock.com/"&gt;CADLock, Inc.&lt;/a&gt;, makers of &lt;a href="http://www.cadlock.com/products/CADVault/"&gt;CADVault for AutoCAD&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-8464470781583922585?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/12/design-file-locking-and-snake-oil.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-4288018133386632776</guid><pubDate>Wed, 15 Oct 2008 22:58:00 +0000</pubDate><atom:updated>2008-10-15T18:59:37.806-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>SolidWorks</category><category domain='http://www.blogger.com/atom/ns#'>legal</category><category domain='http://www.blogger.com/atom/ns#'>file formats</category><category domain='http://www.blogger.com/atom/ns#'>ODA</category><title>Propagandapedia</title><description>&lt;p&gt;Did you ever wonder what press release writers do in their spare time? Given Autodesk's recent &lt;a href="http://www.cadcourt.com/Docket/308cv04397AutodeskvSolidWorks.aspx"&gt;trademark litigation with SolidWorks&lt;/a&gt; and &lt;a href="http://www.cadcourt.com/Docket/92047002AutodeskvODA.aspx"&gt;related efforts&lt;/a&gt; by &lt;a href="http://www.autodesk.com/"&gt;Autodesk&lt;/a&gt; to trademark "DWG", and given the fact that &lt;a href="http://www.uspto.gov/"&gt;US Patent and Trademark Office&lt;/a&gt; (USPTO) trademark examiners are &lt;a href="http://iplitigator.huschblackwell.com/2007/07/articles/trademark/trademark-trial-appeal-board-says-internet-is-here-to-stay/"&gt;known to use Wikipedia during their research&lt;/a&gt;, it doesn't take an evil genius to realize that a little subversive editing here and there might be helpful to the corporate cause. So, I decided to use &lt;a href="http://wikiscanner.virgil.gr/"&gt;Wikiscanner&lt;/a&gt; to go spelunking through the labyrinth of Wikipedia editing history to see if I could unearth any nuggets.&lt;/p&gt;&lt;p&gt;It didn't take long to find some interesting edits. For example, in the &lt;a href="http://en.wikipedia.org/w/index.php?diff=prev&amp;amp;oldid=80624684"&gt;edit history for "SolidWorks"&lt;/a&gt; you can see that someone from an &lt;a href="http://wikiscanner.virgil.gr/f.php?ip1=198.102.112.0-255&amp;amp;ip2=12.160.193.224-239&amp;amp;ip3=203.200.42.0-127&amp;amp;ip4=132.188.0.0-255.255"&gt;Autodesk IP address&lt;/a&gt; changed "and has since been copied by others like [[Autodesk Inventor]]" to "and is now part of the midrange CAD market along with [[Autodesk Inventor]]". Eventually this changes to "and is currently a leader in the 'midrange' CAD market", and from that to "It is currently one of the most popular products in the 3D mechanical CAD market" with a citation to a &lt;a href="http://www.solidworks.com/sw/655_ENU_HTML.htm"&gt;SolidWorks web page&lt;/a&gt; as evidence of the claim.&lt;/p&gt;&lt;p&gt;I expected to find plenty of quid pro quo, but I have to say, either SolidWorks' press release writers are a lot sneakier than Autodesk's, or they have a lot less free time. According to this list of &lt;a href="http://wikiscanner.virgil.gr/f.php?ip1=12.159.140.0-255&amp;amp;ip2=206.34.34.0-255&amp;amp;ip3=12.145.143.96-111&amp;amp;ip4=193.130.25.240-255&amp;amp;ip5=12.175.3.128-159"&gt;edits from SolidWorks IP addresses&lt;/a&gt;, there haven't been any edits made to Autodesk entries since about March of 2007. In October of 2006 someone from SolidWorks &lt;a href="http://en.wikipedia.org/w/index.php?diff=prev&amp;amp;oldid=84937844"&gt;changed a few things in the entry for "Autodesk Inventor"&lt;/a&gt;, but then things appear to have cooled off considerably.&lt;/p&gt;&lt;p&gt;So what about "DWG"? The entry for "AutoCAD DWG" contains &lt;a href="http://en.wikipedia.org/w/index.php?diff=prev&amp;amp;oldid=102158965"&gt;this edit&lt;/a&gt; from an Autodesk IP address made in January of 2007, but not much since. Two months later, someone from Autodesk &lt;a href="http://en.wikipedia.org/w/index.php?diff=prev&amp;amp;oldid=118134146"&gt;changed&lt;/a&gt; "for that reason they constituted a consortium ([[OpenDWG]]) to develop open tools to access DWG data" to "for that reason they constituted a consortium ([[OpenDWG]]) to reverse engineer Autodesk's technology and access DWG data". Since then, things have been fairly quiet on the "DWG" front.&lt;/p&gt;&lt;p&gt;My conclusion is that blog posts like &lt;a href="http://blog.novedge.com/2007/08/cad-companies-p.html"&gt;this one from Franco Folini at NOVEDGE Blog&lt;/a&gt; may have resulted in more strict internal controls being instituted over the editing of Wikipedia content. I have no doubt that it still goes on, but covertly enough to provide plausible deniability.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-4288018133386632776?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/10/propagandapedia.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-1002311297155228464</guid><pubDate>Sun, 28 Sep 2008 01:28:00 +0000</pubDate><atom:updated>2008-09-27T22:19:28.992-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>AutoCAD</category><category domain='http://www.blogger.com/atom/ns#'>marketing</category><title>Update vs. Service Pack</title><description>Of course I'm talking about Autodesk's newly reinvented nomenclature for &lt;a href="http://usa.autodesk.com/adsk/servlet/ps/dl/index?siteID=123112&amp;amp;id=2334435&amp;amp;linkID=9240618"&gt;bug fixes&lt;/a&gt;. Once upon a time they were known as bug fixes, then service packs, and now "updates". Is the Autodesk marketing department running amok? The subtle spin is certainly a sign of the times, but I wonder if the change in terminology comes about for another reason as well.&lt;br /&gt;Autodesk promises "&lt;a href="http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;amp;id=612485"&gt;features extensions&lt;/a&gt;" to subscription customers. They have had difficulty delivering such extensions on a consistent basis. One of the reasons, I suspect, is that developers of extensions encounter the same brick walls that third party developers battle all the time: AutoCAD bugs, of course; but also incomplete APIs and feature limitations. It's possible that updates not only fix bugs, but also fill gaps so that extension developers can get their extensions working.&lt;br /&gt;Then again, the change in terminology might be part of a new fad. My wife, who is an engineer working in the automotive industry, informs me that they no longer issue drawing revisions in her company. Instead, they now issue "updates". I wonder how long it will be before auto mechanics stop repairing cars and start updating them instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-1002311297155228464?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/09/update-vs-service-pack.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-2657862868246264393</guid><pubDate>Sun, 24 Aug 2008 19:42:00 +0000</pubDate><atom:updated>2008-08-24T17:43:21.666-04:00</atom:updated><title>OpenDCL Quick Intro</title><description>If you're an AutoLISP programmer, you've probably heard about &lt;a href="http://www.opendcl.com/"&gt;OpenDCL&lt;/a&gt;. Maybe you've even checked it out, but it looked complicated and you weren't sure whether it was worth the trouble to learn how to use it. Either way, do yourself a favor and spend 10 minutes to go through the following 10-step quick introduction to OpenDCL.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=187950&amp;amp;package_id=220267&amp;amp;release_id=570817"&gt;Download&lt;/a&gt; and install OpenDCL Studio. Select the latest version in your desired language (ENU in the filename means US English). The download is an .msi file that can be cleanly uninstalled afterward.&lt;/li&gt;&lt;li&gt;Start AutoCAD (2004 or later). Use the APPLOAD command to load _MasterDemo.lsp from the OpenDCL Studio samples folder (it will be located in a language subfolder of the main OpenDCL Studio folder). When you close the APPLOAD dialog, the OpenDCL 'MasterDemo' dockable form will appear.&lt;/li&gt;&lt;li&gt;Click on the [ListView] button to run the ListView sample. The ListView sample is very simple and will demonstrate some basic principles of OpenDCL. Leave it running as you proceed through the following steps.&lt;/li&gt;&lt;li&gt;Locate and open ListView.lsp in the OpenDCL Studio samples folder. ListView.lsp contains all the code for the ListView sample. Look for the c:ListViewDlg_Close_Clicked function defined near the end of that file. That function is called an "event handler", and it is the lisp function that is executed when the [Close] button is pressed. The event handler for the [Close] button simply closes the dialog. The c:ListViewDlg_OnInitialize event handler function initializes the controls on the dialog before it is displayed.&lt;/li&gt;&lt;li&gt;Locate and open ListView.odcl in the OpenDCL Studio samples folder. Files with an .odcl extension can be opened and edited in OpenDCL Studio. OpenDCL Studio is used to design the user interface elements in an OpenDCL project. In the project tree pane, open the 'Modal Forms' folder, then double click on ListViewDlg. The ListView form will be displayed in design mode.&lt;/li&gt;&lt;li&gt;Click on the [Close] button on the ListView form. In the font toolbar at the top of the editor, press the [B] button to make the font bold. Notice that the button's caption becomes bold. In the 'Properties' pane, double click on the 'Height' property value and change it to 20. Press [Enter] to apply the new value. Use your mouse to drag the bottom of the button in design view to resize it dynamically.&lt;/li&gt;&lt;li&gt;Leaving OpenDCL Studio open, switch back to AutoCAD. Resize the ListView dialog, and notice how the controls it contains are also resized. Now switch back to OpenDCL Studio, make sure the [Close] button is selected, then click in the right column of the '(Wizard)' property in the Properties pane (or right click on the button control and select 'Properties' in the control's context menu). In the Control Properties Wizard, the Geometry tab shows that the button's "Left Side Alignment" has been set to "Offset From Center of Dialog" and it's "Top Side Alignment" has been set to "Offset From Bottom Edge". Once these properties are set, no additional code is needed for the control to react correctly when the dialog is resized.&lt;/li&gt;&lt;li&gt;Exit AutoCAD, then restart. Enter the OPENDCL command. This command demand-loads the OpenDCL Runtime using AutoCAD demand loading mechanism. The OpenDCL Runtime must be loaded before the OpenDCL functions will work. The OpenDCL Studio installation includes OpenDCL Runtime, so it already exists on your computer.&lt;/li&gt;&lt;li&gt;If you are developing an application for use by others, you'll need to download and distribute the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=187950&amp;amp;package_id=219635&amp;amp;release_id=571922"&gt;OpenDCL Runtime&lt;/a&gt; along with your application. This is best done by incorporating the OpenDCL Runtime merge module for your language directly into your own application's installation script. Alternatively, you can distribute the standalone OpenDCL Runtime .msi file for your language, or publish the URL where end users can download the latest version.&lt;/li&gt;&lt;li&gt;Switch back to OpenDCL Studio and double click on the [Close] button control. Intelligent help displays all the properties, methods, and events of the selected control, including their AutoLISP syntax. Click on a property, method, or event in the left pane to see detailed information for it.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Once you complete these ten steps, you are only a few minutes away from creating a fully functional OpenDCL application. Give it a try!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-2657862868246264393?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/08/opendcl-quick-intro.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-5979226320030551214</guid><pubDate>Wed, 30 Jul 2008 03:35:00 +0000</pubDate><atom:updated>2008-07-30T00:02:10.015-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Autodesk</category><category domain='http://www.blogger.com/atom/ns#'>legal</category><category domain='http://www.blogger.com/atom/ns#'>CAD Industry</category><title>Ed Foster: Loss Of A Legend</title><description>&lt;a href="http://www.infoworld.com/"&gt;InfoWorld&lt;/a&gt; columnist and legendary consumer advocate Ed Foster &lt;a href="http://www.eff.org/deeplinks/2008/07/memoriam-ed-foster-1949-2008"&gt;died over the weekend&lt;/a&gt;. Ed was a tireless crusader for consumer rights in the digital age, and he will certainly be missed. For many years Ed has authored &lt;a href="http://weblog.infoworld.com/gripeline/"&gt;GripeLine&lt;/a&gt;, where he called companies and politicians to task for abusive anti-consumer practices.&lt;br /&gt;&lt;br /&gt;I've written before about how Ed exposed and publicised shamefully lopsided &lt;a href="http://www.gripe2ed.com/scoop/section/Eula"&gt;software license agreements&lt;/a&gt;, including &lt;a href="http://www.gripe2ed.com/scoop/story/2004/9/26/13427/0228"&gt;Autodesk's and Adobe's&lt;/a&gt;. Recently, Ed &lt;a href="http://weblog.infoworld.com/gripeline/archives/2008/05/you_can_book_a.html"&gt;commented about the May, 2008 Vernor decision&lt;/a&gt; (see my &lt;a href="http://www.adskvoda.com/"&gt;ADSK v ODA web site&lt;/a&gt; for more information about the Vernor case).&lt;br /&gt;&lt;br /&gt;It will be no easy task to fill Ed's shoes. We can be certain, though, that his work must go on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-5979226320030551214?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/07/ed-foster-loss-of-legend.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9632187.post-842563496331321104</guid><pubDate>Sat, 28 Jun 2008 03:48:00 +0000</pubDate><atom:updated>2008-06-28T00:20:39.413-04:00</atom:updated><title>The Magic Baseball Bat</title><description>This is a story about my 11 year old son, Nick, and a father's pride.&lt;br /&gt;&lt;br /&gt;I coached Nick's Little League baseball team this year, and now that the regular season is over I'm coaching an 11-12 year old All Star team. Being the youngest on the team, Nick struggles with his self confidence even though he's an excellent baseball player. He's not the tallest player, but he's faster and more athletic than many of his older teammates. Even so, he doesn't want to take any risks or make any mistakes, and his insecurities often prevent him from performing at his best.&lt;br /&gt;&lt;br /&gt;A few weeks ago in the league tournament Nick hit a ball against the fence, just short of going over. That was the closest he came all season to hitting one out, and was perhaps the first time he started to believe that it was possible. A few nights after our team was eliminated from the championship tournament, a kid hit a walk off grand slam with 1 out in the bottom of the 6th, down 9 - 6. Nick and I were there to watch it. I heard that the same kid hit one more out of the park later in the tournament. Those were very likely the only two over-the-fence home runs all year in our local league.&lt;br /&gt;&lt;br /&gt;Sometime during tournament time, Nick's baseball bat disappeared from the trunk of my car. I suspect he didn't close the trunk all the way one night, and someone stole it during the night. The following week, in exchange for Nick agreeing to mow the lawn this summer, I bought him a shiny new baseball bat, a new bat bag, and new cleats to replace the old ones with holes in their toes. Nick was itching to play again so he could try out his new toys.&lt;br /&gt;&lt;br /&gt;Fast forward to the all star team's second scrimmage earlier this week. In his first at bat, Nick got walked (then stole second, third, and home over the course of the next few pitches). In his second at bat, Nick hit a hard line drive into the gap, and got to second with a stand-up double. It was just a scrimmage, there was no pressure, and Nick was feeling good about himself, perhaps even daring to feel confident in himself.&lt;br /&gt;&lt;br /&gt;His third time at the plate, Nick crushed the first pitch well over the center field fence amid groans from the opposing team. There was a mixture of surprise and elation among the other players on our team. Some had never seen a player at this level hit a ball over the fence, and I even had to remind them that they were allowed to enter the field to greet Nick as he crossed home plate.&lt;br /&gt;&lt;br /&gt;The excitement was soon forgotten as the game moved along, until Nick came up to bat again and everyone jokingly told him to hit another home run. And then, with two strikes, two out, and two on, he did it again!&lt;br /&gt;&lt;br /&gt;It's amazing how much difference a shiny new bat can make.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9632187-842563496331321104?l=otb.manusoft.com%2Findex.htm' alt='' /&gt;&lt;/div&gt;</description><link>http://otb.manusoft.com/2008/06/magic-baseball-bat.htm</link><author>owenw@manusoft.com (Owen Wengerd)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item></channel></rss>