Create and deploy simple openscad api

A minimal frontend integration has been added to as a POC

resolves #219 and #222
This commit is contained in:
Kurt Hutten
2021-02-25 20:28:59 +11:00
parent 8493838f0c
commit 63c2a79a5d
15 changed files with 1848 additions and 44 deletions

View File

@@ -3,6 +3,10 @@ import { IdeContext } from 'src/components/IdeToolbarNew'
const IdeViewer = () => {
const { state } = useContext(IdeContext)
const image =
state.objectData?.type === 'png' &&
state.objectData?.data &&
window.URL.createObjectURL(state.objectData?.data)
return (
<div className="p-8 border-2 m-2">
<div className="pb-4">hi I'm viewer</div>
@@ -10,8 +14,12 @@ const IdeViewer = () => {
I should be showing an{' '}
<span className="font-mono uppercase">{state.objectData?.type}</span>{' '}
right now with the data{' '}
<span className="font-mono uppercase">{state.objectData?.data}</span>{' '}
</div>
{image && (
<div>
<img src={image} className="" />
</div>
)}
</div>
)
}

View File

@@ -1,34 +1,50 @@
export const render = async ({ code, settings }) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const shouldReject = Math.random() < 0.7
if (shouldReject) {
resolve({
objectData: {
type: 'jpg',
data: ((Math.random() * 256 + 1) >>> 0).toString(2), // Randomized 8-bit numbers for funzies
},
message: {
type: 'message',
message: `bodies rendered by: ${code}`,
},
})
} else {
reject({
message: {
type: 'error',
message: 'unable to parse line: x',
},
})
}
}, 700)
})
}
const openScadBaseURL =
'https://x2wvhihk56.execute-api.us-east-1.amazonaws.com/dev'
export const render = async ({ code, settings }) => {
const response = await fetch(openScadBaseURL + '/render', {
method: 'POST',
headers: new Headers().append('Content-Type', 'application/json'),
body: JSON.stringify({
settings: {
size: {
x: 700,
y: 300,
},
},
file: code,
}),
})
if (response.status === 400) {
const { error } = await response.json()
const cleanedErrorMessage = error.replace(
/["|']\/tmp\/.+\/main.scad["|']/g,
"'main.scad'"
)
return {
isError: true,
message: {
type: 'error',
message: cleanedErrorMessage,
},
}
}
const data = await response.blob()
return {
objectData: {
type: 'png',
data,
},
message: {
type: 'message',
message: 'successful render',
},
}
}
const openScad = {
render,
// more functions to come
}
export default openScad
export default openScad

View File

@@ -8,7 +8,7 @@ export const useIdeState = () => {
{ type: 'error', message: 'line 15 is being very naughty' },
{ type: 'message', message: '5 bodies produced' },
],
code: 'cubie(60);',
code: 'cube(60);sphere(25);',
objectData: {
type: 'stl',
data: 'some binary',
@@ -48,19 +48,21 @@ export const useIdeState = () => {
return ({ type, payload }) => {
switch (type) {
case 'render':
cadPackages[state.ideType].render({ code: payload.code })
.then(({ objectData, message }) =>
dispatch({
type: 'healthyRender',
payload: { objectData, message },
})
)
.catch(({ message }) =>
dispatch({
type: 'errorRender',
payload: { message },
})
)
cadPackages[state.ideType]
.render({ code: payload.code })
.then(({ objectData, message, isError }) => {
if (isError) {
dispatch({
type: 'errorRender',
payload: { message },
})
} else {
dispatch({
type: 'healthyRender',
payload: { objectData, message },
})
}
})
break
default: