UNPKG

awv3

Version:
141 lines (129 loc) 5.11 kB
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());`) } } @connect((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() } }