jsketcher/modules/workbenches/modeler/features/loft/loft.operation.ts
2022-11-30 01:40:58 +00:00

100 lines
No EOL
2.6 KiB
TypeScript

import { roundValueForPresentation as r } from 'cad/craft/operationHelper';
import { ApplicationContext } from "cad/context";
import { EntityKind } from "cad/model/entities";
import { BooleanDefinition } from "cad/craft/schema/common/BooleanDefinition";
import { OperationDescriptor } from "cad/craft/operationBundle";
import { MSketchLoop } from "cad/model/mloop";
import { FromSketchProductionAnalyzer } from "cad/craft/production/productionAnalyzer";
import {FaceRef} from "cad/craft/e0/OCCUtils";
import icon from "./LOFT.svg";
interface LoftParams {
loops: MSketchLoop[];
boolean: BooleanDefinition;
loftType: string;
}
export const LoftOperation: OperationDescriptor<LoftParams> = {
id: 'LOFT',
label: 'Loft',
icon,
info: 'Lofts 2D sketch',
path:__dirname,
paramsInfo: () => `(?)`,
run:async (params: LoftParams, ctx: ApplicationContext) => {
const occ = ctx.occService;
const oci = occ.commandInterface;
let loftType = 0;
if (params.loftType == "smooth") loftType = 0;
if (params.loftType == "sharp") loftType = 1;
const sketches = [];
const wires = params.loops.map((loop, i) => {
const shapeName = "loop/" + i;
sketches.push(loop.parent);
return occ.io.sketchLoader.pushContourAsWire(loop.contour, shapeName, loop.face.csys).wire
});
let sweepSources: FaceRef[] = [];
const indexOfMostSegments = 0;
let longestPath = 0;
let primarySketch = {};
sketches.forEach((item, index) => {
if(params.loops[index].contour.segments.length > longestPath){
longestPath = params.loops[index].contour.segments.length;
primarySketch = params.loops[index].parent;
}
const faces = occ.utils.sketchToFaces(ctx.sketchStorageService.readSketch(item.id), item.csys);
sweepSources = faces;
});
const productionAnalyzer = new FromSketchProductionAnalyzer(sweepSources);
oci.thrusections("th", "1", loftType, ...wires);
const tools = [];
tools.push(occ.io.getShell("th", productionAnalyzer));
return occ.utils.applyBooleanModifier(tools, params.boolean, null, [],)
},
form: [
{
type: 'selection',
name: 'loops',
capture: [EntityKind.LOOP],
label: 'Loops',
multi: true,
defaultValue: {
usePreselection: true,
preselectionIndex: 0
},
},
{
type: 'choice',
label: 'Loft Type',
name: "loftType",
style: "dropdown",
defaultValue: "smooth",
values: ['smooth', 'sharp',],
},
{
type: 'boolean',
name: 'boolean',
label: 'Boolean',
optional: true,
simplify: true,
}
],
}