<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-7274961</id><updated>2026-01-13T08:03:52.263-06:00</updated><category term="cad"/><category term="solidworks"/><category term="protoolkit"/><category term="api"/><category term="pro toolkit"/><category term="visual studio"/><category term="test"/><category term="proengineer"/><category term="brl-cad"/><category term="example"/><category term="extensions"/><category term="open cascade"/><category term="security"/><category term="3ds max"/><category term="autodesk"/><category term="batch"/><category term="bookmarks synchronizer"/><category term="c++"/><category term="constructive solid geometry"/><category term="csg"/><category term="flexidesign"/><category term="freecad"/><category term="license"/><category term="mcad"/><category term="mms"/><category term="office"/><category term="pdm"/><category term="plm"/><category term="runas"/><title type="text">Open Source, Computer-Aided Design, Pro/Toolkit, SolidWorks API</title><subtitle type="html">Interested in Open Source or CAD development?</subtitle><link href="http://ossandcad.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="http://www.blogger.com/feeds/7274961/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry><id>tag:blogger.com,1999:blog-7274961.post-120699958862243420</id><published>2012-03-12T17:00:00.000-05:00</published><updated>2012-03-12T17:00:02.085-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type="text">Lesson 2: IntegratedTests, IntegratedTests and more IntegratedTests</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;Why Integrated Tests?&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;One of the biggest goals I had in the development of the latest version of FlexiDesign was to ramp up the number of automated tests that run as part of our build system. And I am talking about Integrated Tests not unit or functional&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;(those are important too, of course).&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I far prefer Integrated Tests primarily because it checks the full product from beginning to end.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;Integrated Tests of a CAD add-in? Really?&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;But how do you test a product that is an add-in to a CAD system? The CAD system controls when the add-in product is loaded and when it is available to the end-user to interact with through a UI. It is not an easy task to simulate all these actions in an automated test (something that runs with no developer/user interaction whatsoever).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;But there is a way.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;So what is the solution?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;If you have read my previous blog posts, then you may have found one of my downloads &lt;a href="http://ossandcad.blogspot.com/2009/07/swx-batch-mode-integrated-tests-with.html"&gt;SWXBATCH_CEEFIT&lt;/a&gt; which couples the open source Integrated Test Framework (CEEFIT) with a simple wrapper to start SWX, call some SWX API, verify the output using CEEFIT, and then stop SWX. If you are interested, then read &lt;a href="http://ossandcad.blogspot.com/2009/07/swx-batch-mode-integrated-tests-with.html"&gt;that article&lt;/a&gt; or even email me at ganeshram iyer [at] gmail dot com.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You can download the framework here:&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s200/zip.jpg" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="text-align: left;"&gt;&lt;a href="http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip"&gt;http://ossandcad.googlecode.com/files/swxb&lt;span id="goog_943789453"&gt;&lt;/span&gt;&lt;span id="goog_943789454"&gt;&lt;/span&gt;atch_ceefit_6_16_2009.zip&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Or you can browse the source code here:&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQuTHnOpVeVK7Evd_00Ey7An20NbiE8PFM4NnufeN6VCfxTMLI_bF0Zu8_GcpqsJM91JjckxljeaNjXW0K8oP-u1z7blH8u4DZnuNypMcJGh18-g95V035YkI1HjUUGMMebwSnXw/s200/subversion_logo-200x173.JPG" style="margin-left: auto; margin-right: auto;" /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;a href="https://ossandcad.googlecode.com/svn/trunk/swxbatch_ceefit"&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;https://ossandcad.googlecode.com/svn/trunk/swxbatch_ceefit&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;span style="font-size: large;"&gt;Extending SWXBATCH_CEEFIT&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The download assumes that you have SolidWorks already installed at a specific path (I think it is C:\Program Files\SolidWorks). This is important, because SolidWorks registers its API in the Windows Registry and SWXBATCH_CEEFIT relies on that registration to call the SWX API over COM.&lt;a href="http://draft.blogger.com/"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;By default SWXBATCH_CEEFIT calls SolidWorks 2009, but making it call other versions of SolidWorks is pretty easy too:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Simply change the headers that you #include in SWX.cpp&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;If you want to build against multiple SWX versions, then create a new configuration in the project, add a preprocessor definition and use that to #ifdef which SWX headers to #include. e.g.:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;#ifdef SWX2011&lt;br /&gt;#include "swx2011\amapp.h"&lt;br /&gt;#include "swx2011\swpublished_i.h"&lt;br /&gt;#include "swx2011\swconst.h"&lt;br /&gt;#else&lt;br /&gt;// Solidworks includes for e.g. 2009&lt;br /&gt;#include "amapp.h"&lt;br /&gt;#include "swpublished_i.h"&lt;br /&gt;#include "swconst.h"&lt;br /&gt;#endif&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;Of course you need to have the specific version of SWX installed too :)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;SWXBATCH_CEEFIT also needs a valid SWX License to run, since it actually starts SWX to "do its business".&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: large;"&gt;Summary&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;SWXBATCH_CEEFIT runs on 32-bit, 64-bit, Windows XP, Vista, and 7, SolidWorks 2009, 2010, 2011, 2012. So the coverage of test platforms and OS is pretty comprehensive, though the limitation is that the specific SWX version itself needs to run on the OS - you may have to check with SWX support to determine those details. You may have to add some configurations yourself though (or email me and I can send you the latest version I have that has all the required settings).&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;We use this to test the ins and outs of FlexiDesign and it dramatically helps improve the stability of the product. We run Integrated Tests on FlexiDesign every night - it takes a few hours to run the entire thing due to all the combinations tested - and we only need to edit/add the tests when we have a design change that changes the behavior of the product - which is primarily on major functionality change or major feature addition or major bug change (read: not often).&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;In short, if you develop CAD Addins (viz. SolidWorks), try out SWXBATCH_CEEFIT and let me know if you find it useful. We certainly do.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/120699958862243420/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2012/03/lesson-2-integratedtests.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/120699958862243420" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/120699958862243420" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2012/03/lesson-2-integratedtests.html" rel="alternate" title="Lesson 2: IntegratedTests, IntegratedTests and more IntegratedTests" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s72-c/zip.jpg" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-3076661001488504075</id><published>2012-03-11T17:24:00.000-05:00</published><updated>2012-03-11T17:24:16.310-05:00</updated><title type="text">Solution for "Windows Scripting Host: Can't find a script engine 'javascript'"</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;br /&gt;
Using TortoiseSVN's 'Edit Conflicts' on conflicts in DOCX files, used to throw up a message box with a text similar to:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Windows Script Host: Can't find a script engine "javascript" for&amp;nbsp;C:\Program Files\TortoiseSVN\Diff-Scripts\merge-docx.js&lt;/blockquote&gt;
&lt;span style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;
To solve this problem, I initially thought the problem was with TortoiseSVN. Was I barking up the wrong tree!&lt;br /&gt;
&lt;br /&gt;
Turns out that the problem is related to Windows Script Host and the solution is much simpler:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Open a Command Prompt with Administrative privileges (cmd)&lt;/li&gt;
&lt;li&gt;Simply enter&lt;br /&gt;&lt;br /&gt;regsvr32 jscript.dll&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;There isn't a 3rd step :-)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Blogging my solution as I didn't find a straight forward answer to my problem. Hope you find it useful.&lt;/div&gt;
&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/3076661001488504075/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2012/03/solution-for-windows-scripting-host.html#comment-form" rel="replies" title="12 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/3076661001488504075" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/3076661001488504075" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2012/03/solution-for-windows-scripting-host.html" rel="alternate" title="Solution for &quot;Windows Scripting Host: Can't find a script engine 'javascript'&quot;" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-5860238244621910415</id><published>2011-11-18T17:00:00.000-06:00</published><updated>2011-11-19T10:14:58.364-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="flexidesign"/><title type="text">Lesson 1: Licensing is part of Software Engineering</title><content type="html">&lt;br /&gt;
For the better part of this year, 2011, I was involved in the commercial release of a novel 2D to 3D conversion software, FlexiDesign. During the development, test and release to manufacturing (RTM) of FlexiDesign I picked up a few nuggets of knowledge and experience that I don't hear being discussed often, especially in this cloud-centric world. Perhaps it was discussed fervently a decade or two ago when desktop technologies were cool, but still relevant today since not all technologies are ready for the cloud (just yet).&lt;br /&gt;
&lt;br /&gt;
One of the lessons I learned during the final development sprint was how important it is to incorporate the requirements of a License Manager early in the development cycle.&lt;br /&gt;
&lt;br /&gt;
Briefly (for the impatient):&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The License Manager requirements should be considered as part of the rest of your Software Engineering tasks&lt;/li&gt;
&lt;li&gt;The License Manager should support Network Licenses&lt;/li&gt;
&lt;li&gt;The License Manager must be customizable (preferably through API)&lt;/li&gt;
&lt;li&gt;The License Manager should support DLLs in addition to EXEs&lt;/li&gt;
&lt;li&gt;The License Manager should preferably be the same as the host CAD system&lt;/li&gt;
&lt;/ol&gt;
In Detail (for those of you who are still reading):&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The License Manager is part of Software Engineering&lt;br /&gt;While most desktop applications can incorporate an off-the-shelf License Manager, the requirement has to be dealt with more carefully when you are developing CAD Add-Ins. While you can simply bolt on many License Managers on to a regular non-add-in product, it may not be possible to do so with CAD add-in products, since the CAD system may need to talk some parts of your product without any limitations and you want to protect/lock other parts of you product. For example to register an add-in with&amp;nbsp;&amp;nbsp;SolidWorks, you need to make sure that the ConnectToSW(), DisconnectFromSW(),&amp;nbsp;RegisterFunction() and&amp;nbsp;UnregisterFunction() are not locked away by your License Manager. Else your add-in may not load at all.&lt;/li&gt;
&lt;li&gt;The License Manager should support Network Licenses&lt;br /&gt;Another requirement that has high priority is the availability of Network Licenses. CAD Administrators don't want to maintain separate licenses per PC, since that is very inefficient and time consuming. So the License Manager you select must be available over the network for your add-in to connect to validate the license. This also limits the potential candidates of License Managers leaving you with even fewer choices.&lt;/li&gt;
&lt;li&gt;Customizable License Manager (preferably through API) AND&lt;/li&gt;
&lt;li&gt;License Manager should support DLLs&lt;br /&gt;With FlexiDesign, we realized that the default behavior of most License Managers is to prevent the licensed software from running. With CAD systems, add-ins are loaded on startup and preventing the DLL from loading (e.g. if the license for your product has expired) might prevent the CAD system from starting up - which most people may agree is not a good thing.&lt;/li&gt;
&lt;li&gt;Same License Manager as the host CAD&lt;br /&gt;If at all possible, your License Manager should be the same as the the one your CAD system uses. This is not normally possible, but if you build for Pro/Engineer then I believe they use FlexLM License Manager (&lt;a href="http://www.flexerasoftware.com/products/software-licensing.htm"&gt;http://www.flexerasoftware.com/products/software-licensing.htm&lt;/a&gt;). SolidWorks seems to use an in-house build License Manager - SolidNetWork License Administrator (if I got the name right).&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
So after all those details, the License Manager we selected for FlexiDesign is ........ for me to know and you to find out. Sorry. Can't reveal company information.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you are interested in cracking software licenses, then I found a nice starter article at&amp;nbsp;&lt;a href="http://www.zabkat.com/blog/30Jul11-dummy-software-cracks.htm"&gt;http://www.zabkat.com/blog/30Jul11-dummy-software-cracks.htm&lt;/a&gt;, though I don't personally recommend such possibly illegal activities.&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/5860238244621910415/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2011/11/lesson-1-licensing-is-part-of-software.html#comment-form" rel="replies" title="8 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5860238244621910415" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5860238244621910415" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2011/11/lesson-1-licensing-is-part-of-software.html" rel="alternate" title="Lesson 1: Licensing is part of Software Engineering" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-8807806655066938037</id><published>2011-09-05T14:18:00.001-05:00</published><updated>2011-09-05T14:18:56.334-05:00</updated><title type="text">Back after a long break</title><content type="html">If you have been following my blog I apologize for not posting for so long. My last post was in Nov 2010. If you were wondering where I disappeared to, rest assured I have a valid reason.&lt;br /&gt;
&lt;br /&gt;
I have never spoken about my day job and I finally am able to. I work for &lt;a href="http://www.aspire3d.com/"&gt;Imagecom Inc&lt;/a&gt;. a company in Arlington TX that has spent the last few years developing an absolutely unique, radical CAD solution. While the &amp;nbsp;product (which I will talk of soon, hold on to your hats), is not a new idea, the solution that we have come up with is one that is not available anywhere else.&lt;br /&gt;
&lt;br /&gt;
The product is called &lt;a href="http://www.aspire3d.com/products/flexidesign"&gt;FlexiDesign&lt;/a&gt;. It is a semi-automated 2D drawing to 3D model conversion tool that fits in the CAD system of your choice. The resulting 3D model is fully parametric and feature-based.&lt;br /&gt;
&lt;br /&gt;
If you have worked in the CAD domain, either modeling or developing CAD apps or add-ins, you have definitely heard of automated, semi-automated or manual 2D to 3D conversion tools. Some are:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://labs.autodesk.com/utilities/2d_to_3d_tool/"&gt;2D to 3D Tool for Autodesk Inventor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.solidworks.com/sw/DemoLibrary/2d-to-3d.htm"&gt;SolidWorks 2D to 3D&lt;/a&gt; - The 2nd video titled "Leveraging existing 2D Design Data" shows how SolidWork's 2D to 3D works&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ptc.com/products/packages/autobuildz/index.htm"&gt;PTC Autobuildz&lt;/a&gt;&amp;nbsp;- A bit dated, too, but should show how Autobuildz works.&lt;/li&gt;
&lt;/ul&gt;
There may be others, but these are the more well known ones and are from the big boys, each part of the oligopoly that is the CAD industry.&lt;br /&gt;
&lt;br /&gt;
In the next few posts I will be talking about some of my experiences developing a CAD Add-in product/solution. While my plans are not finalized, I hope to discuss topics like licensing, CAD API (the good and the bad), development practices, and my favorite topic - testing. A lot of the tools that I have uploaded as part of this blog were instrumental in developing and deploying FlexiDesign.&lt;br /&gt;
&lt;br /&gt;
So keep an eye on this blog and I will keep it updated as often as possible.</content><link href="http://ossandcad.blogspot.com/feeds/8807806655066938037/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2011/09/back-after-long-break.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8807806655066938037" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8807806655066938037" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2011/09/back-after-long-break.html" rel="alternate" title="Back after a long break" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-7947339375038585335</id><published>2010-11-04T19:00:00.020-05:00</published><updated>2010-11-04T19:00:00.284-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="license"/><title type="text">New license for my SWXBATCH_CEEFIT project</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Have you heard that the CeeFIT website is back up and running? Well it came back up a few months ago. Thank Heavens.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;But the author kindly pointed out to me that I was not complying with the original license of the CeeFIT website, i.e. the "&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; white-space: pre;"&gt;GNU GENERAL PUBLIC LICENSE &lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; white-space: pre;"&gt;Version 2"&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; white-space: pre;"&gt; as mentioned &lt;a href="http://ceefit.woldrich.com/?page=License"&gt;here&lt;/a&gt;. So to comply I had to change the license of one my projects, specifically the SWXBATCH_CEEFIT. Unfortunately Google Code (where I host the source code of my projects) doesn't allow me to specify different licenses for individual projects. So I had to change the license associated with all my projects to the GPL v2, though this only really affects the SWXBATCH_CEEFIT project. I have added a note on the home page to inform of the changes, but am hoping repeating this information on my blog will help clarify the issue.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; white-space: pre;"&gt;As for my other projects, you are free to do what you want with it since I have not attached any license to the projects themselves.&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;SO DOES THIS AFFECT YOU?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="max-width: 65em;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The SWXBATCH_CEEFIT is primarily intended as a test framework. If you use it as intended and don't distribute your test framework to your clients (i.e. you only use the test framework in house) then the license change from 'New BSD' to 'GPL' doesn't affect you. If you are unable to comply with this requirement, I am afraid I can't help, since the GPL is viral in that way.&lt;/span&gt;&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/7947339375038585335/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/11/new-license-for-my-swxbatchceefit.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7947339375038585335" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7947339375038585335" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/11/new-license-for-my-swxbatchceefit.html" rel="alternate" title="New license for my SWXBATCH_CEEFIT project" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-271021275278967965</id><published>2010-10-08T17:30:00.015-05:00</published><updated>2010-10-08T17:30:00.426-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="pro toolkit"/><category scheme="http://www.blogger.com/atom/ns#" term="protoolkit"/><title type="text">My Continuous Integration Build is too fast</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;We all know of Continuous Integration and the importance of having really fast builds, especially on a central build server. If not read up on&amp;nbsp;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;http://martinfowler.com/articles/continuousIntegration.html&lt;/a&gt;. You may have also heard that a good build time to shoot for is ~10-15 minutes for each regular build (not accounting for nightly builds) &amp;nbsp;at least for small-medium sized projects. If you are interested there are numerous &lt;a href="http://stackoverflow.com/questions/1202365/ways-to-speed-up-build-time-c-unmanaged-c"&gt;discussions&lt;/a&gt; and &lt;a href="http://gamesfromwithin.com/physical-structure-and-c-part-2-build-times"&gt;posts&lt;/a&gt; on this.&amp;nbsp;So like any good build engineer striving for efficiency and speed I attempted to reduce build times for the project I work on, at least till now.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Some details on the project build:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Our projects are currently in Visual Studio 2005 (we are in the process of upgrading to 2010 but that is another story).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Almost all our projects are native C++ (i.e. Unmanaged code) with a sprinkling of C# (i.e. Managed code)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;We use CruiseControl.NET but use the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Visual+Studio+Task"&gt;Visual Studio Task&lt;/a&gt; (which internally executes devenv.com to rebuild the Visual Studio 2005 projects).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Monitor every minute for a developer's commit to the repository&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Run Unit tests&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Run Functional tests&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Run Integrated tests (nightly builds only)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Notify developers of build status&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Licensing and Unlocking&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Package (ZIP, installer)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Deploy (for download by our modelers/testers)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This entire process takes about 12-15 minutes on our build server which is not the newest piece of hardware (in fact was purchased somewhere around 2001/2002). The nightly builds could take more than an hour since we run Integrated tests too, on the same build server. Not too shabby but we could definitely do better.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The simplest way to speed up the build would be to purchase a new build server and cannibalize the old one or simply re-purpose it.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Licensing and what now?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;But here's the catch.&amp;nbsp;In case you missed it, I highlighted "Licensing and Unlocking" in the steps above for that reason. What is that step you wonder? Well I work with Pro/Toolkit applications, the API for Pro/Engineer. If you want to deliver programs that use Pro/Tookit to your customers (who most likely will not have a license for Pro/Toolkit) then PTC provides a little executable called protk_unlock.exe that simply "unlocks" your Pro/Toolkit application to enable it to run on PC that don't have the license for Pro/Toolkit. If you were not aware of it, "unlocking" your Pro/Toolkit application will cause the PTC License Server to hold your Pro/Toolkit license for 15 minutes (yes, you read that right - FIFTEEN minutes). Of course all this is &lt;a href="http://www.mcadcentral.com/proe/forum/forum_posts.asp?TID=33881"&gt;common knowledge&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;'14' is the wrong answer&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So what if my average build completes in less than 14 minutes? Well CruiseControl.NET uses a "update before you build" style to build your projects regularly. Which means that if two developers commit to the repository within a minute then there is a good chance that the two commits would be rolled into a single build (this is different from the process that some Continuous Integration tools use where &lt;a href="http://webcache.googleusercontent.com/search?q=cache:UoTzYcVtBoEJ:openmakesoftware.com/mavericks/2009/02/17/check-out-code-post-commit-not-pre-build/+openmake+post-commit&amp;amp;hl=en&amp;amp;gl=us&amp;amp;strip=1"&gt;a commit triggers a build&lt;/a&gt; - must be nice to own these nicer tools). But the worst case scenario is that &lt;b&gt;"if for some reason the average build time is less than, say, 14 minutes AND the next build starts within the minute, THEN there is a good chance that the second build will not be able to 'unlock' its Pro/Toolkit application, since protk_unlock holds the license for 15 minutes and our build has finished in less than that time."&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Now what?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So what is the solution to this problem? Well, if you have the money, you could always add a 2nd Pro/Toolkit license to that single build server, so that you always have one license available every 15 minutes.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Or you could do what I did - &lt;span class="Apple-style-span" style="font-size: x-large;"&gt;YOUR BUILD IS TOO FAST, SLOW IT DOWN.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Almost makes me want to cry. Oh well. What other idiocracies have you encountered in your build scenarios?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Note:&lt;/b&gt; I linked to a cached page from Google's server for the following link&amp;nbsp;&lt;a href="http://openmakesoftware.com/mavericks/2009/02/17/check-out-code-post-commit-not-pre-build/"&gt;http://openmakesoftware.com/mavericks/2009/02/17/check-out-code-post-commit-not-pre-build/&lt;/a&gt;&amp;nbsp;since the original didn't show when I posted this article.&lt;/span&gt;&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/271021275278967965/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/10/my-continuous-integration-build-is-too.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/271021275278967965" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/271021275278967965" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/10/my-continuous-integration-build-is-too.html" rel="alternate" title="My Continuous Integration Build is too fast" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-298823982937230050</id><published>2010-08-13T17:30:00.011-05:00</published><updated>2010-08-13T17:30:00.288-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type="text">Will the real 'PHI' symbol please stand up?</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;In my last post&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;a href="http://ossandcad.blogspot.com/2010/07/solidworks-hole-size-and-extended-ascii.html"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;SolidWorks Hole Size and Extended ASCII codes&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; I had mentioned that I needed to input the 'PHI' symbol when creating a Wizard Simple Hole in SolidWorks using the SolidWorks API for Visual C++.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Well it turns out that while my mind was in the right place, I probably should have taken that &lt;/span&gt;&lt;a href="http://www.youtube.com/watch?v=e8TUwHTfOOU"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;left turn at Albuquerque&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;. So lets revisit that topic again. It seems that using Extended ASCII codes for this job was the wrong solution, though it did lead me to find out more about specifying symbols using Unicode, since I figured that I need to specify the PHI symbol using Unicode.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;So now the questions are "what is the Unicode character for the PHI symbol?" and "how do we specify that character in C++"?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Lets answer the more difficult of the two questions first, which is what this post is all about.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;What is the Unicode character the PHI symbol?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Well turns out that there are numerous ways to express the same symbol (at least they are the same in that they are all called PHI). Here are a few Unicode characters that MS Windows recognizes as PHI symbols:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;U+0278 (&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.fileformat.info/info/unicode/char/278/index.htm"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://www.fileformat.info/info/unicode/char/278/index.htm&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;U+03D5 (&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;a href="http://www.fileformat.info/info/unicode/char/3d5/index.htm"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://www.fileformat.info/info/unicode/char/3d5/index.htm&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;U+03A6 (&lt;/span&gt;&lt;a href="http://www.fileformat.info/info/unicode/char/03a6/index.htm"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://www.fileformat.info/info/unicode/char/03a6/index.htm&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;U+00D8 (&lt;/span&gt;&lt;a href="http://www.fileformat.info/info/unicode/char/d8/index.htm"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://www.fileformat.info/info/unicode/char/d8/index.htm&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;So which one is the one we need? Well its the last one. Why? Because thats the only one that SolidWorks will accept and create a hole with and the only one that looks like the Mathematical symbol PHI (&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: black; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Ø - see note below)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;. The rest may look like PHI but they are not the &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Real_McCoy"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Real McCoy&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Now that we have the Unicode character to use, comes the easier question:&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;How do we specify Unicode characters in C++?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Surprisingly the answer is similar to specifying Extended ASCII codes. Instead of using a "\x" we simply use a "\u". Here is what it looks like:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;blockquote&gt;CComBSTR size(L"\u00D80.15");&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Breaking it down:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The "L" is to specify that this is Unicode.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The "\u" is to specify Unicode characters in literal strings&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;And as we saw as the answer to the first question, the "00D8" (thats ZeroZeroD8) is the PHI symbol&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;The trailing 0.15 is simply a size that SolidWorks Hole could have&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;BUT unlike Extended ASCII we can specify the non-Unicode portions of the string literal, using regular characters i.e. the "0.15" part.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;I guess we learn something new everyday.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;So do you use Unicode characters in your literal strings often? What method do you use to find the right code? Let me know.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;NOTE:&lt;br /&gt;
IF YOU CAN'T SEE THE PHI SYMBOL ITSELF&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;AT THE SPECIFIED LOCATION&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"&gt;&amp;nbsp;THEN YOUR BROWSER DOESN'T UNDERSTAND UNICODE CHARACTERS. TO FIX THIS PROBLEM &lt;a href="http://www.google.com/intl/en/landing/chrome/beta/"&gt;GET A BETTER BROWSER&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/298823982937230050/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/08/will-real-phi-symbol-please-stand-up.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/298823982937230050" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/298823982937230050" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/08/will-real-phi-symbol-please-stand-up.html" rel="alternate" title="Will the real 'PHI' symbol please stand up?" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-5813784131131781731</id><published>2010-07-19T18:00:00.002-05:00</published><updated>2010-07-19T18:00:01.555-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><title type="text">SolidWorks Hole Size and Extended ASCII codes</title><content type="html">If you have tried to create a WizardHole of type "Simple Wizard Hole" using C++ API (not .NET but native C++) then you surely have run into this problem: "How to specify the size of the hole?"&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;SolidWorks needs the "PHI" symbol in Hole Size&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
SolidWorks' new FeatureManager::HoleWizard3 API fixes a problem we (colleagues of mine from the company I work for and I) have noticed in previous versions of the WizardHole API (ping me if you want details on that problem, but not relevant to this post, so am not providing details here). But the new API requires you to specify the size of the WizardHole in string literal format (or BSTR or CComBSTR). Typically this is not a problem but for the case of the "Simple Wizard Hole" SolidWorks expects the "diameter symol" to be input as part of the size if the "Standard" selected is "ANSI Metric".&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Using Extended ASCII Table&lt;/span&gt;&lt;br /&gt;
So the API call looks something like this:&lt;br /&gt;
&lt;blockquote&gt;featmgr-&amp;gt;HoleWizard3(eHoleType, eHoleStd, fastenerType, &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;size&lt;/span&gt;, endCond, dRadius*2.0, dDepth, values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], threadclass, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, &amp;amp;hole);&lt;/blockquote&gt;Ignore the other parameters for now and focus on the highlighted "&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;size&lt;/span&gt;&lt;/b&gt;" parameter. To specify a size of "0.15mm" for "ANSI Metric" you would need to prepend the "phi" symbol to "0.15mm". How would you do this? Well you use extended ASCII codes, of course. Don't remember your extended ASCII codes? Well you could Google it, but &lt;a href="http://www.asciitable.com/"&gt;this link&lt;/a&gt;&amp;nbsp;(&lt;a href="http://www.asciitable.com/"&gt;http://www.asciitable.com/&lt;/a&gt;) should suffice. The "size" string value should look something like this (for size 0.15):&lt;br /&gt;
&lt;blockquote&gt;CComBSTR size(L"\x237\x0\x46\x1\x5");&lt;/blockquote&gt;NOTE:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I use a CComBSTR so that I don't have to free any BSTR manually.&lt;/li&gt;
&lt;li&gt;To specify an ASCII character in a string literal in C++ you have to prepend the ASCII code with "\x". Once you start specifying an ASCII character in the string literal, specify all characters in ASCII, else you will get compile or worse, runtime errors.&lt;/li&gt;
&lt;li&gt;If you omit the "L" in front of the string literal you will get a C2022 compile error (in Visual C++ 2005 at least).&lt;/li&gt;
&lt;li&gt;The ANSI code of \x237 is the diameter (phi) symbol. The ANSI code \x46 is the "." in 0.15. The rest are the Dec values (from the link provided) for "0", "1" and "5".&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Conclusion&lt;/span&gt;&lt;/div&gt;&lt;div&gt;So how long has it been since you used the extended ASCII table? Its been so long for me, I don't even remember when I last used them. Glad I remembered how to!&lt;/div&gt;</content><link href="http://ossandcad.blogspot.com/feeds/5813784131131781731/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/07/solidworks-hole-size-and-extended-ascii.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5813784131131781731" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5813784131131781731" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/07/solidworks-hole-size-and-extended-ascii.html" rel="alternate" title="SolidWorks Hole Size and Extended ASCII codes" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-9017123648954758721</id><published>2010-04-16T17:05:00.000-05:00</published><updated>2010-04-16T17:05:15.083-05:00</updated><title type="text">"Google's new look" is actually "Jazz"</title><content type="html">If you read &lt;a href="http://ossandcad.blogspot.com/2010/04/googles-new-look.html"&gt;my previous post&lt;/a&gt; (http://ossandcad.blogspot.com/2010/04/googles-new-look.html) and found it "new" then I guess we both are late to the game. Search Engine Land already reported this &lt;a href="http://searchengineland.com/google-streamlines-search-options-30143"&gt;new interface&lt;/a&gt; back in November. Thanks to the blog "Google Operating System" for the &lt;a href="http://googlesystem.blogspot.com/2010/04/googles-jazz-interface-more-widely.html"&gt;link&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I promise, next time I will only post relevant (to my blog that is) articles.</content><link href="http://ossandcad.blogspot.com/feeds/9017123648954758721/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/04/googles-new-look-is-actually-jazz.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/9017123648954758721" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/9017123648954758721" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/04/googles-new-look-is-actually-jazz.html" rel="alternate" title="&quot;Google's new look&quot; is actually &quot;Jazz&quot;" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-6165004419058991882</id><published>2010-04-08T00:50:00.003-05:00</published><updated>2010-04-09T12:34:18.139-05:00</updated><title type="text">Google's new look</title><content type="html">Sorry if this post is not relevant to my regular topics but I just couldn't resist.&lt;br /&gt;
&lt;br /&gt;
Is this Google's new look? Or is this some experiment that they are running that I am seeing?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fmXRJRLLPKEe-LeHupcEdeqht4DLPsscLgkXSvGn_7iWaTU-OGBXShibcSUl3L7m4Z74V7yeD-6SYs_RXEyosquqda9akMsnEvXQ12Q7dwm2_VdCMSrEbyIpPTObxzkQa2EmHg/s1600-h/google-new-look.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fmXRJRLLPKEe-LeHupcEdeqht4DLPsscLgkXSvGn_7iWaTU-OGBXShibcSUl3L7m4Z74V7yeD-6SYs_RXEyosquqda9akMsnEvXQ12Q7dwm2_VdCMSrEbyIpPTObxzkQa2EmHg/s640/google-new-look.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
On a more related note (to my blog that is) I am currently updating a project for a fixed backend DLL for the Pantheios logger (http://www.pantheios.org) that I will upload to my Google Code project soon (i.e. at http://ossandcad.googlecode.com). Will post about that as soon as possible. &lt;br /&gt;
&lt;br /&gt;
Update April 9 2010: I am currently in New Jersey and don't see the modified Google search page (that I saw from Redmond). So obviously no dramatic changes by Google. Probably just some experiment that they are running that "I" happen to be a "part" of.</content><link href="http://ossandcad.blogspot.com/feeds/6165004419058991882/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/04/googles-new-look.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/6165004419058991882" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/6165004419058991882" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2010/04/googles-new-look.html" rel="alternate" title="Google's new look" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-fmXRJRLLPKEe-LeHupcEdeqht4DLPsscLgkXSvGn_7iWaTU-OGBXShibcSUl3L7m4Z74V7yeD-6SYs_RXEyosquqda9akMsnEvXQ12Q7dwm2_VdCMSrEbyIpPTObxzkQa2EmHg/s72-c/google-new-look.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-5504239913218275452</id><published>2009-10-21T17:30:00.009-05:00</published><updated>2009-10-21T17:30:01.190-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type="text">CEEFIT: I miss you</title><content type="html">I first &lt;a href="http://stackoverflow.com/questions/1468960/unit-and-integration-testing-in-c/1472755#1472755"&gt;noticed on Sep 24th&lt;/a&gt; that the web-site that hosts the &lt;a href="http://ceefit.woldrich.com/?page=Home"&gt;C++ implementation of FIT (CEEFIT)&lt;/a&gt; was gone. I get a "DNS Error. Cannot find server" error for the URL &lt;a href="http://ceefit.woldrich.com/"&gt;http://ceefit.woldrich.com/&lt;/a&gt;. Even &lt;a href="http://www.woldrich.com/"&gt;http://www.woldrich.com/&lt;/a&gt; is no longer found, with the same error might I add.&lt;br /&gt;
&lt;br /&gt;
This is not good. Indicates that the company that hosted/developed CEEFIT is gone taking some of the documentation for CEEFIT with it. While the source code for CEEFIT is still available at &lt;a href="http://sourceforge.net/projects/fit/files/"&gt;http://sourceforge.net/projects/fit/files/&lt;/a&gt;, some of the implementation details that were key for me to customize various aspects of CEEFIT are no longer available. If you use &lt;a href="http://code.google.com/p/ossandcad/downloads/list"&gt;any of the downloads&lt;/a&gt; that I provide through the "My Downloads" section, you have the necessary header files and libraries to use CEEFIT in your IntegratedTests. But you would need the original source code and documentation for any customizations.&lt;br /&gt;
&lt;br /&gt;
I have emailed Dave (using an old email address I have, which unfortunately is part of the woldrich.com domain) and hope I will hear back from him. I have requested he upload the documentation for CEEFIT to sf.net and I am really, really hoping he grants wishes.&lt;br /&gt;
&lt;br /&gt;
In the short term I am screwed, but fortunately there is an alternate implementation of &lt;a href="http://www.fitnesse.org/FrontPage.FitServers.CppFit.CppTestTools"&gt;FIT in C++&lt;/a&gt; available through &lt;a href="http://www.fitnesse.org/"&gt;http://www.fitnesse.org/&lt;/a&gt;. I have briefly tried fitnesse and have found the requirements they place to use their library (that I learn their Wiki markup to create tests and the ability to run a HTTP server on my build machine to run the tests) quite burdensome. But if I am going to continue C++ development and want to run Integrated Tests, I guess I have no other choice. But this time, I will be careful enough to create a personal mirror of &lt;a href="http://www.fitnesse.org/"&gt;www.fitnesse.org&lt;/a&gt; for myself, in case this too disappears off the face of the world(wideweb).&lt;br /&gt;
&lt;br /&gt;
But honestly this is one more of the reasons why I love open source. If CEEFIT was a closed source library and the company developing it, shut down, then I would definitely be screwed. Since I have the source for CEEFIT, I can continue to develop it (if I had the requisite skills, of course).&lt;br /&gt;
&lt;br /&gt;
So does CEEFIT going AWOL affect you?</content><link href="http://ossandcad.blogspot.com/feeds/5504239913218275452/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/ceefit-i-miss-you.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5504239913218275452" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5504239913218275452" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/ceefit-i-miss-you.html" rel="alternate" title="CEEFIT: I miss you" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-7256561271924943580</id><published>2009-10-16T17:30:00.006-05:00</published><updated>2009-10-16T17:30:00.560-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><title type="text">Did uninstalling SolidWorks delete half my hard drive?</title><content type="html">I recently had to re-install SolidWorks 2009 on my laptop. During the uninstall process I noticed that several of my programs in the "C:\Program Files" folder went missing. Now I am not the one to start pointing fingers just yet, but this episode completely freaked me out. I had SolidWorks installed under "C:\Program Files\SolidWorks Corp" so would be more than surprised if this was in fact an error on the part of the SolidWorks uninstaller, but at the time of uninstallation, my laptop was not being used and no other "application window" was open. I also rarely log on with administrative privileges on either my XP or Vista laptop, so pretty low chance I accidentally deleted these folders myself (if I was that insane). I also did the usual checks for viruses, spyware and other junk, in vain.&lt;br /&gt;
&lt;br /&gt;
Oh well! That's life I guess.&lt;br /&gt;
&lt;br /&gt;
But during the reinstallation process I realized a quirk in the SolidWorks installation. Does it make sense to put header files required for SolidWorks Add-in development under the "samples" directory? Well that's what SolidWorks has done. So if you are developing SolidWorks add-ins, don't forget to select the "Examples" option in the SolidWorks Installation Manager, during the installation. Else you will not have the headers (e.g. "amapp.h") that you need for VC++ Add-in development.</content><link href="http://ossandcad.blogspot.com/feeds/7256561271924943580/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/did-uninstalling-solidworks-delete-half.html#comment-form" rel="replies" title="3 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7256561271924943580" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7256561271924943580" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/did-uninstalling-solidworks-delete-half.html" rel="alternate" title="Did uninstalling SolidWorks delete half my hard drive?" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-8166298874032095645</id><published>2009-10-15T17:30:00.003-05:00</published><updated>2009-10-15T17:30:00.562-05:00</updated><title type="text">Who uses BRL-CAD? An Anonymous answer</title><content type="html">This post is more of a response to a &lt;a href="http://ossandcad.blogspot.com/2009/09/and-worlds-oldest-source-code.html?showComment=1254231560610#c7187787251120041946"&gt;comment&lt;/a&gt; I received on my previous post titled &lt;span style="font-size: small;"&gt;&lt;a href="http://ossandcad.blogspot.com/2009/09/and-worlds-oldest-source-code.html"&gt;And the World's Oldest Source Code Repository is...&lt;/a&gt;&lt;/span&gt;. Since the commenter chose to remain anonymous, I had no way to respond other than to blog a new post. I will resume posting "useful" information with my next post.&lt;br /&gt;
&lt;br /&gt;
Firstly, Thanks 'Anonymous' (I knew I should not allowed people to comment on my posts anonymously, but it encourages more commenting from what I can tell), for your very detailed answer. I wonder if you are one of the &lt;a href="http://www.ohloh.net/p/brlcad/contributors"&gt;seemingly many&lt;/a&gt; contributors to the BRL-CAD source code.&lt;br /&gt;
&lt;br /&gt;
I would have been happier if you were able to provide some links to sites or people who use BRL-CAD, but I think I may be able to find at least 1 contact inside the U.S. Army Research Laboratory (ARL) who could enlighten me further.&lt;br /&gt;
&lt;br /&gt;
It has been a long time since I &lt;a href="http://sourceforge.net/projects/brlcad/files/BRL-CAD%20for%20Windows/"&gt;downloaded and tested the latest version&lt;/a&gt; of BRLCAD. I am hoping to be surprised by their user-friendliness though from their &lt;a href="http://brlcad.org/gallery/s/screenshots/"&gt;screenshots&lt;/a&gt; (mostly updated in Mar 2008), it still appears command-driven rather than menu-driven.</content><link href="http://ossandcad.blogspot.com/feeds/8166298874032095645/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/who-uses-brl-cad-anonymous-answer.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8166298874032095645" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8166298874032095645" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/10/who-uses-brl-cad-anonymous-answer.html" rel="alternate" title="Who uses BRL-CAD? An Anonymous answer" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-3258485742004643826</id><published>2009-09-25T18:00:00.007-05:00</published><updated>2009-09-25T18:00:01.323-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="brl-cad"/><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><title type="text">And the World's Oldest Source Code Repository is...</title><content type="html">Many years ago (actually in 2006), I had &lt;a href="http://ossandcad.blogspot.com/2006/10/open-source-software-in-mechanical.html"&gt;written &lt;/a&gt;about an Open Source CAD program known as &lt;a href="http://brl-cad.org/"&gt;BRL-CAD&lt;/a&gt; (note: the links to tutorials I had included in that post are no longer active and give a message "&lt;span style="font-size: small;"&gt;BRL-CAD became an open source project in December of 2004 and is no longer hosted on FTP.ARL.ARMY.MIL").&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Well surprisingly&amp;nbsp; BRL-CAD has been in the news for a while. Were you aware that according to &lt;a href="http://www.ohloh.net/"&gt;Ohloh&lt;/a&gt;, BRL-CAD has the &lt;a href="http://www.ohloh.net/blog/worlds_oldest_source_code_repositories"&gt;world's oldest open source repository&lt;/a&gt;? Can you believe that? The repository supposedly has been active since 1983.&lt;br /&gt;
&lt;br /&gt;
Well if you thought that was interesting then check this. BRL-CAD was also a participating organization in the &lt;a href="http://socghop.appspot.com/org/home/google/gsoc2009/brlcad"&gt;Google Summer of Code 2009&lt;/a&gt; and had 3 student interns who worked on as many projects. &lt;br /&gt;
&lt;br /&gt;
So the oldest CAD program is still being actively developed. That is interesting, but what I want to know is who is using BRL-CAD? I work for a CAD tools company and we have never been requested to even look at BRL-CAD as a possible CAD system to support. BRL-CAD's About page says that the U.S. Military is one of the clients. I have been on a Civilian installation of the U.S Army and have seen BRL-CAD installed on their lab computers. But none of the modelers were using it to deliver designs. So the question still stands - who is using BRL-CAD?&lt;br /&gt;
&lt;br /&gt;
Do any of you have any experience with BRL-CAD at your work? Does anyone use BRL-CAD for anything? Let me know.</content><link href="http://ossandcad.blogspot.com/feeds/3258485742004643826/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/09/and-worlds-oldest-source-code.html#comment-form" rel="replies" title="2 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/3258485742004643826" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/3258485742004643826" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/09/and-worlds-oldest-source-code.html" rel="alternate" title="And the World's Oldest Source Code Repository is..." type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-326910502009221835</id><published>2009-08-21T19:00:00.007-05:00</published><updated>2009-09-01T22:13:12.775-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="open cascade"/><title type="text">Which Free 3D CAD program would I suggest?</title><content type="html">A few months ago I received a &lt;a href="http://ossandcad.blogspot.com/2009/05/unlocking-protk-applications-blog.html?showComment=1245659491251#c2215816725572062236"&gt;comment on one of my posts&lt;/a&gt;, asking me which free 3D CAD program I would suggest. You can see &lt;a href="http://ossandcad.blogspot.com/2009/05/unlocking-protk-applications-blog.html?showComment=1245962750458#c3629519456868395994"&gt;my response here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Answering JOE's (the commenter) request reminded me that I had posted &lt;a href="http://ossandcad.blogspot.com/2006/10/open-source-software-in-mechanical.html"&gt;a few articles&lt;/a&gt; in the past about Open Source CAD programs. Since then though I had pretty much given up searching for an open source CAD program that would provide at least a usable modeling tool (primarily because my initial search was futile).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
But I did keep my eyes open a little bit and came across &lt;a href="http://narocad.sourceforge.net/"&gt;NaroCAD &lt;/a&gt;a few months ago. Having followed &lt;a href="http://narocad.blogspot.com/"&gt;NaroCAD's feeds&lt;/a&gt; for that period I noticed that it is under quite active development. From the developer's blog "NaroCAD is an opensource CAD design tool written in C#/.NET and is built on top of proven OpenCascade library". In fact &lt;a href="http://narocad.blogspot.com/2009/06/narocad-10-released.html"&gt;NaroCAD reached 1.0 milestone&lt;/a&gt; a few months ago and they even provide .NET bindings for OpenCascade (including IronPython).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In my comment, I had recommended to JOE to use &lt;a href="https://www.alibre.com/Register/RequestInfo.aspx"&gt;Alibre Design Xpress&lt;/a&gt;, since it is free, and offers great capability at that price (check out &lt;a href="http://alibre.typepad.com/alibre_ceo_blog/"&gt;Alibre's CEO's blog&lt;/a&gt; - they even have a &lt;a href="http://alibre.typepad.com/alibre_ceo_blog/2009/08/alibre-99-price-offer-stuns-the-cad-industry.html"&gt;sale on Alibre Design Standard&lt;/a&gt; at the time of this writing, Aug 18 2009). I have not experimented with NaroCAD myself but considering its infancy I am relatively certain that its capabilities don't match Alibre's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If the fact that I have a blog titled "Open Source Software and CAD" and am recommending a non-open-source program to my readers, alarms you, then don't be. I simply am recommending what I think is feasible. Most CAD users are not programmers. They may be versatile in creating Mapkey Automation or Macro scripts but mostly simply care about how complete their 2D/3D tools are for modeling purposes. In my experience with open source, attempting to use a program which has not matured, would usually result in much frustration to users who are not adept at looking at source code to solve any problems they may have (this is not to taint NaroCAD itself, it may be a great program, but just to explain my reason for the recommendation).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you feel upto it, I would suggest &lt;a href="http://sourceforge.net/project/platformdownload.php?group_id=198020"&gt;downloading NaroCAD&lt;/a&gt; and experimenting with it. I am relatively certain that you may need to download OpenCascade separately as the installer for NaroCAD does not seem large enough (15.6MB) to accommodate all of OpenCascade (175MB).&lt;br /&gt;
&lt;br /&gt;
UPDATE (8/30/2009): I stand corrected. One (of the 3 contributors to their blog) of the developers of NaroCAD (&lt;a href="http://www.blogger.com/profile/05409605028353356569"&gt;ciplogic&lt;/a&gt;) left a &lt;a href="http://ossandcad.blogspot.com/2009/08/which-free-3d-cad-program-would-i.html?showComment=1250920343095#c3655228326199346293"&gt;comment&lt;/a&gt; (still visible below this post) that NaroCAD uses only a subset of OpenCascade, which means that the ~15 MB download of NaroCAD is really all you need. So what are you waiting for? Have you downloaded NaroCAD? I have. &lt;br /&gt;
&lt;h1&gt;&lt;/h1&gt;</content><link href="http://ossandcad.blogspot.com/feeds/326910502009221835/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/08/which-free-3d-cad-program-would-i.html#comment-form" rel="replies" title="4 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/326910502009221835" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/326910502009221835" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/08/which-free-3d-cad-program-would-i.html" rel="alternate" title="Which Free 3D CAD program would I suggest?" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-7638149449371338613</id><published>2009-07-24T17:00:00.020-05:00</published><updated>2009-07-24T17:00:02.312-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type="text">SWX Batch mode Integrated Tests with CEEFIT</title><content type="html">If you have read any of my previous posts on Testing CAD Plugins, then you are aware of what I am trying to accomplish - an automated Integrated Test framework to test, at the very least, SolidWorks API Plugins. The following are some of the more relevant posts regarding Testing CAD Plugins:&lt;br /&gt;
&lt;div class="post"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=7274961&amp;amp;postID=7638149449371338613" name="1076005790243930763"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2009/03/solidworks-api-in-process-or-global.html"&gt;SolidWorks API - In-process or Global methods - Which to use?&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2009/02/writing-ceefit-class-like-regular-c.html"&gt;Writing CEEFIT class like a regular C++ class&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2008/04/batch-mode-solidworks.html"&gt;Batch mode SolidWorks&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2008/04/batch-mode-proengineer.html"&gt;Batch mode Pro/Engineer&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2009/04/mbunit-autocad-unit-testing-for-cad.html"&gt;MbUnit + AutoCAD = Unit testing for CAD Plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Some of you have even downloaded the sample workspace "swbatch.zip" posted in one of the posts above (Batch mode SolidWorks). For convenience the following is the "swbatch.zip" file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://ossandcad.googlecode.com/files/swbatch.zip"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5356961053423348338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s320/zip.jpg" style="cursor: pointer; float: left; height: 116px; margin: 0pt 10px 10px 0pt; width: 116px;" /&gt;&lt;br /&gt;
http://ossandcad.googlecode.com/files/swbatch.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you prefer to download from the source, you can do so using the following link with your SVN client (e.g. &lt;a href="http://tortoisesvn.net/downloads"&gt;TortoiseSVN&lt;/a&gt; (follow the instructions at &lt;a href="http://code.google.com/p/ossandcad/source/checkout"&gt;http://code.google.com/p/ossandcad/source/checkout&lt;/a&gt;)):&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQuTHnOpVeVK7Evd_00Ey7An20NbiE8PFM4NnufeN6VCfxTMLI_bF0Zu8_GcpqsJM91JjckxljeaNjXW0K8oP-u1z7blH8u4DZnuNypMcJGh18-g95V035YkI1HjUUGMMebwSnXw/s1600-h/subversion_logo-200x173.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQuTHnOpVeVK7Evd_00Ey7An20NbiE8PFM4NnufeN6VCfxTMLI_bF0Zu8_GcpqsJM91JjckxljeaNjXW0K8oP-u1z7blH8u4DZnuNypMcJGh18-g95V035YkI1HjUUGMMebwSnXw/s200/subversion_logo-200x173.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="https://ossandcad.googlecode.com/svn/trunk/swbatch"&gt;&lt;br /&gt;
https://ossandcad.googlecode.com/svn/trunk/swbatch&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;The Pursuit of "CAD Plugin Testingness"&lt;/span&gt;&lt;br /&gt;
With this post I continue my pursuit of an automated Integrated Test Framework, using CEEFIT and dare I say it, I have come quite close to achieving my goal (my wishlist of sub-goals not yet achieved are listed at the end of this post).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Download the IntegratedTests workspace&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
You can choose the zip format or access from SVN directly:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s1600/zip.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s200/zip.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip"&gt;http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQuTHnOpVeVK7Evd_00Ey7An20NbiE8PFM4NnufeN6VCfxTMLI_bF0Zu8_GcpqsJM91JjckxljeaNjXW0K8oP-u1z7blH8u4DZnuNypMcJGh18-g95V035YkI1HjUUGMMebwSnXw/s1600/subversion_logo-200x173.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQuTHnOpVeVK7Evd_00Ey7An20NbiE8PFM4NnufeN6VCfxTMLI_bF0Zu8_GcpqsJM91JjckxljeaNjXW0K8oP-u1z7blH8u4DZnuNypMcJGh18-g95V035YkI1HjUUGMMebwSnXw/s200/subversion_logo-200x173.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://ossandcad.googlecode.com/svn/trunk/swxbatch_ceefit"&gt;https://ossandcad.googlecode.com/svn/trunk/swxbatch_ceefit&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;The "swxbatch_ceefit" workspace is an extension of the "swxbatch" workspace. The main difference is the ability to load SolidWorks and using API and CEEFIT, pass it input from the CEEFIT tables and verify expected output as mentioned in the CEEFIT tables.&lt;br /&gt;
&lt;br /&gt;
The solution is documented - but its my contention that nothing is ever documented enough - so if you need more information on how things work then leave a comment. I will put up another post that has more details.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Assumptions:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;You have SolidWorks installed and are working with appropriate licenses&lt;/li&gt;
&lt;li&gt;You may need to have the SolidWorks API SDK installed to write SolidWorks API-based code.&lt;/li&gt;
&lt;li&gt;You have access to Visual Studio (at least 2005, as this solution is provided in that version). Later versions should work but I have not tested them out.&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Wish list of sub-goals&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Passing in only HTML file (with CEEFIT tables) at a time is supported. This is how CEEFIT works by default, but it is not easy to test CAD stuff with all data in one single table. I wish for a solution to this and will post if I am successful. But for now it works as intended.&lt;/li&gt;
&lt;li&gt;Currently integration of CEEFIT-based solutions with Continuous Integration systems (e.g. &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt;) is poor, as CEEFIT only puts out HTML files and at least CruiseControl.NET does not merge HTML output as part of its build log, which is a bummer as "true" integration would help us identify a failure, location and cause, which this current framework does not do. I wish to write out the output of CEEFIT as XML (at least) so that it can be integrated into build systems. (To be honest, FIT and thereby CEEFIT profess to be tools that enhances customer interaction with systems in development, so HTML works best, but for developers HTML is difficult to incorporate into their workflow).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;The provided workspace is good only for SolidWorks. I wish for a solution that allows interaction with various CAD systems, through their individual API, and tests my plugin application with all of them.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Notes and Tips:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The workspace, when run, starts SolidWorks in background (aka batch mode) by using a SolidWorks API, which simply hides the SolidWorks window.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint lang-cpp" style="margin-left: 40px;"&gt;swApp-&amp;gt;put_Visible(FALSE)&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;If you want to make SolidWorks visible during its batch operations, then change the FALSE to TRUE and rerun. SolidWorks starts up and you can see all API actions play out like a movie. I should say it is almost as fun to watch as a &lt;a href="http://www.youtube.com/watch?v=WA2qmVRLVZQ"&gt;video on Youtube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I have used a global variable "swApp" as I don't know how else to pass variables in to the CEEFIT run test classes. While not a big problem, I &lt;a href="http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html"&gt;hate global variables as they make testing otherwise hard to do&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Please visit the home page for this and other projects: &lt;a href="http://ossandcad.googlecode.com/"&gt;http://ossandcad.googlecode.com&lt;/a&gt; for more information. I will try to update those pages soon and as regularly as possible.&lt;/li&gt;
&lt;li&gt;For more information on CEEFIT you can read the short summary I have at &lt;a href="http://ossandcad.blogspot.com/2008/05/protoolkit-solidworks-api-development.html"&gt;http://ossandcad.blogspot.com/2008/05/protoolkit-solidworks-api-development.html&lt;/a&gt; or even visit the CEEFIT homepage at &lt;a href="http://ceefit.woldrich.com/?page=Home"&gt;http://ceefit.woldrich.com/?page=Home&lt;/a&gt;. I should warn though that CEEFIT has not been updated for many years, but it works relatively well in its current stage. Hopefully enough of us use it to get the original author &lt;a href="mailto:dave@woldrich.com"&gt;dave@woldrich.com&lt;/a&gt; to continue development.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;If you have downloaded "swxbatch.zip" to develop SolidWorks plugin applications (or Addins) then I sure that this workspace will be very useful to you. Let me know if you do or don't. Comments and suggestions are most welcome and will be responded to, so feel free to communicate your needs.</content><link href="http://ossandcad.blogspot.com/feeds/7638149449371338613/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/swx-batch-mode-integrated-tests-with.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7638149449371338613" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7638149449371338613" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/swx-batch-mode-integrated-tests-with.html" rel="alternate" title="SWX Batch mode Integrated Tests with CEEFIT" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s72-c/zip.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-1981913870804280487</id><published>2009-07-03T11:54:00.011-05:00</published><updated>2009-07-03T11:54:01.151-05:00</updated><title type="text">New "My Downloads" Section</title><content type="html">First, thanks to everyone who downloaded the workspaces that I had uploaded to this blog (using &lt;a href="http://www.box.net/"&gt;http://www.box.net&lt;/a&gt;). I hope you found them useful.&lt;br /&gt;
&lt;br /&gt;
Previously you could only find the uploaded workspaces by going to the individual posts. After noticing that these workspaces were being downloaded many times a week, I wanted to make it simpler for you, my readers, to find and download these workspaces.&lt;br /&gt;
&lt;br /&gt;
I have added a "My Downloads" section, on the left sidebar (at the time of this posting, just below the "Older posts of mine" section) that links the relevant downloads. This will be a permanent fixture on each blog post page.&lt;br /&gt;
&lt;br /&gt;
If you notice, these workspaces are being hosted on &lt;a href="http://code.google.com/projecthosting/"&gt;Google Code&lt;/a&gt; at &lt;a href="http://ossandcad.googlecode.com/"&gt;http://ossandcad.googlecode.com&lt;/a&gt; which is my new repository for storing and sharing my CAD-API-based plugins and applications.&lt;br /&gt;
&lt;br /&gt;
At the time of writing this post the following workspaces are made available on &lt;a href="http://ossandcad.googlecode.com/"&gt;http://ossandcad.googlecode.com&lt;/a&gt;:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip"&gt;Pro/Toolkit + Visual Studio 2005 Workspace&lt;/a&gt; (http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/swbatch.zip"&gt;SolidWorks Batch mode using SolidWorks API+COM&lt;/a&gt; (http://ossandcad.googlecode.com/files/swbatch.zip)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip"&gt;SWX+CEEFIT Integrated Test Workspace&lt;/a&gt; (http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip)&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;Comments, suggestions most welcome.</content><link href="http://ossandcad.blogspot.com/feeds/1981913870804280487/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/new-my-downloads-section.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1981913870804280487" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1981913870804280487" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/new-my-downloads-section.html" rel="alternate" title="New &quot;My Downloads&quot; Section" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-8430309343194509551</id><published>2009-07-02T17:00:00.011-05:00</published><updated>2009-07-02T17:00:17.297-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="protoolkit"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><title type="text">New Google Code project to accompany this blog</title><content type="html">Thanks to all of you who have downloaded the various zips from my blog. I was using &lt;a href="http://www.box.net/"&gt;www.box.net&lt;/a&gt; to store and share my files. While box.net was sufficient, it was getting difficult to track usage and download rate, since I was only using the free version.&lt;br /&gt;
&lt;br /&gt;
To solve that problem and to find a simpler method to share my code, using a source code repository I have created a &lt;a href="http://code.google.com/projecthosting/"&gt;Google Code project&lt;/a&gt;. You can find my project at &lt;a href="http://ossandcad.googlecode.com/"&gt;http://ossandcad.googlecode.com&lt;/a&gt;. I have added an introduction and some Wiki pages and some files for download. &lt;br /&gt;
&lt;br /&gt;
The following files are available for download:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/swbatch.zip"&gt;http://ossandcad.googlecode.com/files/swbatch.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip"&gt;http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip"&gt;http://ossandcad.googlecode.com/files/swxbatch_ceefit_6_16_2009.zip&lt;/a&gt; -If you wondering what this is, then you have two options - wait for my blog post detailing how to use CEEFIT with SolidWorks API to run IntegratedTests - or - you could download and start working with the source code right away.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;The following Wiki pages are also available (but mostly duplicating content originally posted on this blog)&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/ossandcad/wiki/SwxBatch"&gt;http://code.google.com/p/ossandcad/wiki/SwxBatch&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;The biggest advantage of this for users is that you could download/browse my source code directly from SVN from &lt;a href="http://code.google.com/p/ossandcad/source/browse/#svn/trunk."&gt;http://code.google.com/p/ossandcad/source/browse/#svn/trunk.&lt;/a&gt;&amp;nbsp; For me the biggest advantage is the ability to track usage using Google Analytics.&lt;br /&gt;
&lt;br /&gt;
Comments/suggestions most welcome.</content><link href="http://ossandcad.blogspot.com/feeds/8430309343194509551/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/new-google-code-project-to-accompany.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8430309343194509551" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8430309343194509551" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/07/new-google-code-project-to-accompany.html" rel="alternate" title="New Google Code project to accompany this blog" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-7405378739115712693</id><published>2009-05-19T08:00:00.006-05:00</published><updated>2009-08-07T12:01:19.929-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pro toolkit"/><category scheme="http://www.blogger.com/atom/ns#" term="protoolkit"/><title type="text">Unlocking Pro/TK Applications - Blog Referral</title><content type="html">In one of previous posts titled "&lt;a href="http://ossandcad.blogspot.com/2008/09/license-needed-to-run-my-protoolkit-add.html"&gt;License needed to run my Pro/Toolkit add-ins"&lt;/a&gt; I received a comment requesting help using protk_unclock.exe to unlock the Pro/TK application provided in the same post. (For sake of convenience the following is the zip of the source for Pro/TK application)&lt;br /&gt;
&lt;br /&gt;
&lt;!--embed height="225" src="http://www.box.net/static/flash/box_explorer.swf?widgetHash=xvzvctm88c" type="application/x-shockwave-flash" width="400" wmode="transparent" /--&gt;&lt;br /&gt;
&lt;a href="http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5356961053423348338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s320/zip.jpg" style="cursor: pointer; float: left; height: 116px; margin: 0pt 10px 10px 0pt; width: 116px;" /&gt;&lt;br /&gt;
http://ossandcad.googlecode.com/files/ProToolkitVisualCpp.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
As an answer to the question posed in that comment, I refer you to a post by my colleague, Amar Junankar, on his blog at &lt;a href="http://cadinterface.blogspot.com/2009/05/unlocking-protoolkit-application.html"&gt;http://cadinterface.blogspot.com/2009/05/unlocking-protoolkit-application.html&lt;/a&gt;. Amar has posted solutions for both developers and non-developers.&lt;br /&gt;
&lt;br /&gt;
Welcome to the blogging world Amar.</content><link href="http://ossandcad.blogspot.com/feeds/7405378739115712693/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/05/unlocking-protk-applications-blog.html#comment-form" rel="replies" title="2 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7405378739115712693" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/7405378739115712693" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/05/unlocking-protk-applications-blog.html" rel="alternate" title="Unlocking Pro/TK Applications - Blog Referral" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnsV99PgssNv8hrdEYjnoHCqbaoNKB2hFIsA_LFefwRd-TSe6lgV8eABqSGcw4DLlu9iUHY8mAPRHKcd-H5cZ6ENCQM6xrRgboyvEcpE6N7X6DgEF3_86iFrOBKFOHT1f2UJ3BRw/s72-c/zip.jpg" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-6814614020391053491</id><published>2009-04-07T21:00:00.002-05:00</published><updated>2009-04-07T21:00:00.983-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type="text">MbUnit + AutoCAD = Unit testing for CAD Plugins</title><content type="html">&lt;span style="font-size: small;"&gt;If you follow my blog, you know that I develop CAD plug-ins in both .NET and C++. And in various posts of mine I have written about the difficulty of writing unit tests for these CAD plug-ins. The following are some of my more relevant posts regarding this topic.&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2008/04/protoolkit-solidworks-api-development.html"&gt;Pro/Toolkit, SolidWorks API Development Tools (C# Episode)&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2008/05/protoolkit-solidworks-api-development.html"&gt;Pro/Toolkit, SolidWorks API Development Tools (C++ Episode)&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ossandcad.blogspot.com/2009/02/writing-ceefit-class-like-regular-c.html"&gt;Writing CEEFIT class like a regular C++ class&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: small;"&gt;My usual solution was to avoid unit testing these CAD plugins and simply write integrated tests for them. The last post mentioned above (&lt;/span&gt;&lt;a href="http://ossandcad.blogspot.com/2009/02/writing-ceefit-class-like-regular-c.html"&gt;Writing CEEFIT class like a regular C++ class) &lt;/a&gt;specifically shows a sample &lt;a href="http://ceefit.woldrich.com/"&gt;CEEFIT&lt;/a&gt; (Framework for Integrated Test for C/C++) class that enables integrated testing using SWX (I will post the complete workspace to do this soon).&lt;br /&gt;
&lt;br /&gt;
But imagine my surprise when I read the following post about the release of MbUnit v3.0.5 - &lt;a href="http://weblogs.asp.net/astopford/archive/2009/04/02/mbunit-3-rtm.aspx"&gt;http://weblogs.asp.net/astopford/archive/2009/04/02/mbunit-3-rtm.aspx&lt;/a&gt;. The below text is an excerpt from that post (&lt;b&gt;bold &lt;/b&gt;and &lt;i&gt;italics &lt;/i&gt;are my addition):&lt;br /&gt;
&lt;blockquote&gt;Gallio provides MbUnit with the runner infrastructure and the list of supported runners is amazing, like MbUnit v2 you can still run MbUnit v3 in MSBuild, NAnt, TD.Net, CruiseControl, commandline (much more ehanched in v3) and GUI (&lt;a class="" href="http://www.gallio.org/Screenshots.aspx" mce_href="http://www.gallio.org/Screenshots.aspx"&gt;also vastly enhanced in v3&lt;/a&gt;) but now&amp;nbsp;tools such as TeamCity, VSTS, Resharper, Powershell, NCover, TypeMock and even &lt;i&gt;&lt;b&gt;AutoCAD&lt;/b&gt;&lt;/i&gt;.&lt;/blockquote&gt;That last word really caught my attention. What is this? Unit test support for CAD system plug-ins? That is so awesome it is beyond belief. A Google search for "AutoCAD MbUnit" gave more information via &lt;a href="http://blog.bits-in-motion.com/2008/11/announcing-gallio-and-mbunit-v305.html"&gt;http://blog.bits-in-motion.com/2008/11/announcing-gallio-and-mbunit-v305.html&lt;/a&gt;. An excerpt:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;h3&gt;AutoCAD Integration&lt;/h3&gt;Mike Sandberg has added support for testing AutoCAD plugins.&lt;br /&gt;
It turns out that AutoCAD has a managed extensibility model so you can create your own plugins using .Net and the ObjectARX toolkit.&amp;nbsp; Unfortunately it is somewhat difficult to write unit tests for plugins becuase they must run within the main UI thread of AutoCAD.&lt;br /&gt;
The AutoCAD integration for Gallio works by loading a shim into the AutoCAD application from which it can launch tests.&amp;nbsp; To enable this integration, specify the "AutoCAD" runner type to the Echo, Icarus, MSBuild, NAnt or PowerShell runners.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Gallio.Echo.exe MyTestAssembly.dll /r:AutoCAD [other options...]&lt;br /&gt;
&lt;br /&gt;
AutoCAD integration is not yet available from within the IDE.&amp;nbsp; We will be working to improve this use case in the future.&lt;/blockquote&gt;OK. This definitely is promising. The post provides usage scenario, and although low on details on how this is achieved beyond saying "loading a shim", it is exactly what we CAD developers need.&lt;br /&gt;
&lt;br /&gt;
To learn more on how MbUnit developers solved this problem, I turned to the source code available at &lt;a href="http://mb-unit.googlecode.com/svn/trunk/v3/src/Extensions/AutoCAD"&gt;http://mb-unit.googlecode.com/svn/trunk/v3/src/Extensions/AutoCAD&lt;/a&gt;. From first glances it looks as though the shim can connect or load (via the "acad.exe" file) AutoCAD. The shim finds the path to "acad.exe" via the registry key&lt;br /&gt;
&lt;blockquote&gt;"HKEY_CURRENT_USER\Software\Autodesk\DWGCommon\shellex\Apps\{F29F85E0-4FF9-1068-AB91-08002B27B3D9}:AutoCAD".&amp;nbsp;&lt;/blockquote&gt;It then determines if your plugin is loaded and if yes, sends commands to it using a TestDriver (AcadTestDriver).&lt;br /&gt;
&lt;br /&gt;
What I found even more intriguing was the description of the problem that MbUnit developers intended to solve i.e. "difficulty of running unit tests as they run in the main UI thread of AutoCAD ". As I have contended, this is an universal problem for CAD developers. Replace AutoCAD with SolidWorks and the posts that I list above were intended to solve this very problem, although with a hack of a solution, but still following the same lines of thought. The CEEFIT workspace that I work with, loads SolidWorks in the background and using COM, connects to the running instance and then executes SWX-API-based tests. I let CEEFIT be the TestDriver and validate my output. The MbUnit framework has packaged idea this in beautiful .NET code.&lt;br /&gt;
&lt;br /&gt;
This brings up the possibility that since SolidWorks plugins can also be .NET based, would replacing AutoCAD connection commands with SolidWorks connection commands in MbUnit's framework, allow loading the shim into SolidWorks and run unit tests against SolidWorks. I will be exploring this possiblity in the coming weeks/months, as time permits.&lt;br /&gt;
&lt;br /&gt;
Do you develop AutoCAD plugins? Is this new functionality of MbUnit useful to you? Comments welcome.&lt;br /&gt;
&lt;h3 class="post-title"&gt;&lt;/h3&gt;&lt;span style="font-size: large;"&gt;&lt;/span&gt;</content><link href="http://ossandcad.blogspot.com/feeds/6814614020391053491/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/04/mbunit-autocad-unit-testing-for-cad.html#comment-form" rel="replies" title="3 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/6814614020391053491" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/6814614020391053491" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/04/mbunit-autocad-unit-testing-for-cad.html" rel="alternate" title="MbUnit + AutoCAD = Unit testing for CAD Plugins" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-1076005790243930763</id><published>2009-03-02T02:00:00.001-06:00</published><updated>2009-03-02T02:00:05.280-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="cad"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><title type="text">SolidWorks API - In-process or Global methods - Which to use?</title><content type="html">&lt;span style="font-size: large;"&gt;Two SWX API to rule them (or is it 'Two SWX API to confuse us'?) &lt;/span&gt;&lt;br /&gt;
Did you know that SolidWorks (SWX) provides two distinct (yet confusingly similar) interfaces to 'get' or 'set' arrays through its API? Well it does. I recently installed SWX 2009 SP 2.0 (I know, I know - this release has been out for a while, but I never needed the newer features) - but I upgraded from SWX 2007 SP 0.0 when I ran into some vexing problem with the SWX API and hoping that it was an SWX bug, decided to try their newest version. Turns out the problem were me and my limited knowledge of these two API interfaces.&lt;br /&gt;
&lt;br /&gt;
The one advantage of installing SWX 2009 was the updated API documentation. The 2007 API documentation did not contain a page titled "In-process methods", which the 2009 version does. The following is an excerpt from that SWX 2009 API page (apihelp.chm) (italics are my addition) (note to lawyers: if it is not legal to publish portions of the SWX help documentation, please leave a comment and I will remove the appropriate sections)&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;In-process Methods&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;The SolidWorks API provides two types of methods for interfaces that get or  set arrays:&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;ul style="list-style-type: disc;" type="disc"&gt;&lt;li class="kadov-p"&gt;&lt;i&gt;&lt;/i&gt; &lt;i&gt;in-process&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;ul style="list-style-type: disc;" type="disc"&gt;&lt;li class="kadov-p"&gt;&lt;i&gt;global&lt;/i&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;For example, IView  contains these methods:&lt;/i&gt;&lt;br /&gt;
&lt;ul style="list-style-type: disc;" type="disc"&gt;&lt;li class="kadov-p"&gt; &lt;i&gt;IView::IGetCThreads  (in-process)&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li class="kadov-p"&gt; &lt;i&gt;IView::GetCThreads  &amp;nbsp;(global)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;i&gt;Both types of methods perform the same work, but each is more or less  appropriate for a given language and application. &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;In-process methods typically begin with the letter I and get or set pointers  to arrays that only unmanaged C++  applications can handle. The in-process companion methods (i.e., similarly  named methods that do not begin with the letter I) are more globally useful both  inside a process and across processes and return predictable results for all of  the SolidWorks supported languages. &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;In VBA, VB6, VB.NET, C#, and C++/CLI (also called managed C++), global  methods typically get or set a VARIANT or object that the programmer can iterate  as an array. In unmanaged C++, these methods get or set a pointer to a Dispatch  object that should be cast as a SafeDISPATCHArray. (SafeDISPATCHArray&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;is a VARIANT helper class defined in a  template class, which is available on the &lt;a href="http://files.solidworks.com/API/Examples/00000/0100s/0126/Example.htm" target="_blank"&gt;API Support website&lt;/a&gt;.)&lt;/i&gt;&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Q. To chose or not to chose &lt;/span&gt;&lt;br /&gt;
So how do you decide which interface to use? Does it even matter?&lt;br /&gt;
&lt;span style="font-size: large;"&gt;A. &lt;/span&gt;The answer to the 2nd question 'does it even matter' is - simply - &lt;b&gt;YES IT DOES MATTER&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
To answer the 1st question 'how do you decide which interface to use' - consider the following:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;If&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;you are building a DLL Add-in to SWX, &lt;b&gt;&lt;br /&gt;
&lt;br /&gt;
AND&amp;nbsp; &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;you plan to only load that DLL through SWX &lt;b&gt;&lt;br /&gt;
&lt;br /&gt;
THEN &lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;/li&gt;
&lt;li&gt;you can comfortably use the &lt;b&gt;"in-process method"&lt;/b&gt;.&lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;But if&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;you are building an EXE that loads SWX through COM &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;AND &lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;/li&gt;
&lt;li&gt;loads your SWX Add-in DLL (i.e. instantiates classes from the Add-in DLL in the EXE), allowing calls from the Add-in DLL to go to SWX &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;THEN &lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;/li&gt;
&lt;li&gt;you need to use the &lt;b&gt;"global method"&lt;/b&gt; in &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;BOTH&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&lt;/li&gt;
&lt;li&gt;the COM+EXE and Add-in DLL.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;AND&lt;br /&gt;
&lt;br /&gt;
&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LUCKILY YOU CAN STILL LOAD THE DLL ADD-IN DIRECTLY INTO SWX &lt;/b&gt;(doesn't that sound ideal?)&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; &lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;&lt;span style="font-size: large;"&gt;So how do you work this "global method"?&lt;/span&gt;&lt;br /&gt;
If you are like me and have little experience with COM, DISPATCH and VARIANTS then fear not because SolidWorks is gracious enough to provide us with a C++ template to simplify our lives. The files you need are hosted at &lt;a href="http://files.solidworks.com/API/Examples/00000/0100s/0126/Example.htm"&gt;http://files.solidworks.com/API/Examples/00000/0100s/0126/Example.htm&lt;/a&gt;. Simply download the zip file and include the "smartvars.h" file in your solution. The zip file also contains a sample in the file "usage.cpp", but for the sake of completness let me provide you with an example of my own:&lt;br /&gt;
&lt;blockquote&gt;VARIANT vxform;&lt;br /&gt;
LPSKETCH pSketch;&lt;br /&gt;
... &lt;br /&gt;
... // code to InsertSketch() so that pSketch is a valid pointer&lt;br /&gt;
...&lt;br /&gt;
pSketch-&amp;gt;get_ModelToSketchXform(&amp;amp;vxform);&lt;br /&gt;
SafeDoubleArray varDimArr(vxform);&lt;br /&gt;
wofstream wfs;&lt;br /&gt;
wfs.open(L"dimension_data_swx3dexpextrusion.txt");&lt;br /&gt;
for( int i = 0 ; i &amp;lt; 13 ; i ++ ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wfs &amp;lt;&amp;lt; "\nXFormData at\t" &amp;lt;&amp;lt; i &amp;lt;&amp;lt; "\t=\t" &amp;lt;&amp;lt; varDimArr[i];&lt;br /&gt;
}&lt;br /&gt;
wfs.close();&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;CONCLUSION&lt;/span&gt;&lt;br /&gt;
SolidWorks API while easy to work with have a few surprises - though in this case the missing documentation would have spoiled the surprise for me in the 2007 version. So all in all, I am able to run batch-mode integration test using the combination of CEEFIT and "global methods" to access array data from SolidWorks.</content><link href="http://ossandcad.blogspot.com/feeds/1076005790243930763/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/03/solidworks-api-in-process-or-global.html#comment-form" rel="replies" title="2 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1076005790243930763" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1076005790243930763" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/03/solidworks-api-in-process-or-global.html" rel="alternate" title="SolidWorks API - In-process or Global methods - Which to use?" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-2234279000528497150</id><published>2009-02-02T01:17:00.002-06:00</published><updated>2009-02-02T01:17:01.421-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="solidworks"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type="text">Writing CEEFIT class like a regular C++ class</title><content type="html">&lt;span style="font-size: large;"&gt;FIT / CEEFIT? &lt;/span&gt;&lt;br /&gt;
If you need to write integrated tests that can take a table specifying input data and expected output data, and run the tests in a batch, then you should consider &lt;a href="http://fit.c2.com/"&gt;Fit: Framework for Integrated Test&lt;/a&gt;. If you develop applications with C++, then look to &lt;a href="http://ceefit.woldrich.com/?page=Home"&gt;CEEFIT&lt;/a&gt; to satisfy your FIT needs.&lt;br /&gt;
&lt;br /&gt;
CEEFIT is well documented, flexible and an excellent integrated test framework. In most cases you can use the &lt;a href="http://ceefit.woldrich.com/?page=Using#macros"&gt;Macro method&lt;/a&gt; to create your test-classes, but CEEFIT also provides a way to create test-classes &lt;a href="http://ceefit.woldrich.com/?page=Using#manual"&gt;manually from scratch&lt;/a&gt;. This second 'manually from scratch' method is what this post talks about.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Why would you want to write CEEFIT classes from scratch?&lt;/span&gt;&lt;br /&gt;
Well one reason for me was to ensure that I could still use Doxygen to document the classes and their methods and parameters i.e. make the code-documentation doxygen-visible. I have not been able to figure out how to have the documentation be doxygen visible when using the macros.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;How to write CEEFIT class from scratch?&lt;/span&gt;&lt;br /&gt;
The &lt;a href="http://ceefit.woldrich.com/?page=Using#manual"&gt;example&lt;/a&gt; posted on CEEFIT's website is excellent and provides everything you need, but I found it a little too much. I simply wanted to write a class that inherits from COLUMNFIXTURE that looks like a regular C++ class - I did not want to mess with TABLE or DoRows(). Turned out to be very simple to do and here it is:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;TestSWX.h&lt;/span&gt;&lt;br /&gt;
namespace swx_ceefit {&lt;br /&gt;
/** A CEEFIT class created from scratch without macros to test batch-mode processing of SWX API cases.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \author GRI&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \date Dec 1 2008&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; class TestSWX :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public CEEFIT::COLUMNFIXTURE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inline ceefit_init_spec TestSWX();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inline virtual ceefit_dtor_spec ~TestSWX();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; private:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ceefit_init_spec TestSWX(const TestSWX&amp;amp;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TestSWX&amp;amp; ceefit_init_spec operator=(const TestSWX&amp;amp;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /** fit_var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CEEFIT::STRING m_sldprt_name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /** fit_test&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; double ceefit_call_spec nos_feats();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /** where is this executable executing from?&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; void ExecutingPath();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /** Get the full path to the input file i.e. the *.sldprt file&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \author GRI&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \date Jan 8 2009&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; void GetFullPath(std::wstring &amp;amp; wsFullPath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;TestSWX.cpp&lt;/span&gt;&lt;br /&gt;
CComPtr&lt;isldworks&gt; swApp;&lt;br /&gt;
&lt;br /&gt;
namespace swx_ceefit&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ceefit_init_spec TestSWX::TestSWX()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RegisterCeefitField(this, "sldprt_name", m_sldprt_name);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RegisterCeefitTest(this, "nos_feats", &amp;amp;TestSWX::nos_feats);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "constructing";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ceefit_dtor_spec TestSWX::~TestSWX() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "destructing";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; double ceefit_call_spec TestSWX::nos_feats() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ExecutingPath();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wstring wsFullPath;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetFullPath(wsFullPath);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swApp ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IModelDoc* swModel = NULL;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swApp-&amp;gt;put_Visible(FALSE) == S_OK ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swApp-&amp;gt;DocumentVisible(FALSE, swDocPART) == S_OK ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //wcout &amp;lt;&amp;lt; "\nfull path in nos_feats = " &amp;lt;&amp;lt; wsFullPath.c_str() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CComBSTR sFileName(wsFullPath.c_str());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CComBSTR sDefaultConfiguration(L"Default");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; long fileerror;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swApp-&amp;gt;IOpenDocSilent(sFileName.m_str, swDocPART, &amp;amp;fileerror, &amp;amp;swModel) == S_OK ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swModel != NULL ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IPartDoc *part;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hres = swModel-&amp;gt;QueryInterface(IID_IPartDoc, (LPVOID *)&amp;amp;part);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( swModel-&amp;gt;put_Visible(FALSE) == S_OK ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&lt;ifeature&gt; swfeat;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( part-&amp;gt;IFirstFeature(&amp;amp;swfeat) == S_OK ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CComBSTR name;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swfeat-&amp;gt;get_Name(&amp;amp;name);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "1st feat name = " &amp;lt;&amp;lt; name.m_str;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swModel-&amp;gt;Quit();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "no first feature";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "swModel still visible";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "swModel = NULL with fileerror = " &amp;lt;&amp;lt; fileerror;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "open doc not silent";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "document still visible";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "ERROR: swApp = NULL" &amp;lt;&amp;lt; "\tfile\t=\t" &amp;lt;&amp;lt; __FILE__ &amp;lt;&amp;lt; "\tline\t=\t" &amp;lt;&amp;lt; __LINE__;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; VARIANT_BOOL ret;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swApp-&amp;gt;CloseAllDocuments(TRUE, &amp;amp;ret);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void TestSWX::ExecutingPath() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wchar_t sExecPath[MAX_PATH];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetModuleFileName(NULL, sExecPath, MAX_PATH);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "executable = " &amp;lt;&amp;lt; sExecPath;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; void TestSWX::GetFullPath(wstring &amp;amp; wsFullPath) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wchar_t cFullPath[MAX_PATH] = TEXT("");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; LPTSTR&amp;nbsp; lpszFilePart = NULL;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; GetFullPathName(m_sldprt_name.GetBuffer(), MAX_PATH, cFullPath, &amp;amp; lpszFilePart);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //wcout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "full path = " &amp;lt;&amp;lt; cFullPath;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; wsFullPath = cFullPath;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; static REGISTERFIXTURECLASS&amp;lt; TestSWX &amp;gt; FatTableFixtureRegistration("swx_ceefit::TestSWX", "AKA_TESTSWX");&amp;nbsp; &lt;br /&gt;
&lt;/ifeature&gt;&lt;/isldworks&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
If you are wondering why this class is called TestSWX (SWX = short for SolidWorks), then consider this: using the solution from a previous post of mine "&lt;a href="http://ossandcad.blogspot.com/2008/04/batch-mode-solidworks.html"&gt;Batch mode SolidWorks&lt;/a&gt;" we can start SolidWorks without GUI and using the above CEEFIT class, call SolidWorks API and run your integrated tests. But that my readers is possibly a separate post.</content><link href="http://ossandcad.blogspot.com/feeds/2234279000528497150/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/02/writing-ceefit-class-like-regular-c.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/2234279000528497150" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/2234279000528497150" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2009/02/writing-ceefit-class-like-regular-c.html" rel="alternate" title="Writing CEEFIT class like a regular C++ class" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-5741566434338899317</id><published>2008-12-04T21:41:00.001-06:00</published><updated>2008-12-05T01:17:05.397-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="office"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type="text">Office 2003 Addin using Visual Studio Add-in (Extensibility) Project</title><content type="html">A while back I had to write an add-in to Microsoft Office 2003 for a client and ran into numerous issues during both the development and the deployment of the add-in. Thought I should post it here in hopes that someone may find it useful.&lt;br /&gt;
&lt;br /&gt;
I use Visual Studio 2005 Standard (I know, I know Visual Studio 2008 is out but I develop Pro/Toolkit and SolidWorks API applications too and am not sure if the upgrade is a simple recompile and link, so have not upgraded.), so in order to develop Microsoft Office 2003 Add-ins I had two options:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Use the Visual Studio Add-in Template under the "Extensibility" Project Type.&lt;/li&gt;
&lt;li&gt;Use Visual Studio 2005 Tools for Microsoft Office 2003 (VSTO)&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;There is a good comparison of these two choices at &lt;a href="http://www.codeproject.com/KB/macros/wordaddindesign.aspx"&gt;CodeProject&lt;/a&gt;. I have a few additional points to note here that may influence your choice:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Using Visual Studio Add-in Template&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: large;"&gt;DEVELOPMENT&lt;/span&gt;: Writing code for the add-in gets very clunky. The following is a sample excerpt:&lt;br /&gt;
using Microsoft.Office.Core;&lt;br /&gt;
using nsWord = Microsoft.Office.Interop.Word;&lt;br /&gt;
&lt;br /&gt;
nsWord.ApplicationClass office_app;&lt;br /&gt;
&lt;br /&gt;
public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; applicationObject = application;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addInInstance = addInInst;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnStartupComplete(ref custom);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// which office app is "application"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (application is nsWord.Application)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; office_app = (nsWord.ApplicationClass)application;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if (logger.IsInfoEnabled) { logger.Info("host app is Word"); }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
As can be seen from the last few lines, to determine the Office Application that the add-in is loaded in is an equivalence test (using if-else or switch-case or some similar). I know this is not a good solution, but I don't have anything better (if someone has a better suggestion I would really appreciate the tip.&lt;br /&gt;
&lt;br /&gt;
Even if I got beyond that I am still casting the 'object application' to 'Microsoft.Office.Interop.Word'. I guess I could have used inheritance to pass 'application' to a sub-class that would deal with the specific Office Application, but I was surprised to find that you could not simply query for the Office App Type.&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: large;"&gt;DEPLOYMENT&lt;/span&gt;: Deploying the Shared Add-in requires a bunch of updates from Microsoft that have to be applied to the target PC:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Microsoft .NET Framework (I personally installed 2.0 though latest versions should also work)&lt;/li&gt;
&lt;li&gt;KB 908002 (&lt;a href="http://support.microsoft.com/kb/908002" target="_blank"&gt;http://support.microsoft.com/&lt;wbr&gt;&lt;/wbr&gt;kb/908002&lt;/a&gt;) - Download and execute the EXE file. The EXE download actually contains 3 files all of which has to be applied to the target system in the following order: &lt;/li&gt;

&lt;ol&gt;&lt;ol&gt;&lt;li&gt;lockbackRegKey.msi&lt;/li&gt;
&lt;li&gt;office2003-kb907417sfxcab-ENU.&lt;wbr&gt;&lt;/wbr&gt;exe&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;extensibilityMSM.msi&lt;/li&gt;
&lt;/ol&gt;&lt;/ol&gt;
&lt;li&gt;Office 2003 Primary Interop Assemblies (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD&amp;amp;displaylang=en" target="_blank"&gt;http://www.microsoft.com/&lt;wbr&gt;&lt;/wbr&gt;downloads/details.aspx?&lt;wbr&gt;&lt;/wbr&gt;FamilyId=3C9A983A-AC14-4125-&lt;wbr&gt;&lt;/wbr&gt;8BA0-D36D67E0F4AD&amp;amp;displaylang=&lt;wbr&gt;&lt;/wbr&gt;en&lt;/a&gt;) - The download (an EXE file) contains an MSI file that has to be run on target system.&lt;br /&gt;
&lt;br /&gt;
As far as I can tell KB 908002 and the Office 2003 Primary Interop Assemblies cannot be uninstalled.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;I have not had a chance to write code with VSTO, but considering that it was designed for such applications, I am assuming that you will not have most of the weirdness stated here. If you have Visual Studio 2005 Professional, then you can download &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8315654b-a5ae-4108-b7fc-186402563f2b&amp;amp;DisplayLang=en"&gt;VSTO here&lt;/a&gt; [3]. You can search on Microsoft's Download center for respective versions of VSTO for VS 2008 (for Microsoft Office 2003/2007).&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Acknowledgements:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/vsto/thread/10c10162-4841-4b46-9d54-67adfecbf622/"&gt;http://social.msdn.microsoft.com/forums/en-US/vsto/thread/10c10162-4841-4b46-9d54-67adfecbf622/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/kh3965hw%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/kh3965hw(VS.80).aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8315654b-a5ae-4108-b7fc-186402563f2b&amp;amp;DisplayLang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=8315654b-a5ae-4108-b7fc-186402563f2b&amp;amp;DisplayLang=en&lt;br /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><link href="http://ossandcad.blogspot.com/feeds/5741566434338899317/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/10/office-2003-addin-using-visual-studio.html#comment-form" rel="replies" title="3 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5741566434338899317" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/5741566434338899317" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/10/office-2003-addin-using-visual-studio.html" rel="alternate" title="Office 2003 Addin using Visual Studio Add-in (Extensibility) Project" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-1977515834723206201</id><published>2008-09-18T12:16:00.004-05:00</published><updated>2008-09-18T12:48:07.128-05:00</updated><title type="text">License needed to run my Pro/Toolkit add-ins</title><content type="html">I received a comment on an older post of mine &lt;a href="http://ossandcad.blogspot.com/2008/03/howto-example-protoolkit-application.html"&gt;HOWTO: Example Pro/Toolkit Application using Visual Studio 2005&lt;/a&gt; from Hans who mentioned that he was unable to run my Pro/Toolkit add-in that was attached with that post. (For convenience the following is the same attachment)&lt;br /&gt;
&lt;br /&gt;
&lt;embed height="225" src="http://www.box.net/static/flash/box_explorer.swf?widgetHash=xvzvctm88c" type="application/x-shockwave-flash" width="400" wmode="transparent" /&gt;&lt;br /&gt;
&lt;br /&gt;
The specific error he received was:&lt;br /&gt;
&lt;blockquote&gt;The Pro/TOOLKIT application "ProE_Proj" was not unlocked before distribution to your site.&lt;br /&gt;
Please contact the provider of "ProE_Proj" for assistance.&lt;/blockquote&gt;This error is the result of a lack of a Pro/Toolkit license on the PC on which you are deploying my add-in.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Reason for Error&lt;/span&gt; &lt;br /&gt;
I intended this blog for developers of Pro/Toolkit, SolidWorks and other CAD API applications. So the assumption I make is the availability of the required developer license on the PC where these applications are to be developed. The Visual Studio project and source code that I post are not intended for deployment on end-user PC. I do not pay for a Pro/Engineer or Pro/Toolkit license myself. So do not have the rights to distribute the binary executable code (either DLL or EXE). In order to use my add-ins on an end-user PC you will need to have a Pro/Toolkit or SolidWorks license, as applicable.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Solution&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;To deploy a Pro/Toolkit add-in (e.g. to deploy my ProE_Proj on a PC without Pro/Toolkit license) follow these steps:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;From a development workstation which has Pro/Toolkit license execute the following command:&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;C:\Program Files\proeWildfire 3.0\i486_nt\obj\protk_unlock.exe 'one or more pro/toolkit dll or exe names '&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Once unlocked you can deploy the add-in to end-user PC without them needing Pro/Toolkit license on their PC. To learn how to write installers to deploy your add-in, refer to my last post &lt;a href="http://ossandcad.blogspot.com/2008/07/protoolkit-add-in-registration.html"&gt;Pro/Toolkit Add-in registration&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Still problems? &lt;/span&gt;&lt;br /&gt;
If you are still having problems with development or deployment of the Pro/Toolkit add-in, then post a comment and I will respond with a solution if I have one.</content><link href="http://ossandcad.blogspot.com/feeds/1977515834723206201/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/09/license-needed-to-run-my-protoolkit-add.html#comment-form" rel="replies" title="5 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1977515834723206201" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/1977515834723206201" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/09/license-needed-to-run-my-protoolkit-add.html" rel="alternate" title="License needed to run my Pro/Toolkit add-ins" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7274961.post-8886122357368898864</id><published>2008-09-08T23:25:00.000-05:00</published><updated>2008-09-09T14:58:19.420-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="pro toolkit"/><category scheme="http://www.blogger.com/atom/ns#" term="proengineer"/><category scheme="http://www.blogger.com/atom/ns#" term="protoolkit"/><title type="text">Pro/Toolkit Add-in registration</title><content type="html">In one of my previous posts &lt;a href="http://ossandcad.blogspot.com/2008/03/howto-example-protoolkit-application.html"&gt;HOWTO: Example Pro/Toolkit Application using Visual Studio 2005&lt;/a&gt; I described how to create &lt;b&gt;protk.dat&lt;/b&gt; files necessary to enable Pro/Engineer to discover your Pro/Toolkit add-ins. In that post the protk.dat file was placed in the same path as your executable. This simplified your development and debugging process.&lt;br /&gt;
&lt;br /&gt;
But once you are done with all development and want to package your add-in for delivery to the customer you can leave the protk.dat in the same location as your add-in unless you plan to put your executable in the Pro/Engineer directory - which is the worst thing you can do.&lt;br /&gt;
&lt;br /&gt;
So where should you put your protk.dat file? Well the tkuse.pdf (found under &lt;b&gt;C:\Program Files\proeWildfire 3.0\protoolkit&lt;/b&gt;) gives the following advice to Pro/Toolkit developers.&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;Pro/ENGINEER searches for the registry file as follows:&lt;/i&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;In the absolute path specified in the “PROTKDAT”, “PRODEVDAT”, and “TOOLKIT_REGISTRY_FILE” statements in the Pro/ENGINEER configuration file.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;For the files named protk.dat or prodev.dat in the following locations:&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;Current directory&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;pro engineer=""&gt;&amp;lt; Pro/ENGINEER &amp;gt;&lt;machine&gt;/&amp;lt; MACHINE &amp;gt;text&lt;/machine&gt;&lt;/pro&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;pro engineer=""&gt;&amp;lt; Pro/ENGINEER &amp;gt;/text&lt;/pro&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;i&gt;In the preceeding locations, the variables are as follows:&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;pro engineer=""&gt;&amp;lt; Pro/ENGINEER &amp;gt;—The Pro/ENGINEER loadpoint (not the Pro/TOOLKIT loadpoint).&lt;/pro&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;machine&gt;&amp;lt; MACHINE &amp;gt;—The machine-specific subdirectory (such as sgi_elf2 or i486_nt).&lt;/machine&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;i&gt;If more than one registry file having the same filename exists in this search path, Pro/ENGINEER stops searching after finding the first instance of the file and starts all the Pro/TOOLKIT applications specified in it. If more than one registry file having different filenames exist in this search path, Pro/ENGINEER stops searching after finding one instance of each of them and starts all the Pro/TOOLKIT applications specified in them.&lt;br /&gt;
Note:&lt;/i&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Option 1 is normally used during development, because the Pro/TOOLKIT application is seen only if you start Pro/ENGINEER from the specific directory that contains the registry file.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Option 3 is recommended when making an end-user installation, because it makes sure that the registry file is found no matter what directory is used to start Pro/ENGINEER.&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;h3 class="post-title"&gt;&lt;/h3&gt;So according to PTC we should put our protk.dat files in the &amp;lt; Pro/ENGINEER &amp;gt;\text folder which is typically &lt;b&gt;C:\Program Files\proeWildfire 3.0\text&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;Be careful&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Do not overwrite&lt;/b&gt; the protk.dat file in the &amp;lt; Pro/Engineer &amp;gt;\text folder as other add-ins may have appended their protk.dat registry file into that file. &lt;b&gt;Append &lt;/b&gt;your protk.dat to the protk.dat file in the &lt;i&gt;&amp;lt; Pro/ENGINEER &amp;gt;/text&lt;/i&gt; folder. Also &lt;b&gt;when uninstalling take care to not delete the protk.dat files&lt;/b&gt;, as that would disable other add-ins. Simply delete the lines in that protk.dat file that you wrote during installation of your add-in. NOTE: Do not just make a copy of the protk.dat in&amp;lt; Pro/ENGINEER &amp;gt;\text folder to a temporary location during installation and then replace it when uninstalling your application. This will disable Pro/Toolkit applications installed after your own.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-large;"&gt;So what should be done and How to do this?&lt;/span&gt; &lt;br /&gt;
To summarize we need to achieve the following to register and deregister the Pro/Toolkit addin with Pro/Engineer upon installation and uninstallation respectively:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;On install append the add-ins registration information to the protk.dat file in &amp;lt; Pro/ENGINEER &amp;gt;\text&lt;/li&gt;
&lt;li&gt;On uninstall delete the lines of text we appended to the protk.dat file in &amp;lt; Pro/ENGINEER &amp;gt;\text&lt;/li&gt;
&lt;/ol&gt;I personally use the &lt;a href="http://nsis.sourceforge.net/"&gt;NSIS scriptable install&lt;/a&gt; to create Pro/Toolkit applications. NSIS is an open source system to create Windows installers. If you use NSIS then the following tips should help you to address the above requirements.&lt;br /&gt;
&lt;ul&gt;&lt;ul&gt;&lt;li&gt;INSTALLATION:&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Create a section, named something like "AppendProTKDAT".&lt;/li&gt;
&lt;li&gt;Call FileOpen in "append" mode&lt;/li&gt;
&lt;li&gt;Call FileSeek with "offset" at "0" with "END" mode - This is very important, since FileOpen always positions the file's cursor at the beginning of the file. We want to append our protk.dat registry lines to the end of the file - So basically call after FileOpen&lt;br /&gt;
&lt;b&gt;FileSeek $0 0 END&lt;/b&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Call FileWrite repeatedly to write the various lines&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWriteByte ${FilePathName} "13"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWriteByte ${FilePathName} "10"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Carriage Return / Line Feed&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWriteByte ${FilePathName} "13"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWriteByte ${FilePathName} "10"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileWrite ${FilePathName} "NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ${name_of_prod}"&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Call FileClose &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;UNINSTALL&lt;/li&gt;

&lt;ul&gt;&lt;li&gt; To delete the lines of text we appended to the protk.dat file call RemoveAfterLine as specified in the following &lt;a href="http://nsis.sourceforge.net/Delete_lines_from_one_line_to_another_line_inclusive"&gt;NSIS Function&lt;/a&gt; (note: this is a user contributed Function).&lt;/li&gt;
&lt;li&gt;So in my case I called it as follows (the $\r$\n is for "new line"):&lt;br /&gt;
&lt;b&gt;Push "NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ${PRODUCT_NAME}$\r$\n" ;(here ${PRODUCT_NAME} is something I have defined at the beginning of the script to be the name of my product, as written to the protk.dat)&lt;br /&gt;
Push "END$\r$\n"&lt;br /&gt;
Call un.RemoveAfterLine&lt;/b&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-size: x-large;"&gt;A Few Gotchas&lt;/span&gt;&lt;br /&gt;
While creating the installer with NSIS I ran into a weird problem. During install/uninstall with the NSIS-created installer, the protk.dat file would get appended to properly but for some reason the permissions on the file would change from "readable by Users" to "readable by Administrator only". Since I could not find a fix or a mention for this on NSIS' website I fixed it as follows:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;On Windows XP (and possibly other Windows OS too) call "CACLS.EXE" as follows during install and uninstall - &lt;br /&gt;
&lt;b&gt;ExecWait '"$SYSDIR\cmd.exe" /C echo Y|$SYSDIR\cacls.exe "${PROTKDAT_INSTALL_DIR}" /G everyone:R administrators:f' $0&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;The &lt;b&gt;"echo"&lt;/b&gt; part is required since CACLS.EXE requires user input at the command prompt for a &lt;b&gt;"Y" &lt;/b&gt;or an &lt;b&gt;"N"&lt;/b&gt;. So with the "echo" we are simply replicating that behavior.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-size: large;"&gt;Comments?&lt;/span&gt; &lt;br /&gt;
I am not attaching the source code directly, as I have not found a generic way to present my NSIS code without making it very application specific. If the sample stuff I have posted above is not enough, leave a comment for me and I will post whatever you need after stripping application-specific strings and code.</content><link href="http://ossandcad.blogspot.com/feeds/8886122357368898864/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/07/protoolkit-add-in-registration.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8886122357368898864" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/7274961/posts/default/8886122357368898864" rel="self" type="application/atom+xml"/><link href="http://ossandcad.blogspot.com/2008/07/protoolkit-add-in-registration.html" rel="alternate" title="Pro/Toolkit Add-in registration" type="text/html"/><author><name>Ganeshram Iyer</name><uri>http://www.blogger.com/profile/09189272659983924981</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry></feed>