e57-js 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -3
- package/dist/index.browser.mjs +1 -0
- package/dist/index.mjs +19 -18
- package/dist/libe57-js.js +416 -7
- package/dist/libe57-js.wasm +0 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# e57-js
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
JavaScript library for reading and writing **E57 point cloud files**, compatible with **Node.js** and the **browser**.
|
|
4
4
|
|
|
5
5
|
> **What is a point cloud?** A point cloud is a collection of 3D points in space, typically captured by a laser scanner (LiDAR). Each point has X, Y, Z coordinates and optionally colour, intensity, and other data. E57 is the standard file format for storing them.
|
|
6
6
|
|
|
@@ -12,7 +12,9 @@ Node.js library for reading and writing **E57 point cloud files**.
|
|
|
12
12
|
npm install e57-js
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
Requires **Node.js 18 or higher
|
|
15
|
+
Requires **Node.js 18 or higher**, or any modern browser with WebAssembly support.
|
|
16
|
+
|
|
17
|
+
In the browser, file-system access is not available — use `E57Reader.FromBuffer(buffer)` to read from a `Uint8Array` and `E57Writer.ToBuffer()` to write to one.
|
|
16
18
|
|
|
17
19
|
---
|
|
18
20
|
|
|
@@ -35,8 +37,12 @@ await E57.Init()
|
|
|
35
37
|
### Open the file
|
|
36
38
|
|
|
37
39
|
```js
|
|
40
|
+
// From a file path (Node.js)
|
|
38
41
|
const reader = new E57Reader('scan.e57')
|
|
39
42
|
|
|
43
|
+
// From a buffer (browser or Node.js)
|
|
44
|
+
const reader = E57Reader.FromBuffer(buffer) // buffer is a Uint8Array
|
|
45
|
+
|
|
40
46
|
console.log(reader.GetData3DCount()) // number of 3D scans
|
|
41
47
|
console.log(reader.GetImage2DCount()) // number of embedded images
|
|
42
48
|
```
|
|
@@ -105,6 +111,8 @@ const points = scan.ReadScanSync()
|
|
|
105
111
|
const bytes = image.ReadImageSync()
|
|
106
112
|
```
|
|
107
113
|
|
|
114
|
+
> **Exception:** `AddImage` has no sync version.
|
|
115
|
+
|
|
108
116
|
---
|
|
109
117
|
|
|
110
118
|
## Writing a file
|
|
@@ -112,7 +120,11 @@ const bytes = image.ReadImageSync()
|
|
|
112
120
|
### Create the file
|
|
113
121
|
|
|
114
122
|
```js
|
|
123
|
+
// To a file path (Node.js)
|
|
115
124
|
const writer = new E57Writer('output.e57')
|
|
125
|
+
|
|
126
|
+
// To a buffer (browser or Node.js) — Close() returns a Uint8Array
|
|
127
|
+
const writer = E57Writer.ToBuffer()
|
|
116
128
|
```
|
|
117
129
|
|
|
118
130
|
### Write a 3D scan
|
|
@@ -179,6 +191,7 @@ header.pose.translation.z = 1.5 // 1.5 m above ground
|
|
|
179
191
|
```js
|
|
180
192
|
import { E57WriterImage } from 'e57-js'
|
|
181
193
|
|
|
194
|
+
// From a file path (Node.js)
|
|
182
195
|
const image = new E57WriterImage(
|
|
183
196
|
'photo.jpg',
|
|
184
197
|
E57.LibE57.Image2DType.ImageJPEG,
|
|
@@ -189,12 +202,26 @@ image.setName('Front camera')
|
|
|
189
202
|
await writer.AddImage(image)
|
|
190
203
|
```
|
|
191
204
|
|
|
205
|
+
In the browser, use `E57WriterImage.FromBuffer` instead:
|
|
206
|
+
|
|
207
|
+
```js
|
|
208
|
+
// From a Uint8Array (browser or Node.js)
|
|
209
|
+
const image = E57WriterImage.FromBuffer(
|
|
210
|
+
buffer, // Uint8Array
|
|
211
|
+
E57.LibE57.Image2DType.ImageJPEG,
|
|
212
|
+
E57.LibE57.Image2DProjection.ProjectionVisual
|
|
213
|
+
)
|
|
214
|
+
image.setName('Front camera')
|
|
215
|
+
|
|
216
|
+
await writer.AddImage(image)
|
|
217
|
+
```
|
|
218
|
+
|
|
192
219
|
### Close the file
|
|
193
220
|
|
|
194
221
|
Always call `Close()` when you are done. This finalises the file — skipping it will produce a corrupt file.
|
|
195
222
|
|
|
196
223
|
```js
|
|
197
|
-
writer.Close()
|
|
224
|
+
writer.Close() // returns a Uint8Array only when the writer was created with E57Writer.ToBuffer()
|
|
198
225
|
```
|
|
199
226
|
|
|
200
227
|
---
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import _ from"./libe57-js.js";var s=class a{static LibE57=null;static RootDir="/root ";static Init(){let e=typeof window<"u";return a.LibE57!==null?Promise.resolve():_().then(function(t){e||(t.FS.mkdir(a.RootDir),t.FS.mount(t.FS.filesystems.NODEFS,{root:"/"},a.RootDir)),a.LibE57=t})}};var h=()=>{throw new Error("path is not available in the browser")};var d=()=>{throw new Error("fs is not available in the browser")};var m=class{constructor(e,t){this.e57Reader=e,this.scanIdx=t}GetHeader(){return this.e57Reader.GetData3DHeader(this.scanIdx)}ReadScan(e=!0){var t=this.GetHeader(),r=t.pointCount;return this.ReadPoints(r,e)}ReadScanSync(e=!0){let t=Number(this.GetHeader().pointCount);return this.ReadPointsSync(t,e)}ReadPoints(e,t=!0){return this.e57Reader.ReadScan(this.scanIdx,e,t)}ReadPointsSync(e,t=!0){return this.e57Reader.ReadScanSync(this.scanIdx,e,t)}ScanPoints(e,t,r=!0){let i=Number(this.GetHeader().pointCount),n=Math.ceil(i/e);if(t){for(let o=0;o<n;o++)t(this.ReadPointsSync(e,r));return}let u=[];for(let o=0;o<n;o++)u.push(this.ReadPointsSync(e,r));return u}},g=class{constructor(e,t){this._e57Reader=e,this._imageIdx=t}GetHeader(){return this._e57Reader.GetImage2DHeader(this._imageIdx)}ReadImage(){return this._e57Reader.ReadImage(this._imageIdx)}ReadImageSync(){return this._e57Reader.ReadImageSync(this._imageIdx)}ToBase64(){return this.ReadImage().then(e=>Buffer.from(e).toString("base64"))}Extension(){switch(this.GetHeader().imageType){case s.LibE57.Image2DType.ImageJPEG:return".jpeg";case s.LibE57.Image2DType.ImagePNG:return".png";case s.LibE57.Image2DType.ImageMaskPNG:return".png";case s.LibE57.Image2DType.E57_JPEG_IMAGE:return".jpeg";case s.LibE57.Image2DType.E57_PNG_IMAGE:return".png";case s.LibE57.Image2DType.E57_PNG_IMAGE_MASK:return".png";default:return".jpg"}}Save(e){if(typeof window<"u")throw new Error("Save() is not available in the browser \u2014 use ReadImage() to get a Uint8Array instead");let t=this.Extension(),r=e.replace(h.extname(e),t);return this.ReadImage().then(i=>d.writeFile(r,i,n=>{if(n)throw n}))}},c=class a{constructor(e,t=!1){let r=t?e:h.join(s.RootDir,h.resolve(e));this.reader=new s.LibE57.E57Reader(r);var i=this.GetData3DCount();this.scans=new Array(i);for(var n=0;n<i;n++)this.scans[n]=new m(this.reader,n);var u=this.GetImage2DCount();this.images=new Array(u);for(var o=0;o<u;o++)this.images[o]=new g(this.reader,o)}static FromBuffer(e){let t="/input.e57";return s.LibE57.FS.writeFile(t,e),console.log("Done "),new a(t,!0)}GetHeader(){return this.reader.GetHeader()}GetData3DCount(){return Number(this.reader.GetData3DCount())}GetImage2DCount(){return Number(this.reader.GetImage2DCount())}GetScan(e){return this.scans[e]}GetImage(e){return this.images[e]}Close(){this.reader.Close()}};var f=()=>{throw new Error("sharp is not available in the browser")};var l=class a{constructor(e,t,r){this._imgPath=e,this._imgType=t,this._imgProjection=r,this._imageHeader=new s.LibE57.ImageHeader}static FromBuffer(e,t,r){let i=new a(null,t,r);return i._buffer=e,i._width=null,i._height=null,i}getPath(){return this._imgPath}setPath(e){this._imgPath=e}getType(){return this._imgType}setType(e){this._imgType=e}getProjection(){return this._imgProjection}setProjection(e){this._imgProjection=e}_resolveMetadata(){return this._width!=null&&this._height!=null?Promise.resolve({width:this._width,height:this._height}):this._metadataPromise?this._metadataPromise:(typeof window<"u"?this._metadataPromise=this.getBuffer().then(e=>{let t=new Blob([e]);return createImageBitmap(t).then(r=>{let i={width:r.width,height:r.height};return r.close(),this._width=i.width,this._height=i.height,i})}):this._metadataPromise=this.getBuffer().then(e=>f(e).metadata()).then(e=>(this._width=e.width,this._height=e.height,e)),this._metadataPromise)}getMetadata(){return this._resolveMetadata()}getDimensions(){return this._resolveMetadata().then(e=>[e.width,e.height])}getWidth(){return this._resolveMetadata().then(e=>e.width)}getHeight(){return this._resolveMetadata().then(e=>e.height)}getPose(){return this._imageHeader.pose}setPose(e){this._imageHeader.pose=e}getName(){return this._imageHeader.name}setName(e){this._imageHeader.name=e}getGuid(){return this._imageHeader.guid}setGuid(e){this._imageHeader.guid=e}getHeader(){return this._imageHeader}setHeader(e){this._imageHeader=e}getBufferSync(){return this._buffer?this._buffer:new Uint8Array(d.readFileSync(this.getPath()))}getBuffer(){return this._buffer?Promise.resolve(this._buffer):d.promises.readFile(this.getPath()).then(e=>new Uint8Array(e))}setTrasnlation(e,t,r){this._imageHeader.pose.translation.x=e,this._imageHeader.pose.translation.y=t,this._imageHeader.pose.translation.z=r}setRotation(e,t,r,i){this._imageHeader.pose.rotation.w=e,this._imageHeader.pose.rotation.x=t,this._imageHeader.pose.rotation.y=r,this._imageHeader.pose.rotation.z=i}},p=class a{constructor(e,t=!1){let r=crypto.randomUUID();this._bufferFileMemFSFilePath="/"+r+".e57";let i=t?this._bufferFileMemFSFilePath:h.join(s.RootDir,h.resolve(e));this.writer=new s.LibE57.E57Writer(i),this._toBuffer=t}static ToBuffer(){return new a("",!0)}AddImage(e){return Promise.all([e.getBuffer(),e.getMetadata()]).then(([t,r])=>this.writer.AddImage(e.getHeader(),e.getType(),e.getProjection(),0,t,t.length,r.width,r.height).then(Number))}AddScanSync(e,t){return Number(this.writer.AddScanSync(e,t))}AddScan(e,t){return this.writer.AddScan(e,t).then(Number)}Close(){if(this.writer.Close(),this._toBuffer)return s.LibE57.FS.readFile(this._bufferFileMemFSFilePath)}};export{s as E57,c as E57Reader,g as E57ReaderImage,m as E57ReaderScan,p as E57Writer,l as E57WriterImage};
|