Просмотр исходного кода

experimental housing (foldable/bendable housing)

clementinecomputing 5 лет назад
Родитель
Сommit
747ded02fe

+ 65 - 0
experiment/production/housing/v-anise/PopufareHousingBack.scad

@@ -0,0 +1,65 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+include <PopufareHousingCommon.scad>
+
+module PopufareHousingBackPlate() {
+
+  dh = POPUFARE_HOUSING_HEIGHT - POPUFARE_FRONT_HEIGHT;
+  top_dh = POPUFARE_HOUSING_HEIGHT - POPUFARE_FRONT_HEIGHT;
+
+  lip = _MATERIAL_THICKNESS;
+
+  top_w = POPUFARE_HOUSING_WIDTH;
+  top_h = POPUFARE_HOUSING_DEPTH-dh;
+
+
+  back_w = POPUFARE_HOUSING_WIDTH;
+  back_h = POPUFARE_HOUSING_HEIGHT - POPUFARE_HOUSING_BACK_LIP_HEIGHT;
+
+  lip_w = POPUFARE_HOUSING_WIDTH;
+  lip_h = POPUFARE_HOUSING_BACK_LIP_SPACE;
+
+  bend_thick = 1.5;
+  bend_w = POPUFARE_HOUSING_WIDTH;
+  bend_h = bend_thick;
+
+  screw_ofy = POPUFARE_HOUSING_BACK_LIP_SCREW_OFFSET_BACK_Y;
+  screw_dx = POPUFARE_HOUSING_BACK_LIP_SCREW_DX;
+  screw_r = _LIP_SCREW_D/2;
+
+
+  notch_w = 5;
+  notch_h = 5;
+
+  difference() {
+    union() {
+      translate([0,-(back_h/2+bend_thick+top_h/2)]) square([top_w, top_h], center=true);
+      translate([0,-(back_h/2+bend_thick/2)]) square([bend_w,bend_h], center=true);
+      square([back_w,back_h], center=true);
+      translate([0,(back_h/2+bend_thick/2)]) square([bend_w, bend_h], center=true);
+      translate([0,(back_h/2+bend_thick+lip_h/2)]) square([lip_w,lip_h], center=true);
+    }
+
+    // notches
+    //
+    translate([-(bend_w/2-notch_w/2),-(back_h/2+bend_thick/2)]) square([notch_w,notch_h], center=true);
+    translate([ (bend_w/2-notch_w/2),-(back_h/2+bend_thick/2)]) square([notch_w,notch_h], center=true);
+    translate([-(bend_w/2-notch_w/2), (back_h/2+bend_thick/2)]) square([notch_w,notch_h], center=true);
+    translate([ (bend_w/2-notch_w/2), (back_h/2+bend_thick/2)]) square([notch_w,notch_h], center=true);
+    
+    // attachment holes
+    //
+    translate([-screw_dx/2, (back_h/2 + lip_h - screw_ofy)]) circle(screw_r);
+    translate([ screw_dx/2, (back_h/2 + lip_h - screw_ofy)]) circle(screw_r);
+  }
+    
+
+}
+
+//PopufareHousingBackPlate();

+ 238 - 0
experiment/production/housing/v-anise/PopufareHousingCommon.scad

