{ "nodes": [ { "datums": [ { "expr": "0", "name": "x", "type": "float", "uid": 0 }, { "expr": "0.0", "name": "y", "type": "float", "uid": 1 }, { "expr": "0", "name": "z", "type": "float", "uid": 2 }, { "expr": "4", "name": "width", "type": "float", "uid": 3 }, { "expr": "4", "name": "height", "type": "float", "uid": 4 }, { "expr": "4", "name": "depth", "type": "float", "uid": 5 }, { "expr": "\u0012fab.types.Shape('am__f1aa-f-2X-Xf2a-f-2Y-Yf2a-f-2Z-Zf2',float('-2.000000'),float('-2.000000'),float('-2.000000'),float('2.000000'),float('2.000000'),float('2.000000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 6 } ], "inspector": [ 1003.7800891922159, -415.78256168345121 ], "name": "c1", "script": [ "# Neil Gershenfeld 1/24/15", "# Matt Keeter 5/22/15", "", "import fab", "", "title('Cube (center)')", "", "input('x', float)", "input('y', float)", "input('z', float)", "input('width', float)", "input('height', float)", "input('depth', float)", "", "xmin, xmax = x - width/2, x + width/2", "ymin, ymax = y - height/2, y + height/2", "zmin, zmax = z - depth/2, z + depth/2", "", "output('shape', fab.shapes.cube(xmin, xmax, ymin, ymax, zmin, zmax))", "", "# UI", "sb.ui.wireframe([(xmin, ymin, zmin), (xmax, ymin, zmin),", " (xmax, ymax, zmin), (xmin, ymax, zmin)], close=True)", "sb.ui.wireframe([(xmin, ymin, zmax), (xmax, ymin, zmax),", " (xmax, ymax, zmax), (xmin, ymax, zmax)], close=True)", "sb.ui.wireframe([(xmin, ymin, zmin), (xmin, ymax, zmin),", " (xmin, ymax, zmax), (xmin, ymin, zmax)], close=True)", "sb.ui.wireframe([(xmax, ymin, zmin), (xmax, ymax, zmin),", " (xmax, ymax, zmax), (xmax, ymin, zmax)], close=True)", "", "def drag_hwd(this, dx,dy,dz):", " this.width += 2*dx", " this.height += 2*dy", " this.depth += 2*dz", "", "sb.ui.point(x, y, z)", "sb.ui.point(x + width/2.0, y + height/2.0, z + depth/2.0,", " drag=drag_hwd)", "", "" ], "uid": 4 }, { "datums": [ { "expr": "0", "name": "x", "type": "float", "uid": 0 }, { "expr": "0.0", "name": "y", "type": "float", "uid": 1 }, { "expr": "0", "name": "z", "type": "float", "uid": 2 }, { "expr": "2.4", "name": "r", "type": "float", "uid": 3 }, { "expr": "\u0012fab.types.Shape('-r++qXqYqZf2.4',float('-2.400000'),float('-2.400000'),float('-2.400000'),float('2.400000'),float('2.400000'),float('2.400000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 4 } ], "inspector": [ 1006.5630946254203, -651.32134770227185 ], "name": "s0", "script": [ "import fab", "import math", "", "title('Sphere (center)')", "", "input('x', float)", "input('y', float)", "input('z', float)", "input('r', float)", "", "output('shape', fab.shapes.sphere(x, y, z, r))", "", "# UI", "sb.ui.wireframe([", " (math.cos(i/36. * 2*math.pi) * r + x,", " math.sin(i/36. * 2*math.pi) * r + y, z)", " for i in range(36)], close=True)", "sb.ui.wireframe([(x,y,z-r), (x,y,z+r)])", "", "sb.ui.point(x, y, z)", "sb.ui.point(x, y, z + r, drag=(None, None, r))", "sb.ui.point(x, y, z - r, drag=(None, None, r))", "" ], "uid": 5 }, { "datums": [ { "expr": "\u0011[__5.__4]", "name": "a", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "\u0011[__4.__6]", "name": "b", "type": "_fabtypes.Shape", "uid": 1 }, { "expr": "\u0012fab.types.Shape('a-r++qXqYqZf2.4am__f1aa-f-2X-Xf2a-f-2Y-Yf2a-f-2Z-Zf2',float('-2.000000'),float('-2.000000'),float('-2.000000'),float('2.000000'),float('2.000000'),float('2.000000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 2 } ], "inspector": [ 1305.6574652573242, -493.10802989853545 ], "name": "i0", "script": [ "import fab.types", "", "title('Intersection')", "input('a', fab.types.Shape)", "input('b', fab.types.Shape)", "", "output('shape', a & b)", "" ], "uid": 6 }, { "datums": [ { "expr": "\u0011[__6.__2]", "name": "a", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "\u0011[__15.__2]", "name": "b", "type": "_fabtypes.Shape", "uid": 1 }, { "expr": "\u0012fab.types.Shape('aa-r++qXqYqZf2.4am__f1aa-f-2X-Xf2a-f-2Y-Yf2a-f-2Z-Zf2nim-Xf0-Yf0-Zf0m_+*f6.12323e-17Y*f1Z+*f-1Y*f6.12323e-17Zm-Xf0-Yf-0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2im-Xf0-Yf0-Zf0m+*f6.12323e-17X*f1ZY+*f-1X*f6.12323e-17Zm-Xf-0-Yf0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2m-Xf0-Yf0-Zf0m+*f1X*f0Y+*f-0X*f1Y_m-Xf-0-Yf-0-Zf0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-2.000000'),float('-2.000000'),float('-2.000000'),float('2.000000'),float('2.000000'),float('2.000000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 2 } ], "inspector": [ 1663.7020942522174, -299.94444728461809 ], "name": "d0", "script": [ "import fab.types", "", "title('Difference')", "input('a', fab.types.Shape)", "input('b', fab.types.Shape)", "", "output('shape', a & ~b)", "" ], "uid": 7 }, { "datums": [ { "expr": "0", "name": "x", "type": "float", "uid": 0 }, { "expr": "0", "name": "y", "type": "float", "uid": 1 }, { "expr": "-2", "name": "zmin", "type": "float", "uid": 2 }, { "expr": "2", "name": "zmax", "type": "float", "uid": 3 }, { "expr": "1", "name": "r", "type": "float", "uid": 4 }, { "expr": "\u0012fab.types.Shape('am__f1-r+qXqYf1a-f-2Z-Zf2',float('-1.000000'),float('-1.000000'),float('-2.000000'),float('1.000000'),float('1.000000'),float('2.000000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 5 } ], "inspector": [ 998.69236326008718, -60.803185015061388 ], "name": "c2", "script": [ "import fab", "import math", "", "title('Cylinder (Z)')", "", "input('x', float)", "input('y', float)", "input('zmin', float)", "input('zmax', float)", "input('r', float)", "", "output('shape', fab.shapes.cylinder(x, y, zmin, zmax, r))", "", "# UI", "sb.ui.wireframe([(x, y, zmin), (x, y, zmax)])", "sb.ui.wireframe([(x, y, zmin), (x+r, y, zmin)])", "", "sb.ui.wireframe([", " (math.cos(i/36. * 2*math.pi) * r + x,", " math.sin(i/36. * 2*math.pi) * r + y, zmin)", " for i in range(36)], close=True)", "", "sb.ui.wireframe([", " (math.cos(i/36. * 2*math.pi) * r + x,", " math.sin(i/36. * 2*math.pi) * r + y, zmax)", " for i in range(36)], close=True)", "", "sb.ui.point(x, y, zmin)", "sb.ui.point(x, y, zmax)", "sb.ui.point(x + r, y, zmin, drag=(r, None, None))", "" ], "uid": 9 }, { "datums": [ { "expr": "0.0", "name": "_x", "type": "float", "uid": 0 }, { "expr": "0.0", "name": "y", "type": "float", "uid": 1 }, { "expr": "0.0", "name": "z", "type": "float", "uid": 2 }, { "expr": "90", "name": "a", "type": "float", "uid": 3 }, { "expr": "\u0011[__9.__5]", "name": "shape", "type": "_fabtypes.Shape", "uid": 4 }, { "expr": "\u0012fab.types.Shape('m-Xf0-Yf0-Zf0m_+*f6.12323e-17Y*f1Z+*f-1Y*f6.12323e-17Zm-Xf0-Yf-0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-1.000000'),float('-2.000000'),float('-1.000000'),float('1.000000'),float('2.000000'),float('1.000000'))", "name": "rotated", "type": "_fabtypes.Shape", "uid": 5 } ], "inspector": [ 1001.3828029352142, 199.13498523871772 ], "name": "r3", "script": [ "import fab", "import math", "", "title('Rotate (X)')", "", "input('_x', float)", "input('y', float)", "input('z', float)", "input('a', float)", "", "input('shape', fab.types.Shape)", "output('rotated', fab.shapes.rotate_x(shape, a, y, z))", "", "# UI", "rad = math.radians(a)", "sb.ui.wireframe([(_x, y + math.cos(rad), z + math.sin(rad)),", " (_x, y, z),", " (_x, y + 1, z)], color=sb.color.teal)", "", "# Draw a semi-circular arc showing the rotation", "if int(a) % 360 != 0:", " sb.ui.wireframe([", " (_x, y + math.cos(math.radians(a_)) * 0.3,", " z + math.sin(math.radians(a_)) * 0.3)", " for a_ in range(int(a) % 360)], color=sb.color.teal)", "", "sb.ui.point(_x, y, z, color=sb.color.teal)", "", "def drag_pt(this, x, y, z):", " this.a = math.degrees(math.atan2(z - this.z, y - this.y))", "sb.ui.point(_x, y + math.cos(rad), z + math.sin(rad),", " color=sb.color.teal, drag=drag_pt, relative=False)", "", "" ], "uid": 10 }, { "datums": [ { "expr": "0.0", "name": "x", "type": "float", "uid": 0 }, { "expr": "0.0", "name": "_y", "type": "float", "uid": 1 }, { "expr": "0.0", "name": "z", "type": "float", "uid": 2 }, { "expr": "90", "name": "a", "type": "float", "uid": 3 }, { "expr": "\u0011[__9.__5]", "name": "shape", "type": "_fabtypes.Shape", "uid": 4 }, { "expr": "\u0012fab.types.Shape('m-Xf0-Yf0-Zf0m+*f6.12323e-17X*f1ZY+*f-1X*f6.12323e-17Zm-Xf-0-Yf0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-2.000000'),float('-1.000000'),float('-1.000000'),float('2.000000'),float('1.000000'),float('1.000000'))", "name": "rotated", "type": "_fabtypes.Shape", "uid": 5 } ], "inspector": [ 1008.2863201863222, 450.67353865376083 ], "name": "r4", "script": [ "import fab", "import math", "", "title('Rotate (Y)')", "", "input('x', float)", "input('_y', float)", "input('z', float)", "input('a', float)", "", "input('shape', fab.types.Shape)", "output('rotated', fab.shapes.rotate_y(shape, a, x, z))", "", "# UI", "rad = math.radians(a)", "sb.ui.wireframe([(x + math.cos(rad), _y, z + math.sin(rad)),", " (x, _y, z),", " (x + 1, _y, z)], color=sb.color.teal)", "", "# Draw a semi-circular arc showing the rotation", "if int(a) % 360 != 0:", " sb.ui.wireframe([", " (x + math.cos(math.radians(a_)) * 0.3, _y,", " z + math.sin(math.radians(a_)) * 0.3)", " for a_ in range(int(a) % 360)], color=sb.color.teal)", "", "sb.ui.point(x, _y, z, color=sb.color.teal)", "", "def drag_pt(this, x, y, z):", " this.a = math.degrees(math.atan2(z - this.z, x - this.x))", "sb.ui.point(x + math.cos(rad), _y, z + math.sin(rad),", " color=sb.color.teal, drag=drag_pt, relative=False)", "", "" ], "uid": 11 }, { "datums": [ { "expr": "0.0", "name": "x", "type": "float", "uid": 0 }, { "expr": "0.0", "name": "y", "type": "float", "uid": 1 }, { "expr": "0.0", "name": "_z", "type": "float", "uid": 2 }, { "expr": "0", "name": "a", "type": "float", "uid": 3 }, { "expr": "\u0011[__9.__5]", "name": "shape", "type": "_fabtypes.Shape", "uid": 4 }, { "expr": "\u0012fab.types.Shape('m-Xf0-Yf0-Zf0m+*f1X*f0Y+*f-0X*f1Y_m-Xf-0-Yf-0-Zf0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-1.000000'),float('-1.000000'),float('-2.000000'),float('1.000000'),float('1.000000'),float('2.000000'))", "name": "rotated", "type": "_fabtypes.Shape", "uid": 5 } ], "inspector": [ 1006.7461527168832, 709.39749428124344 ], "name": "r5", "script": [ "import fab", "import math", "", "title('Rotate (Z)')", "", "input('x', float)", "input('y', float)", "input('_z', float)", "input('a', float)", "", "input('shape', fab.types.Shape)", "output('rotated', fab.shapes.rotate_z(shape, a, x, y))", "", "# UI", "rad = math.radians(a)", "sb.ui.wireframe([(x + math.cos(rad), y + math.sin(rad), _z),", " (x, y, _z),", " (x + 1, y, _z)], color=sb.color.teal)", "", "# Draw a semi-circular arc showing the rotation", "if int(a) % 360 != 0:", " sb.ui.wireframe([", " (x + math.cos(math.radians(a_)) * 0.3,", " y + math.sin(math.radians(a_)) * 0.3, _z)", " for a_ in range(int(a) % 360)], color=sb.color.teal)", "", "sb.ui.point(x, y, _z, color=sb.color.teal)", "", "def drag_pt(this, x, y, z):", " this.a = math.degrees(math.atan2(y - this.y, x - this.x))", "sb.ui.point(x + math.cos(rad), y + math.sin(rad), _z,", " color=sb.color.teal, drag=drag_pt, relative=False)", "", "" ], "uid": 12 }, { "datums": [ { "expr": "\u0011[__15.__2]", "name": "a", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "0", "name": "x0", "type": "float", "uid": 1 }, { "expr": "0", "name": "y0", "type": "float", "uid": 2 }, { "expr": "0", "name": "z0", "type": "float", "uid": 3 }, { "expr": "\u0011[__3.__1]", "name": "x1", "type": "float", "uid": 4 }, { "expr": "0", "name": "y1", "type": "float", "uid": 5 }, { "expr": "0", "name": "z1", "type": "float", "uid": 6 }, { "expr": "\u0012fab.types.Shape('m-Xf12-Yf0-Zf0im-Xf0-Yf0-Zf0m_+*f6.12323e-17Y*f1Z+*f-1Y*f6.12323e-17Zm-Xf0-Yf-0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2im-Xf0-Yf0-Zf0m+*f6.12323e-17X*f1ZY+*f-1X*f6.12323e-17Zm-Xf-0-Yf0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2m-Xf0-Yf0-Zf0m+*f1X*f0Y+*f-0X*f1Y_m-Xf-0-Yf-0-Zf0am__f1-r+qXqYf1a-f-2Z-Zf2',float('10.000000'),float('-2.000000'),float('-2.000000'),float('14.000000'),float('2.000000'),float('2.000000'))", "name": "out", "type": "_fabtypes.Shape", "uid": 7 } ], "inspector": [ 1322.1054969116683, 524.21217195114775 ], "name": "s1", "script": [ "# Neil Gershenfeld 1/25/15", "# Matt Keeter 6/13/15", "", "import fab", "", "title('Set origin (XYZ)')", "", "input('a',fab.types.Shape)", "", "input('x0', float)", "input('y0', float)", "input('z0', float)", "input('x1', float)", "input('y1', float)", "input('z1', float)", "", "output('out', fab.shapes.origin_xyz(a, x0, y0, z0, x1, y1, z1))", "", "# UI", "sb.ui.wireframe([(x0, y0, z0), (x1, y1, z1)], color=sb.color.green)", "sb.ui.point(x0, y0, z0, color=sb.color.green)", "sb.ui.point(x1, y1, z1, color=sb.color.green)", "", "" ], "uid": 14 }, { "datums": [ { "expr": "\u0011[__10.__5]", "name": "a", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "\u0011[__11.__5,__12.__5]", "name": "b", "type": "_fabtypes.Shape", "uid": 1 }, { "expr": "\u0012fab.types.Shape('im-Xf0-Yf0-Zf0m_+*f6.12323e-17Y*f1Z+*f-1Y*f6.12323e-17Zm-Xf0-Yf-0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2im-Xf0-Yf0-Zf0m+*f6.12323e-17X*f1ZY+*f-1X*f6.12323e-17Zm-Xf-0-Yf0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2m-Xf0-Yf0-Zf0m+*f1X*f0Y+*f-0X*f1Y_m-Xf-0-Yf-0-Zf0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-2.000000'),float('-2.000000'),float('-2.000000'),float('2.000000'),float('2.000000'),float('2.000000'))", "name": "shape", "type": "_fabtypes.Shape", "uid": 2 } ], "inspector": [ 1310.4066830915579, 208.45182375781758 ], "name": "u0", "script": [ "import fab.types", "", "title('Union')", "input('a', fab.types.Shape)", "input('b', fab.types.Shape)", "", "output('shape', a | b)", "" ], "uid": 15 }, { "datums": [ { "expr": "\u0011[__6.__2]", "name": "a", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "0", "name": "x0", "type": "float", "uid": 1 }, { "expr": "0", "name": "y0", "type": "float", "uid": 2 }, { "expr": "0", "name": "z0", "type": "float", "uid": 3 }, { "expr": "\u0011[__1.__1]", "name": "x1", "type": "float", "uid": 4 }, { "expr": "0", "name": "y1", "type": "float", "uid": 5 }, { "expr": "0", "name": "z1", "type": "float", "uid": 6 }, { "expr": "\u0012fab.types.Shape('m-Xf7-Yf0-Zf0a-r++qXqYqZf2.4am__f1aa-f-2X-Xf2a-f-2Y-Yf2a-f-2Z-Zf2',float('5.000000'),float('-2.000000'),float('-2.000000'),float('9.000000'),float('2.000000'),float('2.000000'))", "name": "out", "type": "_fabtypes.Shape", "uid": 7 } ], "inspector": [ 1306.0848650978671, -160.12227020633964 ], "name": "s2", "script": [ "# Neil Gershenfeld 1/25/15", "# Matt Keeter 6/13/15", "", "import fab", "", "title('Set origin (XYZ)')", "", "input('a',fab.types.Shape)", "", "input('x0', float)", "input('y0', float)", "input('z0', float)", "input('x1', float)", "input('y1', float)", "input('z1', float)", "", "output('out', fab.shapes.origin_xyz(a, x0, y0, z0, x1, y1, z1))", "", "# UI", "sb.ui.wireframe([(x0, y0, z0), (x1, y1, z1)], color=sb.color.green)", "sb.ui.point(x0, y0, z0, color=sb.color.green)", "sb.ui.point(x1, y1, z1, color=sb.color.green)", "", "" ], "uid": 0 }, { "datums": [ { "expr": "2", "name": "x", "type": "float", "uid": 3 }, { "expr": "\u0011[__2.__0]", "name": "dx", "type": "float", "uid": 0 }, { "expr": "\u00127.0", "name": "x'", "type": "float", "uid": 1 } ], "inspector": [ 1325.8616149598099, -354.71653110490041 ], "name": "s3", "script": [ "import fab", "", "title('increment')", "input('x', float)", "input('dx', float)", "output('x\\'', x + dx)" ], "uid": 1 }, { "datums": [ { "expr": "5", "name": "s", "type": "float", "uid": 0 } ], "inspector": [ 1313.1713045245313, -642.19989289995783 ], "name": "s4", "script": [ "import fab", "", "title('scalar')", "input('s', float)" ], "uid": 2 }, { "datums": [ { "expr": "\u0011[__1.__1]", "name": "x", "type": "float", "uid": 3 }, { "expr": "\u0011[__2.__0]", "name": "dx", "type": "float", "uid": 0 }, { "expr": "\u001212.0", "name": "x'", "type": "float", "uid": 1 } ], "inspector": [ 1318.5419629275632, 364.8509718791239 ], "name": "s5", "script": [ "import fab", "", "title('increment')", "input('x', float)", "input('dx', float)", "output('x\\'', x + dx)" ], "uid": 3 }, { "datums": [ { "expr": "\u0011[__7.__2]", "name": "shape", "type": "_fabtypes.Shape", "uid": 0 }, { "expr": "1", "name": "hue", "type": "float", "uid": 1 }, { "expr": "1", "name": "saturation", "type": "float", "uid": 2 }, { "expr": "0.7", "name": "brightness", "type": "float", "uid": 3 }, { "expr": "\u0012fab.types.Shape('aa-r++qXqYqZf2.4am__f1aa-f-2X-Xf2a-f-2Y-Yf2a-f-2Z-Zf2nim-Xf0-Yf0-Zf0m_+*f6.12323e-17Y*f1Z+*f-1Y*f6.12323e-17Zm-Xf0-Yf-0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2im-Xf0-Yf0-Zf0m+*f6.12323e-17X*f1ZY+*f-1X*f6.12323e-17Zm-Xf-0-Yf0-Zf-0am__f1-r+qXqYf1a-f-2Z-Zf2m-Xf0-Yf0-Zf0m+*f1X*f0Y+*f-0X*f1Y_m-Xf-0-Yf-0-Zf0am__f1-r+qXqYf1a-f-2Z-Zf2',float('-2.000000'),float('-2.000000'),float('-2.000000'),float('2.000000'),float('2.000000'),float('2.000000'),color=(179,0,0))", "name": "out", "type": "_fabtypes.Shape", "uid": 4 } ], "inspector": [ 1663.3220232478479, -156.23360793127398 ], "name": "s6", "script": [ "import math", "import fab", "", "title('Set color (HSB)')", "", "input(\"shape\", fab.types.Shape)", "input(\"hue\", float)", "input(\"saturation\", float)", "input(\"brightness\", float)", "", "# copied from Java's HSBtoRGB", "# http://www.docjar.com/html/api/java/awt/Color.java.html", "", "r = 0", "g = 0", "b = 0", "", "if saturation == 0:", " r = g = b = int(brightness * 255.0 + 0.5)", "else:", " h = (hue - float(math.floor(hue))) * 6.0", " f = h - float(math.floor(h))", " p = brightness * (1-saturation)", " q = brightness * (1-saturation*f)", " t = brightness * (1-(saturation*(1-f)))", "", " h = int(h)", "", " if(h==0):", " r = int(brightness * 255.0 + 0.5)", " g = int(t * 255.0 + 0.5)", " b = int(p * 255.0 + 0.5)", " elif(h==1):", " r = int(q * 255.0 + 0.5)", " g = int(brightness * 255.0 + 0.5)", " b = int(p * 255.0 + 0.5)", " elif(h==2):", " r = int(p * 255.0 + 0.5)", " g = int(brightness * 255.0 + 0.5)", " b = int(t * 255.0 + 0.5)", " elif(h==3):", " r = int(p * 255.0 + 0.5)", " g = int(q * 255.0 + 0.5)", " b = int(brightness * 255.0 + 0.5)", " elif(h==4):", " r = int(t * 255.0 + 0.5)", " g = int(p * 255.0 + 0.5)", " b = int(brightness * 255.0 + 0.5)", " elif(h==5):", " r = int(brightness * 255.0 + 0.5)", " g = int(p * 255.0 + 0.5)", " b = int(q * 255.0 + 0.5)", "", "output(\"out\", fab.shapes.set_color(shape, r, g, b))", "" ], "uid": 8 } ], "protocol": 6, "type": "sb" }