SaveProject.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. function createPointcloudData(pointcloud) {
  2. let material = pointcloud.material;
  3. let ranges = [];
  4. for(let [name, value] of material.ranges){
  5. ranges.push({
  6. name: name,
  7. value: value,
  8. });
  9. }
  10. if(typeof material.elevationRange[0] === "number"){
  11. ranges.push({
  12. name: "elevationRange",
  13. value: material.elevationRange,
  14. });
  15. }
  16. if(typeof material.intensityRange[0] === "number"){
  17. ranges.push({
  18. name: "intensityRange",
  19. value: material.intensityRange,
  20. });
  21. }
  22. let pointSizeTypeName = Object.entries(Potree.PointSizeType).find(e => e[1] === material.pointSizeType)[0];
  23. let jsonMaterial = {
  24. activeAttributeName: material.activeAttributeName,
  25. ranges: ranges,
  26. size: material.size,
  27. minSize: material.minSize,
  28. pointSizeType: pointSizeTypeName,
  29. matcap: material.matcap,
  30. };
  31. const pcdata = {
  32. name: pointcloud.name,
  33. url: pointcloud.pcoGeometry.url,
  34. position: pointcloud.position.toArray(),
  35. rotation: pointcloud.rotation.toArray(),
  36. scale: pointcloud.scale.toArray(),
  37. material: jsonMaterial,
  38. };
  39. return pcdata;
  40. }
  41. function createProfileData(profile){
  42. const data = {
  43. uuid: profile.uuid,
  44. name: profile.name,
  45. points: profile.points.map(p => p.toArray()),
  46. height: profile.height,
  47. width: profile.width,
  48. };
  49. return data;
  50. }
  51. function createVolumeData(volume){
  52. const data = {
  53. uuid: volume.uuid,
  54. type: volume.constructor.name,
  55. name: volume.name,
  56. position: volume.position.toArray(),
  57. rotation: volume.rotation.toArray(),
  58. scale: volume.scale.toArray(),
  59. visible: volume.visible,
  60. clip: volume.clip,
  61. };
  62. return data;
  63. }
  64. function createCameraAnimationData(animation){
  65. const controlPoints = animation.controlPoints.map( cp => {
  66. const cpdata = {
  67. position: cp.position.toArray(),
  68. target: cp.target.toArray(),
  69. };
  70. return cpdata;
  71. });
  72. const data = {
  73. uuid: animation.uuid,
  74. name: animation.name,
  75. duration: animation.duration,
  76. t: animation.t,
  77. curveType: animation.curveType,
  78. visible: animation.visible,
  79. controlPoints: controlPoints,
  80. };
  81. return data;
  82. }
  83. function createMeasurementData(measurement){
  84. const data = {
  85. uuid: measurement.uuid,
  86. name: measurement.name,
  87. points: measurement.points.map(p => p.position.toArray()),
  88. showDistances: measurement.showDistances,
  89. showCoordinates: measurement.showCoordinates,
  90. showArea: measurement.showArea,
  91. closed: measurement.closed,
  92. showAngles: measurement.showAngles,
  93. showHeight: measurement.showHeight,
  94. showCircle: measurement.showCircle,
  95. showAzimuth: measurement.showAzimuth,
  96. showEdges: measurement.showEdges,
  97. color: measurement.color.toArray(),
  98. };
  99. return data;
  100. }
  101. function createOrientedImagesData(images){
  102. const data = {
  103. cameraParamsPath: images.cameraParamsPath,
  104. imageParamsPath: images.imageParamsPath,
  105. };
  106. return data;
  107. }
  108. function createGeopackageData(geopackage){
  109. const data = {
  110. path: geopackage.path,
  111. };
  112. return data;
  113. }
  114. function createAnnotationData(annotation){
  115. const data = {
  116. uuid: annotation.uuid,
  117. title: annotation.title.toString(),
  118. description: annotation.description,
  119. position: annotation.position.toArray(),
  120. offset: annotation.offset.toArray(),
  121. children: [],
  122. };
  123. if(annotation.cameraPosition){
  124. data.cameraPosition = annotation.cameraPosition.toArray();
  125. }
  126. if(annotation.cameraTarget){
  127. data.cameraTarget = annotation.cameraTarget.toArray();
  128. }
  129. if(typeof annotation.radius !== "undefined"){
  130. data.radius = annotation.radius;
  131. }
  132. return data;
  133. }
  134. function createAnnotationsData(viewer){
  135. const map = new Map();
  136. viewer.scene.annotations.traverseDescendants(a => {
  137. const aData = createAnnotationData(a);
  138. map.set(a, aData);
  139. });
  140. for(const [annotation, data] of map){
  141. for(const child of annotation.children){
  142. const childData = map.get(child);
  143. data.children.push(childData);
  144. }
  145. }
  146. const annotations = viewer.scene.annotations.children.map(a => map.get(a));
  147. return annotations;
  148. }
  149. function createSettingsData(viewer){
  150. return {
  151. pointBudget: viewer.getPointBudget(),
  152. fov: viewer.getFOV(),
  153. edlEnabled: viewer.getEDLEnabled(),
  154. edlRadius: viewer.getEDLRadius(),
  155. edlStrength: viewer.getEDLStrength(),
  156. background: viewer.getBackground(),
  157. minNodeSize: viewer.getMinNodeSize(),
  158. showBoundingBoxes: viewer.getShowBoundingBox(),
  159. };
  160. }
  161. function createSceneContentData(viewer){
  162. const data = [];
  163. const potreeObjects = [];
  164. viewer.scene.scene.traverse(node => {
  165. if(node.potree){
  166. potreeObjects.push(node);
  167. }
  168. });
  169. for(const object of potreeObjects){
  170. if(object.potree.file){
  171. const saveObject = {
  172. file: object.potree.file,
  173. };
  174. data.push(saveObject);
  175. }
  176. }
  177. return data;
  178. }
  179. function createViewData(viewer){
  180. const view = viewer.scene.view;
  181. const data = {
  182. position: view.position.toArray(),
  183. target: view.getPivot().toArray(),
  184. };
  185. return data;
  186. }
  187. function createClassificationData(viewer){
  188. const classifications = viewer.classifications;
  189. const data = classifications;
  190. return data;
  191. }
  192. export function saveProject(viewer) {
  193. const scene = viewer.scene;
  194. const data = {
  195. type: "Potree",
  196. version: 1.7,
  197. settings: createSettingsData(viewer),
  198. view: createViewData(viewer),
  199. classification: createClassificationData(viewer),
  200. pointclouds: scene.pointclouds.map(createPointcloudData),
  201. measurements: scene.measurements.map(createMeasurementData),
  202. volumes: scene.volumes.map(createVolumeData),
  203. cameraAnimations: scene.cameraAnimations.map(createCameraAnimationData),
  204. profiles: scene.profiles.map(createProfileData),
  205. annotations: createAnnotationsData(viewer),
  206. orientedImages: scene.orientedImages.map(createOrientedImagesData),
  207. geopackages: scene.geopackages.map(createGeopackageData),
  208. // objects: createSceneContentData(viewer),
  209. };
  210. return data;
  211. }