add hole and perimeter offset compensation as expert settings
This commit is contained in:
parent
8eaa0a33a8
commit
1cca293495
8 changed files with 44 additions and 10 deletions
2
notes.md
2
notes.md
|
|
@ -33,8 +33,6 @@
|
|||
|
||||
* `F` new parameter to cap output flow rate (on printer device)
|
||||
* `F` new parameters for bridging speed / bridge fan control
|
||||
* `F` new base paremeter for hole and perimeter compensation
|
||||
* `F` new parameters for inner / outer perimeter compensation
|
||||
* `F` convert ranges to z offsets while continuing to show layer #
|
||||
* `F` support pillar top/bottom should conform to part
|
||||
* `F` more explicit line width control with ranges and min/max adaptive
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ let UC = UI.prefix('kiri').inputAction(settings.conf.update),
|
|||
put: (key, val) => localSet(key, val),
|
||||
set: (key, val) => localSet(key, val),
|
||||
setItem: (key, val) => localSet(key, val),
|
||||
removeItem: (key) => localRemove(key)
|
||||
},
|
||||
tweak = {
|
||||
line_precision(v) { api.work.config({ base: { clipperClean: v } }) },
|
||||
|
|
@ -119,6 +120,11 @@ function localSet(key, val) {
|
|||
return val;
|
||||
}
|
||||
|
||||
function localRemove(key) {
|
||||
let sloc = api.conf.get().local;
|
||||
return delete sloc[key];
|
||||
}
|
||||
|
||||
export const api = {
|
||||
ajax,
|
||||
beta,
|
||||
|
|
|
|||
|
|
@ -267,6 +267,8 @@ export const conf = {
|
|||
sliceLayerStartX: 0,
|
||||
sliceLayerStartY: 0,
|
||||
sliceLineWidth: 0,
|
||||
sliceCompInner: 0,
|
||||
sliceCompOuter: 0,
|
||||
sliceFillGrow: 0,
|
||||
sliceFillAngle: 45,
|
||||
sliceFillWidth: 1,
|
||||
|
|
|
|||
|
|
@ -782,9 +782,11 @@ class Widget {
|
|||
}
|
||||
if (set) {
|
||||
let dark = this.api.space.is_dark();
|
||||
let cam = this.api.mode.is_cam();
|
||||
let color = dark && !cam ? 0xffffff : 0;
|
||||
let angle = this.api.conf.get().controller.edgeangle || 20;
|
||||
let edges = new THREE.EdgesGeometry(mesh.geometry, angle);
|
||||
let material = new THREE.LineBasicMaterial({ color: 0 });
|
||||
let material = new THREE.LineBasicMaterial({ color });
|
||||
this.outline = new THREE.LineSegments(edges, material);
|
||||
this.outline.renderOrder = -20;
|
||||
mesh.add(this.outline);
|
||||
|
|
|
|||
|
|
@ -181,6 +181,8 @@ export function menu() {
|
|||
outputScarfLength: newInput(LANG.ad_scar_s, {title:LANG.ad_scar_l, convert:toFloat, bound:bound(0,1000)}),
|
||||
outputShortPoly: newInput(LANG.ad_spol_s, {title:LANG.ad_spol_l, convert:toFloat, bound:bound(0,10000)}),
|
||||
outputCoastDist: newInput(LANG.ad_scst_s, {title:LANG.ad_scst_l, convert:toFloat, bound:bound(0.0,10)}),
|
||||
sliceCompInner: newInput(LANG.sl_ofin_s, {title:LANG.sl_ofin_l, convert:toFloat, bound:bound(-10.0,10.0)}),
|
||||
sliceCompOuter: newInput(LANG.sl_ofot_s, {title:LANG.sl_ofot_l, convert:toFloat, bound:bound(-10.0,10.0)}),
|
||||
zHopDistance: newInput(LANG.ad_zhop_s, {title:LANG.ad_zhop_l, convert:toFloat, bound:bound(0,3.0)}),
|
||||
outputLoops: newInput(LANG.ag_loop_s, {title:LANG.ag_loop_l, convert:toInt, bound:bound(-1,1000), show:isBelt}),
|
||||
|
||||
|
|
|
|||
|
|
@ -17,12 +17,13 @@ slicer.slicePost.FDM = slicePost;
|
|||
* data object. return is ignored.
|
||||
*/
|
||||
export function slicePost(data, options) {
|
||||
const { z, lines, groups } = data;
|
||||
const { useAssembly, post_args, zIndexes } = options;
|
||||
const { process, isSynth, vaseMode } = post_args;
|
||||
const { shellOffset, fillOffset, clipOffset } = post_args;
|
||||
const { groups, z } = data;
|
||||
const { post_args, useAssembly, zIndexes } = options;
|
||||
const { isSynth, process, vaseMode } = post_args;
|
||||
const { compInner, compOuter, pump } = post_args;
|
||||
const { clipOffset, fillOffset, shellOffset } = post_args;
|
||||
|
||||
if (options.pump) {
|
||||
if (pump) {
|
||||
let nugroups = [];
|
||||
let pump = shellOffset / 10;
|
||||
for (let p of groups) {
|
||||
|
|
@ -41,6 +42,19 @@ export function slicePost(data, options) {
|
|||
data.tops = POLY.nest(groups);
|
||||
}
|
||||
|
||||
// perimeter and inner hole compensation offsets
|
||||
if (compInner || compOuter) {
|
||||
let inner = POLY.inner(data.tops).flat();
|
||||
let outer = POLY.outer(data.tops);
|
||||
if (compInner) {
|
||||
inner = POLY.flatten(POLY.offset(inner, compInner/2));
|
||||
}
|
||||
if (compOuter) {
|
||||
outer = POLY.flatten(POLY.offset(outer, -compOuter/2));
|
||||
}
|
||||
data.tops = POLY.nest([...inner, ...outer]);
|
||||
}
|
||||
|
||||
if (isSynth) {
|
||||
const process = post_args.process;
|
||||
if (process.sliceSupportGrow > 0) {
|
||||
|
|
@ -54,6 +68,7 @@ export function slicePost(data, options) {
|
|||
delete data.groups;
|
||||
return;
|
||||
}
|
||||
|
||||
const index = zIndexes.indexOf(z);
|
||||
const range = getRangeParameters(process, index);
|
||||
// calculate fractional shells
|
||||
|
|
@ -129,7 +144,7 @@ function offset_default(params) {
|
|||
}
|
||||
|
||||
const deltaBig = 160;
|
||||
const deltSmall = 20;
|
||||
const deltaSmall = 20;
|
||||
|
||||
// look for close points on adjacent segmented polys and merge
|
||||
let test_polys = first !== last ? [ ...first, ...last ] : last;
|
||||
|
|
@ -139,6 +154,8 @@ function offset_default(params) {
|
|||
for (let poly of test_flats)
|
||||
poly.forEachSegment((p0, p1) => {
|
||||
p0.angle = new Slope(p0, p1);
|
||||
// todo calc vertex angle
|
||||
// exclude segment vertex from merge when angle < deltaSmall
|
||||
});
|
||||
|
||||
// segment each poly to be tested
|
||||
|
|
|
|||
|
|
@ -140,7 +140,8 @@ export function fdm_slice(settings, widget, onupdate, ondone) {
|
|||
fillOffset = lineWidth * fillOffsetMult,
|
||||
clipOffset = process.sliceSupportOffset,
|
||||
sliceFillAngle = process.sliceFillAngle,
|
||||
supportDensity = process.sliceSupportDensity;
|
||||
supportDensity = process.sliceSupportDensity,
|
||||
{ sliceCompInner, sliceCompOuter } = process;
|
||||
|
||||
// override globals used by vopt()
|
||||
isFlat = controller.lineType === "flat";
|
||||
|
|
@ -230,6 +231,8 @@ export function fdm_slice(settings, widget, onupdate, ondone) {
|
|||
useAssembly,
|
||||
post: 'FDM',
|
||||
post_args: {
|
||||
compInner: sliceCompInner,
|
||||
compOuter: sliceCompOuter,
|
||||
shellOffset,
|
||||
fillOffset,
|
||||
clipOffset,
|
||||
|
|
|
|||
|
|
@ -362,6 +362,10 @@ self.lang['en-us'] = {
|
|||
sl_ordr_l: ["output shell order","inside to outside","or outside to inside","affects surface quality"],
|
||||
sl_strt_s: "start point",
|
||||
sl_strt_l: ["layer starting point","last = where last layer ended","center = part center","origin = device origin","random = yolo"],
|
||||
sl_ofin_s: "shell inner offset",
|
||||
sl_ofin_l: ["inner hole perimeter offset","in millimeters"],
|
||||
sl_ofot_s: "shell outer offset",
|
||||
sl_ofot_l: ["outer wall perimeter offset","in millimeters"],
|
||||
|
||||
// FDM SOLID
|
||||
fs_menu: "solid fill",
|
||||
|
|
|
|||
Loading…
Reference in a new issue