forked from jscad/OpenJSCAD.org
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCSGToStla.js
58 lines (50 loc) · 1.67 KB
/
CSGToStla.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const { geometries } = require('@jscad/modeling')
// objects must be an array of 3D geomertries (with polygons)
const serializeText = (objects, options) => {
options.statusCallback && options.statusCallback({ progress: 0 })
const result = `solid JSCAD
${convertToStl(objects, options)}
endsolid JSCAD
`
options.statusCallback && options.statusCallback({ progress: 100 })
return [result]
}
const convertToStl = (objects, options) => {
const result = []
objects.forEach((object, i) => {
result.push(convertToFacets(object, options))
options.statusCallback && options.statusCallback({ progress: 100 * i / objects.length })
})
return result.join('\n')
}
const convertToFacets = (object, options) => {
const result = []
const polygons = geometries.geom3.toPolygons(object)
polygons.forEach((polygon, i) => {
result.push(convertToFacet(polygon))
})
return result.join('\n')
}
const vector3DtoStlString = (v) => `${v[0]} ${v[1]} ${v[2]}`
const vertextoStlString = (vertex) => `vertex ${vector3DtoStlString(vertex)}`
const convertToFacet = (polygon) => {
const result = []
if (polygon.vertices.length >= 3) {
// STL requires triangular polygons. If our polygon has more vertices, create multiple triangles:
const firstVertexStl = vertextoStlString(polygon.vertices[0])
for (let i = 0; i < polygon.vertices.length - 2; i++) {
const facet = `facet normal ${vector3DtoStlString(geometries.poly3.plane(polygon))}
outer loop
${firstVertexStl}
${vertextoStlString(polygon.vertices[i + 1])}
${vertextoStlString(polygon.vertices[i + 2])}
endloop
endfacet`
result.push(facet)
}
}
return result.join('\n')
}
module.exports = {
serializeText
}