@@ -0,0 +1,238 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+$fs = 1.0/64.0;
+
+// ...
+//
+
+// 1/8 inch sheet thickness
+//
+//_MATERIAL_THICKNESS = 3.175
+
+// 1/4 inch sheet thickness
+//
+_MATERIAL_THICKNESS = 6.35;
+
+_M2 = 2.0;
+_M2r = 2.0/2;
+
+_M2_5 = 2.5;
+_M2_5r = 2.5/2;
+
+_M3 = 3.0;
+_M3r = 3.0/2;
+
+_M4 = 4.0;
+_M4r = 4.0/2;
+
+_M5 = 5.0;
+_M5r = 5.0/2;
+
+
+// in mm
+//
+POPUFARE_HOUSING_WIDTH = 263;
+POPUFARE_HOUSING_FULL_DEPTH = 215;
+POPUFARE_HOUSING_HEIGHT = 165;
+
+_LIP_SCREW_D = 6.35;
+POPUFARE_HOUSING_BACK_LIP_HEIGHT = 49;
+POPUFARE_HOUSING_FRONT_LIP_HEIGHT = 7.25;
+
+POPUFARE_HOUSING_BACK_LIP_DEPTH = 23;
+
+POPUFARE_HOUSING_BACK_LIP_SCREW_DX = 145 + _LIP_SCREW_D;
+POPUFARE_HOUSING_BACK_LIP_SCREW_OFFSET_SIDE_X = 30 + _LIP_SCREW_D/2;
+POPUFARE_HOUSING_BACK_LIP_SCREW_OFFSET_BACK_Y = 13.75 + _LIP_SCREW_D/2;
+POPUFARE_HOUSING_BACK_LIP_SPACE = POPUFARE_HOUSING_BACK_LIP_DEPTH + 10;
+
+POPUFARE_HOUSING_BACK_LIP_INSET = 30;
+
+POPUFARE_HOUSING_DEPTH = POPUFARE_HOUSING_FULL_DEPTH - POPUFARE_HOUSING_BACK_LIP_SPACE;
+
+POPUFARE_SCREEN_WIDTH = 165;
+POPUFARE_SCREEN_HEIGHT = 100;
+
+POPUFARE_SCREEN_SCREW_WIDTH = 157;
+POPUFARE_SCREEN_SCREW_HEIGHT = 115;
+
+POPUFARE_GLAND_DIAMETER = 37;
+POPUFARE_SCREEN_OUTER_WIDTH = 122;
+
+POPUFARE_SCREEN_OUTER_HEIGHT = 78;
+
+POPUFARE_FRONT_HEIGHT = 60;
+
+POPUFARE_FIXTURE_DX = 65;
+POPUFARE_FIXTURE_DY = 65;
+POPUFARE_FIXTURE_SCREW_D = 7.5;
+
+// bracket
+//
+
+// center of bracket to end
+//
+POPUFARE_BRACKET_CX = 20;
+
+// screw size to fit through bracket (bracket itself is 6mm in diameter)
+//
+POPUFARE_BRACKET_D = 5;
+POPUFARE_BRACKET_WIDTH = 16;
+
+POPUFARE_BRACKET_DS = 100;
+POPUFARE_BRACKET_DE = 40;
+POPUFARE_BRACKET_DE_MEDIUM = 30;
+POPUFARE_BRACKET_DE_SHORT = 20;
+
+// buck
+//
+
+POPUFARE_BUCK_HOLE_WIDTH0 = 53.6 + (59.8-53.6)/2;
+POPUFARE_BUCK_HOLE_WIDTH1 = 39 + (45-39)/2;
+
+POPUFARE_BUCK_HOLE_LEN1 = 6.2;
+POPUFARE_BUCK_HOLE_R = 3.0/2;
+
+POPUFARE_BUCK_WIDTH = 49.8;
+POPUFARE_BUCK_HEIGHT = 52.9;
+POPUFARE_BUCK_HOLE_DH = 25 + (6.25)/2 - 3.0/2;
+
+_BUCK_V2_DW = (61.25+48.45)/2;
+_BUCK_V2_R = (61.25-48.45)/4;
+
+// 117 - 111 = 6
+// 111 + 3 = 114
+//
+// 87 - 81 = 6
+// 81 + 3 = 84
+
+// inner plates
+//
+POPUFARE_INNER_PLATE_WIDTH = 90;
+POPUFARE_INNER_PLATE_HEIGHT = 70;
+
+//POPUFARE_INNER_PLATE_HOLE_WIDTH = POPUFARE_SCREEN_OUTER_WIDTH + 0;
+//POPUFARE_INNER_PLATE_HOLE_HEIGHT = POPUFARE_SCREEN_OUTER_HEIGHT + 20;
+
+POPUFARE_INNER_PLATE_HOLE_WIDTH = 114;
+POPUFARE_INNER_PLATE_HOLE_HEIGHT = 84;
+
+//POPUFARE_SPEAKER_HOLE_R = 2.5/2;
+//POPUFARE_SPEAKER_HOLE_WIDTH = 34.5 + ((39.5 - 34.5) / 2);
+
+
+// diagonal inner: 59.5
+// diagonal outer: 65.5
+// diagonal screw: 62.5
+// length/width = sqrt(2)*62.5/2
+//
+// diagonal inner: 55.0
+// diagonal outer: 65.0
+// diagonal screw: 60.0
+// length/width = sqrt(2)*60/2
+//
+POPUFARE_SPEAKER_HOLE_R = 4.5/2;
+POPUFARE_SPEAKER_HOLE_WIDTH = sqrt(2)*60.0/2;
+POPUFARE_SPEAKER_HOLE_HEIGHT = sqrt(2)*60.0/2;
+
+// Raspberry Pi measurements
+//
+_RASPBERRY_PI_B_HOLE_DX = 58;
+_RASPBERRY_PI_B_HOLE_DY = 48;
+
+_SCREEN_HOLE_DX = 93;
+_SCREEN_HOLE_DY = 69;
+
+
+// Center for raspberry pi from screen
+// that sits on top of it.
+//
+_SCREEN_OUTER_CENTER = [ POPUFARE_SCREEN_OUTER_WIDTH/2, POPUFARE_SCREEN_OUTER_HEIGHT/2 ];
+
+// offset of left screen m2 screws
+// as seen from the back, front ribbon down
+//
+_SCREEN_LL_M2_C = [ 5,5 ];
+_SCREEN_UL_M2_C = [ 5, POPUFARE_SCREEN_OUTER_HEIGHT - 4 ];
+
+_SCREEN_CX = _SCREEN_HOLE_DX/2 + _SCREEN_LL_M2_C[0] - _SCREEN_OUTER_CENTER[0];
+_SCREEN_CY = _SCREEN_HOLE_DY/2 + _SCREEN_LL_M2_C[1] - _SCREEN_OUTER_CENTER[1];
+
+_RASPBERRY_PI_B_CX = (_SCREEN_HOLE_DX - _RASPBERRY_PI_B_HOLE_DX/2) + _SCREEN_LL_M2_C[0] - _SCREEN_OUTER_CENTER[0];
+_RASPBERRY_PI_B_CY = (_SCREEN_HOLE_DY - _RASPBERRY_PI_B_HOLE_DY/2) + _SCREEN_LL_M2_C[1] - _SCREEN_OUTER_CENTER[1];
+
+RPI3BP_SCREW_DW = 58;
+RPI3BP_SCREW_DH = 49;
+RPI3BP_SCREW_DE = 3.5;
+RPI3BP_SCREW_R = 2.75/2;
+RPI3BP_SCREW_PAD_R = 6/2;
+RPI3BP_W = 85;
+RPI3BP_H = 56;
+RPI3BP_USB0_H = 29;
+RPI3BP_USB1_H = 47;
+RPI3BP_USB_DH = RPI3BP_USB1_H - RPI3BP_USB0_H;
+RPI3BP_ETH_H = 10.25;
+RPI3BP_ETH_DH = 16;
+
+RPI3BP_SD_W = 18;
+
+
+// Bounding box width of rouned rect is w and h,
+// so this function compensates for the rounded corner
+// radius.
+//
+// w - width or rectangle
+// h - height of rectangle
+// r - corner radius
+//
+// rounded rectangle has center of mass (center) at (0,0)
+//
+module rounded_rect(w,h,r) {
+  _w = w-2*r;
+  _h = h-2*r;
+  
+  x2 = _w/2;
+  y2 = _h/2;
+  
+  hull() {
+    translate([-x2, y2]) circle(r);
+    translate([ x2, y2]) circle(r);
+    translate([ x2,-y2]) circle(r);
+    translate([-x2,-y2]) circle(r);
+  }
+}
+
+
+// adapter dimensions
+//
+
+_POWER_CONNECTOR_WIDTH = 36.5;
+_POWER_CONNECTOR_HEIGHT = 10.5;
+_POWER_CONNECTOR_DEPTH = 14.5;
+
+_POWER_USB_HOLE_DW = 9.11 + (15.11-9.11)/2;
+_POWER_USB_HOLE_R = 3/2;
+
+_PIU_USB_HOLE_DW = 9.25 + (12.5-9.25)/2;
+_PIU_USB_HOLE_DE = 8.5;
+_PIU_USB_HOLE_R = 2/2;
+_PIU_USB_WIDTH = 12;
+
+_POWER_BOX_R = 3/2;
+_POWER_BOX_WIDTH = _POWER_CONNECTOR_WIDTH + 12*_POWER_BOX_R;
+_POWER_BOX_HEIGHT = 3*_POWER_CONNECTOR_WIDTH + 12*_POWER_BOX_R;
+
+_POWER_BOX_PIU_USB_H = -_POWER_BOX_HEIGHT/4;
+
+
+_POWER_BOX_STRAP_DW = 18;
+_POWER_BOX_STRAP_DH = 22;
+_POWER_BOX_STRAP_R = 3/2;
+
+

