awv3
Version:
⚡ AWV3 embedded CAD
118 lines (108 loc) • 4.32 kB
JavaScript
import Plugin from '../../session/plugin';
import React, { Component, connect } from '../../session/renderer';
import Dimension from '../dimension/';
import { Checkbox, Dropdown, Input, Group, Label, Link, Slider } from '../../session/elements';
const resources = ['extrusion'].reduce(
(prev, item) => ({ ...prev, [item]: require('!!url-loader!awv3-icons/32x32/' + item + '.png') }),
{},
);
class MemberRow extends Component {
render({ name, value: { type, value } }) {
if (name === 'extrudeType')
return (
<Slider
name={name}
value={value}
onValue={v => this.set(v)}
max={2}
positions={{ ...['up', 'down', 'symmetric'] }}
/>
);
else if (name.endsWith('Angle'))
return (
<Slider
name={name}
value={value}
onValue={v => this.set(v)}
max={360}
step={10}
positions={{ 0: '0°', 90: '90°', 180: '180°', 270: '270°', 360: '360°' }}
/>
);
else if (name.startsWith('invert'))
return <Checkbox name={name} value={Boolean(value)} onValue={v => this.set(Number(v))} />;
else if (type === 'point')
return (
<Input
name={name}
value={value.map(String).join(',')}
onValue={v => this.set(v.split(',').map(Number))}
format={Input.Format.Vector}
/>
);
else if (type === 'real') return <Input name={name} value={String(value)} onValue={v => this.set(Number(v))} />;
else return <Label name={name} value={String(value)} />;
}
set(value) {
const id = this.props.id, m = JSON.stringify(this.props.name), v = JSON.stringify(value), f = 1;
this.plugin.connection.execute(`_C.CADApplication.SetExpressions(${id}, [${m}], [${v}], ${f});`);
}
}
class SketchRow extends Component {
render({ name, value: { value } }) {
return <Dropdown name={name} value={String(value)} onValue={v => this.set(v)} />;
}
set(value) {
if (true) return; // TODO
const sketches = this.tree[this.tree.root].features.map(x => this.tree[x]).filter(x => x.class === 'CC_Sketch');
const items = sketches.map(x => x.name);
const t2e = t => (t ? this.tree[t].name : '');
const e2t = e => (sketches.find(x => x.name === e) || { id: 0 }).id;
this.connection.execute(`VAR region, sketch;
region = CADH_RealToId(${region});
sketch = CADH_RealToId(${e2t(e)});
region.SetCurves(sketch.GetCCCurves());`);
}
}
((state, props) => {
const tree = state.connections[props.connection].tree;
const extrusion = tree[props.id];
const region = extrusion.children.map(x => tree[x]).find(x => x.class === 'CC_SketchRegion');
return { extrusion, region };
})
class Extrusion extends Component {
render({ extrusion, region }) {
const id = extrusion.id;
return (
<Group format={Group.Format.Table}>
{Object.entries(extrusion.members)
.filter(([name]) => !name.startsWith('_'))
.map(([name, value]) => <MemberRow id={id} name={name} value={value} />)}
<SketchRow id={region.id} name="sketch" value={region.members.sketch} />
</Group>
);
}
}
export default class Feature extends Plugin {
constructor(session, args) {
super(session, { type: 'Extrusion', icon: 'extrusion', resources, ...args });
this.dimension = new Dimension(this.session, {
name: 'Dimensions',
collapsed: true,
closeable: false,
parent: this.id,
});
this.dependencies.push(this.dimension);
}
render() {
return (
<Group>
<Extrusion connection={this.connection.id} id={this.feature} />
<Link value={this.dimension.id} collapsable={true} />
</Group>
);
}
onEnabled() {
this.dimension.enabled = true;
}
}