Paste huh, #byq -- näytä pelkkänä tekstinä -- uusi tämän pohjalta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | reprap = {} -- adds <material> to each node in a line from <from_position> to <to_position> function reprap.drawline3d(from_position, to_position, material) --modified from https://github.com/ryanramage/bresenham3d/blob/master/index.js --lua port by jin_xi local line = {} local temp local x0 = math.floor(from_position.x) local y0 = math.floor(from_position.y) local z0 = math.floor(from_position.z) local x1 = math.floor(to_position.x) local y1 = math.floor(to_position.y) local z1 = math.floor(to_position.z) --'steep' xy Line, make longest delta x plane local swap_xy = math.abs(y1 - y0) > math.abs(x1 - x0) if swap_xy then temp = x0; x0 = y0; y0 = temp --swap(x0, y0); temp = x1; x1 = y1; y1 = temp --swap(x1, y1); end local swap_xz = math.abs(z1 - z0) > math.abs(x1 - x0) if swap_xz then temp = x0; x0 = z0; z0 = temp --swap(x0, z0); temp = x1; x1 = z1; z1 = temp --swap(x1, z1); end --delta is Length in each plane local delta_x = math.abs(x1 - x0) local delta_y = math.abs(y1 - y0) local delta_z = math.abs(z1 - z0) --drift controls when to step in 'shallow' planes --starting value keeps Line centred local drift_xy = (delta_x / 2) local drift_xz = (delta_x / 2) --direction of line local step_x = 1 if x0 > x1 then step_x = -1 end local step_y = 1 if y0 > y1 then step_y = -1 end local step_z = 1 if z0 > z1 then step_z = -1 end --starting point local y = y0 local z = z0 --step through longest delta (which we have swapped to x) local cx, cy, cz for x = x0, x1, step_x do --copy position cx = x; cy = y; cz = z --unswap (in reverse) if swap_xz then temp = cx; cx = cz; cz = temp --swap(cx, cz) end if swap_xy then temp = cx; cx = cy; cy = temp --swap(cx, cy) end print("drawing dot: "..cx..', '..cy..', '..cz) --minetest.env:add_node({ x = cx, y = cy, z = cz }, { name=material, param2=2 }) table.insert(line, { pos={ x = cx, y = cy, z = cz }, mat = material }) --update progress in other planes drift_xy = drift_xy - delta_y drift_xz = drift_xz - delta_z --step in y plane if drift_xy < 0 then y = y + step_y drift_xy = drift_xy + delta_x end --same in z if (drift_xz < 0) then z = z + step_z drift_xz = drift_xz + delta_x end end return line end -- process a gcode file <filename> placing <material> on each point touched by the machine function reprap.process_gcode(filename, material, center) local path = minetest.get_modpath("reprap").."/"..filename local nodes = {} local min = {x=center.x, y=center.y, z=center.z} local max = {x=center.x, y=center.y, z=center.z} local mat = minetest.get_content_id(material) local f = io.open(path) local line local cmd, param = "", "" local lastx, lasty, lastz local cmdx, cmdy, cmdz lastx = 0 lasty = 0 lastz = 0 for line in f:lines() do if (line ~= "") and (line:sub(1,1) ~= ";") then if string.find(line, "G1 ") then cmdx = lastx cmdy = lasty cmdz = lastz for cmd, param in string.gmatch(line, "(%w)([0-9.-]+)") do param = tonumber(param) if cmd == "X" then cmdx = param elseif cmd == "Y" then cmdz = param elseif cmd == "Z" then cmdy = param end end local p1 = { x = center.x + lastx, y = center.y + lasty, z = center.z + lastz } local p2 = { x = center.x + cmdx, y = center.y + cmdy, z = center.z + cmdz } min, max = check_pos(min, max, p1) min, max = check_pos(min, max, p2) table.insert(nodes, reprap.drawline3d( p1, p2, mat ) ) lastx = cmdx lasty = cmdy lastz = cmdz end end end local vm = VoxelManip() --print("min: .."..dump(min).." max: "..dump(max)) min, max = vm:read_from_map(min, max) --print("min: .."..dump(min).." max: "..dump(max)) local area = VoxelArea:new{ MinEdge = min, MaxEdge = max } local data = vm:get_data() for _, lines in pairs(nodes) do for _, node in pairs(lines) do local index = area:indexp(node.pos) data[index] = node.mat end end vm:set_data(data) vm:write_to_map() vm:update_map() end minetest.register_chatcommand("reprap", { params = "<gcodefilename>,<material>,<x>,<y>,<z>", description = "start printing a gcode file", privs = {}, func = function(name, param) local paramlist print(param) paramlist = string.split(param, ",") print(paramlist[1]) print(paramlist[2]) print(paramlist[3]) print(paramlist[4]) print(paramlist[5]) filename = paramlist[1] material = paramlist[2] drawx = tonumber(paramlist[3]) drawy = tonumber(paramlist[4]) drawz = tonumber(paramlist[5]) reprap.process_gcode(filename, material, { x=drawx, y=drawy, z=drawz }) -- reprap.process_gcode("column.gcode", "default:mese", { x=-65, y=0, z=77 }) end } ) function check_pos(min, max, pos) if pos.x < min.x then min.x = pos.x end if pos.y < min.y then min.y = pos.y end if pos.z < min.z then min.z = pos.z end if pos.x > max.x then max.x = pos.x end if pos.y > max.y then max.y = pos.y end if pos.z > max.z then max.z = pos.z end return min, max end |