+ 66 - 0
experiment/production/housing/v-anise/PopufareHousingFront.scad

@@ -0,0 +1,66 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+include <PopufareHousingCommon.scad>
+
+module PopufareHousingFrontPlate() {
+
+  dh = POPUFARE_HOUSING_HEIGHT - POPUFARE_FRONT_HEIGHT;
+
+  lip = _MATERIAL_THICKNESS;
+
+  sp_w = POPUFARE_HOUSING_WIDTH;
+  sp_h = sqrt(2.0)*dh ;
+
+
+  screen_w = POPUFARE_SCREEN_WIDTH;
+  screen_h = POPUFARE_SCREEN_HEIGHT;
+  screen_cx = 0;
+  screen_cy = 0;
+  screen_attach_dw = POPUFARE_SCREEN_SCREW_WIDTH;
+  screen_attach_dh = POPUFARE_SCREEN_SCREW_HEIGHT;
+
+  bend_thick = 1.5;
+
+  fp_w = POPUFARE_HOUSING_WIDTH;
+  fp_h = POPUFARE_FRONT_HEIGHT;
+
+  notch_w = 5;
+  notch_h = 5;
+
+
+  difference() {
+    union() {
+      difference() {
+        square([sp_w,sp_h], center=true);
+
+        // screen window
+        //
+        translate([screen_cx, screen_cy]) square([screen_w, screen_h], center=true);
+
+        // screw hole attachments
+        //
+        translate([screen_cx, screen_cy]) translate([ screen_attach_dw/2, screen_attach_dh/2]) circle(_M3r);
+        translate([screen_cx, screen_cy]) translate([ screen_attach_dw/2,-screen_attach_dh/2]) circle(_M3r);
+        translate([screen_cx, screen_cy]) translate([-screen_attach_dw/2,-screen_attach_dh/2]) circle(_M3r);
+        translate([screen_cx, screen_cy]) translate([-screen_attach_dw/2, screen_attach_dh/2]) circle(_M3r);
+      }
+      
+      translate([0,-(sp_h/2 + bend_thick/2)]) square([sp_w,bend_thick], center=true);
+
+      translate([0,-(sp_h/2 + bend_thick + fp_h/2)]) square([fp_w, fp_h], center=true);
+    }
+    translate([0,-(sp_h/2 + bend_thick/2)])
+      translate([-(sp_w/2-notch_w/2),0]) square([notch_w, notch_h],center=true);
+    translate([0,-(sp_h/2 + bend_thick/2)])
+      translate([ (sp_w/2-notch_w/2),0]) square([notch_w, notch_h],center=true);
+  }   
+
+}
+
+//PopufareHousingFrontPlate();

+ 34 - 0
experiment/production/housing/v-anise/PopufareHousingSideLeft.scad

@@ -0,0 +1,34 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+include <PopufareHousingCommon.scad>
+
+module PopufareHousingSideLeftPlate() {
+  w = POPUFARE_HOUSING_DEPTH;
+  h = POPUFARE_HOUSING_HEIGHT;
+
+  dh = POPUFARE_HOUSING_HEIGHT - POPUFARE_FRONT_HEIGHT;
+  alen = dh*sqrt(2.0);
+  w_right = w - dh;
+
+  lip = 0;
+
+  difference() {
+    union() {
+      square([w,h], center=true);
+    }
+
+    // chop off angle
+    //
+    translate([-w/2,-(h/2-POPUFARE_FRONT_HEIGHT)]) rotate(45, [0,0,1]) square([4*w,4*w]);
+
+  }
+
+}
+
+//PopufareHousingSideLeftPlate();

+ 39 - 0
experiment/production/housing/v-anise/PopufareHousingSideRight.scad

@@ -0,0 +1,39 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+include <PopufareHousingCommon.scad>
+
+module PopufareHousingSideRightPlate() {
+  w = POPUFARE_HOUSING_DEPTH;
+  h = POPUFARE_HOUSING_HEIGHT;
+
+  dh = POPUFARE_HOUSING_HEIGHT - POPUFARE_FRONT_HEIGHT;
+  alen = dh*sqrt(2.0);
+  w_right = w - dh;
+
+  lip = 0;
+
+  power_w = 12;
+  power_h = 20;
+
+  difference() {
+    union() {
+      square([w,h], center=true);
+    }
+
+    // chop off angle
+    //
+    translate([-w/2,-(h/2-POPUFARE_FRONT_HEIGHT)]) rotate(45, [0,0,1]) square([4*w,4*w]);
+
+    translate([60,-50]) square([power_w, power_h], center=true);
+
+  }
+
+}
+
+//PopufareHousingSideRightPlate();

+ 22 - 0
experiment/production/housing/v-anise/PopufareHousingSides.scad

@@ -0,0 +1,22 @@
+// License: CC0
+//
+// To the extent possible under law, Clementine Computing LLC has waived
+// all copyright and related or neighboring rights to this file.
+//
+// This work is published from: United States.
+//
+
+include <PopufareHousingCommon.scad>
+include <PopufareHousingSideLeft.scad>
+include <PopufareHousingSideRight.scad>
+
+module PopufareHousingSidesPlate() {
+  translate([-30,-40,0])
+    rotate(-90, [0,0,1])
+    PopufareHousingSideLeftPlate();
+  translate([30,40,0])
+    rotate(90, [0,0,1])
+    PopufareHousingSideRightPlate();
+}
+
+PopufareHousingSidesPlate();

