<?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-1791935642719887324</id><updated>2012-01-18T19:29:49.173-08:00</updated><title type='text'>OpenSourceDesignTools</title><subtitle type='html'>My quest to be free of black box software for manufacturing and design</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-917114297070111682</id><published>2012-01-13T10:26:00.000-08:00</published><updated>2012-01-13T12:17:03.709-08:00</updated><title type='text'>Demo of Profiling</title><content type='html'>&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-e5552a1a9b9f0094" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v24.nonxt7.googlevideo.com/videoplayback?id%3De5552a1a9b9f0094%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330125462%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D101B1F90819AC67D63A4E6EFB3CD57AE76EC72C7.49D3B5F4049278134DFDF5E61DCC78169CCEF19F%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3De5552a1a9b9f0094%26offsetms%3D5000%26itag%3Dw160%26sigh%3D8dyAI4FqfwhJGn9W-i0NNBfBuME&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v24.nonxt7.googlevideo.com/videoplayback?id%3De5552a1a9b9f0094%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330125462%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D101B1F90819AC67D63A4E6EFB3CD57AE76EC72C7.49D3B5F4049278134DFDF5E61DCC78169CCEF19F%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3De5552a1a9b9f0094%26offsetms%3D5000%26itag%3Dw160%26sigh%3D8dyAI4FqfwhJGn9W-i0NNBfBuME&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-917114297070111682?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/917114297070111682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2012/01/blog-post.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/917114297070111682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/917114297070111682'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2012/01/blog-post.html' title='Demo of Profiling'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-1030336907949099270</id><published>2012-01-01T09:36:00.001-08:00</published><updated>2012-01-01T09:38:56.283-08:00</updated><title type='text'>More Progress</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-i1n2VCy04LI/TwCZwjdlG4I/AAAAAAAAAKI/D9yDeU7yG9s/s1600/ProfileMachining.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-i1n2VCy04LI/TwCZwjdlG4I/AAAAAAAAAKI/D9yDeU7yG9s/s320/ProfileMachining.png" alt="" id="BLOGGER_PHOTO_ID_5692718988428385154" border="0" /&gt;&lt;/a&gt;I was able to hack together a crude 'Profile Operation' dialog and connect it to heekscnc and libarea functions this weekend. Now I can bring up the dialog, select the edges of a solid, and then backplot the code.&lt;br /&gt;It's definitely a rough hack, but it shows some potential.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-1030336907949099270?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/1030336907949099270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2012/01/more-progress.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1030336907949099270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1030336907949099270'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2012/01/more-progress.html' title='More Progress'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-i1n2VCy04LI/TwCZwjdlG4I/AAAAAAAAAKI/D9yDeU7yG9s/s72-c/ProfileMachining.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-8378771470230099598</id><published>2011-12-31T18:40:00.000-08:00</published><updated>2011-12-31T18:42:39.645-08:00</updated><title type='text'>Using QtDesigner!!!!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Ft74COINJoc/Tv_IDOxU8DI/AAAAAAAAAKA/wbpzmXtT0Gc/s1600/early%2Bdialogs.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-Ft74COINJoc/Tv_IDOxU8DI/AAAAAAAAAKA/wbpzmXtT0Gc/s320/early%2Bdialogs.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5692488411849748530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-j2XJ9eEU-f0/Tv_IC6fq9zI/AAAAAAAAAJw/4DB71enjm0U/s1600/qtdesigner.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-j2XJ9eEU-f0/Tv_IC6fq9zI/AAAAAAAAAJw/4DB71enjm0U/s320/qtdesigner.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5692488406406985522" /&gt;&lt;/a&gt;&lt;br /&gt;I'm starting to get the hang of using QtDesigner for making pyQt Dialogs with FreeCAD/HeeksCNC. I love it!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-8378771470230099598?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/8378771470230099598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/12/using-qtdesigner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/8378771470230099598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/8378771470230099598'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/12/using-qtdesigner.html' title='Using QtDesigner!!!!'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ft74COINJoc/Tv_IDOxU8DI/AAAAAAAAAKA/wbpzmXtT0Gc/s72-c/early%2Bdialogs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-838759912752748529</id><published>2011-12-31T08:27:00.000-08:00</published><updated>2011-12-31T08:38:13.419-08:00</updated><title type='text'>A little progress report</title><content type='html'>I'm still learning the internals of FreeCAD. I helped the main project a little by creating a lowly 'Point' class, which Yorik integrated into the Draft workbench. Doing this helped me get familiar with the source. Having this object class will also be useful later on for CAM work (start and end points for profiles etc).&lt;br /&gt;I have also made some scripts for extracting libarea 'curve' elements from objects in the FreeCAD document. Right now, I can click on edges of solids or lines and arcs in Sketches or Draft elements and then run a macro to produce some python code that can be pasted into a HeeksCNC python script for producing g-code.&lt;br /&gt;The resulting code looks like this:&lt;br /&gt;&lt;br /&gt;curve = area.Curve()&lt;br /&gt;#open path&lt;br /&gt;curve.append(area.Point(62.244881,-33.935955))&lt;br /&gt;curve.append(area.Vertex(-1 , area.Point( 57.129109, -39.051727), area.Point(57.129109, -33.935955)))&lt;br /&gt;curve.append(area.Point( -56.043546, -39.051727))&lt;br /&gt;curve.append(area.Vertex(-1 , area.Point( -64.821892, -30.273381), area.Point(-56.043546, -30.273381)))&lt;br /&gt;&lt;br /&gt;If you've ever used HeeksCNC, this code should look familiar.&lt;br /&gt;I can take this code and paste it into a script such as this one:&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;sys.path.insert(0,'/usr/lib/heekscnc/')&lt;br /&gt;import math&lt;br /&gt;import area&lt;br /&gt;area.set_units(1)&lt;br /&gt;import kurve_funcs&lt;br /&gt;from nc.nc import *&lt;br /&gt;import nc.emc2b&lt;br /&gt;&lt;br /&gt;output('/home/danfalck/Documents/freecad/curve_output/test.tap')&lt;br /&gt;program_begin(123, 'Test program')&lt;br /&gt;absolute()&lt;br /&gt;metric()&lt;br /&gt;flush_nc()&lt;br /&gt;&lt;br /&gt;set_plane(0)&lt;br /&gt;&lt;br /&gt;workplane(1)&lt;br /&gt;&lt;br /&gt;#(4.7752 mm Carbide End Mill)&lt;br /&gt;tool_defn( id=4, name='4.7752 mm Carbide End Mill', radius=2.3876, length=23.876, gradient=-0.1)&lt;br /&gt;tool_diameter = float(4.7752)&lt;br /&gt;cutting_edge_angle = float(0)&lt;br /&gt;&lt;br /&gt;#path/geometry section&lt;br /&gt;curve = area.Curve()&lt;br /&gt;curve.append(area.Point(62.244881,-33.935955))&lt;br /&gt;curve.append(area.Vertex(-1 , area.Point( 57.129109, -39.051727), area.Point(57.129109, -33.935955)))&lt;br /&gt;curve.append(area.Point( -56.043546, -39.051727))&lt;br /&gt;curve.append(area.Vertex(-1 , area.Point( -64.821892, -30.273381), area.Point(-56.043546, -30.273381)))&lt;br /&gt;#end of path/geometry section&lt;br /&gt;&lt;br /&gt;#program action:&lt;br /&gt;comment('tool change to 4.7752 mm Carbide End Mill')&lt;br /&gt;tool_change( id=4)&lt;br /&gt;spindle(7000)&lt;br /&gt;feedrate_hv(840, 100)&lt;br /&gt;clearance = float(5)&lt;br /&gt;rapid_safety_space = float(2)&lt;br /&gt;start_depth = float(0)&lt;br /&gt;step_down = float(2)&lt;br /&gt;final_depth = float(-10)&lt;br /&gt;roll_radius = float(5.0)&lt;br /&gt;offset_extra = 0&lt;br /&gt;roll_on = 'auto'&lt;br /&gt;roll_off = 'auto'&lt;br /&gt;extend_at_start= 0&lt;br /&gt;extend_at_end= 0&lt;br /&gt;lead_in_line_len= 5.0&lt;br /&gt;lead_out_line_len= 5.0&lt;br /&gt;kurve_funcs.profile(curve, 'left', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, rapid_safety_space, clearance, start_depth, step_down, final_depth,extend_at_start,extend_at_end,lead_in_line_len,lead_out_line_len )&lt;br /&gt;&lt;br /&gt;absolute()&lt;br /&gt;&lt;br /&gt;program_end()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The resulting gcode might give something like this (backplotted in FreeCAD):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-UYh9YzCNw3g/Tv86RbxGmjI/AAAAAAAAAJk/Bahq4gTwVxA/s1600/teaser.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-UYh9YzCNw3g/Tv86RbxGmjI/AAAAAAAAAJk/Bahq4gTwVxA/s320/teaser.png" alt="" id="BLOGGER_PHOTO_ID_5692332525205494322" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-838759912752748529?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/838759912752748529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/12/little-progress-report.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/838759912752748529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/838759912752748529'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/12/little-progress-report.html' title='A little progress report'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-UYh9YzCNw3g/Tv86RbxGmjI/AAAAAAAAAJk/Bahq4gTwVxA/s72-c/teaser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-7772386551684548916</id><published>2011-11-05T08:37:00.000-07:00</published><updated>2011-11-05T09:05:03.191-07:00</updated><title type='text'>FreeCAD</title><content type='html'>Lately I've gotten interested in &lt;a href="https://sourceforge.net/apps/mediawiki/free-cad/index.php?title=Main_Page"&gt;FreeCAD&lt;/a&gt; .&lt;br /&gt;FreeCAD is "a a general purpose Open Source 3D CAD/MCAD/CAx/CAE/PLM modeler" written in C++, with python scripting built in. It runs on Windows, Linux, and supposedly Mac OS X. FreeCAD is built "with a modular software architecture which makes it easy to provide additional functionality without modifying the core system."&lt;br /&gt;I am interested in adapting some of the HeeksCNC libraries to a plugin for FreeCAD. My motives are practical, I think:&lt;br /&gt;&lt;br /&gt;1. FreeCAD's is maintained by a core group of developers already. They are very active.&lt;br /&gt;2. It has python scripting built in by default. HeeksPython is great,but is broken frequently by changes to HeeksCAD itself.&lt;br /&gt;3. The OS related build system is already taken care of for all desktop platforms. I don't want to deal with this at all.&lt;br /&gt;4. There is an active FreeCAD &lt;a href="https://sourceforge.net/apps/phpbb/free-cad/index.php"&gt;forum&lt;/a&gt;.&lt;br /&gt;5. I just want to work on CADCAM and import/export issues.&lt;br /&gt;&lt;br /&gt;I have been working on improving the DXF import/export scripts that are already in FreeCAD and have started on a DXF to constraints/Sketcher importer. I have also started work on backplotting CNC g-code into FreeCAD:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-0DUEEoQrQBk/TrVd7j-iJdI/AAAAAAAAAJY/6pFZl7Oid2M/s1600/cone_and_waterline.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-0DUEEoQrQBk/TrVd7j-iJdI/AAAAAAAAAJY/6pFZl7Oid2M/s320/cone_and_waterline.png" alt="" id="BLOGGER_PHOTO_ID_5671542583594198482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The screenshot is from some g-code that I generated in HeeksCNC and backplotted using the HeeksCNC python scripting, adapted to FreeCAD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-7772386551684548916?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/7772386551684548916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/11/freecad.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/7772386551684548916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/7772386551684548916'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/11/freecad.html' title='FreeCAD'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-0DUEEoQrQBk/TrVd7j-iJdI/AAAAAAAAAJY/6pFZl7Oid2M/s72-c/cone_and_waterline.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-5883577012983201972</id><published>2011-08-27T06:55:00.000-07:00</published><updated>2011-08-27T07:19:08.545-07:00</updated><title type='text'>Waterline Machining</title><content type='html'>I have been machining a part that has a draft angle of 20 degrees on two walls and I think I found a good method. &lt;br /&gt;Here is a screenshot of one version of the part, where I tried using 'zigzag' machining with Heekscnc:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-0jURMRlTcY4/Tlj346B3poI/AAAAAAAAAJA/bkN2LQIniuU/s1600/solid.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-0jURMRlTcY4/Tlj346B3poI/AAAAAAAAAJA/bkN2LQIniuU/s320/solid.png" alt="" id="BLOGGER_PHOTO_ID_5645534689930749570" border="0"&gt;&lt;/a&gt;&lt;br /&gt;When I actually did machine the part, it took about an hour and 20 minutes. I knew that I would have to set my boundaries closer to the tapered walls, if I wanted to save any time on the next part. Also notice the extra tool paths that are cutting air. I wanted to eliminate them. &lt;br /&gt;Heekscnc uses 3D machining methods from Opencamlib http://code.google.com/p/opencamlib/  . There are several strategies for 3D milling there and 'waterline' is one of them. Waterline machining makes the tool path run at a constant Z level around the part. This seemed like a perfect strategy for the part I was working on. I tried out the HeeksCNC implementation of ocl waterline using a flat bottomed end mill and got a tool path that looked like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-uJpPlDUJQhQ/Tlj5_2ZpGjI/AAAAAAAAAJI/XbzwE_5dvR4/s1600/string_bar.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-uJpPlDUJQhQ/Tlj5_2ZpGjI/AAAAAAAAAJI/XbzwE_5dvR4/s320/string_bar.png" alt="" id="BLOGGER_PHOTO_ID_5645537008239057458" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I liked the approach, but I only wanted to machine the tapered walls of the part. There were some entries in the Heekscnc waterline operation for boundaries, but they weren't functioning. I looked at the source code and added some logic to 'ocl_funcs.py' to connect them and was then able to get the tool path to look like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-OT6-w31-sxo/Tlj6p4znYDI/AAAAAAAAAJQ/kLQoM4-q3gQ/s1600/boundaries2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-OT6-w31-sxo/Tlj6p4znYDI/AAAAAAAAAJQ/kLQoM4-q3gQ/s320/boundaries2.png" alt="" id="BLOGGER_PHOTO_ID_5645537730439372850" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahh! That's much better. When I actually milled the part, my cycle time was down to 20 minutes.&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-8e071a367cd0b90f" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v23.nonxt7.googlevideo.com/videoplayback?id%3D8e071a367cd0b90f%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330125462%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D38FAAADD428F16DB885E2B4DA78CD1082E65D69F.454CDF7C2E4D002C470B10197F4A43BAEA39B28E%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D8e071a367cd0b90f%26offsetms%3D5000%26itag%3Dw160%26sigh%3Du1fSyI0cJR4kY44n-Hr5Y94bTSw&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v23.nonxt7.googlevideo.com/videoplayback?id%3D8e071a367cd0b90f%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330125462%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D38FAAADD428F16DB885E2B4DA78CD1082E65D69F.454CDF7C2E4D002C470B10197F4A43BAEA39B28E%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D8e071a367cd0b90f%26offsetms%3D5000%26itag%3Dw160%26sigh%3Du1fSyI0cJR4kY44n-Hr5Y94bTSw&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-5883577012983201972?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/5883577012983201972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/08/waterline-machining.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5883577012983201972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5883577012983201972'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/08/waterline-machining.html' title='Waterline Machining'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-0jURMRlTcY4/Tlj346B3poI/AAAAAAAAAJA/bkN2LQIniuU/s72-c/solid.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-6574247074630305107</id><published>2011-07-10T17:04:00.000-07:00</published><updated>2011-07-10T18:23:01.261-07:00</updated><title type='text'>Translating toolpaths with scriptop</title><content type='html'>I have committed a change to my git repo that lets me snap new coordinates anywhere on the drawing and then have my toolpaths generated relative to it. This becomes useful if I import a dxf file and the geometry isn't anywhere near where it needs to be for sensible fixture offsets. Here's an example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-HdRvhFUT34I/Tho_A0oGETI/AAAAAAAAAIg/72tRqFGLDqI/s1600/path1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-HdRvhFUT34I/Tho_A0oGETI/AAAAAAAAAIg/72tRqFGLDqI/s320/path1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627879967712219442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice how the origin/datum is to the far left of the rectangular sketch. To make things a little easier, create a new coordinate system with 'Set Origin' (I like to use the 'Pick 1 Point' option).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-4OERKjw5a-4/Tho_dTvDDLI/AAAAAAAAAIo/PM-2xmk_MPU/s1600/coordinate1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-4OERKjw5a-4/Tho_dTvDDLI/AAAAAAAAAIo/PM-2xmk_MPU/s320/coordinate1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627880457099218098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Snap the new coordinate datum to the upper left corner of the sketch:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-_lrX5BDPbz0/ThpEe-vBpGI/AAAAAAAAAIw/ON6JAzu19j0/s1600/upper%2Bcorner.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-_lrX5BDPbz0/ThpEe-vBpGI/AAAAAAAAAIw/ON6JAzu19j0/s320/upper%2Bcorner.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627885983379858530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Create a 'ScriptOp' operation and copy/paste the new coordinate object into it. Then you can position the ScriptOp operation just before a regular machining operation,such as Profiling. When you post process, the gcode will be shifted by the distance that the new coordinate object is away from the original origin:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-4NHR-vo7K94/ThpFQ5ax-8I/AAAAAAAAAI4/vgPttjPbZfI/s1600/shifted.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-4NHR-vo7K94/ThpFQ5ax-8I/AAAAAAAAAI4/vgPttjPbZfI/s320/shifted.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627886840946228162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is useful if you want to place your fixture offset in a familiar place. In the case of this sketch, the fixture offset (G54-G59) is placed in the upper left corner. I like to place a fixture offset on that corner because I touch off to the fixed back jaw of my vise and the left side of the part. There are always other ways of doing things, but that is a common one.&lt;br /&gt;&lt;br /&gt;Note for my fellow git brothers: I changed nc.py, iso.py, and ScriptOp.cpp to make this happen :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-6574247074630305107?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/6574247074630305107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/translating-toolpaths-with-scriptop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6574247074630305107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6574247074630305107'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/translating-toolpaths-with-scriptop.html' title='Translating toolpaths with scriptop'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-HdRvhFUT34I/Tho_A0oGETI/AAAAAAAAAIg/72tRqFGLDqI/s72-c/path1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-4916455762779228372</id><published>2011-07-09T21:09:00.000-07:00</published><updated>2011-07-10T08:48:11.209-07:00</updated><title type='text'>Manual Tool Changer Carousel</title><content type='html'>My Bridgeport CNC mill uses 'Quick Switch 30' tooling. I like it for prototype work- it's easy to change out a tool by hand. All that's required is a spanner wrench at the spindle nose to loosen and tighten the knurled ring. It only takes a quarter turn to secure the tool in the taper. When I bought the mill, it came with a small aluminum plate that had 5 holes in it for holding tools, that could be clamped down to the table. This made it convenient to have 5 tools within reach while running programs. This is not enough for the programs that I am running nowadays. Right now, I have 29 Quick Switch 30 toolholders and I like to use the  hell out of them during a program. Sometimes I have 8 different tools in  a program.&lt;br /&gt;I have been thinking about using an old Heathkit turntable platter that I have had in my stock pile (junk pile) for many years- to make a tool carousel. It's a substantial aluminum casting that's .20" thick in it's cross section and about 11" diameter. It looked like I could put 10 holes in it that would comfortably hold 10 QC 30 tools.&lt;br /&gt;I ended up writing a program in HeeksCNC, using scriptop to bore holes with an end mill. It ended up being pretty slick- it descends in a helical motion and then spirals out with an even chip load on the tool. It was kind of fun to write and use.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-EkjDF4VSw5A/ThkvuXMCZOI/AAAAAAAAAII/hORx6z8aPOk/s1600/helical%2Barray.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-EkjDF4VSw5A/ThkvuXMCZOI/AAAAAAAAAII/hORx6z8aPOk/s320/helical%2Barray.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627581682921137378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-E6IQk6zxwWw/ThmXiOXEC_I/AAAAAAAAAIQ/Ps7gWgL-eN8/s1600/IMAG1338.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-E6IQk6zxwWw/ThmXiOXEC_I/AAAAAAAAAIQ/Ps7gWgL-eN8/s320/IMAG1338.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5627695823602322418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-DCkoK2d7EDQ/ThmXiUtSteI/AAAAAAAAAIY/f0kAzw8oHz0/s1600/IMAG1341.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-DCkoK2d7EDQ/ThmXiUtSteI/AAAAAAAAAIY/f0kAzw8oHz0/s320/IMAG1341.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5627695825306170850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a link to my 'array_of_holes.heeks' file that was used for this project:&lt;br /&gt;https://github.com/danielfalck/heekscnc/blob/master/contrib/scriptop/array_of_holes.heeks&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-4916455762779228372?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/4916455762779228372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/manual-tool-changer-carousel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/4916455762779228372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/4916455762779228372'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/manual-tool-changer-carousel.html' title='Manual Tool Changer Carousel'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-EkjDF4VSw5A/ThkvuXMCZOI/AAAAAAAAAII/hORx6z8aPOk/s72-c/helical%2Barray.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-4536009485220871982</id><published>2011-07-01T18:28:00.000-07:00</published><updated>2011-07-01T18:32:03.527-07:00</updated><title type='text'>Creating a rectangle with radiused corners (fillets)</title><content type='html'>I am just copy pasting this in from a reply to a question on the heekscad user's list on google groups. This might be helpful to some.&lt;br /&gt;&lt;br /&gt;&lt;div id="qhide_35305" style="display: block;" class="qt"&gt;&lt;br /&gt;Q: How do I create a rectangular cut-out, but with rounded&lt;br /&gt;corners?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;A: Doing a rectangle with fillets in heekscad is pretty easy- use the sketch toolbar and look for the icon that is square- the tooltip for this is 'Start drawing rectangles'. After you select this, a box with appear in the left hand column of HeeksCAD that is titled 'input'. There is an entry for 'radius'. It might not work for you on the first try, so fill it in with a radius value and attempt to draw your rectangle on the screen. If your rectangle doesn't have fillets, right click with the mouse 'stop drawing' and then try making the rectangle all over again- then your fillet/radius values should stick this time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-4536009485220871982?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/4536009485220871982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/creating-rectangle-with-radiused.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/4536009485220871982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/4536009485220871982'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/07/creating-rectangle-with-radiused.html' title='Creating a rectangle with radiused corners (fillets)'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-5157776858286074404</id><published>2011-05-22T07:24:00.000-07:00</published><updated>2011-05-22T08:27:06.530-07:00</updated><title type='text'>Cutter Radius Compensation</title><content type='html'>I do a lot of milling in my home shop with my CNC Bridgeport mill. This machine has a Centroid M40 control on it that works pretty well. It has a feature called 'cutter radius compensation' in it that is standard on most modern controls. This allows for variations in cutter size or cutting conditions such that the machine operator (me) can make the toolpath run closer or further from the part profile. Cutter radius compensation is a subject that is covered pretty well in cnc programming textbooks, so I won't get into it much here, except to mention a few things about programming to 'part profile' or programming to 'cutter centerline'. Over 20  years ago, I was taught to program a part to 'part profile' like this, when using cutter radius comp:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-667u11ZIlEM/TdklveUacmI/AAAAAAAAAHs/ZMAr-Qp4ySs/s1600/crc_2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 130px;" src="http://3.bp.blogspot.com/-667u11ZIlEM/TdklveUacmI/AAAAAAAAAHs/ZMAr-Qp4ySs/s320/crc_2.png" alt="" id="BLOGGER_PHOTO_ID_5609556308389425762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-oPKF6a9UbdE/TdklvSG9ODI/AAAAAAAAAHk/98kG6v6WPc0/s1600/crc_1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 209px;" src="http://2.bp.blogspot.com/-oPKF6a9UbdE/TdklvSG9ODI/AAAAAAAAAHk/98kG6v6WPc0/s320/crc_1.png" alt="" id="BLOGGER_PHOTO_ID_5609556305111758898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Using this method, it's easy to look at a blueprint and just write the program by hand. You can just enter the end points and center points of lines and radius' and add a G41 (or G42) to your code. Once the program is done,it's pretty intuitive to change the diameter value in the control to the actual diameter of the cutter and get a reasonable part milled. If your end mill is .499 inches in diameter, just enter that as the D value in your control. If you want to make the part a bit bigger all around, enter the value as .501 and 'trick' the control into moving the path away from the part profile. With just a little simple math, done in your head, it's easy to manipulate the size of the part.&lt;br /&gt;&lt;br /&gt;After moving across the country, to the west coast, I was taught a different way of using cutter radius compensation. A part programmer can use a CAM system to make the cutter path the radius value of the cutter away from the part profile and then use very small values in the D value of the control to manipulate the size of the part.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-CafyOkhj3Ow/TdknyATRkBI/AAAAAAAAAH8/g9INYUW8wvM/s1600/crc_4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 228px;" src="http://1.bp.blogspot.com/-CafyOkhj3Ow/TdknyATRkBI/AAAAAAAAAH8/g9INYUW8wvM/s320/crc_4.png" alt="" id="BLOGGER_PHOTO_ID_5609558550894448658" border="0" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-8K5ojzGmFLA/Tdknx4HOGHI/AAAAAAAAAH0/8rRE8xOrZs0/s1600/crc_3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 171px;" src="http://1.bp.blogspot.com/-8K5ojzGmFLA/Tdknx4HOGHI/AAAAAAAAAH0/8rRE8xOrZs0/s320/crc_3.png" alt="" id="BLOGGER_PHOTO_ID_5609558548696406130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The cutter value can be .000" to be 'on the line' and you can change it by .001" or -.001" to manipulate the part profile.&lt;br /&gt;I guess you could call this the 'West Coast' method. Nowadays, I am using this method with my home shop mill. I've just gotten used to it. I'm using my Centroid post processor with HeeksCNC and things work well for this. In the post, there is a bit of code that adds a lead in line to the roll on radius. This is needed to give the control a bit of distance to move the cutter before it reaches an arc, while doing the cutter compensation. If I don't have a straight line on the first line of a crc move, the control gives an error. It works the same way on the lead out line just after the roll off radius. I don't think EMC2 works this way- I think you can start with a roll on radius with a crc command, without getting an error. This seems to be an exception in the cnc control world though. Most commercial controls expect a straight line.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-5157776858286074404?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/5157776858286074404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/05/cutter-radius-compensation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5157776858286074404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5157776858286074404'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2011/05/cutter-radius-compensation.html' title='Cutter Radius Compensation'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-667u11ZIlEM/TdklveUacmI/AAAAAAAAAHs/ZMAr-Qp4ySs/s72-c/crc_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-2010771242764677752</id><published>2010-11-05T13:53:00.001-07:00</published><updated>2010-11-06T08:59:46.829-07:00</updated><title type='text'>Creating Cross Sections of Parts in HeeksPython</title><content type='html'>Ok, I worked out a scheme for creating a cross sectional view of a simple assembly in HeeksPython. I altered my dxf_to_heekspython script slightly to let the sketches have unique IDs. Then it's possible to create objects out of them and do CSG operations to the unique objects.&lt;br /&gt;Here is a sample script:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;import HeeksPython as cad&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;import sys&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;sys.path.insert(0,'/home/dan/heeks/heekspython2/examples')&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;import dxf_to_heekspython&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;from math import pi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;a1 = 90*(pi/180)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;units = 25.4 #inch units&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cad.setcolor(255,255,255)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;r1='/home/dan/Documents/drawings/revolve1.dxf'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = "cad.setcolor(0,0,0)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = dxf_to_heekspython.gen_heekspython_entities(r1,1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = part1 +"cad.scale(sketch1,0,0,0,units)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = part1 +"cad.setcolor(255,255,255)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = part1 +"cad.revolve(sketch1,360)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part1 = part1 +"cup = cad.getlastobj()\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;exec(part1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cad.setcolor(0,255,0)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;r2='/home/dan/Documents/drawings/revolve2.dxf'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = "cad.setcolor(0,0,0)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = dxf_to_heekspython.gen_heekspython_entities(r2,2)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = part2 +"cad.scale(sketch2,0,0,0,units)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = part2 +"cad.setcolor(0,255,0)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = part2 +"cad.revolve(sketch2,360)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;part2 = part2 +"sleeve = cad.getlastobj()\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;exec(part2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cad.view_extents()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;c1= '/home/dan/Documents/drawings/cutaway.dxf'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cut = dxf_to_heekspython.gen_heekspython_entities(c1,3)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cut = cut + "cad.scale(sketch3,0,0,0,units)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cut = cut + "cad.revolve(sketch3,90)\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cut = cut + "cutter = cad.getlastobj()\n"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cut = cut + "cad.rotate(cutter,0,0,0,1,0,0,a1)"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;exec(cut)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cad.cut(cup,cutter)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;cad.cut(sleeve,cutter)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;/span&gt;&lt;br /&gt;Here is the assembly:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRvy0L36XI/AAAAAAAAAG0/CXQKT0gCTHM/s1600/cross_section.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRvy0L36XI/AAAAAAAAAG0/CXQKT0gCTHM/s320/cross_section.png" alt="" id="BLOGGER_PHOTO_ID_5536172760737769842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Just prior to importing these dxf files into HeeksPython I had also added fillets to all the corners in &lt;a href="http://www.caduntu.org/"&gt;Caduntu&lt;/a&gt; (yes, this works well now Ries!). So now I can work in my favorite 2D CAD program and my favorite 3D CADCAM program to create assemblies with python.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRzwSGtJGI/AAAAAAAAAG8/6gzaBLJGCog/s1600/caduntu1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRzwSGtJGI/AAAAAAAAAG8/6gzaBLJGCog/s320/caduntu1.png" alt="" id="BLOGGER_PHOTO_ID_5536177115276059746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's easy to alter the design of the parts in this assembly by simply changing them in the dxf files:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TNV23SJYWTI/AAAAAAAAAHE/Pd_lQvBT5WY/s1600/caduntu.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TNV23SJYWTI/AAAAAAAAAHE/Pd_lQvBT5WY/s320/caduntu.png" alt="" id="BLOGGER_PHOTO_ID_5536462009057958194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then re run the python script in HeeksPython:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TNV3DzH5CBI/AAAAAAAAAHM/XoD-AYA9Bf4/s1600/assembly.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TNV3DzH5CBI/AAAAAAAAAHM/XoD-AYA9Bf4/s320/assembly.png" alt="" id="BLOGGER_PHOTO_ID_5536462224068511762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One major improvement that I would like to do is to make the dxf_to_heekspython script deal with layers. Then I could do all the dxf editing in one file in Caduntu.&lt;br /&gt;As I learn more about C++ programming, I might be able to utilize the functions in dxf.cpp from HeeksCAD itself. Importing would run much faster and I could take advantage of the things that already work well, like layers and importing polylines (which isn't currently implemented in the python script).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-2010771242764677752?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/2010771242764677752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/11/creating-cross-sections-of-parts-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2010771242764677752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2010771242764677752'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/11/creating-cross-sections-of-parts-in.html' title='Creating Cross Sections of Parts in HeeksPython'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ibFNuVmitWA/TNRvy0L36XI/AAAAAAAAAG0/CXQKT0gCTHM/s72-c/cross_section.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-6335574267308165424</id><published>2010-11-05T10:50:00.000-07:00</published><updated>2010-11-05T12:02:33.078-07:00</updated><title type='text'>More DXF to HeeksPython Experiments</title><content type='html'>I created a python script to import a dxf file into HeeksPython, using parts of Doug Blanding's excellent python program 'Cadvas'.  Doug and I have emailed back and forth over the years and he is happy to see his creation used for different things. He's not supporting it anymore, but in it's present state, it's a very good program to study. It's very simple and well laid out.&lt;br /&gt;Included with Cadvas is the dxf.py module. I have copied some of it and altered it to suite my needs for dxf to heekspython conversion and uploaded the script into the /examples directory in the HeeksPython project. This script is called dxf_to_heekspython.py. Here are two profiles created in Qcad, that I want to manipulate in HeeksPython:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TNRULu7tOXI/AAAAAAAAAGk/LP3qApyg56w/s1600/revolve1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TNRULu7tOXI/AAAAAAAAAGk/LP3qApyg56w/s200/revolve1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5536142402498935154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRUTAz-E1I/AAAAAAAAAGs/cKxoFOESzTw/s1600/revolve2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TNRUTAz-E1I/AAAAAAAAAGs/cKxoFOESzTw/s200/revolve2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5536142527557407570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a script to bring them into HeeksPython as separate revolved solid parts:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;import HeeksPython as cad&lt;br /&gt;import sys&lt;br /&gt;sys.path.insert(0,'/home/dan/heeks/heekspython2/examples')&lt;br /&gt;import dxf_to_heekspython&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;units = 25.4 #inch units&lt;br /&gt;cad.setcolor(255,255,255)&lt;br /&gt;r1='/home/dan/Documents/drawings/revolve1.dxf'&lt;br /&gt;part1 = "cad.setcolor(0,0,0)\n"&lt;br /&gt;part1 = dxf_to_heekspython.gen_heekspython_entities(r1)&lt;br /&gt;part1 = part1 +"cad.scale(sketch,0,0,0,units)\n"&lt;br /&gt;part1 = part1 +"cad.setcolor(255,255,255)\n"&lt;br /&gt;part1 = part1 +"cad.revolve(sketch,360)"&lt;br /&gt;exec(part1)&lt;br /&gt;cad.setcolor(0,255,0)&lt;br /&gt;r2='/home/dan/Documents/drawings/revolve2.dxf'&lt;br /&gt;part2 = "cad.setcolor(0,0,0)\n"&lt;br /&gt;part2 = dxf_to_heekspython.gen_heekspython_entities(r2)&lt;br /&gt;part2 = part2 +"cad.scale(sketch,0,0,0,units)\n"&lt;br /&gt;part2 = part2 +"cad.setcolor(0,255,0)\n"&lt;br /&gt;part2 = part2 +"cad.revolve(sketch,360)\n"&lt;br /&gt;part2 = part2 +"p1 = cad.getlastobj()\n"&lt;br /&gt;exec(part2)&lt;br /&gt;&lt;br /&gt;cad.view_extents()&lt;/span&gt;&lt;br /&gt;Here is a screenshot of the resulting parts generated with this script:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TNRQxLjF5fI/AAAAAAAAAF8/i1cD3Ld4JGU/s1600/dxf_to_heekspython.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TNRQxLjF5fI/AAAAAAAAAF8/i1cD3Ld4JGU/s320/dxf_to_heekspython.png" alt="" id="BLOGGER_PHOTO_ID_5536138647788971506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The advantage of using this dxf_to_heekspython is that the dxf entities can be manipulated/transformed as they are brought in. I have some things that I would like to do with some dxf files - create solids by revolving them around the X axis. Eventually I will create cutaway views using this technique.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-6335574267308165424?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/6335574267308165424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/11/more-dxf-to-heekspython-experiments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6335574267308165424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6335574267308165424'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/11/more-dxf-to-heekspython-experiments.html' title='More DXF to HeeksPython Experiments'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ibFNuVmitWA/TNRULu7tOXI/AAAAAAAAAGk/LP3qApyg56w/s72-c/revolve1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-5571823785618164642</id><published>2010-10-29T09:35:00.000-07:00</published><updated>2010-11-06T08:57:33.371-07:00</updated><title type='text'></title><content type='html'>Well, it's been quite a long since I posted anything (obviously). I've been busy trying to learn a bit of C++ coding, in my quest to learn the ins and outs of HeeksCAD,HeeksCNC, and HeeksPython.&lt;br /&gt;I am mostly doing the 'learn by example' route, plus a few good tutorials, books, and some very helpful advice from Dan Heeks himself. If I get into a bind, he usually can point to some example code that helps me understand things.&lt;br /&gt;I have been able to add quite a few new functions to HeeksPython and a few things to HeeksCAD itself. HeeksPython is fun to add functions to, because there is a lot of 'low hanging fruit' so to speak. It's pretty easy to add a python binding to HeeksCAD, if there is already a C++ function in /interface/HeeksCADInterface.cpp . I started out by copying jonpry's existing functions ('NewArc', 'NewLine' etc). As I have gotten a little more experience, I have gotten more adventurous and added functions for deriving point data from the GraphicsCanvas itself. I also found a way of adding fillets to pairs of 2D lines. Over the last month, I have added ways of creating a new coordinate system,returning the parameters of coordinate systems,text,and a way of importing dxf files from python.&lt;br /&gt;The HeeksPython function 'importdxf' is exiting for me because I have plans for creating solids quickly with the aid of other 2D cad programs like caduntu , qcad, or even true-type-tracer-dxf. Having HeeksPython loaded with functionality will help automate the design process somewhat.&lt;br /&gt;Here is an example of a script that uses &lt;a href="http://www.timeguy.com/cradek/truetype"&gt;true-type-tracer-dxf &lt;/a&gt;to create some text on the HeeksCAD graphics screen:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; color: rgb(51, 102, 255);"&gt;import os&lt;br /&gt;import HeeksPython as cad&lt;br /&gt;&lt;br /&gt;path = '''/home/dan/Documents/drawings/ttt/'''&lt;br /&gt;program = '''truetype-tracer-dxf'''&lt;br /&gt;phrase = ''' \' this is a test \' '''&lt;br /&gt;pipe = '''  &gt;  '''&lt;br /&gt;file = '''aphrase.dxf'''&lt;br /&gt;&lt;br /&gt;out = program + phrase + pipe + path + file&lt;br /&gt;os.system(out)&lt;br /&gt;&lt;br /&gt;f = path + file&lt;br /&gt;&lt;br /&gt;cad.importdxf(f)&lt;br /&gt;cad.view_extents()&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-5571823785618164642?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/5571823785618164642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/10/well-its-been-quite-long-since-i-posted.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5571823785618164642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/5571823785618164642'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/10/well-its-been-quite-long-since-i-posted.html' title=''/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-2557664732791719371</id><published>2010-07-04T09:56:00.000-07:00</published><updated>2010-07-05T16:01:56.438-07:00</updated><title type='text'>HeeksCNC + python == APT360</title><content type='html'>One of my favorite CNC programming languages is APT360. It's a totally parametric way of creating gcode for cnc machines. It's also not very user friendly, if you don't use it all the time and get rusty, like I do. I'm a big fan of parametric programming and also a big fan of the python programming language. It's fairly easy for a non programming like me to get into and it's very popular, so there are many resources on the web for it.&lt;br /&gt;In one of my previous blog entries, I mentioned that HeeksCNC uses python as the underlying scripting between the main C++ code and the post processed g-code. This week, Dan Heeks introduced a blank scipting object in HeeksCNC that lets the user create scripts in python and retain them in the order wanted in the HeeksCAD file. 'New Script Operation', as it's named in the HeeksCNC machining menu let's you do anything that you can think of in python and insert it into the Heeks python output. &lt;br /&gt;As soon as I got my hands on the source code and compiled it, I started playing with parametric holes and helix operations. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TDC-z4SLwsI/AAAAAAAAAFc/oJlfEuWw2vg/s1600/helix_script1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TDC-z4SLwsI/AAAAAAAAAFc/oJlfEuWw2vg/s320/helix_script1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490097744255894210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a small and very limited script for creating a helix in gcode:&lt;br /&gt;&lt;br /&gt;def helix(x_cen,y_cen,z_depth,dia,pitch,z_clear):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r=dia/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flush_nc()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rapid(x=x_cen,y=y_cen)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rapid(z=z_clear)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;feed(z=z_depth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;feed(x=(x_cen+r))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (z_depth &lt; z_clear):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arc_ccw(x=(x_cen-r),y=y_cen,z=(z_depth+pitch*.5),i=-r,j=0)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arc_ccw(x=(x_cen+r),y=y_cen,z=(z_depth+pitch),i=r,j=0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z_depth= z_depth+pitch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;feed(x=(x_cen))&lt;br /&gt;&lt;br /&gt;d=.25&lt;br /&gt;p=.125&lt;br /&gt;zclr=.1&lt;br /&gt;zdepth=-1.0&lt;br /&gt;helix(.5,.5,zdepth,d,p,zclr)&lt;br /&gt;helix(5.5,.5,zdepth,d,p,zclr)&lt;br /&gt;helix(5.5,3.5,zdepth,d,p,zclr)&lt;br /&gt;helix(.5,3.5,zdepth,d,p,zclr)&lt;br /&gt;&lt;br /&gt;This snippet of code doesn't take into account anything having to do with tool radius/diameter. &lt;br /&gt;&lt;br /&gt;Here you can see that I mixed script ops and a regular profile machining op:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TDC_yxsqXVI/AAAAAAAAAFk/yvBuq2ZlXYw/s1600/python_equals_APT1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TDC_yxsqXVI/AAAAAAAAAFk/yvBuq2ZlXYw/s320/python_equals_APT1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490098824819662162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fun stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-2557664732791719371?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/2557664732791719371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/07/heekscnc-python-apt360.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2557664732791719371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2557664732791719371'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/07/heekscnc-python-apt360.html' title='HeeksCNC + python == APT360'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ibFNuVmitWA/TDC-z4SLwsI/AAAAAAAAAFc/oJlfEuWw2vg/s72-c/helix_script1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-6347652328204359778</id><published>2010-06-20T10:35:00.000-07:00</published><updated>2010-06-20T11:04:40.029-07:00</updated><title type='text'>Drag and Drop in HeeksCAD</title><content type='html'>Yesterday, several of us were chatting with Dan Heeks on #cam in irc and someone asked him if he could add 'drag and drop' capabilities to HeeksCAD. This would make it much easier to put objects and operations in order for machining. &lt;br /&gt;Dan went ahead and programmed this up today and it is great.&lt;br /&gt;Now it is very easy to create sketches, copy them, and then paste them into different machining operations- and then put them in a logical machining order. It is also much easier to re-order sketches to one's own liking.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TB5Tq095zMI/AAAAAAAAAEk/8xggH2MMP0Y/s1600/drag_and_drop1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 320px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TB5Tq095zMI/AAAAAAAAAEk/8xggH2MMP0Y/s320/drag_and_drop1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484913391421738178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, it is very easy to reorder the sketches in the 'Objects' panel any way that you want.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TB5VXl0OqMI/AAAAAAAAAE0/rbTbir2LCIA/s1600/drag_and_drop3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TB5VXl0OqMI/AAAAAAAAAE0/rbTbir2LCIA/s320/drag_and_drop3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484915259960371394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's what I tried and was very pleased with:&lt;br /&gt;&lt;br /&gt;I created a profile operation with one of the sketches.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5VXKFZ97I/AAAAAAAAAEs/1erAaXhznwY/s1600/drag_and_drop2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 320px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5VXKFZ97I/AAAAAAAAAEs/1erAaXhznwY/s320/drag_and_drop2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484915252516222898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then copied all the other sketches and did a 'paste into' the profile operation&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TB5WOMMDwCI/AAAAAAAAAFE/bBzp7szL8H0/s1600/drag_and_drop5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 320px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TB5WOMMDwCI/AAAAAAAAAFE/bBzp7szL8H0/s320/drag_and_drop5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484916197973803042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The order that the paths are machined isn't exactly optimized:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5WNQOEbuI/AAAAAAAAAE8/IlTzDZ8SUDs/s1600/drag_and_drop4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5WNQOEbuI/AAAAAAAAAE8/IlTzDZ8SUDs/s320/drag_and_drop4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484916181876109026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So then I dragged the sketches into the right order, inside the profile operation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TB5Xlgf1N8I/AAAAAAAAAFU/5WvVZXyXM78/s1600/drag_and_drop7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 320px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TB5Xlgf1N8I/AAAAAAAAAFU/5WvVZXyXM78/s320/drag_and_drop7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484917698074064834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is what the paths look like now:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5XkmKvd9I/AAAAAAAAAFM/egv43RmlSrY/s1600/drag_and_drop6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TB5XkmKvd9I/AAAAAAAAAFM/egv43RmlSrY/s320/drag_and_drop6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5484917682416351186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Similarly, you can do the same thing with machining operations like profile,pocket,drill,etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-6347652328204359778?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/6347652328204359778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/06/drag-and-drop-in-heekscad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6347652328204359778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6347652328204359778'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/06/drag-and-drop-in-heekscad.html' title='Drag and Drop in HeeksCAD'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ibFNuVmitWA/TB5Tq095zMI/AAAAAAAAAEk/8xggH2MMP0Y/s72-c/drag_and_drop1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-58191385366126656</id><published>2010-06-05T07:04:00.000-07:00</published><updated>2010-06-05T07:45:54.393-07:00</updated><title type='text'>Programming a Scanned Logo</title><content type='html'>I am doing a job for a guy who sent me a scanned bitmap of his logo. He wants this logo engraved on a brass guitar tailpiece.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/TApaNDK-Z6I/AAAAAAAAACc/OGzXm5kjfck/s1600/blog_scanned_logo.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 254px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/TApaNDK-Z6I/AAAAAAAAACc/OGzXm5kjfck/s320/blog_scanned_logo.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5479291076885768098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wanted to try out Inkscape to make an SVG file that I could import into HeeksCNC for generating Gcode. Inkscape has a 'trace bitmap' function under the 'Path' menu that should do the job. There are also some nice CNC gcode generating plugins for Inkscape that will make code directly out of the application. I prefer to use HeeksCNC for generating the code, because I have a good post processor for my Centroid controlled mill that lets me generate code without having to do any editing to it. I also need to combine some CAD data that don't trust to Inkscape with the logo, that's going to need to be engraved too.&lt;br /&gt;&lt;br /&gt;The first thing that I did with that scanned image was open it in Gimp and crop it:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TApc6PJbpxI/AAAAAAAAACk/jIc_Tt8JoXk/s1600/campellone_scan2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 205px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TApc6PJbpxI/AAAAAAAAACk/jIc_Tt8JoXk/s320/campellone_scan2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5479294052217890578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I imported it into Inkscape, made sure that it was still selected then did this:&lt;br /&gt;1. In the top menu select 'Path'&lt;br /&gt;2. select 'Trace Bitmap'&lt;br /&gt;&lt;br /&gt;Here is the dialogue box that pops up (after I selected 'Brightness Cutoff' and 'Update'):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TApeIUeSEVI/AAAAAAAAACs/B1ZmNtV0U3A/s1600/inkscape1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 237px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TApeIUeSEVI/AAAAAAAAACs/B1ZmNtV0U3A/s320/inkscape1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479295393677316434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once you hit 'OK' in that box, the converted vector path is hiding behind the original bitmap. I always slid it out from under the bitmap to look at it because I intended on copying and pasting the path into something else later.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TApe_pjuIlI/AAAAAAAAAC0/Rex_Va21kXk/s1600/inkscape2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TApe_pjuIlI/AAAAAAAAAC0/Rex_Va21kXk/s320/inkscape2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479296344230077010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you copy and paste the vectorized path into a new Inkscape file, it can be saved as a new *.svg that Heekscad can import. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/TApgQuCY2WI/AAAAAAAAAC8/nG5M7df_uy0/s1600/double_lined_logo_in_heeks.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/TApgQuCY2WI/AAAAAAAAAC8/nG5M7df_uy0/s320/double_lined_logo_in_heeks.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479297737001851234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This looked pretty nice, but there was a problem- there were two paths all the way around the logo. I just want one nice clean path to engrave. Hmmm... it seems that the bitmap tracing looks at both edges of the black lines in the scan. I had played with 'Brightness Cutoff' and 'Edge detection' in the bitmap trace dialogue in Inkscape. 'Brightness Cutoff' seemed to give better results initially. &lt;br /&gt;I opened up the bitmap in Gimp again and tried doing a bucket fill with black. This looked ok, but the original lines were actually lighter than the bucket fill. So, I darkened the lines up a bit and then did a bucket fill.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TAph2D4d9RI/AAAAAAAAADE/6uilfvG_l3w/s1600/bucket_fill.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 270px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TAph2D4d9RI/AAAAAAAAADE/6uilfvG_l3w/s320/bucket_fill.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479299478032610578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;when I brought this back into Inkscape, I could do 'Edge detection' and get a reasonable path. It was still double paths, but they were much closer together.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TApimegGlMI/AAAAAAAAADM/vYF4wlxQ9io/s1600/better_svg_in_heeks.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TApimegGlMI/AAAAAAAAADM/vYF4wlxQ9io/s320/better_svg_in_heeks.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479300309811893442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was then able to delete the outside path (that I thought I didn't really need) and create a much more reasonable toolpath.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TApi9M6RujI/AAAAAAAAADU/DoVdouDviV4/s1600/string_bar_complete.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TApi9M6RujI/AAAAAAAAADU/DoVdouDviV4/s320/string_bar_complete.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5479300700226828850" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-58191385366126656?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/58191385366126656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/06/programming-scanned-logo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/58191385366126656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/58191385366126656'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/06/programming-scanned-logo.html' title='Programming a Scanned Logo'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ibFNuVmitWA/TApaNDK-Z6I/AAAAAAAAACc/OGzXm5kjfck/s72-c/blog_scanned_logo.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-7674593183955375187</id><published>2010-05-31T07:19:00.000-07:00</published><updated>2010-05-31T07:46:03.720-07:00</updated><title type='text'>Roughing and Sawing in the mill</title><content type='html'>I am making some brass parts on my mill that require some drilling, milling, and sawing with a jeweler's saw. I thought that this would be a good chance to try HeeksCNC out with these operations.&lt;br /&gt;HeeksCNC has some very good operations for drilling and profiling that would be handy for this, but there is nothing in the way of automatic roughing or multi pass sawing. I ended up using some other CAD tricks and HeeksCNC's python scripting to make things work. &lt;br /&gt;Here is the drawing as it imported into HeeksCAD:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TAPGstrk9oI/AAAAAAAAABc/0XegzPIPnh0/s1600/ssbar2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TAPGstrk9oI/AAAAAAAAABc/0XegzPIPnh0/s320/ssbar2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477440043291571842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The stair step shaped part is the thing that I am ultimately cutting out. On the right and left corners of it, I have added (in another CAD program) some roughing passes to cut the corners of my stock off:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/TAPHPo8ovFI/AAAAAAAAABk/OF3_-R8mIcY/s1600/ssbar_roughing.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/TAPHPo8ovFI/AAAAAAAAABk/OF3_-R8mIcY/s320/ssbar_roughing.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477440643316366418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPHaNE8tKI/AAAAAAAAABs/2bjCri2egtQ/s1600/ssbar_roughing2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPHaNE8tKI/AAAAAAAAABs/2bjCri2egtQ/s320/ssbar_roughing2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477440824813597858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The roughing actually looks like this on my Bridgeport mill:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/TAPIf0ZmpyI/AAAAAAAAAB8/4znLMMzX6uo/s1600/roughing1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/TAPIf0ZmpyI/AAAAAAAAAB8/4znLMMzX6uo/s320/roughing1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477442020780189474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/TAPIgLpbivI/AAAAAAAAACE/Hn1NcvvEC2s/s1600/roughing2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/TAPIgLpbivI/AAAAAAAAACE/Hn1NcvvEC2s/s320/roughing2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477442027020585714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also needed to saw some slits in the sides of the part. I wanted to do the sawing with 4 passes of the saw blade on each side. I used my CAD program to offset the final saw path back half the diameter of the saw blade and then offset it 3 additional times by .050".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPJu6tJciI/AAAAAAAAACM/v_JcUsaZ2_g/s1600/ssbar_sawing1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPJu6tJciI/AAAAAAAAACM/v_JcUsaZ2_g/s320/ssbar_sawing1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5477443379682439714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Obviously, it's critical not to retract the saw blade in the Z axes at the wrong time,and I wanted to keep the saw blade down at the right Z level while doing these passes, so I needed to do something to avoid using HeeksCNC's usual profiling method of doing a path, retracting in Z and then doing the next path. I resorted to some Python scripting tricks. &lt;br /&gt;1. I selected the lines that I had drawn in CAD for sawing in HeeksCNC and generated a Profile operation with them. This allowed me to extract the geometric points that I needed.&lt;br /&gt;2. I copied the python script from HeeksCNC and pasted it into my favorite text editor.&lt;br /&gt;3. The script was easy to understand and manipulate- I just wanted a series of 'feed' and 'rapid' in the right spots.I didn't use any loops, because I was lazy....&lt;br /&gt;&lt;br /&gt;Here is my sawing script:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;comment('tool change to 2.755 saw')&lt;br /&gt;tool_change( id=4)&lt;br /&gt;spindle(300)&lt;br /&gt;feedrate_hv(15, 6)&lt;br /&gt;flush_nc()&lt;br /&gt;clearance = float(0.5)&lt;br /&gt;rapid_down_to_height = float(0.07874015748)&lt;br /&gt;start_depth = float(0)&lt;br /&gt;step_down = float(0.156)&lt;br /&gt;final_depth = float(-0.156)&lt;br /&gt;tool_diameter = float(2.755)&lt;br /&gt;&lt;br /&gt;rapid(z=0.1968503937)&lt;br /&gt;rapid(x=6.218827292, y=-1.060352717)&lt;br /&gt;rapid(z=0.07874015748)&lt;br /&gt;feed(z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('pass1')&lt;br /&gt;feed(x=6.076573626, y=-1.200936811, z=-0.156)&lt;br /&gt;feed(x=4.101644628, y=0.7974459866, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('Rapid Away')&lt;br /&gt;rapid(x=4.266169148, y=0.9154947677)&lt;br /&gt;rapid(x=6.218827292, y=-1.060352717)&lt;br /&gt;&lt;br /&gt;comment('pass2')&lt;br /&gt;feed(x=5.994311367, y=-1.25996122, z=-0.156)&lt;br /&gt;feed(x=4.019382367, y=0.7384215961, z=-0.156)&lt;br /&gt;comment('Rapid Away')&lt;br /&gt;rapid(x=4.266169148, y=0.9154947677)&lt;br /&gt;rapid(x=6.218827292, y=-1.060352717)&lt;br /&gt;&lt;br /&gt;comment('pass3')&lt;br /&gt;feed(x=5.912049106, y=-1.31898563, z=-0.156)&lt;br /&gt;feed(x=3.937120107, y=0.6793972059, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('Rapid Away')&lt;br /&gt;rapid(x=4.266169148, y=0.9154947677)&lt;br /&gt;rapid(x=6.218827292, y=-1.060352717)&lt;br /&gt;&lt;br /&gt;comment('pass4')&lt;br /&gt;feed(x=5.829786846, y=-1.37801, z=-0.156)&lt;br /&gt;feed(x=3.854857847, y=0.6203728154, z=-0.156)&lt;br /&gt;comment('Rapid Away')&lt;br /&gt;rapid(x=4.266169148, y=0.9154947677)&lt;br /&gt;rapid(z=0.1968503937)&lt;br /&gt;&lt;br /&gt;comment('rapid_left')&lt;br /&gt;rapid(z=0.5)&lt;br /&gt;rapid(x=-2.953405945, y=0.07385377598)&lt;br /&gt;rapid(z=0.07874015748)&lt;br /&gt;feed(z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('pass1_left')&lt;br /&gt;feed(x=-2.787292165, y=0.1930428677, z=-0.156)&lt;br /&gt;feed(x=-1.668332953, y=-2.357971772, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('rapid away')&lt;br /&gt;rapid(x=-1.834446732, y=-2.477160866)&lt;br /&gt;rapid(x=-2.953405945, y=0.07385377598)&lt;br /&gt;&lt;br /&gt;comment('pass2_left')&lt;br /&gt;feed(x=-2.704235276, y=0.2526374134, z=-0.156)&lt;br /&gt;feed(x=-1.585276063, y=-2.298377244, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('rapid away')&lt;br /&gt;rapid(x=-1.834446732, y=-2.477160866)&lt;br /&gt;rapid(x=-2.953405945, y=0.07385377598)&lt;br /&gt;&lt;br /&gt;comment('pass3_left')&lt;br /&gt;feed(x=-2.621178386, y=0.3122319591, z=-0.156)&lt;br /&gt;feed(x=-1.502219173, y=-2.238782677, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('rapid away')&lt;br /&gt;rapid(x=-1.834446732, y=-2.477160866)&lt;br /&gt;rapid(x=-2.953405945, y=0.07385377598)&lt;br /&gt;&lt;br /&gt;comment('pass4_left')&lt;br /&gt;feed(x=-2.538121535, y=0.3718265047, z=-0.156)&lt;br /&gt;feed(x=-1.419162283, y=-2.17918815, z=-0.156)&lt;br /&gt;&lt;br /&gt;comment('rapid away')&lt;br /&gt;rapid(x=-1.834446732, y=-2.477160866)&lt;br /&gt;rapid(x=-2.953405945, y=0.07385377598)&lt;br /&gt;rapid(z=.5)&lt;br /&gt;&lt;br /&gt;program_end()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is what things looked like on the milling machine:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPLdW8H72I/AAAAAAAAACU/-fbbIqjBFtM/s1600/sawing1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/TAPLdW8H72I/AAAAAAAAACU/-fbbIqjBFtM/s320/sawing1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477445277047058274" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-7674593183955375187?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/7674593183955375187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/roughing-and-sawing-in-mill.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/7674593183955375187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/7674593183955375187'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/roughing-and-sawing-in-mill.html' title='Roughing and Sawing in the mill'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ibFNuVmitWA/TAPGstrk9oI/AAAAAAAAABc/0XegzPIPnh0/s72-c/ssbar2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-3384681021766822457</id><published>2010-05-21T10:19:00.000-07:00</published><updated>2010-05-25T21:22:06.779-07:00</updated><title type='text'>Engraving an award plaque</title><content type='html'>A friend of from Boy Scouts emailed me this week and asked if I could make an award plaque for her son to present this coming week. I've done plenty of plaques before, but mostly by using closed source software to generate the code. Today, I thought I would try out some of my favorite tools to get the job done-HeeksCNC,QCAD, and cxf2cnc.py.&lt;br /&gt;&lt;br /&gt;cxf2cnc.py that can be found here:&lt;br /&gt;&lt;a href="http://code.google.com/p/osengut/downloads/list"&gt;cxf2cnc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-This code used to be located on fenn's server, but it seems to be down now. I just put a copy up on google to preserve it.&lt;br /&gt;&lt;br /&gt;Anyway, to use this python script you need to edit a string inside the script itself (I know- that's not very user friendly, but that's the way it is for now). There are a few variables to play with and viola! you can run the script like this:  &lt;br /&gt;&lt;br /&gt;python cxf2cnc.py &gt; output_file_name.ngc&lt;br /&gt;&lt;br /&gt;I created a border and 'fluer di le' in Qcad and imported it into HeeksCAD:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/S_bGVF7nn0I/AAAAAAAAABM/402Ya_oQB4A/s1600/engraving2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/S_bGVF7nn0I/AAAAAAAAABM/402Ya_oQB4A/s320/engraving2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5473780462787206978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I opened up the output_file_name.ngc file in gedit and then pasted in the code created in HeeksCNC. Here it is in emc2/axis:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ibFNuVmitWA/S_bFcxPcXcI/AAAAAAAAABE/uxgrQsyrboM/s1600/engraving.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_ibFNuVmitWA/S_bFcxPcXcI/AAAAAAAAABE/uxgrQsyrboM/s320/engraving.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5473779495160536514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is a finished piece, mounted to a nice mahogany board:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/S_yhoc77uqI/AAAAAAAAABU/U5VcMgdI5yM/s1600/finished.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/S_yhoc77uqI/AAAAAAAAABU/U5VcMgdI5yM/s320/finished.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5475428963310090914" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-3384681021766822457?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/3384681021766822457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/friend-of-from-boy-scouts-emailed-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/3384681021766822457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/3384681021766822457'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/friend-of-from-boy-scouts-emailed-me.html' title='Engraving an award plaque'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ibFNuVmitWA/S_bGVF7nn0I/AAAAAAAAABM/402Ya_oQB4A/s72-c/engraving2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-2235954978882395785</id><published>2010-05-20T12:24:00.000-07:00</published><updated>2010-05-20T12:52:30.684-07:00</updated><title type='text'>Running Python Scripts with the 'Program' Window</title><content type='html'>HeeksCNC has a unique feature that I really like: all operations create python code that gets processed to make G-code. In the 'Window' menu check the 'Program' option. While you are creating operations and G-code, look at what is happening in the 'Program' window.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/S_WNbjv_ZxI/AAAAAAAAAA0/BicQRpz5nU0/s1600/program_window1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/S_WNbjv_ZxI/AAAAAAAAAA0/BicQRpz5nU0/s320/program_window1.png" alt="" id="BLOGGER_PHOTO_ID_5473436426731218706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can manipulate the python code in the Program window to do all sorts of interesting things. I think that this feature in HeeksCNC gives it a lot of power, similar to APT360. I am very familiar with APT programming and like it a lot, but I really prefer python and the HeeksCNC approach.&lt;br /&gt;&lt;br /&gt;The code from the Program window can be edited and used in the window itself. Simply edit the code and then press the 'Py+Go' (Run Python Script) button. Don't just press the 'Go' button, because it will populate the Program window with the normal python code that comes from the operations in HeeksCNC.&lt;br /&gt;&lt;br /&gt;You can also copy and edit the python code in your favorite text editor, if you like. I do that because it's what I am familiar with.&lt;br /&gt;&lt;br /&gt;The python code can also be run in a stand alone mode- outside of HeeksCNC, if you are careful to fix up any path problems. I sometimes run the python scripts this way, if I have my geometry set and just want to try different variables out with the code, ie different depths of cut.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One simple thing that you can do with the code is to use an operation over and over again with different size tool diameters or different depths. 'if' or 'while' loops make this sort of thing pretty easy to deal with.&lt;br /&gt;In the next screen shot, I took the kurve_funcs.py module and copied/edited it and saved it as rough_funcs.py (I commented out #rapid(z = mat_depth + incremental_rapid_height) on line 229). I simply wanted to keep the tool down in the work for my next trick:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/S_WPdA2jA3I/AAAAAAAAAA8/QVrRNYWTo8o/s1600/program_window2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 230px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/S_WPdA2jA3I/AAAAAAAAAA8/QVrRNYWTo8o/s320/program_window2.png" alt="" id="BLOGGER_PHOTO_ID_5473438650746471282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is my python code that I pasted into the Program window:&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;sys.path.insert(0,'/usr/local/lib/heekscnc/')&lt;br /&gt;sys.path.insert(0,'/usr/local/lib/heekscnc')&lt;br /&gt;import math&lt;br /&gt;import kurve&lt;br /&gt;import rough_funcs&lt;br /&gt;from nc.nc import *&lt;br /&gt;import nc.centroid1&lt;br /&gt;&lt;br /&gt;output('/tmp/test.tap')&lt;br /&gt;program_begin(123, 'Test program')&lt;br /&gt;absolute()&lt;br /&gt;imperial()&lt;br /&gt;set_plane(0)&lt;br /&gt;&lt;br /&gt;#(1/8 inch HSS Centre Drill Bit)&lt;br /&gt;tool_defn( id=1, name='1/8 inch HSS Centre Drill Bit', radius=0.0625, length=0.94)&lt;br /&gt;#(3/16 inch HSS Drill Bit)&lt;br /&gt;tool_defn( id=2, name='3/16 inch HSS Drill Bit', radius=0.09375, length=5)&lt;br /&gt;#(#31 HSS Drill Bit)&lt;br /&gt;tool_defn( id=3, name='#31 HSS Drill Bit', radius=0.06, length=5)&lt;br /&gt;#(#28 HSS Drill Bit)&lt;br /&gt;tool_defn( id=4, name='#28 HSS Drill Bit', radius=0.07, length=0.7)&lt;br /&gt;#(1/8 inch HSS End Mill)&lt;br /&gt;tool_defn( id=5, name='1/8 inch HSS End Mill', radius=0.0625, length=2.5)&lt;br /&gt;#(1/16 inch Carbide End Mill)&lt;br /&gt;tool_defn( id=6, name='1/16 inch Carbide End Mill', radius=0.03125, length=0.3125)&lt;br /&gt;#(#21 HSS Drill Bit)&lt;br /&gt;tool_defn( id=7, name='#21 HSS Drill Bit', radius=0.0795, length=5)&lt;br /&gt;#(engraving cutter)&lt;br /&gt;tool_defn( id=20, name='engraving cutter', radius=0.0625, length=0.625)&lt;br /&gt;comment('G54')&lt;br /&gt;workplane(1)&lt;br /&gt;comment('tool change to 1/8 inch HSS End Mill')&lt;br /&gt;tool_change( id=5)&lt;br /&gt;spindle(7000)&lt;br /&gt;feedrate_hv(33.07086614, 3.937007874)&lt;br /&gt;flush_nc()&lt;br /&gt;clearance = float(0.1968503937)&lt;br /&gt;rapid_down_to_height = float(0.07874015748)&lt;br /&gt;start_depth = float(0)&lt;br /&gt;step_down = float(0.25)&lt;br /&gt;final_depth = float(-0.25)&lt;br /&gt;roll_on = 'auto'&lt;br /&gt;roll_off = 'auto'&lt;br /&gt;tag = None&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;roll_radius = float(0)&lt;br /&gt;offset_extra = 0&lt;br /&gt;comment('Sketch')&lt;br /&gt;k1 = kurve.new()&lt;br /&gt;kurve.add_point(k1, 0, -1.732283465, -0.7086614173, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k1, 0, 0.157480315, 0.9448818898, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k1, -1, 0.4724409449, 1.062992126, 0.4718257874, 0.5856299213)&lt;br /&gt;kurve.add_point(k1, 0, 1.417322835, 1.102362205, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k1, -1, 1.732283465, 0.9448818898, 1.432465172, 0.7389460933)&lt;br /&gt;kurve.add_point(k1, 0, 2.125984252, 0.07874015748, 0.0, 0.0)&lt;br /&gt;&lt;br /&gt;k2 = kurve.new()&lt;br /&gt;kurve.add_point(k2, 0, 2.125984252, 0.07874015748, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k2, 0, 1.732283465, 0.9448818898, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k2, 1, 1.417322835, 1.102362205, 1.432465172, 0.7389460933)&lt;br /&gt;kurve.add_point(k2, 0, 0.4724409449, 1.062992126, 0.0, 0.0)&lt;br /&gt;kurve.add_point(k2, 1, 0.157480315, 0.9448818898, 0.4718257874, 0.5856299213)&lt;br /&gt;kurve.add_point(k2, 0, -1.732283465, -0.7086614173, 0.0, 0.0)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.75)&lt;br /&gt;rough_funcs.profile(k1, 'right', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.625)&lt;br /&gt;rough_funcs.profile(k2, 'left', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.5)&lt;br /&gt;rough_funcs.profile(k1, 'right', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.375)&lt;br /&gt;rough_funcs.profile(k2, 'left', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.25)&lt;br /&gt;rough_funcs.profile(k1, 'right', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;tool_diameter = float(0.125)&lt;br /&gt;rough_funcs.profile(k2, 'left', tool_diameter/2, offset_extra, roll_radius, roll_on, roll_off, tag, rapid_down_to_height, start_depth, step_down, final_depth)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;rapid(z = clearance)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;program_end()&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-2235954978882395785?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/2235954978882395785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/running-python-scripts-with-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2235954978882395785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2235954978882395785'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/running-python-scripts-with-program.html' title='Running Python Scripts with the &apos;Program&apos; Window'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ibFNuVmitWA/S_WNbjv_ZxI/AAAAAAAAAA0/BicQRpz5nU0/s72-c/program_window1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-1894428143367013956</id><published>2010-05-16T08:21:00.000-07:00</published><updated>2010-05-16T08:42:55.688-07:00</updated><title type='text'>Tooltable in HeeksCNC</title><content type='html'>HeeksCNC has a nice tooltable feature in the Objects Tree. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ibFNuVmitWA/S_AOsDYMOdI/AAAAAAAAAAc/VxJKWa4S9KE/s1600/tooltable.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 231px; height: 320px;" src="http://3.bp.blogspot.com/_ibFNuVmitWA/S_AOsDYMOdI/AAAAAAAAAAc/VxJKWa4S9KE/s320/tooltable.png" alt="" id="BLOGGER_PHOTO_ID_5471889697238956498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You can edit the tools and export the tooltable and later re import it. I set up a default tool table named 'default.tooltable' that loads every time I open HeeksCNC. &lt;br /&gt;&lt;br /&gt;This tooltable corresponds to the tools that I actually have loaded in my milling machine (or the values for the height offsets I have stored in it, since I don't have an automatic tool changer).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/S_AOsQx5hlI/AAAAAAAAAAk/JBUk5HNeBAE/s1600/touch+off+tools.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 229px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/S_AOsQx5hlI/AAAAAAAAAAk/JBUk5HNeBAE/s320/touch+off+tools.png" alt="" id="BLOGGER_PHOTO_ID_5471889700836443730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is my tool changing 'carousel':&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/S_AR0OSTTuI/AAAAAAAAAAs/jkGArSYDekM/s1600/tools.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/S_AR0OSTTuI/AAAAAAAAAAs/jkGArSYDekM/s320/tools.png" alt="" id="BLOGGER_PHOTO_ID_5471893136140881634" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-1894428143367013956?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/1894428143367013956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/tooltable-in-heekscnc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1894428143367013956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1894428143367013956'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/tooltable-in-heekscnc.html' title='Tooltable in HeeksCNC'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ibFNuVmitWA/S_AOsDYMOdI/AAAAAAAAAAc/VxJKWa4S9KE/s72-c/tooltable.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-1557919937032509548</id><published>2010-05-09T18:16:00.001-07:00</published><updated>2010-05-09T18:18:38.166-07:00</updated><title type='text'>importing into HeeksCAD</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ibFNuVmitWA/S-dee-RQn4I/AAAAAAAAAAU/w0BP5TMdyYA/s1600/tailpiece_in_heekscad.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ibFNuVmitWA/S-dee-RQn4I/AAAAAAAAAAU/w0BP5TMdyYA/s320/tailpiece_in_heekscad.png" alt="" id="BLOGGER_PHOTO_ID_5469444158669234050" border="0" /&gt;&lt;/a&gt;Qcad drawings import into HeeksCAD with no problems. In the 'Objects' panel in the upper left area, you can see that all the layers are listed. If you click on one of the layers, you will see some of it's properties and can choose to make it not visible. This is handy for working on a CNC program with HeeksCNC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-1557919937032509548?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/1557919937032509548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/importing-into-heekscad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1557919937032509548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1557919937032509548'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/importing-into-heekscad.html' title='importing into HeeksCAD'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ibFNuVmitWA/S-dee-RQn4I/AAAAAAAAAAU/w0BP5TMdyYA/s72-c/tailpiece_in_heekscad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-2395091382933909278</id><published>2010-05-09T18:11:00.000-07:00</published><updated>2010-05-09T18:15:37.685-07:00</updated><title type='text'>sketching and importing</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ibFNuVmitWA/S-deEHwMffI/AAAAAAAAAAM/qerFcRcwEuI/s1600/tailpiec_in_qcad.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ibFNuVmitWA/S-deEHwMffI/AAAAAAAAAAM/qerFcRcwEuI/s320/tailpiec_in_qcad.png" alt="" id="BLOGGER_PHOTO_ID_5469443697358437874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I'm using Qcad to do all the sketching on my latest project. I have gotten used to how Qcad works and it's not too bad. One thing that I haven't figured out is if Qcad can import other files. So far, I don't think that it can.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-2395091382933909278?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/2395091382933909278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/sketching-and-importing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2395091382933909278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/2395091382933909278'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/sketching-and-importing.html' title='sketching and importing'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ibFNuVmitWA/S-deEHwMffI/AAAAAAAAAAM/qerFcRcwEuI/s72-c/tailpiec_in_qcad.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-1492942074028673403</id><published>2010-05-08T14:50:00.001-07:00</published><updated>2010-05-08T14:54:58.028-07:00</updated><title type='text'>HeeksCNC Postprocessing</title><content type='html'>I've been working with HeeksCNC over the last few weeks on a project that I'm going to mill out of brass. Since I have a Centroid M40 control on my CNC milling machine, I need a proper postprocessor for it. On Friday, I created one and did some editing to Dan Heeks' iso_modal post. Now I think I have things the way that I want them.&lt;br /&gt;Anyone interested can look at the files here:&lt;br /&gt;http://code.google.com/p/heekscnc/source/browse/#svn/trunk/nc&lt;br /&gt;Look at centroid1.py, centroid1_read.py and machines.txt to see what I did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-1492942074028673403?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/1492942074028673403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/heekscnc-postprocessing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1492942074028673403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1492942074028673403'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/05/heekscnc-postprocessing.html' title='HeeksCNC Postprocessing'/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-6345002035276803383</id><published>2010-03-28T19:40:00.001-07:00</published><updated>2010-03-28T19:40:50.614-07:00</updated><title type='text'></title><content type='html'>Here is the url for a project that I have really gotten into over the last year:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/heekscad/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;heekscad/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This project is really separated into a series of smaller bits that can all be put together to make a total open source CADCAM solution.  HeeksCAD is the main engine for all the other libs.  You can add these other libs to make it do more:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HeeksCNC- is the main plugin to make profiling gcode&lt;br /&gt;&lt;a href="http://code.google.com/p/heekscnc/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;heekscnc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;once you install HeeksCAD and then get HeeksCNC set up as a plugin, then you can add more libs for doing pocketing, adaptive roughing, and surfacing in 3D:&lt;br /&gt;&lt;br /&gt;libarea (pocketing):&lt;br /&gt;&lt;a href="http://code.google.com/p/libarea/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;libarea/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;libactp (adaptive roughing of pockets- high speed roughing):&lt;br /&gt;&lt;a href="http://code.google.com/p/libactp/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;libactp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;opencamlib (Ander's Wallen's 3D surfacing libraries):&lt;br /&gt;&lt;a href="http://code.google.com/p/opencamlib/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;opencamlib/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;HeeksPython- let's you do some parametric design work in python&lt;br /&gt;&lt;a href="http://code.google.com/p/heekspython/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;heekspython/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;HeeksArt- this let's you do some Blender like editing of surfaces&lt;br /&gt;&lt;a href="http://code.google.com/p/heeksart/" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;heeksart/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think the genius of Dan Heek's approach was making it easy to add libraries to his main program.&lt;br /&gt;&lt;br /&gt;The main thing that one needs to get started is to have the Opencascade libraries set up on your system. These libraries seem to be a gift from the geometry gods that let developers get up to speed with professional CAD programs fast.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-6345002035276803383?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/6345002035276803383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/03/here-is-url-for-project-that-i-have.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6345002035276803383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/6345002035276803383'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/03/here-is-url-for-project-that-i-have.html' title=''/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1791935642719887324.post-1036806693394346946</id><published>2010-03-28T12:33:00.000-07:00</published><updated>2010-03-28T12:34:55.237-07:00</updated><title type='text'></title><content type='html'>I've been working with HeeksCAD lately. Dan Heeks has created a very impressive open source CADCAM platform.&lt;br /&gt;You can get the sources or binaries here:&lt;br /&gt;http://code.google.com/p/heekscad/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1791935642719887324-1036806693394346946?l=opensourcedesigntools.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://opensourcedesigntools.blogspot.com/feeds/1036806693394346946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/03/ive-been-working-with-heekscad-lately.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1036806693394346946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1791935642719887324/posts/default/1036806693394346946'/><link rel='alternate' type='text/html' href='http://opensourcedesigntools.blogspot.com/2010/03/ive-been-working-with-heekscad-lately.html' title=''/><author><name>Dan Falck</name><uri>http://www.blogger.com/profile/08753782465263326147</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_ibFNuVmitWA/TAsefzS1QoI/AAAAAAAAADg/zPtmxCR54qM/S220/dan.jpg'/></author><thr:total>0</thr:total></entry></feed>
