format project

This commit is contained in:
Kurt Hutten
2021-08-01 09:55:07 +10:00
parent 625db5e26b
commit d8998a73b3
9 changed files with 215 additions and 180 deletions

View File

@@ -24,7 +24,7 @@
const setPoints = (points, p, i)=>{ const setPoints = (points, p, i)=>{
points[i++] = p[0] points[i++] = p[0]
points[i++] = p[1] points[i++] = p[1]
points[i++] = p[2] || 0 points[i++] = p[2] || 0
} }
function CSG2Vertices(csg){ function CSG2Vertices(csg){
@@ -54,11 +54,11 @@ function CSG2Vertices(csg){
posOffset +=2 posOffset +=2
for(let i=2; i<len; i++){ for(let i=2; i<len; i++){
vertices.set(arr[i], vertOffset) vertices.set(arr[i], vertOffset)
indices[indOffset++] = first indices[indOffset++] = first
indices[indOffset++] = first + i -1 indices[indOffset++] = first + i -1
indices[indOffset++] = first + i indices[indOffset++] = first + i
vertOffset += 3 vertOffset += 3
posOffset += 1 posOffset += 1
} }
@@ -72,22 +72,22 @@ function CSG2LineVertices(csg){
if(csg.isClosed) vLen += 3 if(csg.isClosed) vLen += 3
var vertices = new Float32Array(vLen) var vertices = new Float32Array(vLen)
csg.points.forEach((p,idx)=>setPoints(vertices, p, idx * 3 )) csg.points.forEach((p,idx)=>setPoints(vertices, p, idx * 3 ))
if(csg.isClosed){ if(csg.isClosed){
setPoints(vertices, csg.points[0], vertices.length - 3 ) setPoints(vertices, csg.points[0], vertices.length - 3 )
} }
return {vertices, type:'line'} return {vertices, type:'line'}
} }
function CSG2LineSegmentsVertices(csg){ function CSG2LineSegmentsVertices(csg){
let vLen = csg.sides.length * 6 let vLen = csg.sides.length * 6
var vertices = new Float32Array(vLen) var vertices = new Float32Array(vLen)
csg.sides.forEach((side,idx)=>{ csg.sides.forEach((side,idx)=>{
let i = idx * 6 let i = idx * 6
setPoints(vertices, side[0], i) setPoints(vertices, side[0], i)
setPoints(vertices, side[1], i+3) setPoints(vertices, side[1], i+3)
}) })
@@ -104,14 +104,14 @@ function CSGCached(func, data, cacheKey, transferable){
geo = func(data) geo = func(data)
// fill transferable array for postMessage optimization // fill transferable array for postMessage optimization
if(transferable){ if(transferable){
const {vertices, indices} = geo const {vertices, indices} = geo
transferable.push(vertices) transferable.push(vertices)
if(indices) transferable.push(indices) if(indices) transferable.push(indices)
} }
CSGToBuffers.cache.set(cacheKey, geo) CSGToBuffers.cache.set(cacheKey, geo)
return geo return geo
} }
function CSGToBuffers(csg, transferable){ function CSGToBuffers(csg, transferable){
@@ -159,7 +159,7 @@ function requireModule(url, source){
try { try {
const exports={}; const exports={};
if(!source) source = requireFile(url) if(!source) source = requireFile(url)
const module = { id: url, uri: url, exports:exports, source }; //according to node.js modules const module = { id: url, uri: url, exports:exports, source }; //according to node.js modules
// fix, add comment to show source on Chrome Dev Tools // fix, add comment to show source on Chrome Dev Tools
source="//@ sourceURL="+url+"\n" + source; source="//@ sourceURL="+url+"\n" + source;
//------ //------
@@ -172,7 +172,7 @@ function requireModule(url, source){
} }
} }
require.cache = {} require.cache = {}
require.alias = {} require.alias = {}
@@ -189,7 +189,7 @@ const initCanvas = (canvas, callback)=>{
const cmd = { const cmd = {
worker: 'render', worker: 'render',
dx: lastX - ev.pageX, dx: lastX - ev.pageX,
dy: ev.pageY - lastY dy: ev.pageY - lastY
} }
const shiftKey = (ev.shiftKey === true) || (ev.touches && ev.touches.length > 2) const shiftKey = (ev.shiftKey === true) || (ev.touches && ev.touches.length > 2)
@@ -244,7 +244,6 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
let workerBaseURI, onInit let workerBaseURI, onInit
function runMain(params={}){ function runMain(params={}){
console.log('runMain');
let time = Date.now() let time = Date.now()
let solids let solids
try{ try{
@@ -265,7 +264,7 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
obj.transforms = csg.transforms obj.transforms = csg.transforms
return obj return obj
}) })
}else if(convertToSolids === 'regl'){ }else if(convertToSolids === 'regl'){
const { entitiesFromSolids } = require('@jscad/regl-renderer') const { entitiesFromSolids } = require('@jscad/regl-renderer')
time = Date.now() time = Date.now()
entities = entitiesFromSolids({}, solids) entities = entitiesFromSolids({}, solids)
@@ -281,12 +280,12 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
runScript: ({script,url, params={}})=>{ runScript: ({script,url, params={}})=>{
if(!initialized){ if(!initialized){
onInit = ()=>handlers.runScript({script,url, params}) onInit = ()=>handlers.runScript({script,url, params})
} }
let script_module let script_module
try{ try{
script_module = requireModule(url,script) script_module = requireModule(url,script)
}catch(e){ }catch(e){
callback({action:'entities', worker:'render', error:e.message, stack:e.stack.toString()}) callback({action:'entities', worker:'render', error:e.message, stack:e.stack.toString()})
return return
} }
main = script_module.exports.main main = script_module.exports.main
@@ -304,12 +303,12 @@ const makeScriptWorker = ({callback, convertToSolids})=>{
if(!baseURI && typeof document != 'undefined' && document.baseURI){ if(!baseURI && typeof document != 'undefined' && document.baseURI){
baseURI = document.baseURI baseURI = document.baseURI
} }
if(baseURI) workerBaseURI = baseURI.toString() if(baseURI) workerBaseURI = baseURI.toString()
alias.forEach(arr=>{ alias.forEach(arr=>{
let [orig, ...aliases] = arr let [orig, ...aliases] = arr
aliases.forEach(a=>{ aliases.forEach(a=>{
require.alias[a] = orig require.alias[a] = orig
if(a.toLowerCase().substr(-3)!=='.js') require.alias[a+'.js'] = orig if(a.toLowerCase().substr(-3)!=='.js') require.alias[a+'.js'] = orig
}) })
@@ -392,7 +391,7 @@ let perspectiveCamera
glOptions: {gl} glOptions: {gl}
} }
if(type == 'webgl'){ if(type == 'webgl'){
setupOptions.glOptions.optionalExtensions = ['oes_element_index_uint'] setupOptions.glOptions.optionalExtensions = ['oes_element_index_uint']
} }
renderer = prepareRender(setupOptions) renderer = prepareRender(setupOptions)
@@ -412,7 +411,7 @@ let perspectiveCamera
axisOptions = { axisOptions = {
visuals: { visuals: {
drawCmd: 'drawAxis', drawCmd: 'drawAxis',
show: axis.show || axis.show === undefined show: axis.show || axis.show === undefined
}, },
size: axis.size || 100, size: axis.size || 100,
} }
@@ -492,7 +491,7 @@ let perspectiveCamera
} }
} }
function resize({width,height}){ function resize({width,height}){
state.canvas.width = width state.canvas.width = width
state.canvas.height = height state.canvas.height = height
perspectiveCamera.setProjection(state.camera, state.camera, { width, height }) perspectiveCamera.setProjection(state.camera, state.camera, { width, height })
@@ -504,7 +503,7 @@ let perspectiveCamera
pan: ({dx,dy})=>{ pan: ({dx,dy})=>{
panDelta[0] += dx panDelta[0] += dx
panDelta[1] += dy panDelta[1] += dy
updateView() updateView()
}, },
rotate: ({dx,dy})=>{ rotate: ({dx,dy})=>{
rotateDelta[0] -= dx rotateDelta[0] -= dx
@@ -550,7 +549,7 @@ return (params)=>{
workerBaseURI = baseURI workerBaseURI = baseURI
const sendCmd = (params, transfer)=>{ const sendCmd = (params, transfer)=>{
if(params.worker === 'render') if(params.worker === 'render')
sendToRender(params, transfer) sendToRender(params, transfer)
else if(params.worker === 'script') else if(params.worker === 'script')
scriptWorker.postMessage(params, transfer) scriptWorker.postMessage(params, transfer)
@@ -572,7 +571,7 @@ return (params)=>{
console.log('render in scope: '+scope); console.log('render in scope: '+scope);
renderWorker = makeRenderWorker({callback:sendCmd}) renderWorker = makeRenderWorker({callback:sendCmd})
sendToRender = (params, transfer)=>renderWorker.postMessage(params, transfer) sendToRender = (params, transfer)=>renderWorker.postMessage(params, transfer)
} }
if(scope === 'main'){ if(scope === 'main'){
// let extraScript = renderInWorker ? `,'https://unpkg.com/@jscad/regl-renderer'`:'' // let extraScript = renderInWorker ? `,'https://unpkg.com/@jscad/regl-renderer'`:''
@@ -581,8 +580,8 @@ importScripts(new URL('${scriptUrl}',baseURI))
let worker = jscadWorker({ let worker = jscadWorker({
baseURI: baseURI, baseURI: baseURI,
convertToSolids: ${convertToSolids}, convertToSolids: ${convertToSolids},
scope:'worker', scope:'worker',
callback:(params)=>self.postMessage(params), callback:(params)=>self.postMessage(params),
render:${renderInWorker} render:${renderInWorker}
}) })
self.addEventListener('message', (e)=>worker.postMessage(e.data)) self.addEventListener('message', (e)=>worker.postMessage(e.data))
@@ -602,7 +601,7 @@ self.addEventListener('message', (e)=>worker.postMessage(e.data))
callback({action:'workerInit',worker:'main'}) callback({action:'workerInit',worker:'main'})
} }
if(canvas){ if(canvas){
// redirect 'render' messages to renderWorker // redirect 'render' messages to renderWorker
sendToRender = (params, transfer)=>renderWorker.postMessage(params, transfer) sendToRender = (params, transfer)=>renderWorker.postMessage(params, transfer)
let width = canvas.width = canvas.clientWidth let width = canvas.width = canvas.clientWidth
@@ -613,7 +612,7 @@ self.addEventListener('message', (e)=>worker.postMessage(e.data))
} }
} }
return { return {
updateSize, updateSize,
updateParams:({params={}})=>sendCmd({ action:'updateParams', worker:'script', params}), updateParams:({params={}})=>sendCmd({ action:'updateParams', worker:'script', params}),
runScript: ({script,url=''})=>sendCmd({ action:'runScript', worker:'script', script, url}), runScript: ({script,url=''})=>sendCmd({ action:'runScript', worker:'script', script, url}),

View File

@@ -59,7 +59,7 @@ export const makeStlDownloadHandler =
(quality === 'high' || ideType === 'openscad') (quality === 'high' || ideType === 'openscad')
) { ) {
saveFile(makeStlBlobFromGeo(geometry)) saveFile(makeStlBlobFromGeo(geometry))
} else if(ideType == 'jscad') { } else if (ideType == 'jscad') {
saveFile(makeStlBlobFromMesh(geometry)) saveFile(makeStlBlobFromMesh(geometry))
} else { } else {
thunkDispatch((dispatch, getState) => { thunkDispatch((dispatch, getState) => {

View File

@@ -14,7 +14,7 @@ const IdeEditor = ({ Loading }) => {
const [theme, setTheme] = useState('vs-dark') const [theme, setTheme] = useState('vs-dark')
const saveCode = useSaveCode() const saveCode = useSaveCode()
const ideTypeToLanguageMap: {[key in CadPackageType]: string} = { const ideTypeToLanguageMap: { [key in CadPackageType]: string } = {
cadquery: 'python', cadquery: 'python',
openscad: 'cpp', openscad: 'cpp',
jscad: 'javascript', jscad: 'javascript',

View File

@@ -25,18 +25,18 @@ function Asset({ geometry: incomingGeo }) {
}, [incomingGeo]) }, [incomingGeo])
if (!incomingGeo) return null if (!incomingGeo) return null
let groupData = incomingGeo.children ? incomingGeo : null const groupData = incomingGeo.children ? incomingGeo : null
if(lastGroup && lastGroup != groupData){ if (lastGroup && lastGroup != groupData) {
state.scene.remove(lastGroup) state.scene.remove(lastGroup)
lastGroup.children.forEach(c=>c?.geometry?.dispose()) lastGroup.children.forEach((c) => c?.geometry?.dispose())
// returning <primitive object={groupData} /> does not add the new group to the scene // returning <primitive object={groupData} /> does not add the new group to the scene
// there is probably some useRef magic that would make this work, but I don't have time to reseach it // there is probably some useRef magic that would make this work, but I don't have time to reseach it
/// FIXME - do this properly with useRef or other react magic /// FIXME - do this properly with useRef or other react magic
if(groupData) state.scene.add(groupData) if (groupData) state.scene.add(groupData)
} }
lastGroup = groupData lastGroup = groupData
if(groupData) return <primitive object={groupData} /> if (groupData) return <primitive object={groupData} />
if (incomingGeo.children) return <primitive object={incomingGeo} /> if (incomingGeo.children) return <primitive object={incomingGeo} />

View File

@@ -3,7 +3,6 @@ import Svg from 'src/components/Svg/Svg'
import { Popover } from '@headlessui/react' import { Popover } from '@headlessui/react'
import type { CadPackage } from 'src/helpers/hooks/useIdeState' import type { CadPackage } from 'src/helpers/hooks/useIdeState'
const menuOptions: { const menuOptions: {
name: string name: string
sub: string sub: string

View File

@@ -1,106 +1,109 @@
const setPoints = (points, p, i)=>{ const setPoints = (points, p, i) => {
points[i++] = p[0] points[i++] = p[0]
points[i++] = p[1] points[i++] = p[1]
points[i++] = p[2] || 0 points[i++] = p[2] || 0
} }
function CSG2Vertices(csg){ function CSG2Vertices(csg) {
let idx = 0 let idx = 0
let vLen = 0, iLen = 0 let vLen = 0,
for (let poly of csg.polygons){ iLen = 0
let len = poly.vertices.length for (let poly of csg.polygons) {
vLen += len *3 let len = poly.vertices.length
iLen += 3 * (len-2) vLen += len * 3
iLen += 3 * (len - 2)
}
const vertices = new Float32Array(vLen)
const indices = vLen > 65535 ? new Uint32Array(iLen) : new Uint16Array(iLen)
let vertOffset = 0
let indOffset = 0
let posOffset = 0
let first = 0
for (let poly of csg.polygons) {
let arr = poly.vertices
let len = arr.length
first = posOffset
vertices.set(arr[0], vertOffset)
vertOffset += 3
vertices.set(arr[1], vertOffset)
vertOffset += 3
posOffset += 2
for (let i = 2; i < len; i++) {
vertices.set(arr[i], vertOffset)
indices[indOffset++] = first
indices[indOffset++] = first + i - 1
indices[indOffset++] = first + i
vertOffset += 3
posOffset += 1
} }
const vertices = new Float32Array(vLen) }
const indices = vLen > 65535 ? new Uint32Array(iLen) : new Uint16Array(iLen) return { vertices, indices, type: 'mesh' }
let vertOffset = 0
let indOffset = 0
let posOffset = 0
let first = 0
for (let poly of csg.polygons){
let arr = poly.vertices
let len = arr.length
first = posOffset
vertices.set(arr[0], vertOffset)
vertOffset +=3
vertices.set(arr[1], vertOffset)
vertOffset +=3
posOffset +=2
for(let i=2; i<len; i++){
vertices.set(arr[i], vertOffset)
indices[indOffset++] = first
indices[indOffset++] = first + i -1
indices[indOffset++] = first + i
vertOffset += 3
posOffset += 1
}
}
return {vertices, indices, type:'mesh'}
} }
function CSG2LineVertices(csg) {
let vLen = csg.points.length * 3
if (csg.isClosed) vLen += 3
function CSG2LineVertices(csg){ var vertices = new Float32Array(vLen)
let vLen = csg.points.length * 3
if(csg.isClosed) vLen += 3
var vertices = new Float32Array(vLen) csg.points.forEach((p, idx) => setPoints(vertices, p, idx * 3))
csg.points.forEach((p,idx)=>setPoints(vertices, p, idx * 3 ))
if(csg.isClosed){
setPoints(vertices, csg.points[0], vertices.length - 3 )
}
return {vertices, type:'line'}
}
function CSG2LineSegmentsVertices(csg){
let vLen = csg.sides.length * 6
var vertices = new Float32Array(vLen)
csg.sides.forEach((side,idx)=>{
let i = idx * 6
setPoints(vertices, side[0], i)
setPoints(vertices, side[1], i+3)
})
return {vertices, type:'lines'}
if (csg.isClosed) {
setPoints(vertices, csg.points[0], vertices.length - 3)
}
return { vertices, type: 'line' }
} }
function CSGCached(func, data, cacheKey, transferable){ function CSG2LineSegmentsVertices(csg) {
cacheKey = cacheKey || data let vLen = csg.sides.length * 6
let geo = CSGToBuffers.cache.get(cacheKey) var vertices = new Float32Array(vLen)
if(geo) return geo csg.sides.forEach((side, idx) => {
let i = idx * 6
geo = func(data) setPoints(vertices, side[0], i)
setPoints(vertices, side[1], i + 3)
// fill transferable array for postMessage optimization })
if(transferable){ return { vertices, type: 'lines' }
const {vertices, indices} = geo
transferable.push(vertices)
if(indices) transferable.push(indices)
}
CSGToBuffers.cache.set(cacheKey, geo)
return geo
} }
function CSGToBuffers(csg, transferable){ function CSGCached(func, data, cacheKey, transferable) {
let obj cacheKey = cacheKey || data
if(csg.polygons) obj = CSGCached(CSG2Vertices,csg,csg.polygons, transferable) let geo = CSGToBuffers.cache.get(cacheKey)
if(csg.sides && !csg.points) obj = CSGCached(CSG2LineSegmentsVertices,csg,csg.sides, transferable) if (geo) return geo
if(csg.points) obj = CSGCached(CSG2LineVertices,csg,csg.points, transferable)
return obj geo = func(data)
// fill transferable array for postMessage optimization
if (transferable) {
const { vertices, indices } = geo
transferable.push(vertices)
if (indices) transferable.push(indices)
}
CSGToBuffers.cache.set(cacheKey, geo)
return geo
}
function CSGToBuffers(csg, transferable) {
let obj
if (csg.polygons)
obj = CSGCached(CSG2Vertices, csg, csg.polygons, transferable)
if (csg.sides && !csg.points)
obj = CSGCached(CSG2LineSegmentsVertices, csg, csg.sides, transferable)
if (csg.points)
obj = CSGCached(CSG2LineVertices, csg, csg.points, transferable)
return obj
}
CSGToBuffers.clearCache = () => {
CSGToBuffers.cache = new WeakMap()
} }
CSGToBuffers.clearCache = ()=>{CSGToBuffers.cache = new WeakMap()}
CSGToBuffers.clearCache() CSGToBuffers.clearCache()
export {CSGToBuffers} export { CSGToBuffers }

View File

@@ -5,7 +5,7 @@ import openscad from './openScadController'
import cadquery from './cadQueryController' import cadquery from './cadQueryController'
import jscad from './jsCadController' import jscad from './jsCadController'
export const cadPackages: {[key in CadPackage]: DefaultKernelExport} = { export const cadPackages: { [key in CadPackage]: DefaultKernelExport } = {
openscad, openscad,
cadquery, cadquery,
jscad, jscad,

View File

@@ -1,46 +1,73 @@
import { RenderArgs, DefaultKernelExport, createUnhealthyResponse, createHealthyResponse } from './common' import {
import { MeshPhongMaterial, LineBasicMaterial, BufferGeometry , BufferAttribute, Line, LineSegments, Color, Mesh, Group} from 'three/build/three.module' RenderArgs,
DefaultKernelExport,
createUnhealthyResponse,
createHealthyResponse,
} from './common'
import {
MeshPhongMaterial,
LineBasicMaterial,
BufferGeometry,
BufferAttribute,
Line,
LineSegments,
Color,
Mesh,
Group,
} from 'three/build/three.module'
const materials = { const materials = {
mesh: { mesh: {
def: new MeshPhongMaterial( { color: 0x0084d1, flatShading: true } ), def: new MeshPhongMaterial({ color: 0x0084d1, flatShading: true }),
material: (params)=>new MeshPhongMaterial(params), material: (params) => new MeshPhongMaterial(params),
}, },
line: { line: {
def: new LineBasicMaterial( { color: 0x0000ff } ), def: new LineBasicMaterial({ color: 0x0000ff }),
material: ({color,opacity,transparent})=>new LineBasicMaterial({color,opacity,transparent}), material: ({ color, opacity, transparent }) =>
}, new LineBasicMaterial({ color, opacity, transparent }),
lines:null },
lines: null,
} }
materials.lines = materials.line materials.lines = materials.line
function CSG2Object3D(obj){ function CSG2Object3D(obj) {
const {vertices, indices, color, transforms} = obj const { vertices, indices, color, transforms } = obj
let materialDef = materials[obj.type] const materialDef = materials[obj.type]
if(!materialDef){ if (!materialDef) {
console.error('Can not hangle object type: '+obj.type, obj) console.error('Can not hangle object type: ' + obj.type, obj)
return null return null
} }
let material = materialDef.def let material = materialDef.def
if(color){ if (color) {
let c = color const c = color
material = new materialDef.material({ color: new Color(c[0],c[1],c[2]), flatShading: true, opacity: c[3] === void 0 ? 1:c[3], transparent: c[3] != 1 && c[3] !== void 0}) material = new materialDef.material({
} color: new Color(c[0], c[1], c[2]),
flatShading: true,
opacity: c[3] === void 0 ? 1 : c[3],
transparent: c[3] != 1 && c[3] !== void 0,
})
}
var geo = new BufferGeometry() const geo = new BufferGeometry()
geo.setAttribute('position', new BufferAttribute(vertices,3)) geo.setAttribute('position', new BufferAttribute(vertices, 3))
var mesh; let mesh
switch(obj.type){ switch (obj.type) {
case 'mesh': geo.setIndex(new BufferAttribute(indices,1)); mesh = new THREE.Mesh(geo, material); break; case 'mesh':
case 'line': mesh = new Line(geo, material); break; geo.setIndex(new BufferAttribute(indices, 1))
case 'lines': mesh = new LineSegments(geo, material); break; mesh = new THREE.Mesh(geo, material)
} break
if(transforms) mesh.applyMatrix4({elements:transforms}) case 'line':
return mesh mesh = new Line(geo, material)
break
case 'lines':
mesh = new LineSegments(geo, material)
break
}
if (transforms) mesh.applyMatrix4({ elements: transforms })
return mesh
} }
let scriptWorker let scriptWorker
@@ -48,8 +75,8 @@ const scriptUrl = '/demo-worker.js'
let resolveReference = null let resolveReference = null
let response = null let response = null
const callResolve = ()=>{ const callResolve = () => {
if(resolveReference) resolveReference() if (resolveReference) resolveReference()
resolveReference resolveReference
} }
@@ -57,10 +84,9 @@ export const render: DefaultKernelExport['render'] = async ({
code, code,
settings, settings,
}: RenderArgs) => { }: RenderArgs) => {
if (!scriptWorker) {
if(!scriptWorker){
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,
@@ -70,18 +96,21 @@ let worker = jscadWorker({
}) })
self.addEventListener('message', (e)=>worker.postMessage(e.data)) self.addEventListener('message', (e)=>worker.postMessage(e.data))
` `
let 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))
scriptWorker.addEventListener('message',(e)=>{ scriptWorker.addEventListener('message', (e) => {
console.log('message from worker', e.data) console.log('message from worker', e.data)
let data = e.data const data = e.data
if(data.action == 'entities'){ if (data.action == 'entities') {
if(data.error){ if (data.error) {
response = createUnhealthyResponse( new Date(),data.error ) response = createUnhealthyResponse(new Date(), data.error)
}else{ } else {
let group = new Group() const group = new Group()
data.entities.map(CSG2Object3D).filter(o=>o).forEach(o=>group.add(o)) data.entities
response = createHealthyResponse( { .map(CSG2Object3D)
.filter((o) => o)
.forEach((o) => group.add(o))
response = createHealthyResponse({
type: 'geometry', type: 'geometry',
data: group, data: group,
consoleMessage: data.scriptStats, consoleMessage: data.scriptStats,
@@ -94,11 +123,16 @@ self.addEventListener('message', (e)=>worker.postMessage(e.data))
callResolve() callResolve()
response = null response = null
scriptWorker.postMessage({action:'init', baseURI, alias:[]}) scriptWorker.postMessage({ action: 'init', baseURI, alias: [] })
} }
scriptWorker.postMessage({action:'runScript', worker:'script', script:code, url:'jscad_script' }) scriptWorker.postMessage({
action: 'runScript',
worker: 'script',
script: code,
url: 'jscad_script',
})
let waitResult = new Promise(resolve=>{ const waitResult = new Promise((resolve) => {
resolveReference = resolve resolveReference = resolve
}) })

View File

@@ -11,7 +11,7 @@ function withThunk(dispatch, getState) {
export type CadPackage = 'openscad' | 'cadquery' | 'jscad' export type CadPackage = 'openscad' | 'cadquery' | 'jscad'
const initCodeMap: {[key in CadPackage]: string} = { const initCodeMap: { [key in CadPackage]: string } = {
openscad: `// involute donut openscad: `// involute donut
// ^ first comment is used for download title (i.e "involute-donut.stl") // ^ first comment is used for download title (i.e "involute-donut.stl")
@@ -42,7 +42,7 @@ 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
@@ -68,7 +68,7 @@ const main = ({scale=1}) => {
return [transpCube, star2D, line2D, ...logo] return [transpCube, star2D, line2D, ...logo]
} }
module.exports = {main} module.exports = {main}
` `,
} }
const codeStorageKey = 'Last-editor-code' const codeStorageKey = 'Last-editor-code'