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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # e57-js
2
2
 
3
- Node.js library for reading and writing **E57 point cloud files**.
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};