+ 3 - 0
experiment/production/housing/v-anise/export/cleanit

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+rm -f *.gp *.ngc *.svg *.ps *.eps

+ 554 - 0
experiment/production/housing/v-anise/export/cnc.1.log

@@ -0,0 +1,554 @@
+# sending initial command ''
+#  got : ok :
+# ok
+
+
+#### READY TO CUT, REMOVE PROBE AND PRESS ENTER TO CONTINUE
+# sending 'G1Z5'
+#  got : ok :
+# ok
+
+# sending 'M42'
+#  got : ok :
+# ok
+
+('## sending:', 'G90')
+# sending 'G90'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G21')
+# sending 'G21'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z10')
+# sending 'G1 Z10'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 Z10.0000000000 F800')
+# sending 'G0 Z10.0000000000 F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 X175.00000  Y92.00000  F800')
+# sending 'G0 X175.00000  Y92.00000  F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 Z10.0000000000 F800')
+# sending 'G0 Z10.0000000000 F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-1.6000000000 F150')
+# sending 'G1 Z-1.6000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y197.00000  F150')
+# sending 'G1 X70.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y197.00000  F150')
+# sending 'G1 X10.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y194.66162  F150')
+# sending 'G1 X10.00000  Y194.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y15.00000  F150')
+# sending 'G1 X10.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X41.16919  Y15.00000  F150')
+# sending 'G1 X41.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y15.00000  F150')
+# sending 'G1 X175.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-3.2000000000 F150')
+# sending 'G1 Z-3.2000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y197.00000  F150')
+# sending 'G1 X70.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y197.00000  F150')
+# sending 'G1 X10.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y194.66162  F150')
+# sending 'G1 X10.00000  Y194.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y15.00000  F150')
+# sending 'G1 X10.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X41.16919  Y15.00000  F150')
+# sending 'G1 X41.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y15.00000  F150')
+# sending 'G1 X175.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-4.8000000000 F150')
+# sending 'G1 Z-4.8000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y197.00000  F150')
+# sending 'G1 X70.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y197.00000  F150')
+# sending 'G1 X10.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y194.66162  F150')
+# sending 'G1 X10.00000  Y194.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y15.00000  F150')
+# sending 'G1 X10.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X41.16919  Y15.00000  F150')
+# sending 'G1 X41.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X46.16919  Y15.00000  F150')
+# sending 'G1 X46.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y15.00000  F150')
+# sending 'G1 X175.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y92.00000  F150')
+# sending 'G1 X175.00000  Y92.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.4000000000 F150')
+# sending 'G1 Z-6.4000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X171.46446  Y95.53554  F150')
+# sending 'G1 X171.46446  Y95.53554  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y197.00000  F150')
+# sending 'G1 X70.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y197.00000  F150')
+# sending 'G1 X10.00000  Y197.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y194.66162  F150')
+# sending 'G1 X10.00000  Y194.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.4000000000 F150')
+# sending 'G1 Z-6.4000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y189.66162  F150')
+# sending 'G1 X10.00000  Y189.66162  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X10.00000  Y15.00000  F150')
+# sending 'G1 X10.00000  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X41.16919  Y15.00000  F150')
+# sending 'G1 X41.16919  Y15.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')

Разница между файлами не показана из-за своего большого размера
+ 3819 - 0
experiment/production/housing/v-anise/export/cnc.front.log


+ 981 - 0
experiment/production/housing/v-anise/export/cnc.log

