From 6d8dc5fa698dad513d4e99e0a1da67aaf9936b37 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Fri, 22 Jul 2022 00:54:03 -0500 Subject: [PATCH] working on radial pattern --- .../patternRadial/patternRadial.operation.ts | 60 +++++++++---------- web/app/cad/mdf/ui/ChoiceWidget.tsx | 15 ++++- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/modules/workbenches/modeler/features/patternRadial/patternRadial.operation.ts b/modules/workbenches/modeler/features/patternRadial/patternRadial.operation.ts index d9c07fc8..bb78d583 100644 --- a/modules/workbenches/modeler/features/patternRadial/patternRadial.operation.ts +++ b/modules/workbenches/modeler/features/patternRadial/patternRadial.operation.ts @@ -1,13 +1,13 @@ -import { roundValueForPresentation as r } from 'cad/craft/operationHelper'; -import { MFace } from "cad/model/mface"; -import { ApplicationContext } from "context"; -import { EntityKind } from "cad/model/entities"; +import {roundValueForPresentation as r} from 'cad/craft/operationHelper'; +import {MFace} from "cad/model/mface"; +import {ApplicationContext} from "context"; +import {EntityKind} from "cad/model/entities"; import Axis from "math/axis"; -import { UnitVector } from "math/vector"; -import { OperationDescriptor } from "cad/craft/operationPlugin"; -import { MShell } from 'cad/model/mshell'; +import {OperationDescriptor} from "cad/craft/operationPlugin"; +import {MShell} from 'cad/model/mshell'; import {Matrix3x4} from "math/matrix"; import {SetLocation} from "cad/craft/e0/interact"; +import {DEG_RAD} from "math/commons"; interface patternRadialParams { inputBodies: MShell[]; @@ -15,7 +15,7 @@ interface patternRadialParams { face: MFace; angle: number; qty: number; - direction?: UnitVector, + axis: Axis, } @@ -24,11 +24,9 @@ export const PatternRadialOperation: OperationDescriptor = label: 'Radial pattern', icon: 'img/cad/patternRadial', info: 'Creates a Radial pattern.', - paramsInfo: ({ }) => `(${r()})`, + paramsInfo: p => `( ${p.patternMethod} ${r(p.angle * DEG_RAD)})`, run: (params: patternRadialParams, ctx: ApplicationContext) => { - - console.log(params); let occ = ctx.occService; const oci = occ.commandInterface; @@ -36,15 +34,20 @@ export const PatternRadialOperation: OperationDescriptor = params.inputBodies.forEach((shellToPatern, index) => { for (let i = 2; i <= params.qty; i++) { - let angleForInstance = 0; - if(params.patternMethod == 'Step Angle') angleForInstance =params.angle*(i-1); - if(params.patternMethod == 'Span Angle') angleForInstance =(params.angle / (params.qty-1))*(i-1); + let angleForInstance; + if (params.patternMethod == 'step') { + angleForInstance = params.angle*(i-1); + } else if (params.patternMethod == 'span') { + angleForInstance = (params.angle / (params.qty-1))*(i-1); + } else { + throw 'unsupported pattern type: ' + params.patternMethod; + } - //const tr = shellToPatern.location.rotate(degrees_to_radians(angleForInstance),params.direction.normalize(),params.direction.normalize()); - let tr = new Matrix3x4().rotate(degrees_to_radians(angleForInstance),params.direction.normalize(),params.direction.normalize()); - //tr = tr.rotateWithSphericalAxis(shellToPatern.location) - - const newShellName = shellToPatern.id + ":patern/" + index + "/" +i; + const angle = angleForInstance * DEG_RAD; + + let tr = new Matrix3x4().rotate(angle, params.axis.direction, params.axis.origin); + + const newShellName = shellToPatern.id + ":pattern/" + index + "/" +i; oci.copy(shellToPatern, newShellName); SetLocation(newShellName, tr.toFlatArray()); @@ -76,8 +79,8 @@ export const PatternRadialOperation: OperationDescriptor = label: 'Pattern Method', name: "patternMethod", style: "dropdown", - defaultValue: "Step Angle", - values: ['Step Angle', 'Span Angle',], + defaultValue: "step", + values: [['step', 'Step Angle'], ['span', 'Span Angle']], }, { type: 'number', @@ -92,17 +95,10 @@ export const PatternRadialOperation: OperationDescriptor = defaultValue: 3, }, { - type: 'direction', - name: 'direction', - label: 'direction', - optional: true + type: 'axis', + name: 'axis', + label: 'axis', + optional: false }, ], -} - - -function degrees_to_radians(degrees) -{ - var pi = Math.PI; - return degrees * (pi/180); } \ No newline at end of file diff --git a/web/app/cad/mdf/ui/ChoiceWidget.tsx b/web/app/cad/mdf/ui/ChoiceWidget.tsx index d6bda270..cb501581 100644 --- a/web/app/cad/mdf/ui/ChoiceWidget.tsx +++ b/web/app/cad/mdf/ui/ChoiceWidget.tsx @@ -4,13 +4,15 @@ import {FieldBasicProps, fieldToSchemaGeneric} from "cad/mdf/ui/field"; import {Types} from "cad/craft/schema/types"; import {ComboBoxOption} from "ui/components/controls/ComboBoxControl"; +type ValueDef = [string, string] | string; + export interface ChoiceWidgetProps extends FieldBasicProps { type: 'choice'; style?: 'dropdown' | 'radio'; - values: string[]; + values: ValueDef[]; } @@ -18,7 +20,16 @@ export function ChoiceWidget(props: ChoiceWidgetProps) { if (!props.style || props.style === 'dropdown') { return - {props.values.map(value => {value})} + {props.values.map((value: any) => { + let val, name; + if (Array.isArray(value)) { + [val, name] = value; + } else { + val = value; + name = value; + } + return {name} + })} ; } else {