working somewhat ok
This commit is contained in:
@@ -246,6 +246,8 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
|
|||||||
function runMain(params={}){
|
function runMain(params={}){
|
||||||
let time = Date.now()
|
let time = Date.now()
|
||||||
let solids
|
let solids
|
||||||
|
let transfer = []
|
||||||
|
console.log('run main')
|
||||||
try{
|
try{
|
||||||
solids = main(params)
|
solids = main(params)
|
||||||
}catch(e){
|
}catch(e){
|
||||||
@@ -255,7 +257,6 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
|
|||||||
let solidsTime = Date.now() - time
|
let solidsTime = Date.now() - time
|
||||||
scriptStats = `generate solids ${solidsTime}ms`
|
scriptStats = `generate solids ${solidsTime}ms`
|
||||||
|
|
||||||
let transfer = []
|
|
||||||
if(convertToSolids === 'buffers'){
|
if(convertToSolids === 'buffers'){
|
||||||
CSGToBuffers.clearCache()
|
CSGToBuffers.clearCache()
|
||||||
entities = solids.map((csg)=>{
|
entities = solids.map((csg)=>{
|
||||||
@@ -549,6 +550,7 @@ return (params)=>{
|
|||||||
workerBaseURI = baseURI
|
workerBaseURI = baseURI
|
||||||
|
|
||||||
const sendCmd = (params, transfer)=>{
|
const sendCmd = (params, transfer)=>{
|
||||||
|
console.log('sendCmd', params.worker, params.action, params)
|
||||||
if(params.worker === 'render')
|
if(params.worker === 'render')
|
||||||
sendToRender(params, transfer)
|
sendToRender(params, transfer)
|
||||||
else if(params.worker === 'script')
|
else if(params.worker === 'script')
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useRender } from 'src/components/IdeWrapper/useRender'
|
import { useRender, } from 'src/components/IdeWrapper/useRender'
|
||||||
import { useIdeContext } from 'src/helpers/hooks/useIdeContext'
|
import { useIdeContext } from 'src/helpers/hooks/useIdeContext'
|
||||||
|
import { genParams, getParams } from 'src/helpers/cadPackages/jscadParams'
|
||||||
|
|
||||||
const Customizer = () => {
|
const Customizer = () => {
|
||||||
const [open, setOpen] = React.useState(true)
|
const [open, setOpen] = React.useState(true)
|
||||||
@@ -7,16 +8,18 @@ const Customizer = () => {
|
|||||||
const jsCadCustomizerElement = ref.current
|
const jsCadCustomizerElement = ref.current
|
||||||
const { state } = useIdeContext()
|
const { state } = useIdeContext()
|
||||||
const customizerParams = state?.objectData?.customizerParams
|
const customizerParams = state?.objectData?.customizerParams
|
||||||
console.log(state)
|
const lastParameters = state?.objectData?.lastParameters
|
||||||
React.useEffect(() => {
|
|
||||||
console.log({ jsCadCustomizerElement, customizerParams })
|
|
||||||
if (jsCadCustomizerElement && customizerParams) {
|
|
||||||
jsCadCustomizerElement.innerHTML = `<div>${JSON.stringify(
|
|
||||||
customizerParams
|
|
||||||
)}</div>`
|
|
||||||
}
|
|
||||||
}, [jsCadCustomizerElement, customizerParams])
|
|
||||||
const handleRender = useRender()
|
const handleRender = useRender()
|
||||||
|
const handleRender2 = ()=>handleRender(getParams(ref.current))
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
console.log({ jsCadCustomizerElement, customizerParams, lastParameters })
|
||||||
|
if (jsCadCustomizerElement && customizerParams) {
|
||||||
|
genParams(customizerParams, jsCadCustomizerElement, lastParameters || {}, (values)=>{
|
||||||
|
handleRender(values)
|
||||||
|
},[])
|
||||||
|
}
|
||||||
|
}, [jsCadCustomizerElement, customizerParams, lastParameters])
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`absolute inset-x-0 bottom-0 bg-ch-gray-600 bg-opacity-60 text-ch-gray-300 text-lg font-fira-sans ${
|
className={`absolute inset-x-0 bottom-0 bg-ch-gray-600 bg-opacity-60 text-ch-gray-300 text-lg font-fira-sans ${
|
||||||
@@ -32,7 +35,7 @@ const Customizer = () => {
|
|||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
className="px-4 py-1 rounded bg-ch-gray-300 text-ch-gray-800"
|
className="px-4 py-1 rounded bg-ch-gray-300 text-ch-gray-800"
|
||||||
onClick={handleRender}
|
onClick={handleRender2}
|
||||||
>
|
>
|
||||||
Update
|
Update
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { useIdeContext } from 'src/helpers/hooks/useIdeContext'
|
|||||||
|
|
||||||
export const useRender = () => {
|
export const useRender = () => {
|
||||||
const { state, thunkDispatch } = useIdeContext()
|
const { state, thunkDispatch } = useIdeContext()
|
||||||
return () => {
|
return (parameters) => {
|
||||||
thunkDispatch((dispatch, getState) => {
|
thunkDispatch((dispatch, getState) => {
|
||||||
const state = getState()
|
const state = getState()
|
||||||
dispatch({ type: 'setLoading' })
|
dispatch({ type: 'setLoading' })
|
||||||
@@ -13,6 +13,7 @@ export const useRender = () => {
|
|||||||
code: state.code,
|
code: state.code,
|
||||||
viewerSize: state.viewerSize,
|
viewerSize: state.viewerSize,
|
||||||
camera: state.camera,
|
camera: state.camera,
|
||||||
|
parameters,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
localStorage.setItem(makeCodeStoreKey(state.ideType), state.code)
|
localStorage.setItem(makeCodeStoreKey(state.ideType), state.code)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export const stlToGeometry = (url) =>
|
|||||||
|
|
||||||
export interface RenderArgs {
|
export interface RenderArgs {
|
||||||
code: State['code']
|
code: State['code']
|
||||||
|
parameters: any,
|
||||||
settings: {
|
settings: {
|
||||||
camera: State['camera']
|
camera: State['camera']
|
||||||
viewerSize: State['viewerSize']
|
viewerSize: State['viewerSize']
|
||||||
@@ -31,6 +32,7 @@ export interface HealthyResponse {
|
|||||||
type: 'stl' | 'png' | 'geometry'
|
type: 'stl' | 'png' | 'geometry'
|
||||||
}
|
}
|
||||||
customizerParams?: any
|
customizerParams?: any
|
||||||
|
lastParameters?: any
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createHealthyResponse({
|
export function createHealthyResponse({
|
||||||
@@ -39,12 +41,14 @@ export function createHealthyResponse({
|
|||||||
consoleMessage,
|
consoleMessage,
|
||||||
type,
|
type,
|
||||||
customizerParams,
|
customizerParams,
|
||||||
}: {
|
lastParameters,
|
||||||
|
}: {
|
||||||
date: Date
|
date: Date
|
||||||
data: any
|
data: any
|
||||||
consoleMessage: string
|
consoleMessage: string
|
||||||
type: HealthyResponse['objectData']['type']
|
type: HealthyResponse['objectData']['type']
|
||||||
customizerParams?: any
|
customizerParams?: any
|
||||||
|
lastParameters?: any
|
||||||
}): HealthyResponse {
|
}): HealthyResponse {
|
||||||
return {
|
return {
|
||||||
status: 'healthy',
|
status: 'healthy',
|
||||||
@@ -58,6 +62,7 @@ export function createHealthyResponse({
|
|||||||
time: date,
|
time: date,
|
||||||
},
|
},
|
||||||
customizerParams,
|
customizerParams,
|
||||||
|
lastParameters,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ function CSG2Object3D(obj) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let scriptWorker
|
let scriptWorker
|
||||||
|
let lastParameters = {}
|
||||||
const scriptUrl = '/demo-worker.js'
|
const scriptUrl = '/demo-worker.js'
|
||||||
let resolveReference = null
|
let resolveReference = null
|
||||||
let response = null
|
let response = null
|
||||||
@@ -81,34 +82,42 @@ const callResolve = () => {
|
|||||||
|
|
||||||
export const render: DefaultKernelExport['render'] = async ({
|
export const render: DefaultKernelExport['render'] = async ({
|
||||||
code,
|
code,
|
||||||
|
parameters,
|
||||||
settings,
|
settings,
|
||||||
}: RenderArgs) => {
|
}: RenderArgs) => {
|
||||||
if (!scriptWorker) {
|
if (!scriptWorker) {
|
||||||
|
console.trace('************************** creating new worker ************************')
|
||||||
const baseURI = document.baseURI.toString()
|
const baseURI = document.baseURI.toString()
|
||||||
const script = `let baseURI = '${baseURI}'
|
const script = `let baseURI = '${baseURI}'
|
||||||
importScripts(new URL('${scriptUrl}',baseURI))
|
importScripts(new URL('${scriptUrl}',baseURI))
|
||||||
let worker = jscadWorker({
|
let worker = jscadWorker({
|
||||||
baseURI: baseURI,
|
baseURI: baseURI,
|
||||||
scope:'worker',
|
scope:'worker',
|
||||||
convertToSolids: 'buffers',
|
convertToSolids: 'buffers',
|
||||||
callback:(params)=>self.postMessage(params),
|
callback:(params)=>self.postMessage(params),
|
||||||
})
|
})
|
||||||
self.addEventListener('message', (e)=>worker.postMessage(e.data))
|
self.addEventListener('message', (e)=>worker.postMessage(e.data))
|
||||||
`
|
`
|
||||||
const blob = new Blob([script], { type: 'text/javascript' })
|
const blob = new Blob([script], { type: 'text/javascript' })
|
||||||
scriptWorker = new Worker(window.URL.createObjectURL(blob))
|
scriptWorker = new Worker(window.URL.createObjectURL(blob))
|
||||||
|
let parameterDefinitions = []
|
||||||
scriptWorker.addEventListener('message', (e) => {
|
scriptWorker.addEventListener('message', (e) => {
|
||||||
const data = e.data
|
const data = e.data
|
||||||
if (data.action == 'entities') {
|
if (data.action == 'parameterDefinitions') {
|
||||||
|
console.log('message',data)
|
||||||
|
parameterDefinitions = data.data
|
||||||
|
} else if (data.action == 'entities') {
|
||||||
if (data.error) {
|
if (data.error) {
|
||||||
response = createUnhealthyResponse(new Date(), data.error)
|
response = createUnhealthyResponse(new Date(), data.error)
|
||||||
} else {
|
} else {
|
||||||
|
console.log('lastParameters',lastParameters)
|
||||||
response = createHealthyResponse({
|
response = createHealthyResponse({
|
||||||
type: 'geometry',
|
type: 'geometry',
|
||||||
data: [...data.entities.map(CSG2Object3D).filter((o) => o)],
|
data: [...data.entities.map(CSG2Object3D).filter((o) => o)],
|
||||||
consoleMessage: data.scriptStats,
|
consoleMessage: data.scriptStats,
|
||||||
date: new Date(),
|
date: new Date(),
|
||||||
customizerParams: ['param1', 'abc'],
|
customizerParams: parameterDefinitions,
|
||||||
|
lastParameters,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
callResolve()
|
callResolve()
|
||||||
@@ -119,12 +128,27 @@ self.addEventListener('message', (e)=>worker.postMessage(e.data))
|
|||||||
response = null
|
response = null
|
||||||
scriptWorker.postMessage({ action: 'init', baseURI, alias: [] })
|
scriptWorker.postMessage({ action: 'init', baseURI, alias: [] })
|
||||||
}
|
}
|
||||||
scriptWorker.postMessage({
|
|
||||||
action: 'runScript',
|
if(parameters){
|
||||||
worker: 'script',
|
// we are not evaluating code, but reacting to parameters change
|
||||||
script: code,
|
scriptWorker.postMessage({
|
||||||
url: 'jscad_script',
|
action: 'updateParams',
|
||||||
})
|
worker: 'script',
|
||||||
|
params: parameters,
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
scriptWorker.postMessage({
|
||||||
|
action: 'runScript',
|
||||||
|
worker: 'script',
|
||||||
|
script: code,
|
||||||
|
params: parameters || {},
|
||||||
|
url: 'jscad_script',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// we need this to keep the form filled with same data when new parameter definitions arrive
|
||||||
|
// each render of the script could provide new paramaters. In case some of them are still rpesent
|
||||||
|
// it is expected for them to stay the same and not just reset
|
||||||
|
lastParameters = parameters || {}
|
||||||
|
|
||||||
const waitResult = new Promise((resolve) => {
|
const waitResult = new Promise((resolve) => {
|
||||||
resolveReference = resolve
|
resolveReference = resolve
|
||||||
@@ -132,6 +156,7 @@ self.addEventListener('message', (e)=>worker.postMessage(e.data))
|
|||||||
|
|
||||||
await waitResult
|
await waitResult
|
||||||
resolveReference = null
|
resolveReference = null
|
||||||
|
if(parameters) delete response.customizerParams
|
||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
169
app/web/src/helpers/cadPackages/jscadParams.js
Normal file
169
app/web/src/helpers/cadPackages/jscadParams.js
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
const GROUP_SELECTOR = 'DIV[type="group"] LABEL'
|
||||||
|
const INPUT_SELECTOR = 'INPUT, SELECT'
|
||||||
|
|
||||||
|
function forEachInput(target, callback){
|
||||||
|
target.querySelectorAll(INPUT_SELECTOR).forEach(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
function forEachGroup(target, callback){
|
||||||
|
target.querySelectorAll(GROUP_SELECTOR).forEach(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
const numeric = {number:1, float:1, int:1, range:1, slider:1}
|
||||||
|
|
||||||
|
function applyRange(inp){
|
||||||
|
let label = inp.previousElementSibling
|
||||||
|
if(label.tagName == 'LABEL'){
|
||||||
|
let info = label.querySelector('I')
|
||||||
|
if(info) info.innerHTML = '('+inp.value+')'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function genParams(defs, target, storedParams={}, callback=undefined, buttons=['reset','save','load','edit','link']){
|
||||||
|
|
||||||
|
let funcs = {
|
||||||
|
group:function({name,type, caption, captions, value, min,max}){
|
||||||
|
return ''
|
||||||
|
},
|
||||||
|
choice:function({name,type, caption, captions, value, values, min, max}){
|
||||||
|
if(!captions) captions = values
|
||||||
|
|
||||||
|
let ret = `<select _type="${type}" name="${name}" numeric="${typeof values[0] == 'number' ? '1':'0'}">`
|
||||||
|
|
||||||
|
for(let i =0; i<values.length; i++){
|
||||||
|
let checked = (value == values[i] || value == captions[i] ) ? 'selected':''
|
||||||
|
ret += `<option value="${values[i]}" ${checked}>${captions[i]}</option>`
|
||||||
|
}
|
||||||
|
return ret + '</select>'
|
||||||
|
},
|
||||||
|
float: inputNumber,
|
||||||
|
range: inputNumber,
|
||||||
|
slider: inputNumber,
|
||||||
|
int: inputNumber,
|
||||||
|
text: inputNumber,
|
||||||
|
url: inputNumber,
|
||||||
|
email: inputNumber,
|
||||||
|
date: inputNumber,
|
||||||
|
password: inputNumber,
|
||||||
|
color: inputNumber,
|
||||||
|
// TODO radio similar options as choice
|
||||||
|
checkbox :function({name,type, caption, captions, value, checked, min,max}){
|
||||||
|
let checkedStr = (value === 'checked' || value === true) ? 'checked':''
|
||||||
|
return `<input type="checkbox" name="${name}" ${checkedStr}/>`
|
||||||
|
},
|
||||||
|
number: inputNumber,
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputNumber(def){
|
||||||
|
let {name,type, caption, captions, value, min,max, step, placeholder, live} = def
|
||||||
|
if(value === null || value === undefined) value = numeric[type] ? 0:'';
|
||||||
|
let inputType = type
|
||||||
|
if(type == 'int' || type=='float') inputType = 'number'
|
||||||
|
if(type == 'range' || type=='slider') inputType = 'range'
|
||||||
|
var str = `<input _type="${type}" type="${inputType}" name="${name}"`
|
||||||
|
if(step !== undefined) str += ` step="${step||''}"`
|
||||||
|
if(min !== undefined) str += ` min="${min||''}"`
|
||||||
|
if(max !== undefined) str += ` max="${max||''}"`
|
||||||
|
if(value !== undefined) str += ` value="${value}"`
|
||||||
|
if(live !== undefined) str += ` live="${live ? 1:0}"`
|
||||||
|
if(placeholder !== undefined) str += ` placeholder="${placeholder}"`
|
||||||
|
return str+'/>';
|
||||||
|
}
|
||||||
|
|
||||||
|
let html = '';
|
||||||
|
let closed = false
|
||||||
|
let missing = {}
|
||||||
|
|
||||||
|
defs.forEach(def=>{
|
||||||
|
let {type, caption, name} = def
|
||||||
|
|
||||||
|
if(storedParams[name] !== undefined){
|
||||||
|
def.value = storedParams[name];
|
||||||
|
}else {
|
||||||
|
def.value = def.initial || def['default'] || def.checked
|
||||||
|
}
|
||||||
|
|
||||||
|
if(type == 'group'){
|
||||||
|
closed = def.value == 'closed'
|
||||||
|
}
|
||||||
|
def.closed = closed
|
||||||
|
|
||||||
|
html +=`<div class="form-line" type="${def.type}" closed="${closed ? 1:0}">`
|
||||||
|
|
||||||
|
html += `<label`
|
||||||
|
if(type == 'group') html += ` name="${name}"`
|
||||||
|
html += `>`
|
||||||
|
if(type == 'checkbox') html += funcs[type](def)
|
||||||
|
html += `${caption}<i></i></label>`
|
||||||
|
|
||||||
|
if(funcs[type] && type != 'checkbox') html += funcs[type](def)
|
||||||
|
|
||||||
|
if(!funcs[type]) missing[type] = 1
|
||||||
|
|
||||||
|
html +='</div>\n'
|
||||||
|
})
|
||||||
|
|
||||||
|
let missingKeys = Object.keys(missing)
|
||||||
|
if(missingKeys.length) console.log('missing param impl',missingKeys);
|
||||||
|
|
||||||
|
function _callback(saveOnly){
|
||||||
|
if(callback) callback(getParams(target))
|
||||||
|
}
|
||||||
|
|
||||||
|
html +='<div class="jscad-param-buttons"><div>'
|
||||||
|
buttons.forEach(b=>{
|
||||||
|
if(typeof b === 'string') b = {id:b, name:b}
|
||||||
|
let {id,name} = b
|
||||||
|
html += `<button action="${id}"><b>${name}</b></button>`
|
||||||
|
})
|
||||||
|
html += '</div></div>'
|
||||||
|
|
||||||
|
target.innerHTML = html
|
||||||
|
|
||||||
|
forEachInput(target, inp=>{
|
||||||
|
let type = inp.type
|
||||||
|
inp.addEventListener('input', function(evt){
|
||||||
|
applyRange(inp)
|
||||||
|
if(inp.getAttribute('live') == '1') _callback();
|
||||||
|
})
|
||||||
|
if(inp.getAttribute('live') != '1') inp.addEventListener('change', _callback)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
function groupClick(evt){
|
||||||
|
var groupDiv = evt.target.parentNode
|
||||||
|
var closed = (groupDiv.getAttribute('closed') == '1') ? '0':'1'
|
||||||
|
var name = evt.target.getAttribute('name')
|
||||||
|
do{
|
||||||
|
groupDiv.setAttribute('closed', closed)
|
||||||
|
groupDiv = groupDiv.nextElementSibling
|
||||||
|
}while(groupDiv && groupDiv.getAttribute('type') != 'group')
|
||||||
|
callback(getParams(target),true)
|
||||||
|
}
|
||||||
|
|
||||||
|
forEachGroup(target, label=>label.onclick=groupClick)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getParams(target){
|
||||||
|
let params = {}
|
||||||
|
if(!target) return params
|
||||||
|
|
||||||
|
forEachGroup(target,elem=>{
|
||||||
|
let name = elem.getAttribute('name')
|
||||||
|
params[name] = (groupDiv.getAttribute('closed') == '1') ? 'closed':''
|
||||||
|
})
|
||||||
|
|
||||||
|
forEachInput(target,elem=>{
|
||||||
|
let name = elem.name
|
||||||
|
let value = elem.value
|
||||||
|
if(elem.tagName == 'INPUT'){
|
||||||
|
if(elem.type == 'checkbox') value = elem.checked
|
||||||
|
if(elem.type == 'range' || elem.type == 'color') applyRange(elem)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(numeric[elem.getAttribute('type')] || elem.getAttribute('numeric') == '1') value = parseFloat(value || 0)
|
||||||
|
params[name] = value
|
||||||
|
})
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -43,13 +43,14 @@ result = (cq.Workplane().circle(diam).extrude(20.0)
|
|||||||
show_object(result)
|
show_object(result)
|
||||||
`,
|
`,
|
||||||
jscad: `
|
jscad: `
|
||||||
|
|
||||||
const { booleans, colors, primitives } = require('@jscad/modeling') // modeling comes from the included MODELING library
|
const { booleans, colors, primitives } = require('@jscad/modeling') // modeling comes from the included MODELING library
|
||||||
|
|
||||||
const { intersect, subtract } = booleans
|
const { intersect, subtract } = booleans
|
||||||
const { colorize } = colors
|
const { colorize } = colors
|
||||||
const { cube, cuboid, line, sphere, star } = primitives
|
const { cube, cuboid, line, sphere, star } = primitives
|
||||||
|
|
||||||
const main = ({scale=1}) => {
|
const main = ({length=1}) => {
|
||||||
const logo = [
|
const logo = [
|
||||||
colorize([1.0, 0.4, 1.0], subtract(
|
colorize([1.0, 0.4, 1.0], subtract(
|
||||||
cube({ size: 300 }),
|
cube({ size: 300 }),
|
||||||
@@ -61,13 +62,18 @@ const main = ({scale=1}) => {
|
|||||||
))
|
))
|
||||||
]
|
]
|
||||||
|
|
||||||
const transpCube = colorize([1, 0, 0, 0.75], cuboid({ size: [100 * scale, 100, 210 + (200 * scale)] }))
|
const transpCube = colorize([1, 0, 0, 0.75], cuboid({ size: [100, 100, length] }))
|
||||||
const star2D = star({ vertices: 8, innerRadius: 150, outerRadius: 200 })
|
const star2D = star({ vertices: 8, innerRadius: 150, outerRadius: 200 })
|
||||||
const line2D = colorize([1.0, 0, 0], line([[220, 220], [-220, 220], [-220, -220], [220, -220], [220, 220]]))
|
const line2D = colorize([1.0, 0, 0], line([[220, 220], [-220, 220], [-220, -220], [220, -220], [220, 220]]))
|
||||||
|
|
||||||
return [transpCube, star2D, line2D, ...logo]
|
return [transpCube, star2D, line2D, ...logo]
|
||||||
}
|
}
|
||||||
module.exports = {main}
|
const getParameterDefinitions = ()=>{
|
||||||
|
return [
|
||||||
|
{type:'slider', name:'length', initial:210, caption:'Length', min:210, max:1500}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
module.exports = {main, getParameterDefinitions}
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,6 +96,7 @@ export interface State {
|
|||||||
data: any
|
data: any
|
||||||
quality: 'low' | 'high'
|
quality: 'low' | 'high'
|
||||||
customizerParams?: any
|
customizerParams?: any
|
||||||
|
lastParameters?: any
|
||||||
}
|
}
|
||||||
layout: any
|
layout: any
|
||||||
camera: {
|
camera: {
|
||||||
@@ -155,6 +162,7 @@ export const useIdeState = (): [State, (actionOrThunk: any) => any] => {
|
|||||||
type: payload.objectData?.type,
|
type: payload.objectData?.type,
|
||||||
data: payload.objectData?.data,
|
data: payload.objectData?.data,
|
||||||
customizerParams: payload.customizerParams,
|
customizerParams: payload.customizerParams,
|
||||||
|
lastParameters: payload.lastParameters,
|
||||||
},
|
},
|
||||||
consoleMessages: payload.message
|
consoleMessages: payload.message
|
||||||
? [...state.consoleMessages, payload.message]
|
? [...state.consoleMessages, payload.message]
|
||||||
@@ -219,6 +227,7 @@ export const useIdeState = (): [State, (actionOrThunk: any) => any] => {
|
|||||||
interface RequestRenderArgs {
|
interface RequestRenderArgs {
|
||||||
state: State
|
state: State
|
||||||
dispatch: any
|
dispatch: any
|
||||||
|
parameters: any,
|
||||||
code: State['code']
|
code: State['code']
|
||||||
camera: State['camera']
|
camera: State['camera']
|
||||||
viewerSize: State['viewerSize']
|
viewerSize: State['viewerSize']
|
||||||
@@ -234,6 +243,7 @@ export const requestRender = ({
|
|||||||
viewerSize,
|
viewerSize,
|
||||||
quality = 'low',
|
quality = 'low',
|
||||||
specialCadProcess = null,
|
specialCadProcess = null,
|
||||||
|
parameters,
|
||||||
}: RequestRenderArgs) => {
|
}: RequestRenderArgs) => {
|
||||||
if (
|
if (
|
||||||
state.ideType !== 'INIT' &&
|
state.ideType !== 'INIT' &&
|
||||||
@@ -244,13 +254,14 @@ export const requestRender = ({
|
|||||||
: cadPackages[state.ideType].render
|
: cadPackages[state.ideType].render
|
||||||
return renderFn({
|
return renderFn({
|
||||||
code,
|
code,
|
||||||
|
parameters,
|
||||||
settings: {
|
settings: {
|
||||||
camera,
|
camera,
|
||||||
viewerSize,
|
viewerSize,
|
||||||
quality,
|
quality,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then(({ objectData, message, status, customizerParams }) => {
|
.then(({ objectData, message, status, customizerParams, lastParameters }) => {
|
||||||
if (status === 'error') {
|
if (status === 'error') {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: 'errorRender',
|
type: 'errorRender',
|
||||||
@@ -264,6 +275,7 @@ export const requestRender = ({
|
|||||||
message,
|
message,
|
||||||
lastRunCode: code,
|
lastRunCode: code,
|
||||||
customizerParams,
|
customizerParams,
|
||||||
|
lastParameters,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
return objectData
|
return objectData
|
||||||
|
|||||||
Reference in New Issue
Block a user