@@ -0,0 +1,981 @@
+# sending initial command ''
+#  got : ok :
+# ok
+
+
+#### READY TO CUT, REMOVE PROBE AND PRESS ENTER TO CONTINUE
+# sending 'G1Z5'
+#  got : ok :
+# ok
+
+# sending 'M42'
+#  got : ok :
+# ok
+
+('## sending:', 'G90')
+# sending 'G90'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G21')
+# sending 'G21'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z10')
+# sending 'G1 Z10'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 X235.00000  Y277.00000  F800')
+# sending 'G0 X235.00000  Y277.00000  F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 Z10.0000000000 F800')
+# sending 'G0 Z10.0000000000 F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-1.6000000000 F150')
+# sending 'G1 Z-1.6000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y277.00000  F150')
+# sending 'G1 X70.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y231.16919  F150')
+# sending 'G1 X70.00000  Y231.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y200.00000  F150')
+# sending 'G1 X70.00000  Y200.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y95.00000  F150')
+# sending 'G1 X175.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.16919  Y95.00000  F150')
+# sending 'G1 X206.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y95.00000  F150')
+# sending 'G1 X235.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-3.2000000000 F150')
+# sending 'G1 Z-3.2000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y277.00000  F150')
+# sending 'G1 X70.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y231.16919  F150')
+# sending 'G1 X70.00000  Y231.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y200.00000  F150')
+# sending 'G1 X70.00000  Y200.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y95.00000  F150')
+# sending 'G1 X175.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.16919  Y95.00000  F150')
+# sending 'G1 X206.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y95.00000  F150')
+# sending 'G1 X235.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-4.8000000000 F150')
+# sending 'G1 Z-4.8000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y277.00000  F150')
+# sending 'G1 X70.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y231.16919  F150')
+# sending 'G1 X70.00000  Y231.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y200.00000  F150')
+# sending 'G1 X70.00000  Y200.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y95.00000  F150')
+# sending 'G1 X175.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.16919  Y95.00000  F150')
+# sending 'G1 X206.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y95.00000  F150')
+# sending 'G1 X235.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.4000000000 F150')
+# sending 'G1 Z-6.4000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y277.00000  F150')
+# sending 'G1 X70.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y231.16919  F150')
+# sending 'G1 X70.00000  Y231.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.4000000000 F150')
+# sending 'G1 Z-6.4000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y200.00000  F150')
+# sending 'G1 X70.00000  Y200.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y95.00000  F150')
+# sending 'G1 X175.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.16919  Y95.00000  F150')
+# sending 'G1 X206.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.4000000000 F150')
+# sending 'G1 Z-6.4000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y95.00000  F150')
+# sending 'G1 X235.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-8.0000000000 F150')
+# sending 'G1 Z-8.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X230.00000  Y277.00000  F150')
+# sending 'G1 X230.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y277.00000  F150')
+# sending 'G1 X70.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y231.16919  F150')
+# sending 'G1 X70.00000  Y231.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-8.0000000000 F150')
+# sending 'G1 Z-8.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y226.16919  F150')
+# sending 'G1 X70.00000  Y226.16919  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X70.00000  Y200.00000  F150')
+# sending 'G1 X70.00000  Y200.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X175.00000  Y95.00000  F150')
+# sending 'G1 X175.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.16919  Y95.00000  F150')
+# sending 'G1 X206.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-6.0000000000 F150')
+# sending 'G1 Z-6.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-8.0000000000 F150')
+# sending 'G1 Z-8.0000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X211.16919  Y95.00000  F150')
+# sending 'G1 X211.16919  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y95.00000  F150')
+# sending 'G1 X235.00000  Y95.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X235.00000  Y277.00000  F150')
+# sending 'G1 X235.00000  Y277.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 Z10.0000000000 F800')
+# sending 'G0 Z10.0000000000 F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 X192.50000  Y240.00000  F800')
+# sending 'G0 X192.50000  Y240.00000  F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G0 Z10.0000000000 F800')
+# sending 'G0 Z10.0000000000 F800'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-1.6000000000 F150')
+# sending 'G1 Z-1.6000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y245.00000  F150')
+# sending 'G1 X192.50000  Y245.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y245.00000  F150')
+# sending 'G1 X192.50000  Y245.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y252.00000  F150')
+# sending 'G1 X192.50000  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X201.83333  Y252.00000  F150')
+# sending 'G1 X201.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.83333  Y252.00000  F150')
+# sending 'G1 X206.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.83333  Y252.00000  F150')
+# sending 'G1 X206.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X212.50000  Y252.00000  F150')
+# sending 'G1 X212.50000  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X212.50000  Y240.00000  F150')
+# sending 'G1 X212.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X209.75000  Y240.00000  F150')
+# sending 'G1 X209.75000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X204.75000  Y240.00000  F150')
+# sending 'G1 X204.75000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X204.75000  Y240.00000  F150')
+# sending 'G1 X204.75000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 Z-3.2000000000 F150')
+# sending 'G1 Z-3.2000000000 F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y240.00000  F150')
+# sending 'G1 X192.50000  Y240.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y245.00000  F150')
+# sending 'G1 X192.50000  Y245.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y245.00000  F150')
+# sending 'G1 X192.50000  Y245.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X192.50000  Y252.00000  F150')
+# sending 'G1 X192.50000  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X201.83333  Y252.00000  F150')
+# sending 'G1 X201.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.83333  Y252.00000  F150')
+# sending 'G1 X206.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X206.83333  Y252.00000  F150')
+# sending 'G1 X206.83333  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X212.50000  Y252.00000  F150')
+# sending 'G1 X212.50000  Y252.00000  F150'
+#  got : ok :
+# ok
+
+### got: ok
+
+('## sending:', 'G1 X212.50000  Y240.00000  F150')

+ 302 - 0
experiment/production/housing/v-anise/export/cnc3040.py

