add tracing paths for ball and taper mills v1
This commit is contained in:
parent
685db22d2c
commit
ab7bbc4d70
2 changed files with 95 additions and 69 deletions
|
|
@ -708,6 +708,66 @@ let gs_kiri_cam = exports;
|
|||
slice.tops[0].traces = outer;
|
||||
};
|
||||
|
||||
/**
|
||||
* Find top paths to trace when using ball and taper mills
|
||||
* in waterline finishing mode.
|
||||
*/
|
||||
function findTracingPaths(widget, slice, tool, profile) {
|
||||
// check for ball and taper mills paths and add to top[0].inner
|
||||
let polys = [];
|
||||
let nups = [];
|
||||
let cull = [];
|
||||
slice.gatherTopPolys([]).forEach(poly => poly.flattenTo(polys));
|
||||
polys.forEach(poly => {
|
||||
let pz = poly.first().z;
|
||||
let mz = -Infinity;
|
||||
let np = newPolygon().setOpen();
|
||||
let mp = 0;
|
||||
// find top poly segments that are not significantly offset
|
||||
// my tool profile and add to new polygons which accumulate
|
||||
// to the top inner array
|
||||
poly.forEachSegment((p1,p2) => {
|
||||
let nz = getTopoZPathMax(widget, profile, p1.x, p1.y, p2.x, p2.y);
|
||||
if (nz > mz) {
|
||||
mz = nz;
|
||||
}
|
||||
if (nz - pz < 0.01) {
|
||||
mp++
|
||||
if (np.length) {
|
||||
if (!np.first().isEqual(p2)) {
|
||||
np.append(p2);
|
||||
} else {
|
||||
np.setClosed();
|
||||
}
|
||||
} else {
|
||||
np.append(p1).append(p2);
|
||||
}
|
||||
} else if (np.length) {
|
||||
nups.append(np);
|
||||
np = newPolygon().setOpen();
|
||||
}
|
||||
});
|
||||
if (np.length) {
|
||||
if (np.length === poly.length) {
|
||||
np.setClosed();
|
||||
}
|
||||
// if a trace poly has no interruptions for an endmill
|
||||
// and it's an inner poly, eliminate it from the parent
|
||||
// so it won't be offset.
|
||||
let parent = poly.parent;
|
||||
if (np.isClosed() && parent) {
|
||||
// console.log(slice.z,'cull',poly);
|
||||
parent.inner = parent.inner.filter(p => p !== poly);
|
||||
}
|
||||
nups.append(np);
|
||||
}
|
||||
});
|
||||
if (nups.length) {
|
||||
// console.log(slice.z,'nups',nups.length);
|
||||
slice.tops[0].inner = nups;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create CAM finishing offsets
|
||||
*
|
||||
|
|
@ -740,8 +800,15 @@ let gs_kiri_cam = exports;
|
|||
|
||||
const output = POLY.flatten(offset, [], true);
|
||||
|
||||
// slice.tops[0].inner = output;
|
||||
slice.tops[0].traces = output;
|
||||
|
||||
// append inner traces from findTracingPaths
|
||||
let inner = slice.tops[0].inner;
|
||||
if (inner) {
|
||||
// console.log(slice.z,'inner',inner.length)
|
||||
// output.append(...inner);
|
||||
// slice.tops[0].inner = null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -955,6 +1022,26 @@ let gs_kiri_cam = exports;
|
|||
onupdate(0.0 + update * 0.25, "slicing");
|
||||
});
|
||||
|
||||
// we need topo for safe travel moves
|
||||
generateTopoMap(widget, settings, function(slices) {
|
||||
sliceAll.appendAll(slices);
|
||||
// todo union rough / finish shells
|
||||
// todo union rough / finish tabs
|
||||
// todo append to generated topo map
|
||||
}, function(update, msg) {
|
||||
onupdate(0.40 + update * 0.50, msg || "create topo");
|
||||
});
|
||||
|
||||
// prepare for tracing paths
|
||||
let tool;
|
||||
let profile;
|
||||
if (procFinish) {
|
||||
tool = getToolById(conf, proc.finishingTool);
|
||||
if (tool.type !== 'endmill') {
|
||||
profile = createToolProfile(conf, proc.finishingTool, widget.topo);
|
||||
}
|
||||
}
|
||||
|
||||
// for each final slice, do post-processing
|
||||
sliceAll.forEach(function(slice, index) {
|
||||
// re-index
|
||||
|
|
@ -968,77 +1055,16 @@ let gs_kiri_cam = exports;
|
|||
if (addTabsRough) addCutoutTabs(slice, roughToolDiam);
|
||||
break;
|
||||
case CPRO.FINISH:
|
||||
if (profile) {
|
||||
findTracingPaths(widget, slice, tool, profile);
|
||||
}
|
||||
createFinishingSlices(slice, shellFinish, finishToolDiam, pocketOnlyFinish);
|
||||
if (addTabsFinish) addCutoutTabs(slice, finishToolDiam);
|
||||
break;
|
||||
}
|
||||
onupdate(0.40 + (index / sliceAll.length) * 0.10, "finishing")
|
||||
onupdate(0.90 + (index / sliceAll.length) * 0.10, "finishing")
|
||||
}, "cam post");
|
||||
|
||||
// we need topo for safe travel moves
|
||||
generateTopoMap(widget, settings, function(slices) {
|
||||
sliceAll.appendAll(slices);
|
||||
// todo union rough / finish shells
|
||||
// todo union rough / finish tabs
|
||||
// todo append to generated topo map
|
||||
}, function(update, msg) {
|
||||
onupdate(0.50 + update * 0.50, msg || "create topo");
|
||||
});
|
||||
|
||||
// check for ball and taper mills paths and add to top[0].inner
|
||||
if (procFinish) {
|
||||
let tool = getToolById(conf, proc.finishingTool);
|
||||
if (tool.type !== 'endmill') {
|
||||
let profile = createToolProfile(conf, proc.finishingTool, widget.topo);
|
||||
sliceAll.forEach(function(slice, index) {
|
||||
let polys = [];
|
||||
let nups = [];
|
||||
slice.gatherTopPolys([]).forEach(poly => poly.flattenTo(polys));
|
||||
polys.forEach(poly => {
|
||||
let pz = poly.first().z;
|
||||
let mz = -Infinity;
|
||||
let np = newPolygon().setOpen();
|
||||
let mp = 0;
|
||||
// find top poly segments that are not significantly offset
|
||||
// my tool profile and add to new polygons which accumulate
|
||||
// to the top inner array
|
||||
// TODO offset polygons should be calculated after this pass
|
||||
// so that they can not be offset when segments match
|
||||
// TODO for now remove trace polygons enclosed by newly
|
||||
// created inner polygons
|
||||
poly.forEachSegment((p1,p2) => {
|
||||
let nz = getTopoZPathMax(widget, profile, p1.x, p1.y, p2.x, p2.y);
|
||||
if (nz > mz) {
|
||||
mz = nz;
|
||||
}
|
||||
if (nz - pz < 0.01) {
|
||||
mp++
|
||||
if (np.length) {
|
||||
if (!np.first().isEqual(p2)) {
|
||||
np.append(p2);
|
||||
} else {
|
||||
np.setClosed();
|
||||
}
|
||||
} else {
|
||||
np.append(p1).append(p2);
|
||||
}
|
||||
} else if (np.length) {
|
||||
nups.append(np);
|
||||
np = newPolygon().setOpen();
|
||||
}
|
||||
});
|
||||
if (np.length) {
|
||||
nups.append(np);
|
||||
}
|
||||
// if (mp) console.log(slice.z,'match',mp,poly.length,np.length);
|
||||
});
|
||||
if (nups.length) {
|
||||
slice.tops[0].inner = nups;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ondone();
|
||||
};
|
||||
|
||||
|
|
@ -1356,7 +1382,7 @@ let gs_kiri_cam = exports;
|
|||
if (!top.poly) return;
|
||||
if (!top.traces) return;
|
||||
let polys = [];
|
||||
POLY.flatten(top.traces, []).forEach(function (poly) {
|
||||
POLY.flatten(top.traces, top.inner || []).forEach(function (poly) {
|
||||
if (depthFirst) poly = poly.clone(true);
|
||||
poly.layer = depthData.layer;
|
||||
polys.push(poly);
|
||||
|
|
|
|||
|
|
@ -16,14 +16,14 @@
|
|||
<p>
|
||||
<b>Learn More</b>
|
||||
<li>Watch <a target="_tutor" href="https://www.youtube.com/playlist?list=PLRoVgyRoWZpumQIKWm7oldx3bjDivqP24">a tutorial</a> on YouTube
|
||||
<li>Check out the <a target="_fb" href="https://www.facebook.com/groups/kirimoto">user group</a> on Facebook
|
||||
<li>Follow <a target="_tw" href="https://twitter.com/grid_space_3d">Grid.Space</a> on Twitter
|
||||
<li>Join the <a target="_fb" href="https://www.facebook.com/groups/kirimoto">user group</a> on Facebook
|
||||
|
||||
<p>
|
||||
<b>File Load & Import</b>
|
||||
|
||||
<li>Drag and drop an <a href="https://en.wikipedia.org/wiki/STL_(file_format)" target="_stl">STL</a> onto the grid
|
||||
<li>Or load with Function [Import]
|
||||
<li>Cached file access with Function [+]
|
||||
|
||||
<p>
|
||||
<b>Start Working</b>
|
||||
|
|
|
|||
Loading…
Reference in a new issue