awv3
Version:
⚡ AWV3 embedded CAD
141 lines (129 loc) • 5.11 kB
JavaScript
import debounce from 'lodash/debounce'
import Plugin from '../../session/plugin'
import React, { Component, connect } from '../../session/renderer'
import Dimensions from '../dimensions/'
import { Button, Checkbox, Dropdown, Input, Group, Label, Link, Slider, Spacer } from '../../session/elements'
const resources = ['extrusion'].reduce(
(prev, item) => ({ ...prev, [item]: require('!!url-loader!awv3-icons/32x32/' + item + '.png') }),
{},
)
class MemberRow extends Component {
state = { value: undefined }
render({ key, member }, { value }, set) {
let displayVal = value === undefined ? member.expression || member.value : value
if (Array.isArray(displayVal)) displayVal = displayVal.join(',')
if (key === 'color') return <Button name={key} format={Button.Format.Color} />
else if (key === 'extrudeType')
return (
<Slider
name={key}
value={Number(displayVal) || 0}
max={2}
positions={{ ...['up', 'down', 'symmetric'] }}
onValue={this.update}
/>
)
else if (key.endsWith('Angle'))
return (
<Slider
name={key}
value={Number(displayVal) || 0}
onValue={this.update}
max={45}
step={1}
positions={{ 0: '0°', 45: '45' }}
/>
)
else if (key.startsWith('invert'))
return <Checkbox name={key} value={Boolean(displayVal)} onValue={value => this.update(value ? 1 : 0)} />
else if (member.type === 'point')
return (
<Input
name={key}
value={displayVal}
onValue={value => set({ value })}
format={Input.Format.Vector}
onLastEvent={e => e.key === 'Enter' && this.update(value.split(',').map(Number))}
/>
)
else if (member.type === 'real')
return (
<Input
name={key}
value={displayVal}
onValue={value => set({ value })}
onLastEvent={e => e.key === 'Enter' && this.update(value)}
/>
)
else return <Label name={key} value={displayVal} />
}
update = debounce(value => {
const id = this.props.id,
m = JSON.stringify(this.props.key),
v = JSON.stringify(value)
console.log(`_C.CADApplication.SetExpressions(${id}, [${m}], [${v}], ${f});`)
this.plugin.connection.execute(`_C.CADApplication.SetExpressions(${id}, [${m}], [${v}], 1);`)
}, 500)
}
class SketchRow extends Component {
render({ name, value: { value } }) {
console.log(value)
return <Dropdown name={name} items={[String(value)]} 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(([key, member]) => <MemberRow id={id} key={key} member={member} />)}
<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.dimensions = new Dimensions(this.session, {
name: 'Dimensions',
collapsed: true,
closeable: false,
parent: this.id,
})
}
render() {
return (
<Group>
<Extrusion connection={this.connection.id} id={this.feature} />
<Spacer />
<Link value={this.dimensions.id} collapsable={true} />
</Group>
)
}
onEnabled() {
this.dimensions.enabled = true
}
onDisabled() {
this.dimensions.destroy()
}
}