<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7258279095322020969</id><updated>2012-01-30T16:58:09.406-05:00</updated><category term='DOS SNES DOSBox ZSNES Linux Ubuntu karmic lucid Debian emulators emulation bad poor slow performance video sound audio quality problems choppy libSDL ALSA PulseAudio backend OpenGL'/><category term='how to remove get rid of produced by an Autodesk educational product software watermark plot stamp AutoCAD Inventor dwg dxf'/><category term='Microsoft MS Security Essentials slowdown freezes freezing stops halts during while scanning SpyNet'/><category term='Steel Shapes download Luke Livermore Design Point 4.3 lisp lsp program structural CAD AutoCAD AISC software'/><category term='GNU Octave 3.2.4 MathWorks MATLAB R2009 speed performance benchmark test comparison slower faster open-source time increase reduction'/><category term='access integrate connect control utilize use link call Excel xls with AutoCAD AutoLISP Visual LISP COM ActiveX object model vla vlax spreadsheet file worksheet invoke object'/><category term='AutoCAD Excel data links integrate connect tables paste special insert OLE spanner entities XL2CAD sucks'/><category term='AutoCAD spell check checker AutoLISP Visual Lisp remove MTEXT format formatting DXF codes better than stripmtext SCOWL'/><category term='AutoCAD CAD guidelines best good practices CAD theory cleanliness standards how to not fuck up'/><category term='OpenArena linux Ubuntu karmic lucid 3D fullscreen FPS game mouse touchpad problem can&apos;t use keyboard at same time key polling odd unpredictable behavior'/><category term='open-source gnu c compiler gcc versus low level virtual machine llvm intel c++ compiler composer XE 2011 icc linux speed performance test comparison benchmark slower faster time increase reduction'/><category term='Autodesk AutoCAD add arx lsp dvb dbx vlx fas file Startup Suite programmatically registry keys values AutoLISP Visual Lisp'/><category term='AutoCAD csv txt xls Excel parse parsing tokenize process AutoLISP LISP file comma delimited tab'/><category term='Microsoft MS SharePoint 2010 Office SharePoint Server MOSS 2007 Windows SharePoint Services WSS 1.0 2.0 3.0 standard stock default included Web Parts webparts list descriptions summary ASP.NET'/><category term='Audacious media player Ubuntu karmic lucid Linux xm module skips too fast bad poor sound audio quality choppy problems Modplug UADE XMP DUMB plugins'/><category term='download compile compiling make install installing audacious media player from source code ubuntu karmic lucid linux latest automatic bash script mercurial svn checkout'/><category term='AutoCAD aerials images editing manipulation cleanup clean up raster design imageclip wipeout imageframe imageattach'/><category term='python vs versus C++ C++11 C++0x speed performance comparison benchmark parsing large files readahead dictionary hash table file disk I/O bound windows mingw tdm-gcc MSVC'/><category term='AutoCAD remote transparent CAD Administration control without getting up effortless no hassle AutoLISP Visual Lisp set default profile tool palette support paths directories options preferences'/><category term='Microsoft MS SharePoint 2010 MOSS 2007 WSS 1.0 2.0 3.0 hide erase delete get rid of unwanted extra ugly column header library list view web part'/><category term='solve solving colebrook white equation darcy friction factor formula Excel VBA function module code darcy-weisbach pressure drop fast accurate simple moody chart how-to'/><category term='AutoCAD script batch process every drawing LISP AutoLISP recursive all files directory vl-directory-files'/><category term='oracle sun virtualbox 4.0.8 vmware player 3.1.4 windows 7 linux lubuntu host slow performance issues sluggish'/><category term='MATLAB vs. GNU Octave replacement equivalent clone better GUI front end front-end Xoctave QtOctave comparison free software GPL&apos;ed Scilab'/><category term='open-source gnu fortran gfortran gcc versus intel fortran compiler composer XE 2011 ifort icc linux speed performance test comparison benchmark slower faster time increase reduction'/><category term='big little endian endianness convert swap signed unsigned IEEE 754 double float floating point detect change C programming language'/><category term='old retro games better DOS emulators MSDOS MS-DOS 7.1 FreeDOS DOSBox Tyrian CyberDogs C-Dogs Ronny Wester Doom Duke Nukem 3D MegaRace fast fun nostalgia'/><category term='pwtracker .au .snd UNIX audio music file synthesis synthesizer program code C C99 endianness notes piano keys frequencies sample sampling function free API tracking'/><category term='Linux MS Microsoft Windows free open source software GNU equivalents replacements GPL&apos;ed FOSS comparison better'/><category term='open letter linux Autodesk AutoCAD replacement CAD tyranny bullshit GNU FOSS free software open source GPL&apos;ed dwg libredwg'/><category term='AutoCAD CAD increase speed efficiency accuracy performance mouse keyboard shortcuts fast customization'/><category term='revision cleanliness clearness language note writing guidelines jargon lingo syntax specifics triangle delta'/><category term='VideoLAN VLC media player play video game music emu gme chiptunes plugin AY GBS GYM HES KSS NSF NSFE SAP SPC VGM VGZ how to compile VLC 1.1.0 Ubuntu'/><category term='AutoCAD DCL ObjectDCL OpenDCL network WAN based location install deployment runtime'/><category term='rsn spc SNES Super Nintendo music container file plugin Audacious media player Linux Ubuntu'/><title type='text'>Hazudra Fodder</title><subtitle type='html'>A blog about CAD/CAE, programming, open-source software, science/engineering/mathematics, old video games and their music, and whatever else I decide to write about.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-1356476511356478290</id><published>2012-01-14T19:35:00.001-05:00</published><updated>2012-01-14T19:35:25.661-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python vs versus C++ C++11 C++0x speed performance comparison benchmark parsing large files readahead dictionary hash table file disk I/O bound windows mingw tdm-gcc MSVC'/><title type='text'>Python vs. C++ in parsing large files</title><content type='html'>I have a handful of Python scripts that process some very large data files. They parse some bandwidth data and create dictionaries/hash tables of IPv4 addresses and the amount of data coming to them. The process is very slow, mainly because of disk I/O. I have recently decided to stop being such a C zealot and learn some C++, especially since the latest standard (&lt;a href="http://en.wikipedia.org/wiki/C%2B%2B11"&gt;C++11/C++0x&lt;/a&gt;) has added a bunch of goodies. Anyway, I wanted to compare the performance of a fast interpreted (really JIT) language, &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, to the 2nd fastest compiled language on the planet, C++. I must say, I thought for sure that C++ would really whoop Python, but this is not the case in I/O bound applications such as this.&lt;br /&gt;&lt;br /&gt;I created two programs, one in Python and one in C++, and ran them on the same data file (approx. 1.6 GB of text). They were both run on an Intel Core i7 processor running Windows 7 x64. The version of Python used is 2.7.1, 64-bit. The .cpp file was compiled with &lt;a href="http://tdm-gcc.tdragon.net/"&gt;TDM-GCC&lt;/a&gt;'s MinGW-w64-based g++ (version 4.6.1) using the following switches:&lt;br /&gt;&lt;br /&gt;g++ -std=c++0x -O2 -march=native -Wall -Wextra test.cpp&lt;br /&gt;&lt;br /&gt;Instead of placing the code directly in this post, I have placed links so that you can download them since Blogger bastardizes code.&lt;br /&gt;&lt;br /&gt;C++ code:&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/57289645/test.cpp"&gt;http://dl.dropbox.com/u/57289645/test.cpp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Python code:&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/57289645/test.py"&gt;http://dl.dropbox.com/u/57289645/test.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Results:&lt;/u&gt;&lt;br /&gt;C++: 24 seconds&lt;br /&gt;Python: 45 seconds&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Python has an unfair advantage here, which is the fact that the "with open(file, 'r') as fin:" structure uses a built-in readahead buffer in Python. So the Python script is reading large chunks of the file into memory in order to parse the file faster, whereas the C++ program is just using normal file I/O.&lt;/li&gt;&lt;li&gt;Python on Windows is compiled using MSVC. The C++ program would probably be faster if compiled with MSVC. It would certainly be faster if compiled with Intel's C++ compiler, icc.&lt;/li&gt;&lt;li&gt;Python is splitting each line into a list, whereas C++ is using a more brute force type method by directly searching for the tab characters and only extracting what is needed. Python could just as easily search for tabs, as you could certainly dump the line into a list in C++.&lt;/li&gt;&lt;/ul&gt;In any case, I'm sure there are improvements that can be made to both pieces of code. The thing to learn out of this is that in disk I/O bound applications, writing a program in a lower-level/faster/compiled language might not be as big of a benefit as you'd think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-1356476511356478290?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/1356476511356478290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2012/01/python-vs-c-in-parsing-large-files.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1356476511356478290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1356476511356478290'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2012/01/python-vs-c-in-parsing-large-files.html' title='Python vs. C++ in parsing large files'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5648909120823124454</id><published>2011-06-23T20:19:00.005-04:00</published><updated>2011-06-24T10:15:05.660-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle sun virtualbox 4.0.8 vmware player 3.1.4 windows 7 linux lubuntu host slow performance issues sluggish'/><title type='text'>VirtualBox 4.0.8 on a Windows 7 Host</title><content type='html'>...is terrible. I tried installing Lubuntu on VirtualBox 4.0.8 and VMware Player 3.1.4 VMs and VMware Player completed the installation in near half the time VirtualBox did (45 mins vs. 80 mins). This is appalling because VirtualBox used to be much faster (on the same computer on Windows XP and Linux), perhaps it just performs poorly on Windows 7. In any case, VMware Player is a lifesaver since it's made this computer usable again.&lt;br /&gt;&lt;br /&gt;I'll also add that I got a chance to use VMware Server at work and must say that it and VMware Player seem much more polished than VirtualBox. My two cents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5648909120823124454?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5648909120823124454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2011/06/virtualbox-408-on-windows-7-host.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5648909120823124454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5648909120823124454'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2011/06/virtualbox-408-on-windows-7-host.html' title='VirtualBox 4.0.8 on a Windows 7 Host'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-277865957986205991</id><published>2011-03-31T19:56:00.007-04:00</published><updated>2011-03-31T20:08:02.910-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open-source gnu c compiler gcc versus low level virtual machine llvm intel c++ compiler composer XE 2011 icc linux speed performance test comparison benchmark slower faster time increase reduction'/><title type='text'>gcc vs. LLVM vs. icc (GNU C comp. vs. LLVM vs. Intel C++ comp.)</title><content type='html'>Similar to my last post, I decided to try these three compilers on my pwtracker project. This was performed on the same exact system as that last post, a single-core 1.7 GHz Pentium M laptop. Here are the results:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Run times (in seconds):&lt;/u&gt;&lt;br /&gt;gcc (-O3): 0.86, 1.62&lt;br /&gt;llvm (-O3): 0.72, 1.34 (using gcc front-end)&lt;br /&gt;icc (-fast): &lt;b&gt;0.28&lt;/b&gt;, &lt;b&gt;0.48&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As you can see, Intel wins again with its blazing fast compilers. The speedups over gcc are 3.0 and 3.3, respectively. The speedups for LLVM over gcc are 1.19 and 1.21, respectively.&lt;br /&gt;&lt;br /&gt;For anyone reading this, I would like some feedback on these numbers or maybe links to your own personal comparisons, so please comment away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-277865957986205991?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/277865957986205991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2011/03/gcc-vs-llvm-vs-icc-gnu-c-comp-vs-llvm.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/277865957986205991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/277865957986205991'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2011/03/gcc-vs-llvm-vs-icc-gnu-c-comp-vs-llvm.html' title='gcc vs. LLVM vs. icc (GNU C comp. vs. LLVM vs. Intel C++ comp.)'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-2747894155267210080</id><published>2011-03-26T21:14:00.022-04:00</published><updated>2011-03-31T20:08:50.789-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open-source gnu fortran gfortran gcc versus intel fortran compiler composer XE 2011 ifort icc linux speed performance test comparison benchmark slower faster time increase reduction'/><title type='text'>gfortran vs. ifort (GNU Fortran vs. Intel Fortran Compiler)</title><content type='html'>Recently I was given the job of cleaning up and modifying a CFD code for my undergrad research project. I thought this would be the perfect opportunity to compare compilers. As you can see from the previous post, I'm interested in how fast open-source software is compared to commercial software.&lt;br /&gt;&lt;br /&gt;I obviously can't post the code as it is property of OSU, but I can say that it is more scientifically oriented than anything else. That is to say that it is all number-crunching and nothing really computer-sciency. The code is nothing but simple mathematical operations, logical statements, and file I/O. Plus, it's FORTRAN...so it has to be simple.&lt;br /&gt;&lt;br /&gt;Anyway, I put GNU Fortran 4.4 (gfortran) and Intel Fortran Composer XE 2011 (ifort) on an old laptop running 32-bit Linux. The laptop has a single-core Intel Pentium M processor running at 1.7 GHz. I ran each version a few times and measured the times using the time command.&lt;br /&gt;&lt;br /&gt;Here are the results (using the standard -O2 setting):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;gfortran&lt;/b&gt;: 5m56s = &lt;u&gt;356 seconds&lt;/u&gt;&lt;br /&gt;&lt;b&gt;ifort&lt;/b&gt;: 4m17s = &lt;u&gt;257 seconds&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;It's no surprise that Intel's compiler would produce faster code for an Intel processor. The speedup is 356/257 = &lt;b&gt;&lt;u&gt;1.39x&lt;/u&gt;&lt;/b&gt;. This lines up with the figures shown on Intel's site: &lt;a href="http://software.intel.com/en-us/articles/intel-composer-xe/"&gt;http://software.intel.com/en-us/articles/intel-composer-xe/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Update 3/27/11: I retried with gfortran 4.5 and it shaved off 27 seconds (5m39s), resulting in a modified speedup of &lt;u&gt;1.32&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Update 3/31/11: I retried using the -O3 flag for gfortran and the -fast flag for ifort (highest optimization settings for each compiler), resulting in times of 5m16 and 4m9, respectively. This gives a speedup of &lt;u&gt;1.27&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Conclusion: It's safe to say that for Fortran, the Intel compiler is approximately 20-40% faster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-2747894155267210080?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/2747894155267210080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2011/03/gnu-fortran-gfortran-vs-intel-fortran.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2747894155267210080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2747894155267210080'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2011/03/gnu-fortran-gfortran-vs-intel-fortran.html' title='gfortran vs. ifort (GNU Fortran vs. Intel Fortran Compiler)'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-6074396519628093705</id><published>2011-01-15T23:22:00.018-05:00</published><updated>2012-01-29T11:47:48.199-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNU Octave 3.2.4 MathWorks MATLAB R2009 speed performance benchmark test comparison slower faster open-source time increase reduction'/><title type='text'>MathWorks MATLAB vs. GNU Octave Speed/Performance Comparison</title><content type='html'>When I went back to school in 2009 after a year hiatus, I was forced by many classes to start using MATLAB. I of course did not want to use such closed-source software and immediately started using GNU Octave instead. Octave has been great and with the exception of a missing Simulink counterpart, has provided me with every capability needed. I however have been wondering how fast MATLAB is in comparison. I didn't think I'd get a chance...until I needed Simulink and had to install the student version at home.&lt;br /&gt;&lt;br /&gt;Using an older laptop with a 32-bit 1.6 GHz Intel Core Duo processor, I installed and compared Octave 3.2.4 and MATLAB R2009b (on Windows). I have been learning some advanced numerical methods from the mechanical engineering department's CFD expert and selected five different homework problems for testing purposes. They all solve the same problem and all use the same initial conditions but use different algorithms obviously. I ran them all with both programs, recorded the times, and calculated the percent differences.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion: MATLAB will take non-vectorized loops and still give them almost full compiled performance. All of the partially vectorized scripts showed at &lt;u&gt;least&lt;/u&gt; a 99.4% reduction in time when run in MATLAB. This translates to MATLAB being about &lt;u&gt;200-300 times faster than Octave&lt;/u&gt; for non-vectorized code. Even for code that was fully vectorized, MATLAB still showed a 2x improvement over Octave. In any case, MATLAB is definitely faster.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is very disappointing...pretty much a slap in the face to open-source software. I am obviously a big proponent of open-source software, but I can't ignore these numbers. Anyway, while Octave is a nice piece of software, it's obviously too slow for use with anything more complicated than simpler homework assignments.&lt;br /&gt;&lt;br /&gt;Edit: Since Filedropper.com sucks and lost my only copy of the data table, I have rerun the scripts on a &lt;u&gt;different machine&lt;/u&gt;. This machine has the same clock speed, but is a single-core Intel Atom processor. The software versions and platforms are the same (32-bit Windows).&lt;br /&gt;&lt;br /&gt;Edit 1/29/2012: I have re-uploaded the scripts so that anyone may try them. Download them &lt;a href="http://dl.dropbox.com/u/57289645/ME707.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;b&gt;MATLAB*&lt;/b&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;b&gt;Octave*&lt;/b&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;b&gt;Speedup&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HW3_1&lt;/td&gt;&lt;td align="center"&gt;6.12&lt;/td&gt;&lt;td align="center"&gt;10.17&lt;/td&gt;&lt;td align="center"&gt;1.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HW3_2&lt;/td&gt;&lt;td align="center"&gt;4.36&lt;/td&gt;&lt;td align="center"&gt;1092.4&lt;/td&gt;&lt;td align="center"&gt;250.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HW4_1&lt;/td&gt;&lt;td align="center"&gt;5.55&lt;/td&gt;&lt;td align="center"&gt;777.6&lt;/td&gt;&lt;td align="center"&gt;140.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HW4_2&lt;/td&gt;&lt;td align="center"&gt;0.68&lt;/td&gt;&lt;td align="center"&gt;84.1&lt;/td&gt;&lt;td align="center"&gt;123.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HW5&lt;/td&gt;&lt;td align="center"&gt;1.8&lt;/td&gt;&lt;td align="center"&gt;366.2&lt;/td&gt;&lt;td align="center"&gt;203.4&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;* = time in seconds&lt;br /&gt;&lt;br /&gt;The improvement on a single-core processor is of course slightly less than that of the Core Duo; I'm sure that MATLAB automatically parallelizes a lot of the assignments and parts of the for loops. In any case, MATLAB is much, much faster than Octave.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-6074396519628093705?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/6074396519628093705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2011/01/mathworks-matlab-vs-gnu-octave.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6074396519628093705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6074396519628093705'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2011/01/mathworks-matlab-vs-gnu-octave.html' title='MathWorks MATLAB vs. GNU Octave Speed/Performance Comparison'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5131735561035187750</id><published>2010-06-29T15:49:00.000-04:00</published><updated>2010-06-29T15:50:21.943-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft MS Security Essentials slowdown freezes freezing stops halts during while scanning SpyNet'/><title type='text'>Why Microsoft Security Essentials sometimes freezes during a scan</title><content type='html'>When you do a full scan with &lt;a href="http://www.microsoft.com/security_essentials"&gt;Security Essentials&lt;/a&gt;, it'll get through the majority of the scan (maybe 75-80%) and then just stop on one file for minutes at a time.  I was baffled by this for the longest time, but I just discovered today what's really going on.&lt;br /&gt;&lt;br /&gt;As a user of Security Essentials, you're automatically a "member" of Microsoft SpyNet, which is Microsoft's Googlesque program for collecting file and system information for purposes of malware prevention.  Essentially, it's collecting as much information as possible about the programs and possible malware you have on your computer so it can create a better antivirus product.  That sounds reasonable; you get to use Security Essentials for free while they get some non-vital information about your computer and its files.&lt;br /&gt;&lt;br /&gt;However, this requires a fair amount of bandwidth to send all this information...and this is what causes it to freeze.  If you don't have a great internet connection, you're definitely going to experience the slowdown.  &lt;b&gt;The next time it freezes during a scan, turn off your internet connection and watch the scan resume almost instantaneously.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For information on what information Security Essentials collects, see the &lt;a href="http://www.microsoft.com/security_essentials/privacy.aspx"&gt;privacy agreement&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5131735561035187750?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5131735561035187750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/why-microsoft-security-essentials.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5131735561035187750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5131735561035187750'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/why-microsoft-security-essentials.html' title='Why Microsoft Security Essentials sometimes freezes during a scan'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-3138400559462215754</id><published>2010-06-25T14:58:00.006-04:00</published><updated>2010-10-22T14:54:58.073-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='how to remove get rid of produced by an Autodesk educational product software watermark plot stamp AutoCAD Inventor dwg dxf'/><title type='text'>How to remove the Autodesk educational product watermark/plot stamp (AutoCAD, Inventor, etc.)</title><content type='html'>&lt;b&gt;Disclaimer:  The information in this blog post is for educational purposes only.  If you decide to break any product's EULA (End User License Agreement), which you will be doing if you follow this guide and don't have a proper license of the product, it is &lt;u&gt;your&lt;/u&gt; own choice and &lt;u&gt;you&lt;/u&gt; are solely responsible/liable, not myself or anyone else.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Using an Autodesk educational product marks each drawing file so that when you go to print, you see a "Produced by an Autodesk Educational Product" or "For Educational Use Only" watermark in the margins of the plot.  This is a bad joke...even blood-sucking Microsoft doesn't put any restrictions on the free educational software they distribute.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/TCT7bNJmttI/AAAAAAAAADs/xIrlXU4v_bw/watermark.png" /&gt;&lt;/div&gt;&lt;br /&gt;If you're using AutoCAD and happen to have a normal (non-educational) copy handy, you can just export the drawing as a .dxf (using the DXFOUT command), import the .dxf (using the DXFIN command), and save it as a .dwg.  Alternatively, you can create a new drawing, insert the educational drawing as an xref, bind it, and explode the resulting block.  Both of these methods will remove the watermark forever.  However, they only work if you have a non-educational version of AutoCAD and obviously won't work for Inventor.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Most effective and universal method:&lt;/b&gt;&lt;br /&gt;Since this educational infection only affects plots...&lt;br /&gt;1. Plot the drawing as a PDF file using either the built-in PDF driver or a third party PDF printer (I like &lt;a href="http://www.pdfill.com/freewriter.html"&gt;PDFill&lt;/a&gt;).&lt;br /&gt;2. Edit the PDF file using a free tool like &lt;a href="http://www.tracker-software.com/product/pdf-xchange-viewer"&gt;PDF-XChange Viewer&lt;/a&gt; and put white rectangles over top of the watermarks, effectively erasing them (or just delete the text itself if you have access to software that can truly edit the PDF).&lt;br /&gt;3. Plot the PDF file.&lt;br /&gt;&lt;br /&gt;It's a hassle, but it's the only way when all you have handy is an educational version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-3138400559462215754?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/3138400559462215754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/how-to-remove-autodesk-educational.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/3138400559462215754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/3138400559462215754'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/how-to-remove-autodesk-educational.html' title='How to remove the Autodesk educational product watermark/plot stamp (AutoCAD, Inventor, etc.)'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_4hpDfOHJJqE/TCT7bNJmttI/AAAAAAAAADs/xIrlXU4v_bw/s72-c/watermark.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-4390345214680663910</id><published>2010-06-24T19:49:00.023-04:00</published><updated>2011-01-15T23:26:19.517-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VideoLAN VLC media player play video game music emu gme chiptunes plugin AY GBS GYM HES KSS NSF NSFE SAP SPC VGM VGZ how to compile VLC 1.1.0 Ubuntu'/><title type='text'>VLC media player can play video game music!</title><content type='html'>EDIT: As of version 1.1.5, VLC definitely supports video game music. GME support is now included by default in the Windows binaries.&lt;br /&gt;&lt;br /&gt;I was thinking about writing a video game music plugin for &lt;a href="http://videolan.org/VLC"&gt;VLC&lt;/a&gt; this Summer using the &lt;a href="http://code.google.com/p/game-music-emu/"&gt;Game_Music_Emu&lt;/a&gt; (a.k.a. libgme) library.  Libgme decodes pretty much all video game music formats (AY, GBS, GYM, HES, KSS, NSF/NSFE, SAP, SPC, and VGM/VGZ), so it's a perfect candidate.  I did a quick search and found this and only this: &lt;a href="http://www.videolan.org/developers/vlc/doc/doxygen/html/gme_8cpp.html"&gt;http://www.videolan.org/.../gme_8cpp.html&lt;/a&gt;.  There's also a corresponding --enable-gme switch in the configure script, but other than that there's no evidence that VLC plays video game music at all.  So it appears that someone else has already written such a plugin and that VLC can play video game music if compiled properly.&lt;br /&gt;&lt;br /&gt;I was able to compile the latest VLC source code (the new and improved 1.1.0), but could not get the gme plugin to work.  There's an additional configure switch --with-gme-tree= that expects a path to a compiled libgme.a (required).  The libgme from Ubuntu repositories (sudo apt-get install libgme-dev) provides the shared object libgme.so.  Compiling libgme from scratch also provides libgme.so.  VLC will not accept this so I'm at a standstill.&lt;br /&gt;&lt;br /&gt;If you are trying to compile VLC 1.1.0 on Ubuntu, I can at least tell you this much:&lt;br /&gt;&lt;br /&gt;1. Remove all traces of previous versions.  If you still have previous versions installed when you go to run the newly compiled VLC, you will get an error preventing it from running.&lt;br /&gt;&lt;br /&gt;sudo apt-get purge vlc&lt;br /&gt;sudo apt-get autoremove&lt;br /&gt;&lt;br /&gt;2. Install dependencies:&lt;br /&gt;&lt;br /&gt;sudo apt-get build-dep vlc&lt;br /&gt;sudo apt-get install libxcb* libx11-xcb lua5.1&lt;br /&gt;&lt;br /&gt;3. Download and compile.&lt;br /&gt;&lt;br /&gt;wget http://downloads.sourceforge.net/project/vlc/1.1.0/vlc-1.1.0.tar.bz2&lt;br /&gt;tar -xjf vlc-1.1.0.tar.bz2&lt;br /&gt;cd vlc-1.1.0&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;I was not able to get the Lua part to work so you can use the --disable-lua switch if needed.&lt;br /&gt;&lt;br /&gt;Forum post, for reference: &lt;a href="http://forum.videolan.org/viewtopic.php?f=2&amp;t=78168"&gt;http://forum.videolan.org/viewtopic.php?f=2&amp;t=78168&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please reply if you know how to compile VLC with gme support!!  I really hope I can get it working so I can stop using crappy Audacious once and for all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-4390345214680663910?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/4390345214680663910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/vlc-media-player-can-play-video-game.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/4390345214680663910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/4390345214680663910'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/06/vlc-media-player-can-play-video-game.html' title='VLC media player can play video game music!'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-1050030333520889708</id><published>2010-05-26T12:31:00.016-04:00</published><updated>2010-05-26T13:05:35.521-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft MS SharePoint 2010 MOSS 2007 WSS 1.0 2.0 3.0 hide erase delete get rid of unwanted extra ugly column header library list view web part'/><title type='text'>SharePoint: Hide unwanted column headers in List View</title><content type='html'>A lot of times when you add (Document, Announcements, etc.) library List Views to pages in SharePoint, they come with a bunch of unwanted column headers that waste space and look unsightly.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/S_1MRjMfKMI/AAAAAAAAADI/w8USe5FjexI/columns.png" alt="Document Library List View" /&gt;&lt;/div&gt;&lt;br /&gt;Googling the topic gives solutions that require modifying the main page (default.aspx), resulting in a page that deviates from the site definition, but this is not necessary.  You can hide these columns by creating a new view for that library.&lt;br /&gt;&lt;br /&gt;Steps:&lt;br /&gt;&lt;br /&gt;1. Go to the library in question.  In the top right corner, click "View" and select "Create View".&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/S_1MR_-K9aI/AAAAAAAAADM/vkqQYi_uyVY/createview.png" alt="Create a new view" /&gt;&lt;/div&gt;&lt;br /&gt;2. Give it a name and scroll down to the "Columns" section.  Uncheck any column headers you want hidden.  Modify any other options you want ("Order" maybe) and submit.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh4.ggpht.com/_4hpDfOHJJqE/S_1MRhBE4HI/AAAAAAAAADE/WSJSWZiyhA4/columnchoices.png" alt="Columns" /&gt;&lt;/div&gt;&lt;br /&gt;3. On the page in question, click "Site Actions" then "Edit Page", and then modify the shared web part in question.  The first thing you'll see ("List Views") is what you need to change.  Change the view to the one you just created and apply the changes.  You're done.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/S_1MRl6jljI/AAAAAAAAADA/acMm96KVWfQ/chooseview.png" alt="List Views" /&gt;&lt;/div&gt;&lt;br /&gt;It's kind of annoying because you have to do this for every library, but then again you would have to do the same if you choose to edit default.aspx instead.&lt;br /&gt;&lt;br /&gt;Hope this helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-1050030333520889708?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/1050030333520889708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/05/sharepoint-hide-unwanted-column-headers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1050030333520889708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1050030333520889708'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/05/sharepoint-hide-unwanted-column-headers.html' title='SharePoint: Hide unwanted column headers in List View'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_4hpDfOHJJqE/S_1MRjMfKMI/AAAAAAAAADI/w8USe5FjexI/s72-c/columns.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-8494779383763344433</id><published>2010-03-14T11:20:00.015-04:00</published><updated>2010-03-22T14:57:35.169-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft MS SharePoint 2010 Office SharePoint Server MOSS 2007 Windows SharePoint Services WSS 1.0 2.0 3.0 standard stock default included Web Parts webparts list descriptions summary ASP.NET'/><title type='text'>Microsoft SharePoint Standard Web Parts</title><content type='html'>It has been rather difficult to find a list (with descriptions) of the standard Web Parts included with Microsoft SharePoint. Anyway, I have compiled a list of useful links relevant to Web Parts in general and the standard Web Parts included with each of the different SharePoint versions:&lt;br /&gt;&lt;br /&gt;Introduction to Web Parts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms432401.aspx"&gt;Web Parts Overview&lt;/a&gt; - Start here&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hhy9ewf1.aspx"&gt;ASP.NET Web Parts Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd583154%28office.11%29.aspx"&gt;A Developer's Introduction to Web Parts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Windows SharePoint Services (WSS):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://office.microsoft.com/en-us/sharepointtechnology/CH011712151033.aspx"&gt;Types of Web Parts&lt;/a&gt; - Descriptions and sample uses of the standard Web Parts&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wssdemo.com/Pages/webparts.aspx"&gt;SharePoint Web Parts&lt;/a&gt; - Comparison of the standard Web Parts in WSS 3.0 and MOSS 2007&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.aspx"&gt;Microsoft.SharePoint.WebPartPages Namespace&lt;/a&gt; - MSDN&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Microsoft Office SharePoint Server (MOSS) 2007:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://office.microsoft.com/en-us/sharepointserver/HA103357331033.aspx"&gt;Overview of Web Parts available in SharePoint Server 2007&lt;/a&gt; - Extensive; probably the most helpful and relevant link on this page&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wssdemo.com/Pages/webparts.aspx"&gt;SharePoint Web Parts&lt;/a&gt; - Comparison of the standard Web Parts in WSS 3.0 and MOSS 2007&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.aspx"&gt;Microsoft.SharePoint.WebPartPages Namespace&lt;/a&gt; - MSDN&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Microsoft SharePoint 2010:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.wssdemo.com/Lists/WebParts/WebpartsByGroup.aspx"&gt;SharePoint 2010 Web Parts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages%28office.14%29.aspx"&gt;Microsoft.SharePoint.WebPartPages Namespace&lt;/a&gt; - MSDN&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-8494779383763344433?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/8494779383763344433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/03/microsoft-sharepoint-standard-web-parts.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/8494779383763344433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/8494779383763344433'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/03/microsoft-sharepoint-standard-web-parts.html' title='Microsoft SharePoint Standard Web Parts'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-7090604667298555515</id><published>2010-03-09T19:38:00.019-05:00</published><updated>2011-02-03T13:52:22.758-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rsn spc SNES Super Nintendo music container file plugin Audacious media player Linux Ubuntu'/><title type='text'>rsn.c: An .rsn plugin for Audacious media player</title><content type='html'>License: GNU GPLv3&lt;br /&gt;&lt;a href="http://stashbox.org/933771/rsn.tar.gz"&gt;Download rsn.tar.gz&lt;/a&gt;&lt;br /&gt;Updated 6/22/2010: minor improvements and a security fix.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Edit: See &lt;a href="http://kittylambda.com/rsn_plugin_for_audacious"&gt;this page&lt;/a&gt; on how to update my code to work with the latest version of Audacious. Thanks to PsySal (glad someone is using this code!)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This plugin for Audacious will unrar the .spc files from an .rsn file and then add them to the current playlist.  It requires the non-free (free as in free software, it is free of charge) version of unrar since .rsn files are RAR version 3.  The free version only supports up to version 2.  It can be installed by running the following in a terminal: 'sudo apt-get install unrar'.&lt;br /&gt;&lt;br /&gt;The source code is heavily commented for those looking for an example of Audacious's API (which is largely undocumented) or would just like to know how it works.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Installation (for an Ubuntu-based distribution):&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Install dependencies and download the latest source code for audacious-plugins (don't forget to compile and install the latest version of Audacious first, see my &lt;a href="http://thatcadguy.blogspot.com/2010/02/script-to-automatically-download-and.html"&gt;previous post&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;sudo apt-get build-dep audacious-plugins&lt;br /&gt;sudo apt-get install mercurial automake&lt;br /&gt;hg clone http://hg.atheme.org/audacious-plugins/ audacious-plugins-devel&lt;br /&gt;cd audacious-plugins-devel&lt;br /&gt;&lt;br /&gt;2. In 'configure.ac' and (if present) 'configure', add 'rsn' to the list of container plugins:&lt;br /&gt;CONTAINER_PLUGINS="m3u pls" ==&gt; CONTAINER_PLUGINS="m3u pls rsn"&lt;br /&gt;&lt;br /&gt;3. &lt;a href="http://stashbox.org/933771/rsn.tar.gz"&gt;Download rsn.tar.gz&lt;/a&gt;, extract into the src directory, configure, make, and install.&lt;br /&gt;&lt;br /&gt;wget http://stashbox.org/933771/rsn.tar.gz&lt;br /&gt;tar -xzf rsn.tar.gz&lt;br /&gt;mv rsn src&lt;br /&gt;./autogen.sh&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;4. Download some SNES tunes from &lt;a href="http://snesmusic.org/"&gt;SNESmusic.org&lt;/a&gt;!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-7090604667298555515?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/7090604667298555515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/03/rsnc-rsn-plugin-for-audacious-media.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7090604667298555515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7090604667298555515'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/03/rsnc-rsn-plugin-for-audacious-media.html' title='rsn.c: An .rsn plugin for Audacious media player'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-4726412589995188044</id><published>2010-02-25T10:42:00.030-05:00</published><updated>2010-06-27T10:04:31.656-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD remote transparent CAD Administration control without getting up effortless no hassle AutoLISP Visual Lisp set default profile tool palette support paths directories options preferences'/><title type='text'>Transparent CAD Administration</title><content type='html'>No CAD admin likes dealing with users (though they are inherently part of the job).  They mess with things they shouldn't and use unapproved software.  But I digress.&lt;br /&gt;&lt;br /&gt;Fortunately, in most offices, there is at least one common .lsp file that everyone has in their AutoCAD Startup Suite.  If they don't, you can use &lt;a href="http://thatcadguy.blogspot.com/2010/02/startuplsp-adding-to-autocads-startup.html"&gt;yesterday's post&lt;/a&gt; as a guideline on how to add a .lsp file to everyone's Startup Suite using a batch file or a Windows-aware programming language (i.e. VBScript or PowerShell).&lt;br /&gt;&lt;br /&gt;Once everyone has a common, network-based .lsp file in their Startup Suite, you can use this to your advantage and change its contents to do your bidding.  For starters, you can use the code from yesterday's post to add additional items to users' Startup Suites.&lt;br /&gt;&lt;br /&gt;Here are a few Lisp code snippets that will help you get started:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;; Items in brackets [] are meant to be replaced with your specific values.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; If using any vlax functions:&lt;br /&gt;(vl-load-com)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; A common task is to make sure a user has a certain directory in their support paths.&lt;br /&gt;; The following snippet adds a given support directory to AutoCAD's support paths.&lt;br /&gt;(setq suppdir "[YourSupportDir]")&lt;br /&gt;(if (not (vl-string-search suppdir (getenv "ACAD")))&lt;br /&gt;  (setenv "ACAD" (strcat (vl-string-right-trim ";" (getenv "ACAD")) ";" suppdir))&lt;br /&gt;)&lt;br /&gt;(setq suppdir nil)&lt;br /&gt;; If you want to explicitly set the support paths, just use (setenv "ACAD" "[SupportPathsHere]").&lt;br /&gt;; The paths must be separated by semicolons.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; If your company uses a standard profile, you can use this snippet to make sure everyone uses it.&lt;br /&gt;; Use yesterday's post to determine the current revision and version of AutoCAD and replace&lt;br /&gt;; the x's with the correct values.&lt;br /&gt;(vl-registry-write&lt;br /&gt;  "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD\\Rxx.x\\ACAD-xxxx:xxx\\Profiles"&lt;br /&gt;  nil&lt;br /&gt;  "[YourDefaultProfile]"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; Say you want to make sure your users all have a certain tool palette.&lt;br /&gt;(setq tooldir "[YourToolPaletteDirectory]"&lt;br /&gt;      toolpaths (vlax-get-property (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'Preferences) 'Files) 'ToolPalettePath)&lt;br /&gt;)&lt;br /&gt;(if (not (vl-string-search tooldir toolpaths))&lt;br /&gt;  (vlax-put-property&lt;br /&gt;    (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'Preferences) 'Files)&lt;br /&gt;    'ToolPalettePath&lt;br /&gt;    (strcat (vl-string-right-trim ";" toolpaths) ";" tooldir)&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;(setq tooldir nil toolpaths nil)&lt;br /&gt;&lt;br /&gt;; If you want to disallow your users from having their own tool palettes, use this:&lt;br /&gt;(vlax-put-property&lt;br /&gt;  (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'Preferences) 'Files)&lt;br /&gt;  'ToolPalettePath&lt;br /&gt;  [ToolPalettePaths]&lt;br /&gt;)&lt;br /&gt;; These paths should also be separated by semicolons.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;; Last but not least, if you want to do something for a specific user:&lt;br /&gt;(if (= "johndoe" (getvar "LOGINNAME"))&lt;br /&gt;  ; do stuff for John Doe&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;; You can modify the above snippet with an OR statement to do something for a group of users as well:&lt;br /&gt;(if (or&lt;br /&gt;      (= "johndoe" (getvar "LOGINNAME"))&lt;br /&gt;      (= "janedoe" (getvar "LOGINNAME"))&lt;br /&gt;    )&lt;br /&gt;  ; do stuff for the Does&lt;br /&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enjoy, and as always comments are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-4726412589995188044?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/4726412589995188044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/transparent-cad-administration.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/4726412589995188044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/4726412589995188044'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/transparent-cad-administration.html' title='Transparent CAD Administration'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-213746535833434502</id><published>2010-02-24T19:16:00.015-05:00</published><updated>2010-06-27T10:05:15.417-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autodesk AutoCAD add arx lsp dvb dbx vlx fas file Startup Suite programmatically registry keys values AutoLISP Visual Lisp'/><title type='text'>startup.lsp: Adding to AutoCAD's Startup Suite programmatically using Lisp</title><content type='html'>At one time or another, it becomes desirable to add a .lsp file or otherwise to AutoCAD's Startup Suite programmatically. The following Lisp function adds a given file to the current profile's Startup Suite. This is accomplished by manipulating registry values and can be done with VBScript, PowerShell, or just about any other Windows-aware programming language.&lt;br /&gt;&lt;br /&gt;In HKEY_CURRENT_USER\Software\Autodesk\AutoCAD, there is a value called "CurVer" which contains the main revision of AutoCAD in use. In that revision's key, there is another "CurVer" value which is the main version of AutoCAD in use. In that version's key, there is a "Profiles" key whose default value is the current profile. Inside that, inside \Dialogs\Appload\Startup\, there are several values. There are "nStartup" values for every startup entry, (i.e. "1Startup","2Startup","3Startup") and a "NumStartup" key containing the number of startup entries.&lt;br /&gt;&lt;br /&gt;In summary, the startup entries are contained in:&lt;br /&gt;HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\[Revision]\[Version]\Profiles\[CurrentProfile]\Dialogs\Appload\Startup\&lt;br /&gt;&lt;br /&gt;Edit: If working with a fresh installation, there may not be a Startup key. The code now accounts for this.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stashbox.org/805675/startup.lsp"&gt;Download startup.lsp&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;(defun addToStartupSuite (filename / regpath revision version default ct numstartup n)&lt;br /&gt;  (setq regpath "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD"&lt;br /&gt;        revision (vl-registry-read regpath "CurVer")&lt;br /&gt;        version (vl-registry-read (setq regpath (strcat regpath "\\" revision)) "CurVer")&lt;br /&gt;        default (vl-registry-read (setq regpath (strcat regpath "\\" version "\\Profiles")))&lt;br /&gt;        regpath (strcat regpath "\\" default "\\Dialogs\\Appload\\Startup")&lt;br /&gt;        ct 1&lt;br /&gt;  )&lt;br /&gt;  (if (setq numstartup (vl-registry-read regpath "NumStartup"))&lt;br /&gt;    (progn&lt;br /&gt;      (setq n (1+ (atoi numstartup)))&lt;br /&gt;      (while (and&lt;br /&gt;               (&lt; ct n)&lt;br /&gt;               (/= filename (vl-registry-read regpath (strcat (itoa ct) "Startup")))&lt;br /&gt;             )&lt;br /&gt;        (setq ct (1+ ct))&lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;    (setq n 1)&lt;br /&gt;  )&lt;br /&gt;  (if (= n ct)&lt;br /&gt;    (progn&lt;br /&gt;      (vl-registry-write regpath (strcat (itoa n) "Startup") filename)&lt;br /&gt;      (vl-registry-write regpath "NumStartup" (itoa n))&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;)&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Comments are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-213746535833434502?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/213746535833434502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/startuplsp-adding-to-autocads-startup.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/213746535833434502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/213746535833434502'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/startuplsp-adding-to-autocads-startup.html' title='startup.lsp: Adding to AutoCAD&apos;s Startup Suite programmatically using Lisp'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5490937113972416915</id><published>2010-02-20T11:01:00.006-05:00</published><updated>2010-06-27T10:05:54.582-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='solve solving colebrook white equation darcy friction factor formula Excel VBA function module code darcy-weisbach pressure drop fast accurate simple moody chart how-to'/><title type='text'>How to solve the Colebrook equation in Excel/VBA</title><content type='html'>I see that a lot of people have been searching for a quick and easy way to solve the Colebrook equation for the Darcy friction factor in Excel/VBA. Well, here you go. Thanks to &lt;i&gt;&lt;a href="http://math.unice.fr/~didierc/DidPublis/ICR_2009.pdf"&gt;Efficient Resolution of the Colebrook Equation&lt;/a&gt;&lt;/i&gt; by Didier Clamond, the Colebrook equation can be solved and the Darcy friction factor found with a very short and simple function.&lt;br /&gt;&lt;br /&gt;This two iteration solving method is &lt;b&gt;EXTREMELY accurate&lt;/b&gt;, "around machine precision" (Clamond).&lt;br /&gt;&lt;br /&gt;The following VBA code is derived from Clamond's MATLAB implementation supplied in his paper. It can be added to a new VBA Module in your Excel spreadsheet so that you can access it from cells (i.e. "=Colebrook(somecell, anothercell)").&lt;br /&gt;&lt;br /&gt;R is the &lt;a href="http://en.wikipedia.org/wiki/Reynolds_number"&gt;Reynolds number&lt;/a&gt; (Re, dimensionless), and K is relative roughness (K = e/Dh, dimensionless), which is equal to the absolute roughness divided by the hydraulic diameter. Watch your units!&lt;br /&gt;&lt;br /&gt;The returned result is of course the Darcy friction factor, which is meant to be used with the &lt;a href="http://en.wikipedia.org/wiki/Darcy%E2%80%93Weisbach_equation"&gt;Darcy-Weisbach equation&lt;/a&gt; to calculate pressure drop.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Function Colebrook(R As Double, K As Double) As Double&lt;br /&gt;    Dim X1 As Double, X2 As Double, F As Double, E As Double&lt;br /&gt;    X1 = K * R * 0.123968186335418&lt;br /&gt;    X2 = Log(R) - 0.779397488455682&lt;br /&gt;    F = X2 - 0.2&lt;br /&gt;    E = (Log(X1 + F) + F - X2) / (1 + X1 + F)&lt;br /&gt;    F = F - (1 + X1 + F + 0.5 * E) * E * (X1 + F) / (1 + X1 + F + E * (1 + E / 3))&lt;br /&gt;    E = (Log(X1 + F) + F - X2) / (1 + X1 + F)&lt;br /&gt;    F = F - (1 + X1 + F + 0.5 * E) * E * (X1 + F) / (1 + X1 + F + E * (1 + E / 3))&lt;br /&gt;    F = 1.15129254649702 / F&lt;br /&gt;    Colebrook = F * F&lt;br /&gt;End Function&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Enjoy, and thank you to Didier Clamond for coming up with this solving method!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5490937113972416915?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5490937113972416915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/how-to-solve-colebrook-equation-in.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5490937113972416915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5490937113972416915'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/how-to-solve-colebrook-equation-in.html' title='How to solve the Colebrook equation in Excel/VBA'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5728990055079328926</id><published>2010-02-05T11:30:00.019-05:00</published><updated>2010-02-26T16:28:29.984-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='download compile compiling make install installing audacious media player from source code ubuntu karmic lucid linux latest automatic bash script mercurial svn checkout'/><title type='text'>A script to download and compile Audacious</title><content type='html'>The following script will download, compile and install the latest version of Audacious media player from the most up-to-date source code available via Mercurial.  It will make a new directory called 'audacious' in the directory it is run in, so keep that in mind.  It will also download the most recent 'adplug.db' for the Adplug plugin.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stashbox.org/794301/audinstall.sh"&gt;Download audinstall.sh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Run the script by typing ./audinstall.sh in a terminal.  The newly created executable will be /usr/local/bin/audacious.  Shortcuts will be created in the Applications&gt;Other folder in Ubuntu.&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;#!/usr/bin/env bash&lt;br /&gt;&lt;br /&gt;sudo apt-get build-dep audacious audacious-plugins&lt;br /&gt;sudo apt-get install mercurial automake&lt;br /&gt;&lt;br /&gt;sudo rm -rf audacious&lt;br /&gt;mkdir audacious&lt;br /&gt;cd audacious&lt;br /&gt;&lt;br /&gt;hg clone http://hg.atheme.org/audacious/ audacious-devel&lt;br /&gt;hg clone http://hg.atheme.org/audacious-plugins/ audacious-plugins-devel&lt;br /&gt;&lt;br /&gt;for d in *&lt;br /&gt;do&lt;br /&gt;cd "$d"&lt;br /&gt;./autogen.sh&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ..&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;wget http://downloads.sourceforge.net/project/adplug/Database/2006-07-06/adplugdb-2006-07-07.tar.gz&lt;br /&gt;tar -xzf adplugdb*&lt;br /&gt;sudo rm -rf ~/.adplug&lt;br /&gt;mkdir ~/.adplug&lt;br /&gt;cp 20*/adplug.db ~/.adplug/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5728990055079328926?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5728990055079328926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/script-to-automatically-download-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5728990055079328926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5728990055079328926'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2010/02/script-to-automatically-download-and.html' title='A script to download and compile Audacious'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-2346728372835621566</id><published>2009-12-29T13:07:00.010-05:00</published><updated>2010-06-27T10:09:01.109-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pwtracker .au .snd UNIX audio music file synthesis synthesizer program code C C99 endianness notes piano keys frequencies sample sampling function free API tracking'/><title type='text'>pwtracker: An .au file creator written in C99</title><content type='html'>&lt;a href="http://stashbox.org/753109/pwtracker.zip"&gt;Download pwtracker.zip&lt;/a&gt;&lt;br /&gt;License: Public Domain&lt;br /&gt;&lt;br /&gt;As an exercise to sharpen my C skills (and out of admiration for older video game music), I've been writing a C program to make some audio files from scratch.  It's not very advanced, but it allows you to define a sampling function which in turn it uses to create an .au file.&lt;br /&gt;&lt;br /&gt;What you need to know:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are two versions of the program.  The first version (pwt1) gives you access to the massive array of audio data in case you wanted to mess with it, otherwise you should use the second version (pwt2), which uses a buffer to keep the memory usage close to nothing.  The makefile provided is set to create both versions.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The "sample" function in sample.c is the sampling function I spoke of.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;waves.c/waves.h provide some waveforms for you to play around with.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;notes.c/notes.h provide two functions: noteKey(), which converts a string like "A#4" to the corresponding piano key number, and keyFreq(), which converts that number into the corresponding frequency.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;All options are within #defines in the main1.c, main2.c and sample.c files.  There aren't any command-line switches, you just edit the code, compile and run it to make the audio file.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The code was written with portability in mind and should compile almost anywhere, so long as you compile as C99.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-2346728372835621566?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/2346728372835621566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/12/pwtracker-au-file-creator-written-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2346728372835621566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2346728372835621566'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/12/pwtracker-au-file-creator-written-in.html' title='pwtracker: An .au file creator written in C99'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-3625675681726235430</id><published>2009-12-29T08:26:00.011-05:00</published><updated>2010-02-26T16:29:11.234-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenArena linux Ubuntu karmic lucid 3D fullscreen FPS game mouse touchpad problem can&apos;t use keyboard at same time key polling odd unpredictable behavior'/><title type='text'>Touchpads and Games that require use of a mouse, like OpenArena</title><content type='html'>Last night I installed the &lt;a href="http://openarena.ws/"&gt;openarena&lt;/a&gt; package on Ubuntu and at first, the gameplay totally sucked because it seemed like I couldn't use the mouse and the keyboard at the same time.  Then it occurred to me that it was probably because I was using a touchpad...the game couldn't be this popular if the mouse sucked.&lt;br /&gt;&lt;br /&gt;Anyway, if you're experiencing any sort of keyboard/touchpad problems while playing a game on Ubuntu, go to Preferences&gt;Mouse and then to the Touchpad tab.  Uncheck "Disable touchpad while typing".  This same problem probably affects all OSes, but that's how you'd fix it on Ubuntu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-3625675681726235430?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/3625675681726235430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/12/touchpads-and-games-that-require-use-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/3625675681726235430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/3625675681726235430'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/12/touchpads-and-games-that-require-use-of.html' title='Touchpads and Games that require use of a mouse, like OpenArena'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-7160665789539135361</id><published>2009-11-24T09:30:00.007-05:00</published><updated>2010-02-25T16:31:19.936-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Steel Shapes download Luke Livermore Design Point 4.3 lisp lsp program structural CAD AutoCAD AISC software'/><title type='text'>Steel Shapes by Luke Livermore/Design Point</title><content type='html'>It took me a while to find this and it's not easily found off Google, so I thought I'd make a quick post that so others can search, find this page and be redirected to where they need to go.&lt;br /&gt;&lt;br /&gt;Steel Shapes 4.3 is a very elegant Lisp routine to draw all kinds of structural steel shapes.  If you've gotten to this page, you probably already know something about it.  It was written by Luke Livermore at &lt;a href="http://designpt.com"&gt;Design Point&lt;/a&gt;.  This Lisp routine is his/Design Point's property and it is shareware, not freeware.  I am simply linking to another site that is hosting it.  &lt;a href="http://www.cadcorner.ca/"&gt;CAD Corner Canada&lt;/a&gt; has version 4.3 hosted on their website.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cadcorner.ca/Lisp_Routines/Steel.rar"&gt;Download Steel Shapes 4.3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-7160665789539135361?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/7160665789539135361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/steel-shapes-by-luke-livermoredesign.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7160665789539135361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7160665789539135361'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/steel-shapes-by-luke-livermoredesign.html' title='Steel Shapes by Luke Livermore/Design Point'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-6290267949872555677</id><published>2009-11-03T20:51:00.008-05:00</published><updated>2010-02-26T16:29:40.724-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Audacious media player Ubuntu karmic lucid Linux xm module skips too fast bad poor sound audio quality choppy problems Modplug UADE XMP DUMB plugins'/><title type='text'>Playing modules with Audacious</title><content type='html'>As told in previous posts, I recently installed Ubuntu 9.10.  Was really excited about using &lt;a href="http://audacious-media-player.org/"&gt;Audacious media player&lt;/a&gt; since it's almost identical to Winamp and has plugins to play just about &lt;u&gt;everything&lt;/u&gt; without installing any additional plugins.&lt;br /&gt;&lt;br /&gt;I've used Audacious before but hadn't tried to play anything besides mp3s and ogg files.  I finally went to try an .xm module today and the thing laid an egg.  It skips all over the damn place and sounds horrible.  Wasn't too hard to fix though, you can use &lt;a href="http://xmp.sourceforge.net/"&gt;XMP&lt;/a&gt; and &lt;a href="http://zakalwe.fi/uade/"&gt;UADE&lt;/a&gt; as plugins to Audacious, and the XMP plugin just happened to be in synaptic.  A quick 'sudo apt-get install xmp-audacious xmp-common' and disabling the default Modplug plugin solved the problem.  &lt;a href="http://dumb.sourceforge.net/"&gt;DUMB&lt;/a&gt;, a module player library/plugin focusing on super-accurate playback, also works very nicely.  Its corresponding package is 'audacious-dumb'.&lt;br /&gt;&lt;br /&gt;P.S. Adlib music sounds absolutely wonderful on Audacious.  There are Adplug plugins for both Winamp and Audacious, but the one for Winamp is very outdated...the one for Audacious is just so crisp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-6290267949872555677?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/6290267949872555677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/playing-modules-with-audacious.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6290267949872555677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6290267949872555677'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/playing-modules-with-audacious.html' title='Playing modules with Audacious'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-705939647132671645</id><published>2009-11-01T19:05:00.016-05:00</published><updated>2010-02-26T16:29:56.248-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DOS SNES DOSBox ZSNES Linux Ubuntu karmic lucid Debian emulators emulation bad poor slow performance video sound audio quality problems choppy libSDL ALSA PulseAudio backend OpenGL'/><title type='text'>Running emulators on Ubuntu/Linux (UPDATED)</title><content type='html'>I've been playing around with Linux for quite some time now and have had it as my main operating system a few short times.  I decided to switch back to it after the release of 9.10 Karmic Koala, as many improvements have been made since 8.04.  It's a lot more stable, I'm happy that wireless is supported out of the box for my netbook, yada yada yada.  Anyway, I went to use ZSNES and DOSBox and the audio was working, but extremely poor quality and choppy.  Video performance isn't too good, either.  Here are some tips:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;ZSNES:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Problem: Audio totally sucks.  If you run it from the terminal it shows almost constant buffer underruns, at least on my laptop.&lt;br /&gt;&lt;br /&gt;&lt;del&gt;Fix: Not much to do except to lower the sampling rate.  Go into Config&gt;Sound and lower the sampling rate down from the default 32000 Hz.  22050 Hz solved the problem for me.&lt;/del&gt;&lt;br /&gt;&lt;br /&gt;NEW Fix:  Thanks to LuisMW from EeeUser Forums (original post: &lt;a href="http://forum.eeeuser.com/viewtopic.php?id=78631"&gt;http://forum.eeeuser.com/viewtopic.php?id=78631&lt;/a&gt;).  Replace the default libsdl-alsa (libsdl1.2debian-alsa on Ubuntu) audio backend package with libsdl-pulseaudio (libsdl1.2debian-pulseaudio on Ubuntu).  It fixes almost all sound problems with every program that uses libSDL.  To make ZSNES use PulseAudio: type in 'zsnes -ad pulse' in a terminal window.  Alternatively, you can install the 'libsdl1.2debian-all' package to have all options and backends available.&lt;br /&gt;&lt;br /&gt;Problem: Poor video performance.  You can clearly see how poor the performance is with its built in little screensaver shown before you load any ROMs.&lt;br /&gt;&lt;br /&gt;Fix: Go into Config&gt;Video and change to one of the OpenGL modes.  This sped up that screensaver by about 200% for me.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;DOSBox:&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Problem: Sound is extremely choppy.&lt;br /&gt;&lt;br /&gt;Fix: Open up a terminal window and make use of DOSBox's command-line switch -editconf followed by a text editor, i.e. "dosbox -editconf gedit".  This opens up the config file using the specified program.  Go down to prebuffer under the [mixer] section and increase the value past the default value of 10.  30 worked for me, although it adds a bit of lag to your sound.  Increasing the buffer size didn't help me.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;I'll be adding to this page as I find more problems and fixes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-705939647132671645?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/705939647132671645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/running-emulators-on-ubuntulinux.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/705939647132671645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/705939647132671645'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/11/running-emulators-on-ubuntulinux.html' title='Running emulators on Ubuntu/Linux (UPDATED)'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-6369955383071881474</id><published>2009-10-22T17:00:00.063-04:00</published><updated>2010-02-25T16:20:38.635-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='old retro games better DOS emulators MSDOS MS-DOS 7.1 FreeDOS DOSBox Tyrian CyberDogs C-Dogs Ronny Wester Doom Duke Nukem 3D MegaRace fast fun nostalgia'/><title type='text'>DOS Games: A time not forgotten</title><content type='html'>To most people, the word "DOS" means nothing (or two, if they're Hispanic)...but to those of us who were using IBM/PC compatible computers (that phrase takes me back) around 20 years ago, it means awesome computer games that are on an entirely different level than the video games of today.  Before I go too far, let me clarify: DOS refers to a kind of text-based operating system.  It stands for &lt;u&gt;D&lt;/u&gt;isk &lt;u&gt;O&lt;/u&gt;perating &lt;u&gt;S&lt;/u&gt;ystem.  There were many different variations of DOS made by many different companies, most notably MS-DOS by Microsoft.  The DOS era was a great time in history...I'm talking about a time when 640x480 resolution graphics were considered top of the line...a time when game music was hardware synthesized (AdLib, SoundBlaster, Gravis Ultrasound!)...a time when mouse functionality was an 'extra' feature.&lt;br /&gt;&lt;br /&gt;To a person unfamiliar with this world, this may sound dull and irrefutably boring.  I implore every one of you to bear with me, for the world of DOS is like no other; there's a reason why Jim Hall wanted to make a free replacement for MS-DOS when Microsoft announced its planned demise, there's a reason why so much work has gone into DOS emulators like Dosemu and DosBOX (years after its demise) and more importantly, a reason why there's a myriad of 'classic' game download sites.&lt;br /&gt;&lt;br /&gt;I don't think we can begin to examine any DOS games before we take a look at the game that (in my opinion) made DOS games so popular: id Software's DOOM.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh4.ggpht.com/_4hpDfOHJJqE/SuNjCmDCo7I/AAAAAAAAABk/Lj0cmOupF_A/doom1.png" /&gt; &lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/SuNjC2F84ZI/AAAAAAAAABo/7xVKK8GG8i0/doom2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;DOOM is basically the first-person shooter (FPS) that started it all.  Wolfenstein 3D was really the one that started it all, but DOOM's improvements over Wolfenstein 3D made it extremely popular.  DOOM brought things like lighting differences, non-perpendicular walls and room height differences.  That doesn't sound like much, but it's really the difference between a forest and an office of cubicles.  It also brought weapon swaying while moving, adding to the "realism" of the game.  The differences in technology are outlined &lt;a href="http://en.wikipedia.org/wiki/Doom_%28video_game%29#Engine_technology"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;DOOM had it all.  It had so many different levels and episodes, the ability to load custom graphics and levels, lots of different weapons.  You could spend days playing this game.  For 1993, it was BAD ASS.  It definitely raised the bar for computer games forever.&lt;br /&gt;&lt;br /&gt;Three years later, Duke Nukem 3D came out.  In essence, it was almost just like DOOM, but introduced some very appealing and popular features: more manly and sexual game content (strippers, Duke's famous phrases he says throughout the game, steroids) and more usable items like a jet pack and cooler weapons, like the "freezethrower."  It was basically DOOM, except with aliens, more items and more attitude.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh5.ggpht.com/_4hpDfOHJJqE/SuNjC9BSoTI/AAAAAAAAABs/2pdl9BDUF14/duke3d1.png" /&gt; &lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/SuNjM2RwMKI/AAAAAAAAAB0/PK2cKLHhyUI/duke3d2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In DOOM, the player's character never says a word; it is an emotionless being.  However, Duke is a sort of bad boy role-model, overly macho and unafraid of anything.  And of course, he dons a cool pair of sunglasses.  It also left a lasting impact on games as we know it.&lt;br /&gt;&lt;br /&gt;Next we have a few games that never gained mainstream popularity, but are more than worth mentioning for their content and gameplay.  I'd spend countless Summer nights playing these games...they defined a time in my life as well as the DOS gaming genre.&lt;br /&gt;&lt;br /&gt;Tyrian was &lt;i&gt;the&lt;/i&gt; arcade style scrolling shooter to have on your PC.  Its &lt;a href="http://members.iinet.net.au/%7Evannevar/tyrian/music.html"&gt;Adlib music&lt;/a&gt;, rich and colorful graphics, and gameplay that changes every time makes it one of my personal favorites that I still play to this day.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/SuNjNKhjy_I/AAAAAAAAACA/QJj_05olS60/tyrian1.png" /&gt; &lt;img src="http://lh5.ggpht.com/_4hpDfOHJJqE/SuNjNHF5viI/AAAAAAAAACE/lIexrrfVfog/tyrian2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;One of the really cool things about this game is the ability to buy/upgrade just about everything on your ship, heck, you can even buy different ships.  You got to pick from a handful of weapons, shields, generators and accessories, some of which wouldn't show up unless you took the right path in the game.  That's the other cool thing, the ability to choose which planet to go to next.  Most of the time, you have no choice, but sometimes you'd be able to pick which asteroid or planet to go to next.  Not to mention there are secret levels all over the place.  Some secret levels even have secret levels.&lt;br /&gt;&lt;br /&gt;MegaRace isn't much of a game, but the &lt;a href="http://www.freewebs.com/raceprg/music.html"&gt;music by Stéphane Picq&lt;/a&gt; is unforgettable and for the time, the graphics were awesome.  If the cars had more features and there were more levels, it would've been a lot more popular.  That and all of the video sequences featuring Lance Boyle are really annoying.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh4.ggpht.com/_4hpDfOHJJqE/SuNjMznp7aI/AAAAAAAAAB4/kQx3tQcKjts/megarace1.png" /&gt; &lt;img src="http://lh5.ggpht.com/_4hpDfOHJJqE/SuNjNA2NorI/AAAAAAAAAB8/iTfsoQ4hpHs/megarace2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As I said though, there's not much to the game...you chase other cars and destroy them by either firing at them or ramming them until they explode.  That aside though, let's just say that the music really brought your sound card to life.  The music featured in this game is like no other.&lt;br /&gt;&lt;br /&gt;Last but not least comes Cyberdogs and its sequel, C-Dogs.  Both were written by Ronny Wester.  I don't know much about the guy, but he wrote these two really cool games and released them as freeware, which is awesome.  This was rare because most games of the time you either had to play as shareware&lt;br /&gt;(more commonly known as a demo), meaning you could only play a level or two before having to buy the game, or you just had to straight up buy the game.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://lh3.ggpht.com/_4hpDfOHJJqE/SuNjCtPZ1kI/AAAAAAAAABc/NKbbQlLFMP0/cdogs1.png" /&gt; &lt;img src="http://lh6.ggpht.com/_4hpDfOHJJqE/SuNjCjxgeAI/AAAAAAAAABg/4fWrbxNj7Lc/cdogs2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Cyberdogs isn't as good as the sequel, but it was different and cooler in the sense that you got points for killing things, collecting items and blowing up things in order to buy new weapons and armor.  My favorite is the PowerGun, it shoots relatively fast and only took one shot to kill/blow up most things.  Gameplay was intense in the later levels though, the more advanced enemies moved so fast you literally had about half a second to react or they'd just kill you.  C-Dogs featured a level editor and some more advanced weapons, like grenades, molotovs, etc.  It also introduced a multiplayer game mode.  The biggest improvement is the player's ability to do a dash, which was really useful for dodging and fighting mobs.  This game is very fast-paced on some of the more harder levels and would be INSANE if you could play it online, which brings me to the next paragraph.&lt;br /&gt;&lt;br /&gt;Ronny Wester released the source code for these games in 2002 and two developers rewrote C-Dogs for Windows/Mac/Linux and called it C-Dogs SDL.  I wish I could say something nice about this remake, but I can't.  When I run C-Dogs SDL, I only get 22 fps (frames per second) tops, which makes for really slow and choppy gameplay.  Running the original DOS version, I get close to 70 fps.  They have plans of making it playable online, but it'd be useless unless they can make some optimizations to make it a lot faster.  The remake needs a lot of work, but you can check it out &lt;a href="http://freshmeat.net/projects/cdogs-sdl"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You just have to admire the work that went into making these old games.  Nowadays, basically the only obstacles to making a game are using a 3D modeling program like gmax or Blender to make some unique characters and getting some decent music for your game.  There are tons of game engines out there to choose from, like the Unreal engine and the Quake engine.  There's some tweaking and customizing involved, but it's nothing like what it took for these old games.  First of all, they started from scratch.  Most of the graphics you see here (excluding the prerendered graphics from MegaRace) were hand-tweaked by the pixel to get the best looking graphics.  They didn't have all these special programs to make nice looking textures or models/sprites.  Space limitations meant that they had to have the music hardware synthesized instead of using actual recorded music, like in newer games.  That meant that they had to compose the music using a tracker on a computer, sometimes having to find the right combination of waveforms to produce the certain sound desired.  Most importantly, these games had to be optimized to hell in order to make up for no dedicated graphics, extremely slow processors and very little RAM to work with.  A lot of old games were already written in lower level languages, but past that needed core parts of the game to be written in assembly language, which is the closest you can get to writing actual machine code.  This allowed games to run smooth as glass on 33 MHz processors.&lt;br /&gt;&lt;br /&gt;So how can you play these games?  The easiest way would be to get a DOS emulator, probably the best of which is &lt;a href="http://www.dosbox.com/"&gt;DOSBox&lt;/a&gt;.  It allows you to play pretty much any DOS game at nearly the same speed as with the real thing.  If you can get your hands on an old old computer (one with a 90 or 133 MHz Pentium processor would be perfect) that has a real sound card in it, you can download and install the &lt;a href="http://ms-dos7.hit.bg/"&gt;latest version of MS-DOS&lt;/a&gt;.  Or, you can try &lt;a href="http://www.freedos.org/"&gt;FreeDOS&lt;/a&gt;, a free MS-DOS replacement that comes with a lot of free tools, including a web browser (Arachne) and the infamous 4DOS.  I recommend using DOSBox though, that way you can play old DOS games on just about any computer.  It's a lot easier.&lt;br /&gt;&lt;br /&gt;Once you've got access to DOS, you can check out some of the many classic game download sites, like &lt;a href="http://www.bestoldgames.net/eng/"&gt;Best Old Games&lt;/a&gt; and &lt;a href="http://classicdosgames.com/"&gt;Classic DOS Games&lt;/a&gt;.  If you're a big torrent downloader, you can find huge DOS game collections on any torrent site.  This is &lt;u&gt;not&lt;/u&gt; illegal, as all of these games are either in their redistributable shareware form, or have since been released as freeware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-6369955383071881474?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/6369955383071881474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/dos-time-not-forgotten.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6369955383071881474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6369955383071881474'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/dos-time-not-forgotten.html' title='DOS Games: A time not forgotten'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_4hpDfOHJJqE/SuNjCmDCo7I/AAAAAAAAABk/Lj0cmOupF_A/s72-c/doom1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-9134659874793185840</id><published>2009-10-22T16:21:00.013-04:00</published><updated>2010-06-27T10:10:10.380-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD Excel data links integrate connect tables paste special insert OLE spanner entities XL2CAD sucks'/><title type='text'>How to make data links not suck</title><content type='html'>In AutoCAD 2007 or 2008, tables and data links were introduced.  Tables are tables...basically spreadsheets in AutoCAD.  Data links are links between tables and Excel spreadsheets, much like an external reference.  They were a good idea in theory, but actually using them sucks.  Both tables and data links are extremely slow, but if you get them to work right, you can use an Excel spreadsheet just like an external reference.&lt;br /&gt;&lt;br /&gt;Pretty much everyone I've worked with thinks that data links are crap, and because of that, I've been using Spanner almost non-stop.  They are crap.  Tables and data links lack some major functionality and much needed customization.&lt;br /&gt;&lt;br /&gt;Anyway, you may be used to running the TABLE command, creating a new data link and telling the new table to use that data link.  This is the crappy way of using data links.  Most of the time, this results in discarded formatting and very poor results that scare people away from data links entirely.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;To get the most out of data links:&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open up the spreadsheet you want to use in Excel.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select and copy the range of cells you want to use.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Go into AutoCAD and go to the Edit dropdown and select "Paste Special" or run the PASTESPEC command.  The Paste Special dialog will appear.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Select the "Paste link" radio button and select AutoCAD entities from the list.  Hit OK.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;This creates a new data link automatically and brings in the initial Excel formatting.&lt;/b&gt;  If you want a table to keep Excel's formatting, you need to run the DATALINK command and change that option in that data link's properties.&lt;br /&gt;&lt;br /&gt;Here are some extra tips:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unlike Spanner, AutoCAD is going to draw a border for the edges of cells whether there's a border in the Excel sheet or not.  If you don't want a border to show up, either merge some cells in Excel or right-click the cell in AutoCAD and click "Borders".&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AutoCAD seems to add some additional cell padding in all directions, creating loose tables.  There's not really a way around this; stick to Spanner or OLEs in cramped drawings.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-9134659874793185840?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/9134659874793185840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/how-to-make-data-links-not-suck.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/9134659874793185840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/9134659874793185840'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/how-to-make-data-links-not-suck.html' title='How to make data links not suck'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5357039548013856454</id><published>2009-10-16T20:54:00.015-04:00</published><updated>2010-06-27T10:11:26.193-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MATLAB vs. GNU Octave replacement equivalent clone better GUI front end front-end Xoctave QtOctave comparison free software GPL&apos;ed Scilab'/><title type='text'>Why use MATLAB?  Don't be a fool.</title><content type='html'>I'll get right to the point, it's beyond me as to why anyone (businesses, educational institutions, individuals) would want to use MATLAB &lt;u&gt;except&lt;/u&gt; for very specialized purposes.  &lt;a href="http://www.gnu.org/software/octave/"&gt;GNU Octave&lt;/a&gt; has almost identical syntax and is FREE.  Let's compare them:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MATLAB vs. GNU Octave:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;MATLAB:&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Costs $1950 for an &lt;u&gt;individual&lt;/u&gt; license, with an additional $1000 or more for every toolbox you'll need.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Takes too friggin' long to load on Windows.  It takes at least 30 seconds for it to load at OSU.  What a slow piece of shit.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;u&gt;GNU Octave:&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Is 100% free and open source.  Since it's a part of &lt;a href="http://www.gnu.org/"&gt;The GNU Project&lt;/a&gt;, it will always be free!  (Open source meaning that a copy of the source code comes with the program)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Has nearly identical syntax to that of MATLAB.  The semantic differences are outlined &lt;a href="http://en.wikibooks.org/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Has a myriad of add-on packages at &lt;a href="http://octave.sourceforge.net/"&gt;Octave-Forge&lt;/a&gt; to replace all those expensive toolboxes.  Not to mention, you can write your own add-ons in C, C++, FORTRAN or the default scripting language itself.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Allows you to use all the existing literature and support for MATLAB, but in addition, if a bug is found in the program, you can report it to the developers and get it fixed rather quickly.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Has been in active development since 1988, so it is quite stable and mature.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Loads in a few seconds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Has a handful of ways you can access the application.  As mentioned in a previous post, &lt;a href="http://xoctave.webs.com/"&gt;Xoctave&lt;/a&gt; is a front-end for Octave that is almost identical to MATLAB's GUI.  &lt;a href="http://qtoctave.wordpress.com/"&gt;QtOctave&lt;/a&gt; is a little different, but has some nice tools included and has a portable version that you can put on a thumb drive.  Otherwise, the default way to access it is by a DOS-like command-line interface.  I prefer this method for straight up calculations, but prefer Xoctave for homework.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Does not support object-oriented programming (yet).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Is it really worth the several thousand dollars to get a few more fancy features that you probably don't need?  If nothing else, use Octave, and if it doesn't meet your needs, you can think about getting MATLAB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5357039548013856454?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5357039548013856454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/why-use-matlab-dont-be-fool.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5357039548013856454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5357039548013856454'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/why-use-matlab-dont-be-fool.html' title='Why use MATLAB?  Don&apos;t be a fool.'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-1141394819206541037</id><published>2009-10-16T19:25:00.006-04:00</published><updated>2010-02-25T16:17:11.501-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD spell check checker AutoLISP Visual Lisp remove MTEXT format formatting DXF codes better than stripmtext SCOWL'/><title type='text'>spell.lsp: An AutoLISP accessible spell checker and MTEXT formatting removal tool</title><content type='html'>&lt;a href="http://stashbox.org/663696/spell.lsp"&gt;Download spell.lsp&lt;/a&gt;&lt;br /&gt;License: Public Domain, zlib if you want.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://downloads.sourceforge.net/wordlist/scowl-6.zip"&gt;SCOWL (Spell Checker Oriented Word Lists)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There have been some requests on the discussion groups for a LISP accessible spell checker (not really, a few posts from years back, I just wanted to see how slow it would be).  I figured that it'd be a pretty easy task, considering there are probably some free dictionary files out there, and there are (SCOWL from &lt;a href="http://wordlist.sourceforge.net/"&gt;Kevin's Word List Page&lt;/a&gt;).  It was an interesting day project, but making a function to remove mtext formatting proved to be a little more challenging than I initially thought.  I know, there's already the UnFormat function in StripMtext written by John Uhden and Steve Doman, but it's somewhat unreliable.  At the very least, it doesn't remove \\p*; alignment codes.  I made my own function that uses foreachs and vl-string-searches instead of wcmatch.  I'm not 100% sure on which is more efficient, but I'm pretty sure wcmatch is pretty costly with how broad it can be.  My function hinges on the fact that there are three kinds of codes, codes to be totally removed, codes that contain text to remain, and codes that need to be replaced with something else, like a newline character.&lt;br /&gt;&lt;br /&gt;Anyway, here's a quick guide on the functions included:&lt;br /&gt;&lt;br /&gt;;; str2lst converts a string into a list&lt;br /&gt;(str2lst "a,b,cd,e,fgh" ",")&lt;br /&gt;;; returns '("a" "b" "cd" "e" "fgh")&lt;br /&gt;&lt;br /&gt;;; lst2str converts a list into a string&lt;br /&gt;(lst2str '("hello" "there" "mister.") " ")&lt;br /&gt;;; returns "hello there mister."&lt;br /&gt;&lt;br /&gt;;; loadWords takes a list of dictionary files and loads all the words into a list&lt;br /&gt;(loadWords '("somedictionary.txt" "anotherdictionary.txt"))&lt;br /&gt;;; returns a list of words&lt;br /&gt;;; files should be one word per line, lower-case&lt;br /&gt;&lt;br /&gt;;; checkWord takes a word and a dictionary and checks if the word is in the dictionary&lt;br /&gt;;; basically a wrapper for vl-position, returns nil if the word is spelled right&lt;br /&gt;(checkWord "ahasdh" myDictionary)&lt;br /&gt;;; returns T since "ahasdh" is not a word&lt;br /&gt;&lt;br /&gt;;; checkText takes text, separates into words, checks them and returns a list of misspelled words&lt;br /&gt;(checkText "This is a test sentence." myDictionary)&lt;br /&gt;;; returns nil, as all of those words are spelled right&lt;br /&gt;&lt;br /&gt;;; remMtextFmt removes mtext formatting&lt;br /&gt;(remMtextFmt "\\P\\Lhello\\l {\\fVerdana;\\W1.7x;there}")&lt;br /&gt;;; returns "\nhello there"&lt;br /&gt;&lt;br /&gt;The command "CT" (c:ct) is an implementation of the functions I've created.  It allows you to select multiple text and mtext entities and returns the misspelled words.&lt;br /&gt;&lt;br /&gt;Anyway, feel free to use this code to add some spell checking functionality to your applications, or just to have a better mtext stripper.  The nice thing about this is that you can make a custom dictionary easily to include the common words in your drawings that aren't in SCOWL.  Speaking of SCOWL, I used the first four files, as shown in the .lsp file.  The more higher number file you use, the more words you're including.  They're sorted by how often the words are used.  First four does pretty well, might be able to get away with just the first two.  Using four creates a 54,000 item list.  You'd think that would present a problem, but checking three paragraphs of mtext only takes a fraction of a second.&lt;br /&gt;&lt;br /&gt;You could use ssget to grab all the text in the drawing:&lt;br /&gt;&lt;br /&gt;(ssget "_X" '((0 . "TEXT,MTEXT")))&lt;br /&gt;&lt;br /&gt;Anyway, happy lisping, and comments are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-1141394819206541037?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/1141394819206541037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/spelllsp-autolisp-accessible-spell.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1141394819206541037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1141394819206541037'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/spelllsp-autolisp-accessible-spell.html' title='spell.lsp: An AutoLISP accessible spell checker and MTEXT formatting removal tool'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-2186150271621384000</id><published>2009-10-15T15:53:00.004-04:00</published><updated>2010-03-01T15:02:30.270-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='access integrate connect control utilize use link call Excel xls with AutoCAD AutoLISP Visual LISP COM ActiveX object model vla vlax spreadsheet file worksheet invoke object'/><title type='text'>Accessing Microsoft Excel with Visual LISP</title><content type='html'>One of the most useful things about Visual LISP is that it lets you access applications that utilize the Component Object Model, or COM.  This includes AutoCAD itself, Microsoft Office applications, and some others.  Accessing Excel isn't that much of a pain, but currently there aren't any really good examples out there for those who haven't done it before, unless you want to dig through posts in the discussion groups.&lt;br /&gt;&lt;br /&gt;In this post, I'll briefly show how to add and read values from Excel spreadsheets using Visual LISP.&lt;br /&gt;&lt;br /&gt;Before using any vla or vlax functions (which is what we're going to use), you must call (vl-load-com) to load the COM extension.  Before we actually look at the actual code, know that COM is object-based.  Let's review some of the functions you'll use:&lt;br /&gt;&lt;br /&gt;;; creates a new object to use, in our case, "Excel.Application"&lt;br /&gt;(vlax-create-object "&lt;i&gt;object type&lt;/i&gt;")&lt;br /&gt;&lt;br /&gt;;; retrieves a property of an object&lt;br /&gt;(vlax-get-property &lt;i&gt;object&lt;/i&gt; '&lt;i&gt;property&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;;; sets a property to an object&lt;br /&gt;(vlax-put-property &lt;i&gt;object&lt;/i&gt; '&lt;i&gt;property&lt;/i&gt; &lt;i&gt;necessary parameters&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;;; performs a specified action&lt;br /&gt;(vlax-invoke-method &lt;i&gt;object&lt;/i&gt; '&lt;i&gt;method&lt;/i&gt; &lt;i&gt;parameters, if needed&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;;; returns the actual value of a variant&lt;br /&gt;;; a variant can be almost anything, thus the name variant&lt;br /&gt;(vlax-variant-value &lt;i&gt;variant&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;;; destroys the specified object&lt;br /&gt;(vlax-release-object &lt;i&gt;object&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;Right, so let's get right into it.  You'll need an Excel spreadsheet to play around with.  You can create a new one, but it's almost always easier to make a template for yourself and save it under another name when done.&lt;br /&gt;&lt;br /&gt;;; load COM&lt;br /&gt;(vl-load-com)&lt;br /&gt;&lt;br /&gt;;; open Excel&lt;br /&gt;(setq excel (vlax-create-object "Excel.Application")&lt;br /&gt;&lt;br /&gt;      ;; get Excel's workbooks&lt;br /&gt;      workbooks (vlax-get-property excel 'Workbooks)&lt;br /&gt;&lt;br /&gt;      ;; open an existing spreadsheet&lt;br /&gt;      currworkbook (vlax-invoke-method workbooks 'Open "C:\\test.xls")&lt;br /&gt;&lt;br /&gt;      ;; get the active sheet in that spreadsheet&lt;br /&gt;      activesheet (vlax-get-property excel 'ActiveSheet)&lt;br /&gt;&lt;br /&gt;      ;; get the cells in that active sheet&lt;br /&gt;      cells (vlax-get-property activesheet 'Cells)&lt;br /&gt;&lt;br /&gt;      row 1&lt;br /&gt;      column 1&lt;br /&gt;&lt;br /&gt;      somedata '("This" "is" "a" "sentence" "with"&lt;br /&gt;                 "almost" "ten" "words" "in" "it.")&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;;; place the values from somedata into rows 1 through 10, column 1&lt;br /&gt;;; rows and columns start at 1, but list positions start at 0, hence the 1-&lt;br /&gt;(while (&lt; row 11)&lt;br /&gt;  (vlax-put-property cells 'Item row column (nth (1- row) somedata))&lt;br /&gt;  (setq row (1+ row))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;;; print the last written value&lt;br /&gt;;; only using prompt with this because we know it is a string&lt;br /&gt;(prompt&lt;br /&gt;  (vlax-variant-value&lt;br /&gt;    (vlax-get-property&lt;br /&gt;      (vlax-variant-value&lt;br /&gt;        (vlax-get-property cells 'Item (1- row) column)&lt;br /&gt;      )&lt;br /&gt;      'Value&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;;; save the changes&lt;br /&gt;;; returns :vlax-true if successful&lt;br /&gt;(vlax-invoke-method currworkbook 'Save)&lt;br /&gt;&lt;br /&gt;;; close all other spreadsheets, if there are any&lt;br /&gt;(vlax-invoke-method workbooks 'Close)&lt;br /&gt;&lt;br /&gt;;; quit Excel&lt;br /&gt;(vlax-invoke-method excel 'Quit)&lt;br /&gt;&lt;br /&gt;;; destroy all the objects you made, in reverse order&lt;br /&gt;(vlax-release-object cells)&lt;br /&gt;(vlax-release-object activesheet)&lt;br /&gt;(vlax-release-object currworkbook)&lt;br /&gt;(vlax-release-object workbooks)&lt;br /&gt;(vlax-release-object excel)&lt;br /&gt;&lt;br /&gt;;; garbage collect in case Excel doesn't close for some reason&lt;br /&gt;(gc)&lt;br /&gt;&lt;br /&gt;That's pretty much it.  Here's some other handy stuff:&lt;br /&gt;&lt;br /&gt;;; create a new spreadsheet&lt;br /&gt;(setq newworkbook (vlax-invoke-method workbooks 'Add))&lt;br /&gt;&lt;br /&gt;;; make Excel visible&lt;br /&gt;(vla-put-visible excel :vlax-true)&lt;br /&gt;&lt;br /&gt;;; save the current spreadsheet as another file&lt;br /&gt;;; may not work with Excel 2007&lt;br /&gt;(vlax-invoke-method currworkbook 'SaveAs "C:\\some other file.xls"&lt;br /&gt;-4143 nil nil :vlax-false :vlax-false 1 2)&lt;br /&gt;&lt;br /&gt;As always, happy lisping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-2186150271621384000?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/2186150271621384000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/accessing-microsoft-excel-with-visual.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2186150271621384000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2186150271621384000'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/accessing-microsoft-excel-with-visual.html' title='Accessing Microsoft Excel with Visual LISP'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-6041791891389305275</id><published>2009-10-13T19:54:00.004-04:00</published><updated>2010-06-27T10:20:58.777-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD script batch process every drawing LISP AutoLISP recursive all files directory vl-directory-files'/><title type='text'>Batch processing AutoCAD drawings without creating script files</title><content type='html'>Many people on the Autodesk Discussion Groups would have you think that the only way you can do any batch processing is to make a .lsp that creates script files.  This is not true and I simply refuse to use script files.  You can do so much more with AutoLISP.  Here is my own personal command, "batch":&lt;br /&gt;&lt;br /&gt;(defun c:batch (/ dir files total ct docs doc)&lt;br /&gt;  (defun listAllFiles (path ext /)&lt;br /&gt;    (apply 'append&lt;br /&gt;      (cons&lt;br /&gt;        (mapcar&lt;br /&gt;          (function (lambda(x) (strcat path "\\" x)))&lt;br /&gt;          (vl-directory-files path ext 1)&lt;br /&gt;        )&lt;br /&gt;        (mapcar&lt;br /&gt;          (function (lambda(x) (listAllFiles (strcat path "\\" x) ext)))&lt;br /&gt;          (cddr (vl-directory-files path nil -1)) ; to exclude "." and ".."&lt;br /&gt;        )&lt;br /&gt;      )&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;  (if (and&lt;br /&gt;        (setq dir (getfiled "Select a directory to process..." "Start here" "" 33))&lt;br /&gt;        (setq dir (vl-filename-directory dir))&lt;br /&gt;      )&lt;br /&gt;    (if (setq files (listAllFiles dir "*.dwg"))&lt;br /&gt;      (progn&lt;br /&gt;        (vl-load-com)&lt;br /&gt;        (setq total (itoa (length files))&lt;br /&gt;              ct 0&lt;br /&gt;              docs (vla-get-documents (vlax-get-acad-object))&lt;br /&gt;        )&lt;br /&gt;        (foreach file files&lt;br /&gt;          (setq doc (vla-open docs file)&lt;br /&gt;                ct (1+ ct)&lt;br /&gt;          )&lt;br /&gt;          (prompt (strcat "\r" (itoa ct) " of " total " drawings processed."))&lt;br /&gt;          (command "_.delay" "1000")&lt;br /&gt;          (vla-close doc :vlax-false)&lt;br /&gt;        )&lt;br /&gt;        (vlax-release-object doc)&lt;br /&gt;        (vlax-release-object docs)&lt;br /&gt;      )&lt;br /&gt;      (prompt (strcat "\nNo files of that type found in " dir " !"))&lt;br /&gt;    )&lt;br /&gt;    (prompt "\nNo path specified!")&lt;br /&gt;  )&lt;br /&gt;  (princ)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;The command defines a function called listAllFiles, which recursively lists all files of a certain type in a directory (and its subdirectories, obviously).  This was a pain in the ass to create.  Anyway, all it does is ask the user for a directory, and then uses Visual Lisp/ActiveX to open each drawing, wait for 1 second, and then close it.  All you have to do is add whatever .lsp you want to use into your startup suite.&lt;br /&gt;&lt;br /&gt;Procedure:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Save the above code as a .lsp file&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add the .lsp file you're going to use to process the drawings to the startup suite (command: APPLOAD or Tools&gt;Load Application).  This .lsp file should end with (command "qsave") to save the drawing.  DO NOT have (command "close") anywhere in the file, as this will cause an access violation and crash AutoCAD, because AutoCAD sucks.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart AutoCAD and load the .lsp file from step 1.  Run the "batch" command, select your directory, sit back and watch it do the work for you.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Uses:  Fixing a detail library (or several).&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;I used getfiled to pick the directory because not everyone has Express Tools installed.  Otherwise you can use the nicer (acet-ui-pickdir).  Also, I don't really think the value for the delay matters that much.  It appears that when you call vla-open, it switches to that new drawing long enough for things in the startup suite to do their work, then switch back to the parent drawing.  Still, it's a good idea to keep the delay in there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-6041791891389305275?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/6041791891389305275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/batch-processing-autocad-drawings.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6041791891389305275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6041791891389305275'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/batch-processing-autocad-drawings.html' title='Batch processing AutoCAD drawings without creating script files'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-2284059320035503116</id><published>2009-10-13T19:52:00.003-04:00</published><updated>2010-02-25T16:13:50.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD csv txt xls Excel parse parsing tokenize process AutoLISP LISP file comma delimited tab'/><title type='text'>Parsing .csv files with AutoLISP</title><content type='html'>You can access Microsoft Excel via COM automation ssing Visual Lisp.  This is handy, but very slow.  It only takes a few seconds when you're not doing that much, but if you all of the data in a large Excel file, using vlax is going to take a very long time (too long for the end user anyway).  Really, the best way to handle this is to save your .xls (or .xlsx) as a comma-separated value (.csv) file and use that instead.  It's also significantly simpler to do and a lot less things can go wrong.  Above all, reading a .csv file is almost 200 times faster than reading the same amount of data from an .xls file using COM.&lt;br /&gt;&lt;br /&gt;First, we need a function to actually do the parsing, in this case, convert the comma-separated string into a list.&lt;br /&gt;&lt;br /&gt;(defun str2lst (strg delim trim / templist pos)&lt;br /&gt;  (if trim&lt;br /&gt;    (setq strg (vl-string-trim delim strg))&lt;br /&gt;  )&lt;br /&gt;  (setq templist (list))&lt;br /&gt;  (while (setq pos (vl-string-search delim strg))&lt;br /&gt;    (setq templist (cons (substr strg 1 pos) templist)&lt;br /&gt;          strg (substr strg (+ 2 pos))&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;  (reverse (cons strg templist))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;How the function works should be pretty straightforward.  'strg' is the string to parse, 'delim' is the delimiter ("," in our case), and 'trim' is a T or nil value which tells it whether or not to trim of the excess delimiters at the end, for example:&lt;br /&gt;&lt;br /&gt;(setq myline "hats,broccoli,purple,,,,")&lt;br /&gt;&lt;br /&gt;(str2lst myline "," T)&lt;br /&gt;;; returns '("hats" "broccoli" "purple")&lt;br /&gt;&lt;br /&gt;(str2lst myline "," nil)&lt;br /&gt;;; returns '("hats" "broccoli" "purple" "" "" "" "")&lt;br /&gt;&lt;br /&gt;That's pretty much the quote unquote hard part, the rest is in actually collecting the data:&lt;br /&gt;&lt;br /&gt;(setq mydata (list)&lt;br /&gt;      myfile (open "mycsv.csv" "r") ;; open for read&lt;br /&gt;)&lt;br /&gt;(while (and&lt;br /&gt;         (setq line (read-line myfile))&lt;br /&gt;         (/= "" line) ;; make sure it's not blank&lt;br /&gt;       )&lt;br /&gt;  (setq mydata (cons (str2lst line "," nil) mydata))&lt;br /&gt;)&lt;br /&gt;(setq mydata (reverse mydata)) ;; reverse because of using cons&lt;br /&gt;&lt;br /&gt;Now you have your data in a nice list. If you're not comfortable working with lists directly, you could make a function to access the data by row and column.&lt;br /&gt;&lt;br /&gt;;; returns nil on invalid row and column number&lt;br /&gt;(defun RowColValue (datalist row column / value)&lt;br /&gt;  (if (&gt; row (length datalist))&lt;br /&gt;    nil&lt;br /&gt;    (if (&gt; column (length (setq value (nth (1- row) datalist))))&lt;br /&gt;      nil&lt;br /&gt;      (nth (1- column) value)&lt;br /&gt;    )&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Happy lisping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-2284059320035503116?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/2284059320035503116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/parsing-csv-files-with-autolisp.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2284059320035503116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2284059320035503116'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/parsing-csv-files-with-autolisp.html' title='Parsing .csv files with AutoLISP'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-6367368329115400113</id><published>2009-10-13T19:45:00.007-04:00</published><updated>2010-06-27T10:13:13.074-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD DCL ObjectDCL OpenDCL network WAN based location install deployment runtime'/><title type='text'>Network-based OpenDCL deployment</title><content type='html'>Almost anyone who's programmed in AutoCAD is familiar with dialog control language, or simply DCL.  It's an old crappy and complicated language for making dialog boxes accessible with AutoLISP.  DCL is the way of the past...&lt;a href="http://opendcl.com/wordpress/"&gt;OpenDCL&lt;/a&gt; is the future.  It was derived from a now GPL'ed third-party extension called ObjectDCL.  It is now maintained by some of AutoCAD's finest; Owen Wengerd (of &lt;a href="http://www.manusoft.com/"&gt;ManuSoft&lt;/a&gt; fame), for one.&lt;br /&gt;&lt;br /&gt;OpenDCL is vastly superior to DCL in every way.  With OpenDCL, you can make your own custom tool palettes with just about anything on them.  OpenDCL has event handlers, drawing preview boxes, drag and drop support, block view boxes, hatch view boxes, just about everything you'd ever need.  On top of that, it has a user interface designer (OpenDCL Studio) that makes all of this a breeze.  Most of the work is done in OpenDCL Studio designing the UI and specifying what AutoLISP functions to call on a certain event, i.e. a mouse click, a drag and drop, a list selection change, etc.  In essence, OpenDCL gives you the power of ObjectARX and MFC in AutoLISP.&lt;br /&gt;&lt;br /&gt;Anyway, this is all off-topic.  Those who don't know of OpenDCL's power should check out it's website, using anything else is a waste of time.&lt;br /&gt;&lt;br /&gt;The only issue with OpenDCL is that it's not already integrated into AutoCAD (unlike DCL).  You have to install the runtime which copies all of the ARX files and tells AutoCAD to load them upon typing "opendcl" at the command prompt in AutoCAD.  &lt;b&gt;Well, all of this is changed, because you can simply place the OpenDCL files in a network location and use a few lines of LISP to tell AutoCAD to load the correct file, thus eliminating the need to install the runtime on every computer.&lt;/b&gt;  Alternatively, a .msm Windows installer merge module is also provided so that you can merge that with an existing .msi installer package, but .msi's don't always play nice.  Plus, what if AutoCAD is already installed on all of your computers?  That'd still be one installation too many.&lt;br /&gt;&lt;br /&gt;Procedure:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install OpenDCL Runtime or OpenDCL Studio onto any computer.  These can be obtained from the &lt;a href="http://opendcl.com/wordpress/"&gt;OpenDCL website&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy all files in the C:\Program Files\Common Files\OpenDCL directory to a network directory of your choice.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use the code below to load the proper ARX, when needed.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;;; slashes must be doubled, i.e. "C:\\Somewhere\\Somewhere else"&lt;br /&gt;;; path must not end with slashes&lt;br /&gt;(setq OpenDCLLocation "wherever you put the OpenDCL files")&lt;br /&gt;&lt;br /&gt;;; detect if computer is 64-bit&lt;br /&gt;(if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))&lt;br /&gt;  (setq OpenDCLFilename (strcat "OpenDCL.x64."&lt;br /&gt;    (substr (vlax-product-key) (1+ (vl-string-search "1" (vlax-product-key))) 2)&lt;br /&gt;    ".arx"))&lt;br /&gt;  (setq OpenDCLFilename (strcat "OpenDCL."&lt;br /&gt;    (substr (vlax-product-key) (1+ (vl-string-search "1" (vlax-product-key))) 2)&lt;br /&gt;    ".arx"))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;;; detect if ARX is already loaded&lt;br /&gt;(if (not (member OpenDCLFilename (arx)))&lt;br /&gt;  (arxload (strcat OpenDCLLocation "\\" OpenDCLFilename))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;That's it.  If you ever need help with OpenDCL, just go to the &lt;a href="http://www.opendcl.com/forum"&gt;forums&lt;/a&gt;.  There are lots of helpful people like Owen himself and Fred Tomke.  I also frequent these forums, but am not as experienced as they are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-6367368329115400113?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/6367368329115400113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/network-based-opendcl-deployment.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6367368329115400113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/6367368329115400113'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/network-based-opendcl-deployment.html' title='Network-based OpenDCL deployment'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5038985004150764058</id><published>2009-10-12T20:41:00.021-04:00</published><updated>2010-02-25T16:12:08.480-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux MS Microsoft Windows free open source software GNU equivalents replacements GPL&apos;ed FOSS comparison better'/><title type='text'>Windows/Linux equivalents/replacements</title><content type='html'>Been messing around with Linux for quite some time now, largely due to free CFD/FEA software like &lt;a href="http://research.edf.com/the-edf-offers/research-and-development/softwares/code-saturne-107008.html"&gt;Code_Saturne&lt;/a&gt; included in &lt;a href="http://caelinux.com/CMS/"&gt;CAELinux&lt;/a&gt;, and of course the ever popular &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.  I almost feel dirty mentioning Ubuntu, it's like the iPod of Linux distributions; the trendy-not-necessarily-the-best product.  At least it's free, right?  Back on topic, &lt;a href="http://www.aircrack-ng.org/"&gt;aircrack-ng&lt;/a&gt; included in &lt;a href="http://www.remote-exploit.org/backtrack.html"&gt;BackTrack&lt;/a&gt; is also pretty cool...got to learn how easy it is for crackers to get into your wireless network and/or decrypt your traffic unless you're using the latest encryption (WPA2 AES 4tw).&lt;br /&gt;&lt;br /&gt;Over the years I've been able to do more and more with free software (freeware and/or truly free software), but majority of it is freeware designed solely for Windows, only a few projects (&lt;a href="http://www.videolan.org/vlc/"&gt;VLC Media Player&lt;/a&gt;, &lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt;, &lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt;, &lt;a href="http://www.zsnes.com/"&gt;ZSNES&lt;/a&gt;) are cross-platform.  As a programmer, I understand the pain of writing portable code and realize that you can't accomplish everything with just standard libraries; there's always going to be something that needs platform-specific code.&lt;br /&gt;&lt;br /&gt;Ubuntu already has a lot of the things you need out of the box: OpenOffice, &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt; (email client), Pidgin (a cross-protocol instant messaging client; not going to link to it because I don't like it all that much, although it does what I need), and of course, Firefox.  I didn't write this to endorse Ubuntu though; there are already far too many sites that do that.  I don't think that Ubuntu is bad, in fact it's great, it just makes some things too simple I think.  Of course this is great for introducing the world of free software to non-technical people and others who simply though there wasn't anything besides Windows or OS X.&lt;br /&gt;&lt;br /&gt;Anyway, here's a list of free programs I used on Windows and what I use on Linux (will use really, I compiled this list so that when I finally make the switch I won't be lost).&lt;br /&gt;&lt;br /&gt;Windows - Linux&lt;br /&gt;&lt;br /&gt;Defragmenter: &lt;a href="http://www.defraggler.com/"&gt;Defraggler&lt;/a&gt; - Not needed; the Ext filesystem is more resistant to fragmentation.&lt;br /&gt;&lt;br /&gt;Cleanup: &lt;a href="http://www.ccleaner.com/"&gt;CCleaner&lt;/a&gt; - Again, not needed.&lt;br /&gt;&lt;br /&gt;Archiving/encryption: &lt;a href="http://www.7-zip.org/"&gt;7-zip&lt;/a&gt; - &lt;a href="http://code.google.com/p/k7z/"&gt;k7z&lt;/a&gt;&lt;br /&gt;The LZMA algorithm is superior to zip, bzip2 and rar...it'd be a shame to leave it behind.&lt;br /&gt;&lt;br /&gt;Music: &lt;a href="http://www.winamp.com/"&gt;Winamp&lt;/a&gt; - &lt;a href="http://audacious-media-player.org/"&gt;Audacious Media Player&lt;/a&gt;&lt;br /&gt;Audacious Media Player is superior; I wish I could use it on Windows.  It supports almost every file format without having to hunt down plugins.  It plays almost every module, chiptune and video game music format right out of the box.  Fantastic.&lt;br /&gt;&lt;br /&gt;Office: Microsoft Office - &lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt;&lt;br /&gt;(Included in Ubuntu)&lt;br /&gt;&lt;br /&gt;Solid modeling: Autodesk Inventor - &lt;a href="http://brlcad.org/"&gt;BRL-CAD&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CD/DVD ripping/burning: &lt;a href="http://www.imgburn.com/"&gt;ImgBurn&lt;/a&gt; - &lt;a href="http://projects.gnome.org/brasero/"&gt;Brasero&lt;/a&gt;&lt;br /&gt;(Included in Ubuntu)&lt;br /&gt;&lt;br /&gt;File synchronization: &lt;a href="http://www.2brightsparks.com/syncback/"&gt;SyncBack&lt;/a&gt; - &lt;a href="http://jfilesync.sourceforge.net/"&gt;JFileSync&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Batch renamer: &lt;a href="http://www.den4b.com/downloads.php?project=ReNamer"&gt;ReNamer&lt;/a&gt; - &lt;a href="http://file-folder-ren.sourceforge.net/"&gt;Metamorphose&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IP blocking: &lt;a href="http://phoenixlabs.org/pg2/"&gt;PeerGuardian&lt;/a&gt; - &lt;a href="http://developer.berlios.de/projects/moblock/"&gt;MoBlock&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Torrent client: &lt;a href="http://www.bitcomet.com/"&gt;BitComet&lt;/a&gt; - &lt;a href="http://www.transmissionbt.com/"&gt;Transmission&lt;/a&gt;&lt;br /&gt;(Included in Ubuntu)&lt;br /&gt;&lt;br /&gt;Workspaces: &lt;a href="http://dexpot.de/index.php?id=home;lang=en"&gt;Dexpot&lt;/a&gt; - Built in to Ubuntu&lt;br /&gt;&lt;br /&gt;Image editing: Photoshop or &lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt; - &lt;a href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;&lt;br /&gt;(Included in Ubuntu)&lt;br /&gt;&lt;br /&gt;Computation: MATLAB - &lt;a href="http://www.gnu.org/software/octave/"&gt;GNU Octave&lt;/a&gt;&lt;br /&gt;Frontends for Octave:&lt;br /&gt;&lt;a href="http://xoctave.webs.com/"&gt;Xoctave&lt;/a&gt; - Almost identical to the MATLAB GUI.&lt;br /&gt;&lt;a href="http://qtoctave.wordpress.com/"&gt;QtOctave&lt;/a&gt; - Less similar to MATLAB GUI, but has a portable version and some extra tools.&lt;br /&gt;&lt;br /&gt;Most of these can be found in the package manager :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5038985004150764058?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5038985004150764058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/windowslinux-equivalentsreplacements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5038985004150764058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5038985004150764058'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/windowslinux-equivalentsreplacements.html' title='Windows/Linux equivalents/replacements'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-5948938542304718351</id><published>2009-10-12T19:20:00.020-04:00</published><updated>2010-06-27T10:16:20.516-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='big little endian endianness convert swap signed unsigned IEEE 754 double float floating point detect change C programming language'/><title type='text'>Endianness in C</title><content type='html'>I ran into the problem of endianness when I was first starting out my most recent project to directly synthesize .au sound files.  I thought I'd share some of the things I found out.&lt;br /&gt;&lt;br /&gt;First off, endianness is the order that computers store octets in memory.  A value of 1 on a big-endian machine would look like this as a 32-bit integer in hex: 00 00 00 01, whereas it would be flipped on a little-endian machine: 01 00 00 00.  The least significant byte (LSB) is stored at the lowest address on little-endian machines.  Keeping this fact in mind, it's easy to determine if a machine is little-endian or big-endian:&lt;br /&gt;&lt;br /&gt;unsigned int unity = 1;&lt;br /&gt;#define is_littleEndian() (*(unsigned char *)&amp;amp;unity)&lt;br /&gt;// will return 1 if little endian, otherwise 0&lt;br /&gt;&lt;br /&gt;Just making a char out of the first octet in the unsigned integer.  If it's little-endian, the 01 will be in the least address, returning 1.&lt;br /&gt;&lt;br /&gt;Now that you've determined whether the machine's endianness, let's review some ways you can convert from one to the other.  Ints are simple enough:&lt;br /&gt;&lt;br /&gt;int32_t endianSwap(int32_t a)&lt;br /&gt;{&lt;br /&gt;return a &amp;lt;&amp;lt; 24 &amp;amp; 0xFF000000 | a &amp;lt;&amp;lt; 8 &amp;amp; 0x00FF0000 |&lt;br /&gt;       a &amp;gt;&amp;gt; 8 &amp;amp; 0x0000FF00 | a &amp;gt;&amp;gt; 24 &amp;amp; 0x000000FF;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This works with both signed and unsigned integers.  You may be asking yourself why I included the bitwise OR operations with the left and right shifts by 24.  Well, right shifting signed integers is not implementation defined.  The vacated bits may be filled with 1s or 0s.  This is simply a precaution.&lt;br /&gt;&lt;br /&gt;Converting floating point numbers is a little more involved, and you can't exactly convert to another double (you can, but it just makes more sense not to convert back).  This is handy if you're writing data to a file.&lt;br /&gt;&lt;br /&gt;uint64_t bigEndian_double(double a)&lt;br /&gt;{&lt;br /&gt;uint64_t b;&lt;br /&gt;unsigned char *src = (unsigned char *)&amp;a,&lt;br /&gt;              *dst = (unsigned char *)&amp;b;&lt;br /&gt;&lt;br /&gt;if (is_littleEndian())&lt;br /&gt;{&lt;br /&gt;  dst[0] = src[7];&lt;br /&gt;  dst[1] = src[6];&lt;br /&gt;  dst[2] = src[5];&lt;br /&gt;  dst[3] = src[4];&lt;br /&gt;  dst[4] = src[3];&lt;br /&gt;  dst[5] = src[2];&lt;br /&gt;  dst[6] = src[1];&lt;br /&gt;  dst[7] = src[0];&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;  b = *(uint64_t *)&amp;a;&lt;br /&gt;&lt;br /&gt;  return b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Comments are welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-5948938542304718351?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/5948938542304718351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/endianness-in-c.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5948938542304718351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/5948938542304718351'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/endianness-in-c.html' title='Endianness in C'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-257966030191194649</id><published>2009-10-12T19:15:00.006-04:00</published><updated>2010-02-25T16:10:55.158-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD aerials images editing manipulation cleanup clean up raster design imageclip wipeout imageframe imageattach'/><title type='text'>Dealing with Images</title><content type='html'>&lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;Here's the last article I wrote at my old site (no images again).&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;Herein lie some techniques you can use to make the best of the sometimes arduous  task of using images in your drawings, for more often than not it's unavoidable.  If you're lucky, you'll get to work with a high quality image, hopefully not a  JPEG. Or, you might have the original drawing, and assuming it's in good shape  you can re-scan it to better suit your needs. But also more often than not, the  image you'll have will be poorly scanned by someone unaware that the image will  be reused in another drawing. Of course, this problem would be solved if  companies/entities working on a common project would share drawings amongst each  other freely, but that's almost never the case, so here we are.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    Before reading further, it's  important to keep the following question in mind: do I want to edit/copy then  edit the image file (as opposed to using the original)? There are times when  it's not permissible to edit, let alone copy, an image file, in which case  you're stuck using the following commands to tweak it. Call it poor man's Raster  Design, if you will. But, if you can edit or copy the original image file, it  might be less complicated to use an image editing program to tailor the it to  your needs. If you choose that route, be sure and save the image in a lossless  image format, like a BMP, PNG or TIFF (sometimes). Chances are the original  image file is from a scan or is a lossy image format like a JPEG, so you want to  use one of the aforementioned lossless image formats to preserve whatever  quality you can.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;Tip: Install the Raster Design Object  Enabler to enable AutoCAD to import additional image formats (see image below).  The enabler can be downloaded &lt;a href="http://usa.autodesk.com/adsk/servlet/ps/dl/item?siteID=123112&amp;amp;id=11091617&amp;amp;linkID=9240618"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;The ALIGN Command&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The first step after inserting an  image is using the ALIGN command to make it orthogonal. The ALIGN command asks  you to select objects, and to choose two pairs of source and destination points.  What it's really asking for is the basepoint and endpoint of an alignment vector  representing the original object (the source vector), and another set of points  signifying the target alignment vector. With that information, it will align the  original objects to the new alignment vector relative to the source vector. In  the case of the image below, the square is being aligned to the target vector  (red).&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The above image makes it clear what  we've set out to do. Most of the time, your source vector should be a line that  was almost certainly orthogonal in the original drawing. More often than not,  it's a border line on the title block. It's easiest to use one of these because  they're certainly going to be the longest lines available from the image, which  will provide the highest level of accuracy when aligning. Once you've chosen  what line you're going to use as a source vector, switch to ORTHO mode and draw  a perfectly horizontal line so you'll have something to use as a target vector.  It doesn't matter how long the line is, because you're only using the line for  alignment, not scaling. Now you can use the ALIGN command and align the  image.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    If you've taken your time in  selecting your source points, the image should be pretty orthogonal. Zooming in  to the line you wish to use in the image helps; that way you can click the exact  centers of the endpoints in question.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    Or, you may not want to align your  image orthogonally at all. For instance, if you're working with an aerial photo,  you probably want to align the centerline of a road or a property line (in the  image) with some part of a parcel or tract map (in your drawing), or something  to that effect. This time the game changes, because you'll want to make sure and  use the 'Scale objects based on alignment points' option in the ALIGN command.  When you insert the image, it's never properly scaled. But with the ALIGN  command, you can correct this. You can choose a reference common to both the  aerial photo and the parcel map, such as section corners, allowing you to align  and scale the aerial photo properly.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;The IMAGECLIP Command&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The IMAGECLIP command is used to  'clip' off the undesirables of an image. The command is straightforward; the  first prompt asks if you want to either turn the boundary on (ON) or off (OFF),  create a new boundary (New boundary), or delete the existing boundary (Delete).  When you use the 'New boundary' option ('n' for New, or just hit ENTER as New is  the default option), the command asks you if you'd like to make a rectangular or  polygonal boundary. The 'polygonal' option ('p' for Polygonal) is much like the  POLYLINE command, previewing the closed boundary (see image below).&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    As stated before, with IMAGECLIP,  you can hide the undesirables of the image/scan, like the title block or certain  views. For instance, you may want to isolate certain views, and you can do this  by copying the image and creating different clipping boundaries for each  instance of the image. That way you'll be free to move the different views  around, unrestricted by the positioning of the original image. Note that  clipping the image in AutoCAD does not modify the image file and that you can  restore the image to its original appearance by simply deleting the existing  boundary using the IMAGECLIP command.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;The IMAGEFRAME Command&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    Along with IMAGECLIP and images in  general is the IMAGEFRAME command. Because of how the command works, it should  really be a system variable, but it's not. IMAGEFRAME simply asks you to choose  an integer from 0-2, inclusive. IMAGEFRAME=0 turns off all image frames, so you  won't see any more polygon borders around any images, making selecting any image  difficult. IMAGEFRAME=1 turns on all image frames, and makes the polygon borders  plot just like normal lines. IMAGEFRAME=2, the default, shows all image frames,  but does not allow the polygon borders to plot. The image itself will still be  plotted, but not the polygon borders. This command is still around for nothing  more than user preference, as IMAGEFRAME=2 seems to be the intelligent choice  for almost every situation.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;The WIPEOUT Command&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The WIPEOUT command can be used to  block out/hide certain parts of images, among other things. A wipeout object is  really a blank raster image, but it has its own object class in AutoCAD. Using  wipeouts is different from using IMAGECLIP in the sense that the created  wipeouts will not be a part of the image entity; wipeouts are separate entities,  acting on other entities as well, not just images. &lt;b&gt;Note that the draw order  of the wipeouts must be kept in front of the images for them to work, since  they're separate entities.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The WIPEOUT command is also  straightforward and very similar to the POLYLINE command. Unlike IMAGECLIP,  there is no option to create a rectangular boundary, as the command defaults to  drawing a polygonal boundary. Alternatively, you can create a polyline to define  the new wipeout, and use the 'Polyline' option to make a wipeout from that  polyline. Note that you need to go back to the WIPEOUT command, choose the  'Frames' option, then select 'OFF', unless you want the wipeout boundaries  showing on both the screen and when you plot. As with the IMAGEFRAME=0 setting,  turning the frames off makes it impossible to select the wipeouts, so you must  turn the frames back on in order to move them around when making any changes to  the drawing. Unfortunately, there isn't a setting to still show the wipeout's  boundary in the drawing, but not plot it, as with IMAGEFRAME. There's no way to  get around it without turning the wipeout frames off. This is because wipeouts  are blank raster images; raster images on no plot layers don't plot at all,  therefore wipeouts on no plot layers don't plot at all, either.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;Note: When using wipeouts with PDFs,  turn the wipeout frames on and make the wipeouts color 255 to avoid blacked out  areas.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;MTEXT Background Masks&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    MTEXT entities have a very nice  feature built into them: background masks. Using background masks, you can place  mtext over images and other things without having the text itself bleed into  them. This comes in handy when you want to overwrite a piece of text from a  scanned drawing, or to make annotations on an aerial photo. As with wipeouts,  the draw order of the mtext must be kept in front in order to keep the masking  effect.&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;You can access this feature by clicking  the '...' button in the 'Background Mask' field of the properties pane, as shown  below.&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The settings shown are usually good  for any application and should be deviated from only for special cases. 'Use  background color' is used to simply block out the space behind the text, only  use a specific color if you desire a solid fill behind the text (which will  result in a black block, unless plotting in color). On the other hand, this may  be exactly what you're looking for if you're creating a map and want to draw  attention to labels. Just make sure you're plotting it color.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;Tip: If trying to fit a background mask  in a specific space, try changing the Border offset factor or moving the grips  of the MTEXT entity, as the background mask follows those grips, not the  text.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="center"&gt;&lt;span class="cgsubtitletext"  style="font-size:100%;"&gt;The IMAGEADJUST Command&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    The IMAGEADJUST command can be used  to change brightness, contrast, and fade, as shown in the image below. This  comes in handy when you can't edit/copy then edit the image file, but need to  tweak its appearance.&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;As you can see, it is fairly  straightforward.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;    In closing, if you're going to be  dealing with a lot of scans of older manual drawings (hand drafted), it'd be  more efficient to buy Raster Design than to fool around with the previously  mentioned commands. Raster Design is a very featureful add-on that provides  raster to vector conversion tools, as well as many other useful tools, like  despeckle. Despeckle (command: IDESPECKLE) can be your best friend for those old  scans; it removes splotches and junk from the drawing, making text more legible  and images more presentable. I highly recommend it if you're going to be dealing  with a lot of images. You can check it out &lt;a href="http://www.autodesk.com/rasterdesign"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-257966030191194649?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/257966030191194649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/dealing-with-images.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/257966030191194649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/257966030191194649'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/dealing-with-images.html' title='Dealing with Images'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-7750665601059302116</id><published>2009-10-12T19:14:00.005-04:00</published><updated>2010-02-25T16:08:26.869-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='revision cleanliness clearness language note writing guidelines jargon lingo syntax specifics triangle delta'/><title type='text'>The Art of Revision Note Writing</title><content type='html'>&lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;Another one from my old site.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;If you're reading this, chances are you've made a revision (or thousands) and  therefore have had to create revision notes. Though the idea behind creating  revision notes is simple, knowing how to properly write them is a skill not  easily mastered, for you face a dilemma: you, the person making the revision,  may know exactly what has changed while others may only have a vague idea.  Therefore, the purpose of the revision note is to convey the following  information: what was changed, how those things were changed, and what brought  about the changes. This may seem like a simple and straightforward task, but  more times than not the space alloted for the note itself is small, which  obviously poses a problem. Now, you must aim to convey the aforementioned  information in the shortest fashion possible while not leaving out any of that  information.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;Before looking at some examples, let's look at what no revision  should be without:&lt;/span&gt;&lt;/p&gt; &lt;ul style="font-family: courier new;"&gt;&lt;span&gt;&lt;li&gt; &lt;p align="justify"&gt;The letter or number (or whatever sort of code you use) of the  revision.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;The date the revision was made. If space permits, you may want  to include the starting and ending dates of the revision, as opposed to just a  single date.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;The name or initials of the person who made the revision. This  provides a method of accountability.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;The name or initials of the person who checked the revision  (and anyone else relevant to the revision, i.e. the engineer, the project  manager, etc.). If you're the person making the revision, this is how you cover  yourself.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;A concise description of the changes made. If adding content,  describe what was added and where it was added, if possible. If removing  content, describe what was removed and where it was removed from, if possible.  If modifying content, describe the content before and after the revision.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;A reference to what prompted the revision, generally following  the following format: "...per someone (some company or department) (some form of  communication) dated mm/dd/yy." Again, accountability. If someone questions the  necessity of the revision, they can follow through with the information you  provide and get all the facts.&lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;    In addition, it's better to both maintain professionalism  and to minimize the wording by using a sort of legalese. It's not so much the  words you use (although it's better to use more 'formal' words, avoiding slang  and the like), but the words that you leave out. For instance, instead of "I  deleted the A and B holes as directed by an e-mail I received from the engineer  on the 22nd", the following would be preferred: "Deleted holes A and B per (name  of engineer) email dated 5/22/08". It is in this fashion, that is, writing in a  minimalistic but concise fashion, which we must strive to achieve in order to  create effective revision notes.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;Here are some examples:&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;NO:  Shortened shaft length per J. Doe e-mail.&lt;br /&gt;YES: Shaft  length now 5'-2", was 7'-8". Rev'd per J. Doe e-mail dated 4/1/08. &lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;NO:  Corrected tag numbers per customer request.&lt;br /&gt;YES:  Corrected control box tagging per J. Doe (some company) phone conversation on  3/17/08. &lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;NO:  Updated electrical configuration per engineer.&lt;br /&gt;YES:  Increased starter size to 1, was 0, removed pressure switch. Rev'd per J. Doe  e-mail dated 5/3/08. &lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: courier new;" align="justify"&gt;&lt;span&gt;    Understand that even though it's easier to write a short  and basic revision note, it's necessary to add every pertinent detail to prevent  future confusion, therefore saving time and frustration. Even with a revision  control system, it's essential to write such notes as not everyone has access to  the revision control system, and more importantly, not all drawings are small  enough for it to be readily apparent what changes were made between  revisions.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-7750665601059302116?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/7750665601059302116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/art-of-revision-note-writing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7750665601059302116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/7750665601059302116'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/art-of-revision-note-writing.html' title='The Art of Revision Note Writing'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-2482685270499055315</id><published>2009-10-12T19:10:00.006-04:00</published><updated>2009-10-27T10:59:31.741-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open letter linux Autodesk AutoCAD replacement CAD tyranny bullshit GNU FOSS free software open source GPL&apos;ed dwg libredwg'/><title type='text'>The Prophecy</title><content type='html'>&lt;div style="text-align: left; font-family: courier new;"&gt;&lt;span style="font-size:100%;"&gt;This is also from my old site.  It was and still is an open letter to the CAD community.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: courier new;font-size:100%;" class="cgbodytext" &gt;&lt;p align="right"&gt;May 8th, 2008&lt;/p&gt; &lt;p align="justify"&gt;To my fellow CAD operators, drafters, engineering technicians,  designers, engineers, programmers and the like:&lt;/p&gt; &lt;p align="justify"&gt;    It's no secret that AutoCAD has become as Windows has--that  is, the big kid on the block. AutoCAD has maintained this position for quite  some time now apparently, the length of which is unapparent to me as I've not  been on the block for too long--long enough will suffice. How this came to be  should also be common knowledge: it was one of the first CAD packages out there  when the market was just starting and was lucky enough to fend off the  competition to secure its throne. Such is also Windows: in the beginning, there  was DOS. There were many flavors of DOS. Then Microsoft, out of their fears of  Apple's new GUI (graphical user interface) based OS (operating system), made  their own GUI (which not surprisingly had a lot of similarities to Apple's...)  to run on top of MS-DOS, called Windows. Then Microsoft convinced several  computer manufacturers to ship their computers with windows preinstalled on  them, thus beginning its reign. In both cases, the situations were the same--one  software company became the pick of the litter by mere chance.&lt;/p&gt; &lt;p align="justify"&gt;    Since Windows' inception, a flagrant dislike was born for  Microsoft. Many would like to see some great new OS come along and demolish  everything that Microsoft has built up thus far, making a Babylon of software in  the process. In the mid-90's, users were even more specific, wanting Bill Gates  himself hanged or even worse. Those were the true blue screen days. As such,  there have been many attempts to dethrone Windows, with little success. Apple  has tried and is still trying to fight for the throne with its mongoloid-esque  advertising campaigns, dribbling about this nonsense of 'Mac vs. PC' when  nowadays it's so clearly OS X vs. Windows. Apple started building their machines  with 'PC' hardware back in 2005, and now the only differences lie in the  software. But that's a different story. Linux tries to show users that there are  alternatives, not so much to dominate, since most Linux distros (distributions)  are given away free of charge. As such, Linux doesn't have much to gain by  dominating the market when there are no real profits involved.&lt;/p&gt; &lt;p align="justify"&gt;    So far, Linux is the only OS that has come close to taking  over. Linux has taken a great bite out of the server market because servers  don't directly deal with the proprietary software and file formats exclusive to  Windows--they only have to store and serve them. This is the dilemma: most  software is written solely for Windows. To counter that, macs now have the  ability to install and run Windows alongside OS X. Also, the Linux community has  started projects like &lt;a href="http://www.winehq.org/"&gt;Wine&lt;/a&gt;, &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt; and &lt;a href="http://www.dotgnu.org/"&gt;DotGNU&lt;/a&gt; to allow most Windows applications to  be run on Linux. For some, that seems like more work than it's worth. For  others, the fact that Linux is free (most distros anyway) is enough to  completely pry them from everything they've learned on Windows to start anew,  that is, relearn how to use a computer altogether since Linux works differently  than Windows. Of course, there are Linux distros to make that transition less  painful, like &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.&lt;/p&gt; &lt;p align="justify"&gt;    Both Windows and AutoCAD thrive off of the common concept  that once a user becomes tied down to specific software due to proprietary file  formats or otherwise, a threshold is created that must be crossed in order to  make the user switch to another software package. The threshold is crossed when  the benefits (better features, easier to use, less costly, etc.) of another  software package outweigh the drawbacks of switching from the current package:  taking time to learn the new package, dealing with whatever file format issues  that may arise (incompatibilities, dependency on third party converters),  leaving the existing comfort zone with that current package, and dealing with  the resultant changes from making the transition. Those resultant changes may be  any of the following: switching OSes, getting new third party software packages  to replace the old ones, billing changes due to change in productivity, etc.  Because they know their own position in the market and that this threshold  exists, they exploit it by putting less effort into software development and  more into advertising...while current users are disgusted, the company can  secure its throne by acquiring more users through advertising, and of course, by  already being the industry standard.&lt;/p&gt; &lt;p align="justify"&gt;    As such, we arrive at the current problem that most are  well aware of: 'they exploit it by putting less effort into software development  and more into advertising'. With the 12 month release cycle, and its said  stranglehold on the industry, Autodesk has put less and less effort into making  a quality product. Instead, they focus on making the product attractive to  possible customers by adding as many bells and whistles as possible. Meanwhile,  they fix other problems as it suits them in order to keep the existing users  somewhat quiet. Our lack of communication is their advantage. Even if we all  were aware of this, what would we do? What is there to do? Most of the CAD  industry hinges on the proprietary DWG format that Autodesk itself created and  still maintains. To combat this, the ODA (Open Design Alliance) was created, and  now provides developers with a set libraries called DWGdirect to read/write  drawing files based on the OpenDWG specification, which is based off of  Autodesk's original DWG specifications. This luxury comes at a price, of course.  This has helped somewhat, as many other CAD software companies use these  libraries to achieve compatibility, i.e. Bentley Systems Inc., IntelliCAD  Technology Consortium, and Dassault Systemes S.A. (makers of SolidWorks).&lt;/p&gt; &lt;p align="justify"&gt;    But this is only a band-aid, as Autodesk truly controls the  DWG format since they are the leaders of the CAD industry. In addition, with  every new release of AutoCAD new objects are added and changes are made to the  format itself, making things more difficult for the ODA and consequently  blocking the companies that use DWGdirect from making software packages that  could ever be truly compatible with AutoCAD DWGs. Autodesk offers a similar set  of libraries called RealDWG that can read/write natively in the DWG format, but  as with DWGdirect, this luxury comes at a price. Even though this allows other  CAD software to be 'fully' compatible with Autodesk DWGs, it's no good because  Autodesk still controls the format. Sure, the ODA could try to fork off from  Autodesk's standard, but take a guess who's going to win that battle. (Note:  even with RealDWG, applications can't be truly compatible because AutoCAD sets  the standard for rendering objects, meaning that only AutoCAD can render DWGs  correctly. This has been proven by &lt;a href="http://www.xanadu.cz/"&gt;XANADU  Inc.&lt;/a&gt;'s BUDWEISER compatibility benchmark: "So far &lt;u&gt;no&lt;/u&gt; non-Autodesk  application has succeeded to read and interpret this drawing in all its  tests.")&lt;/p&gt; &lt;p align="justify"&gt;    All these things considered, what can we do about it? No  other software package has come close to threatening AutoCAD's position because  of the aforementioned reasons. I believe the underlying reason for this is a  more central one: the price, or rather the existence of a price, and the manner  in which problems are fixed. I cite the OS battle as an example. The only OS  that's making any progress towards fighting Windows is Linux. Why? Because  people are getting fed up with the same old stuff: problems with Windows that  don't get fixed until the next service pack (which means months), or even the  next major release. Because Linux is open-source, problems are addressed as soon  as they are found, eliminating the lengthy wait for a simple bug fix. On top of  that (and more apparent to users I might add), is that people are noticing that  the price of Windows is increasing with time, which makes free Linux look all  the more attractive. This is the beauty of FOSS (free open-source software).&lt;/p&gt; &lt;p align="justify"&gt;    Let's take the same scenario and see how it applies to  AutoCAD. AutoCAD has the same problems: owning a copy of the biggest boy on the  block comes with the biggest price on the block, and users are forced to wait  until the next major release for most bug fixes. The service packs don't fix  much, if anything. Therefore, we must venture to solve the problem in the same  manner--that is, &lt;u&gt;make a FOSS replacement for AutoCAD&lt;/u&gt;. Such a task might  take years, but imagine the benefits and admire the beauty of the idea...a CAD  program created and maintained by the people who actually use CAD on a daily  basis. The core features will be as we see fit, taking shape from discussions  and contributions. Open-source works: if there's a disagreement on a feature,  there's no need to walk away angry, both methods can be implemented and the  choice between those methods would become a new setting. Of course, most of us  are not programmers, and this is why it takes some initiative to begin to make  something like this a reality. The features/benefits and the actual feasibility  of such a project must be made clear.&lt;/p&gt; &lt;p align="justify"&gt;    From now on, the software package that will be created from  such a project will now be referred to as 'the package' or 'the project'. I say  'will be' instead of 'would be' because the latter implies an if: 'if it were  created, it will be' instead of 'it's going to be created, and it will be'.  There's no way that users will put up with these same antics forever. First and  foremost, the package will be entirely free. This is paramount to the package's  success, because only by being free will it have the power to pry people from  other CAD packages. Through YOUR involvement in this project, you--the people  who work for companies who use CAD software--can make those who must know know  that it meets your company's needs (and if it doesn't, you are empowered to help  it start to meet those needs) and that it won't cost a bundle to implement. In  addition, won't it be nice to have a copy of CAD at home without having to  borrow a license?&lt;/p&gt; &lt;p align="justify"&gt;    This brings me to my next point/feature: 'it won't cost a  bundle to implement'. Because the project will be based on community involvement  and contributions, more likely than not, the support created for the package  will be enormous. Transitions from existing CAD packages will be made as  painless as possible because those who decide to contribute will already be the  users of those same CAD packages. Paying for training will be a thing of the  past!! When new features are implemented, they will be heavily documented by the  contributor(s) because they themselves and other contributors need to know  exactly how the new feature works and integrates with the package. Through  communication, each new feature will slowly drip down from the programmers'  point of view to the end users' point of view, allowing for maximum  understanding of all features.&lt;/p&gt; &lt;p align="justify"&gt;    The next feature: portability. As we aim to cater to users'  choice and needs through the core features, we must also aim to allow them keep  that choice by choosing what OS they desire to use the package with. This is  also paramount to the package's success. One ongoing complaint of AutoCAD users  is that it can't be run natively on OS X or Linux, and as such users have been  pleading for versions that will do so. Also, as a matter of philosophy, users  shouldn't be forced to switch to another OS or stay with one they don't like  just to use one piece of software. Choice, simply put, is what makes and keeps  users happy. Therefore, the package will be portable, working on a variety of  popular OSes. OS independence can be accomplished by writing the package in a  portable, cross-platform programming language. I say it should be written in a  lower-level programming language, like C or C++, to foster portability and  alleviate performance concerns. OS independence also means that the package  can't be tied down by utilizing proprietary software (.NET&lt;sup&gt;TM&lt;/sup&gt;,  DirectX), and therefore will only use free software and libraries, like OpenGL.  Also, with the same aforementioned user empowerment, if a user has a specific OS  that they'd like to use it with, they are empowered to port (convert code to  work on another platform) it to that OS because the source code will be 'open'  (available to all), or at least request that it be ported.&lt;/p&gt; &lt;p align="justify"&gt;    Performance should be kept in mind at all times. Users have  been complaining about AutoCAD's performance for many years now. The first  example that comes to mind is data links. Data links take an exorbitant amount  of time to create and insert as tables into drawings, while third party add-ons  can do the same thing in a fraction of that time. This more than anything goes  to prove how little Autodesk cares about the end users and producing a quality  product. When you come right down to it though, the little slowdowns only add up  to a few minutes of lost time per week. That's besides the point though, because  what happens is users' productivity is affected when they must deal with those  slowdowns. Frustration, impatience and the like makes for unhappy users and  lower quality work. As stated before, this will be accomplished by using a  lower-level programming language. In addition to that, having a wide variety of  programmers in the immediate community provides a means of filtering out  inefficient code, leaving only sheer brilliance.&lt;/p&gt; &lt;p align="justify"&gt;    Part of satisfying user choice is providing flexibility and  customizability. The package should be as flexible and customizable as possible,  providing exactly what the user needs and wants. If the user wants an extensive  UI (user interface) then let the user have it. If the user wants a bare-bones  UI, again, let the user have it. The UI should be exactly what the user wants:  no more, no less. For example, the troublesome InfoCenter in AutoCAD can only be  disabled by using a registry hack. Probably a better example would be the new  ribbon. The ribbon, introduced in 2009, was not received well by most users.  Users found themselves lost, having to dig and dig to find out how to get  AutoCAD looking the way it used to look (dashboard, workspaces, etc.). Should a  user have to go to this extent to disable a feature? No. This is exactly my  point: the user should be empowered with choice from the very start, being able  to choose exactly what he or she wants.&lt;/p&gt; &lt;p align="justify"&gt;    Many of you may be thinking, why should I contribute to  such a project? The most important and straightforward answer is that it will  directly benefit you yourself, whether you're a user or a developer. When the  project reaches near maturity (stable release) and a solid package is created,  it will affect the other CAD software companies, mainly Autodesk. Competition  will be increased, which means that prices will equalize/drop and everyone will  be forced to make products of greater quality in order to keep up, especially  Autodesk. As such, there are two possible end results: the project replaces  AutoCAD as the industry standard, or more likely, competition is increased  enough that existing CAD packages improve drastically. With the previous  statements in mind, remember that the idea is to provide ourselves with a great  free tool, while increasing competition at the same time. As such, we're not  going stamp out other CAD developers, but help them in a few ways. By increasing  competition, work will be created for existing CAD developers as they must  implement their company's version of our new features as we create them. At the  same time, we will provide those same developers with models of how to implement  those new features, as the source code will be open.&lt;/p&gt; &lt;p align="justify"&gt;    Besides, isn't it about time we had a fully featured  &lt;u&gt;free&lt;/u&gt; CAD package? There's well-developed free and open-source software  for every software category except CAD. The only thing that comes close to  qualifying is &lt;a href="http://archimedes.incubadora.fapesp.br/portal"&gt;Archimedes&lt;/a&gt;. But,  Archimedes is focused solely on architecture, and that just won't do. On top of  that, it's written in Java&lt;sup&gt;TM&lt;/sup&gt;, which many critics argue produces slow  applications compared to similar programming languages. We, the mathematics and  engineering elite, should have been one of the first to take an initiative  towards FOSS a long time ago. We've fallen far behind, and it's high time that  we do some catching up.&lt;/p&gt; &lt;p align="center"&gt;Sincerely, Jacob Abel a.k.a. thatcadguy&lt;/p&gt; &lt;p align="justify"&gt;Note: A Mr. Foley pointed out to me shortly after I made this  article that another reason that it's essential that the package is free, as in  free of charge/non-profit, is that Autodesk has in the past bought the  competition. REVIT and what's now the add-on electrical package are the two best  examples. REVIT used to be owned by another company and the electrical package  used to be Via Circuit Design, both now absorbed by Autodesk. So you see, it's  truly essential that it be non-profit and that it be created by those with that  thought in mind, as to avert any would-be attempts by Autodesk to absorb  it.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-2482685270499055315?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/2482685270499055315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/prophecy.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2482685270499055315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/2482685270499055315'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/prophecy.html' title='The Prophecy'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-1233641711288362287</id><published>2009-10-12T19:02:00.012-04:00</published><updated>2010-02-25T16:06:34.154-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD CAD increase speed efficiency accuracy performance mouse keyboard shortcuts fast customization'/><title type='text'>Increasing Your CAD Speed</title><content type='html'>&lt;span style="font-family:courier new;" &gt;Here's another one from my old site (minus the pictures).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p  style="font-family:courier new;" align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="cgbodytext"&gt;First, a bit of theory: Increasing your speed by just working faster is not very  efficient at all. To efficiently increase your CAD speed, you must first master  your technique...if you're a very fast individual, but don't know simple  shortcuts, you're no good to anybody. But, if you're very fast and you know the  most efficient way to do something, you will be regarded as masterful. That  being said, through my experience, the best way to accomplish this is to  optimize the way you interface with the computer via keyboard macros, and to  learn how to efficiently and effectively locate points (as in locating the point  five inches from point A, as well as being 45 degrees from point B, as opposed  to locating some place in a drawing). On top of those, CAD is all geometry...a  person with a very good geometry background as well as mathematics in general is  not going to have very much trouble getting well accustomed to CAD.&lt;/span&gt;&lt;/p&gt; &lt;p  style="font-family:courier new;" align="center"&gt;&lt;span class="cgsubtitletext"&gt;Improvement through Human-Computer  Interface&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:courier new;" class="cgbodytext" &gt; &lt;p align="justify"&gt;    There has been some debate whether using the keyboard (via  macros, shortcuts, etc.) is faster than using the mouse (toolbars/menus/tool  palettes). Of course, you must use both...but for every individual, it's likely  from previous computer experience that they are either mainly accustomed to  keyboard shortcuts (like DOS users) or mainly accustomed to clicking buttons  with a mouse (users introduced in this GUI-dominant era). Personally, I think  the keyboard is superior. As a gamer, I must master key combos, therefore, it's  very easy for me to enter two or three key macros into the command line in  AutoCAD and hit the spacebar in under a second. Granted, if you're that  proficient with a mouse, you could probably match the speed of a keyboard user,  but I'd say its common sense that it's easier to learn to do key combos than to  acquire the finesse required to click through menus/dialogs/buttons.&lt;/p&gt; &lt;p align="justify"&gt;    So, to get you started down this key-filled road, a good  place to start is editing your PGP (ProGram Parameters) file. The acad.pgp file  controls the keyboard macros that AutoCAD recognizes at the command line. To  achieve this, you can use the Command Alias Editor in AutoCAD, which is provided  as a part of the Express tools. It is located in the menus as  Express&gt;Tools&gt;Command Alias Editor. Alternatively, you can just type in  'aliasedit'. In the editor, you can easily edit every macro/shortcut a.k.a.  'command alias' for every function.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;The key is to have the shortest command aliases possible, while  still maintaining some level of description. I mean if you use the block editor  quite often, what sense does it make to have to type in 'bedit' every single  time, when you could just type in 'be', or whatever alias it is that you desire?  BEDIT isn't too good of an example, but you get the idea. It adds up typing out  all those long command names, believe me. Or, if you REALLY like memorizing keys  and want to achieve maximum speed, you could make aliases with the keys around  where your hand typically sits on the keyboard. Either way, keep common sense in  mind when making your aliases. For example, the one letter aliases should be  reserved for the commands you use more often, while the longer two or three  letter aliases should be reserved for the less used commands.&lt;/p&gt; &lt;p align="justify"&gt;    For example, my right hand is most always on the mouse, and  my left hand is in the normal position on the keyboard. You might have a similar  setup, or will anyway. Even though I still prefer to have aliases that make  sense, i.e. abbreviations, it's pretty obvious that it'd be faster to make  commands associated with combinations of the leftmost keys on the keyboard if  you're going to assign your left hand to accessing commands. The shorter the  distance your hand has to move, the quicker you can type things in, right?&lt;/p&gt; &lt;p align="justify"&gt;    Starting with AutoCAD 2007, you can use the CUI editor to  control almost all aspects of the user interface, hence 'CUI' (Customizable User  Interface). The part we're interesting in is the 'Keyboard Shortcuts' section,  of course. The CUI editor is in charge of a different class of keyboard  shortcuts--that is, the ones that are instant (they do not require a return or a  hit of the spacebar) and typically are paired with another key like CTRL or  SHIFT. The CUI editor can be accessed by typing in 'cui' at the command line.  Using the CUI editor, you can drag and drop commands into the 'Shortcut Keys'  portion of the 'Keyboard Shortcuts' section to create new keyboard  shortcuts.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;The CUI editor has two lists: a list of customizable items and  a list of commands. In the right column, there is another list: existing  shortcut keys. Right below that are the specifics for the currently highlighted  shortcut. In this pane, you can change the key combination used to activate the  command and tweak the macro itself, if desired. The usefulness of the CUI editor  becomes clear; it gives you complete control of almost all aspects the user  interface...if only they would integrate it with normal keyboard shortcuts so  everything was in the same place.&lt;/p&gt; &lt;p align="justify"&gt;    The improvements in key usage mentioned above are the most  effective ways to increase your speed in interfacing with the computer. But,  there are other ways...the next of which that I'll discuss is ergonomics. As  with your hand and typing, the key to utilizing ergonomics is to keep in mind  that the shorter distance you have to move, the faster you can be. Staying close  to the previous topic, you'll first want to consider your arms/hands and what  they do, and what their positions are, typically. The first step is to raise or  lower your chair until your armrests are level with your desk while the chair is  under load. This minimizes the rule that wrist fatigue can have over you while  drafting or otherwise.&lt;/p&gt; &lt;p align="justify"&gt;    Next is positioning your monitor(s). You'll want to place  them so they point directly at the center of your face and so positioned that  you don't have to always have your neck turned or bent uncomfortably to gaze  directly at the monitor. Also, there's one more thing to keep in mind when  positioning your monitor...something that no one I know of has talked or  complained about: the hassle with having to move your head far off to the side  of you (compared to the monitor) to look at plans or cut-sheets, whatever it is  you're working with, and then having to move it back. As with your hands, the  farther you have to move back and forth, the more time it takes your brain to  readjust itself to what it was you were looking at previously on the screen  before you glanced over at your plans. Granted, this is another little thing  like typing commands that only takes a few seconds at most, but these things add  up; it's more than just the fact that it takes more time than another method,  it's the fact that in general, the longer and more tedious a task is, the more  it takes away from your ability to work. Back to the subject, my solution to the  problem is the most straightforward one anyone could possibly think of, and  that's positioning your monitor closest to the space that your paperwork usually  occupies. The whole idea is that the more you can keep your monitor in your  peripheral vision, the easier it is for your brain to readjust, if it even needs  to.&lt;/p&gt; &lt;p align="justify"&gt;    All that being said, I've taken it to the next level with  positioning my monitors, which required some unorthodox methods. My current  setup which works quite well, is to place clips to the side of your monitor on  the wall behind your computer (hopefully you have a wall). You'll need at least  two, and to space them about the same distance apart as the width of the  standard paper size you typically work with, because you're going to hang your  work up on the wall. In this fashion, you need only rotate your head by a slight  amount to look directly at your work, as opposed to looking down and over at  something on your desk.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="cgbodytext"&gt;Or, if you really want to get creative  and expensive, get a flat-screen TV or monitor and hang it on an open bit of  wall directly above your desk. Your immediate work will be right below the  screen, on the desk. Again, the distance is smaller, as well as letting you keep  the monitor within your peripheral vision. Personally, I prefer the first  method. The only flaw with the first method is that it gets rather tedious  (having to get more and more clips to secure papers on the wall) if you have a  lot of papers that you're focusing on, whereas the second method allows you to  just arrange them on the desk in front of you.&lt;/span&gt;&lt;/p&gt;&lt;span class="cgbodytext"&gt;&lt;/span&gt; &lt;p align="center"&gt;&lt;span class="cgsubtitletext"&gt;Locating Points&lt;/span&gt;&lt;/p&gt;&lt;span class="cgbodytext"&gt; &lt;p align="justify"&gt;    This bit on locating points should be more of review than  anything else, but there's a reason I'll take the time out to go through all of  it. First and foremost, Osnaps are your best friend. Below is my standard setup  (OSMODE=4607).&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;Whether you like to have your osnaps on all the time or not (F3  to toggle), it's essential to know the underlying geometry behind them to use  them effectively. I'll leave that to the educational system and the internet  though. Besides the more obvious reasons for using osnaps (placing something on  the exact end of something else, etc.), they have other uses, mostly for  moving/copying or constructing other geometry. For example, if you have  something with an associated piece of text sitting next to it, and you need to  copy it to other similar objects in the drawing, osnaps are a superb tool, since  you can use a geometric reference to copy things around, like a midpoint, end  point, center point, etc.&lt;/p&gt;  &lt;p align="justify"&gt;This may seem like child's play, and it certainly is, but bear  with me. Points of reference (utilized via osnaps or otherwise) are essential  for geometry based operations such as arraying, rotation, mirroring, moving,  copying, trimming; you name it.&lt;/p&gt; &lt;p align="justify"&gt;    All that being said, know that you can single out any  specific osnap and make it override the current osnap setup (whether you have  osnaps on or not). So if you're used to not having them on anyway, no problem,  you can still access them anyway. This can be accomplished by a long  right-click:&lt;/p&gt;  &lt;p align="center"&gt;...or by my favorite, three letter key combinations.&lt;/p&gt;&lt;/span&gt; &lt;div align="center"&gt; &lt;table style="border-collapse: collapse;" border="2" cellpadding="0" cellspacing="0" width="300"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;&lt;span class="cgsubtitletext"&gt;Combo&lt;/span&gt;&lt;/td&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;OSnap Override&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span class="cgbodytext"&gt; &lt;/span&gt;&lt;tr&gt; &lt;td align="middle" width="92"&gt;end&lt;/td&gt; &lt;td align="middle"&gt;Endpoint&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;mid&lt;/td&gt; &lt;td align="middle"&gt;Midpoint&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;cen&lt;/td&gt; &lt;td align="middle"&gt;Center&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;nod&lt;/td&gt; &lt;td align="middle"&gt;Node&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;qua&lt;/td&gt; &lt;td align="middle"&gt;Quadrant&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;int&lt;/td&gt; &lt;td align="middle"&gt;Intersection&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;ext&lt;/td&gt; &lt;td align="middle"&gt;Extension&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;ins&lt;/td&gt; &lt;td align="middle"&gt;Insertion&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;per&lt;/td&gt; &lt;td align="middle"&gt;Perpendicular&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;tan&lt;/td&gt; &lt;td align="middle"&gt;Tangent&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;nea&lt;/td&gt; &lt;td align="middle"&gt;Nearest&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;app&lt;/td&gt; &lt;td align="middle"&gt;Apparent Intersection&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle" width="92"&gt;par&lt;/td&gt; &lt;td align="middle"&gt;Parallel&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span class="cgbodytext"&gt; &lt;p align="justify"&gt;If you are not familiar with them (you should be), rather than  my trying to explain them, it's more likely that you'll get more out of just  looking at the name of the override itself, and then trying it out in AutoCAD.  Use them (and any other command modifier) during any function. These are handy  for geometry intensive areas; this way you can pick out whichever geometric  feature you desire.&lt;/p&gt; &lt;p align="justify"&gt;    For locating points relative to others, there are other  command modifiers. The simplest is direct distance entry, where you simply point  your crosshairs in the direction of the next desired point, and enter the  distance. This, as well as all command modifiers, can be used in conjunction  with ortho and polar. This offsetting method is especially useful; you can place  your crosshairs on the geometric feature of another object (thanks to our good  friend, osnap) and locate a point whatever distance towards that feature.&lt;/p&gt;  &lt;p align="justify"&gt;Similarly, if you want to use this same method, but from a  different point of reference, not from the previous point, use the 'from'  command modifier. Type in 'from' or 'fro', and it will ask you what point you  would like to use as a reference, and then allows you to use that point as  such.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;span&gt;&lt;span class="cgbodytext"&gt;    &lt;/span&gt;&lt;/span&gt;Also similar is relative point entry. This consists of entering  the @ symbol along with numerical data to locate the next point. Like some of  the other command modifiers, this is typed in place of clicking a  point.&lt;/p&gt;&lt;/span&gt; &lt;div align="center"&gt; &lt;table style="border-collapse: collapse;" border="2" cellpadding="0" cellspacing="0" width="800"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;Geometry&lt;/span&gt;&lt;/td&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;Method&lt;/span&gt;&lt;/td&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;Format&lt;/span&gt;&lt;/td&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;Example&lt;/span&gt;&lt;/td&gt; &lt;td align="middle"&gt;&lt;span class="cgsubtitletext"&gt;Explanation&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;span class="cgbodytext"&gt; &lt;/span&gt;&lt;tr&gt; &lt;td align="middle"&gt;2D&lt;/td&gt; &lt;td align="middle"&gt;Relative&lt;/td&gt; &lt;td align="middle"&gt;@x-distance,y-distance&lt;/td&gt; &lt;td align="middle"&gt;@2,3&lt;/td&gt; &lt;td align="middle"&gt;makes a point 2 away in the positive x-direction and 3 away in  the positive y-direction from the previous point&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle"&gt;2D&lt;/td&gt; &lt;td align="middle"&gt;Polar&lt;/td&gt; &lt;td align="middle"&gt;@distance&lt;angle&gt;&lt;/angle&gt;&lt;/td&gt; &lt;td align="middle"&gt;@12&lt;45&lt;/td&gt; &lt;td align="middle"&gt;makes a point 12 away in the 45 degree direction on the  xy-plane from the previous point&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle"&gt;3D&lt;/td&gt; &lt;td align="middle"&gt;Relative&lt;/td&gt; &lt;td align="middle"&gt;@x-distance,y-distance,z-distance&lt;/td&gt; &lt;td align="middle"&gt;@4,1,7&lt;/td&gt; &lt;td align="middle"&gt;makes a point 4 away in the positive x-direction, 1 away in the  positive y-direction, and 7 away in the positive z-direction from the previous  point&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle"&gt;3D&lt;/td&gt; &lt;td align="middle"&gt;Spherical&lt;/td&gt; &lt;td align="middle"&gt;@distance&lt;angle&gt; &lt;/angle&gt;&lt;/td&gt;&lt;td align="middle"&gt;@3&lt;45&lt;30&lt;/td&gt; &lt;td align="middle"&gt;makes a point 3 away in the 45 degree direction on the  xy-plane, 30 degrees above the xy-plane, from the previous point&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td align="middle"&gt;3D&lt;/td&gt; &lt;td align="middle"&gt;Cylindrical&lt;/td&gt; &lt;td align="middle"&gt;@distance&lt;angle&gt; &lt;/angle&gt;&lt;/td&gt;&lt;td align="middle"&gt;@2&lt;35,6&lt;/td&gt; &lt;td align="middle"&gt;makes a point 2 away in the 35 degree direction on the  xy-plane, 6 away in the positive z-direction, from the previous  point&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span class="cgbodytext"&gt; &lt;p align="justify"&gt;    Next come the scant used command modifiers, but useful  nonetheless. To locate a point between two points (without making an additional  line), just type in 'mtp' or 'm2p', and it asks you for the two points. Simple,  straightforward. You can also locate points using parts of coordinates from  other points, like the x-coordinate of one point and the y-coordinate of another  point. You can achieve this by typing .x, .y, .z, .xy, .yz, or .xz. For  instance, .x takes the x-coordinate of a chosen point; .yz takes the y and z  coordinates of a chosen point, and so on. The point will be created once AutoCAD  has all three component coordinates (x, y, z).&lt;/p&gt; &lt;p align="justify"&gt;    Now that you've been fully introduced to the other command  modifiers, it's time to look at the last and most useful, osnap tracking. Osnap  tracking is a method of locating points from reference points using the previous  methods, but with less typing. Simply putting the crosshairs over an osnap makes  it a reference point once the osnap icon appears over it, and you can use it as  a reference point to go from, etc. You can even use it to locate the polar  intersections from two points of reference. The best way to learn how to use  osnap tracking is to use it, not to try and read up about it. So instead of my  trying to explain further, do yourself a favor and get to it.&lt;/p&gt; &lt;p align="justify"&gt;    Now, keep in mind that any of these command modifiers can  be used with each other as much as you please. They can be nested as far as you  please. Don't get too carried away though.&lt;/p&gt;&lt;/span&gt; &lt;p align="center"&gt;&lt;span class="cgsubtitletext"&gt;Writing/Using LISP  Routines&lt;/span&gt;&lt;/p&gt;&lt;span class="cgbodytext"&gt; &lt;p align="justify"&gt;    I'm sure everyone has heard of AutoLISP (LISP for short) by  now. LISP is one of the more popular programming APIs in AutoCAD. To the point:  if there are things you do often that are quite tedious and simple in nature,  there's a very good chance you could benefit by investing some time in learning  LISP. LISP is great for simplifying the things that are specific to your  particular needs; the things that simply aren't satisfied by the 'broad' (I use  that term lightly) tools provided by Autodesk.&lt;/p&gt; &lt;p align="justify"&gt;    LISP routines can be written for just about anything that  doesn't really require major problem solving. It all depends on how much code  you want to write. They can be very complex, such as the one-line automation  system I created for work, or very simple, like the polyline join routine I use  on a daily basis (PEDIT slows things down with all those prompts).&lt;/p&gt; &lt;p align="justify"&gt;    In addition, it's handy to be familiar with LISP, in order  to check over the routines you get from other places (the internet or  otherwise). I say this because for one, AutoCAD is ripe with security flaws. For  instance, LISPs and routines from the other APIs can read and write registry  values without any sort of consent or warning. You do the math.&lt;/p&gt; &lt;p align="justify"&gt;    Now, I'm not going to attempt to teach or explain LISP,  because I don't exactly know where the best place would be to start. There are  plenty of sites on the internet that explain LISP better than I ever could.  Visit my &lt;a href="http://www.blogger.com/links.htm"&gt;links&lt;/a&gt; page for some of the must-know sites. The  two pointers I will give are: learning by examples is far better than theory  alone, and get ready to wear out your parenthesis keys.&lt;/p&gt;&lt;/span&gt; &lt;p align="center"&gt;&lt;span class="cgsubtitletext"&gt;Notes&lt;/span&gt;&lt;/p&gt;&lt;span class="cgbodytext"&gt; &lt;p align="justify"&gt;    Recently, there has been some talk about using a certain  gaming controller with AutoCAD, specifically one belonging to Belkin called the  Nostromo SpeedPad n52. While it has a nice setup and the ability to have 56  different macros (probably even more than that), it is not a full keyboard;  therefore, it would only benefit those who don't have to type sentences very  often since any advantage gained would be lost if you had to move your hand back  and forth between the normal keyboard and the Nostromo often. So unless you  don't need to type full sentences in notes or use other keys exclusive to a  normal keyboard often, I'd advise against any such use as you'd just be better  off setting up macros on a normal keyboard. That way your hand can stay in one  position, minimizing the distance it has to travel on average.&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-1233641711288362287?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/1233641711288362287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/increasing-your-cad-speed.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1233641711288362287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/1233641711288362287'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/increasing-your-cad-speed.html' title='Increasing Your CAD Speed'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7258279095322020969.post-437056049512663298</id><published>2009-10-12T18:49:00.010-04:00</published><updated>2010-02-25T16:03:18.674-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoCAD CAD guidelines best good practices CAD theory cleanliness standards how to not fuck up'/><title type='text'>Good Practices (a.k.a. CAD Theory)</title><content type='html'>&lt;p style="font-family: courier new; text-align: left;font-family:courier new;" &gt;&lt;span class="cgdesctext"  style="font-size:100%;"&gt;This is from my old site, cadgasm.tk (now defunct).&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;"  align="center"&gt;&lt;span class="cgdesctext"  style="font-size:100%;"&gt;There are certain practices and standards that all well-experienced CAD users  would agree are good and favorable. When I say good, I mean that these practices  generally keep overall work to a minimum and make that work much less unpleasant  and tedious in the long run. &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:100%;" class="cgbodytext"  &gt; &lt;/span&gt;&lt;ul style="font-family: courier new;"&gt;&lt;p align="justify"&gt; &lt;/p&gt;&lt;span class="cgbodytext"  style="font-size:100%;"&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Adhere to your company's CAD standards.&lt;/u&gt; Whether they're  good standards or not, it's better to adhere to them than to stick to your own.  If you don't, someone else has to correct your mistakes (as they should, even  though you should've done it right to begin with) when they open your drawings  and find out that they aren't in line with those standards. Plus, you might have  an unpleasant encounter with a supervisor or manager in your future if you  choose to habitually ignore company standards. If your company's CAD standards  are inefficient, don't keep silent, say something about it. It shows you know  what you're doing and is a good way to get ahead in the business world by trying  to introduce new or better ideas.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;If you see something that you think or know will need to be  changed, i.e. the appearance of a block, it's much better to change it early in  the game than to have to change it when it's in ten times or more drawings some  time down the road.&lt;/u&gt; This saves time and frustration. It can be a pain to  adhere to this rule sometimes, but it's always more of a pain in the rear to fix  the problem later than to fix it when it first becomes apparent to you.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;When you send drawings to anyone, make sure you send  everything required.&lt;/u&gt; Typically, using eTransmit is a good practice because  it takes everything needed and wraps it up in a .zip file for you. The drawings,  the xrefs, the fonts, the .ctbs; they're all there. It's a major annoyance to  receive a drawing and think you can start your work just to find out that there  are several missing xrefs or images. On a related topic, if you want to send  someone a drawing, but don't want them to be able to modify it, send a DWF or  PDF (DWF preferred). DWFs can be inserted into drawings as external references,  and thus objects show up as if they were from a normal drawing; lines can be  traced, etc., whereas PDFs are mostly raster images, not vector based and offer  a poor means of preserving quality. P.S. If you're going to send a PDF, please,  plot as vector, don't plot the drawing out on paper and scan it.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Properly layer out your drawings, and keep objects on  ByLayer as much as possible.&lt;/u&gt; No one likes to get drawings that have  EVERYTHING on the same layer (especially Defpoints), or certain sets of objects  differentiated by just color or linetype. Entities should be layered out by  type, i.e. instead of just having a ROAD layer, have a ROAD_TEXT layer for  road-related text entities, a ROAD_DIM layer for road-related dimensions, and  finally a ROAD layer for everything else road. Generally, the more layers, the  better, with emphasis on grouping relevant objects together. There's not really  a point to making a large amount of layers just to put one object on each layer.  As you use CAD more and more, you'll get a better idea of how things should be  layered out.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Don't explode hatches, text, dimensions, or leaders.&lt;/u&gt;  There's really no logical reason to explode any of these in any drawing. It just  makes a child's mess out of a drawing, and on slower machines creates a very  slow drafting environment when thousands of little entities have to be drawn out  one by one. AutoCAD has optimizations to draw hatches, linetypes, text, etc. on  your screen many times faster than if it were to attempt to draw out the  thousand-of-entities equivalent.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Take time to properly name drawings.&lt;/u&gt; Including a project  number, the drawing number, and a short description is much better than  something like "cross-section.dwg". Ideally, your company should have a naming  convention to minimize the time it takes to find certain files within a  project.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Take time to properly name the layouts within those  drawings.&lt;/u&gt; As appropriately namely drawings minimizes the time it takes to  find a specific drawing within a project, appropriately naming layout tabs  minimizes the time it takes to sort through all the different layouts in the  drawing.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Take time to make sure text entities are properly  aligned/justified (top left, middle right, center, etc.).&lt;/u&gt; At first, it may  seem faster to just copy around a piece of text with left justification for  every note (and it is), but when you go back for the inevitable revisions,  you'll very likely have to reposition the text. Or, if you have to change the  scale, be it through annotative scaling or conventional methods, every single  piece of improperly aligned text will have to be repositioned. It's just better  to do it right the first time.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Use Mtext instead of multiple individual pieces of text when  making a note requiring more than one line.&lt;/u&gt; It's much more tedious and time  consuming to modify a paragraph made up of several pieces of text since it  usually means you have to edit every single line of text to even out the bulge  or void you create when you make the change. Plus, Mtext just keeps things  neater, and makes sure that long notes are properly justified the way you want  them to be.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Only override dimension text if you're dimensioning  something that's part of a not-to-scale depiction.&lt;/u&gt; It doesn't make much  sense to override the dimension text if it actually is to scale. It makes much  more sense to change the dimension style to accommodate your needs, if  possible.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Submit revised plans to your checker as a complete set  instead of submitting individual sheets.&lt;/u&gt; This way, the checker is forced to  set aside time just for checking that set of plans, and is more likely to catch  something than if he/she were to receive one sheet at a time. Some people have a  tendency to quickly skim over single sheets and miss things, as if they were  blowing it off because one sheet is unimportant to them.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;As a rule of thumb, entities that will only be used on a  single layout and are not-to-scale should be placed in paperspace.&lt;/u&gt;  Everything else, of course, will be in modelspace in order to be referenced by  the different layouts and scaled properly through viewports. For example, views  of a to-scale part should be in modelspace, because they're &lt;u&gt;to-scale&lt;/u&gt; and  might be used in more than one viewport. Notes and legends should most likely be  in modelspace as well, since they might be referenced by several layouts.  Layout-specific notes, however, should stay on their respective layouts, not in  the free-for-all modelspace.&lt;/p&gt; &lt;/li&gt;&lt;li&gt; &lt;p align="justify"&gt;&lt;u&gt;Lastly, keep file sizes down and crap out of drawings, purge  your drawings before saving.&lt;/u&gt; A zoom extents wouldn't hurt, either.&lt;/p&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:100%;" class="cgbodytext"  &gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7258279095322020969-437056049512663298?l=thatcadguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thatcadguy.blogspot.com/feeds/437056049512663298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/good-practices-aka-cad-theory.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/437056049512663298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7258279095322020969/posts/default/437056049512663298'/><link rel='alternate' type='text/html' href='http://thatcadguy.blogspot.com/2009/10/good-practices-aka-cad-theory.html' title='Good Practices (a.k.a. CAD Theory)'/><author><name>Jake</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