@@ -0,0 +1,302 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2020 abetusk
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import sys
+import os
+import numpy
+import random
+import getopt
+import re
+import scipy
+import numpy as np
+from scipy.interpolate import griddata
+import grbl
+from termcolor import colored, cprint
+
+DEFAULT_FEED_RATE = 60
+DEFAULT_DEVICE = "/dev/ttyACM0"
+
+unit = "mm"
+cur_x, cur_y, cur_z  = 0, 0, 0
+z_pos = 'up'
+
+dry_run = False
+
+z_threshold = 0.0
+z_plunge_inch = -0.004
+z_plunge_mm = z_plunge_inch * 25.4
+
+tty_device = DEFAULT_DEVICE
+
+output = None
+verbose = True
+
+def usage(ofp = sys.stdout):
+  ofp.write( "\nDo a height probe, interploate GCode file then execute job\n")
+  ofp.write( "\nusage:\n")
+  ofp.write( "  -g <gcode file>     gcode file\n")
+  ofp.write( "  [-m <height map>]   height map\n")
+  ofp.write( "  [-O <out height>]   output height map file (default stdout)\n")
+  ofp.write( "  [-D]                dry run (do not connect to GRBL)\n")
+  ofp.write( "  [-z <threshold>]    z threshold (default to " + str(z_threshold) + ")\n")
+  ofp.write( "  [-p <zplunge>]      amount under height sensed part to plunge (default " + str(z_plunge_mm) + "mm)\n")
+  ofp.write( "  [-T <device>]       use <device>\n")
+  ofp.write( "  [-h|--help]         help (this screen)\n")
+  ofp.write( "\n")
+
+gcode_file = None
+height_map_file = None
+out_height_map_file = None
+
+try:
+  opts, args = getopt.getopt(sys.argv[1:], "hm:g:z:Dp:O:T:", ["help", "output="])
+except getopt.GetoptError, err:
+  print str(err)
+  usage()
+  sys.exit(2)
+
+for o, a in opts:
+  if o == "-g":
+    gcode_file = a
+  elif o in ("-h", "--help"):
+    usage(sys.stdout)
+    sys.exit(0)
+  elif o == "-m":
+    height_map_file = a
+  elif o == "-z":
+    z_threshold = float(a)
+  elif o == "-p":
+    z_plunge_mm = float(a)
+  elif o == "-D":
+    dry_run = True
+  elif o == "-O":
+    out_height_map_file = a
+  elif o == "-T":
+    tty_device = a
+  else:
+    assert False, "unhandled option"
+
+if gcode_file is None:
+  sys.stderr.write("Provide gcode file\n")
+  usage(sys.stderr)
+  sys.exit(-1)
+
+pnts = []
+pnts_xy = []
+pntz_z = []
+
+def read_gcode_file(gcode_filename):
+  cur_x = 0.0
+  cur_y = 0.0
+
+  xvalid = False
+  yvalid = False
+
+  res = {
+    "lines":[],
+    "status":"init",
+    "error":"",
+    "min_x":0.0,
+    "min_y":0.0,
+    "max_x":0.0,
+    "max_y":0.0
+  }
+  lines = []
+  with open(gcode_filename, "r") as gc:
+    for line in gc:
+      line = line.strip()
+      line = line.rstrip('\n')
+      res["lines"].append(line)
+
+      m = re.match('^\s*(\(|;)', line)
+      if m: continue
+
+      m = re.match('.*[xX]\s*(-?\d+(\.\d+)?)', line)
+      if m:
+        cur_x = float(m.group(1))
+
+        if not xvalid:
+          res["min_x"] = cur_x
+          res["max_x"] = cur_x
+        xvalid = True
+        if cur_x < res["min_x"]: res["min_x"] = cur_x
+        if cur_x > res["max_x"]: res["max_x"] = cur_x
+
+      m = re.match('.*[yY]\s*(-?\d+(\.\d+)?)', line)
+      if m:
+        cur_y = float(m.group(1))
+
+        if not yvalid:
+          res["min_y"] = cur_y
+          res["max_y"] = cur_y
+        yvalid = True
+        if cur_y < res["min_y"]: res["min_y"] = cur_y
+        if cur_y > res["max_y"]: res["max_y"] = cur_y
+
+    res["status"] = "ok"
+    return res
+
+def interpolate_gcode(gcode, pnts_xy, pnts_z, _feed=DEFAULT_FEED_RATE):
+  unit = "mm"
+  cur_x, cur_y, cur_z  = 0, 0, 0
+  z_pos = 'up'
+  z_pos_prv = z_pos
+
+  z_threshold = 0.0
+  z_plunge_inch = -0.006
+  z_plunge_mm = z_plunge_inch * 25.4
+
+  lines = []
+
+  z_leeway = 1
+  z_ub = pnts_z[0]
+
+  g1_feed = _feed
+
+  for idx in range(len(pnts_z)):
+    if z_ub < pnts_z[idx]: z_ub = pnts_z[idx]
+  z_ub += z_leeway
+
+  for line in gcode["lines"]:
+    line = line.strip()
+    is_move = 0
+
+    l = line.rstrip('\n')
+
+    # skip comments
+    # assumes comments encased in parens all on one line 
+    #
+    m = re.match('^\s*(\(|;)', l)
+
+    if m:
+      lines.append(l)
+      continue
+
+    m = re.match('^\s*[gG]\s*(0*\d*)([^\d]|$)', l)
+    if m:
+      tmp_mode = m.group(1)
+      if re.match('^0*20$', tmp_mode):
+        unit = "inch"
+      elif re.match('^0*21$', tmp_mode):
+        unit = "mm"
+
+    m = re.match('^\s*[gG]\s*(0*[01])[^\d](.*)', l)
+
+    if m:
+      g_mode = m.group(1)
+      l = m.group(2)
+
+    m = re.match('.*[xX]\s*(-?\d+(\.\d+)?)', l)
+    if m:
+      is_move = 1
+      cur_x = m.group(1)
+
+    m = re.match('.*[yY]\s*(-?\d+(\.\d+)?)', l)
+    if m:
+      is_move = 1
+      cur_y = m.group(1)
+
+    m = re.match('.*[zZ]\s*(-?\d+(\.\d+)?)', l)
+    if m:
+      is_move = 1
+      cur_z = m.group(1)
+
+      if ( float(cur_z) >= z_threshold ):
+        z_pos = 'up'
+      else:
+        z_pos = 'down'
+
+    if is_move and (not g_mode):
+      return None
+
+    if not is_move:
+      lines.append(l)
+      continue
+
+    if (z_pos == 'up'):
+      lines.append("G" + str(g_mode) + " Z{0:.8f}".format(z_ub))
+    elif (z_pos == 'down'):
+
+      interpolated_z = griddata(pnts_xy, pnts_z, (cur_x, cur_y), method='linear')
+
+      if np.isnan(interpolated_z):
+        sys.stderr.write("ERROR: NaN at "  + str(cur_x) + " " + str(cur_y))
+        sys.stdout.write("ERROR: NaN at "  + str(cur_x) + " " + str(cur_y))
+        sys.stderr.flush()
+        sys.stdout.flush()
+        sys.exit(-5)
+
+      if unit == "inch":
+        z_plunge = z_plunge_inch
+      elif unit == "mm":
+        z_plunge = z_plunge_mm
+      else:
+        #print "ERROR: unit improperly set"
+        return None
+
+      interpolated_z += z_plunge
+
+      x_f = float(cur_x)
+      y_f = float(cur_y)
+
+      if z_pos_prv == "up":
+        lines.append("G0 X{0:.8f}".format(x_f) + " Y{0:.8f}".format(y_f) +  " Z{0:.8f}".format(z_ub))
+
+      #print "G" + g_mode, "X{0:.8f}".format(x_f), "Y{0:.8f}".format(y_f), "Z{0:.8f}".format(interpolated_z)
+      #lines.append("G" + str(g_mode) +  " X{0:.8f}".format(x_f) + " Y{0:.8f}".format(y_f) +  " Z{0:.8f}".format(interpolated_z))
+      lines.append("G" + str(g_mode) +  " X{0:.8f}".format(x_f) + " Y{0:.8f}".format(y_f) +  " Z{0:.8f}".format(interpolated_z) + " F{0:.8f}".format(g1_feed))
+
+    z_pos_prv = z_pos
+
+  return lines
+
+_gc = read_gcode_file(gcode_file)
+
+
+pnts = []
+
+if not dry_run:
+  grbl.setup(tty_device)
+  grbl.send_initial_command("")
+
+sys.stdout.write("\n#### ")
+cprint("READY TO CUT, REMOVE PROBE AND PRESS ENTER TO CONTINUE", "red", attrs=['blink'])
+sys.stdout.flush()
+sys.stdin.readline()
+
+if not dry_run:
+
+  grbl.send_command("G1Z5")
+  grbl.send_command("M42")
+
+  for line in _gc["lines"]:
+
+    line = line.strip()
+    if len(line)==0: continue
+    if line[0] == '#': continue
+    if line[0] == '(': continue
+
+    print("## sending:", line)
+    sys.stdout.flush()
+    r = grbl.send_command(line)
+    print "### got:", r
+    sys.stdout.flush()
+
+  grbl.send_command("M43")
+
+

+ 66 - 0
experiment/production/housing/v-anise/export/export-all

