|
@@ -217,6 +217,12 @@ var enter = ({
|
|
|
measure.addEventListener("highlight", (e) => {
|
|
|
bus.emit("highlight", e.state);
|
|
|
});
|
|
|
+
|
|
|
+ measure.addEventListener("selected", (e) => {
|
|
|
+ bus.emit("selected", e.state);
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
return {
|
|
|
quit: () => {
|
|
|
Potree.Log("quit结束且删除: " + measure.id, {
|
|
@@ -396,146 +402,7 @@ var enter = ({
|
|
|
dataset_location */
|
|
|
};
|
|
|
}, //全景模式一直获取会很卡
|
|
|
-
|
|
|
- /* getPose(o = {}) {
|
|
|
- //获取相对于第一个数据集的初始画面。(当数据集校准后,如果初始画面设置在被修改的数据集上,且该数据集非初始数据集的话,还是会偏移的)
|
|
|
- var deferred = o.deferred || $.Deferred();
|
|
|
- console.log("getPose,转换前:", viewer.mainViewport.view.clone());
|
|
|
- if (viewer.mainViewport.view.isFlying()) {
|
|
|
- let f = () => {
|
|
|
- this.getPose(o);
|
|
|
- viewer.mainViewport.view.removeEventListener("flyingDone", f);
|
|
|
- };
|
|
|
- viewer.mainViewport.view.addEventListener("flyingDone", f); //once
|
|
|
- o.deferred = deferred;
|
|
|
- return deferred.promise();
|
|
|
- }
|
|
|
-
|
|
|
- var camera = viewer.scene.getActiveCamera();
|
|
|
- var rotation = camera.rotation;
|
|
|
- var pos_In_dataset = Potree.Utils.datasetPosTransform({
|
|
|
- toDataset: true,
|
|
|
- position: camera.position.clone(),
|
|
|
- datasetId: Potree.settings.originDatasetId,
|
|
|
- });
|
|
|
- var rot_In_dataset = Potree.Utils.datasetRotTransform({
|
|
|
- toDataset: true,
|
|
|
- rotation,
|
|
|
- getRotation: true,
|
|
|
- datasetId: Potree.settings.originDatasetId,
|
|
|
- }); //拿第一个数据集
|
|
|
-
|
|
|
- var view = viewer.scene.view.clone();
|
|
|
-
|
|
|
- view.rotation = rot_In_dataset; //获取yaw pitch
|
|
|
-
|
|
|
- var pose = {
|
|
|
- position: pos_In_dataset,
|
|
|
- yaw: view.yaw,
|
|
|
- pitch: view.pitch,
|
|
|
- displayMode: Potree.settings.displayMode,
|
|
|
- };
|
|
|
-
|
|
|
- if (viewer.images360.isAtPano()) {
|
|
|
- pose.panoSid = viewer.images360.currentPano.sid;
|
|
|
- }
|
|
|
-
|
|
|
- setTimeout(() => {
|
|
|
- deferred.resolve(pose);
|
|
|
- console.log("getPose resolve", pose);
|
|
|
- }, 1);
|
|
|
-
|
|
|
- return deferred.promise();
|
|
|
- },
|
|
|
-
|
|
|
- setPose(o = {}, duration = 0) {
|
|
|
- //设置相机位置和朝向
|
|
|
- var deferred = o.deferred || $.Deferred();
|
|
|
- console.warn("setPose 初始画面", o);
|
|
|
- var quaternion;
|
|
|
- let view = viewer.scene.view.clone();
|
|
|
-
|
|
|
- if (viewer.mainViewport.view.isFlying()) {
|
|
|
- let f = () => {
|
|
|
- this.setPose(o, duration);
|
|
|
- viewer.mainViewport.view.removeEventListener("flyingDone", f);
|
|
|
- };
|
|
|
- viewer.mainViewport.view.addEventListener("flyingDone", f); //once
|
|
|
- o.deferred = deferred;
|
|
|
- return deferred.promise();
|
|
|
- }
|
|
|
-
|
|
|
- var getQuaternion = () => {
|
|
|
- view.pitch = o.pitch;
|
|
|
- view.yaw = o.yaw;
|
|
|
- quaternion = Potree.Utils.datasetRotTransform({
|
|
|
- fromDataset: true,
|
|
|
- rotation: view.rotation,
|
|
|
- getQuaternion: true,
|
|
|
- datasetId: Potree.settings.originDatasetId,
|
|
|
- }); //拿第一个数据集
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- viewer.images360.cancelFlyToPano(); //防止旧的在之后继续执行
|
|
|
- let pano;
|
|
|
- if (o.panoSid != void 0) {
|
|
|
- //好像都不存这个
|
|
|
- pano = viewer.images360.panos.find((e) => e.sid == o.panoSid);
|
|
|
- if (pano == void 0)
|
|
|
- return deferred.reject(ui18n.t("scene.pose.unSid")).promise();
|
|
|
- getQuaternion();
|
|
|
- viewer.images360.flyToPano({
|
|
|
- pano,
|
|
|
- duration,
|
|
|
- quaternion
|
|
|
- }, () => {
|
|
|
- deferred.resolve();
|
|
|
- });
|
|
|
- } else {
|
|
|
- if (Potree.settings.displayMode == "showPanos") {
|
|
|
- return deferred.reject(ui18n.t("scene.pose.unImage")).promise();
|
|
|
- }
|
|
|
-
|
|
|
- let position = Potree.Utils.datasetPosTransform({
|
|
|
- fromDataset: true,
|
|
|
- position: o.position,
|
|
|
- datasetId: Potree.settings.originDatasetId,
|
|
|
- });
|
|
|
- //view.position.copy(position)
|
|
|
- getQuaternion();
|
|
|
-
|
|
|
- pano = viewer.images360.panos.find((e) =>
|
|
|
- Potree.math.closeTo(e.position, position));
|
|
|
-
|
|
|
- if (pano) {
|
|
|
- //如果原来在某pano上最好也使currentPano为此pano,否则isAtPano会返回false
|
|
|
- viewer.images360.flyToPano({
|
|
|
- pano,
|
|
|
- duration,
|
|
|
- quaternion
|
|
|
- }, () => {
|
|
|
- deferred.resolve();
|
|
|
- });
|
|
|
- } else {
|
|
|
- viewer.scene.view.setView({
|
|
|
- position,
|
|
|
- quaternion,
|
|
|
- duration,
|
|
|
- callback: () => {
|
|
|
- //setTimeout(()=>{
|
|
|
- deferred.resolve();
|
|
|
- console.log("setPose resolve");
|
|
|
- //},1)
|
|
|
- },
|
|
|
- });
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return deferred.promise();
|
|
|
- }, */
|
|
|
+
|
|
|
|
|
|
getPose2() {
|
|
|
const camera = viewer.scene.getActiveCamera();
|
|
@@ -850,7 +717,49 @@ var enter = ({
|
|
|
}
|
|
|
//poschange后会调用这个,如果返回false会变为点云模式,且不会自动变回原先的模式
|
|
|
},
|
|
|
- ...parameter.sceneBus,
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ 添加一个方法 单击场景某个位置 返回当前三维坐标, 调用时场景不能漫游与选择直到获取完成
|
|
|
+ sdk.scene.trackScenePos()
|
|
|
+ 返回
|
|
|
+ {
|
|
|
+ promise: Promise<Pos3D>, //获取的promise, 获取到了返回三维坐标,没获取到返回null
|
|
|
+ quit: function() //取消获取
|
|
|
+ }志彬5月15日 14:46 */
|
|
|
+
|
|
|
+ trackScenePos(){
|
|
|
+ let deferred = $.Deferred();
|
|
|
+ let quit = ()=>{ //取消获取
|
|
|
+ viewer.removeEventListener('global_click',gotIntersect)
|
|
|
+ Potree.settings.unableNavigate = false
|
|
|
+ viewer.controls.setEnable(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ let gotIntersect = (e)=>{
|
|
|
+ if(e.intersect){
|
|
|
+ console.log('quit', e.intersect.location)
|
|
|
+ quit()
|
|
|
+ deferred.resolve(e.intersect.location)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ viewer.addEventListener('global_click',gotIntersect)
|
|
|
+ Potree.settings.unableNavigate = true
|
|
|
+ viewer.controls.setEnable(false)
|
|
|
+
|
|
|
+ return {
|
|
|
+ promise: deferred.promise() , //获取的promise, 获取到了返回三维坐标,没获取到返回null
|
|
|
+ quit
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ...parameter.sceneBus,
|
|
|
+
|
|
|
},
|
|
|
|
|
|
|
|
@@ -976,179 +885,7 @@ var enter = ({
|
|
|
|
|
|
return pos;
|
|
|
},
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /*
|
|
|
-
|
|
|
- createNavigation() {
|
|
|
- let RouteGuider = viewer.modules.RouteGuider;
|
|
|
- let routeStart,
|
|
|
- routeEnd; //这和RouteGuider中的不一定一致,因为返回数据后会修改起点和终点
|
|
|
- const bus = mitt();
|
|
|
- let generateDeferred;
|
|
|
- RouteGuider.bus = bus;
|
|
|
-
|
|
|
- bus.on("gotResult", (e) => {
|
|
|
- //发送获得的结果
|
|
|
- generateDeferred.resolve(e);
|
|
|
- generateDeferred = null;
|
|
|
- });
|
|
|
-
|
|
|
- //this.bus.emit('gotResult', {dis:this.routeLength})
|
|
|
-
|
|
|
- return {
|
|
|
- bus,
|
|
|
- setStartPoint: function (pos, dealZ, datasetId) {
|
|
|
- if (routeStart && pos && routeStart.equals(pos))
|
|
|
- return; //在删除其中一个后重新设置,另一个也会重新执行此函数,直接返回。
|
|
|
- routeStart = pos && new THREE.Vector3().copy(pos);
|
|
|
- RouteGuider.setRouteStart(routeStart, dealZ, datasetId);
|
|
|
- },
|
|
|
- setEndPoint: function (pos, dealZ, datasetId) {
|
|
|
- if (routeEnd && pos && routeEnd.equals(pos))
|
|
|
- return;
|
|
|
- routeEnd = pos && new THREE.Vector3().copy(pos);
|
|
|
- RouteGuider.setRouteEnd(routeEnd, dealZ, datasetId);
|
|
|
- },
|
|
|
-
|
|
|
- generate: function () {
|
|
|
- generateDeferred = $.Deferred();
|
|
|
- return generateDeferred.promise();
|
|
|
|
|
|
- },
|
|
|
- destroy: function () {
|
|
|
- //点击删除起点或终点时执行destroy。 (在退出时会自动删除起点和终点)
|
|
|
- RouteGuider.clearRoute(); // 隐藏路线
|
|
|
- },
|
|
|
- };
|
|
|
- },
|
|
|
-
|
|
|
- enterAlignment() {
|
|
|
- let Alignment = viewer.modules.Alignment;
|
|
|
- Alignment.enter();
|
|
|
-
|
|
|
- //let selectedDatasets = []
|
|
|
- var applyToPointcloud = (fun, value) => {
|
|
|
- //var selectedDatasets = viewer.scene.pointclouds.filter(e => Potree.Utils.getObjVisiByReason(e, 'datasetSelection')) //$('#alignment li[name="selectPointCloud"] input:checked' )
|
|
|
-
|
|
|
- Alignment.selectedClouds.forEach((pointcloud) => {
|
|
|
- fun(pointcloud, value);
|
|
|
- });
|
|
|
- };
|
|
|
- let bus = mitt();
|
|
|
- let changed = false;
|
|
|
-
|
|
|
- Alignment.bus.removeEventListeners("forbitMoveOriginDataset"); //移除旧的
|
|
|
- Alignment.bus.addEventListener("forbitMoveOriginDataset", () => {
|
|
|
- bus.emit("moveInitialDataset");
|
|
|
- });
|
|
|
- Alignment.changeCallBack = () => {
|
|
|
- bus.emit("changed");
|
|
|
- changed = true;
|
|
|
- };
|
|
|
-
|
|
|
- return {
|
|
|
- bus,
|
|
|
- //全屏漫游视图
|
|
|
- fullRoamView() {
|
|
|
- Alignment.SplitScreen.focusOnViewport("MainView");
|
|
|
- },
|
|
|
- // 全屏顶视图
|
|
|
- fullTopView() {
|
|
|
- Alignment.SplitScreen.focusOnViewport("mapViewport");
|
|
|
- },
|
|
|
- //
|
|
|
- fullLeftSideView() {
|
|
|
- Alignment.SplitScreen.focusOnViewport("back");
|
|
|
- },
|
|
|
- //
|
|
|
- fullRightSideView() {
|
|
|
- Alignment.SplitScreen.focusOnViewport("right");
|
|
|
- },
|
|
|
- // 退出全屏
|
|
|
- quitFull() {
|
|
|
- Alignment.SplitScreen.unfocusViewport();
|
|
|
- },
|
|
|
- enableTopMap(enable) {
|
|
|
- Alignment.SplitScreen.enableMap(enable);
|
|
|
- },
|
|
|
- enableTopFloorPan(enable) {
|
|
|
- Alignment.SplitScreen.enableFloorplan(enable);
|
|
|
- },
|
|
|
-
|
|
|
- clear() {
|
|
|
- //退出
|
|
|
- Alignment.leave();
|
|
|
- },
|
|
|
- //切换操作 'translate'|'rotate'
|
|
|
- switchHandle: Alignment.switchHandle.bind(Alignment),
|
|
|
-
|
|
|
- rotate(deg) {
|
|
|
- //逆时针是正数
|
|
|
- applyToPointcloud(Alignment.rotate, deg);
|
|
|
- },
|
|
|
-
|
|
|
- translate(str) {
|
|
|
- //str: '+x''-x'等
|
|
|
- const vectors = {
|
|
|
- "+x": new THREE.Vector3(1, 0, 0),
|
|
|
- "-x": new THREE.Vector3(-1, 0, 0),
|
|
|
- "+y": new THREE.Vector3(0, 1, 0),
|
|
|
- "-y": new THREE.Vector3(0, -1, 0),
|
|
|
- "+z": new THREE.Vector3(0, 0, 1),
|
|
|
- "-z": new THREE.Vector3(0, 0, -1),
|
|
|
- };
|
|
|
- var moveVec = vectors[str];
|
|
|
- applyToPointcloud(Alignment.translate, moveVec);
|
|
|
- },
|
|
|
-
|
|
|
- selectDatasets(datasets) {
|
|
|
- //selectedDatasets = datasets
|
|
|
- Alignment.selectedClouds = datasets.map((e) => viewer.scene.pointclouds.find((p) => p.dataset_id == e.id));
|
|
|
- },
|
|
|
- focusOnDataset(id) {
|
|
|
- let pointcloud = viewer.scene.pointclouds.find(
|
|
|
- (p) => p.dataset_id == id);
|
|
|
- Alignment.SplitScreen.focusOnPointCloud(pointcloud);
|
|
|
- },
|
|
|
-
|
|
|
- save() {
|
|
|
- let deferred = $.Deferred();
|
|
|
-
|
|
|
- if (changed) {
|
|
|
- let {
|
|
|
- data,
|
|
|
- callback
|
|
|
- } = Alignment.save();
|
|
|
-
|
|
|
- axios
|
|
|
- .put(`/laser/dataset/${Potree.settings.number}/calibration`, data)
|
|
|
- .then((e) => {
|
|
|
- //成功后:
|
|
|
- //if (e.code == 200) {
|
|
|
- callback();
|
|
|
- if (lastSiteModelData) {
|
|
|
- sdk.setSiteModelInfo(lastSiteModelData); // 空间模型的点也要变化
|
|
|
- sdk.refreshFloorPan();
|
|
|
- }
|
|
|
-
|
|
|
- bus.emit("saveSuccess"); //需要修改所有热点position 且更新测量线数据
|
|
|
-
|
|
|
- deferred.resolve(1);
|
|
|
- });
|
|
|
- } else {
|
|
|
- deferred.resolve(ui18n.t("sys.unUpdate"));
|
|
|
- bus.emit("saveSuccess");
|
|
|
- }
|
|
|
-
|
|
|
- return deferred.promise();
|
|
|
- },
|
|
|
- };
|
|
|
- },
|
|
|
- */
|
|
|
-
|
|
|
-
|
|
|
enterMeasurement() {
|
|
|
//进入测量模块
|
|
|
viewer.setLimitFar(false);
|
|
@@ -1167,110 +904,7 @@ var enter = ({
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
- enterEditCrop() {
|
|
|
- //实时剪裁编辑模块
|
|
|
- const bus = mitt();
|
|
|
- let clipping = viewer.modules.clipping;
|
|
|
- let addingBox; //正在添加的box
|
|
|
-
|
|
|
- if (cropArgs) {
|
|
|
- //加载剪裁数据
|
|
|
- clipping.loadFromData(cropArgs);
|
|
|
- viewer.scene.volumes.forEach((box) =>
|
|
|
- Potree.Utils.updateVisible(box, "hidden", false));
|
|
|
- }
|
|
|
- clipping.enter();
|
|
|
-
|
|
|
- let volumeBind = (volumeBox) => {
|
|
|
- volumeBox.addEventListener("select", () => {
|
|
|
- bus.emit("selectShape", {
|
|
|
- EditCrop,
|
|
|
- delete () {
|
|
|
- viewer.scene.removeVolume(volumeBox);
|
|
|
- },
|
|
|
- });
|
|
|
- });
|
|
|
- volumeBox.addEventListener("deselect", () => {
|
|
|
- bus.emit("unSelectShape", {
|
|
|
- EditCrop
|
|
|
- });
|
|
|
- });
|
|
|
- volumeBox.addEventListener("createFinish", (e) => {
|
|
|
- //确定好放置位置
|
|
|
- if (addingBox == volumeBox) {
|
|
|
- bus.emit("cancelExclude"); //停止
|
|
|
- bus.emit("cancelIntersect"); //停止
|
|
|
- addingBox = null;
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
- {
|
|
|
- //初始化加载的volumeBox
|
|
|
- viewer.scene.volumes.forEach((v) => {
|
|
|
- volumeBind(v);
|
|
|
- });
|
|
|
- addingBox = null;
|
|
|
- }
|
|
|
- viewer.volumeTool.addEventListener(
|
|
|
- "start_inserting_volume",
|
|
|
- (e) => {
|
|
|
- addingBox = e.volume;
|
|
|
- },
|
|
|
- 10);
|
|
|
-
|
|
|
- let cancel = (volume) => {
|
|
|
- //volume代表指定的
|
|
|
- if (!volume || volume.isNew)
|
|
|
- viewer.dispatchEvent("cancel_insertions"); //停止当前的添加
|
|
|
- };
|
|
|
-
|
|
|
- let EditCrop = {
|
|
|
- bus,
|
|
|
- excludeMode() {
|
|
|
- let volumeBox = viewer.volumeTool.startInsertion({
|
|
|
- clipTask: Potree.ClipTask.SHOW_OUTSIDE,
|
|
|
- }); //注:没加完前不要clip效果
|
|
|
- volumeBind(volumeBox);
|
|
|
- return cancel.bind(this, volumeBox);
|
|
|
- },
|
|
|
- intersectMode() {
|
|
|
- let volumeBox = viewer.volumeTool.startInsertion({
|
|
|
- clipTask: Potree.ClipTask.SHOW_INSIDE,
|
|
|
- });
|
|
|
- volumeBind(volumeBox);
|
|
|
- return cancel.bind(this, volumeBox);
|
|
|
- },
|
|
|
- moveMode() {
|
|
|
- clipping.setTranMode("translation");
|
|
|
- },
|
|
|
- rotateMode() {
|
|
|
- clipping.setTranMode("rotation");
|
|
|
- },
|
|
|
- scaleMode() {
|
|
|
- clipping.setTranMode("scale");
|
|
|
- },
|
|
|
- clearAll() {
|
|
|
- cancel();
|
|
|
- viewer.scene.volumes
|
|
|
- .slice(0)
|
|
|
- .forEach((e) => viewer.scene.removeVolume(e));
|
|
|
- },
|
|
|
- save() {
|
|
|
- let data = clipping.saveClipData();
|
|
|
- return data;
|
|
|
- },
|
|
|
-
|
|
|
- calc() {
|
|
|
- return clipping.getCalcData();
|
|
|
- },
|
|
|
-
|
|
|
- switchViewMode(mode) {
|
|
|
- clipping.switchView(mode == "top" ? "top" : "mainView");
|
|
|
- },
|
|
|
- };
|
|
|
- return EditCrop;
|
|
|
- },
|
|
|
+
|
|
|
|
|
|
};
|
|
|
Potree.sdk = sdk;
|