From db7a74c9a4656480dbf342b18c4737bb276828fb Mon Sep 17 00:00:00 2001 From: xibyte Date: Sun, 6 Feb 2022 01:21:10 -0800 Subject: [PATCH] fix extrude --- .../features/extrude/extrude.operation.ts | 8 +--- web/app/cad/craft/e0/OCCUtils.ts | 48 +++++++++++-------- web/app/cad/craft/e0/occCommandInterface.ts | 9 +++- web/app/cad/craft/e0/occEngineInterface.ts | 2 +- web/app/cad/craft/e0/occIO.ts | 9 +++- .../cad/craft/wizard/wizardSelectionPlugin.js | 6 ++- web/app/cad/mdf/ui/BooleanWidget.tsx | 4 +- 7 files changed, 51 insertions(+), 35 deletions(-) diff --git a/modules/workbenches/modeler/features/extrude/extrude.operation.ts b/modules/workbenches/modeler/features/extrude/extrude.operation.ts index e0d0cde0..c5707b74 100644 --- a/modules/workbenches/modeler/features/extrude/extrude.operation.ts +++ b/modules/workbenches/modeler/features/extrude/extrude.operation.ts @@ -37,7 +37,7 @@ const ExtrudeOperation: MDFCommand = { const extrusionVector = dir.normalize()._multiply(params.length).data(); const tools = occFaces.map((faceName, i) => { - const shapeName = "Tool" + i; + const shapeName = "Tool/" + i; oci.prism(shapeName, faceName, ...extrusionVector) // occIterateFaces(oc, shape, face => { @@ -62,11 +62,7 @@ const ExtrudeOperation: MDFCommand = { return shapeName; }); - return { - created: tools.map(shapeName => occ.io.getShell(shapeName)), - consumed: [] - } - // return occ.utils.applyBooleanModifier(tools, params.boolean); + return occ.utils.applyBooleanModifier(tools, params.boolean); }, diff --git a/web/app/cad/craft/e0/OCCUtils.ts b/web/app/cad/craft/e0/OCCUtils.ts index d46b5aed..e835ebcb 100644 --- a/web/app/cad/craft/e0/OCCUtils.ts +++ b/web/app/cad/craft/e0/OCCUtils.ts @@ -1,13 +1,9 @@ -import {OCCCommandInterface} from "cad/craft/e0/occCommandInterface"; -import {Vec3} from "math/vec"; import {SketchGeom} from "cad/sketch/sketchReader"; -import {OCCService} from "cad/craft/e0/occService"; import {CoreContext} from "context"; import CSys from "math/csys"; import {OperationResult} from "cad/craft/craftPlugin"; -import {MShell} from "cad/model/mshell"; import {BooleanDefinition, BooleanKind} from "cad/craft/schema/common/BooleanDefinition"; -import {bool} from "prop-types"; +import {MShell} from "cad/model/mshell"; export interface OCCUtils { @@ -59,17 +55,20 @@ export function createOCCUtils(ctx: CoreContext): OCCUtils { const kind = booleanDef.kind; let targets = booleanDef.targets; - if (targets.length === 0) { + if (!targets || targets.length === 0) { targets = ctx.cadRegistry.shells; } let targetNames = targets.map((target, i) => { - const targetName = 'Target:' + i; - ctx.occService.io.pushModel(target, targetName) + const targetName = 'Target/' + i; + const wasPushed = ctx.occService.io.pushModel(target, targetName); + if (!wasPushed) { + return null; + } return targetName; - }); + }).filter(targetName => !!targetName); - oci.bfuzzyvalue(0.0001); + oci.bfuzzyvalue(0.01); oci.bclearobjects(); oci.bcleartools(); @@ -77,22 +76,13 @@ export function createOCCUtils(ctx: CoreContext): OCCUtils { tools.forEach(toolName => oci.baddtools(toolName)); oci.bfillds(); - oci.bcbuild("BooleanResult"); - - // oci.bopcommon("result"); -//oci.bopfuse("result"); -//oci.bopcut("result"); + oci.bbop("BooleanResult", booleanKindToOCCBopType(kind)); return { consumed: targets, - created: tools.map(shapeName => occ.io.getShell(shapeName), targets) + created: [occ.io.getShell("BooleanResult", targets as MShell[])] } - - } - - - } @@ -100,4 +90,20 @@ export function createOCCUtils(ctx: CoreContext): OCCUtils { wiresToFaces, sketchToFaces, applyBooleanModifier } +} + +enum OccBBOPTypes { + COMMON, + FUSE, + CUT, + CUT21, +} + +function booleanKindToOCCBopType(kind: BooleanKind): number { + switch (kind) { + case "INTERSECT": return OccBBOPTypes.COMMON; + case "UNION": return OccBBOPTypes.FUSE; + case "SUBTRACT": return OccBBOPTypes.CUT; + default: throw 'unsupported boolean kind: ' + kind; + } } \ No newline at end of file diff --git a/web/app/cad/craft/e0/occCommandInterface.ts b/web/app/cad/craft/e0/occCommandInterface.ts index c90d0683..c99e3e97 100644 --- a/web/app/cad/craft/e0/occCommandInterface.ts +++ b/web/app/cad/craft/e0/occCommandInterface.ts @@ -6,7 +6,14 @@ export const OCI: OCCCommandInterface = new Proxy({}, { get: function (target, prop: string, receiver) { return prop in target ? target[prop] : function() { prop = prop.replace(/^_/, ''); - const args = Array.from(arguments).map(a => JSON.stringify(a)); + const args = Array.from(arguments).map(arg => { + const type = typeof arg; + if (type === 'object') { + return JSON.stringify(arg); + } else { + return arg + ""; + } + }); console.log("ARGUMENTS:", args); const returnCode = CallCommand(prop, [prop, ...args]); // if (returnCode !== 0) { diff --git a/web/app/cad/craft/e0/occEngineInterface.ts b/web/app/cad/craft/e0/occEngineInterface.ts index 6c59e870..ed1d936b 100644 --- a/web/app/cad/craft/e0/occEngineInterface.ts +++ b/web/app/cad/craft/e0/occEngineInterface.ts @@ -11,7 +11,7 @@ export function createOCCEngineInterface(oci: OCCCommandInterface) { io: { pushModel: (params: { name: string, operand: number, - }) => oci.EngineCommand(params) + }) => oci.EngineCommand('io.pushModel', params) } } diff --git a/web/app/cad/craft/e0/occIO.ts b/web/app/cad/craft/e0/occIO.ts index 5b6e3cc1..961921a4 100644 --- a/web/app/cad/craft/e0/occIO.ts +++ b/web/app/cad/craft/e0/occIO.ts @@ -25,10 +25,15 @@ export function createOCCIO(ctx: CoreContext): OCCIO { } function pushModel(model: MObject, name: string) { - ctx.occService.engineInterface.pushModel({ + const ptr = model.brepShell?.data?.externals?.ptr; + if (!ptr) { + return false; + } + ctx.occService.engineInterface.io.pushModel({ name, - operand: model.brepShell.data.externals.ptr + operand: ptr }); + return true; } function cleanupRegistry() { diff --git a/web/app/cad/craft/wizard/wizardSelectionPlugin.js b/web/app/cad/craft/wizard/wizardSelectionPlugin.js index 60a95700..0f5f07b3 100644 --- a/web/app/cad/craft/wizard/wizardSelectionPlugin.js +++ b/web/app/cad/craft/wizard/wizardSelectionPlugin.js @@ -1,5 +1,6 @@ import {FACE, SHELL} from '../../model/entities'; import {memoize} from "lodash/function"; +import {Types} from "cad/craft/schema/types"; export function activate(ctx) { ctx.streams.wizard.wizardContext.attach(wizCtx => { @@ -14,7 +15,7 @@ export function activate(ctx) { Object.keys(schema).forEach(param => { let md = schema[param]; - if (md.type !== 'entity') { + if (md.type !== 'entity' && !(md.type === 'array' && md.items.type === 'entity')) { return; } @@ -68,7 +69,8 @@ function createPickHandlerFromSchema(wizCtx) { let {workingSchema: schema} = wizCtx.operation; const activeMd = state.activeParam && schema[state.activeParam]; - const activeCanTakeIt = kind => activeMd.allowedKinds && activeMd.allowedKinds.includes(kind); + const unwrappedActiveMd = activeMd.type === Types.array ? activeMd.items : activeMd; + const activeCanTakeIt = kind => unwrappedActiveMd.allowedKinds && unwrappedActiveMd.allowedKinds.includes(kind); function select(param, md, id) { const valueGetter = md.type === 'array' ? arrayValue : singleValue; diff --git a/web/app/cad/mdf/ui/BooleanWidget.tsx b/web/app/cad/mdf/ui/BooleanWidget.tsx index 5ef15991..ee5df7c5 100644 --- a/web/app/cad/mdf/ui/BooleanWidget.tsx +++ b/web/app/cad/mdf/ui/BooleanWidget.tsx @@ -69,8 +69,8 @@ BooleanWidget.propsToSchema = (consumer: OperationSchema, props: BooleanWidgetPr targets: { label: 'targets', type: Types.array, - item: { - type: Types.boolean, + items: { + type: Types.entity, allowedKinds: ENTITY_CAPTURE, }, optional: true,