@@ -0,0 +1,66 @@
+#!/bin/bash
+
+VERSION=2.5.0
+
+function ngc_position {
+  ifn="$1"
+
+  offsetx=10
+  offsety=15
+
+  if [[ "$ifn" == "" ]] ; then
+    echo "provide file"
+    exit 1
+  fi
+
+  dos2unix $ifn
+  sed -i 's/;.*//' $ifn
+
+  mx=`ngc_bounds $ifn | grep min_x | cut -f2 -d' '`
+  my=`ngc_bounds $ifn | grep min_y | cut -f2 -d' '`
+
+  shiftx=` echo "-($mx) + $offsetx" | bc -l`
+  shifty=` echo "-($my) + $offsety" | bc -l`
+
+  tfn=`mktemp`
+
+  #echo "G0 F5000" > $tfn
+  grecode -shift "$shiftx" "$shifty" $ifn | \
+    grep -v '^(' >> $tfn 2> /dev/null
+  mv $tfn $ifn
+
+  rm -f $tfn
+}
+
+tmpfn=`mktemp`
+
+for fn in `ls ../Popufare*.scad  | grep -v PopufareHousingCommon.scad ` ; do
+  bfn=`basename $fn .scad`
+  svg="$bfn.$VERSION.svg"
+  svg_z="$bfn.z.$VERSION.svg"
+  ngc="$bfn.$VERSION.ngc"
+
+  echo "## $bfn"
+
+  basedir=`dirname $( pwd ) `
+
+  echo "include <$basedir/$bfn.scad>" > $tmpfn
+  echo "${bfn}Plate();" >> $tmpfn
+
+  openscad -o "$svg" "$tmpfn"
+  ./svg2ngc "$svg" 2> /dev/null
+  ngc_position "$ngc" 2> /dev/null
+
+  #sed -i 's/F800/F150/g' "$ngc"
+  #sed -i 's/G0\(.*\)S\(.*\)/G0\1 F5000 S\2/g' "$ngc"
+
+  cp "$svg" "$svg_z"
+
+  sed -i 's/<svg\(.*\) width="\([0-9]*\)"/<svg\1 width="\2mm"/' "$svg_z"
+  sed -i 's/<svg\(.*\) height="\([0-9]*\)"/<svg\1 height="\2mm"/' "$svg_z"
+  sed -i 's/ stroke-width="[^"]*"/ stroke-width=".0254"/' "$svg_z"
+
+
+done
+
+rm $tmpfn

+ 237 - 0
experiment/production/housing/v-anise/export/grbl.py

