diff --git a/modules/workbenches/sheetMetal/features/smTab/smTab.operation.ts b/modules/workbenches/sheetMetal/features/smTab/smTab.operation.ts index f9a4f255..97bc0bbf 100644 --- a/modules/workbenches/sheetMetal/features/smTab/smTab.operation.ts +++ b/modules/workbenches/sheetMetal/features/smTab/smTab.operation.ts @@ -5,7 +5,8 @@ import { EntityKind } from "cad/model/entities"; import { BooleanDefinition } from "cad/craft/schema/common/BooleanDefinition"; import { UnitVector } from "math/vector"; import { OperationDescriptor } from "cad/craft/operationPlugin"; - +import { FromSketchProductionAnalyzer } from "cad/craft/production/productionAnalyzer"; +import { FaceRef } from "cad/craft/e0/OCCUtils"; interface smTabParams { thickness: number; @@ -33,27 +34,36 @@ export const smTabOperation: OperationDescriptor = { let sketch = ctx.sketchStorageService.readSketch(face.id); if (!sketch) throw 'sketch not found for the face ' + face.id; - const occFaces = occ.utils.sketchToFaces(sketch, face.csys).map(ref => ref.face); + - const dir: UnitVector= face.normal(); + const occFaces = occ.utils.sketchToFaces(sketch, face.csys); - let extrusionVector =[]; - if (params.flipper == true){ - extrusionVector = dir.normalize()._multiply(params.thickness).data(); + const dir: UnitVector = face.normal(); + + let extrusionVector = {}; + if (params.flipper == true) { + extrusionVector = dir.normalize()._multiply(params.thickness); } else { - extrusionVector = dir.normalize()._multiply(params.thickness).negate().data(); + extrusionVector = dir.normalize()._multiply(params.thickness).negate(); } - - const tools = occFaces.map((faceName, i) => { + + + + + const productionAnalyzer = new FromSketchProductionAnalyzer(occFaces,"SM/FLAT/A", "SM/FLAT/B","SM/THICKNESS"); + console.log(productionAnalyzer); + + const tools = occFaces.map((faceRef, i) => { + + const faceName = faceRef.face; const shapeName = "Tool/" + i; - const bla = oci.prism(shapeName, faceName, ...extrusionVector); - console.log(bla); + oci.prism(shapeName, faceName, ...extrusionVector.data()); return shapeName; - }); + }).map(shapeName => occ.io.getShell(shapeName, productionAnalyzer)); - return occ.utils.applyBooleanModifier(tools, params.boolean); + return occ.utils.applyBooleanModifier(tools, params.boolean, face, [face]); }, diff --git a/web/app/cad/craft/production/productionAnalyzer.ts b/web/app/cad/craft/production/productionAnalyzer.ts index af941067..85dee6a3 100644 --- a/web/app/cad/craft/production/productionAnalyzer.ts +++ b/web/app/cad/craft/production/productionAnalyzer.ts @@ -192,10 +192,16 @@ export class ExpectedOrderProductionAnalyzer extends BasicProductionAnalyzer { export class FromSketchProductionAnalyzer extends BasicProductionAnalyzer { profiles: FaceRef[]; + baseName: string; + sweepName: string; + lidName:string; - constructor(profiles: FaceRef[]) { + constructor(profiles: FaceRef[], baseName?: string, lidName?:string, sweepName?: string) { super(); this.profiles = profiles; + this.baseName = baseName ? baseName : "BASE"; + this.lidName = lidName ? lidName : "LID"; + this.sweepName = sweepName? sweepName: "SWEEP"; for (let originFace of this.profiles) { classifier.prepare(originFace.topoShape); } @@ -217,9 +223,9 @@ export class FromSketchProductionAnalyzer extends BasicProductionAnalyzer { if (faceToFaceClassification === Classification.EXACT) { base = createdFace; - base.data.id = `F:BASE[${wireId}]`; + base.data.id = `F:${this.baseName}[${wireId}]`; base.data.productionInfo = { - role: 'base', + role: this.baseName, originatingWire: wireId } break; @@ -233,55 +239,55 @@ export class FromSketchProductionAnalyzer extends BasicProductionAnalyzer { for (let createdEdge of createdShell.edges) { if (classifier.classifyEdgeToEdge(profileEdge, createdEdge) !== Classification.UNRELATED) { - createdEdge.data.id = `E:BASE[${seg.id}]`; + createdEdge.data.id = `E:${this.baseName}[${seg.id}]`; createdEdge.data.productionInfo = { - role: 'base', + role: this.baseName, originatingPrimitive: seg.id } let halfEdge = createdEdge.getHalfEdge(he => he?.loop?.face && he.loop.face !== base); if (halfEdge) { let face = halfEdge.loop.face; - face.data.id = `F:SWEEP[${seg.id}]`; + face.data.id = `F:${this.sweepName}[${seg.id}]`; face.data.productionInfo = { - role: 'sweep', + role: this.sweepName, originatingPrimitive: seg.id } - halfEdge.prev.edge.data.id = `E:SWEEP[${seg.id}/A]`; + halfEdge.prev.edge.data.id = `E:${this.sweepName}[${seg.id}/A]`; halfEdge.prev.edge.data.productionInfo = { - role: 'sweep', + role: this.sweepName, originatingPrimitive: seg.id + '/A' } - halfEdge.prev.vertexA.data.id = `V:LID[${seg.id}/A]` + halfEdge.prev.vertexA.data.id = `V:${this.lidName}[${seg.id}/A]` halfEdge.prev.vertexA.data.productionInfo = { - role: 'lid', + role: this.lidName, originatingPrimitive: seg.id + '/A' } - halfEdge.prev.vertexB.data.id = `V:BASE[${seg.id}/A]` + halfEdge.prev.vertexB.data.id = `V:${this.baseName}[${seg.id}/A]` halfEdge.prev.vertexB.data.productionInfo = { - role: 'base', + role: this.baseName, originatingPrimitive: seg.id + '/A' } //Extruded not closed wire if (!halfEdge.next.twin()) { - halfEdge.next.edge.data.id = `E:SWEEP[${seg.id}/B]`; + halfEdge.next.edge.data.id = `E:${this.sweepName}[${seg.id}/B]`; halfEdge.next.edge.data.productionInfo = { - role: 'sweep', + role: this.sweepName, originatingPrimitive: seg.id + '/B' } - halfEdge.next.vertexA.data.id = `V:BASE[${seg.id}/B]` + halfEdge.next.vertexA.data.id = `V:${this.baseName}[${seg.id}/B]` halfEdge.next.vertexA.data.productionInfo = { - role: 'base', + role: this.baseName, originatingPrimitive: seg.id + '/B' } - halfEdge.prev.vertexB.data.id = `V:LID[${seg.id}/B]` + halfEdge.prev.vertexB.data.id = `V:${this.lidName}[${seg.id}/B]` halfEdge.prev.vertexB.data.productionInfo = { - role: 'lid', + role: this.lidName, originatingPrimitive: seg.id + '/B' } } @@ -292,9 +298,9 @@ export class FromSketchProductionAnalyzer extends BasicProductionAnalyzer { for (let createdFace of createdShell.faces) { if (!createdFace.data.productionInfo) { - createdFace.data.id = `F:LID[${wireId}]`; + createdFace.data.id = `F:${this.lidName}[${wireId}]`; createdFace.data.productionInfo = { - role: 'lid' + role: this.lidName } break; } @@ -309,9 +315,9 @@ export class FromSketchProductionAnalyzer extends BasicProductionAnalyzer { } if (he) { const originatingPrimitive = he.loop.face.data.productionInfo.originatingPrimitive; - createdEdge.data.id = `E:LID[${originatingPrimitive}]`; + createdEdge.data.id = `E:${this.lidName}[${originatingPrimitive}]`; createdEdge.data.productionInfo = { - role: 'lid', + role: this.lidName, originatingPrimitive } }