├── .gitignore ├── Examples ├── 2.png ├── bas-relief-demo.blend ├── bas-relief-demo.blend1 ├── intarsion2.jpg └── intarsion_example.blend ├── LICENSE ├── README.md ├── config ├── startup.blend └── userpref.blend ├── documentation ├── Blendercam Installation.md ├── Blendercam-Panel-Descriptions.md ├── Blendercam-Tools.md ├── Getting started.md ├── Profile and Pocket operations.md └── images │ ├── addonInstall1.png │ ├── addonInstall2.png │ ├── addonInstall3.png │ ├── afterPosition.png │ ├── beforePosition.png │ ├── bool_dif.png │ ├── bool_inter.png │ ├── bool_union.png │ ├── calculatePath.png │ ├── calculatePath2.png │ ├── camCut.png │ ├── camCut2.png │ ├── camFeedrate.png │ ├── camInfo.png │ ├── camMovement.png │ ├── camOpArea.png │ ├── camOptim.png │ ├── cam_render.png │ ├── contour.png │ ├── createcurve.png │ ├── createcustum.png │ ├── createlissajous.png │ ├── createsine.png │ ├── createspiro.png │ ├── curve.png │ ├── curvecampanel.png │ ├── cut-ballcone.jpg │ ├── cut-ballnose.jpg │ ├── cut-bullnose.jpg │ ├── cut-custom.jpg │ ├── cut-end.jpg │ ├── cut-laser.jpg │ ├── cut-v-carve.jpg │ ├── cutCustom.png │ ├── edgeSplit.png │ ├── edge_split.png │ ├── get_pocket.png │ ├── get_pocket2.png │ ├── getpocketsurface.png │ ├── holes.png │ ├── importStl.png │ ├── installLinux.png │ ├── intarsion.png │ ├── logo.png │ ├── machine.png │ ├── materialSize.png │ ├── milim.png │ ├── newChain.png │ ├── newop.png │ ├── opBlock.png │ ├── opCircle.png │ ├── opCross.png │ ├── opDrill.png │ ├── opList.png │ ├── opOutline.png │ ├── opOverview.png │ ├── opPanel.png │ ├── opPanel2.png │ ├── opParallel.png │ ├── opPocket.png │ ├── opProfile.png │ ├── opSpiral.png │ ├── origin.png │ ├── overcut_db.png │ ├── overcut_tbone.png │ ├── overcut_tbone_oe.png │ ├── overcut_tbone_oe_2.png │ ├── overcut_tbone_oe_inv.png │ ├── partConvert.png │ ├── partFreecad.png │ ├── partObjSep.png │ ├── partObjSep2.png │ ├── partObjectSil.png │ ├── partOrigGeo.png │ ├── partPocket1.png │ ├── partPocket2.png │ ├── partProfile1.png │ ├── partProfile2.png │ ├── partSeparateHoles.png │ ├── pocket.png │ ├── pocket_mod.png │ ├── positionObject.png │ ├── processor.png │ ├── selectOperation.png │ ├── separate.png │ ├── setup_machine.png │ ├── silhouette.png │ ├── silhouette_offset.png │ ├── silhouette_offset2.png │ ├── simulateOp.png │ ├── surfaces1.png │ ├── surfaces2.png │ ├── suzanne.gif │ ├── suzanne.png │ ├── tesselation.png │ ├── toolshelfview.png │ ├── tutorial_enable_Blender_CAM.png │ ├── tutorial_position_object.png │ ├── tutorial_simulation.png │ ├── tutorial_toolpath.png │ └── upcut downcut.png ├── scripts ├── __init__.py ├── addons │ ├── GPack │ │ ├── __init__.py │ │ ├── pack_scene.blend │ │ ├── pack_scene.blend1 │ │ └── pack_scene.blend2 │ ├── basrelief.py │ ├── cam │ │ ├── __init__.py │ │ ├── backgroundop.py_ │ │ ├── bpypolyskel │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── bridges.py │ │ ├── chunk.py │ │ ├── collision.py │ │ ├── curvecamcreate.py │ │ ├── curvecamequation.py │ │ ├── curvecamtools.py │ │ ├── exception.py │ │ ├── gcodeimportparser.py │ │ ├── gcodepath.py │ │ ├── image_utils.py │ │ ├── involute_gear.py │ │ ├── joinery.py │ │ ├── nc │ │ │ ├── LICENSE │ │ │ ├── __init__.py │ │ │ ├── anilam_crusader_m.py │ │ │ ├── anilam_crusader_m_read.py │ │ │ ├── attach.py │ │ │ ├── cad_iso_read.py │ │ │ ├── cad_nc_read.py │ │ │ ├── cad_read.py │ │ │ ├── centroid1.py │ │ │ ├── centroid1_read.py │ │ │ ├── drag_knife.py │ │ │ ├── emc2.py │ │ │ ├── emc2_read.py │ │ │ ├── emc2b.py │ │ │ ├── emc2b_crc.py │ │ │ ├── emc2b_crc_read.py │ │ │ ├── emc2b_read.py │ │ │ ├── emc2tap.py │ │ │ ├── emc2tap_read.py │ │ │ ├── fadal.py │ │ │ ├── format.py │ │ │ ├── gantry_router.py │ │ │ ├── gantry_router_read.py │ │ │ ├── gravos.py │ │ │ ├── grbl.py │ │ │ ├── heiden.py │ │ │ ├── heiden530.py │ │ │ ├── heiden_read.py │ │ │ ├── hm50.py │ │ │ ├── hm50_read.py │ │ │ ├── hpgl2d.py │ │ │ ├── hpgl2d_read.py │ │ │ ├── hpgl2dv.py │ │ │ ├── hpgl2dv_read.py │ │ │ ├── hpgl3d.py │ │ │ ├── hpgl3d_read.py │ │ │ ├── hxml_writer.py │ │ │ ├── iso.py │ │ │ ├── iso_codes.py │ │ │ ├── iso_crc.py │ │ │ ├── iso_crc_read.py │ │ │ ├── iso_modal.py │ │ │ ├── iso_modal_read.py │ │ │ ├── iso_read.py │ │ │ ├── lathe1.py │ │ │ ├── lathe1_read.py │ │ │ ├── lynx_otter_o.py │ │ │ ├── mach3.py │ │ │ ├── mach3_read.py │ │ │ ├── machines.txt │ │ │ ├── makerbotHBP.py │ │ │ ├── makerbotHBP_read.py │ │ │ ├── makerbot_codes.py │ │ │ ├── nc.py │ │ │ ├── nc_read.py │ │ │ ├── nclathe_read.py │ │ │ ├── num_reader.py │ │ │ ├── printbot3d.py │ │ │ ├── printbot3d_read.py │ │ │ ├── recreator.py │ │ │ ├── rez2.py │ │ │ ├── rez2_read.py │ │ │ ├── series1.py │ │ │ ├── series1_read.py │ │ │ ├── shopbot_mtc.py │ │ │ ├── siegkx1.py │ │ │ ├── siegkx1_read.py │ │ │ ├── tnc151.py │ │ │ ├── tnc151_read.py │ │ │ └── winpc.py │ │ ├── opencamlib │ │ │ ├── __init__.py │ │ │ ├── oclSample.py │ │ │ ├── opencamlib.py │ │ │ └── opencamlib_readme.txt │ │ ├── ops.py │ │ ├── pack.py │ │ ├── parametric.py │ │ ├── pattern.py │ │ ├── polygon_utils_cam.py │ │ ├── puzzle_joinery.py │ │ ├── simple.py │ │ ├── simulation.py │ │ ├── slice.py │ │ ├── strategy.py │ │ ├── testing.py │ │ ├── ui.py │ │ ├── ui_panels │ │ │ ├── __init__.py │ │ │ ├── area.py │ │ │ ├── buttons_panel.py │ │ │ ├── chains.py │ │ │ ├── cutter.py │ │ │ ├── feedrate.py │ │ │ ├── info.py │ │ │ ├── machine.py │ │ │ ├── material.py │ │ │ ├── movement.py │ │ │ ├── op_properties.py │ │ │ ├── operations.py │ │ │ └── optimisation.py │ │ ├── utils.py │ │ └── voronoi.py │ ├── print_3d │ │ ├── __init__.py │ │ ├── ini │ │ │ ├── test1.ini │ │ │ ├── test2.ini │ │ │ └── test3.ini │ │ └── machine_profiles │ │ │ ├── MakerBotReplicator.ini │ │ │ ├── Mendel.ini │ │ │ ├── Peachy.ini │ │ │ ├── PrintrBot.ini │ │ │ ├── PrintrBotLC+.ini │ │ │ └── Prusa Mendel i3.ini │ ├── scan_tools.py │ └── select_similar.py └── presets │ ├── cam_cutters │ ├── BALLCONE_1.00mm.py │ ├── ball_1.00mm.py │ ├── ball_1.50mm.py │ ├── ball_10.00mm.py │ ├── ball_12.00mm.py │ ├── ball_16.00mm.py │ ├── ball_2.00mm.py │ ├── ball_2.50mm.py │ ├── ball_20.00mm.py │ ├── ball_3.00mm.py │ ├── ball_3.50mm.py │ ├── ball_4.00mm.py │ ├── ball_5.00mm.py │ ├── ball_6.00mm.py │ ├── ball_7.00mm.py │ ├── ball_8.00mm.py │ ├── end_cyl_1.00mm.py │ ├── end_cyl_1.50mm.py │ ├── end_cyl_10.00mm.py │ ├── end_cyl_12.00mm.py │ ├── end_cyl_16.00mm.py │ ├── end_cyl_2.00mm.py │ ├── end_cyl_2.50mm.py │ ├── end_cyl_20.00mm.py │ ├── end_cyl_3.00mm.py │ ├── end_cyl_3.50mm.py │ ├── end_cyl_4.00mm.py │ ├── end_cyl_5.00mm.py │ ├── end_cyl_6.00mm.py │ ├── end_cyl_7.00mm.py │ ├── end_cyl_8.00mm.py │ ├── v-carve_3mm_45deg.py │ ├── v-carve_3mm_60deg.py │ ├── v-carve_6mm_45deg.py │ └── v-carve_6mm_60deg.py │ ├── cam_machines │ ├── emc_test_2.py │ └── kk1000s.py │ └── cam_operations │ ├── Fin_Ball_3,0_Block_All.py │ ├── Fin_Ball_3,0_Block_Around.py │ ├── Fin_Ball_3,0_Circles_All_EXPERIMENTAL.py │ ├── Fin_Ball_3,0_Circles_Around_EXPERIMENTAL.py │ ├── Fin_Ball_3,0_Cross_All.py │ ├── Fin_Ball_3,0_Cross_Around.py │ ├── Fin_Ball_3,0_Cutout.py │ ├── Fin_Ball_3,0_Outline_Fill_EXPERIMENTAL.py │ ├── Fin_Ball_3,0_Parallel_All.py │ ├── Fin_Ball_3,0_Parallel_Around.py │ ├── Fin_Ball_3,0_Pencil_EXPERIMENTAL.py │ ├── Fin_Ball_3,0_Pocket_EXPERIMENTAL.py │ ├── Fin_Ball_3,0_Spiral_All.py │ ├── Fin_Ball_3,0_Spiral_Around.py │ ├── Finishing_3mm_ballnose.py │ ├── Rou_Ball_3,0_Block_All.py │ ├── Rou_Ball_3,0_Block_Around.py │ ├── Rou_Ball_3,0_Circles_All_EXPERIMENTAL.py │ ├── Rou_Ball_3,0_Circles_Around_EXPERIMENTAL.py │ ├── Rou_Ball_3,0_Cross_All.py │ ├── Rou_Ball_3,0_Cross_Around.py │ ├── Rou_Ball_3,0_Cutout.py │ ├── Rou_Ball_3,0_Outline_Fill_EXPERIMENTAL.py │ ├── Rou_Ball_3,0_Parallel_All.py │ ├── Rou_Ball_3,0_Parallel_Around.py │ ├── Rou_Ball_3,0_Pencil_EXPERIMENTAL.py │ ├── Rou_Ball_3,0_Pocket_EXPERIMENTAL.py │ ├── Rou_Ball_3,0_Spiral_All.py │ └── Rou_Ball_3,0_Spiral_Around.py └── static └── logo.png /.gitignore: -------------------------------------------------------------------------------- 1 | config/bookmarks.txt 2 | /python 3 | /datafiles 4 | /scripts/freestyle/ 5 | /scripts/modules/ 6 | /scripts/startup/ 7 | /scripts/templates_osl/ 8 | /scripts/templates_py/ 9 | /scripts/addons_contrib/ 10 | *.spi1d 11 | *.pyc 12 | *.ocio 13 | *.spi3d 14 | config/recent-files.txt 15 | scripts/addons_contrib/add_mesh_rocks/add_mesh_rocks.xml 16 | scripts/addons_contrib/online_mat_lib/material-library/bundled/cycles/wood/rough_pine.bcm 17 | acp 18 | syncWithUpstream 19 | forceSyncWithUpstream 20 | 21 | \.idea/ 22 | 23 | .project 24 | 25 | .pydevproject 26 | -------------------------------------------------------------------------------- /Examples/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/Examples/2.png -------------------------------------------------------------------------------- /Examples/bas-relief-demo.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/Examples/bas-relief-demo.blend -------------------------------------------------------------------------------- /Examples/bas-relief-demo.blend1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/Examples/bas-relief-demo.blend1 -------------------------------------------------------------------------------- /Examples/intarsion2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/Examples/intarsion2.jpg -------------------------------------------------------------------------------- /Examples/intarsion_example.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/Examples/intarsion_example.blend -------------------------------------------------------------------------------- /config/startup.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/config/startup.blend -------------------------------------------------------------------------------- /config/userpref.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/config/userpref.blend -------------------------------------------------------------------------------- /documentation/Getting started.md: -------------------------------------------------------------------------------- 1 | This is a step-by-step tutorial on generating a toolpath with Blender CAM. For detailed description of panel options go [here](Blendercam-Panel-Descriptions.md). 2 | 3 | 4 | 5 | ## Change render engine 6 | First of all, change render engine to CAM to use the blender cam tool. 7 | 8 | ![Renderer selection](images/cam_render.png) 9 | 10 | 11 | ## Change units in Blender 12 | 13 | Change units to metric or imperial in Scene properties. 14 | ![Renderer selection](images/milim.png): 15 | 16 | 17 | ## Setup machine parameters 18 | 19 | Setup machine parameters (postprocessor, maximum feed rate, work area, etc.) in 'CAM Machine' options. 20 | 21 | ![Machine setup](images/setup_machine.png) 22 | 23 | ## Add a new operation 24 | 25 | Add new operation in the render properties. 26 | ![New operation](images/newop.png) 27 | 28 | Choose Parallel (or Outline Fill, Circles, Spiral, Block, Cross) in the Strategy dialog. Waterline option works best when [OpenCAMLib](Opencamlib%20Installation.md) is installed and other operations require curve data source. See how to generate curves from mesh model [here](Profile%20and%20Pocket%20operations.md). 29 | 30 | ![Select operation](images/selectOperation.png) 31 | 32 | In Object dialog select object being source of geometry for toolpath generation. 33 | 34 | ## Configure Cam Material and position object 35 | 36 | In CAM Material size and position, set radius around model option to reflect the amount of stock material to be machined. 37 | 38 | ![Before position](images/beforePosition.png) 39 | 40 | Manually position object inside work area, or use "Position object" option to position it automatically. 41 | 42 | ![Click position](images/positionObject.png) 43 | 44 | ![After position](images/afterPosition.png) 45 | 46 | If the box representing material doesn't update, uncheck "Estimate from model" option and then check it again. 47 | 48 | ## Configuration of the active Operation 49 | 50 | Set "Distance between toolpaths" to desired value. 51 | 52 | "Distance along toolpaths" option determines accuracy. Lower values result in more accurate toolpath, but make computation slower and increase amount of resulting G-code. 53 | 54 | Select "Use exact mode" - it improves accuracy. If you have [OpenCAMLib](Opencamlib%20Installation.md) installed, also select "UseOpenCAMLib" - it impoves accuracy and speeds up the computing time. OpenCAMLib also enables high quality algorithm from calculating waterline toolpaths. 55 | 56 | CAM Movement: 57 | 58 | Enter layer depth (in Step Down dialog), operation depth, start depth and optionally end depth (if "Depth from object" is disabled). 59 | 60 | CAM Feedrate: 61 | 62 | Set feedrate and spindle rpm. "Plunge speed" and "Plunge angle" allows slowing down feedrate when the cutter is moving down on steep areas. 63 | 64 | Cam Cutter: 65 | 66 | Set cutter tool number (used in G-code), type, number of flutes and diameter. 67 | 68 | ## Multiples operations in a chain 69 | 70 | To join multiple operations into a single G-code file, use CAM chains dialog. 71 | 72 | ![New chain](images/newChain.png) 73 | 74 | ## Calculate Path and Generate Gcode file 75 | 76 | Click "Calculate Path" to generate toolpath. If "Auto export" option is selected, G-code file will also be created. 77 | 78 | ![Calculate path](images/calculatePath.png) 79 | 80 | ![Calculate path view](images/calculatePath2.png) 81 | 82 | ## Quick look of the final result 83 | 84 | Next click "Simulate operation" to create model representing machined material. 85 | 86 | ![Simulate Operation](images/simulateOp.png) 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /documentation/Profile and Pocket operations.md: -------------------------------------------------------------------------------- 1 | 1. Convert model from CSG to mesh (in this example FreeCAD is used for conversion). Precision setting is very important for correct result. 2 | 3 | ![Tesselation with Freecad](images/tesselation.png) 4 | 5 | ![Result with Freecad](images/partFreecad.png) 6 | 7 | 2. Save mesh as PLY or STL. 8 | 9 | 3. Import mesh to Blender. 10 | 11 | ![Import Stl](images/importStl.png) 12 | 13 | 4. use and apply 'Egde Split' modifier. 14 | 15 | ![Edge split modifier](images/edgeSplit.png) 16 | 17 | 5. Enter Edit Mode and select surface (in Face Select mode) that will be a curve source, and 'Separate' it. Use Select Linked (L shortcut) to select whole faces. 18 | 19 | ![Separate selection](images/partObjSep.png) 20 | 21 | 6. Repeat with other curve sources. 22 | 23 | ![Separate selection 2](images/partObjSep2.png) 24 | 25 | 7. Use 'Set Origin to Geometry' on all separated surfaces. 26 | 27 | ![Separate selection 2](images/partOrigGeo.png) 28 | 29 | 8. Exit Edit Mode and select separated surfaces. Convert them to curves using 'Convert to' (Alt C). 30 | 31 | ![Convert to curve](images/partConvert.png) 32 | 33 | or you can use "Object silhouete" from blendercam tool : 34 | 35 | ![Cam Panel](images/curvecampanel.png) 36 | 37 | ![Object silhouete](images/partObjectSil.png) 38 | 39 | 9. Edit curves to separate holes from external contour. 40 | 41 | ![Object silhouete](images/partSeparateHoles.png) 42 | 43 | 10. Add Pocket and Profile operations : 44 | 45 | 46 | ![Pocket 1](images/partPocket1.png) 47 | ![Pocket 2](images/partPocket2.png) 48 | ![Profile 1](images/partProfile1.png) 49 | ![Profile 2](images/partProfile2.png) 50 | 51 | for pads/pockets (some curves need to be modified in 'Edit Mode'): 52 | 53 | It's highly recommended to create roughing and finishing pass. For roughing pass add offset by altering cutter's diameter. For Profile operation, 'First Down' and 'Ramp In' options are recommended. 'First Down' helps avoid non-cutting moves and 'Ramp In' reduces cutter load by avoiding vertical plunge into material. For Pocket operation instead of 'Ramp In' try using 'Helix enter' option. 54 | 55 | 56 | -------------------------------------------------------------------------------- /documentation/images/addonInstall1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/addonInstall1.png -------------------------------------------------------------------------------- /documentation/images/addonInstall2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/addonInstall2.png -------------------------------------------------------------------------------- /documentation/images/addonInstall3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/addonInstall3.png -------------------------------------------------------------------------------- /documentation/images/afterPosition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/afterPosition.png -------------------------------------------------------------------------------- /documentation/images/beforePosition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/beforePosition.png -------------------------------------------------------------------------------- /documentation/images/bool_dif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/bool_dif.png -------------------------------------------------------------------------------- /documentation/images/bool_inter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/bool_inter.png -------------------------------------------------------------------------------- /documentation/images/bool_union.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/bool_union.png -------------------------------------------------------------------------------- /documentation/images/calculatePath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/calculatePath.png -------------------------------------------------------------------------------- /documentation/images/calculatePath2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/calculatePath2.png -------------------------------------------------------------------------------- /documentation/images/camCut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camCut.png -------------------------------------------------------------------------------- /documentation/images/camCut2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camCut2.png -------------------------------------------------------------------------------- /documentation/images/camFeedrate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camFeedrate.png -------------------------------------------------------------------------------- /documentation/images/camInfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camInfo.png -------------------------------------------------------------------------------- /documentation/images/camMovement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camMovement.png -------------------------------------------------------------------------------- /documentation/images/camOpArea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camOpArea.png -------------------------------------------------------------------------------- /documentation/images/camOptim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/camOptim.png -------------------------------------------------------------------------------- /documentation/images/cam_render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cam_render.png -------------------------------------------------------------------------------- /documentation/images/contour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/contour.png -------------------------------------------------------------------------------- /documentation/images/createcurve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/createcurve.png -------------------------------------------------------------------------------- /documentation/images/createcustum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/createcustum.png -------------------------------------------------------------------------------- /documentation/images/createlissajous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/createlissajous.png -------------------------------------------------------------------------------- /documentation/images/createsine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/createsine.png -------------------------------------------------------------------------------- /documentation/images/createspiro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/createspiro.png -------------------------------------------------------------------------------- /documentation/images/curve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/curve.png -------------------------------------------------------------------------------- /documentation/images/curvecampanel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/curvecampanel.png -------------------------------------------------------------------------------- /documentation/images/cut-ballcone.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-ballcone.jpg -------------------------------------------------------------------------------- /documentation/images/cut-ballnose.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-ballnose.jpg -------------------------------------------------------------------------------- /documentation/images/cut-bullnose.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-bullnose.jpg -------------------------------------------------------------------------------- /documentation/images/cut-custom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-custom.jpg -------------------------------------------------------------------------------- /documentation/images/cut-end.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-end.jpg -------------------------------------------------------------------------------- /documentation/images/cut-laser.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-laser.jpg -------------------------------------------------------------------------------- /documentation/images/cut-v-carve.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cut-v-carve.jpg -------------------------------------------------------------------------------- /documentation/images/cutCustom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/cutCustom.png -------------------------------------------------------------------------------- /documentation/images/edgeSplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/edgeSplit.png -------------------------------------------------------------------------------- /documentation/images/edge_split.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/edge_split.png -------------------------------------------------------------------------------- /documentation/images/get_pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/get_pocket.png -------------------------------------------------------------------------------- /documentation/images/get_pocket2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/get_pocket2.png -------------------------------------------------------------------------------- /documentation/images/getpocketsurface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/getpocketsurface.png -------------------------------------------------------------------------------- /documentation/images/holes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/holes.png -------------------------------------------------------------------------------- /documentation/images/importStl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/importStl.png -------------------------------------------------------------------------------- /documentation/images/installLinux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/installLinux.png -------------------------------------------------------------------------------- /documentation/images/intarsion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/intarsion.png -------------------------------------------------------------------------------- /documentation/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/logo.png -------------------------------------------------------------------------------- /documentation/images/machine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/machine.png -------------------------------------------------------------------------------- /documentation/images/materialSize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/materialSize.png -------------------------------------------------------------------------------- /documentation/images/milim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/milim.png -------------------------------------------------------------------------------- /documentation/images/newChain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/newChain.png -------------------------------------------------------------------------------- /documentation/images/newop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/newop.png -------------------------------------------------------------------------------- /documentation/images/opBlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opBlock.png -------------------------------------------------------------------------------- /documentation/images/opCircle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opCircle.png -------------------------------------------------------------------------------- /documentation/images/opCross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opCross.png -------------------------------------------------------------------------------- /documentation/images/opDrill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opDrill.png -------------------------------------------------------------------------------- /documentation/images/opList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opList.png -------------------------------------------------------------------------------- /documentation/images/opOutline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opOutline.png -------------------------------------------------------------------------------- /documentation/images/opOverview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opOverview.png -------------------------------------------------------------------------------- /documentation/images/opPanel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opPanel.png -------------------------------------------------------------------------------- /documentation/images/opPanel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opPanel2.png -------------------------------------------------------------------------------- /documentation/images/opParallel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opParallel.png -------------------------------------------------------------------------------- /documentation/images/opPocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opPocket.png -------------------------------------------------------------------------------- /documentation/images/opProfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opProfile.png -------------------------------------------------------------------------------- /documentation/images/opSpiral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/opSpiral.png -------------------------------------------------------------------------------- /documentation/images/origin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/origin.png -------------------------------------------------------------------------------- /documentation/images/overcut_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/overcut_db.png -------------------------------------------------------------------------------- /documentation/images/overcut_tbone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/overcut_tbone.png -------------------------------------------------------------------------------- /documentation/images/overcut_tbone_oe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/overcut_tbone_oe.png -------------------------------------------------------------------------------- /documentation/images/overcut_tbone_oe_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/overcut_tbone_oe_2.png -------------------------------------------------------------------------------- /documentation/images/overcut_tbone_oe_inv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/overcut_tbone_oe_inv.png -------------------------------------------------------------------------------- /documentation/images/partConvert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partConvert.png -------------------------------------------------------------------------------- /documentation/images/partFreecad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partFreecad.png -------------------------------------------------------------------------------- /documentation/images/partObjSep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partObjSep.png -------------------------------------------------------------------------------- /documentation/images/partObjSep2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partObjSep2.png -------------------------------------------------------------------------------- /documentation/images/partObjectSil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partObjectSil.png -------------------------------------------------------------------------------- /documentation/images/partOrigGeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partOrigGeo.png -------------------------------------------------------------------------------- /documentation/images/partPocket1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partPocket1.png -------------------------------------------------------------------------------- /documentation/images/partPocket2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partPocket2.png -------------------------------------------------------------------------------- /documentation/images/partProfile1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partProfile1.png -------------------------------------------------------------------------------- /documentation/images/partProfile2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partProfile2.png -------------------------------------------------------------------------------- /documentation/images/partSeparateHoles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/partSeparateHoles.png -------------------------------------------------------------------------------- /documentation/images/pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/pocket.png -------------------------------------------------------------------------------- /documentation/images/pocket_mod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/pocket_mod.png -------------------------------------------------------------------------------- /documentation/images/positionObject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/positionObject.png -------------------------------------------------------------------------------- /documentation/images/processor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/processor.png -------------------------------------------------------------------------------- /documentation/images/selectOperation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/selectOperation.png -------------------------------------------------------------------------------- /documentation/images/separate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/separate.png -------------------------------------------------------------------------------- /documentation/images/setup_machine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/setup_machine.png -------------------------------------------------------------------------------- /documentation/images/silhouette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/silhouette.png -------------------------------------------------------------------------------- /documentation/images/silhouette_offset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/silhouette_offset.png -------------------------------------------------------------------------------- /documentation/images/silhouette_offset2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/silhouette_offset2.png -------------------------------------------------------------------------------- /documentation/images/simulateOp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/simulateOp.png -------------------------------------------------------------------------------- /documentation/images/surfaces1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/surfaces1.png -------------------------------------------------------------------------------- /documentation/images/surfaces2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/surfaces2.png -------------------------------------------------------------------------------- /documentation/images/suzanne.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/suzanne.gif -------------------------------------------------------------------------------- /documentation/images/suzanne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/suzanne.png -------------------------------------------------------------------------------- /documentation/images/tesselation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/tesselation.png -------------------------------------------------------------------------------- /documentation/images/toolshelfview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/toolshelfview.png -------------------------------------------------------------------------------- /documentation/images/tutorial_enable_Blender_CAM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/tutorial_enable_Blender_CAM.png -------------------------------------------------------------------------------- /documentation/images/tutorial_position_object.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/tutorial_position_object.png -------------------------------------------------------------------------------- /documentation/images/tutorial_simulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/tutorial_simulation.png -------------------------------------------------------------------------------- /documentation/images/tutorial_toolpath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/tutorial_toolpath.png -------------------------------------------------------------------------------- /documentation/images/upcut downcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/documentation/images/upcut downcut.png -------------------------------------------------------------------------------- /scripts/addons/GPack/pack_scene.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/scripts/addons/GPack/pack_scene.blend -------------------------------------------------------------------------------- /scripts/addons/GPack/pack_scene.blend1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/scripts/addons/GPack/pack_scene.blend1 -------------------------------------------------------------------------------- /scripts/addons/GPack/pack_scene.blend2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/scripts/addons/GPack/pack_scene.blend2 -------------------------------------------------------------------------------- /scripts/addons/cam/backgroundop.py_: -------------------------------------------------------------------------------- 1 | # blender CAM utils.py (c) 2012 Vilem Novak 2 | # 3 | # ***** BEGIN GPL LICENSE BLOCK ***** 4 | # 5 | # 6 | # This program is free software; you can redistribute it and/or 7 | # modify it under the terms of the GNU General Public License 8 | # as published by the Free Software Foundation; either version 2 9 | # of the License, or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program; if not, write to the Free Software Foundation, 18 | # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 | # 20 | # ***** END GPL LICENCE BLOCK ***** 21 | 22 | import bpy, os,pickle,time 23 | import sys # to get command line args 24 | import argparse # to parse options for us and print a nice help message 25 | 26 | def getCachePath(o): 27 | fn=bpy.data.filepath 28 | l=len(bpy.path.basename(fn)) 29 | bn=bpy.path.basename(fn)[:-6] 30 | 31 | try: 32 | os.mkdir(fn[:-l]+'temp_cam') 33 | except: 34 | pass; 35 | iname=fn[:-l]+'temp_cam'+os.sep+bn+'_'+o.name 36 | return iname 37 | 38 | def calculatePath(op): 39 | s=bpy.context.scene 40 | o=s.cam_operations[op] 41 | s.cam_active_operation=op 42 | bpy.ops.object.calculate_cam_path() 43 | 44 | p=getCachePath(o)+'.blend' 45 | picklepath=getCachePath(o)+'.pickle' 46 | f=open(picklepath,'wb') 47 | d={} 48 | 49 | d['duration']=o.duration 50 | d['warnings']=o.warnings 51 | 52 | #pickle path... 53 | oname="cam_path_"+o.name 54 | if oname in s.objects: 55 | mesh=s.objects[oname].data 56 | verts=[] 57 | for v in mesh.vertices: 58 | verts.append((v.co.x,v.co.y,v.co.z)) 59 | d['path']=verts 60 | pickle.dump(d,f) 61 | f.close() 62 | #bpy.ops.wm.save_mainfile(filepath=p) 63 | #f=open(picklepath,'wb') 64 | passed=False 65 | while not passed: 66 | try: 67 | f=open(picklepath,'rb') 68 | d=pickle.load(f) 69 | f.close() 70 | passed=True 71 | except: 72 | print('sleep') 73 | time.sleep(1) 74 | sys.stdout.write('progress{%s}\n' % ('finished')) 75 | sys.stdout.flush() 76 | 77 | #parse arguments here 78 | argv = sys.argv 79 | 80 | if "--" not in argv: 81 | argv = [] # as if no args are passed 82 | else: 83 | argv = argv[argv.index("--") + 1:] # get all args after "--" 84 | 85 | # When --help or no args are given, print this help 86 | usage_text = \ 87 | "Run blender in background mode with this script:" 88 | " blender --background --python " + __file__ + " -- [options]" 89 | 90 | parser = argparse.ArgumentParser(description=usage_text) 91 | 92 | # Example utility, add some text and renders or saves it (with options) 93 | # Possible types are: string, int, long, choice, float and complex. 94 | parser.add_argument("-o", "--operation", dest="op", type=int, required=True, 95 | help="Index of the operation to calculate") 96 | ''' 97 | parser.add_argument("-s", "--save", dest="save_path", metavar='FILE', 98 | help="Save the generated file to the specified path") 99 | parser.add_argument("-r", "--render", dest="render_path", metavar='FILE', 100 | help="Render an image to the specified path") 101 | ''' 102 | args = parser.parse_args(argv) 103 | calculatePath(args.op) -------------------------------------------------------------------------------- /scripts/addons/cam/bpypolyskel/README.md: -------------------------------------------------------------------------------- 1 | # bpypolyskel 2 | 3 | ![Logo](./misc/logo.jpg) 4 | 5 | How to fit a hipped roof to the walls of a building? No problem, the _bpypolyskel_ library provides a single function that does the whole task automatically. From the footprint of a building, its [_straight skeleton_](https://en.wikipedia.org/wiki/Straight_skeleton) gets computed. From this skeleton all _faces_ get extracted and the height for every vertex of the straight skeleton is calculated. All these computations can easily be done in [Blender](https://www.blender.org/), but the library may also be used in general purpose applications. 6 | 7 | The _bpypolyskel_ library was [tested](https://github.com/prochitecture/bpypolyskel/wiki/Testing) against all 320.000 hipped roofs in the OpenStreetMap database. It runs successfully for 99.99% of them. 8 | 9 | ## Usage 10 | The library _bpypolyskel_ provides two functions: 11 | 12 | - `polygonize()` 13 | 14 | _polygonize()_ is the main function to compute the faces of a hipped roof from the footprint of a building, it does the whole task described above. It accepts a simple description of the contour of the footprint polygon, including those of eventual holes, and returns a list of polygon faces. See more details in its [documentation](https://github.com/prochitecture/bpypolyskel/wiki/polygonize). 15 | 16 | - `skeletonize()` 17 | 18 | _skeletonize()_ creates the [straight skeleton](https://en.wikipedia.org/wiki/Straight_skeleton) of the footprint. It gets a list of the edges of the footprint polygon, including those of eventual holes, and creates a straight skeleton. This function is called from _polygonize()_, but may also be used independently. See more details in its [documentation](https://github.com/prochitecture/bpypolyskel/wiki/skeletonize) 19 | 20 | ### Note 21 | The straight skeleton computed by _skeletonize()_ does not provide a straight skeleton in a mathematical sense. Several cleaning and merging algorithms repair issues produced by inaccuracies of the footprint and issues in the skeletonize algorithm. Its goal is to create a skeleton that fits best for a hipped roof. 22 | 23 | ## Installation and Demos 24 | You find all required files in the folder [bpypolyskel](./bpypolyskel). There are two main applications of this project: 25 | 26 | ### Within a Blender addon 27 | Copy the whole folder [bpypolyskel](./bpypolyskel) to your addon. Include the functions using 28 | ``` 29 | from .bpypolyskel import bpypolyskel 30 | ``` 31 | The file [__init__.py](./__init__.py) shows a simple code for usage in an addon. It adds an object created by _bpypolyskel_ to a scene. The demo object is created in Blender by Add -> Mesh -> Add bpypolyskel Demo Object. 32 | 33 | ### General purpose application 34 | The functions of _bpypolyskel_ are also usable using a Python interpreter, but then the installation of the package _mathutils_ is required. Install it using: 35 | ``` 36 | pip install mathutils 37 | ``` 38 | A simple demo in the file [demo.py](./demo.py) shows this type of usage and displays the result using `matplotlib`. 39 | 40 | ## Credits 41 | The implementation of the straight skeleton algorithm is based on the description by Felkel and Obdržálek in their 1998 conference paper 42 | [Straight skeleton implementation](http://www.dma.fi.upm.es/personal/mabellanas/tfcs/skeleton/html/documentacion/Straight%20Skeletons%20Implementation.pdf). The code for the function _skeletonize()_ has been ported from the implementation by [Botffy](https://github.com/Botffy/polyskel). 43 | 44 | The main adaptations compared to Botffy's original code are: 45 | 46 | - The order of the vertices of the polygon has been changed to a right-handed coordinate system (as used in Blender). The positive x and y axes point right and up, and the z axis points into your face. Positive rotation is counterclockwise around the z-axis. 47 | - The geometry objects used from the library `euclid3` in the implementation of Bottfy have been replaced by objects based on `mathutils.Vector`. These objects are defined in the new library [bpyeuclid](./bpypolyskel/bpyeuclid.py). 48 | - The signature of `skeletonize()` has been changed to lists of edges for the polygon and eventual hole. These are of type `Edge2`, defined in [bpyeuclid](./bpypolyskel/bpyeuclid.py). 49 | - Some parts of the skeleton computations have been changed to fix errors produced by the original implementation. 50 | - Algorithms to merge clusters of skeleton nodes and to filter ghost edges have been added. 51 | - A pattern matching algorithm to detect apses, that creates a multi-edge event to create a proper apse skeleton. 52 | -------------------------------------------------------------------------------- /scripts/addons/cam/exception.py: -------------------------------------------------------------------------------- 1 | class CamException(Exception): 2 | pass -------------------------------------------------------------------------------- /scripts/addons/cam/nc/LICENSE: -------------------------------------------------------------------------------- 1 | The nc library in this folder is coming from HeeksCAD and was slightly improved for the needs of Blender CAM 2 | 3 | HeeksCAD is covered by the new BSD license 4 | 5 | Copyright (c) 2008, Daniel Heeks 6 | All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 9 | 10 | * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 11 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 12 | * Neither the name of Daniel Heeks nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 15 | 16 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/__init__.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # __init__.py 3 | # 4 | # This is here to make python see NC folder 5 | # 6 | # Hirutso Enni, 2009-01-13 7 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/anilam_crusader_m.py: -------------------------------------------------------------------------------- 1 | # Preliminary postprocessor support for Anilam Crusader M CNC controller 2 | # This code modified from iso.py and emc2.py distriuted with HeeksCAD as of Sep 2010 3 | # Kurt Jensen 6 Sep 2010 4 | # Use at your own risk. 5 | from . import nc 6 | from . import iso 7 | 8 | class Creator(iso.Creator): 9 | def __init__(self): 10 | iso.Creator.__init__(self) 11 | self.arc_centre_absolute = True 12 | self.output_block_numbers = False 13 | 14 | def SPACE_STR(self): return(' ') 15 | 16 | # This version of COMMENT removes comments from the resultant GCode 17 | # Note: The Anilam hates comments when importing code. 18 | 19 | def COMMENT(self,comment): return('') 20 | 21 | def program_begin(self, id, comment): 22 | self.write('%\n'); # Start of file token that Anilam Crusader M likes 23 | # No Comments for the Anilam crusaher M, please...... 24 | #self.write( ('(' + comment + ')' + '\n') ) 25 | 26 | def program_end(self): 27 | self.write('G29E\n') # End of code signal for Anilam Crusader M 28 | self.write('%\n') # EOF signal for Anilam Crusader M 29 | 30 | ############################################################################ 31 | ## Settings 32 | 33 | def imperial(self): 34 | self.write( self.IMPERIAL() + '\n') 35 | self.fmt.number_of_decimal_places = 4 36 | 37 | def metric(self): 38 | self.write( self.METRIC() + '\n' ) 39 | self.fmt.number_of_decimal_places = 3 40 | 41 | def absolute(self): 42 | self.write( self.ABSOLUTE() + '\n') 43 | 44 | def incremental(self): 45 | self.write( self.INCREMENTAL() + '\n' ) 46 | 47 | def polar(self, on=True): 48 | if (on) : 49 | self.write(self.POLAR_ON() + '\n' ) 50 | else : 51 | self.write(self.POLAR_OFF() + '\n' ) 52 | 53 | def set_plane(self, plane): 54 | if (plane == 0) : 55 | self.write('G17\n') 56 | elif (plane == 1) : 57 | self.write('G18\n') 58 | elif (plane == 2) : 59 | self.write('G19\n') 60 | 61 | def comment(self, text): 62 | pass 63 | 64 | ############################################################################ 65 | ## Tools 66 | 67 | def tool_change(self, id): 68 | self.write(('T%i' % id) + '\n') 69 | self.t = id 70 | 71 | def tool_defn(self, id, name='', params=None): 72 | self.write(('T10%.2d' % id) + ' ') 73 | 74 | if (radius != None): 75 | self.write(('X%.3f' % radius) + ' ') 76 | 77 | if (length != None): 78 | self.write('Z%.3f' % length) 79 | 80 | self.write('\n') 81 | 82 | # This is the coordinate system we're using. G54->G59, G59.1, G59.2, G59.3 83 | # These are selected by values from 1 to 9 inclusive. 84 | def workplane(self, id): 85 | if ((id >= 1) and (id <= 6)): 86 | self.write( (self.WORKPLANE() % (id + self.WORKPLANE_BASE())) + '\n') 87 | if ((id >= 7) and (id <= 9)): 88 | self.write( ((self.WORKPLANE() % (6 + self.WORKPLANE_BASE())) + ('.%i' % (id - 6))) + '\n') 89 | 90 | def drill(self, x=None, y=None, dwell=None, depthparams = None, retract_mode=None, spindle_mode=None, internal_coolant_on=None, rapid_to_clearance = None): 91 | self.write('(Canned drill cycle ops are not yet supported here on this Anilam Crusader M postprocessor)') 92 | 93 | nc.creator = Creator() 94 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/anilam_crusader_m_read.py: -------------------------------------------------------------------------------- 1 | # Preliminary backplot support for Anilam Crusader M CNC controller 2 | # This code modified from iso_read.py and emc2_read.py distriuted with HeeksCAD as of Sep 2010 3 | # Kurt Jensen 6 Sep 2010 4 | # Use at your own risk. 5 | from . import iso_read as iso 6 | from . import sys 7 | 8 | # Override some iso parser methods to interpret arc centers as relative to origin, not relative to start of arc. 9 | 10 | class Parser(iso.Parser): 11 | def __init__(self, writer): 12 | iso.Parser.__init__(self, writer) 13 | self.arc_centre_absolute = True 14 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/cad_nc_read.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # cad_nc_read.py 3 | # 4 | # Base class for NC code parsing and backplotting 5 | # 6 | # Dan Falck 2011/01/06 7 | 8 | ################################################################################ 9 | class Parser: 10 | 11 | def __init__(self): 12 | self.currentx = -1.0 13 | self.currenty = 0.0 14 | self.currentz = 0.0 15 | x,y,z = 0.0,0.0,0.0 16 | self.absolute_flag = True 17 | 18 | ############################################################################ 19 | ## Internals 20 | 21 | def files_open(self, name, oname=None): 22 | if (oname == None ): 23 | oname = (name+'.scr') 24 | self.file_in = open(name, 'r') 25 | self.file_out = open(oname, 'w') 26 | 27 | def files_close(self): 28 | self.file_in.close() 29 | self.file_out.write('-linetype set continuous\n') 30 | self.file_out.write('\n') 31 | self.file_out.close() 32 | 33 | def readline(self): 34 | self.line = self.file_in.readline().rstrip() 35 | if (len(self.line)): 36 | return True 37 | else: 38 | return False 39 | 40 | def write(self, s): 41 | self.file_out.write(s) 42 | 43 | ############################################################################ 44 | def end_ncblock(self): 45 | self.file_out.write('Delay 0\n') 46 | 47 | def add_text(self, s, col=None, cdata=False): 48 | return 49 | 50 | def set_mode(self, units=None): 51 | #self.file_out.write(' units="'+str(units)+'"') 52 | return 53 | 54 | def set_tool(self, number=None): 55 | if (number != None): 56 | self.file_out.write('-LAYER New T'+str(number)+'\n') 57 | self.file_out.write('-LAYER Set T'+str(number)+'\n') 58 | 59 | def begin_path(self, col=None): 60 | if (col != None): 61 | if col == 'rapid': 62 | self.file_out.write('-color Red\n') 63 | #self.file_out.write('') 64 | self.file_out.write('-linetype set dashed\n') 65 | self.file_out.write('\n') 66 | else: 67 | self.file_out.write('-color Green\n') 68 | #self.file_out.write('') 69 | self.file_out.write('-linetype set continuous\n') 70 | self.file_out.write('\n') 71 | else : self.file_out.write('\n') 72 | 73 | def end_path(self): 74 | self.file_out.write('\n') 75 | 76 | def add_line(self, x=None, y=None, z=None, a=None, b=None, c=None): 77 | if (x == None and y == None and z == None and a == None and b == None and c == None) : return 78 | #self.file_out.write('line %s,%s %s,%s' %(self.currentx,self.currenty,x,y)) 79 | if (x == None) : x = self.currentx 80 | if (y == None) : y = self.currenty 81 | if (z == None) : z = self.currentz 82 | self.file_out.write('line %s,%s,%s %s,%s,%s\n' %(self.currentx,self.currenty,self.currentz,x,y,z)) 83 | self.currentx = x 84 | self.currenty = y 85 | self.currentz = z 86 | 87 | def add_arc(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None, d=None): 88 | if (x == None and y == None and z == None and i == None and j == None and k == None and r == None and d == None) : return 89 | 90 | z = self.currentz 91 | if (x == None) : x = self.currentx 92 | if (y == None) : y = self.currenty 93 | if (z == None) : z = self.currentz 94 | if (d == 1): 95 | self.file_out.write('arc %s,%s,%s\n' %(self.currentx,self.currenty,self.currentz)) 96 | self.file_out.write('c\n') 97 | self.file_out.write('%s,%s,%s\n' %(self.currentx+i,self.currenty+j,self.currentz)) 98 | self.file_out.write('%s,%s,%s' %(x,y,z)) 99 | else: 100 | self.file_out.write('arc %s,%s,%s\n' %(x,y,z)) 101 | self.file_out.write('c\n') 102 | self.file_out.write('%s,%s,%s\n' %(self.currentx+i,self.currenty+j,self.currentz)) 103 | self.file_out.write('%s,%s,%s' %(self.currentx,self.currenty,self.currentz)) 104 | self.currentx = x 105 | self.currenty = y 106 | self.currentz = z 107 | 108 | 109 | def incremental(self): 110 | self.absolute_flag = False 111 | 112 | def absolute(self): 113 | self.absolute_flag = True 114 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/centroid1_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | 6 | class Parser(iso.Parser): 7 | def __init__(self, writer): 8 | iso.Parser.__init__(self, writer) 9 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/drag_knife.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # drag knife.py 3 | # 4 | # NC code creator for attaching Z coordinates to a surface 5 | # 6 | # Dan Heeks 26th April 2012 7 | 8 | from . import recreator 9 | dragging = False 10 | from kurve_funcs import cut_curve as cut_curve 11 | import nc 12 | import area 13 | 14 | ################################################################################ 15 | class Creator(recreator.Redirector): 16 | 17 | def __init__(self, original, drag_distance): 18 | recreator.Redirector.__init__(self, original) 19 | 20 | self.drag_distance = drag_distance 21 | self.path = None 22 | 23 | def cut_path(self): 24 | if self.path == None: return 25 | 26 | print self.drag_distance 27 | self.path.OffsetForward(self.drag_distance, False) 28 | 29 | nc.creator = nc.creator.original 30 | 31 | if self.path.getNumVertices() > 0: 32 | v = self.path.FirstVertex() 33 | nc.creator.feed(v.p.x, v.p.y) 34 | 35 | cut_curve(self.path) 36 | nc.creator = self 37 | 38 | self.path = area.Curve() 39 | 40 | def feed(self, x=None, y=None, z=None, a=None, b=None, c=None): 41 | px = self.x 42 | py = self.y 43 | pz = self.z 44 | recreator.Redirector.feed(self, x, y, z, a, b, c) 45 | if self.x == None or self.y == None or self.z == None: 46 | return 47 | if px == self.x and py == self.y: 48 | return 49 | 50 | # add a line to the path 51 | if self.path == None: self.path = area.Curve() 52 | self.path.append(area.Point(self.x, self.y)) 53 | 54 | def arc(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None, ccw = True): 55 | recreator.Redirector.arc(self, x, y, z, i, j, k, r, ccw) 56 | 57 | # add an arc to the path 58 | if self.path == None: self.path = area.Curve() 59 | self.path.append(area.Vertex(1 if ccw else -1, area.Point(self.x, self.y), area.Point(i, j))) 60 | 61 | def drag_begin(drag_distance): 62 | global dragging 63 | if dragging == True: 64 | drag_end() 65 | nc.creator = Creator(nc.creator, drag_distance) 66 | dragging = True 67 | 68 | def drag_end(): 69 | global dragging 70 | nc.creator.cut_path() 71 | nc.creator = nc.creator.original 72 | attached = False 73 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | 6 | class Parser(iso.Parser): 7 | def __init__(self, writer): 8 | iso.Parser.__init__(self, writer) 9 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2b.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso_modal 3 | import math 4 | import datetime 5 | import time 6 | 7 | now = datetime.datetime.now() 8 | 9 | class Creator(iso_modal.Creator): 10 | def __init__(self): 11 | iso_modal.Creator.__init__(self) 12 | self.output_block_numbers = False 13 | self.output_tool_definitions = False 14 | self.output_g43_on_tool_change_line = True 15 | 16 | def SPACE(self): 17 | if self.start_of_line == True: 18 | self.start_of_line = False 19 | return '' 20 | else: 21 | return ' ' 22 | 23 | def PROGRAM(self): return None 24 | def PROGRAM_END(self): 25 | if self.output_tool_change: 26 | return( 'T0' + self.SPACE() + 'M06' + self.SPACE() + 'M02') 27 | else: 28 | return('M02') 29 | 30 | def dwell(self, t): 31 | self.write('\n') 32 | iso_modal.Creator.dwell(self, t) 33 | ############################################################################ 34 | ## Begin Program 35 | 36 | 37 | def program_begin(self, id, comment): 38 | if (self.useCrc == False): 39 | self.write( ('(Created with emc2b post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') ) 40 | else: 41 | self.write( ('(Created with emc2b Cutter Radius Compensation post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') ) 42 | iso_modal.Creator.program_begin(self, id, comment) 43 | 44 | 45 | nc.creator = Creator() 46 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2b_crc.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # emc2b_crc.py 3 | # 4 | # a class derived from emc2b machine, with Cutter Radius Compensation turned on. 5 | # 6 | # Dan Heeks, 18th Jan 2011 7 | 8 | from . import nc 9 | from . import emc2b 10 | import math 11 | 12 | ################################################################################ 13 | class Creator(emc2b.Creator): 14 | 15 | def __init__(self): 16 | emc2b.Creator.__init__(self) 17 | self.useCrc = True 18 | 19 | ################################################################################ 20 | 21 | nc.creator = Creator() 22 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2b_crc_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2b_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2tap.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso_codes 3 | from . import emc2 4 | 5 | 6 | 7 | class CodesEMC2(iso_codes.Codes): 8 | def SPACE(self): return(' ') 9 | def TAP(self): return('G33.1') 10 | def TAP_DEPTH(self, format, depth): return(self.SPACE() + 'K' + (format % depth)) 11 | 12 | 13 | # This version of COMMENT removes comments from the resultant GCode 14 | #def COMMENT(self,comment): return('') 15 | 16 | iso_codes.codes = CodesEMC2() 17 | 18 | 19 | class CreatorEMC2tap(emc2.CreatorEMC2): 20 | def init(self): 21 | iso.CreatorEMC2.init(self) 22 | 23 | 24 | # G33.1 tapping with EMC for now 25 | # unsynchronized (chuck) taps NIY (tap_mode = 1) 26 | def tap(self, x=None, y=None, z=None, zretract=None, depth=None, standoff=None, dwell_bottom=None, pitch=None, stoppos=None, spin_in=None, spin_out=None, tap_mode=None, direction=None): 27 | # mystery parameters: 28 | # zretract=None, dwell_bottom=None,pitch=None, stoppos=None, spin_in=None, spin_out=None): 29 | # I dont see how to map these to EMC Gcode 30 | 31 | if (standoff == None): 32 | # This is a bad thing. All the drilling cycles need a retraction (and starting) height. 33 | return 34 | if (z == None): 35 | return # We need a Z value as well. This input parameter represents the top of the hole 36 | if (pitch == None): 37 | return # We need a pitch value. 38 | if (direction == None): 39 | return # We need a direction value. 40 | 41 | if (tap_mode != 0): 42 | self.comment('only rigid tapping currently supported') 43 | return 44 | 45 | self.write_preps() 46 | self.write_blocknum() 47 | self.write_spindle() 48 | self.write('\n') 49 | 50 | # rapid to starting point; z first, then x,y iff given 51 | 52 | # Set the retraction point to the 'standoff' distance above the starting z height. 53 | retract_height = z + standoff 54 | 55 | # unsure if this is needed: 56 | if self.z != retract_height: 57 | self.rapid(z = retract_height) 58 | 59 | # then continue to x,y if given 60 | if (x != None) or (y != None): 61 | self.write_blocknum() 62 | self.write(iso_codes.codes.RAPID() ) 63 | 64 | if (x != None): 65 | self.write(iso_codes.codes.X() + (self.fmt % x)) 66 | self.x = x 67 | 68 | if (y != None): 69 | self.write(iso_codes.codes.Y() + (self.fmt % y)) 70 | self.y = y 71 | self.write('\n') 72 | 73 | self.write_blocknum() 74 | self.write( iso_codes.codes.TAP() ) 75 | self.write( iso_codes.codes.TAP_DEPTH(self.ffmt,pitch) + iso_codes.codes.SPACE() ) 76 | self.write(iso_codes.codes.Z() + (self.fmt % (z - depth))) # This is the 'z' value for the bottom of the tap. 77 | self.write_misc() 78 | self.write('\n') 79 | 80 | self.z = retract_height # this cycle returns to the start position, so remember that as z value 81 | 82 | 83 | 84 | nc.creator = CreatorEMC2tap() 85 | 86 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/emc2tap_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/fadal.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # fadal.py 3 | # 4 | # Fadal ISO NC code creator 5 | # 6 | # TurBoss, 19/06/2016 7 | # 8 | ################################################################################ 9 | 10 | from . import nc 11 | from . import iso 12 | from .format import Format 13 | 14 | class Creator(iso.Creator): 15 | def __init__(self): 16 | iso.Creator.__init__(self) 17 | 18 | # internal variables 19 | 20 | self.fmt = Format(add_trailing_zeros = True) 21 | 22 | ############################################################################ 23 | ## Codes 24 | 25 | def SPACE_STR(self): return ' ' 26 | 27 | ############################################################################ 28 | ## Programs 29 | 30 | def program_begin(self, id, name=''): 31 | if self.use_this_program_id: 32 | id = self.use_this_program_id 33 | if self.PROGRAM() != None: 34 | self.write('%') 35 | self.write('\n') 36 | self.writem([(self.PROGRAM() % id), self.SPACE(), (self.COMMENT(name))]) 37 | self.write('\n') 38 | self.program_id = id 39 | self.program_name = name 40 | 41 | def program_end(self): 42 | if self.z_for_g53 != None: 43 | self.write(self.SPACE() + self.MACHINE_COORDINATES() + self.SPACE() + 'Z' + self.fmt.string(self.z_for_g53) + '\n') 44 | self.write(self.SPACE() + self.PROGRAM_END() + '\n') 45 | self.write('%') 46 | 47 | if self.temp_file_to_append_on_close != None: 48 | f_in = open(self.temp_file_to_append_on_close, 'r') 49 | while (True): 50 | line = f_in.readline() 51 | if (len(line) == 0) : break 52 | self.write(line) 53 | f_in.close() 54 | 55 | self.file_close() 56 | 57 | if self.output_block_numbers: 58 | # number every line of the file afterwards 59 | self.number_file(self.filename) 60 | 61 | for f in self.subroutine_files: 62 | self.number_file(f) 63 | 64 | nc.creator = Creator() 65 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/format.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | class Format: 4 | def __init__(self, number_of_decimal_places = 3, add_leading_zeros = 1, add_trailing_zeros = False, dp_wanted = True, add_plus = False, no_minus = False, round_down = False): 5 | self.number_of_decimal_places = number_of_decimal_places 6 | self.add_leading_zeros = add_leading_zeros # fill the start of the number with zeros, so there are at least this number of digits before the decimal point 7 | self.add_trailing_zeros = add_trailing_zeros # fill the end of the number with zeros, as defined by "number_of_decimal_places" 8 | self.dp_wanted = dp_wanted 9 | self.add_plus = add_plus 10 | self.no_minus = no_minus 11 | self.round_down = round_down 12 | 13 | def string(self, number): 14 | if number == None: 15 | return 'None' 16 | f = float(number) * math.pow(10, self.number_of_decimal_places) 17 | s = format(f, 'f') 18 | 19 | if self.round_down == False: 20 | if f < 0: f = f - .5 21 | else: f = f + .5 22 | s = format(float(number), 'f') 23 | 24 | if math.fabs(f) < 1.0: 25 | s = '0' 26 | 27 | minus = False 28 | if s[0] == '-': 29 | minus = True 30 | if self.no_minus: 31 | s = s[1:] 32 | 33 | dot = s.find('.') 34 | if dot == -1: 35 | before_dp = s 36 | after_dp = '' 37 | else: 38 | before_dp = s[0:dot] 39 | after_dp = s[dot + 1: dot + 1 + self.number_of_decimal_places] 40 | 41 | before_dp = before_dp.zfill(self.add_leading_zeros) 42 | if self.add_trailing_zeros: 43 | for i in range(0, self.number_of_decimal_places - len(after_dp)): 44 | after_dp += '0' 45 | else: 46 | after_dp = after_dp.rstrip('0') 47 | 48 | s = '' 49 | 50 | if minus == False: 51 | if self.add_plus == True: 52 | s += '+' 53 | s += before_dp 54 | if len(after_dp): 55 | if self.dp_wanted: s += '.' 56 | s += after_dp 57 | 58 | return s 59 | 60 | class Address: 61 | def __init__(self, text, fmt = Format(), modal = True): 62 | self.text = text 63 | self.fmt = fmt 64 | self.modal = modal 65 | self.str = None 66 | self.previous = None 67 | 68 | def set(self, number): 69 | self.str = self.text + self.fmt.string(number) 70 | 71 | def write(self, writer): 72 | if self.str == None: return '' 73 | if self.modal: 74 | if self.str != self.previous: 75 | writer.write(writer.SPACE() + self.str) 76 | self.previous = self.str 77 | else: 78 | writer.write(writer.SPACE() + self.str) 79 | self.str = None 80 | 81 | class AddressPlusMinus(Address): 82 | def __init__(self, text, fmt = Format(), modal = True): 83 | Address.__init__(self, text, fmt, modal) 84 | self.str2 = None 85 | self.previous2 = None 86 | 87 | def set(self, number, text_plus, text_minus): 88 | Address.set(self, number) 89 | if float(number) > 0.0: 90 | self.str2 = text_plus 91 | else: 92 | self.str2 = text_minus 93 | 94 | def write(self, writer): 95 | Address.write(self, writer) 96 | if self.str2 == None: return '' 97 | if self.modal: 98 | if self.str2 != self.previous2: 99 | writer.write(writer.SPACE() + self.str2) 100 | self.previous2 = self.str2 101 | else: 102 | writer.write(writer.SPACE() + self.str2) 103 | self.str2 = None 104 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/gantry_router.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import emc2 3 | 4 | class Creator(emc2.Creator): 5 | def init(self): 6 | emc2.Creator.init(self) 7 | 8 | def program_begin(self, id, comment): 9 | self.write( ('(' + comment + ')' + '\n') ) 10 | 11 | def tool_defn(self, id, name='', params=None): 12 | pass 13 | 14 | def spindle(self, s, clockwise): 15 | pass 16 | 17 | nc.creator = Creator() 18 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/gantry_router_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/gravos.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso 3 | 4 | 5 | class Creator(iso.Creator): 6 | def __init__(self): 7 | iso.Creator.__init__(self) 8 | 9 | def SPACE_STR(self): return ' ' 10 | def COMMENT(self, comment): return( (';%s' % comment ) ) 11 | def PROGRAM(self): return(None) 12 | 13 | def program_begin(self, id, comment): 14 | self.write( (';' + comment + '\n') ) 15 | def TIME(self): return('X') 16 | 17 | def SPINDLE_OFF(self): return('M05') 18 | # optimize 19 | def RAPID(self): return('G0') 20 | def FEED(self): return('G1') 21 | 22 | # def SPINDLE_DWELL(self,dwell): 23 | # w='\n'+self.BLOCK() % self.n+ self.DWELL() % dwell 24 | # return w 25 | # 26 | # def SPINDLE_CW(self,dwell): 27 | # return('M03' + self.SPINDLE_DWELL(dwell) ) 28 | # 29 | # def SPINDLE_CCW(self,dwell): 30 | # return('M04' + self.SPINDLE_DWELL(dwell)) 31 | # 32 | # def write_spindle(self): 33 | # #self.write('\n') 34 | # #self.write_blocknum() 35 | # self.s.write(self) 36 | 37 | 38 | def tool_change(self, id): 39 | #print(self.SPACE()) 40 | #print(self.TOOL()) 41 | self.write(self.SPACE() + (self.TOOL() % id) + '\n') 42 | #self.write('\n') 43 | self.flush_nc() 44 | self.t = id 45 | 46 | #def write_spindle(self): 47 | # if self.s.str!=None: 48 | # self.write(self.s.str) 49 | # self.s.str = None 50 | 51 | def PROGRAM_END(self): return( 'M30') 52 | 53 | def program_end(self): 54 | self.write(self.SPACE() + self.SPINDLE_OFF() + self.SPACE() + self.PROGRAM_END() + '\n') 55 | 56 | 57 | nc.creator = Creator() 58 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/grbl.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso_modal 3 | import math 4 | import datetime 5 | import time 6 | 7 | now = datetime.datetime.now() 8 | 9 | class Creator(iso_modal.Creator): 10 | def __init__(self): 11 | iso_modal.Creator.__init__(self) 12 | self.absolute_flag = True 13 | self.prev_g91 = '' 14 | self.useCrc = False 15 | self.start_of_line = True 16 | self.output_block_numbers = False 17 | self.output_tool_definitions = False 18 | 19 | def PROGRAM_END(self): return ' ' 20 | #optimize 21 | def RAPID(self): return('G0') 22 | def FEED(self): return('G1') 23 | 24 | ############################################################################ 25 | ## Begin Program 26 | 27 | 28 | def program_begin(self, id, comment): 29 | if (self.useCrc == False): 30 | self.write( ('(Created with grbl post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') ) 31 | else: 32 | self.write( ('(Created with grbl Cutter Radius Compensation post processor ' + str(now.strftime("%Y/%m/%d %H:%M")) + ')' + '\n') ) 33 | 34 | 35 | 36 | 37 | ############################################################################ 38 | ## Settings 39 | 40 | def tool_defn(self, id, name='', params=None): 41 | pass 42 | 43 | def tool_change(self, id): 44 | pass 45 | 46 | 47 | # This is the coordinate system we're using. G54->G59, G59.1, G59.2, G59.3 48 | # These are selected by values from 1 to 9 inclusive. 49 | def workplane(self, id): 50 | if ((id >= 1) and (id <= 6)): 51 | self.write_blocknum() 52 | self.write( (self.WORKPLANE() % (id + self.WORKPLANE_BASE())) + '\t (Select Relative Coordinate System)\n') 53 | if ((id >= 7) and (id <= 9)): 54 | self.write_blocknum() 55 | self.write( ((self.WORKPLANE() % (6 + self.WORKPLANE_BASE())) + ('.%i' % (id - 6))) + '\t (Select Relative Coordinate System)\n') 56 | 57 | 58 | nc.creator = Creator() 59 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hm50.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import emc2 3 | 4 | class Creator(emc2.Creator): 5 | def __init__(self): 6 | emc2.Creator.__init__(self) 7 | 8 | def program_begin(self, id, comment): 9 | self.write( ('(' + comment + ')' + '\n') ) 10 | 11 | def tool_change(self, id): 12 | self.write('G53 G00 Z30\n') 13 | self.write((self.TOOL() % id) + '\n') 14 | self.write('G01 Z100.000 F800.000\n') 15 | self.write('M0\n') 16 | self.write('G01 Z10.000 F300.000\n') 17 | 18 | 19 | nc.creator = Creator() 20 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hm50_read.py: -------------------------------------------------------------------------------- 1 | import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl2d.py: -------------------------------------------------------------------------------- 1 | # hpgl2d.py 2 | # 3 | # Copyright (c) 2009, Dan Heeks 4 | # This program is released under the BSD license. See the file COPYING for details. 5 | # 6 | 7 | from . import nc 8 | import math 9 | 10 | class Creator(nc.Creator): 11 | def __init__(self): 12 | nc.Creator.__init__(self) 13 | self.x = int(0) 14 | self.y = int(0) # these are in machine units, like 0.01mm or maybe 0.25mm 15 | self.metric() # set self.units_to_mc_units 16 | 17 | def imperial(self): 18 | self.units_to_mc_units = 2540 # multiplier from inches to machine units 19 | 20 | def metric(self): 21 | self.units_to_mc_units = 100 # multiplier from mm to machine units 22 | 23 | def program_begin(self, id, name=''): 24 | self.write('IN;\n') 25 | self.write('VS32,1;\n') 26 | self.write('VS32,2;\n') 27 | self.write('VS32,3;\n') 28 | self.write('VS32,4;\n') 29 | self.write('VS32,5;\n') 30 | self.write('VS32,6;\n') 31 | self.write('VS32,7;\n') 32 | self.write('VS32,8;\n') 33 | self.write('WU0;\n') 34 | self.write('PW0.349,1;\n') 35 | self.write('PW0.349,2;\n') 36 | self.write('PW0.349,3;\n') 37 | self.write('PW0.349,4;\n') 38 | self.write('PW0.349,5;\n') 39 | self.write('PW0.349,6;\n') 40 | self.write('PW0.349,7;\n') 41 | self.write('PW0.349,8;\n') 42 | self.write('SP1;\n') 43 | 44 | def program_end(self): 45 | self.write('SP0;\n') 46 | 47 | def closest_int(self, f): 48 | if math.fabs(f) < 0.3: 49 | return 0 50 | elif f > 0: 51 | return int(f + 0.5) 52 | else: 53 | return int(f - 0.5) 54 | 55 | def get_machine_x_y(self, x=None, y=None): 56 | machine_x = self.x 57 | machine_y = self.y 58 | if x != None: 59 | machine_x = self.closest_int(x * self.units_to_mc_units) 60 | if y != None: 61 | machine_y = self.closest_int(y * self.units_to_mc_units) 62 | return machine_x, machine_y 63 | 64 | def rapid(self, x=None, y=None, z=None, a=None, b=None, c=None): 65 | # ignore the z, any rapid will be assumed to be done with the pen up 66 | mx, my = self.get_machine_x_y(x, y) 67 | if mx != self.x or my != self.y: 68 | self.write(('PU%i' % mx) + (' %i;\n' % my)) 69 | self.x = mx 70 | self.y = my 71 | 72 | def feed(self, x=None, y=None, z=None, a=None, b=None, c=None): 73 | # ignore the z, any feed will be assumed to be done with the pen down 74 | mx, my = self.get_machine_x_y(x, y) 75 | if mx != self.x or my != self.y: 76 | self.write(('PD%i' % mx) + (' %i;\n' % my)) 77 | self.x = mx 78 | self.y = my 79 | 80 | def arc(self, cw, x=None, y=None, z=None, i=None, j=None, k=None, r=None): 81 | mx, my = self.get_machine_x_y(x, y) 82 | if mx != self.x or my != self.y: 83 | cx = float(self.x) / self.units_to_mc_units + i 84 | cy = float(self.y) / self.units_to_mc_units + j 85 | sdx = -i 86 | sdy = -j 87 | edx = x - cx 88 | edy = y - cy 89 | start_angle = math.atan2(sdy, sdx) 90 | end_angle = math.atan2(edy, edx) 91 | if cw: 92 | if start_angle < end_angle: start_angle += 2 * math.pi 93 | else: 94 | if end_angle < start_angle: end_angle += 2 * math.pi 95 | 96 | a = math.fabs(end_angle - start_angle) 97 | if cw: a = -a 98 | 99 | mcx, mcy = self.get_machine_x_y(cx, cy) 100 | 101 | self.write(('AA%i' % mcx) + (',%i' % mcy) + (',%d;\n' % (a * 180 / math.pi))) 102 | 103 | def arc_cw(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None): 104 | self.arc(True, x, y, z, i, j, k, r) 105 | 106 | def arc_ccw(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None): 107 | self.arc(False, x, y, z, i, j, k, r) 108 | 109 | nc.creator = Creator() 110 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl2d_read.py: -------------------------------------------------------------------------------- 1 | from . import num_reader 2 | import sys 3 | import math 4 | 5 | class Parser(num_reader.NumReader): 6 | 7 | def __init__(self, writer): 8 | num_reader.NumReader.__init__(self, writer) 9 | self.i = 0 10 | self.j = 0 11 | self.x = 0 12 | self.y = 0 13 | self.down_z = 0 14 | self.up_z = 20 15 | self.up = True 16 | self.units_to_mm = 0.01 17 | 18 | def ParsePuOrPd(self, up): 19 | self.line_index = self.line_index + 1 20 | x = self.get_number() 21 | if len(x) > 0: 22 | y = self.get_number() 23 | if len(y) > 0: 24 | if up: color = "rapid" 25 | else: color = "feed" 26 | self.add_word(color) 27 | self.begin_path(color) 28 | if up: z = self.up_z 29 | else: z = self.down_z 30 | if self.up != up: 31 | self.add_line(self.x * self.units_to_mm, self.y * self.units_to_mm, z) 32 | self.add_line(int(x) * self.units_to_mm, int(y) * self.units_to_mm, z) 33 | self.end_path() 34 | self.up = up 35 | self.x = int(x) 36 | self.y = int(y) 37 | 38 | def ParseAA(self): 39 | self.line_index = self.line_index + 1 40 | cx = self.get_number() 41 | if len(cx) > 0: 42 | cy = self.get_number() 43 | if len(cy) > 0: 44 | a = self.get_number() 45 | if len(a) > 0: 46 | self.add_word("feed") 47 | self.begin_path("feed") 48 | z = self.down_z 49 | if self.up: 50 | self.add_line(self.x * self.units_to_mm, self.y * self.units_to_mm, z) 51 | 52 | sdx = self.x - int(cx) 53 | sdy = self.y - int(cy) 54 | 55 | start_angle = math.atan2(sdy, sdx) 56 | 57 | end_angle = start_angle + int(a) * math.pi/180 58 | 59 | radius = math.sqrt(sdx*sdx + sdy*sdy) 60 | 61 | ex = int(cx) + radius * math.cos(end_angle) 62 | ey = int(cy) + radius * math.sin(end_angle) 63 | 64 | if int(a) > 0: d = 1 65 | else: d = -1 66 | 67 | self.add_arc(ex * self.units_to_mm, ey * self.units_to_mm, i = int(-sdx) * self.units_to_mm, j = int(-sdy) * self.units_to_mm, d = d) 68 | self.end_path() 69 | self.up = False 70 | self.x = int(ex) 71 | self.y = int(ey) 72 | 73 | def ParseFromFirstLetter(self, c): 74 | if c == 'P': 75 | self.line_index = self.line_index + 1 76 | if self.line_index < self.line_length: 77 | c1 = self.line[self.line_index] 78 | self.parse_word += c1 79 | if c1 == 'U': # PU 80 | self.ParsePuOrPd(True) 81 | elif c1 == 'D': # PD 82 | self.ParsePuOrPd(False) 83 | elif c == 'A': 84 | self.line_index = self.line_index + 1 85 | if self.line_index < self.line_length: 86 | c1 = self.line[self.line_index] 87 | self.parse_word += c1 88 | if c1 == 'A': # AA, arc absolute 89 | self.ParseAA() 90 | 91 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl2dv.py: -------------------------------------------------------------------------------- 1 | # hpgl2dv.py 2 | # 3 | # Copyright (c) 2009, Dan Heeks 4 | # This program is released under the BSD license. See the file COPYING for details. 5 | # 6 | 7 | # This is the same as the hpgl2d machine, but uses units of 0.25mm instead of 0.01mm 8 | 9 | from . import nc 10 | from . import hpgl2d 11 | 12 | class Creator(hpgl2d.Creator): 13 | def __init__(self): 14 | hpgl2d.Creator.__init__(self) 15 | 16 | def imperial(self): 17 | self.units_to_mc_units = 101.6 # multiplier from inches to machine units 18 | 19 | def metric(self): 20 | self.units_to_mc_units = 4 # multiplier from mm to machine units 21 | 22 | nc.creator = Creator() 23 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl2dv_read.py: -------------------------------------------------------------------------------- 1 | from . import hpgl2d_read as hpgl 2 | import sys 3 | 4 | # same as hpgl2d, but with 0.25mm units, instead of 0.01mm 5 | 6 | class Parser(hpgl.Parser): 7 | def __init__(self, writer): 8 | hpgl.ParserHgpl2d.__init__(self, writer) 9 | self.units_to_mm = 0.25 10 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl3d.py: -------------------------------------------------------------------------------- 1 | # hpgl3d.py 2 | # 3 | # Copyright (c) 2009, Dan Heeks 4 | # This program is released under the BSD license. See the file COPYING for details. 5 | # 6 | 7 | from . import nc 8 | from . import hpgl2d 9 | import math 10 | 11 | class Creator(hpgl2d.Creator): 12 | def __init__(self): 13 | hpgl2d.Creator.__init__(self) 14 | self.z = int(0) 15 | self.metric() # set self.units_to_mc_units 16 | self.doing_rapid = True 17 | 18 | def program_begin(self, id, name=''): 19 | self.write(';;^IN;!MC0;\n') 20 | self.write('V50.0;^PR;Z0,0,10500;^PA;\n') 21 | self.write('!RC15;\n') 22 | self.write('!MC1;\n') 23 | 24 | def program_end(self): 25 | self.write('!VZ50.0;!ZM0;\n') 26 | self.write('!MC0;^IN;\n') 27 | 28 | def get_machine_xyz(self, x=None, y=None, z=None): 29 | machine_x = self.x 30 | machine_y = self.y 31 | machine_z = self.z 32 | if x != None: 33 | machine_x = self.closest_int(x * self.units_to_mc_units) 34 | if y != None: 35 | machine_y = self.closest_int(y * self.units_to_mc_units) 36 | if z != None: 37 | machine_z = self.closest_int(z * self.units_to_mc_units) 38 | return machine_x, machine_y, machine_z 39 | 40 | def rapid(self, x=None, y=None, z=None, a=None, b=None, c=None): 41 | # do a rapid move. 42 | # for now, do all rapid moves at V50 ( 50 mm/s ) 43 | mx, my, mz = self.get_machine_xyz(x, y, z) 44 | if mx != self.x or my != self.y or mz != self.z: 45 | if self.doing_rapid == False: self.write('V50.0;') 46 | self.write(('Z%i' % mx) + (',%i' % my) + (',%i;\n' % mz)) 47 | self.x = mx 48 | self.y = my 49 | self.z = mz 50 | self.doing_rapid = True 51 | 52 | def feed(self, x=None, y=None, z=None, a=None, b=None, c=None): 53 | # do a feed move. 54 | # for now, do all feed moves at V10 ( 10 mm/s ) 55 | mx, my, mz = self.get_machine_xyz(x, y, z) 56 | if mx != self.x or my != self.y or mz != self.z: 57 | if self.doing_rapid == True: self.write('V10.0;') 58 | self.write(('Z%i' % mx) + (',%i' % my) + (',%i;\n' % mz)) 59 | self.x = mx 60 | self.y = my 61 | self.z = mz 62 | self.doing_rapid = False 63 | 64 | nc.creator = Creator() 65 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hpgl3d_read.py: -------------------------------------------------------------------------------- 1 | from . import num_reader 2 | import sys 3 | import math 4 | 5 | class Parser(num_reader.NumReader): 6 | 7 | def __init__(self, writer): 8 | num_reader.NumReader.__init__(self, writer) 9 | self.x = 0 10 | self.y = 0 11 | self.z = 10000 12 | self.f = 0 13 | self.units_to_mm = 0.01 14 | 15 | def ParseV(self): 16 | self.line_index = self.line_index + 1 17 | f = self.get_number() 18 | if len(f) > 0: 19 | self.f = float(f) 20 | self.add_word("prep") 21 | 22 | def ParseZ(self): 23 | self.line_index = self.line_index + 1 24 | x = self.get_number() 25 | if len(x) > 0: 26 | y = self.get_number() 27 | if len(y) > 0: 28 | z = self.get_number() 29 | if len(z) > 0: 30 | if self.f > 40: color = "rapid" 31 | else: color = "feed" 32 | self.add_word(color) 33 | self.begin_path(color) 34 | self.add_line(int(x) * self.units_to_mm, int(y) * self.units_to_mm, int(z) * self.units_to_mm) 35 | self.end_path() 36 | self.x = int(x) 37 | self.y = int(y) 38 | self.z = int(z) 39 | 40 | def ParseFromFirstLetter(self, c): 41 | if c == 'Z': 42 | self.ParseZ() 43 | elif c == 'V': 44 | self.ParseV() 45 | 46 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/hxml_writer.py: -------------------------------------------------------------------------------- 1 | import tempfile 2 | 3 | class HxmlWriter: 4 | def __init__(self): 5 | self.file_out = open(tempfile.gettempdir()+'/backplot.xml', 'w') 6 | self.file_out.write('\n') 7 | self.file_out.write('\n') 8 | 9 | def __del__(self): 10 | self.file_out.write('\n') 11 | self.file_out.close() 12 | 13 | def write(self, s): 14 | self.file_out.write(s) 15 | 16 | ############################################ 17 | 18 | def begin_ncblock(self): 19 | self.file_out.write('\t\n') 20 | 21 | def end_ncblock(self): 22 | self.file_out.write('\t\n') 23 | 24 | def add_text(self, s, col, cdata): 25 | s.replace('&', '&') 26 | s.replace('"', '"') 27 | s.replace('<', '<') 28 | s.replace('>', '>') 29 | if (cdata) : (cd1, cd2) = ('') 30 | else : (cd1, cd2) = ('', '') 31 | if (col != None) : self.file_out.write('\t\t'+cd1+s+cd2+'\n') 32 | else : self.file_out.write('\t\t'+cd1+s+cd2+'\n') 33 | 34 | def set_mode(self, units): 35 | self.file_out.write('\t\t\n') 38 | 39 | def metric(self): 40 | self.set_mode(units = 1.0) 41 | 42 | def imperial(self): 43 | self.set_mode(units = 25.4) 44 | 45 | def begin_path(self, col): 46 | if (col != None) : self.file_out.write('\t\t\n') 47 | else : self.file_out.write('\t\t\n') 48 | 49 | def end_path(self): 50 | self.file_out.write('\t\t\n') 51 | 52 | def rapid(self, x=None, y=None, z=None, a=None, b=None, c=None, machine_coordinates=None): 53 | self.begin_path("rapid") 54 | self.add_line(x, y, z, a, b, c) 55 | self.end_path() 56 | 57 | def feed(self, x=None, y=None, z=None): 58 | self.begin_path("feed") 59 | self.add_line(x, y, z) 60 | self.end_path() 61 | 62 | def arc_cw(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None): 63 | self.begin_path("feed") 64 | self.add_arc(x, y, z, i, j, k, r, -1) 65 | self.end_path() 66 | 67 | def arc_ccw(self, x=None, y=None, z=None, i=None, j=None, k=None, r=None): 68 | self.begin_path("feed") 69 | self.add_arc(x, y, z, i, j, k, r, 1) 70 | self.end_path() 71 | 72 | def tool_change(self, id): 73 | self.file_out.write('\t\t\n') 77 | 78 | def spindle(self, s, clockwise): 79 | pass 80 | 81 | def feedrate(self, f): 82 | pass 83 | 84 | def add_line(self, x, y, z, a = None, b = None, c = None): 85 | self.file_out.write('\t\t\t\n') 96 | if x != None: self.oldx = x 97 | if y != None: self.oldy = y 98 | if z != None: self.oldz = z 99 | 100 | def add_arc(self, x, y, z, i, j, k, r = None, d = None): 101 | self.file_out.write('\t\t\t\n') 114 | if x != None: self.oldx = x 115 | if y != None: self.oldy = y 116 | if z != None: self.oldz = z 117 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/iso_codes.py: -------------------------------------------------------------------------------- 1 | class Codes(): 2 | pass 3 | 4 | codes = Codes() 5 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/iso_crc.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # iso_crc.py 3 | # 4 | # a class derived from iso machine, with Cutter Radius Compensation turned on. 5 | # 6 | # Dan Heeks, 4th May 2010 7 | 8 | from . import nc 9 | from . import iso 10 | import math 11 | 12 | ################################################################################ 13 | class Creator(iso.Creator): 14 | 15 | def __init__(self): 16 | iso.Creator.__init__(self) 17 | self.useCrc = True 18 | 19 | ################################################################################ 20 | 21 | nc.creator = Creator() 22 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/iso_crc_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/iso_modal.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # iso_modal.py 3 | # 4 | # a class derived from iso machine, but with XYZF G1, G2 etc modal to reduce the size of the file. 5 | # 6 | # Dan Heeks, 4th May 2010 7 | 8 | from . import nc 9 | from . import iso 10 | import math 11 | 12 | ################################################################################ 13 | class Creator(iso.Creator): 14 | 15 | def __init__(self): 16 | iso.Creator.__init__(self) 17 | self.f_modal = True 18 | self.g0123_modal = True 19 | self.drill_modal = True 20 | ################################################################################ 21 | 22 | nc.creator = Creator() 23 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/iso_modal_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/lynx_otter_o.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso 3 | 4 | 5 | class Creator(iso.Creator): 6 | def __init__(self): 7 | iso.Creator.__init__(self) 8 | 9 | def SPACE_STR(self): return(' ') 10 | 11 | def COMMENT(self, comment): return('') 12 | 13 | def PROGRAM(self): return(None) 14 | 15 | def FORMAT_DWELL(self): return( self.SPACE() + self.DWELL() + ' X%f') 16 | def SPINDLE_OFF(self): return('M05\n') 17 | #optimize 18 | def RAPID(self): return('G00') 19 | def FEED(self): return('G01') 20 | 21 | # def IMPERIAL(self): return('G20\n') 22 | # def METRIC(self): return('G21\n') 23 | # def ABSOLUTE(self): return('G90\n') 24 | # def INCREMENTAL(self): return('G91\n') 25 | # def PLANE_XY(self): return('17\n') 26 | # def PLANE_XZ(self): return('18\n') 27 | # def PLANE_YZ(self): return('19\n') 28 | 29 | def dwell(self, t): 30 | pass 31 | """ 32 | self.write_blocknum() 33 | self.write_preps() 34 | self.write(self.FORMAT_DWELL() % t) 35 | self.write_misc() 36 | self.write('\n') 37 | """ 38 | def tool_change(self, id): 39 | pass 40 | # self.write_blocknum() 41 | # self.write(self.SPACE() + (self.TOOL() % id) + '\n') 42 | # self.write_blocknum() 43 | # self.write(self.SPACE() + self.s.str) 44 | # self.write('\n') 45 | # self.flush_nc() 46 | # self.t = id 47 | 48 | def PROGRAM_END(self): return( self.SPACE() + self.SPINDLE_OFF() + self.SPACE() + 'M30') 49 | 50 | 51 | nc.creator = Creator() 52 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/mach3.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso 3 | 4 | class Creator(iso.Creator): 5 | def __init__(self): 6 | iso.Creator.__init__(self) 7 | 8 | def SPACE_STR(self): return(' ') 9 | 10 | def program_begin(self, id, comment): 11 | self.write( ('(' + 'GCode created using the HeeksCNC Mach3 post processor' + ')' + '\n') ) 12 | self.write( ('(' + comment + ')' + '\n') ) 13 | 14 | def tool_change(self, id): 15 | self.write('G43H%i'% id +'\n') 16 | self.write((self.TOOL() % id) + '\n') 17 | self.t = id 18 | 19 | nc.creator = Creator() 20 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/mach3_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | from . import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/machines.txt: -------------------------------------------------------------------------------- 1 | emc2 LinuxCNC with tool offsets 0 2 | emc2b LinuxCNC 0 3 | emc2b_crc EMC2 with Cutter Comp 0 4 | mach3 Mach3 Machine Controller 0 5 | iso Standard ISO output 0 6 | iso_modal Standard ISO modal output 0 7 | iso_crc ISO with Cutter Comp 0 8 | siegkx1 Sieg KX1 machine 0 9 | hpgl2d 2.5D HPGL 0.01mm 0 10 | hpgl2dv 2.5D HPGL 0.25mm 0 11 | hpgl3d 3D HPGL 0.01mm 0 12 | hm50 Hafco HM-50 2400 13 | gantry_router Simple Gantry Router 0 14 | rez2 Prvá zváračská format rez 0 15 | centroid1 centroid mill 0 16 | anilam_crusader_m Anilam Crusader M 0 17 | makerbotHBP makerbotHBP 0 18 | lathe1 Lathe post 0 19 | emc2tap EMC Controller-tapping test 0 20 | tnc151 Heidenhain TNC151 21 | series1 Bridgeport Series I 22 | heiden Heidenhain test 0 23 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/makerbotHBP_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/num_reader.py: -------------------------------------------------------------------------------- 1 | from . import nc_read as nc 2 | import sys 3 | import math 4 | 5 | # a base class for hpgl parsers, and maybe others 6 | 7 | class NumReader(nc.Parser): 8 | 9 | def __init__(self): 10 | nc.Parser.__init__(self) 11 | 12 | def get_number(self): 13 | number = '' 14 | 15 | # skip spaces and commas at start of number 16 | while(self.line_index < self.line_length): 17 | c = self.line[self.line_index] 18 | if c == ' ' or c == ',': 19 | self.parse_word += c 20 | else: 21 | break 22 | self.line_index = self.line_index + 1 23 | 24 | while(self.line_index < self.line_length): 25 | c = self.line[self.line_index] 26 | if c == '.' or c == '0' or c == '1' or c == '2' or c == '3' or c == '4' or c == '5' or c == '6' or c == '7' or c == '8' or c == '9' or c == '-': 27 | number += c 28 | else: 29 | break 30 | self.parse_word += c 31 | self.line_index = self.line_index + 1 32 | 33 | return number 34 | 35 | def add_word(self, color): 36 | self.add_text(self.parse_word, color) 37 | self.parse_word = "" 38 | 39 | def Parse(self, name, oname=None): 40 | self.files_open(name,oname) 41 | 42 | while self.readline(): 43 | self.begin_ncblock() 44 | 45 | self.parse_word = "" 46 | self.line_index = 0 47 | self.line_length = len(self.line) 48 | 49 | while self.line_index < self.line_length: 50 | c = self.line[self.line_index] 51 | self.parse_word += c 52 | 53 | self.ParseFromFirstLetter(c) 54 | 55 | self.line_index = self.line_index + 1 56 | 57 | self.add_text(self.parse_word, None) 58 | 59 | self.end_ncblock() 60 | 61 | self.files_close() 62 | 63 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/printbot3d.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # printbot3d.py 3 | # 4 | # Dan Heeks 18th October 2010 5 | 6 | from . import nc 7 | from . import iso_modal 8 | import math 9 | 10 | ################################################################################ 11 | class CreatorPrintbot(iso_modal.CreatorIsoModal): 12 | 13 | def __init__(self): 14 | iso_modal.CreatorIsoModal.__init__(self) 15 | 16 | def tool_defn(self, id, name='', params=None): 17 | pass 18 | 19 | def write_blocknum(self): 20 | pass 21 | 22 | def set_plane(self, plane): 23 | pass 24 | 25 | def workplane(self, id): 26 | pass 27 | 28 | # Extruder Control 29 | 30 | def extruder_on(self): 31 | self.write('M101\n') 32 | 33 | def extruder_off(self): 34 | self.write('M103\n') 35 | 36 | def set_extruder_flowrate(self, flowrate): 37 | # re-use the spindle speed function 38 | self.spindle(flowrate, True) 39 | 40 | def extruder_temp(self, temp): 41 | self.write((maker.codes.EXTRUDER_TEMP(temp)) + ('\n')) 42 | 43 | # General 44 | def rapid(x=None, y=None, z=None, a=None, b=None, c=None): 45 | # do a G1 even for rapid moves 46 | iso_modal.CreatorIsoModal.feed(self, x, y, z) 47 | 48 | def feed(self, x=None, y=None, z=None, a=None, b=None, c=None): 49 | iso_modal.CreatorIsoModal.feed(self, x, y, z) 50 | 51 | ################################################################################ 52 | 53 | nc.creator = CreatorPrintbot() 54 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/printbot3d_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # based on the iso reader 5 | 6 | class Parser(iso.Parser): 7 | def __init__(self, writer): 8 | iso.Parser.__init__(self, writer) 9 | 10 | def ParseWord(self, word): 11 | iso.Parser.ParseWord(self, word) 12 | if (word == 'M103'): 13 | self.path_col = "rapid" 14 | self.col = "rapid" 15 | elif (word == 'M101'): 16 | self.path_col = "feed" 17 | self.col = "feed" 18 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/series1.py: -------------------------------------------------------------------------------- 1 | from . import nc 2 | from . import iso_modal 3 | import math 4 | 5 | ################################################################################ 6 | class Creator(iso_modal.Creator): 7 | 8 | def __init__(self): 9 | iso_modal.Creator.__init__(self) 10 | self.arc_centre_positive = True 11 | self.drillExpanded = True 12 | self.can_do_helical_arcs = False 13 | self.fmt.number_of_decimal_places = 2 14 | 15 | def tool_defn(self, id, name='', params=None): 16 | pass 17 | 18 | def dwell(self, t): 19 | # to do, find out what dwell is on this machine 20 | pass 21 | 22 | def metric(self): 23 | iso_modal.Creator.metric(self) 24 | self.fmt.number_of_decimal_places = 2 25 | 26 | def SPACE(self): 27 | return('') 28 | 29 | ################################################################################ 30 | 31 | nc.creator = Creator() 32 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/series1_read.py: -------------------------------------------------------------------------------- 1 | import iso_read as iso 2 | import sys 3 | 4 | # use the iso reader, but with i_and_j_always_positive 5 | 6 | class Parser(iso.Parser): 7 | def __init__(self, writer): 8 | iso.Parser.__init__(self, writer) 9 | self.arc_centre_positive = True 10 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/siegkx1.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # siegkx1.py 3 | # 4 | # Post Processor for the Sieg KX1 machine 5 | # It is just an ISO machine, but I don't want the tool definition lines 6 | # 7 | # Dan Heeks, 5th March 2009 8 | 9 | from . import nc 10 | from . import iso_modal 11 | import math 12 | 13 | ################################################################################ 14 | class Creator(iso_modal.Creator): 15 | 16 | def __init__(self): 17 | iso_modal.Creator.__init__(self) 18 | self.output_tool_definitions = False 19 | 20 | 21 | ################################################################################ 22 | 23 | nc.creator = Creator() 24 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/siegkx1_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/tnc151.py: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # tnc151.py 3 | # 4 | # Post Processor for the Heidenhain TNC151 machine 5 | # 6 | 7 | from . import nc 8 | from . import iso_modal 9 | import math 10 | 11 | ################################################################################ 12 | class Creator(iso_modal.Creator): 13 | 14 | def __init__(self): 15 | iso_modal.Creator.__init__(self) 16 | self.fmt.add_plus = True 17 | self.fmt.add_trailing_zeros = True 18 | self.f.fmt.add_plus = True 19 | self.s.fmt.add_plus = True 20 | self.n = 1 21 | self.waiting_t = None 22 | self.waiting_for_program_begin = False 23 | 24 | ######## Codes 25 | 26 | def SPACE(self): return(' ') 27 | def TOOL(self): return('T%i') 28 | 29 | ######## Overridden functions 30 | 31 | def write_blocknum(self): 32 | self.write(self.BLOCK() % self.n) 33 | self.n += 1 34 | 35 | def program_begin(self, id, name=''): 36 | self.waiting_for_program_begin = True 37 | 38 | def write_waiting_program_begin(self): 39 | if self.waiting_for_program_begin == True: 40 | self.write('% 123') 41 | self.waiting_for_program_begin = False 42 | 43 | def imperial(self): 44 | self.write_waiting_program_begin() 45 | self.write(' G70\n') 46 | self.fmt.number_of_decimal_places = 4 47 | 48 | def metric(self): 49 | self.write_waiting_program_begin() 50 | self.write(' G71\n') 51 | self.fmt.number_of_decimal_places = 3 52 | 53 | 54 | # no tool definition lines wanted 55 | def tool_defn(self, id, name='', params=None): 56 | pass 57 | 58 | # no comments wanted 59 | def comment(self, text): 60 | pass 61 | 62 | def spindle(self, s, clockwise): 63 | iso_modal.Creator.spindle(self, s, clockwise) 64 | self.write_waiting_tool_change() 65 | 66 | def tool_change(self, id): 67 | self.waiting_t = id 68 | 69 | def write_waiting_tool_change(self): 70 | if self.waiting_t: 71 | if len(self.g_list) > 0: 72 | self.write_blocknum() 73 | for g in self.g_list: 74 | self.write(self.SPACE() + g) 75 | self.g_list = [] 76 | self.write('\n') 77 | self.write_blocknum() 78 | self.write(self.SPACE() + (self.TOOL() % self.waiting_t)) 79 | self.write_preps() 80 | self.write_spindle() 81 | self.write_misc() 82 | self.write('\n') 83 | self.t = self.waiting_t 84 | self.waiting_t = None 85 | 86 | def workplane(self, id): 87 | pass 88 | ################################################################################ 89 | 90 | nc.creator = Creator() 91 | -------------------------------------------------------------------------------- /scripts/addons/cam/nc/tnc151_read.py: -------------------------------------------------------------------------------- 1 | from . import iso_read as iso 2 | import sys 3 | 4 | # just use the iso reader 5 | class Parser(iso.Parser): 6 | def __init__(self, writer): 7 | iso.Parser.__init__(self, writer) 8 | -------------------------------------------------------------------------------- /scripts/addons/cam/opencamlib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/scripts/addons/cam/opencamlib/__init__.py -------------------------------------------------------------------------------- /scripts/addons/cam/opencamlib/oclSample.py: -------------------------------------------------------------------------------- 1 | import os 2 | try: 3 | import ocl 4 | except ImportError: 5 | try: 6 | import opencamlib as ocl 7 | except ImportError: 8 | pass 9 | import tempfile 10 | 11 | from io_mesh_stl import blender_utils 12 | import mathutils 13 | import math 14 | from cam.simple import activate 15 | from cam.exception import * 16 | 17 | OCL_SCALE = 1000.0 18 | 19 | def get_oclSTL(operation): 20 | me = None 21 | oclSTL = ocl.STLSurf() 22 | found_mesh=False 23 | for collision_object in operation.objects: 24 | activate(collision_object) 25 | if collision_object.type == "MESH" or collision_object.type== "CURVE" or collision_object.type== "FONT" or collision_object.type== "SURFACE": 26 | found_mesh=True 27 | global_matrix = mathutils.Matrix.Identity(4) 28 | faces = blender_utils.faces_from_mesh(collision_object, global_matrix, operation.use_modifiers) 29 | for face in faces: 30 | t = ocl.Triangle(ocl.Point(face[0][0]*OCL_SCALE, face[0][1]*OCL_SCALE, (face[0][2]+operation.skin)*OCL_SCALE), 31 | ocl.Point(face[1][0]*OCL_SCALE, face[1][1]*OCL_SCALE, (face[1][2]+operation.skin)*OCL_SCALE), 32 | ocl.Point(face[2][0]*OCL_SCALE, face[2][1]*OCL_SCALE, (face[2][2]+operation.skin)*OCL_SCALE)) 33 | oclSTL.addTriangle(t) 34 | # FIXME needs to work with collections 35 | if not found_mesh: 36 | raise CamException("This operation requires a mesh or curve object or equivalent (e.g. text, volume).") 37 | return oclSTL 38 | 39 | 40 | def ocl_sample(operation, chunks): 41 | 42 | oclSTL = get_oclSTL(operation) 43 | 44 | op_cutter_type = operation.cutter_type 45 | op_cutter_diameter = operation.cutter_diameter 46 | op_minz = operation.minz 47 | op_cutter_tip_angle = math.radians(operation.cutter_tip_angle)/2 48 | if op_cutter_type == "VCARVE": 49 | cutter_length = (op_cutter_diameter/math.tan(op_cutter_tip_angle))/2 50 | else: 51 | cutter_length = 10 52 | 53 | cutter = None 54 | 55 | if op_cutter_type == 'END': 56 | cutter = ocl.CylCutter((op_cutter_diameter + operation.skin * 2) * 1000, cutter_length) 57 | elif op_cutter_type == 'BALLNOSE': 58 | cutter = ocl.BallCutter((op_cutter_diameter + operation.skin * 2) * 1000, cutter_length) 59 | elif op_cutter_type == 'VCARVE': 60 | cutter = ocl.ConeCutter((op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle, cutter_length) 61 | elif op_cutter_type =='CYLCONE': 62 | cutter = ocl.CylConeCutter((operation.cylcone_diameter/2+operation.skin)*2000,(op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle) 63 | elif op_cutter_type == 'BALLCONE': 64 | cutter = ocl.BallConeCutter((operation.ball_radius + operation.skin) * 2000, 65 | (op_cutter_diameter + operation.skin * 2) * 1000, op_cutter_tip_angle) 66 | elif op_cutter_type =='BULLNOSE': 67 | cutter = ocl.BullCutter((op_cutter_diameter + operation.skin * 2) * 1000,operation.bull_corner_radius*1000, cutter_length) 68 | else: 69 | print("Cutter unsupported: {0}\n".format(op_cutter_type)) 70 | quit() 71 | 72 | bdc = ocl.BatchDropCutter() 73 | bdc.setSTL(oclSTL) 74 | bdc.setCutter(cutter) 75 | 76 | for chunk in chunks: 77 | for coord in chunk.points: 78 | bdc.appendPoint(ocl.CLPoint(coord[0] * 1000, coord[1] * 1000, op_minz * 1000)) 79 | 80 | bdc.run() 81 | 82 | cl_points = bdc.getCLPoints() 83 | 84 | return cl_points 85 | -------------------------------------------------------------------------------- /scripts/addons/cam/opencamlib/opencamlib_readme.txt: -------------------------------------------------------------------------------- 1 | BlenderCAM OpenCAMLib support currently allows high quality, multithreaded sampling for 3-axis operations (parallel, spiral, etc.) and generation of waterlines. 2 | Known issues: 3 | - "skin" option is not supported yet 4 | - waterline fill is not supported yet 5 | - waterlines inside model have reversed direction (climb vs conventional) 6 | - for waterlines cutter length is fixed, should be determined from maximum operation depth 7 | - waterline sampling density is fixed, option to change it will be added soon 8 | 9 | To use OpenCAMLib, you will need Python 2.7 installation, with "python2.7" executable added to your path and OpenCAMLib library installed. 10 | 11 | OpenCAMLib installation instructions can be found at: 12 | https://github.com/vilemnovak/blendercam/wiki/Using-BlenderCAM-with-OpenCAMLib 13 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/scripts/addons/cam/ui_panels/__init__.py -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/area.py: -------------------------------------------------------------------------------- 1 | 2 | import bpy 3 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 4 | 5 | class CAM_AREA_Panel(CAMButtonsPanel, bpy.types.Panel): 6 | """CAM operation area panel""" 7 | bl_label = "CAM operation area " 8 | bl_idname = "WORLD_PT_CAM_OPERATION_AREA" 9 | 10 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 11 | 12 | def draw(self, context): 13 | self.scene = bpy.context.scene 14 | if not self.has_operations(): 15 | self.layout.label(text='Add operation first') 16 | return 17 | 18 | self.ao = self.active_operation() 19 | 20 | if not self.ao.valid: 21 | return 22 | 23 | self.draw_z_limits() 24 | 25 | if self.ao.strategy in ['BLOCK', 'SPIRAL', 'CIRCLES', 'PARALLEL', 'CROSS']: 26 | self.draw_xy_limits() 27 | 28 | # Draw layers option: use layers(y/n) and choose the stepdown 29 | def draw_z_limits(self): 30 | row = self.layout.row(align=True) 31 | row.prop(self.ao, 'use_layers') 32 | if self.ao.use_layers: 33 | row.prop(self.ao, 'stepdown') 34 | 35 | self.layout.prop(self.ao, 'maxz') 36 | 37 | if self.ao.maxz > self.ao.free_movement_height: 38 | self.layout.prop(self.ao, 'free_movement_height') 39 | self.layout.label(text='Depth start > Free movement') 40 | self.layout.label(text='POSSIBLE COLLISION') 41 | 42 | if self.ao.geometry_source in ['OBJECT', 'COLLECTION']: 43 | if self.ao.strategy == 'CURVE': 44 | self.layout.label(text="cannot use depth from object using CURVES") 45 | 46 | if not self.ao.minz_from_ob: 47 | if not self.ao.minz_from_material: 48 | self.layout.prop(self.ao, 'minz') 49 | self.layout.prop(self.ao, 'minz_from_material') 50 | if not self.ao.minz_from_material: 51 | self.layout.prop(self.ao, 'minz_from_ob') 52 | else: 53 | self.layout.prop(self.ao, 'source_image_scale_z') 54 | self.layout.prop(self.ao, 'source_image_size_x') 55 | if self.ao.source_image_name != '': 56 | i = bpy.data.images[self.ao.source_image_name] 57 | if i is not None: 58 | sy = int((self.ao.source_image_size_x / i.size[0]) * i.size[1] * 1000000) / 1000 59 | self.layout.label(text='image size on y axis: ' + strInUnits(sy, 8)) 60 | self.layout.separator() 61 | self.layout.prop(self.ao, 'source_image_offset') 62 | col = self.layout.column(align=True) 63 | col.prop(self.ao, 'source_image_crop', text='Crop source image') 64 | if self.ao.source_image_crop: 65 | col.prop(self.ao, 'source_image_crop_start_x', text='start x') 66 | col.prop(self.ao, 'source_image_crop_start_y', text='start y') 67 | col.prop(self.ao, 'source_image_crop_end_x', text='end x') 68 | col.prop(self.ao, 'source_image_crop_end_y', text='end y') 69 | 70 | def draw_xy_limits(self): 71 | self.layout.prop(self.ao, 'ambient_behaviour') 72 | if self.ao.ambient_behaviour == 'AROUND': 73 | self.layout.prop(self.ao, 'ambient_radius') 74 | 75 | self.layout.prop(self.ao, 'use_limit_curve') 76 | 77 | if self.ao.use_limit_curve: 78 | self.layout.prop_search(self.ao, "limit_curve", bpy.data, "objects") 79 | 80 | self.layout.prop(self.ao, "ambient_cutter_restrict") 81 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/buttons_panel.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | import sys 3 | 4 | # Panel definitions 5 | class CAMButtonsPanel: 6 | bl_space_type = 'PROPERTIES' 7 | bl_region_type = 'WINDOW' 8 | bl_context = "render" 9 | 10 | # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here 11 | 12 | @classmethod 13 | def poll(cls, context): 14 | rd = context.scene.render 15 | return rd.engine in cls.COMPAT_ENGINES 16 | 17 | def __init__(self): 18 | self.scene = bpy.context.scene 19 | 20 | 21 | def active_operation_index(self): 22 | return(self.scene.cam_active_operation) 23 | 24 | def active_operation(self): 25 | active_op = None 26 | try: 27 | active_op = self.scene.cam_operations[self.active_operation_index()] 28 | except IndexError: 29 | print(f"Invalid operation index {self.active_operation_index()}") 30 | 31 | return(active_op) 32 | 33 | def operations_count(self): 34 | return(len(self.scene.cam_operations)) 35 | 36 | def has_operations(self): 37 | return (self.operations_count() > 0) 38 | 39 | def opencamlib_version(self): 40 | try: 41 | import ocl 42 | except ImportError: 43 | try: 44 | import opencamlib as ocl 45 | except ImportError as e: 46 | return 47 | return(ocl.version()) 48 | 49 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/chains.py: -------------------------------------------------------------------------------- 1 | 2 | import bpy 3 | from bpy.types import UIList 4 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 5 | 6 | 7 | class CAM_UL_operations(UIList): 8 | def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): 9 | operation = item 10 | if self.layout_type in {'DEFAULT', 'COMPACT'}: 11 | 12 | layout.label(text=item.name, translate=False, icon_value=icon) 13 | icon = 'LOCKED' if operation.computing else 'UNLOCKED' 14 | if operation.computing: 15 | layout.label(text=operation.outtext) # "computing" ) 16 | elif self.layout_type in {'GRID'}: 17 | layout.alignment = 'CENTER' 18 | layout.label(text="", icon_value=icon) 19 | 20 | 21 | class CAM_UL_chains(UIList): 22 | def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): 23 | chain = item 24 | if self.layout_type in {'DEFAULT', 'COMPACT'}: 25 | 26 | layout.label(text=item.name, translate=False, icon_value=icon) 27 | icon = 'LOCKED' if chain.computing else 'UNLOCKED' 28 | if chain.computing: 29 | layout.label(text="computing") 30 | elif self.layout_type in {'GRID'}: 31 | layout.alignment = 'CENTER' 32 | layout.label(text="", icon_value=icon) 33 | 34 | 35 | class CAM_CHAINS_Panel(CAMButtonsPanel, bpy.types.Panel): 36 | """CAM chains panel""" 37 | bl_label = "CAM chains" 38 | bl_idname = "WORLD_PT_CAM_CHAINS" 39 | 40 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 41 | 42 | def draw(self, context): 43 | layout = self.layout 44 | 45 | row = layout.row() 46 | scene = bpy.context.scene 47 | 48 | row.template_list("CAM_UL_chains", '', scene, "cam_chains", scene, 'cam_active_chain') 49 | col = row.column(align=True) 50 | col.operator("scene.cam_chain_add", icon='ADD', text="") 51 | col.operator("scene.cam_chain_remove", icon='REMOVE', text="") 52 | 53 | if len(scene.cam_chains) > 0: 54 | chain = scene.cam_chains[scene.cam_active_chain] 55 | row = layout.row(align=True) 56 | 57 | if chain: 58 | row.template_list("CAM_UL_operations", '', chain, "operations", chain, 'active_operation') 59 | col = row.column(align=True) 60 | col.operator("scene.cam_chain_operation_add", icon='ADD', text="") 61 | col.operator("scene.cam_chain_operation_remove", icon='REMOVE', text="") 62 | if len(chain.operations) > 0: 63 | col.operator("scene.cam_chain_operation_up", icon='TRIA_UP', text="") 64 | col.operator("scene.cam_chain_operation_down", icon='TRIA_DOWN', text="") 65 | 66 | if not chain.computing: 67 | if chain.valid: 68 | pass 69 | layout.operator("object.calculate_cam_paths_chain", text="Calculate chain paths & Export Gcode") 70 | layout.operator("object.cam_export_paths_chain", text="Export chain gcode") 71 | layout.operator("object.cam_simulate_chain", text="Simulate this chain") 72 | else: 73 | layout.label(text="chain invalid, can't compute") 74 | else: 75 | layout.label(text='chain is currently computing') 76 | 77 | layout.prop(chain, 'name') 78 | layout.prop(chain, 'filename') 79 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/feedrate.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 3 | 4 | class CAM_FEEDRATE_Panel(CAMButtonsPanel, bpy.types.Panel): 5 | """CAM feedrate panel""" 6 | bl_label = "CAM feedrate" 7 | bl_idname = "WORLD_PT_CAM_FEEDRATE" 8 | 9 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 10 | 11 | def draw(self, context): 12 | if not self.has_operations(): 13 | self.layout.label(text='Add operation first') 14 | return 15 | 16 | ao = self.active_operation() 17 | if not ao.valid: return 18 | 19 | self.layout.prop(ao, 'feedrate') 20 | self.layout.prop(ao, 'do_simulation_feedrate') 21 | self.layout.prop(ao, 'plunge_feedrate') 22 | self.layout.prop(ao, 'plunge_angle') 23 | self.layout.prop(ao, 'spindle_rpm') 24 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/info.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import bpy 3 | 4 | from cam.simple import strInUnits 5 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 6 | 7 | # Info panel 8 | # This panel gives general information about the current operation 9 | 10 | class CAM_INFO_Panel(CAMButtonsPanel, bpy.types.Panel): 11 | """CAM info panel""" 12 | bl_label = "CAM info & warnings" 13 | bl_idname = "WORLD_PT_CAM_INFO" 14 | 15 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 16 | 17 | def draw(self, context): 18 | self.draw_opencamlib_version() 19 | 20 | if self.has_operations(): 21 | self.draw_active_op_warnings() 22 | self.draw_active_op_data() 23 | self.draw_active_op_money_cost() 24 | else: 25 | self.layout.label(text='No CAM operation created') 26 | 27 | def draw_opencamlib_version(self): 28 | opencamlib_version = self.opencamlib_version() 29 | if opencamlib_version is None: 30 | self.layout.label(text = "Opencamlib is not installed") 31 | else: 32 | self.layout.label(text = f"Opencamlib v{opencamlib_version} installed") 33 | 34 | def draw_active_op_warnings(self): 35 | active_op = self.active_operation() 36 | if active_op is None: return 37 | 38 | for line in active_op.warnings.rstrip("\n").split("\n"): 39 | if len(line) > 0 : 40 | self.layout.label(text=line, icon='ERROR') 41 | 42 | def draw_active_op_data(self): 43 | active_op = self.active_operation() 44 | if active_op is None: return 45 | if not active_op.valid: return 46 | if not int(active_op.duration*60) > 0: return 47 | 48 | active_op_time_text = "Operation Time: %d s " % int(active_op.duration*60) 49 | if active_op.duration > 60: 50 | active_op_time_text += " (%dh %dmin)" % (int(active_op.duration / 60), round(active_op.duration % 60)) 51 | elif active_op.duration > 1: 52 | active_op_time_text += " (%dmin)" % round(active_op.duration % 60) 53 | 54 | self.layout.label(text = active_op_time_text) 55 | 56 | self.layout.label(text="Chipload: %s/tooth" % strInUnits(active_op.chipload, 4)) 57 | 58 | def draw_active_op_money_cost(self): 59 | active_op = self.active_operation() 60 | if active_op is None: return 61 | if not active_op.valid: return 62 | if not int(active_op.duration*60) > 0: return 63 | 64 | # TODO: the hourly_rate button properties should be moved here (UI related only) 65 | # Right now, trying to do so causes an error 66 | self.layout.prop(self.scene.cam_machine, 'hourly_rate') 67 | 68 | if float(self.scene.cam_machine.hourly_rate) < 0.01: return 69 | 70 | cost_per_second = self.scene.cam_machine.hourly_rate / 3600 71 | self.layout.label(text = "Operation cost: $%.2f (%.2f $/s)" 72 | % (active_op.duration * 60 * cost_per_second, cost_per_second) 73 | ) 74 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/machine.py: -------------------------------------------------------------------------------- 1 | 2 | import bpy 3 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 4 | 5 | class CAM_MACHINE_Panel(CAMButtonsPanel, bpy.types.Panel): 6 | """CAM machine panel""" 7 | bl_label = " " 8 | bl_idname = "WORLD_PT_CAM_MACHINE" 9 | 10 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 11 | 12 | def draw_header(self, context): 13 | self.layout.menu("CAM_MACHINE_MT_presets", text="CAM Machine") 14 | 15 | def draw(self, context): 16 | layout = self.layout 17 | s = bpy.context.scene 18 | us = s.unit_settings 19 | 20 | ao = s.cam_machine 21 | 22 | if ao: 23 | use_experimental = bpy.context.preferences.addons['cam'].preferences.experimental 24 | 25 | # machine preset 26 | row = layout.row(align=True) 27 | row.menu("CAM_MACHINE_MT_presets", text=bpy.types.CAM_MACHINE_MT_presets.bl_label) 28 | row.operator("render.cam_preset_machine_add", text="", icon='ADD') 29 | row.operator("render.cam_preset_machine_add", text="", icon='REMOVE').remove_active = True 30 | layout.prop(ao, 'post_processor') 31 | layout.prop(ao, 'eval_splitting') 32 | if ao.eval_splitting: 33 | layout.prop(ao, 'split_limit') 34 | 35 | layout.prop(us, 'system') 36 | 37 | layout.prop(ao, 'use_position_definitions') 38 | if ao.use_position_definitions: 39 | layout.prop(ao, 'starting_position') 40 | layout.prop(ao, 'mtc_position') 41 | layout.prop(ao, 'ending_position') 42 | layout.prop(ao, 'working_area') 43 | layout.prop(ao, 'feedrate_min') 44 | layout.prop(ao, 'feedrate_max') 45 | layout.prop(ao, 'feedrate_default') 46 | # TODO: spindle default and feedrate default should become part of the cutter definition... 47 | layout.prop(ao, 'spindle_min') 48 | layout.prop(ao, 'spindle_max') 49 | layout.prop(ao, 'spindle_start_time') 50 | layout.prop(ao, 'spindle_default') 51 | layout.prop(ao, 'output_tool_definitions') 52 | layout.prop(ao, 'output_tool_change') 53 | if ao.output_tool_change: 54 | layout.prop(ao, 'output_g43_on_tool_change') 55 | 56 | if use_experimental: 57 | layout.prop(ao, 'axis4') 58 | layout.prop(ao, 'axis5') 59 | layout.prop(ao, 'collet_size') 60 | 61 | layout.prop(ao, 'output_block_numbers') 62 | if ao.output_block_numbers: 63 | layout.prop(ao, 'start_block_number') 64 | layout.prop(ao, 'block_number_increment') 65 | layout.prop(ao, 'hourly_rate') 66 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/material.py: -------------------------------------------------------------------------------- 1 | 2 | import bpy 3 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 4 | 5 | class CAM_MATERIAL_Panel(CAMButtonsPanel, bpy.types.Panel): 6 | """CAM material panel""" 7 | bl_label = "CAM Material size and position" 8 | bl_idname = "WORLD_PT_CAM_MATERIAL" 9 | 10 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 11 | 12 | def draw(self, context): 13 | layout = self.layout 14 | scene = bpy.context.scene 15 | 16 | if len(scene.cam_operations) == 0: 17 | layout.label(text='Add operation first') 18 | if len(scene.cam_operations) > 0: 19 | ao = scene.cam_operations[scene.cam_active_operation] 20 | if ao: 21 | layout.template_running_jobs() 22 | if ao.geometry_source in ['OBJECT', 'COLLECTION']: 23 | layout.prop(ao, 'material_from_model') 24 | 25 | if ao.material_from_model: 26 | layout.prop(ao, 'material_radius_around_model') 27 | else: 28 | layout.prop(ao, 'material_origin') 29 | layout.prop(ao, 'material_size') 30 | 31 | layout.prop(ao, 'material_center_x') 32 | layout.prop(ao, 'material_center_y') 33 | layout.prop(ao, 'material_Z') 34 | layout.operator("object.cam_position", text="Position object") 35 | else: 36 | layout.label(text='Estimated from image') 37 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/movement.py: -------------------------------------------------------------------------------- 1 | 2 | import bpy 3 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 4 | 5 | 6 | class CAM_MOVEMENT_Panel(CAMButtonsPanel, bpy.types.Panel): 7 | """CAM movement panel""" 8 | bl_label = "CAM movement" 9 | bl_idname = "WORLD_PT_CAM_MOVEMENT" 10 | 11 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 12 | 13 | def draw(self, context): 14 | layout = self.layout 15 | scene = bpy.context.scene 16 | use_experimental = bpy.context.preferences.addons['cam'].preferences.experimental 17 | 18 | if len(scene.cam_operations) == 0: 19 | layout.label(text='Add operation first') 20 | if len(scene.cam_operations) > 0: 21 | ao = scene.cam_operations[scene.cam_active_operation] 22 | if ao.valid: 23 | layout.prop(ao, 'movement_type') 24 | 25 | if ao.movement_type in ['BLOCK', 'SPIRAL', 'CIRCLES']: 26 | layout.prop(ao, 'movement_insideout') 27 | 28 | layout.prop(ao, 'spindle_rotation_direction') 29 | layout.prop(ao, 'free_movement_height') 30 | if ao.maxz > ao.free_movement_height: 31 | layout.label(text='Depth start > Free movement') 32 | layout.label(text='POSSIBLE COLLISION') 33 | layout.prop(ao, 'useG64') 34 | if ao.useG64: 35 | layout.prop(ao, 'G64') 36 | if ao.strategy == 'PARALLEL' or ao.strategy == 'CROSS': 37 | if not ao.ramp: 38 | layout.prop(ao, 'parallel_step_back') 39 | if ao.strategy == 'CUTOUT' or ao.strategy == 'POCKET' or ao.strategy == 'MEDIAL_AXIS': 40 | layout.prop(ao, 'first_down') 41 | 42 | if ao.strategy == 'POCKET': 43 | layout.prop(ao, 'helix_enter') 44 | if ao.helix_enter: 45 | layout.prop(ao, 'ramp_in_angle') 46 | layout.prop(ao, 'helix_diameter') 47 | layout.prop(ao, 'retract_tangential') 48 | if ao.retract_tangential: 49 | layout.prop(ao, 'retract_radius') 50 | layout.prop(ao, 'retract_height') 51 | 52 | layout.prop(ao, 'ramp') 53 | if ao.ramp: 54 | layout.prop(ao, 'ramp_in_angle') 55 | layout.prop(ao, 'ramp_out') 56 | if ao.ramp_out: 57 | layout.prop(ao, 'ramp_out_angle') 58 | 59 | layout.prop(ao, 'stay_low') 60 | if ao.stay_low: 61 | layout.prop(ao, 'merge_dist') 62 | if ao.cutter_type != 'BALLCONE': 63 | layout.prop(ao, 'protect_vertical') 64 | if ao.protect_vertical: 65 | layout.prop(ao, 'protect_vertical_limit') 66 | -------------------------------------------------------------------------------- /scripts/addons/cam/ui_panels/optimisation.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | from cam.ui_panels.buttons_panel import CAMButtonsPanel 3 | 4 | class CAM_OPTIMISATION_Panel(CAMButtonsPanel, bpy.types.Panel): 5 | """CAM optimisation panel""" 6 | bl_label = "CAM optimisation" 7 | bl_idname = "WORLD_PT_CAM_OPTIMISATION" 8 | 9 | COMPAT_ENGINES = {'BLENDERCAM_RENDER'} 10 | 11 | def draw(self, context): 12 | layout = self.layout 13 | scene = bpy.context.scene 14 | 15 | if len(scene.cam_operations) == 0: 16 | layout.label(text='Add operation first') 17 | if len(scene.cam_operations) > 0: 18 | ao = scene.cam_operations[scene.cam_active_operation] 19 | if ao.valid: 20 | layout.prop(ao, 'optimize') 21 | if ao.optimize: 22 | layout.prop(ao, 'optimize_threshold') 23 | if ao.geometry_source == 'OBJECT' or ao.geometry_source == 'COLLECTION': 24 | exclude_exact = ao.strategy in ['MEDIAL_AXIS', 'POCKET', 'CUTOUT', 'DRILL', 'PENCIL', 25 | 'CURVE'] 26 | if not exclude_exact: 27 | layout.prop(ao, 'use_exact') 28 | layout.label(text="Exact mode must be set for opencamlib to work ") 29 | 30 | opencamlib_version = self.opencamlib_version() 31 | if opencamlib_version is None: 32 | layout.label(text="Opencamlib is NOT available ") 33 | layout.prop(ao, 'exact_subdivide_edges') 34 | else: 35 | layout.label(text=f"Opencamlib v{opencamlib_version} installed") 36 | layout.prop(ao, 'use_opencamlib') 37 | 38 | if exclude_exact or not ao.use_exact: 39 | layout.prop(ao, 'pixsize') 40 | layout.prop(ao, 'imgres_limit') 41 | 42 | sx = ao.max.x - ao.min.x 43 | sy = ao.max.y - ao.min.y 44 | resx = int(sx / ao.pixsize) 45 | resy = int(sy / ao.pixsize) 46 | l = 'resolution: ' + str(resx) + ' x ' + str(resy) 47 | layout.label(text=l) 48 | 49 | layout.prop(ao, 'simulation_detail') 50 | layout.prop(ao, 'circle_detail') 51 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/MakerBotReplicator.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = MakerBot Replicator 3 | machine_type = MakerBot 4 | machine_width = 225 5 | machine_depth = 145 6 | machine_height = 150 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = MakerBot 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 1.75 14 | nozzle_size = 0.4 15 | layer_height = 0.15 16 | fill_density = 10 17 | print_speed = 50 18 | print_temperature = 220 19 | travel_speed = 150 20 | 21 | [alterations] 22 | start.gcode = ; -- START GCODE -- 23 | M136 (enable build) 24 | M73 P0 25 | G162 X Y F2000(home XY axes maximum) 26 | G161 Z F900(home Z axis minimum) 27 | G92 X0 Y0 Z-5 A0 B0 (set Z to -5) 28 | G1 Z0.0 F{travel_speed}(move Z to '0') 29 | G161 Z F100(home Z axis minimum) 30 | M132 X Y Z A B (Recall stored home offsets for XYZAB axis) 31 | G92 X152 Y72 Z0 A0 B0 32 | G1 X-141 Y-74 Z40 F{travel_speed} (move to waiting position) 33 | G130 X20 Y20 A20 B20 (Lower stepper Vrefs while heating) 34 | M135 T0 35 | M104 S220 T0 36 | M133 T0 37 | G130 X127 Y127 A127 B127 (Set Stepper motor Vref to defaults) 38 | ; Sliced {filename} at: {day} {date} {time} 39 | ; Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density} 40 | ; Print time: {print_time} 41 | ; Filament used: {filament_amount}m {filament_weight}g 42 | ; Filament cost: {filament_cost} 43 | M73 P0; 44 | ; -- end of START GCODE -- 45 | 46 | end.gcode = ; -- END GCODE -- 47 | M127 T0; fan off 48 | M127 T0 (Fan Off) 49 | M18 A B(Turn off A and B Steppers) 50 | G1 Z155 F900 51 | G162 X Y F2000 52 | M18 X Y Z(Turn off steppers after a build) 53 | M104 S0 T0 54 | M70 P5 (We <3 Making Things!) 55 | M72 P1 ( Play Ta-Da song ) 56 | M73 P100 57 | M137 (build end notification) 58 | ; -- end of END GCODE -- 59 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/Mendel.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = Mendel 3 | machine_type = RepRap 4 | machine_width = 200 5 | machine_depth = 200 6 | machine_height = 140 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = RepRap (Marlin/Sprinter) 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 2.85 14 | nozzle_size = 0.5 15 | layer_height = 0.2 16 | print_speed = 50 17 | print_temperature = 240 18 | travel_speed = 150 19 | 20 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/Peachy.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = Peachy 3 | machine_type = RepRap 4 | machine_width = 80 5 | machine_depth = 80 6 | machine_height = 150 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = RepRap (Marlin/Sprinter) 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 2.85 14 | nozzle_size = 0.5 15 | layer_height = 0.2 16 | fill_density = 10 17 | print_speed = 30 18 | print_temperature = 240 19 | travel_speed = 150 20 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/PrintrBot.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = PrintrBot 3 | machine_type = RepRap 4 | machine_width = 150 5 | machine_depth = 150 6 | machine_height = 150 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = RepRap (Marlin/Sprinter) 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 2.85 14 | nozzle_size = 0.5 15 | layer_height = 0.2 16 | fill_density = 10 17 | print_speed = 30 18 | print_temperature = 240 19 | travel_speed = 150 20 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/PrintrBotLC+.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = PrintrBot LC+ 3 | machine_type = RepRap 4 | machine_width = 200 5 | machine_depth = 200 6 | machine_height = 200 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = RepRap (Marlin/Sprinter) 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 2.85 14 | nozzle_size = 0.5 15 | layer_height = 0.2 16 | fill_density = 10 17 | print_speed = 30 18 | print_temperature = 240 19 | travel_speed = 150 20 | -------------------------------------------------------------------------------- /scripts/addons/print_3d/machine_profiles/Prusa Mendel i3.ini: -------------------------------------------------------------------------------- 1 | [machine] 2 | machine_name = Prusa Mendel i3 3 | machine_type = RepRap 4 | machine_width = 198 5 | machine_depth = 185 6 | machine_height = 200 7 | machine_center_is_zero = False 8 | has_heated_bed = True 9 | gcode_flavor = RepRap (Marlin/Sprinter) 10 | extruder_amount = 1 11 | 12 | [profile] 13 | filament_diameter = 2.85 14 | nozzle_size = 0.5 15 | layer_height = 0.2 16 | print_speed = 50 17 | print_temperature = 240 18 | travel_speed = 150 19 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/BALLCONE_1.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLCONE' 5 | d.ball_radius = 0.001 6 | d.ball_cone_flute = 0.03 7 | d.cutter_diameter = 0.006 8 | d.cutter_length = 25.0 9 | d.cutter_tip_angle = 60.0 -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_1.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.001 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_1.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0015 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_10.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.010 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_12.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.012 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_16.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.016 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_2.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.002 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_2.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0025 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_20.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.020 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_3.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.003 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_3.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0035 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_4.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0040 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_5.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0050 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_6.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0060 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_7.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0070 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/ball_8.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'BALLNOSE' 5 | d.cutter_diameter = 0.0080 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_1.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.001 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_1.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0015 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_10.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.010 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_12.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.012 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_16.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.016 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_2.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.002 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_2.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0025 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_20.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.020 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_3.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.003 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_3.50mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0035 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_4.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0040 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_5.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0050 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_6.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0060 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_7.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0070 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/end_cyl_8.00mm.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'END' 5 | d.cutter_diameter = 0.0080 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/v-carve_3mm_45deg.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'VCARVE' 5 | d.cutter_diameter = 0.003 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 45.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/v-carve_3mm_60deg.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'VCARVE' 5 | d.cutter_diameter = 0.003 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/v-carve_6mm_45deg.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'VCARVE' 5 | d.cutter_diameter = 0.006 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 45.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_cutters/v-carve_6mm_60deg.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | d.cutter_type = 'VCARVE' 5 | d.cutter_diameter = 0.006 6 | d.cutter_length = 25.0 7 | d.cutter_tip_angle = 60.0 8 | -------------------------------------------------------------------------------- /scripts/presets/cam_machines/emc_test_2.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_machine 3 | s = bpy.context.scene.unit_settings 4 | 5 | d.exporter = 'EMC' 6 | s.system = 'IMPERIAL' 7 | d.working_area = (0.800000011920929, 0.5600000023841858, 0.09000000357627869) 8 | d.feedrate_min = 9.999999747378752e-06 9 | d.feedrate_max = 2.0 10 | d.feedrate_default = 1.5 11 | d.spindle_min = 5000.0 12 | d.spindle_max = 25000.0 13 | d.spindle_default = 20000.0 14 | d.axis4 = False 15 | d.axis5 = False 16 | d.collet_size = 0.0 17 | -------------------------------------------------------------------------------- /scripts/presets/cam_machines/kk1000s.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | d = bpy.context.scene.cam_machine 3 | s = bpy.context.scene.unit_settings 4 | 5 | d.exporter = 'MACH3' 6 | s.system = 'METRIC' 7 | d.working_area = (0.800000011920929, 0.5600000023841858, 0.09000000357627869) 8 | d.feedrate_min = 9.999999747378752e-06 9 | d.feedrate_max = 2.0 10 | d.feedrate_default = 1.5 11 | d.spindle_min = 5000.0 12 | d.spindle_max = 25000.0 13 | d.spindle_default = 20000.0 14 | d.axis4 = False 15 | d.axis5 = False 16 | d.collet_size = 0.0 17 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Block_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Block' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Block' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'BLOCK' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Block_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.004 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Block' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Block' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'BLOCK' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Circles_All_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Circles' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Circles' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CIRCLES' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Circles_Around_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Circles' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Circles' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CIRCLES' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Cross_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Cross' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Cross' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CROSS' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Cross_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Cross' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Cross' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CROSS' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Cutout.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Cutout' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Cutout' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CUTOUT' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Outline_Fill_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Outline' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Outline' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'OUTLINEFILL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Parallel_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Parallel' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Parallel' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'PARALLEL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Parallel_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Parallel' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Parallel' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'PARALLEL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Pencil_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Pencil' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Pencil' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'PENCIL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Pocket_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Pocket' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Pocket' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'POCKET' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Spiral_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Spiral' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Spiral' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'SPIRAL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Fin_Ball_3,0_Spiral_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.00015 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 3.0 21 | o.filename = 'Fin_Ball_3,0_Spiral' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Fin_Ball_3,0_Spiral' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'SPIRAL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Finishing_3mm_ballnose.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003000000026077032 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.00019999999494757503 17 | o.dist_between_paths = 0.0005000000237487257 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Operation_1' 22 | o.free_movement_height = 0.009999999776482582 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.019999999552965164 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Operation_1' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.7853984832763672 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 50.0 42 | o.protect_vertical = False 43 | o.render_all = True 44 | o.skin = 0.0 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = False 52 | o.stepdown = 0.009999999776482582 53 | o.strategy = 'CROSS' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = False 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Block_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Block' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Block' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'BLOCK' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Block_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Block' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Block' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'BLOCK' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Circles_All_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Circles' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Circles' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'CIRCLES' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Circles_Around_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Circles' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Circles' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'CIRCLES' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Cross_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Cross' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Cross' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'CROSS' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Cross_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Cross' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Cross' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'CROSS' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Cutout.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Cutout' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Cutout' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'CUTOUT' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Outline_Fill_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Outline' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Outline' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'OUTLINEFILL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Parallel_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Parallel' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Parallel' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'PARALLEL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Parallel_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Parallel' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Parallel' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'PARALLEL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Pencil_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Pencil' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Pencil' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'PENCIL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Pocket_EXPERIMENTAL.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Pocket' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Pocket' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'POCKET' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Spiral_All.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'ALL' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Spiral' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Spiral' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'SPIRAL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /scripts/presets/cam_operations/Rou_Ball_3,0_Spiral_Around.py: -------------------------------------------------------------------------------- 1 | import bpy 2 | o = bpy.context.scene.cam_operations[bpy.context.scene.cam_active_operation] 3 | 4 | o.ambient_behaviour = 'AROUND' 5 | o.ambient_radius = 0.009999999776482582 6 | o.auto_nest = False 7 | o.borderwidth = 50 8 | o.carve_depth = 0.0010000000474974513 9 | o.circle_detail = 64 10 | o.curve_object = '' 11 | o.cut_type = 'OUTSIDE' 12 | o.cutter_diameter = 0.003 13 | o.cutter_length = 25.0 14 | o.cutter_tip_angle = 60.0 15 | o.cutter_type = 'BALLNOSE' 16 | o.dist_along_paths = 0.0002 17 | o.dist_between_paths = 0.0024 18 | o.dont_merge = False 19 | o.duration = 96.3156509399414 20 | o.feedrate = 1.0 21 | o.filename = 'Rou_Ball_3,0_Spiral' 22 | o.free_movement_height = 0.01 23 | o.geometry_source = 'OBJECT' 24 | o.inverse = False 25 | o.limit_curve = '' 26 | o.material_from_model = True 27 | o.material_origin = (0.0, 0.0, 0.0) 28 | o.material_radius_around_model = 0.003 29 | o.material_size = (0.20000000298023224, 0.20000000298023224, 0.10000000149011612) 30 | o.max = (0.1325458288192749, 0.14115460216999054, -0.041229985654354095) 31 | o.min = (0.02779383957386017, 0.014265235513448715, -0.1281193494796753) 32 | o.minz = -0.1281193494796753 33 | o.minz_from_ob = True 34 | o.movement_type = 'MEANDER' 35 | o.name = 'Rou_Ball_3,0_Spiral' 36 | o.object = None 37 | o.optimize = True 38 | o.optimize_threshold = 4.999999873689376e-05 39 | o.parallel_angle = 0.0 40 | o.pixsize = 9.999999747378752e-05 41 | o.plunge_feedrate = 30.0 42 | o.protect_vertical = True 43 | o.render_all = True 44 | o.skin = 0.0003 45 | o.slice_detail = 0.0010000000474974513 46 | o.source_image_name = '' 47 | o.source_image_offset = (0.0, 0.0, 0.0) 48 | o.source_image_scale_z = 1.0 49 | o.source_image_size_x = 0.10000000149011612 50 | o.spindle = 30000.0 51 | o.stay_low = True 52 | o.stepdown = 0.003 53 | o.strategy = 'SPIRAL' 54 | o.testing = 0 55 | o.update_offsetimage_tag = False 56 | o.update_silhouete_tag = True 57 | o.update_zbufferimage_tag = False 58 | o.use_layers = True 59 | o.use_limit_curve = False 60 | o.waterline_fill = True 61 | -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkpivot/blendercam/2cea4b694a753e29a652986a08a5494c258ae010/static/logo.png --------------------------------------------------------------------------------