@@ -0,0 +1,237 @@
+#!/usr/bin/python
+#
+# some common functions I use in GRBL
+# grbl.setup()                          - setup connection.  can specify device, defaults to '/dev/ttyUSB0'
+#                                                            can specify baud, defaults to 8600
+# grbl.teardown()                       - explicitely closes the serial connection
+# grbl.send_command( cmd )              - send cmd to GRBL
+# grbl.get_position()                   - return (x, y, z) position
+# grbl.get_var_position( v )            - get variable 'v' position, where v is 'x', 'y' or 'z'
+# grbl.wait_for_var_position( v, pos )  - wait for axis 'v' to get within epsilon distance of 'pos'.
+#                                         This call blocks until position is reached, sleeping for 'sleepy'
+#                                         seconds at a time (sleepy can be subsecond).
+#
+
+import serial
+import re
+import math
+import time
+import sys
+
+
+# default values 
+#
+device = "/dev/ttyUSB0"
+baud = 115200
+grbl_serial = None
+sleepy = 0.05
+var_epsilon = 0.005
+infn = None
+
+#verbose = False
+verbose = True
+
+def setup( dev = device, b = baud ):
+  global device 
+  global baud
+  global grbl_serial
+  device = dev
+  baud = b
+  grbl_serial = serial.Serial( device, baud )
+
+def teardown():
+  global grbl_serial
+  if grbl_serial:
+    if verbose:
+      print "tearing down connection"
+    grbl_serial.close()
+
+def send_initial_command( cmd ) :
+  global grbl_serial
+  global verbose
+  if verbose:
+    print "# sending initial command '" + cmd + "'"
+  grbl_serial.write(cmd + "\n")
+  grbl_out = grbl_serial.readline()
+
+  ans = grbl_out
+  if verbose:
+    print "#  got :", grbl_out.strip(), ":"
+
+  if ( re.search("^error:", grbl_out) ):
+    return ans
+
+  if ( re.search("^Grbl", grbl_out) or re.search("^\s*$", grbl_out) ):
+    grbl_out = grbl_serial.readline()
+    ans = grbl_out
+    if verbose:
+      print "#  got :", grbl_out.strip()
+
+  if ( re.search("^\['", grbl_out) or re.search("^\s*$", grbl_out) ):
+    grbl_out = grbl_serial.readline()
+    ans = grbl_out
+    if verbose:
+      print "#  got :", grbl_out.strip()
+
+  if verbose:
+    print "#", grbl_out
+  return ans
+
+def send_command( cmd ) :
+  global grbl_serial
+  global verbose
+  if verbose:
+    print "# sending '" + cmd + "'"
+  grbl_serial.write(cmd + "\n")
+  grbl_out = grbl_serial.readline()
+
+  ans = grbl_out
+  if verbose:
+    print "#  got :", grbl_out.strip(), ":"
+
+  if ( re.search("^error:", grbl_out) ):
+    return ans
+
+  if ( re.search("^Grbl", grbl_out) or re.search("^\s*$", grbl_out) ):
+    grbl_out = grbl_serial.readline()
+    ans = grbl_out
+    if verbose:
+      print "#  got :", grbl_out.strip()
+
+  if ( re.search("^\['", grbl_out) or re.search("^\s*$", grbl_out) ):
+    grbl_out = grbl_serial.readline()
+    ans = grbl_out
+    if verbose:
+      print "#  got :", grbl_out.strip()
+
+  while ( not re.search("ok", grbl_out) ):
+    grbl_out = grbl_serial.readline()
+    if verbose:
+      print "#  got:", grbl_out.strip()
+    ans += grbl_out
+    if ( re.search("^error:", grbl_out) ):
+      return ans
+
+  if verbose:
+    print "#", grbl_out
+  return ans
+
+def get_position():
+  global grbl_serial
+  global verbose
+  grbl_serial.write("?")
+  grbl_out = grbl_serial.readline()
+
+  m = re.search( "^<([^,]*),MPos:([^,]*),([^,]*),([^,]*),", grbl_out)
+  if ( m ):
+    if verbose:
+      print "# matched", m.group(0)
+    state = m.group(1)
+    x = float(m.group(2))
+    y = float(m.group(3))
+    z = float(m.group(4))
+
+    return x, y, z
+
+  return None, None, None
+
+def get_var_position( var_name ):
+  global grbl_serial
+  global verbose
+  var_seen = 0
+  var_pos = 0.0
+  #grbl_serial.write("$?\n")
+  grbl_serial.write("?")
+  grbl_out = grbl_serial.readline()
+
+  if verbose:
+    print "#  get_var_position(", var_name, "): got :", grbl_out.strip()
+
+  m = re.search( "^<([^,]*),MPos:([^,]*),([^,]*),([^,]*),", grbl_out)
+  if ( m ):
+    if verbose:
+      print "# matched", m.group(0)
+    state = m.group(1)
+    x = float(m.group(2))
+    y = float(m.group(3))
+    z = float(m.group(4))
+
+    if ( var_name == 'x') or ( var_name == 'X'):
+      return x
+    if ( var_name == 'y') or ( var_name == 'Y'):
+      return y
+    if ( var_name == 'z') or ( var_name == 'Z'):
+      return z
+
+
+def wait_for_var_position( var_name, var_val ):
+  global grbl_serial
+  global verbose
+  global sleepy
+  global var_epsilon
+  cur_val = get_var_position( var_name )
+  if verbose:
+    print "#", str(var_val), " var_epsilon", str(var_epsilon), "cur_x", str(cur_val)
+  while (math.fabs(var_val - cur_val) > var_epsilon):
+    if verbose:
+      print "# cur_val", str(cur_val), ", waiting for ", var_name, str(var_val)
+    time.sleep(sleepy)
+    cur_val = get_var_position( var_name )
+  return cur_val
+
+if __name__ == "__main__":
+  import argparse
+  parser = argparse.ArgumentParser(description='Send GRBL commands.')
+  parser.add_argument("-B", "--baud", help="Set baud rate (default 9600)", nargs = 1, default=[baud], type=int)
+  parser.add_argument("-D", "--device", help="Set device (default /dev/ttyUSB0)", nargs = 1, default=[device] )
+  parser.add_argument("-v", "--verbose", help="Set verbose mode", default=verbose, action='store_true')
+  parser.add_argument("-f", "--file", help="input file", nargs=1, type=str)
+  parser.add_argument("command", help="Command to send GRBL", nargs="*" )
+
+  args = parser.parse_args()
+
+  if hasattr(args, 'baud'):
+    baud = args.baud[0]
+  if hasattr(args, 'device'):
+    device = args.device[0]
+  if hasattr(args, 'verbose'):
+    verbose = args.verbose
+  if hasattr(args, 'file'):
+    infn = args.file[0]
+
+  if infn is None and len(args.command)==0:
+    print ""
+    parser.print_help()
+    print ""
+    sys.exit(-1)
+
+  if verbose:
+    print "baud:", baud
+    print "device:", device
+
+  setup(device, baud)
+
+  #print "setup done..."
+
+  v = send_initial_command("")
+  #print "got", v
+
+  if infn is not None:
+    with open(infn, "r") as fp:
+      for line in fp:
+        line = line.strip()
+        if verbose:
+          print "sending command", line
+        send_command(line)
+
+  else:
+
+    for cmd in args.command:
+      if verbose:
+        print "sending command", cmd
+      print send_command(cmd)
+
+  if verbose:
+    print "tearing down..."
+
+  teardown()

BIN
experiment/production/housing/v-anise/export/grbl.pyc


+ 1 - 0
experiment/production/housing/v-anise/export/nope

@@ -0,0 +1 @@
+

+ 61 - 0
experiment/production/housing/v-anise/export/svg2ngc

@@ -0,0 +1,61 @@
+#!/bin/bash
+
+inpsvg="$1"
+sf='1'
+
+if [[ "$2" != "" ]] ; then
+  sf="$2"
+fi
+
+premul=`echo "1000000" | bc -l`
+invmul=`echo "( 1 / $premul ) * $sf" | bc -l`
+
+frapid="F800"
+fslow="F150"
+S="1.0"
+
+if [[ "$inpsvg" == "" ]] ; then
+  echo "provide input svg"
+  exit 1
+fi
+
+rawtype=`file $inpsvg`
+checktype=`file -b $inpsvg | cut -f1 -d' '`
+if [[ "$checktype" != "SVG" ]] ; then
+  echo -e "file $inpsvg is of type:\n\n$rawtype\n\nNnot an SVG file? Exiting.\n"
+  exit 1
+fi
+
+bn=`basename $inpsvg .svg`
+
+# causes duplicate paths otherwise
+#
+sed -i 's/fill="[^"]*"/fill="none"/g' $inpsvg
+
+echo "creating $bn.ps"
+rsvg-convert -f ps -o $bn.ps $inpsvg
+
+pstoedit -f gnuplot $bn.ps $bn.gp
+
+zplunge="-6.5"
+zraise="10"
+
+bitr=`echo "$premul*1.5/2" | bc -l`
+
+rm -f {$bn}-ord.gp
+#clipcli -s $bn.gp -F $premul -R "$bitr" -T >> ${bn}-ord.gp
+clipcli -s $bn.gp -F -x $premul -R "0.75" -T >> ${bn}-ord.gp
+
+
+rm -f ${bn}.ngc
+echo -e "G90\nG21\nG1 Z$zraise" >> ${bn}.ngc
+
+echo "gp2ngc --preset 3040 --z-raise "$zplunge" --z-plunge "$zraise" -i ${bn}-ord.gp -->> ${bn}.ngc"
+gp2ngc \
+  --preset 3040 \
+  --z-raise "$zraise" \
+  --z-plunge "$zplunge" \
+  --slow "$fslow" \
+  --rapid "$frapid" \
+  --premul "$invmul" \
+  -i ${bn}-ord.gp >> ${bn}.ngc