新三维客流逻辑基本完成(未实装)

This commit is contained in:
sunzhenyu 2021-03-19 18:14:21 +08:00
parent ab6acbc7d8
commit d22f9d62de
26 changed files with 3222 additions and 1559 deletions

View File

@ -1,438 +0,0 @@
import { Staticmodel } from '@/jlmap3d/jl3dtrafficplan/loader/stationconfig.js';
//静态资源文件路劲
import { JL3D_LOCAL_STATIC } from '@/api/jlmap3d/assets3d.js';
//loader
import { FBXLoader } from '@/jlmap3d/main/loaders/FBXLoader';
//轨道视角控制
import { StationManagerControls } from '@/jlmap3d/jl3dstationmanager/controls/stationManagerControls';
//模型管理器
import { ModelManager } from '@/jlmap3d/jl3dstationmanager/loader/loader.js';
//骨骼动画模型辅助工具
import { SkeletonUtils } from '@/jlmap3d/main/utils/SkeletonUtils.js';
//获取信息接口
import { getPublishMapVersion, getPublishMapDetail,getPublish3dMapDetail} from '@/api/jlmap3d/load3ddata';
//cctv站台对象
import { PasserStation } from '@/jlmap3d/jl3dtrafficplan/model/passerstation.js';
//cctv检票机对象
import { PasserCheckDoor } from '@/jlmap3d/jl3dtrafficplan/model/passercheckdoor.js';
//cctv列车对象
import { PasserTrain } from '@/jlmap3d/jl3dtrafficplan/model/passertrain.js';
//cctv行人对象
import { PasserHuman } from '@/jlmap3d/jl3dtrafficplan/model/passerhuman.js';
//cctv渲染器
import { PasserRender } from '@/jlmap3d/jl3dpassflow/passerrender/passerrender.js';
//cctv行人ai
import { PasserAi } from '@/jlmap3d/jl3dtrafficplan/passerai/passerai.js';
//行人寻路相关工具
import { ZoneManager } from '@/jlmap3d/jl3dtrafficplan/model/zonemanager.js';
import { PathFinder } from '@/jlmap3d/jl3dtrafficplan/passerai/pathfinder.js';
//cctv通信工具
import { PassflowConnect } from '@/jlmap3d/jl3dtrafficplan/connect/stationconnect.js';
import StompClient from '@/utils/sock';
import store from '@/store/index';
// import { Loading } from 'element-ui';
import {Stats} from '@/jlmap3d/main/lib/stats.min.js';
//动画播放相关
let clock = new THREE.Clock();
let delta;
let scene,camerass,renderer;
let aiswitch = 0;
//动画组
let mixers = [];
//车站摄像机模型
let monitor;
//寻路相关对象
let passerZone = new ZoneManager();
let pathFinder = new PathFinder();
let path;
//设备动画action组
let deviceaction = [];
//控制帧率的webworker线程
let passerWebWork = new Worker(JL3D_LOCAL_STATIC+"/workertest/trafficplan/trafficstation.js");
//老版本临时ai控制
let olddataai = false;
export function Jl3dStationManager(dom,skinCode,routegroup,viewMap,initCode) {
// let stats = new Stats();
// dom.appendChild( stats.dom );
let scope = this;
this.dom = dom;
this.nowcode = null;
this.animateswitch = false;
this.signallights = [];
this.mixers = [];
this.showmodel = null;
this.allStationData = [];
this.humanWaitTop = 0;
this.humanWaitDown = 0;
this.humanInSpeed = 0;
this.humanOutSpeed = 0;
let waitForCreatIn = [];
let waitForCreatOutTop = [];
let waitForCreatOutDown = [];
//定义相机
camerass = new THREE.PerspectiveCamera(70, dom.offsetWidth / dom.offsetHeight, 0.01, 10000);
camerass.position.set(0,200,0);
camerass.aspect = dom.offsetWidth / dom.offsetHeight;
camerass.updateProjectionMatrix();
//定义场景(渲染容器)
scene = new THREE.Scene();
// scene.background = new THREE.Color(0xa0a0a0);
var mesh = new THREE.Mesh( new THREE.PlaneBufferGeometry( 1000, 1000 ), new THREE.MeshPhongMaterial( { color: 0x999999, depthWrite: false } ) );
mesh.rotation.x = - Math.PI / 2;
mesh.receiveShadow = true;
scene.add( mesh );
var grid = new THREE.GridHelper( 1000, 100, 0x000000, 0x000000 );
grid.material.opacity = 0.2;
grid.material.transparent = true;
scene.add( grid );
let passerRender = new PasserRender(viewMap);
passerRender.initView(dom,scene,camerass);
passerRender.reSize(scope.dom.offsetWidth,scope.dom.offsetHeight);
//定义全局光
let ambientLight = new THREE.AmbientLight(0xffffff, 1.3);
scene.add(ambientLight);
var light = new THREE.HemisphereLight( 0xffffff, 0x444444 );
light.position.set( 0, 4000, 0 );
scene.add( light );
let controls = new THREE.StationManagerControls(camerass, dom,camerass,scene,mesh);
// controls.maxPolarAngle = Math.PI / 2;
// controls.minPolarangle = Math.PI / 5;
// controls.maxDistance = 800;
controls.screenSpacePanning = true;
controls.target.set( 1, 0, 0 );
controls.controlMode = "Draw";
controls.update();
this.selectmodel = null;
// let mouse = new THREE.Vector2();
let raycaster = new THREE.Raycaster();
//进站运动中乘客
let humanlist = new THREE.Group();
//上行等待上车乘客
let topWaitPassers = new THREE.Group();
//下行等待上车乘客
let downWaitPassers = new THREE.Group();
//出站乘客
let outStationPassers = new THREE.Group();
let passerHuman = new PasserHuman();
let passerAi = new PasserAi(passerZone,pathFinder);
this.anime = null;
this.modelmanager = new ModelManager();
// let loadingInstance = Loading.service({ fullscreen: true });
let stationlist = [];
let socktest = null;
let passerStation = new PasserStation();
let passerCheckDoor = new PasserCheckDoor();
let passerTrain = new PasserTrain();
// document.addEventListener( "mousedown", onselect, false );
this.modelmanager.loadpromise(Staticmodel, scope.mixers,"2").then(function (data) {
// console.log(scope.modelmanager.station.mesh.getObjectByName("top"));
// let testtop = scope.modelmanager.station.mesh.getObjectByName("down");
// for(let i=0;i<testtop.children.length;i++){
// console.log(testtop.children[i].matrixWorld.elements[12]);
// console.log(testtop.children[i].matrixWorld.elements);
// }
// console.log(scope.modelmanager.station.mesh.getObjectByName("down"));
passerStation.initStationAnimation(scope.modelmanager.station.mesh,mixers,deviceaction,scene);
passerCheckDoor.initCheckDoorInAnimation(scope.modelmanager.zhajiin.mesh,mixers,deviceaction,scene);
passerCheckDoor.initCheckDoorOutAnimation(scope.modelmanager.zhajiout.mesh,mixers,deviceaction,scene);
passerTrain.initTrain(scope.modelmanager.train.mesh,mixers,deviceaction,scene);
scene.add(scope.modelmanager.section.mesh);
monitor = scope.modelmanager.monitor.mesh;
scene.add(monitor);
console.log("animate");
animate();
})
this.initTrafficStart = function(){
passerStation.initCodeStation(initCode);
scope.humanWaitTop = passerStation.nowStation.toppassers;
scope.humanWaitDown = passerStation.nowStation.downpassers;
scope.humanInSpeed = 0;
scope.humanOutSpeed = 0;
passerHuman.speed = scope.humanInSpeed;
passerAi.initPasser(humanlist,topWaitPassers,downWaitPassers,passerHuman,scope);
updatePasserData(humanlist.children.length,topWaitPassers.children.length,downWaitPassers.children.length,outStationPassers.children.length,passerHuman.speed);
scope.resetscene();
}
this.changestation = function(stationname){
passerStation.changestation(stationname);
// console.log(passerStation.nowStation);
scope.humanWaitTop = passerStation.nowStation.toppassers;
scope.humanWaitDown = passerStation.nowStation.downpassers;
passerHuman.speed = passerStation.nowStation.topspeed + passerStation.nowStation.downspeed;
updatePasserData(humanlist.children.length,topWaitPassers.children.length,downWaitPassers.children.length,outStationPassers.children.length,passerHuman.speed);
scope.resetscene();
}
this.updateNowStationData = function(){
for(let i=0;i<passerStation.nowStation.topspeed;i++){
let newIn = {
overGoal:"top",
};
waitForCreatIn.push(newIn);
}
for(let i=0;i<passerStation.nowStation.downspeed;i++){
let newIn = {
overGoal:"down",
};
waitForCreatIn.push(newIn);
}
scope.humanInSpeed = passerStation.nowStation.topspeed+passerStation.nowStation.downspeed;
passerHuman.speed = scope.humanInSpeed;
passerWebWork.postMessage(["changespeed",scope.humanInSpeed/30]);
}
this.updateNowLeaveData = function(direct,outNum){
if(direct == "top"){
waitForCreatOutTop = getnum(outNum,17);
// console.log(waitForCreatOutTop);
for(let i=0;i<waitForCreatOutTop.length;i++){
for(let j=0;j<waitForCreatOutTop[i];j++){
setTimeout(function(){
// console.log(passerZone.list["standtop"].doorpoints[i]);
passerHuman.newHumanCreate(outStationPassers,passerZone.list["standtop"].doorpoints[i],5,"top",i);
}, Math.random()*1000*j);
}
}
}else{
waitForCreatOutDown = getnum(outNum,17);
for(let i=0;i<waitForCreatOutDown.length;i++){
for(let j=0;j<waitForCreatOutDown[i];j++){
setTimeout(function(){
// console.log(passerZone.list["standdown"].doorpoints[i]);
passerHuman.newHumanCreate(outStationPassers,passerZone.list["standdown"].doorpoints[i],5,"down",i);
}, Math.random()*1000*j);
}
}
}
}
this.resetscene = function(){
aiswitch = 1;
passerAi.toppasserin = false;
passerAi.downpasserin = false;
//下车控制开关
passerAi.toppasseron = false;
passerAi.downpasseron = false;
passerAi.toppasserinNum = 0;
passerAi.downpasserinNum = 0;
passerTrain.toptrain.nowcode = null;
passerTrain.downtrain.nowcode = null;
// humanlist = new THREE.Group();
for(let j=0; j<humanlist.children.length;j++){
humanlist.remove(humanlist.children[j]);
j--;
// j--;
}
for(let j=0; j<topWaitPassers.children.length;j++){
topWaitPassers.remove(topWaitPassers.children[j]);
j--;
// j--;
}
for(let j=0; j<downWaitPassers.children.length;j++){
downWaitPassers.remove(downWaitPassers.children[j]);
j--;
// j--;
}
for(let j=0; j<outStationPassers.children.length;j++){
outStationPassers.remove(outStationPassers.children[j]);
j--;
// j--;
}
passerTrain.toptrain.position.y = -20000;
passerTrain.downtrain.position.y = -20000;
deviceaction.down.action.reset();
deviceaction.down.action.time = deviceaction.down.action._clip.duration;
deviceaction.down.action.timeScale = -1;
deviceaction.down.action.play();
deviceaction.top.action.reset();
deviceaction.top.action.time = deviceaction.down.action._clip.duration;
deviceaction.top.action.timeScale = -1;
deviceaction.top.action.play();
for(let an=passerTrain.toptrain.action.top.length-1;an>=0;an--){
passerTrain.toptrain.action.top[an].reset();
passerTrain.toptrain.action.top[an].time = passerTrain.toptrain.action.top[an]._clip.duration;
passerTrain.toptrain.action.top[an].timeScale = -1;
passerTrain.toptrain.action.top[an].play();
}
for(let an=passerTrain.toptrain.action.down.length-1;an>=0;an--){
passerTrain.toptrain.action.down[an].reset();
passerTrain.toptrain.action.down[an].time = passerTrain.toptrain.action.down[an]._clip.duration;
passerTrain.toptrain.action.down[an].timeScale = -1;
passerTrain.toptrain.action.down[an].play();
}
// for(let an=actions.length-1;an>=0;an--){
// actions[an].reset();
// actions[an].time = actions[an]._clip.duration;
// actions[an].timeScale = -1;
// actions[an].play();
// }
setTimeout(function(){
passerAi.initPasser(humanlist,topWaitPassers,downWaitPassers,passerHuman,scope);
aiswitch = 0;
}, 2000);
}
function startWorker(){
let updateaianimate = setInterval(
function(){
// console.log("?");
if(aiswitch == 0){
updatePasserData(humanlist.children.length,topWaitPassers.children.length,downWaitPassers.children.length,outStationPassers.children.length,passerHuman.speed);
passerHuman.moveAnimateUpdate(humanlist,topWaitPassers,downWaitPassers,outStationPassers,passerHuman);
passerAi.aiUpdate(humanlist,topWaitPassers,downWaitPassers,outStationPassers,passerHuman,passerCheckDoor,deviceaction);
// passerZone.zoneActionCheck(humanlist,passerHuman,passerCheckDoor,deviceaction);
delta = clock.getDelta();
for(let i=mixers.length-1;i>=0;i--){
if(mixers[i]._actions[0].isRunning()){
mixers[i].update( delta );
}
}
// for(let i=topWaitPassers.children.length-1;i>=0;i--){
// if(topWaitPassers.children[i].mixer._actions[0].isRunning()){
// topWaitPassers.children[i].mixer.update( delta );
// }
// }
// for(let i=downWaitPassers.children.length-1;i>=0;i--){
// if(downWaitPassers.children[i].mixer._actions[0].isRunning()){
// downWaitPassers.children[i].mixer.update( delta );
// }
// }
// for(let i=outStationPassers.children.length-1;i>=0;i--){
// if(outStationPassers.children[i].mixer._actions[0].isRunning()){
// outStationPassers.children[i].mixer.update( delta );
// }
// }
// for(let i=humanlist.children.length-1;i>=0;i--){
// if(humanlist.children[i].mixer._actions[0].isRunning()){
// humanlist.children[i].mixer.update( delta );
// }
// }
}
}
, 100);
passerWebWork.onmessage = function (event) {
if(aiswitch == 0){
// console.log(humanlist.children.length);
this.allStationData = [];
if(waitForCreatIn.length>0){
let direct = Math.floor(Math.random()*(3-1+1))+1;
//1--top
//2-- down
if(direct == 1){
passerHuman.newHumanCreate(humanlist,passerZone.getzoneposition("enter1"),0,waitForCreatIn[0].overGoal);
}else{
passerHuman.newHumanCreate(humanlist,passerZone.getzoneposition("enter2"),0,waitForCreatIn[0].overGoal);
}
waitForCreatIn.shift();
}
}
};
}
//
// function onselect(event){
// if(event.button == '0'){
//
// //定义光线
// let raycaster = new THREE.Raycaster();
// //定义平面鼠标点击坐标
// let mouse = new THREE.Vector2();
// mouse.x = (event.clientX / scope.dom.offsetWidth) * 2 - 1;
// mouse.y = -(event.clientY / scope.dom.offsetHeight) * 2 + 1;
//
// raycaster.setFromCamera( mouse, camerass );
//
// let intersects = raycaster.intersectObject(scope.modelmanager.station.mesh,true);
// console.log(intersects[0].point);
// }
// }
//循环渲染函数
function animate() {
passerRender.update();
// console.log(passerRender);
// console.log("ss");
// if(passerRender.state == "freeview"){
controls.update();
// }
// delta = clock.getDelta();
requestAnimationFrame(animate);
}
window.onresize = function () {
passerRender.reSize(scope.dom.offsetWidth,scope.dom.offsetHeight);
}
this.switchviews = function(viewmode){
passerRender.changeRenderMode(viewmode);
}
function getnum(num,pnum){
let re = [];
let base = Math.floor(num/pnum);
let reset = num%pnum;
for(let i=0;i<pnum;i++){
let nownum = base+(i<reset?1:0);
re.push(nownum);
}
return re;
}
}

View File

@ -10,10 +10,11 @@ export function silumationConnect(deviceaction,toptrain,downtrain,routegroup,pas
let start = true;
let topic = '/user/queue/simulation/jl3d/'+routegroup;
let header = {'X-Token': getToken() };
socketon(topic);
// scope.socketon(topic);
function socketon(topic) {
this.socketon = function() {
try {
start = true;
scope.teststomp.subscribe(topic, callback, header);
} catch (error) {
console.error('websocket订阅失败');
@ -21,83 +22,15 @@ export function silumationConnect(deviceaction,toptrain,downtrain,routegroup,pas
};
this.socketoff = function(topic) {
this.socketoff = function() {
start = false;
scope.teststomp.unsubscribe(topic);
};
// 仿真socket接口回调函数
function callback(Response) {
const data = JSON.parse(Response.body);
if(data.type == "PFV"){
for(let i=0;i<passerStation.stationlist.length;i++){
if(passerStation.stationlist[i].code == data.body){
jl3d.changestation(passerStation.stationlist[i].name);
updateValue(passerStation.stationlist[i].name);
i = passerStation.stationlist.length;
}
}
}
// /** 站台客流当前人数信息 */
// if(data.type == "STAND_PFI"){
//
// let newStandData = data.body;
// let count = 0;
// for(let j=0;j<passerStation.stationlist.length;j++){
// count = 0;
//
// for(let i=0;i<newStandData.length;i++){
//
//
// if(passerStation.stationlist[j].topstand == newStandData[i].standCode){
//
// passerStation.stationlist[j].topspeed = newStandData[i].to;
// passerStation.stationlist[j].toppassers = newStandData[i].num;
// count++;
// }
// if(passerStation.stationlist[j].downstand == newStandData[i].standCode){
//
// passerStation.stationlist[j].downspeed = newStandData[i].to;
// passerStation.stationlist[j].downpassers = newStandData[i].num;
// count++;
// }
//
// if(count == 2){
// i = newStandData.length;
// }
// }
// }
//
// jl3d.updateNowStationData();
//
// if(start){
// start = false;
// jl3d.initTrafficStart();
// }
//
// // jl3d.allStationData = data.body;
// }
// if(data.type == "TRAIN_PFI_BL"){
//
// if(toptrain.nowcode == data.body.code && topswitch == true){
//
// //根据上下车人数创建人
// jl3d.updateNowLeaveData("top",data.body.out);
// setTimeout(function(){
// passerAi.passerout("top","start",data.body.in)
// }, 5000);
//
// }
// if(downtrain.nowcode == data.body.code && downswitch == true){
// //根据上下车人数创建人
// jl3d.updateNowLeaveData("down",data.body.out);
// setTimeout(function(){
// passerAi.passerout("down","start",data.body.in);
// }, 5000);
// }
// }
let data = JSON.parse(Response.body);
if(data.type == "DeviceCtrl_3D"){
@ -172,15 +105,15 @@ export function silumationConnect(deviceaction,toptrain,downtrain,routegroup,pas
for(let i=0,leni = data.body.length;i<leni;i++){
if(data.body[i].section == passerStation.nowStation.topsection){
if(toptrain.nowcode != data.body[i].code){
toptrain.nowcode = data.body[i].code;
sockStationPass.topswitch = true;
}
toptrain.position.copy(toptrain.curve.getPointAt(data.body[i].offset));
}else{
if(downtrain.nowcode == data.body[i].code){
if(toptrain.nowcode == data.body[i].code){
sockStationPass.topswitch = false
toptrain.position.x -= 1;
}

View File

@ -10,11 +10,13 @@ export function stationConnect(deviceaction,toptrain,downtrain,routegroup,passer
let start = true;
let topic = '/user/queue/simulation/passenger/'+routegroup;
let header = {'X-Token': getToken() };
this.topswitch = false;
this.downswitch = false;
socketon(topic);
// scope.socketon(topic);
function socketon(topic) {
this.socketon = function() {
start = true;
try {
scope.teststomp.subscribe(topic, callback, header);
} catch (error) {
@ -23,25 +25,25 @@ export function stationConnect(deviceaction,toptrain,downtrain,routegroup,passer
};
this.socketoff = function(topic) {
this.socketoff = function() {
start = false;
scope.teststomp.unsubscribe(topic);
};
// 仿真socket接口回调函数
function callback(Response) {
const data = JSON.parse(Response.body);
let data = JSON.parse(Response.body);
if(data.type == "PFV"){
for(let i=0;i<passerStation.stationlist.length;i++){
if(passerStation.stationlist[i].code == data.body){
// if(data.type == "PFV"){
//
// for(let i=0;i<passerStation.stationlist.length;i++){
// if(passerStation.stationlist[i].code == data.body){
// jl3d.changestation(passerStation.stationlist[i].name);
// updateValue(passerStation.stationlist[i].name);
// i = passerStation.stationlist.length;
// }
// }
//
// }
jl3d.changestation(passerStation.stationlist[i].name);
updateValue(passerStation.stationlist[i].name);
i = passerStation.stationlist.length;
}
}
}
/** 站台客流当前人数信息 */
if(data.type == "STAND_PFI"){
@ -55,7 +57,7 @@ export function stationConnect(deviceaction,toptrain,downtrain,routegroup,passer
if(passerStation.stationlist[j].topstand == newStandData[i].standCode){
// console.log(passerStation.stationlist[j]);
passerStation.stationlist[j].topspeed = newStandData[i].to;
passerStation.stationlist[j].toppassers = newStandData[i].num;
@ -89,140 +91,26 @@ export function stationConnect(deviceaction,toptrain,downtrain,routegroup,passer
if(toptrain.nowcode == data.body.code && scope.topswitch == true){
// //根据上下车人数创建人
// jl3d.updateNowLeaveData("top",data.body.out);
// setTimeout(function(){
// passerAi.passerout("top","start",data.body.in)
// }, 5000);
//根据上下车人数创建人
jl3d.updateNowLeaveData("top",data.body.out);
setTimeout(function(){
passerAi.passerout("top","start",data.body.in)
}, 5000);
}
// if(downtrain.nowcode == data.body.code && scope.downswitch == true){
// //根据上下车人数创建人
// jl3d.updateNowLeaveData("down",data.body.out);
// setTimeout(function(){
// passerAi.passerout("down","start",data.body.in);
// }, 5000);
// }
if(downtrain.nowcode == data.body.code && scope.downswitch == true){
//根据上下车人数创建人
jl3d.updateNowLeaveData("down",data.body.out);
setTimeout(function(){
passerAi.passerout("down","start",data.body.in);
}, 5000);
}
}
if(data.type == "Simulation_Reset"){
start = true;
}
//
// if(data.type == "DeviceCtrl_3D"){
// if(data.body.type == "PSD"){
//
// if(data.body.code == passerStation.nowStation.toppsd){
// if(data.body.open == 0){
//
// passerAi.passerout("top","end");
// deviceaction.top.action.reset();
// deviceaction.top.action.time =deviceaction.top.action._clip.duration;
// deviceaction.top.action.timeScale = -1;
// deviceaction.top.action.play();
//
// }else{
//
// deviceaction.top.action.reset();
// deviceaction.top.action.time = 0;
// deviceaction.top.action.timeScale = 1;
// deviceaction.top.action.play();
// }
// }
// if(data.body.code == passerStation.nowStation.downpsd){
// if(data.body.open == 0){
//
// deviceaction.down.action.reset();
// deviceaction.down.action.time = deviceaction.down.action._clip.duration;
// deviceaction.down.action.timeScale = -1;
// deviceaction.down.action.play();
// passerAi.passerout("down","end");
// }else{
//
// deviceaction.down.action.reset();
// deviceaction.down.action.time = 0;
// deviceaction.down.action.timeScale = 1;
// deviceaction.down.action.play();
// }
//
// }
// }
//
// if(data.body.type == "TRAIN_DOOR"){
//
// if(toptrain.nowcode == data.body.code){
//
// if(data.body.open == "0"){
// closetraindoor(toptrain,data.body.doorCode,"top");
//
// }else{
// opentraindoor(toptrain,data.body.doorCode,"top");
//
// }
//
// }
//
// if(downtrain.nowcode == data.body.code){
//
// if(data.body.open == "0"){
// closetraindoor(downtrain,data.body.doorCode,"down");
//
// }else{
// opentraindoor(downtrain,data.body.doorCode,"down");
//
// }
//
// }
//
// }
// }
//
// if(data.type == "TrainRun_3D"){
//
// for(let i=0,leni = data.body.length;i<leni;i++){
// if(data.body[i].section == passerStation.nowStation.topsection){
// if(toptrain.nowcode != data.body[i].code){
// toptrain.nowcode = data.body[i].code;
// topswitch = true;
// }
// toptrain.position.copy(toptrain.curve.getPointAt(data.body[i].offset));
//
//
// }else{
// if(downtrain.nowcode == data.body[i].code){
// topswitch = false
// toptrain.position.x -= 1;
// }
//
// }
//
// if(data.body[i].section == passerStation.nowStation.downsection){
// if(downtrain.nowcode != data.body[i].code){
// downtrain.nowcode = data.body[i].code;
// downswitch = true;
// }
// downtrain.position.copy(downtrain.curve.getPointAt(data.body[i].offset));
//
// }else{
// if(downtrain.nowcode == data.body[i].code){
// downswitch = false;
// downtrain.position.x += 1;
// }
//
// }
// }
// }
// if(data.type == 'Device_Load_Destroy_3D'){
// start = true;
// toptrain.nowcode = null;
// downtrain.nowcode = null;
// console.log("仿真重开=====================");
// }
//
//
// if(data.type == 'Simulation_Over') {
// store.dispatch('LogOut').then(() => {
// location.reload();
// });
// }
}

View File

@ -754,7 +754,20 @@ THREE.StationManagerControls = function ( object, domElement ,regionManager,scen
// prevents the browser from setting it automatically.
scope.domElement.focus ? scope.domElement.focus() : window.focus();
if(scope.controlMode == "Orbit"){
if(scope.controlMode == "Orbit" || scope.controlMode == "Draw"){
// if(scope.controlMode == "Orbit"){
// mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
// mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
// raycaster.setFromCamera( mouse, camera );
// intersects = raycaster.intersectObjects( scene.children,true);
// if(intersects[0]){
//
// }
// jl3dStationManagerEquipSelect(intersects[0]);
// console.log(intersects);
// }
switch ( event.button ) {
case scope.mouseButtons.RIGHT:
@ -837,7 +850,7 @@ THREE.StationManagerControls = function ( object, domElement ,regionManager,scen
transformControl.attach(scope.selectRegion.parent);
jl3dStationManagerUpdateSelectModel(scope.selectRegion.parent);
}else{
transformControl.detach(scope.selectRegion);
}
}
}
@ -859,7 +872,7 @@ THREE.StationManagerControls = function ( object, domElement ,regionManager,scen
event.preventDefault();
scope.animateswitch = true;
if(scope.controlMode == "Orbit"){
if(scope.controlMode == "Orbit" || scope.controlMode == "Draw"){
switch ( state ) {
case STATE.ROTATE:

View File

@ -79,9 +79,9 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
this.humanWaitDown = 0;
this.humanInSpeed = 0;
this.humanOutSpeed = 0;
let waitForCreatIn = [];
let waitForCreatOutTop = [];
let waitForCreatOutDown = [];
//定义相机
camerass = new THREE.PerspectiveCamera(70, dom.offsetWidth / dom.offsetHeight, 0.1, 10000);
camerass.position.set(0,300,0);
@ -162,7 +162,7 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
let passerHuman = new PasserHuman();
let passerAi = new PasserAi(sceneRegion,pathFinder,sceneRegion);
let passerAi = new PasserAi(pathFinder,sceneRegion);
this.anime = null;
@ -177,12 +177,10 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
let passerTrain = new PasserTrain();
// document.addEventListener( "mousedown", onselect, false );
console.log(skinCode);
getPublish3dMapDetail(skinCode).then(netdata3d => {
console.log("1");
passerStation.loadMaterial(netdata3d);
this.modelmanager.loadpromise(Staticmodel, scope.mixers,"2").then(function (data) {
console.log("2");
passerStation.initStationAnimation(scope.modelmanager.station.mesh,mixers,deviceaction,scene);
passerCheckDoor.initCheckDoorInAnimation(scope.modelmanager.zhajiin.mesh,mixers,deviceaction,scene);
passerCheckDoor.initCheckDoorOutAnimation(scope.modelmanager.zhajiout.mesh,mixers,deviceaction,scene);
@ -194,25 +192,20 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
monitor = scope.modelmanager.monitor.mesh;
scene.add(monitor);
getPublishMapDetail(skinCode).then(netdata => {
console.log("3");
passerHuman.initHumans(scope.modelmanager.man1.mesh,scope.modelmanager.man2.mesh);
scene.add(humanlist);
scene.add(topWaitPassers);
scene.add(downWaitPassers);
scene.add(outStationPassers);
getPublishMapDetail(skinCode).then(netdata => {
passerHuman.initHumans(scope.modelmanager.man1.mesh,scope.modelmanager.man2.mesh);
// scene.add(humanlist);
passerStation.initStationList(netdata.data.stationList,netdata.data.stationStandList,netdata.data.psdList);
sockStationPass = new stationConnect(deviceaction,passerTrain.toptrain,passerTrain.downtrain,routegroup,passerStation,passerAi,scope);
sockStation = new silumationConnect(deviceaction,passerTrain.toptrain,passerTrain.downtrain,routegroup,passerStation,passerAi,sockStationPass,scope);
store.dispatch('app/animationsClose');
let checkobject = setInterval(function(){
clearInterval(checkobject);
switchStationManagerViews();
//进站控制
startWorker();
passerWebWork.postMessage(["on"]);
@ -224,6 +217,7 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
});
this.initTrafficStart = function(){
console.log("initTrafficStart");
passerStation.initCodeStation(initCode);
scope.humanWaitTop = passerStation.nowStation.toppassers;
scope.humanWaitDown = passerStation.nowStation.downpassers;
@ -233,7 +227,7 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// passerAi.initPasser(humanlist,topWaitPassers,downWaitPassers,passerHuman,scope);
updatePasserData(humanlist.children.length,topWaitPassers.children.length,downWaitPassers.children.length,outStationPassers.children.length,passerHuman.speed);
scope.resetscene();
}
this.changestation = function(stationname){
@ -242,6 +236,7 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
scope.humanWaitTop = passerStation.nowStation.toppassers;
scope.humanWaitDown = passerStation.nowStation.downpassers;
passerHuman.speed = passerStation.nowStation.topspeed + passerStation.nowStation.downspeed;
updatePasserData(humanlist.children.length,topWaitPassers.children.length,downWaitPassers.children.length,outStationPassers.children.length,passerHuman.speed);
scope.resetscene();
@ -251,13 +246,13 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// console.log(passerStation.nowStation);
for(let i=0;i<passerStation.nowStation.topspeed;i++){
let newIn = {
overGoal:"topStand",
overGoal:"top",
};
waitForCreatIn.push(newIn);
}
for(let i=0;i<passerStation.nowStation.downspeed;i++){
let newIn = {
overGoal:"downStand",
overGoal:"down",
};
waitForCreatIn.push(newIn);
}
@ -268,28 +263,8 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
};
this.updateNowLeaveData = function(direct,outNum){
if(direct == "top"){
waitForCreatOutTop = getnum(outNum,17);
// console.log(waitForCreatOutTop);
for(let i=0;i<waitForCreatOutTop.length;i++){
for(let j=0;j<waitForCreatOutTop[i];j++){
setTimeout(function(){
// console.log(sceneRegion.list["standtop"].doorpoints[i]);
passerHuman.newHumanCreate(outStationPassers,sceneRegion.list["standtop"].doorpoints[i],5,"top",i);
}, Math.random()*1000*j);
}
}
}else{
waitForCreatOutDown = getnum(outNum,17);
for(let i=0;i<waitForCreatOutDown.length;i++){
for(let j=0;j<waitForCreatOutDown[i];j++){
setTimeout(function(){
// console.log(sceneRegion.list["standdown"].doorpoints[i]);
passerHuman.newHumanCreate(outStationPassers,sceneRegion.list["standdown"].doorpoints[i],5,"down",i);
}, Math.random()*1000*j);
}
}
}
passerHuman.leaveHumanCreate(direct,outNum,outStationPassers,sceneRegion.startRegion,sceneRegion.checkRegion,sceneRegion.standRegion);
}
this.resetscene = function(){
@ -331,8 +306,6 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// j--;
}
passerTrain.toptrain.position.y = -20000;
passerTrain.downtrain.position.y = -20000;
@ -364,15 +337,17 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// actions[an].play();
// }
setTimeout(function(){
// passerAi.initPasser(humanlist,topWaitPassers,downWaitPassers,passerHuman,scope);
passerAi.initPasser(humanlist,topWaitPassers,downWaitPassers,passerHuman,scope);
aiswitch = 0;
}, 2000);
}
let updateaianimate;
function startWorker(){
let updateaianimate = setInterval(
updateaianimate = setInterval(
function(){
// console.log("?");
if(aiswitch == 0){
@ -412,34 +387,41 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
}
, 100);
passerWebWork.onmessage = function (event) {
if(aiswitch == 0){
// console.log(humanlist.children.length);
// console.log(sceneRegion.startRegion.group.children);
this.allStationData = [];
// console.log(Math.random());
// console.log(waitForCreatIn);
if(waitForCreatIn.length>0){
let randomNum = Math.random();
let startNum = 0;
}
for(let i=0;i<sceneRegion.startRegion.group.children.length;i++){
startNum = startNum + sceneRegion.startRegion.group.children[i].startWeight;
passerWebWork.onmessage = function (event) {
if(aiswitch == 0){
// console.log(humanlist.children.length);
// console.log(sceneRegion.startRegion.group.children);
this.allStationData = [];
// console.log(Math.random());
if(randomNum<startNum){
// console.log(waitForCreatIn);
if(waitForCreatIn.length>0){
let randomNum = Math.random();
let startNum = 0;
passerHuman.newHumanCreate(humanlist,sceneRegion.startRegion.group.children[i],0,waitForCreatIn[0].overGoal);
waitForCreatIn.shift();
i = sceneRegion.startRegion.group.children.length;
}
for(let i=0;i<sceneRegion.startRegion.group.children.length;i++){
startNum = startNum + sceneRegion.startRegion.group.children[i].startWeight;
if(randomNum<startNum){
passerHuman.newHumanCreate(humanlist,sceneRegion.startRegion.group.children[i],0,waitForCreatIn[0].overGoal);
waitForCreatIn.shift();
i = sceneRegion.startRegion.group.children.length;
}
}
}
};
}
};
function closeStartWorker(){
clearInterval(updateaianimate);
}
//
// function onselect(event){
// if(event.button == '0'){
@ -459,7 +441,7 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// }
this.changeDrawType = function(drawType){
console.log(drawType);
controls.drawSwitch = true;
if(drawType == "startRegion"){
controls.drawColor = 0x2894FF;
@ -504,11 +486,28 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
this.changeControlMode = function(controlMode){
if(controlMode == false){
scope.resetscene();
controls.controlMode = "Orbit";
camerass.position.set(oldCameraPosition.x,oldCameraPosition.y,oldCameraPosition.z);
controls.target.set( oldCameraTarget.x,oldCameraTarget.y,oldCameraTarget.z);
passerStation.resetPosition(controls.drawGroup,scope.modelmanager.zhajiin.mesh,scope.modelmanager.zhajiout.mesh);
sockStationPass.socketon();
sockStation.socketon();
scene.add(humanlist);
scene.add(topWaitPassers);
scene.add(downWaitPassers);
scene.add(outStationPassers);
// startWorker();
// passerWebWork.postMessage(["on"]);
sceneRegion.resetRegionData();
aiswitch = 0;
transformControl.detach(controls.selectRegion);
// scene.remove(controls.drawGroup);
}else if(controlMode == true){
aiswitch = 1;
controls.controlMode = "Draw";
oldCameraPosition.copy(camerass.position);
oldCameraTarget.copy(controls.target);
@ -516,6 +515,16 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
// controls.target.set( 1, 0, 0 );
passerStation.apartPosition(controls.drawGroup,scope.modelmanager.zhajiin.mesh,scope.modelmanager.zhajiout.mesh);
controls.initPlaneMesh(passerStation);
sockStationPass.socketoff();
sockStation.socketoff();
scene.remove(humanlist);
scene.remove(topWaitPassers);
scene.remove(downWaitPassers);
scene.remove(outStationPassers);
// closeStartWorker();
// passerWebWork.postMessage(["off"]);
// scene.add(controls.drawGroup);
}
}
@ -532,8 +541,6 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
sceneConfig:JSON.stringify([]),
simulationConfig:JSON.stringify([]),
};
console.log(newSaveData);
// newSaveData.regionData.push();
return newSaveData;
@ -541,18 +548,16 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
this.loadData = function(data){
let regionData = JSON.parse(data.regionData);
sceneRegion.loadRegionData(regionData);
sceneRegion.loadRegionData(regionData,controls);
};
//循环渲染函数
function animate() {
render();
// console.log(passerRender);
// console.log("ss");
// if(passerRender.state == "freeview"){
controls.update();
// }
// delta = clock.getDelta();
requestAnimationFrame(animate);
@ -568,15 +573,5 @@ export function Jl3dStationManager(dom,skinCode,routegroup,initCode) {
}
function getnum(num,pnum){
let re = [];
let base = Math.floor(num/pnum);
let reset = num%pnum;
for(let i=0;i<pnum;i++){
let nownum = base+(i<reset?1:0);
re.push(nownum);
}
return re;
}
}

View File

@ -124,7 +124,7 @@ export function ModelManager(){
return new Promise(function(resolve, reject){
Promise.all(initlist).then((result) => {
console.log("success");
// console.log("success");
store.dispatch('app/animationsClose');
resolve("success"); //['成功了', 'success']
}).catch((error) => {
@ -142,8 +142,8 @@ function fbxpromise(asset,mixers,model){
if( mode == "2"){
loader.load( asset.url, function ( object ) {
model.mesh = object;
console.log(asset.type);
console.log(object);
// console.log(asset.type);
// console.log(object);
resolve(asset.deviceType);
} );

View File

@ -11,6 +11,7 @@ export function PasserHuman() {
originhuman1.progress = 1;
// scene.add(originhuman1);
originhuman2 = creatHuman();
originhuman2.progress = 1;
//
// let mixer1 = new THREE.AnimationMixer( originhuman1 );
// let mixer2 = new THREE.AnimationMixer( originhuman2 );
@ -80,12 +81,105 @@ export function PasserHuman() {
}
//创建新的乘客
this.newHumanCreate = function(humanlist,region,stage,overGoal){
this.newHumanCreate = function(humanlist,region,stage,overGoal,nowGoal){
let newhuman;
createHumanModel(newhuman,humanlist,region,stage,overGoal);
createHumanModel(newhuman,humanlist,region,stage,overGoal,nowGoal);
}
function createHumanModel(newhuman,humanlist,region,stage,overGoal){
this.newInitHumanCreate = function(humanlist,pos,overGoal,nowGoal,standDoorNum){
let newhuman;
newhuman = originhuman1.clone();
newhuman.position.copy(pos);
if(overGoal){
if(overGoal == "top"){
newhuman.rotation.y = Math.PI;
}
newhuman.overGoal = overGoal;
}
newhuman.standDoorNum = standDoorNum;
newhuman.status = "0";
if(nowGoal){
newhuman.nowGoal = nowGoal;
}
//年龄
newhuman.age = null;
//性别
newhuman.gender = "";
//身体状态
newhuman.bodyStatus = "";
newhuman.runrail = null;
newhuman.speed = 0;
humanlist.add(newhuman);
};
let waitForCreatOutTop = [];
let waitForCreatOutDown = [];
this.leaveHumanCreate = function(direct,outNum,outStationPassers,startRegion,checkRegion,standRegion){
if(direct == "top"){
waitForCreatOutTop = getnum(outNum,standRegion.belongList["top"].length-1);
// console.log(waitForCreatOutTop);
for(let i=0;i<waitForCreatOutTop.length;i++){
for(let j=0;j<waitForCreatOutTop[i];j++){
setTimeout(function(){
// console.log(sceneRegion.list["standtop"].doorpoints[i]);
createLeaveHumanModel(outStationPassers,standRegion.belongList["top"][i].position,startRegion);
}, Math.random()*1000*j);
}
}
}else{
waitForCreatOutDown = getnum(outNum,standRegion.belongList["down"].length-1);
for(let i=0;i<waitForCreatOutDown.length;i++){
for(let j=0;j<waitForCreatOutDown[i];j++){
setTimeout(function(){
// console.log(sceneRegion.list["standdown"].doorpoints[i]);
createLeaveHumanModel(outStationPassers,standRegion.belongList["down"][i].position,startRegion);
}, Math.random()*1000*j);
}
}
}
};
function createLeaveHumanModel(humanlist,pos,startRegion){
let newhuman;
newhuman = originhuman1.clone();
newhuman.position.copy(pos);
newhuman.status = "0";
//年龄
newhuman.age = null;
//性别
newhuman.gender = "";
//身体状态
newhuman.bodyStatus = "";
newhuman.runrail = null;
newhuman.speed = 0;
let randomNum = Math.random();
let endNum = 0;
for(let i=0;i<startRegion.group.children.length;i++){
endNum = endNum + startRegion.group.children[i].endWeight;
if(randomNum<endNum){
newhuman.overGoal = i;
newhuman.nowGoal = "findeCheck";
newhuman.connectCheckRegion = startRegion.group.children[i].connectCheckRegion;
i = startRegion.group.children.length;
}
}
humanlist.add(newhuman);
}
function createHumanModel(newhuman,humanlist,region,stage,overGoal,nowGoal){
let mantype = Math.floor(Math.random()*(3-1+1))+1;
if(mantype == 1){
@ -107,16 +201,20 @@ export function PasserHuman() {
newhuman.overGoal = overGoal;
}
newhuman.status = 0;
let goalRandom = Math.random();
if(goalRandom<region.targetWeight){
newhuman.nowGoal = "ticketRegion";
newhuman.standDoorNum = "";
newhuman.status = "0";
if(nowGoal){
newhuman.nowGoal = nowGoal;
}else{
newhuman.nowGoal = "securityRegion";
let goalRandom = Math.random();
if(goalRandom<region.targetWeight){
newhuman.nowGoal = "ticketRegion";
}else{
newhuman.nowGoal = "securityRegion";
}
}
//年龄
newhuman.age = null;
//性别
@ -134,7 +232,7 @@ export function PasserHuman() {
}
//定义新模型走路动画
this.initMoveAnimate = function(model,name,points,index){
model.status = 1;
model.status = "1";
let curve = new THREE.CatmullRomCurve3(points);
curve.curvrtype = "catmullrom";
// curve.getLength();
@ -158,23 +256,20 @@ export function PasserHuman() {
// outStationPassers.children[i].action.stop();
outStationPassers.children[i].status = 0;
if(outStationPassers.children[i].stage == 8){
if(outStationPassers.children[i].nowGoal == "outStation"){
passerHuman.uncache(outStationPassers.children[i]);
outStationPassers.remove(outStationPassers.children[i]);
i--;
}else if(outStationPassers.children[i].stage == 7){
outStationPassers.children[i].stage = 8;
}else if(outStationPassers.children[i].nowGoal == "outCheck"){
outStationPassers.children[i].nowGoal = "outStation";
}
else if(outStationPassers.children[i].stage == 5){
else if(outStationPassers.children[i].nowGoal == "findeCheck"){
outStationPassers.children[i].stage = 7;
outStationPassers.children[i].nowGoal = "outCheck";
}
}else{
//根据动画进度获取动画轨迹上点
// console.log(i);
// console.log(humanlist.children[i].runrail);
// console.log(humanlist.children[i].progress);
let point = outStationPassers.children[i].runrail.getPointAt(outStationPassers.children[i].progress);
//更新模型坐标
@ -194,13 +289,14 @@ export function PasserHuman() {
}
for(let i=0;i<topWaitPassers.children.length;i++){
if(topWaitPassers.children[i].status == 1){
if(topWaitPassers.children[i].status == "1"){
if(topWaitPassers.children[i].progress>=1){
topWaitPassers.children[i].progress = 1;
// topWaitPassers.children[i].action.stop();
topWaitPassers.children[i].status = 0;
topWaitPassers.children[i].status = "0";
if(topWaitPassers.children[i].stage == 4){
if(topWaitPassers.children[i].nowGoal == "waitingTrain"){
passerHuman.uncache(topWaitPassers.children[i]);
topWaitPassers.remove(topWaitPassers.children[i]);
i--;
@ -229,12 +325,13 @@ export function PasserHuman() {
}
for(let i=0;i<downWaitPassers.children.length;i++){
if(downWaitPassers.children[i].status == 1){
if(downWaitPassers.children[i].status == "1"){
if(downWaitPassers.children[i].progress>=1){
downWaitPassers.children[i].progress = 1;
// downWaitPassers.children[i].action.stop();
downWaitPassers.children[i].status = 0;
if(downWaitPassers.children[i].stage == 4){
downWaitPassers.children[i].status = "0";
if(downWaitPassers.children[i].nowGoal == "waitingTrain"){
passerHuman.uncache(downWaitPassers.children[i]);
downWaitPassers.remove(downWaitPassers.children[i]);
i--;
@ -263,42 +360,42 @@ export function PasserHuman() {
}
for(let i=0;i<humanlist.children.length;i++){
if(humanlist.children[i].status == 1){
if(humanlist.children[i].status == "1"){
if(humanlist.children[i].progress>=1){
//更新模型坐标
if(humanlist.children[i].status == 1){
humanlist.children[i].progress = 1;
// humanlist.children[i].action.stop();
humanlist.children[i].status = "0";
humanlist.children[i].progress = 1;
// humanlist.children[i].action.stop();
humanlist.children[i].status = 0;
if(humanlist.children[i].stage == 3){
if(humanlist.children[i].nowGoal == "standRegion"){
humanlist.children[i].stage = 4;
if(humanlist.children[i].direct == "top"){
humanlist.children[i].nowGoal = "waitingTrain";
if(humanlist.children[i].overGoal == "top"){
topWaitPassers.add(humanlist.children[i]);
i--;
}else if(humanlist.children[i].direct == "down"){
}else if(humanlist.children[i].overGoal == "down"){
downWaitPassers.add(humanlist.children[i]);
i--;
}
}else if(humanlist.children[i].stage == 2){
humanlist.children[i].stage = 3;
}else if(humanlist.children[i].nowGoal == "inCheck"){
humanlist.children[i].nowGoal = "standRegion";
}else if(humanlist.children[i].stage == 1){
}else if(humanlist.children[i].nowGoal == "checkRegion"){
humanlist.children[i].nowGoal = "inCheck";
}else if(humanlist.children[i].nowGoal == "securityRegion"){
humanlist.children[i].stage = 2;
humanlist.children[i].nowGoal = "checkRegion";
}else if(humanlist.children[i].stage == 0){
}else if(humanlist.children[i].nowGoal == "ticketRegion"){
// // console.log(humans[i].doors);
// zhajiin[humanlist.children[i].doors].waiting = 0;
humanlist.children[i].stage = 1;
humanlist.children[i].nowGoal = "securityRegion";
}
}
}else{
//根据动画进度获取动画轨迹上点
// console.log(i);
@ -334,4 +431,16 @@ export function PasserHuman() {
} );
}
}
function getnum(num,pnum){
let re = [];
let base = Math.floor(num/pnum);
let reset = num%pnum;
for(let i=0;i<pnum;i++){
let nownum = base+(i<reset?1:0);
re.push(nownum);
}
return re;
}
}

View File

@ -203,8 +203,7 @@ export function PasserStation() {
this.apartPosition = function(drawGroup,zhajiin,zhajiout){
// scope.down.position.y = scope.top.position.y;
console.log(zhajiin);
console.log(zhajiout);
scope.top.position.z += 75;
scope.down.position.z -= 75;
zhajiin.position.z -= 75;

View File

@ -2,15 +2,17 @@ export function checkRegion(data) {
var scope = this;
this.group = new THREE.Group();
this.belongList = [];
this.creatCheckRegion = function(regionType,regionColor,pos,underFloor){
let newRegion = creatRegion(regionColor);
newRegion.regionType = regionType;
newRegion.deviceType = "region";
newRegion.status = "1";
newRegion.checkDirection = "in";
newRegion.checkBelong = "1";
//连接设备
newRegion.connectDevice = "*";
newRegion.inCheckPoints = [];
newRegion.position.set(
pos.x,
pos.y+0.1,
@ -22,6 +24,7 @@ export function checkRegion(data) {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x9F35FF);
@ -33,6 +36,8 @@ export function checkRegion(data) {
newRegion.status = regionData[i].status;
newRegion.underFloor = regionData[i].underFloor;
newRegion.checkDirection = regionData[i].checkDirection;
newRegion.checkBelong = regionData[i].checkBelong;
newRegion.inCheckPoints = [];
newRegion.position.set(
regionData[i].pos.x,
regionData[i].pos.y,
@ -49,19 +54,51 @@ export function checkRegion(data) {
}
}
this.resetRegionData = function(){
scope.belongList = [];
scope.belongList["in"] = [];
scope.belongList["out"] = [];
for(let i=0;i<scope.group.children.length;i++){
scope.group.children[i].actionIndex = i;
if(scope.group.children[i].checkDirection == "in"){
if(!scope.belongList["in"].hasOwnProperty(scope.group.children[i].checkBelong)){
scope.belongList["in"][scope.group.children[i].checkBelong] = [];
}
}
if(scope.group.children[i].checkDirection == "out"){
if(!scope.belongList["out"].hasOwnProperty(scope.group.children[i].checkBelong)){
scope.belongList["out"][scope.group.children[i].checkBelong] = [];
}
}
}
for(let i=0;i<scope.group.children.length;i++){
if(scope.group.children[i].checkDirection == "in"){
scope.belongList["in"][scope.group.children[i].checkBelong].push(scope.group.children[i]);
}
if(scope.group.children[i].checkDirection == "out"){
scope.belongList["out"][scope.group.children[i].checkBelong].push(scope.group.children[i]);
}
}
}
function creatRegion(color){
let region = new THREE.Group();
var geometry = new THREE.PlaneBufferGeometry( 2, 2, 4 );
var material = new THREE.MeshBasicMaterial( { color: color } );
let regionHead = new THREE.Mesh( geometry, material );
regionHead.name = "regionHead";
regionHead.rotation.x = -Math.PI/2;
regionHead.position.y = 0.01;
region.add(regionHead);
var geom = new THREE.Geometry();
var v1 = new THREE.Vector3(1,-1,0);
var v2 = new THREE.Vector3(-1,-1,0);
var v3 = new THREE.Vector3(0,-2,0);
var v1 = new THREE.Vector3(1,0,0);
var v2 = new THREE.Vector3(-1,0,0);
var v3 = new THREE.Vector3(0,-1,0);
geom.vertices.push(v1);
@ -73,8 +110,11 @@ export function checkRegion(data) {
var material = new THREE.MeshBasicMaterial( { color: color } );
var regionDirect= new THREE.Mesh(geom, material);
regionDirect.name = "regionDirect";
regionDirect.rotation.x = -Math.PI/2;
regionDirect.position.y = 0.01;
regionDirect.position.z = 5;
region.add(regionDirect);
return region;
@ -85,29 +125,16 @@ export function checkRegion(data) {
//出口闸机组
this.zhajiout = [];
//定义闸机状态
for(let i=0;i<5;i++){
let zhaji = {
id:"in0"+(i+1),
status:0,
waiting:0
}
scope.zhajiin.push(zhaji);
}
for(let i=0;i<5;i++){
let zhaji = {
id:"out0"+(i+1),
status:0,
waiting:0
}
scope.zhajiout.push(zhaji);
}
//初始化闸机动画
this.initCheckDoorInAnimation = function(object,mixers ,deviceaction ,scene){
let mixer = new THREE.AnimationMixer( object );
let newclip = object.animations[ 0 ];
let newzhaji = object;
for(let i=0;i<newzhaji.children.length;i++){
if(newzhaji.children[i].name == "in01"){
if(newzhaji.children[i].children.length>0){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
@ -123,77 +150,17 @@ export function checkRegion(data) {
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "in02"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "in03"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "in04"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "in05"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
let zhaji = {
id:newzhaji.children[i].name,
status:0,
waiting:0
}
scope.zhajiin.push(zhaji);
}
}
scene.add(newzhaji);
}
@ -202,22 +169,10 @@ export function checkRegion(data) {
let mixer = new THREE.AnimationMixer( object );
let newclip = object.animations[ 0 ];
let newzhaji = object;
for(let i=0;i<newzhaji.children.length;i++){
if(newzhaji.children[i].name == "out01"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "out02"){
if(newzhaji.children[i].children.length>0){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
@ -233,74 +188,30 @@ export function checkRegion(data) {
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
let zhaji = {
id:newzhaji.children[i].name,
status:0,
waiting:0
}
scope.zhajiout.push(zhaji);
}
if(newzhaji.children[i].name == "out03"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "out04"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
if(newzhaji.children[i].name == "out05"){
newzhaji.children[i].animations = [];
newzhaji.children[i].animations.push(newclip.clone());
let mixer = new THREE.AnimationMixer( newzhaji.children[i] );
let action =mixer.clipAction( newzhaji.children[i].animations[0]);
action.setLoop(THREE.LoopOnce);
action.clampWhenFinished = true;
mixers.push(mixer);
let device = {
action:action,
mixer:mixer,
};
deviceaction[object.children[i].name] = device;
}
}
scene.add(newzhaji);
}
//闸机动画控制
this.checkDoorControl = function(type,door,deviceaction){
let devicenum = door;
let checkDoorId = door;
console.log();
if(type == "in"){
let checkDoorId = scope.zhajiin[devicenum].id;
// let checkDoorId = scope.zhajiin[devicenum].id;
deviceaction[checkDoorId].action.reset();
deviceaction[checkDoorId].action.time = 0;
deviceaction[checkDoorId].action.timeScale = 1;
deviceaction[checkDoorId].action.play();
}else if(type == "out"){
let checkDoorId = scope.zhajiout[devicenum].id;
// let checkDoorId = scope.zhajiout[devicenum].id;
deviceaction[checkDoorId].action.reset();
deviceaction[checkDoorId].action.time = 0;
deviceaction[checkDoorId].action.timeScale = 1;

View File

@ -23,6 +23,7 @@ export function elevatorRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0xFFFF37);

View File

@ -23,6 +23,7 @@ export function escalatorRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x5CADAD);

View File

@ -28,6 +28,7 @@ export function securityRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0xFF0000);

View File

@ -23,6 +23,7 @@ export function stairsRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0xFF5809);

View File

@ -4,6 +4,7 @@ export function standRegion() {
this.list = [];
this.group = new THREE.Group();
this.belongList = [];
this.creatStandRegion = function(regionType,regionColor,pos,underFloor){
let newRegion = creatRegion(regionColor);
@ -13,6 +14,8 @@ export function standRegion() {
newRegion.status = "1";
//连接设备
newRegion.connectDevice = "*";
newRegion.standBelong = "1";
//区域方向
if(pos.z < 87.85){
newRegion.direction = "top";
@ -32,6 +35,7 @@ export function standRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x00EC00);
@ -42,7 +46,7 @@ export function standRegion() {
newRegion.direction = regionData[i].direction;
newRegion.status = regionData[i].status;
newRegion.underFloor = regionData[i].underFloor;
newRegion.standBelong = regionData[i].standBelong;
newRegion.position.set(
regionData[i].pos.x,
regionData[i].pos.y,
@ -59,6 +63,21 @@ export function standRegion() {
}
}
this.resetRegionData = function(){
scope.belongList = [];
scope.belongList["top"] = [];
scope.belongList["down"] = [];
for(let i=0;i<scope.group.children.length;i++){
if(scope.group.children[i].direction == "top"){
scope.belongList["top"].push(scope.group.children[i]);
}
if(scope.group.children[i].direction == "down"){
scope.belongList["down"].push(scope.group.children[i]);
}
}
}
function creatRegion(color){
let region = new THREE.Group();
var geometry = new THREE.PlaneBufferGeometry( 2, 2, 4 );

View File

@ -19,7 +19,7 @@ export function startRegion() {
newRegion.targetWeight = "%";
//区域状态
newRegion.status = "1";
newRegion.connectCheckRegion = "";
newRegion.position.set(
pos.x,
pos.y+0.1,
@ -30,7 +30,32 @@ export function startRegion() {
scope.group.add(newRegion);
};
this.connectCheckRegion = function(checkRegion){
for(let i=0;i<scope.group.children.length;i++){
let distanceArray = [];
for(let k in checkRegion.belongList["out"]){
var pos1 = scope.group.children[i].position;
var pos2 = checkRegion.belongList["out"][k][0].position;
var distance = pos1.distanceTo(pos2);
distanceArray.push(
{
index:k,
distance:distance
}
);
}
distanceArray.sort(function(a, b){
return a.distance - b.distance;
});
scope.group.children[i].connectCheckRegion = distanceArray[0].index;
}
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x2894FF);
@ -46,7 +71,7 @@ export function startRegion() {
//区域状态
newRegion.status = regionData[i].status;
newRegion.underFloor = regionData[i].underFloor;
newRegion.connectCheckRegion = "";
newRegion.position.set(
regionData[i].pos.x,
regionData[i].pos.y,
@ -61,7 +86,7 @@ export function startRegion() {
scope.group.add(newRegion);
}
}
}
};
function creatRegion(color){
let region = new THREE.Group();

View File

@ -4,8 +4,9 @@ export function ticketRegion() {
this.list = [];
this.group = new THREE.Group();
this.belongList = [];
this.creatTicketRegion = function(regionType,regionColor,pos,underFloor){
let newRegion = creatRegion(regionColor);
newRegion.regionType = regionType;
newRegion.deviceType = "region";
@ -18,6 +19,7 @@ export function ticketRegion() {
newRegion.connectDevice = "*";
//运行状态
newRegion.runType = "auto";
newRegion.ticketBelong = "1";
newRegion.position.set(
pos.x,
pos.y+0.1,
@ -29,6 +31,7 @@ export function ticketRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x00FFFF);
@ -41,6 +44,7 @@ export function ticketRegion() {
newRegion.stayTime = regionData[i].stayTime;
newRegion.status = regionData[i].status;
newRegion.underFloor = regionData[i].underFloor;
newRegion.ticketBelong = regionData[i].ticketBelong;
newRegion.position.set(
regionData[i].pos.x,
@ -58,6 +62,16 @@ export function ticketRegion() {
}
}
this.resetRegionData = function(){
scope.belongList = [];
for(let i=0;i<scope.group.children.length;i++){
scope.belongList[scope.group.children[i].ticketBelong] = [];
}
for(let i=0;i<scope.group.children.length;i++){
scope.belongList[scope.group.children[i].ticketBelong].push(scope.group.children[i]);
}
}
function creatRegion(color){
let region = new THREE.Group();
var geometry = new THREE.PlaneBufferGeometry( 2, 2, 4 );

View File

@ -21,6 +21,7 @@ export function unaccessRegion() {
};
this.loadRegionData = function(regionData){
scope.group = new THREE.Group();
if(regionData.length>0){
for(let i=0;i<regionData.length;i++){
let newRegion = creatRegion(0x272727);

View File

@ -41,6 +41,29 @@ export function regionManager() {
control.drawGroup.add(scope.unaccessRegion.group);
}
this.getstandposition = function(name){
let n = Math.floor(Math.random() * (scope.standRegion.belongList[name].length-1));
let randompoint = new THREE.Vector3(0,scope.standRegion.belongList[name][n].position.y+0.1,0);
if(name == "top"){
randompoint.x = scope.standRegion.belongList[name][n].position.x + Math.random()*3;
randompoint.z = scope.standRegion.belongList[name][n].position.z +4+Math.random()*5;
}
if(name == "down"){
randompoint.x = scope.standRegion.belongList[name][n].position.x + Math.random()*3;
randompoint.z = scope.standRegion.belongList[name][n].position.z -4-Math.random()*5;
}
let standdata = {
standDoorNum:n,
point:randompoint
};
return standdata;
}
this.creatRegion = function(regionType,regionColor,pos,underFloor){
switch(regionType){
case "startRegion":
@ -136,6 +159,7 @@ export function regionManager() {
connectDevice:scope.checkRegion.group.children[i].connectDevice,
underFloor:scope.checkRegion.group.children[i].underFloor,
checkDirection:scope.checkRegion.group.children[i].checkDirection,
checkBelong:scope.checkRegion.group.children[i].checkBelong,
pos:{
x:scope.checkRegion.group.children[i].position.x,
@ -155,6 +179,7 @@ export function regionManager() {
status:scope.standRegion.group.children[i].status,
direction:scope.standRegion.group.children[i].direction,
underFloor:scope.standRegion.group.children[i].underFloor,
standBelong:scope.standRegion.group.children[i].standBelong,
pos:{
x:scope.standRegion.group.children[i].position.x,
y:scope.standRegion.group.children[i].position.y,
@ -175,6 +200,7 @@ export function regionManager() {
runType:scope.ticketRegion.group.children[i].runType,
connectDevice:scope.ticketRegion.group.children[i].connectDevice,
underFloor:scope.ticketRegion.group.children[i].underFloor,
ticketBelong:scope.ticketRegion.group.children[i].ticketBelong,
pos:{
x:scope.ticketRegion.group.children[i].position.x,
y:scope.ticketRegion.group.children[i].position.y,
@ -263,8 +289,16 @@ export function regionManager() {
};
//读取区域数据
this.loadRegionData = function(data){
console.log(data);
this.loadRegionData = function(data,control){
control.drawGroup.remove(scope.startRegion.group);
control.drawGroup.remove(scope.securityRegion.group);
control.drawGroup.remove(scope.checkRegion.group);
control.drawGroup.remove(scope.standRegion.group);
control.drawGroup.remove(scope.ticketRegion.group);
control.drawGroup.remove(scope.elevatorRegion.group);
control.drawGroup.remove(scope.stairsRegion.group);
control.drawGroup.remove(scope.escalatorRegion.group);
control.drawGroup.remove(scope.unaccessRegion.group);
scope.startRegion.loadRegionData(data.startRegion);
scope.securityRegion.loadRegionData(data.securityRegion);
scope.checkRegion.loadRegionData(data.checkRegion);
@ -274,8 +308,24 @@ export function regionManager() {
scope.stairsRegion.loadRegionData(data.stairsRegion);
scope.escalatorRegion.loadRegionData(data.escalatorRegion);
scope.unaccessRegion.loadRegionData(data.unaccessRegion);
control.drawGroup.add(scope.startRegion.group);
control.drawGroup.add(scope.securityRegion.group);
control.drawGroup.add(scope.checkRegion.group);
control.drawGroup.add(scope.standRegion.group);
control.drawGroup.add(scope.ticketRegion.group);
control.drawGroup.add(scope.elevatorRegion.group);
control.drawGroup.add(scope.stairsRegion.group);
control.drawGroup.add(scope.escalatorRegion.group);
control.drawGroup.add(scope.unaccessRegion.group);
};
this.resetRegionData = function(){
scope.checkRegion.resetRegionData();
scope.standRegion.resetRegionData();
scope.ticketRegion.resetRegionData();
scope.startRegion.connectCheckRegion(scope.checkRegion);
}
//获取区域范围内点
this.getInitPos = function(name){

View File

@ -1,6 +1,6 @@
export function PasserAi(zone,finder,region) {
export function PasserAi(finder,region) {
let scope = this;
//下车控制开关
@ -9,67 +9,62 @@ export function PasserAi(zone,finder,region) {
//上车控制开关
this.toppasserin = false;
this.downpasserin = false;
let passerZone = zone;
this.toppasserinNum = 0;
this.downpasserinNum = 0;
let passerZone = region;
let pathFinder = finder;
let path;
let playerPosition = new THREE.Vector3( -3.5, 0.5, 5.5 );
let targetPosition = new THREE.Vector3();
let target= null;
//生成下车出站人物
this.passerout = function(direct){
// console.log(direct);
this.passerout = function(direct,mode,inNum){
if(direct == "top"){
// console.log("toppasser");
scope.toppasseron = true;
setTimeout(function(){
scope.toppasseron = false
if(mode == "start"){
scope.toppasseron = true;
scope.toppasserin = true;
scope.toppasserinNum = inNum;
}
if(mode == "end"){
scope.toppasseron = false
scope.toppasserin = false;
}
setTimeout(function(){
scope.toppasserin = false;
}, 20000);
}, 5000);
}
if(direct == "down"){
// console.log("downpasser");
scope.downpasseron = true;
setTimeout(function(){
scope.downpasseron = false;
if(mode == "start"){
scope.downpasseron = true;
scope.downpasserin = true;
setTimeout(function(){
scope.downpasserin = false;
}, 20000);
}, 5000);
scope.downpasserinNum = inNum;
}
if(mode == "end"){
scope.downpasseron = false;
scope.downpasserin = false;
}
}
}
//初始化加载人物
this.initPasser = function(humanlist,passerHuman){
for(let i=0;i<3;i++){
passerHuman.newHumanCreate(humanlist,passerZone.getinitposition("enter1"),0);
}
for(let i=0;i<3;i++){
passerHuman.newHumanCreate(humanlist,passerZone.getinitposition("enter2"),0);
}
for(let i=0;i<3;i++){
passerHuman.newHumanCreate(humanlist,passerZone.getinitposition("security"),1);
}
// for(let i=0;i<2;i++){
// // passerHuman.newHumanCreate(humanlist,passerZone.getinitposition("entergate"),3);
// }
for(let i=0;i<6;i++){
let standdata = passerZone.getstandposition("standtop");
passerHuman.newHumanCreate(humanlist,standdata.point,4,"top",standdata.door);
}
for(let i=0;i<6;i++){
let standdata = passerZone.getstandposition("standdown");
passerHuman.newHumanCreate(humanlist,standdata.point,4,"down",standdata.door);
}
//初始化加载人物
this.initPasser = function(humanlist,topWaitPassers,downWaitPassers,passerHuman,jl3d){
for(let i=0;i<jl3d.humanWaitTop;i++){
let standdata = passerZone.getstandposition("top");
passerHuman.newInitHumanCreate(topWaitPassers,standdata.point,"top","waitingTrain",standdata.standDoorNum);
}
for(let i=0;i<jl3d.humanWaitDown;i++){
let standdata = passerZone.getstandposition("down");
passerHuman.newInitHumanCreate(downWaitPassers,standdata.point,"down","waitingTrain",standdata.standDoorNum);
}
}
function shortDistanceRegion(startPos,endRegion){
let shortDistancePos = "";
let distanceArray = [];
for(let i=0;i<endRegion.length;i++){
var pos1 = startPos;
@ -83,231 +78,296 @@ export function PasserAi(zone,finder,region) {
);
}
distanceArray.sort(function(a, b){
return a.distance - b.distance;
});
return distanceArray[0].pos;
}
function shortTicketRegion(startPos,endRegion){
let distanceArray = [];
for(let k in endRegion.belongList){
var pos1 = startPos;
var pos2 = endRegion.belongList[k][0].position;
var distance = pos1.distanceTo(pos2);
distanceArray.push(
{
ticketBelong:k,
distance:distance
}
);
}
distanceArray.sort(function(a, b){
return a.distance - b.distance;
});
return distanceArray[0].pos;
let index = Math.floor(Math.random() * (endRegion.belongList[distanceArray[0].ticketBelong].length-1));
return endRegion.belongList[distanceArray[0].ticketBelong][index].position;
}
// let outCheckNum = 0;
// if(checkType == "out"){
//
// for(let i=0;i<endRegion.length;i++){
// if(endRegion[i].checkDirection == "out"){
// var pos1 = startPos;
// var pos2 = endRegion[i].position;
// var distance = pos1.distanceTo(pos2);
// distanceArray.push(
// {
// pos:endRegion[i].position,
// distance:distance
// }
// );
// }
// }
// }
function selectInCheckRegion(startPos,endRegion,checkType){
let shortDistancePos = "";
let distanceArray = [];
for(let k in endRegion.belongList[checkType]){
var pos1 = startPos;
var pos2 = endRegion.belongList[checkType][k][0].position;
var distance = pos1.distanceTo(pos2);
distanceArray.push(
{
checkBelong:k,
distance:distance
}
);
}
distanceArray.sort(function(a, b){
return a.distance - b.distance;
});
let index = Math.floor(Math.random() * (endRegion.belongList[checkType][distanceArray[0].checkBelong].length-1));
return {
pos:endRegion.belongList[checkType][distanceArray[0].checkBelong][index].position,
checkDoorNum:endRegion.belongList[checkType][distanceArray[0].checkBelong][index].actionIndex,
};
}
function shortStandRegion(startPos,endRegion,standType){
let shortDistancePos = "";
// console.log(standType);
// console.log(endRegion.belongList);
let index = Math.floor(Math.random() * (endRegion.belongList[standType].length-1));
return {
pos:endRegion.belongList[standType][index].position,
standDoorNum:index,
};
}
//人物站台阶段更新
this.aiUpdate = function(humanlist,topWaitPassers,downWaitPassers,outStationPassers,passerHuman,passerCheckDoor,deviceaction){
console.log(humanlist.children);
for(let i=0;i<humanlist.children.length;i++){
// console.log(humans[i]);
if(humanlist.children[i].overGoal == "topStand" || humanlist.children[i].overGoal == "downStand"){
console.log(humanlist.children[i]);
if(humanlist.children[i].status == 0){
if(humanlist.children[i].nowGoal == "ticketRegion"){
let points = [];
points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
for(let i=0;i<outStationPassers.children.length;i++){
if(outStationPassers.children[i].status == 0){
//stage = 5 下车
if(outStationPassers.children[i].nowGoal == "findeCheck"){
let points = [];
points.push(new THREE.Vector3(outStationPassers.children[i].position.x,outStationPassers.children[i].position.y,outStationPassers.children[i].position.z));
//寻找最近售票机点
targetPosition = shortDistanceRegion(humanlist.children[i].position,region.ticketRegion.group.children);
console.log(targetPosition);
//寻路售票机
path = pathFinder.find(points[0],targetPosition);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
}
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
let index = Math.floor(Math.random() * (region.checkRegion.belongList["out"][outStationPassers.children[i].connectCheckRegion].length-1));
//寻找最近售票机点
targetPosition = region.checkRegion.belongList["out"][outStationPassers.children[i].connectCheckRegion][index].position;
outStationPassers.children[i].checkDoor = region.checkRegion.belongList["out"][outStationPassers.children[i].connectCheckRegion][index].actionIndex;
//寻路售票机
path = pathFinder.find(points[0],targetPosition);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.1,path[i].z));
}
passerHuman.initMoveAnimate(outStationPassers.children[i],i,points,i);
}
if(humanlist.children[i].nowGoal == "securityRegion"){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// targetPosition = passerZone.getzoneposition("security");
//
// path = pathFinder.find(points[0],targetPosition);
//
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// // console.log(path);
// }
//stage = 7 出闸机
if(outStationPassers.children[i].nowGoal == "outCheck"){
let points = [];
points.push(region.checkRegion.group.children[outStationPassers.children[i].checkDoor].getObjectByName("regionHead").getWorldPosition(new THREE.Vector3()));
points.push(region.checkRegion.group.children[outStationPassers.children[i].checkDoor].getObjectByName("regionDirect").getWorldPosition(new THREE.Vector3()));
passerCheckDoor.checkDoorControl("out",region.checkRegion.group.children[outStationPassers.children[i].checkDoor].connectDevice,deviceaction);
passerHuman.initMoveAnimate(outStationPassers.children[i],i,points,i);
}
//stage = 8 出站
if(outStationPassers.children[i].nowGoal == "outStation"){
let points = [];
points.push(new THREE.Vector3(outStationPassers.children[i].position.x,outStationPassers.children[i].position.y,outStationPassers.children[i].position.z));
//寻找最近售票机点
targetPosition = region.startRegion.group.children[outStationPassers.children[i].overGoal].position;
//寻路售票机
path = pathFinder.find(points[0],targetPosition);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.1,path[i].z));
}
passerHuman.initMoveAnimate(outStationPassers.children[i],i,points,i);
}
}
}
// console.log(humanlist.children);
if(scope.toppasserinNum >0){
for(let i=0;i<topWaitPassers.children.length;i++){
if(topWaitPassers.children[i].status == "0"){
//stage = 4 上车
if(topWaitPassers.children[i].nowGoal == "waitingTrain"){
if(scope.toppasserin && topWaitPassers.children[i].overGoal == "top"){
let points = [];
points.push(new THREE.Vector3(topWaitPassers.children[i].position.x,topWaitPassers.children[i].position.y,topWaitPassers.children[i].position.z));
let doorPos = region.standRegion.belongList["top"][topWaitPassers.children[i].standDoorNum].position;
// doorPos.z += 3;
// doorPos.y += 0.1;
points.push(new THREE.Vector3(doorPos.x,doorPos.y+0.1,doorPos.z-3));
if(points[1] == undefined){
}else{
scope.toppasserinNum -= 1;
passerHuman.initMoveAnimate(topWaitPassers.children[i],i,points,i);
}
}
}
}
}
}
if(scope.downpasserinNum >0){
for(let i=0;i<downWaitPassers.children.length;i++){
if(downWaitPassers.children[i].status == "0"){
//stage = 4 上车
if(downWaitPassers.children[i].nowGoal == "waitingTrain"){
if(scope.downpasserin && downWaitPassers.children[i].overGoal == "down"){
let points = [];
points.push(new THREE.Vector3(downWaitPassers.children[i].position.x,downWaitPassers.children[i].position.y,downWaitPassers.children[i].position.z));
let doorPos = region.standRegion.belongList["down"][downWaitPassers.children[i].standDoorNum].position;
points.push(new THREE.Vector3(doorPos.x,doorPos.y+0.1,doorPos.z+3));
if(points[1] == undefined){
}else{
scope.downpasserinNum -= 1;
passerHuman.initMoveAnimate(downWaitPassers.children[i],i,points,i);
}
}
}
}
}
// if(humanlist.children[i].status == 0){
// //stage = 0 进入车站
// if(humanlist.children[i].stage == 0){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// targetPosition = passerZone.getzoneposition("security");
//
// path = pathFinder.find(points[0],targetPosition);
//
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// // console.log(path);
// }
//
// //stage = 1 前往进站闸机
// if(humanlist.children[i].stage == 1){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// targetPosition = passerZone.getgateposition("entergate");
//
// path = pathFinder.find(points[0],targetPosition.point);
//
// humanlist.children[i].door = targetPosition.door;
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
//
// //stage = 2 过闸机
// if(humanlist.children[i].stage == 2){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z-5));
//
// passerCheckDoor.checkDoorControl("in",humanlist.children[i].door,deviceaction)
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
//
// //stage = 3 前往站台
// if(humanlist.children[i].stage == 3){
//
// let direct = Math.floor(Math.random()*(2))+1;
// // console.log(direct);
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
// // points.push(new THREE.Vector3(11.81,9.8,13.11));
//
// //1--top
// //2-- down
// if(direct == 1){
// targetPosition = passerZone.getstandposition("standtop");
// path = pathFinder.find(points[0],targetPosition.point);
// humanlist.children[i].direct = "top";
// }else{
// targetPosition = passerZone.getstandposition("standdown");
// path = pathFinder.find(points[0],targetPosition.point);
// humanlist.children[i].direct = "down";
// }
// if(path[0].y<9.84){
// points.push(new THREE.Vector3(11.81,9.8,13.11));
// points.push(new THREE.Vector3(29.5,1.77,13.16));
//
// }
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// humanlist.children[i].door = targetPosition.door;
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
//
// //stage = 4 上车
// if(humanlist.children[i].stage == 4){
// if(scope.toppasserin && humanlist.children[i].direct == "top"){
//
//
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// points.push(passerZone.list["standtop"].doorpoints[humanlist.children[i].door]);
//
// if(points[1] == undefined){
//
// }else{
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
// }
//
//
//
// if(scope.downpasserin && humanlist.children[i].direct == "down"){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// points.push(passerZone.list["standdown"].doorpoints[humanlist.children[i].door]);
//
// if(points[1] == undefined){
//
// }else{
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
// // console.log(points);
// }
//
// }
//
// //stage = 5 下车
// if(humanlist.children[i].stage == 5){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
// if(humanlist.children[i].direct == "top"){
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z+5));
// }
// if(humanlist.children[i].direct == "down"){
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z-5));
// }
// targetPosition = passerZone.getgateposition("exitgate");
// path = pathFinder.find(points[1],targetPosition.point);
// humanlist.children[i].door = targetPosition.door;
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
//
// //stage = 6 前往出站闸机
// // if(humanlist.children[i].stage == 6){
// // let points = [];
// // points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
// //
// // groupID = pathfinder.getGroup( ZONE, points[0] );
// // targetPosition = passerZone.getgateposition("exitgate");
// // path = pathfinder.findPath( points[0], targetPosition, ZONE, groupID );
// //
// // for(let i=0;i<path.length;i++){
// // points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// // }
// // passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// // }
//
// //stage = 7 出闸机
// if(humanlist.children[i].stage == 7){
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
// points.push(new THREE.Vector3(humanlist.children[i].position.x+5,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// passerCheckDoor.checkDoorControl("out",humanlist.children[i].door,deviceaction)
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
// }
//
// //stage = 8 出站
// if(humanlist.children[i].stage == 8){
// let direct = Math.floor(Math.random()*(3-1+1))+1;
// let points = [];
// points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//
// //1--top
// //2-- down
// if(direct == 1){
// targetPosition = passerZone.getzoneposition("exit1");
// path = pathFinder.find(points[0],targetPosition);
// }else{
// targetPosition = passerZone.getzoneposition("exit2");
// path = pathFinder.find(points[0],targetPosition);
// }
//
// for(let i=0;i<path.length;i++){
// points.push(new THREE.Vector3(path[i].x,path[i].y,path[i].z));
// }
// passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
//
// }
// }
}
for(let i=0;i<humanlist.children.length;i++){
// console.log(humans[i]);
if(humanlist.children[i].overGoal == "top" || humanlist.children[i].overGoal == "down"){
if(humanlist.children[i].status == "0"){
// console.log(humanlist.children[0].status);
// console.log(humanlist.children[0].nowGoal);
if(humanlist.children[i].nowGoal == "ticketRegion"){
let points = [];
points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//寻找最近售票机点
targetPosition = shortTicketRegion(humanlist.children[i].position,region.ticketRegion);
//寻路售票机
path = pathFinder.find(points[0],targetPosition);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.1,path[i].z));
}
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
if(humanlist.children[i].nowGoal == "securityRegion"){
let points = [];
points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//寻找最近售票机点
targetPosition = shortDistanceRegion(humanlist.children[i].position,region.securityRegion.group.children);
//寻路售票机
path = pathFinder.find(points[0],targetPosition);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.1,path[i].z));
}
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
if(humanlist.children[i].nowGoal == "checkRegion"){
let points = [];
points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//寻找最近售票机点
target = selectInCheckRegion(humanlist.children[i].position,region.checkRegion,"in");
humanlist.children[i].checkDoor = target.checkDoorNum;
//寻路售票机
path = pathFinder.find(points[0],target.pos);
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.1,path[i].z));
}
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
if(humanlist.children[i].nowGoal == "inCheck"){
let points = [];
// console.log();
// console.log(region.checkRegion.group.children[humanlist.children[i].checkDoor].position);
// console.log(region.checkRegion.group.children[humanlist.children[i].checkDoor].getObjectByName("regionHead").getWorldPosition(new THREE.Vector3()));
// console.log(region.checkRegion.group.children[humanlist.children[i].checkDoor].getObjectByName("regionDirect").getWorldPosition(new THREE.Vector3()));
// console.log("================");
points.push(region.checkRegion.group.children[humanlist.children[i].checkDoor].getObjectByName("regionHead").getWorldPosition(new THREE.Vector3()));
points.push(region.checkRegion.group.children[humanlist.children[i].checkDoor].getObjectByName("regionDirect").getWorldPosition(new THREE.Vector3()));
passerCheckDoor.checkDoorControl("in",region.checkRegion.group.children[humanlist.children[i].checkDoor].connectDevice,deviceaction);
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
if(humanlist.children[i].nowGoal == "standRegion"){
let points = [];
points.push(new THREE.Vector3(humanlist.children[i].position.x,humanlist.children[i].position.y,humanlist.children[i].position.z));
//寻找最近售票机点
target = shortStandRegion(humanlist.children[i].position,region.standRegion,humanlist.children[i].overGoal);
humanlist.children[i].standDoorNum = target.standDoorNum;
//寻路售票机
path = pathFinder.find(points[0],target.pos);
//
for(let i=0;i<path.length;i++){
points.push(new THREE.Vector3(path[i].x,path[i].y+0.5,path[i].z));
}
passerHuman.initMoveAnimate(humanlist.children[i],i,points,i);
}
}
}
}
}

View File

@ -3,11 +3,11 @@ export function getBaseUrl() {
if (process.env.NODE_ENV === 'development') {
// BASE_API = 'https://joylink.club/jlcloud';
// BASE_API = 'https://api.joylink.club/jlcloud';
// BASE_API = 'https://test.joylink.club/jlcloud';
BASE_API = 'https://test.joylink.club/jlcloud';
// BASE_API = 'http://192.168.8.107:9000'; // 袁琪
// BASE_API = 'http://192.168.8.129:9000'; // 旭强
// BASE_API = 'http://192.168.8.119:9000'; // 张赛
BASE_API = 'http://192.168.8.140:9000'; // 杜康
// BASE_API = 'http://192.168.8.140:9000'; // 杜康
// BASE_API = 'http://b29z135112.zicp.vip';
// BASE_API = 'http://2925963m2a.zicp.vip'; // 杜康
// BASE_API = 'http://2i38984j47.qicp.vip'; // 张赛

View File

@ -10,15 +10,15 @@
<el-form-item label="uuid:" v-if="selectModel.uuid" disabled="true">
<el-input v-model="selectModel.uuid" ></el-input>
<el-input v-model="selectModel.uuid" disabled></el-input>
</el-form-item>
<el-form-item label="区域类型:" v-if="selectModel.regionType" disabled="true">
<el-input v-model="selectModel.regionType"></el-input>
<el-input v-model="selectModel.regionType" disabled></el-input>
</el-form-item>
<el-form-item label="区域状态:" v-if="selectModel.status" disabled="true">
<el-input v-model="selectModel.status"></el-input>
<el-input v-model="selectModel.status" disabled></el-input>
</el-form-item>
@ -38,18 +38,53 @@
</el-form-item>
<el-form-item label="售票处状态:" v-if="selectModel.runType" disabled="true">
<el-input v-model="selectModel.runType"></el-input>
<el-select v-model="selectModel.runType" placeholder="请选择">
<el-option
v-for="item in runTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="站台方向:" v-if="selectModel.direction" disabled="true">
<el-input v-model="selectModel.direction"></el-input>
<!-- <el-input v-model="selectModel.direction"></el-input> -->
<el-select v-model="selectModel.direction" placeholder="请选择">
<el-option
v-for="item in directionOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="连接设备:" v-if="selectModel.connectDevice" disabled="true">
<el-input v-model="selectModel.connectDevice"></el-input>
</el-form-item>
<el-form-item label="检票机作用:" v-if="selectModel.checkDirection" disabled="true">
<el-input v-model="selectModel.checkDirection"></el-input>
<!-- <el-input v-model="selectModel.checkDirection"></el-input> -->
<el-select v-model="selectModel.checkDirection" placeholder="请选择">
<el-option
v-for="item in checkOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="闸机组:" v-if="selectModel.checkBelong" disabled="true">
<el-input v-model="selectModel.checkBelong"></el-input>
</el-form-item>
<el-form-item label="售票机组:" v-if="selectModel.ticketBelong" disabled="true">
<el-input v-model="selectModel.ticketBelong"></el-input>
</el-form-item>
<el-form-item label="站台组:" v-if="selectModel.standBelong" disabled="true">
<el-input v-model="selectModel.standBelong"></el-input>
</el-form-item>
@ -89,6 +124,30 @@ export default {
size:'medium',
isActive:-1,
selectModel:null,
directionOptions:[{
value:"top",
label:"上行",
},
{
value:"down",
label:"下行",
}],
checkOptions:[{
value:"in",
label:"进站",
},
{
value:"out",
label:"出站",
}],
runTypeOptions:[{
value:"auto",
label:"自动",
},
{
value:"manual",
label:"人工",
}],
}
},
beforeDestroy() {

View File

@ -0,0 +1,164 @@
<template>
<el-tabs class="StationData" :style="{'background-image': 'url('+localStatic+'/texture/devicemsgpane.png)'}"
:tab-position="tabPosition" v-model="activeName" type="card" @tab-click="handleClick" >
<el-tab-pane label="仿真信息" name="regionEditor" >
<el-form ref="form" label-width="130px" size="mini" v-if="selectModel">
<el-form-item label="uuid:" v-if="selectModel.uuid" disabled="true">
<el-input v-model="selectModel.uuid" disabled></el-input>
</el-form-item>
<el-form-item label="区域类型:" v-if="selectModel.regionType" disabled="true">
<el-input v-model="selectModel.regionType" disabled></el-input>
</el-form-item>
<el-form-item label="区域状态:" v-if="selectModel.status" disabled="true">
<el-input v-model="selectModel.status" disabled></el-input>
</el-form-item>
<el-form-item label="入口乘客比例:" v-if="selectModel.startWeight" disabled="true">
<el-input v-model="selectModel.startWeight"></el-input>
</el-form-item>
<el-form-item label="出口乘客比例:" v-if="selectModel.endWeight" disabled="true">
<el-input v-model="selectModel.endWeight"></el-input>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</template>
<script>
import { JL3D_LOCAL_STATIC } from '@/api/jlmap3d/assets3d.js';
export default {
name: 'StationmanagerData',
components: {
},
data() {
return {
localStatic:JL3D_LOCAL_STATIC,
activeName: '',
tabPosition:'top',
size:'medium',
isActive:-1,
selectModel:null,
directionOptions:[{
value:"top",
label:"上行",
},
{
value:"down",
label:"下行",
}],
checkOptions:[{
value:"in",
label:"进站",
},
{
value:"out",
label:"出站",
}],
runTypeOptions:[{
value:"auto",
label:"自动",
},
{
value:"manual",
label:"人工",
}],
}
},
beforeDestroy() {
},
mounted() {
window.jl3dStationManagerEquipSelect = this.jl3dStationManagerEquipSelect;
},
methods: {
init: function() {
},
back: function() {
},
handleClick: function(tab, event) {
this.isActive = -1;
if(tab.name == "trackedit"){
}
if(tab.name == "switchedit"){
}
if(tab.name == "signaledit"){
}
if(tab.name == "stationedit"){
}
},
jl3dStationManagerEquipSelect: function(selected){
this.selectModel = selected;
this.activeName = "regionEditor";
console.log(selected);
},
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import "src/styles/mixin.scss";
.StationData {
position:absolute;
float: right;
right:0;
width: 18%;
height:70%;
// background:#fff;
overflow-y:auto;
z-index: 10;
// border-radius:30px 0 0 30px;
// border:1px solid #000;
background-size: 100% 100%;
// border-radius:5px;
// text-align: center;
}
.editmodelconfig{
left:0;
margin-top:5px;
width:98%;
border-radius:5px;
border:solid 2px #000
}
.active{
background-color:blue;
}
.editbutton{
padding: 1cm
}
</style>

View File

@ -1,37 +1,40 @@
<template>
<div class="jl3dstationmanager">
<el-row class="managerbutton">
<el-button @click="switchViews" round>{{switchButtonName}}</el-button>
<el-button @click="switchStationManagerViews" round>{{switchButtonName}}</el-button>
<!-- 仿真操作按钮 -->
<el-button v-show="!viewStatus" round @click="startSimulation">开始仿真</el-button>
<el-button v-show="!viewStatus" round >显示隐藏区域</el-button>
<el-button v-show="!viewStatus" round >显示隐藏热力图</el-button>
<!-- <el-button v-show="!viewStatus" round @click="startSimulation">开始仿真</el-button> -->
<!-- <el-button v-show="!viewStatus" round >显示隐藏区域</el-button>
<el-button v-show="!viewStatus" round >显示隐藏热力图</el-button> -->
<!-- 绘图操作按钮 -->
<el-button v-show="viewStatus" round @click="deleteRegion">删除区域</el-button>
<el-button v-show="viewStatus" round @click="saveData">保存方案</el-button>
<el-button v-show="viewStatus" round @click="loadData">加载方案</el-button>
<!-- 其他 -->
<el-button round>退出</el-button>
<el-button round @click="back">退出</el-button>
</el-row>
<div class="dataLoadDiv" v-show="showSaveList">
<el-input v-model="saveDataName"></el-input>
<div class="modelname" @click="saveNewData(saveDataName)">存新方案</div>
<div class="modelname" @click="updateSaveData(saveDataName)">更新方案</div>
<div class="dataSaveDiv" v-show="showSaveList">
<div class="dataPaneExit" :style="{'background-image': 'url('+localStatic+'/texture/xx.png)'}" @click="closePane"></div>
<el-input style="width:80%;"v-model="saveDataName"></el-input>
<div class="modelname1" @click="saveNewData(saveDataName)">存新方案</div>
<div class="modelname2" @click="updateSaveData(saveDataName)">更新方案</div>
</div>
<div class="dataLoadDiv" v-show="showLoadList">
<div class="dataLoadTittle">已存储方案列表:</div>
<div class="dataPaneExit" :style="{'background-image': 'url('+localStatic+'/texture/xx.png)'}" @click="closePane"></div>
<el-scrollbar style="margin-bottom:1px">
<el-form ref="form" label-width="130px" size="mini">
<div class="dataListDiv" v-for="(asset,index) in nowDataList" >
<div >
<div class="dataListDiv" v-for="(asset,index) in nowDataList"><div >
<div class="modelname">方案名称:{{asset.name }}</div>
<div class="modelname">方案修改日期:{{asset.updateTime }}</div>
<div class="modelname" @click="modelSelect(asset.id)">加载方案</div>
<div class="modelname" @click="deletSelect(asset.id)">删除方案</div>
<div class="modelname1" @click="modelSelect(asset.id)">加载方案</div>
<div class="modelname2" @click="deletSelect(asset.id)">删除方案</div>
</div>
</div>
</el-form>
@ -51,9 +54,12 @@
/>
</el-select>
</div>
<Station-Data v-show="!viewStatus"></Station-Data>
<Draw-Type v-show="viewStatus" @changeDrawType=changeDrawType ></Draw-Type>
<Pro-Perty></Pro-Perty>
<Draw-Type v-show="viewStatus" @changeDrawType="changeDrawType" ></Draw-Type>
<Pro-Perty v-show="viewStatus" ></Pro-Perty>
<Stationmanager-Data v-show="!viewStatus" ></Stationmanager-Data>
<div id="jl3d" class="jl3dstationmanagerdraw" />
</div>
</template>
@ -66,13 +72,16 @@
import StationData from '@/views/jlmap3d/trafficplan/component/stationdata';
import DrawType from '@/views/jlmap3d/stationmanager/component/drawtype';
import ProPerty from '@/views/jlmap3d/stationmanager/component/property';
import StationmanagerData from '@/views/jlmap3d/stationmanager/component/stationmanagerdata';
import { deletePassenger } from '@/api/jlmap3d/assets3d';
import { saveStationManagerData,updateStationManagerData,getStationManagerDataList,getStationManagerData,deleteStationManagerData} from '@/api/jlmap3d/load3ddata';
export default {
name: 'jl3devacuation',
components: {
StationData,
StationmanagerData,
DrawType,
ProPerty,
},
@ -98,6 +107,8 @@
showSaveList:false,
dataId:null,
saveDataName:"",
showMsgData:true,
paneMsg:"存储成功!",
}
},
watch: {
@ -109,7 +120,8 @@
},
mounted() {
window.updatestationlist = this.updatestationlist;
window.switchStationManagerViews = this.switchStationManagerViews;
window.updateValue = this.updateValue;
this.group = this.$route.query.group;
this.mapid = this.$route.query.mapid;
this.lineCode = this.$route.query.lineCode;
@ -122,12 +134,13 @@
initnewdata: function (group,header){
let dom = document.getElementById('jl3d');
this.jl3d = new Jl3dStationManager(dom,this.mapid,this.group,this.initCode);
},
changeDrawType(drawTypeName){
// console.log(drawTypeName);
console.log(drawTypeName);
this.jl3d.changeDrawType(drawTypeName);
},
switchViews(){
switchStationManagerViews(){
if(this.viewStatus == false){
this.switchButtonName = '绘制视角',
@ -151,6 +164,9 @@
// let oldgroupnum = this.groupnum;
this.value = selVal;
},
updateValue(newValue){
this.value = newValue;
},
saveData(){
this.showSaveList = true;
},
@ -163,8 +179,10 @@
console.log(data);
this.dataId = data.data;
this.showSaveList = false;
this.msgBox("数据存储成功!");
}
}).catch(error => {
this.msgBox(error.message);
console.log(error);
});
},
@ -176,10 +194,11 @@
if(data.code == "200"){
//console.log("");
console.log(data);
this.showSaveList = false;
this.showSaveList = false;
this.msgBox("数据更新成功!");
}
}).catch(error => {
this.msgBox(error.message);
console.log(error);
});
}else{
@ -190,25 +209,19 @@
loadData(){
this.showLoadList = true;
getStationManagerDataList().then(netdata => {
console.log(netdata);
this.nowDataList = netdata.data;
});
},
deletSelect(deleteId){
deleteStationManagerData(deleteId).then(netdata => {
console.log(netdata);
});
this.showLoadList = false;
this.deleteBox(deleteId);
},
modelSelect(loadId){
console.log(loadId);
getStationManagerData(loadId).then(netdata => {
console.log(netdata);
this.dataId = loadId;
this.saveDataName = netdata.data.name;
this.jl3d.loadData(netdata.data);
this.jl3d.loadData(netdata.data);
this.msgBox("加载数据成功");
});
this.showLoadList = false;
},
@ -225,6 +238,40 @@
this.stationlist = list;
},
msgBox(text){
this.$alert(text, {
confirmButtonText: '确定',
callback: action => {
}
});
},
deleteBox(deleteId){
this.$confirm('此操作将永久删除该数据!', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteStationManagerData(deleteId).then(netdata => {
// console.log(netdata);
this.msgBox("删除数据成功!");
});
this.showLoadList = false;
}).catch(() => {
});
},
closePane(){
this.showLoadList = false;
this.showSaveList = false;
},
back() {
deletePassenger(this.$route.query.group,this.$route.query.deviceCode).then(netdata => {
// console.log(netdata);
window.close();
});
}
}
}
</script>
@ -245,11 +292,25 @@
height: 100%;
z-index: 9;
}
.dataSaveDiv{
position: absolute;
z-index: 10;
width:40%;
height:70px;
top:20%;
left:30%;
background-color: #fff;
border-radius:5px;
border:solid 2px #000;
}
.dataLoadDiv{
position: absolute;
z-index: 10;
width:40%;
height:60;
/* height:60px; */
top:20%;
left:30%;
background-color: #fff;
@ -261,11 +322,19 @@
text-align:center;
font-size: 20px;
}
.dataPaneExit{
width: 20px;
height:20px;
position: absolute;
right:0;
top:0;
background-size: 100% 100%;
}
.dataListDiv {
float:left;
position: relative;
width:100%;
height:100px;
height:70px;
border-radius:5px;
border:solid 2px #000;
}
@ -283,6 +352,24 @@
z-index: 10;
}
.modelname1{
width:48%;
left:0;
position: absolute;
border-radius:10px;
border:solid 2px #000;
text-align: center;
}
.modelname2{
width:48%;
right:0;
position: absolute;
border-radius:10px;
border:solid 2px #000;
text-align: center;
}
.managerbutton{
width:50%;
left:25%;

View File

@ -397,7 +397,7 @@ export default {
const routeData = this.$router.resolve({
// /jlmap3d/trafficplan
// /design/jlmap3d/jl3dstationmanager
path:'/design/jlmap3d/jl3dstationmanager',
path:'/jlmap3d/trafficplan',
query:{
mapid:this.$route.query.mapId,
group:this.$route.query.group,

View File

@ -1,7 +1,7 @@
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 04.03.2021 16:20:24
# File Created: 17.03.2021 14:24:17
mtllib path.mtl
mtllib path315.mtl
#
# object Object003
@ -279,15 +279,14 @@ v 30.7197 9.8454 10.4284
v 21.7861 9.8454 -1.5328
v 27.4298 9.8454 -5.0178
v 21.7861 9.8454 -5.0156
v -34.4179 9.8454 21.4375
v -22.8801 9.8454 21.4375
v -22.8985 9.8454 15.8912
v -22.9049 9.8454 14.1364
v -33.7472 9.8454 14.1364
v -33.1634 9.8454 25.6925
v -22.8640 9.8454 25.6925
v -22.8985 9.8454 15.8912
v -33.1634 9.8454 -5.0156
v -33.7472 9.8454 8.5854
v -24.1194 9.8454 8.5854
v -24.1194 9.8454 -5.0156
v -24.1194 9.8454 8.4892
v -31.8828 9.8454 6.1905
v -31.9661 9.8454 8.5676
v -8.5704 9.8454 17.2820
v -10.7366 9.8454 17.2731
v -10.7357 9.8454 21.4374
@ -297,6 +296,9 @@ v -40.4129 9.8454 14.0505
v -41.8927 9.8454 11.8541
v -43.7034 9.8454 11.8542
v -39.0867 9.8454 25.7142
v -33.1634 9.8454 25.6925
v -34.3734 9.8454 21.9937
v -39.6039 9.8454 21.9935
v -41.8927 9.8454 10.5376
v -40.4129 9.8454 8.5854
v -43.0999 9.8454 8.5854
@ -332,21 +334,20 @@ v -33.7472 9.8454 14.0505
v -33.7472 9.8454 11.2184
v -49.0307 9.8454 11.2184
v -49.0307 9.8454 14.0505
v -8.5704 9.8454 25.6925
v -8.5704 9.8454 22.0052
v -11.3493 9.8454 21.9935
v -11.3478 9.8454 17.2731
v -33.7472 9.8454 8.5854
v -18.7412 9.8454 17.2731
v -22.0887 9.8454 15.8911
v -22.0887 9.8454 25.6925
v -22.0887 9.8454 21.4375
v -11.2152 9.8454 21.4375
v -11.2138 9.8454 17.2731
v -8.5704 9.8454 16.8646
v -10.7348 9.8454 16.8647
v -22.0887 9.8454 15.8911
v -23.2027 9.8454 10.4106
v -18.7500 9.8454 15.8920
v -18.7566 9.8454 15.9025
v -18.7676 9.8454 14.4459
v -22.5111 9.8454 14.4459
v -22.5111 9.8454 15.5681
v -18.7588 9.8454 15.5681
v -18.7632 9.8454 15.5840
v -2.8636 9.8454 21.4382
v -2.8828 9.8454 16.8742
v -3.7582 9.8454 17.7820
@ -359,6 +360,8 @@ v 7.3420 9.8454 15.5800
v 11.1340 9.8454 15.5800
v 11.1340 9.8454 14.2816
v 0.1622 9.8454 14.2816
v -8.5704 9.8454 22.0052
v -8.5704 9.8454 25.6925
v -3.7582 9.8454 25.6925
v -3.7582 9.8454 22.0255
v -2.8450 9.8454 25.6925
@ -448,7 +451,11 @@ v 11.2845 9.8454 -5.0156
v -3.0683 9.8454 7.8959
v -0.3214 9.8454 7.8960
v 10.4639 9.8454 8.3750
v -45.9034 9.8454 21.9935
v -49.0307 9.8454 21.9934
v -49.0307 9.8454 25.6925
v -33.3416 9.8454 -0.8639
v -33.1634 9.8454 -5.0156
v 6.5981 1.7700 11.9086
v -18.0861 1.7700 14.2820
v -23.2027 9.8454 12.1559
@ -706,7 +713,21 @@ v -86.8627 17.3766 47.7962
v -86.8622 17.3766 50.0645
v -86.8584 17.3766 52.1600
v -86.8594 17.3766 45.4291
# 699 vertices
v -24.1194 9.8454 -5.0156
v -10.9714 9.8454 15.6000
v -10.9714 9.8454 15.9289
v -22.8640 9.8454 25.6925
v -22.8775 9.8454 21.9935
v -39.7050 9.8454 21.4375
v -22.0887 9.8454 25.6925
v -22.0887 9.8454 21.9935
v -45.7858 9.8454 21.4375
v -49.0307 9.8454 21.4375
v -11.2153 9.8454 21.9935
v -33.6450 9.8454 6.2052
v -31.6355 9.8454 -0.8693
v -31.4903 9.8454 -5.0156
# 720 vertices
vn 0.0000 1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
@ -1035,15 +1056,14 @@ vt 1.0078 0.6807 0.0000
vt 0.8348 0.8080 0.0000
vt 0.9529 0.8562 0.0000
vt 0.8348 0.8562 0.0000
vt 0.2485 0.5735 0.0000
vt 0.3584 0.5642 0.0000
vt 0.3584 0.6224 0.0000
vt 0.3584 0.6424 0.0000
vt 0.2485 0.6424 0.0000
vt 0.2485 0.5133 0.0000
vt 0.3584 0.5133 0.0000
vt 0.3584 0.6224 0.0000
vt 0.2485 0.8562 0.0000
vt 0.2485 0.7007 0.0000
vt 0.3667 0.7007 0.0000
vt 0.3667 0.8562 0.0000
vt 0.2704 0.7279 0.0000
vt 0.2704 0.7007 0.0000
vt 0.5109 0.6228 0.0000
vt 0.4628 0.6228 0.0000
vt 0.4878 0.5671 0.0000
@ -1053,6 +1073,9 @@ vt 0.1712 0.6424 0.0000
vt 0.1712 0.6726 0.0000
vt 0.1425 0.6726 0.0000
vt 0.1939 0.5133 0.0000
vt 0.2485 0.5133 0.0000
vt 0.2485 0.5636 0.0000
vt 0.1850 0.5636 0.0000
vt 0.1712 0.6867 0.0000
vt 0.1712 0.7007 0.0000
vt 0.1425 0.7007 0.0000
@ -1080,6 +1103,7 @@ vt 0.4826 0.9318 0.0000
vt 0.4697 0.7157 0.0000
vt 0.3978 0.7478 0.0000
vt 0.3667 0.7617 0.0000
vt 0.3667 0.8562 0.0000
vt 0.5623 0.7919 0.0000
vt 0.5109 0.7919 0.0000
vt 0.5109 0.7324 0.0000
@ -1087,18 +1111,18 @@ vt 0.5623 0.7324 0.0000
vt 0.2485 0.6726 0.0000
vt 0.0652 0.6726 0.0000
vt 0.0652 0.6424 0.0000
vt 0.5109 0.5133 0.0000
vt 0.5109 0.5627 0.0000
vt 0.4813 0.5629 0.0000
vt 0.4603 0.6228 0.0000
vt 0.2485 0.7007 0.0000
vt 0.4148 0.6228 0.0000
vt 0.3667 0.6256 0.0000
vt 0.3667 0.5133 0.0000
vt 0.3667 0.5657 0.0000
vt 0.4787 0.5704 0.0000
vt 0.4603 0.6228 0.0000
vt 0.5109 0.6313 0.0000
vt 0.4565 0.6313 0.0000
vt 0.3667 0.5642 0.0000
vt 0.3667 0.6224 0.0000
vt 0.3667 0.7082 0.0000
vt 0.4127 0.6285 0.0000
vt 0.3667 0.6256 0.0000
vt 0.4084 0.6399 0.0000
vt 0.3667 0.6399 0.0000
vt 0.3667 0.6342 0.0000
@ -1115,6 +1139,8 @@ vt 0.6812 0.6242 0.0000
vt 0.7228 0.5770 0.0000
vt 0.7228 0.6399 0.0000
vt 0.5958 0.6399 0.0000
vt 0.5109 0.5627 0.0000
vt 0.5109 0.5133 0.0000
vt 0.5623 0.5133 0.0000
vt 0.5623 0.5573 0.0000
vt 0.5720 0.5133 0.0000
@ -1185,9 +1211,13 @@ vt 0.7146 0.6982 0.0000
vt 0.7228 0.6985 0.0000
vt 0.4513 0.2342 0.0000
vt 0.4513 0.2434 0.0000
vt 0.1133 0.5636 0.0000
vt 0.0947 0.5133 0.0000
vt 0.0652 0.5636 0.0000
vt 0.0652 0.5133 0.0000
vt 0.2026 0.8562 0.0000
vt 0.2485 0.8087 0.0000
vt 0.2485 0.8562 0.0000
vt 0.7981 0.6707 0.0000
vt 0.1382 0.2443 0.0000
vt 0.5109 0.8562 0.0000
@ -1206,7 +1236,19 @@ vt 0.6190 0.4836 0.0000
vt 0.5616 0.4836 0.0000
vt 0.5916 0.4836 0.0000
vt 0.5581 0.4836 0.0000
# 445 texture coords
vt 0.3584 0.5133 0.0000
vt 0.3584 0.5558 0.0000
vt 0.1833 0.5735 0.0000
vt 0.3667 0.5133 0.0000
vt 0.3667 0.5558 0.0000
vt 0.1170 0.5735 0.0000
vt 0.0652 0.5735 0.0000
vt 0.4813 0.5629 0.0000
vt 0.3667 0.5571 0.0000
vt 0.2485 0.7279 0.0000
vt 0.2704 0.8087 0.0000
vt 0.2704 0.8562 0.0000
# 466 texture coords
g Object003
usemtl 10___Default
@ -1384,282 +1426,300 @@ f 262/264/1 263/265/1 264/266/1
f 265/267/1 266/268/1 267/269/1 268/270/1 269/271/1
f 270/272/1 271/273/1 272/274/1
f 273/275/1 274/276/1 275/277/1 276/278/1 277/279/1
f 278/280/1 279/281/1 280/282/1 281/283/1
f 282/284/1 283/285/1 284/286/1 285/287/1
f 286/288/1 287/289/1 288/290/1 289/291/1
f 274/276/1 287/289/1 290/292/1 275/277/1
f 291/293/1 292/294/1 293/295/1 294/296/1
f 295/297/1 293/295/1 296/298/1 297/299/1
f 298/300/1 299/301/1 300/302/1 301/303/1
f 298/300/1 301/303/1 290/304/1 302/305/1
f 303/306/1 296/307/1 304/308/1 305/309/1
f 271/307/1 306/310/1 307/311/1 308/312/1
f 309/313/1 310/314/1 264/315/1 311/316/1
f 253/255/1 252/254/1 312/317/1 313/318/1
f 314/319/1 315/319/1 316/283/1 317/283/1
f 318/320/1 319/321/1 320/322/1 321/323/1
f 287/289/1 274/276/1 322/276/1 323/324/1 288/290/1
f 289/291/1 324/325/1 325/326/1 286/288/1
f 295/297/1 324/325/1 289/291/1 294/296/1 293/295/1
f 291/293/1 288/290/1 323/324/1 279/281/1 292/294/1
f 326/327/1 327/328/1 328/329/1 329/330/1 330/331/1 331/332/1 332/333/1
f 282/284/1 333/334/1 334/335/1 283/285/1
f 332/333/1 331/336/1 277/279/1 276/278/1
f 313/318/1 315/319/1 335/337/1
f 330/331/1 336/338/1 331/332/1
f 337/339/1 338/340/1 339/341/1 340/342/1
f 341/343/1 342/344/1 343/345/1 344/346/1
f 345/347/1 333/334/1 282/284/1 285/287/1 344/346/1 343/345/1
f 342/344/1 341/343/1 346/348/1
f 341/343/1 347/349/1 348/350/1 346/348/1
f 349/351/1 350/352/1 351/353/1 352/354/1
f 327/328/1 326/327/1 353/355/1 354/356/1
f 353/355/1 355/357/1 356/358/1 354/356/1
f 357/359/1 356/358/1 355/357/1 358/360/1
f 357/361/1 358/360/1 359/362/1 360/363/1
f 320/322/1 361/364/1 362/365/1 321/323/1
f 315/319/1 363/366/1 364/367/1 316/283/1
f 365/368/1 363/366/1 366/369/1 367/370/1
f 368/371/1 369/372/1 370/373/1
f 371/374/1 250/252/1 249/251/1 338/340/1 337/339/1 372/375/1
f 351/353/1 257/259/1 256/258/1 352/354/1
f 254/256/1 373/376/1 374/377/1 255/257/1
f 321/323/1 375/378/1 376/379/1 377/380/1 378/381/1 318/320/1
f 379/382/1 380/383/1 381/384/1
f 268/270/1 382/385/1 383/386/1 269/271/1
f 260/262/1 384/387/1 385/388/1 261/263/1
f 386/389/1 387/390/1 388/391/1 389/392/1
f 390/365/3 391/365/3 392/364/3 393/364/3
f 390/365/1 393/364/1 394/364/1 395/365/1
f 396/364/4 397/364/4 398/364/4 399/364/4
f 400/365/5 401/365/5 402/365/5 403/365/5
f 404/393/1 405/251/1 406/251/1 407/393/1
f 1/337/1 408/337/1 409/319/1 2/319/1
f 410/394/1 257/259/1 411/259/1 412/394/1
f 413/395/1 414/395/1 415/396/1 416/396/1
f 238/394/1 417/394/1 418/259/1 240/259/1
f 239/395/1 419/395/1 420/396/1 237/396/1
f 421/397/1 381/384/1 380/383/1 347/398/1
f 421/397/1 347/398/1 422/399/1 423/400/1
f 259/261/1 258/260/1 424/401/1
f 259/261/1 424/401/1 263/265/1 262/264/1
f 425/402/1 383/386/1 382/385/1 426/403/1 427/404/1 427/404/1
f 427/404/1 428/405/1 423/400/1 429/406/1 425/402/1
f 423/400/1 422/399/1 430/407/1 429/406/1
f 431/408/1 311/409/1 430/407/1 422/399/1
f 383/386/1 425/402/1 258/260/1 261/263/1
f 425/402/1 429/406/1 424/401/1 258/260/1
f 424/401/1 429/406/1 430/407/1 263/265/1
f 264/266/1 263/265/1 430/407/1 311/409/1
f 269/271/1 385/388/1 432/410/1 265/267/1
f 306/411/1 271/273/1 433/412/1
f 384/387/1 434/413/1 432/410/1 385/388/1
f 306/411/1 433/412/1 435/414/1 436/415/1
f 437/416/1 438/417/1 387/390/1 386/389/1
f 387/418/1 439/419/1 440/420/1 441/421/1 388/422/1
f 415/396/1 414/395/1 369/372/1 368/371/1
f 374/377/1 373/376/1 368/371/1 370/373/1
f 108/108/1 404/423/1 1/1/1 3/3/1
f 108/108/1 405/424/1 404/423/1
f 278/280/1 279/281/1 280/282/1
f 281/283/1 282/284/1 283/285/1 284/286/1
f 285/287/1 286/288/1 287/289/1 288/290/1
f 289/291/1 290/292/1 291/293/1 292/294/1
f 293/295/1 294/296/1 295/297/1 296/298/1
f 297/299/1 295/297/1 298/300/1 299/301/1
f 300/302/1 301/303/1 302/304/1 303/305/1
f 300/302/1 303/305/1 289/306/1 304/307/1
f 305/308/1 298/309/1 306/310/1 307/311/1
f 271/309/1 308/312/1 309/313/1 310/314/1
f 311/315/1 312/316/1 264/317/1 313/318/1
f 253/255/1 252/254/1 314/319/1 315/320/1
f 316/321/1 317/321/1 318/322/1 319/322/1
f 320/323/1 321/324/1 322/325/1 323/326/1
f 286/288/1 277/279/1 324/279/1 325/327/1 287/289/1
f 288/290/1 326/328/1 327/329/1 285/287/1
f 297/299/1 326/328/1 288/290/1 296/298/1 295/297/1
f 293/295/1 287/289/1 325/327/1 328/330/1 294/296/1
f 329/331/1 330/332/1 331/333/1 332/334/1
f 281/283/1 333/335/1 334/336/1 282/284/1
f 274/276/1 330/337/1 335/338/1 275/277/1
f 315/320/1 317/321/1 336/339/1
f 329/331/1 337/340/1 335/341/1
f 338/342/1 339/343/1 340/344/1 341/345/1
f 342/346/1 343/347/1 344/348/1 345/349/1
f 346/350/1 333/335/1 281/283/1 284/286/1 345/349/1 344/348/1
f 343/347/1 342/346/1 347/351/1
f 342/346/1 348/352/1 349/353/1 347/351/1
f 350/354/1 351/355/1 352/356/1 353/357/1
f 354/358/1 355/359/1 356/360/1 357/361/1
f 356/360/1 358/362/1 359/363/1 357/361/1
f 360/364/1 359/363/1 358/362/1 361/365/1
f 360/366/1 361/365/1 362/367/1 363/368/1
f 322/325/1 364/369/1 365/370/1 323/326/1
f 317/321/1 366/371/1 367/372/1 318/322/1
f 368/373/1 366/371/1 369/374/1 370/375/1
f 371/376/1 372/377/1 373/378/1
f 374/379/1 250/252/1 249/251/1 339/343/1 338/342/1 375/380/1
f 352/356/1 257/259/1 256/258/1 353/357/1
f 254/256/1 376/381/1 377/382/1 255/257/1
f 323/326/1 378/383/1 379/384/1 380/385/1 381/386/1 320/323/1
f 382/387/1 383/388/1 384/389/1
f 268/270/1 385/390/1 386/391/1 269/271/1
f 260/262/1 387/392/1 388/393/1 261/263/1
f 389/394/1 390/395/1 391/396/1 392/397/1
f 393/370/3 394/370/3 395/369/3 396/369/3
f 393/370/1 396/369/1 397/369/1 398/370/1
f 399/369/4 400/369/4 401/369/4 402/369/4
f 403/370/5 404/370/5 405/370/5 406/370/5
f 407/398/1 408/251/1 409/251/1 410/398/1
f 1/339/1 411/339/1 412/321/1 2/321/1
f 413/399/1 257/259/1 414/259/1 415/399/1
f 416/400/1 417/400/1 418/401/1 419/401/1
f 238/399/1 420/399/1 421/259/1 240/259/1
f 239/400/1 422/400/1 423/401/1 237/401/1
f 424/402/1 384/389/1 383/388/1 348/403/1
f 424/402/1 348/403/1 425/404/1 426/405/1
f 259/261/1 258/260/1 427/406/1
f 259/261/1 427/406/1 263/265/1 262/264/1
f 428/407/1 386/391/1 385/390/1 429/408/1 430/409/1 430/409/1
f 430/409/1 431/410/1 426/405/1 432/411/1 428/407/1
f 426/405/1 425/404/1 433/412/1 432/411/1
f 434/413/1 313/414/1 433/412/1 425/404/1
f 386/391/1 428/407/1 258/260/1 261/263/1
f 428/407/1 432/411/1 427/406/1 258/260/1
f 427/406/1 432/411/1 433/412/1 263/265/1
f 264/266/1 263/265/1 433/412/1 313/414/1
f 269/271/1 388/393/1 435/415/1 265/267/1
f 308/416/1 271/273/1 436/417/1
f 387/392/1 437/418/1 435/415/1 388/393/1
f 308/416/1 436/417/1 438/419/1 439/420/1
f 440/421/1 441/422/1 390/395/1 389/394/1
f 390/423/1 442/424/1 443/425/1 444/426/1 391/427/1
f 418/401/1 417/400/1 372/377/1 371/376/1
f 377/382/1 376/381/1 371/376/1 373/378/1
f 108/108/1 407/428/1 1/1/1 3/3/1
f 108/108/1 408/429/1 407/428/1
f 2/2/1 109/109/1 3/3/1
f 108/108/1 107/107/1 405/424/1
f 108/108/1 107/107/1 408/429/1
f 240/243/1 110/110/1 186/189/1 232/235/1
f 239/242/1 237/240/1 229/232/1
f 286/288/1 302/425/1 290/292/1 287/289/1
f 325/326/1 442/426/1 302/425/1 286/288/1
f 293/295/1 292/294/1 304/427/1 296/298/1
f 279/281/1 278/280/1 304/427/1 292/294/1
f 403/365/6 172/365/6 443/365/6 400/365/6
f 123/123/1 124/124/1 443/428/1 172/175/1
f 124/124/1 166/169/1 443/428/1
f 396/364/1 399/364/1 147/364/1 444/364/1
f 146/146/1 444/429/1 147/147/1 145/145/1
f 146/146/1 117/117/1 444/429/1
f 253/255/1 445/393/1 249/251/1
f 406/251/7 249/251/7 445/393/7 407/393/7
f 408/337/8 335/337/8 315/319/8 409/319/8
f 320/322/1 319/321/1 446/430/1 316/283/1 364/367/1
f 391/365/9 362/365/9 361/364/9 392/364/9
f 447/365/10 390/365/10 395/365/10 448/365/10
f 402/365/11 401/365/11 447/365/11 448/365/11
f 449/364/12 394/364/12 393/364/12 450/364/12
f 398/364/13 397/364/13 449/364/13 450/364/13
f 417/394/14 412/394/14 411/259/14 418/259/14
f 419/395/14 413/395/14 416/396/14 420/396/14
f 257/259/1 410/394/1 254/256/1
f 440/420/1 451/431/1 370/373/1
f 370/373/1 369/372/1 441/421/1 440/420/1
f 347/349/1 380/432/1 348/350/1
f 374/377/1 452/433/1 255/257/1
f 270/389/1 386/389/1 389/392/1 453/392/1
f 388/391/1 454/434/1 389/392/1
f 271/273/1 270/272/1 453/435/1 265/267/1
f 453/435/1 266/268/1 265/267/1
f 352/354/1 455/354/1 349/436/1
f 348/436/1 349/436/1 455/354/1 456/354/1
f 348/436/1 456/354/1 346/354/1
f 433/412/1 432/410/1 434/413/1 435/414/1
f 436/415/1 435/414/1 457/414/1 458/415/1
f 265/267/1 432/410/1 433/412/1 271/273/1
f 459/437/1 460/438/1 310/314/1 309/313/1
f 310/314/1 460/438/1 461/438/1
f 460/438/1 459/437/1 462/439/1 463/438/1
f 461/438/1 460/438/1 464/438/1 465/438/1
f 463/438/1 462/439/1 466/439/1 467/438/1
f 465/438/1 464/438/1 468/438/1 469/438/1
f 470/440/1 471/437/1 472/437/1 473/440/1
f 462/439/1 470/440/1 473/440/1 466/439/1
f 472/437/1 471/437/1 474/437/1 475/437/1
f 463/438/1 467/438/1 476/438/1
f 464/438/1 463/438/1 476/438/1 468/438/1
f 460/438/1 463/438/1 464/438/1
f 473/440/1 472/437/1 477/437/1 478/440/1
f 467/438/1 466/439/1 479/439/1 480/438/1
f 468/438/1 476/438/1 481/438/1 482/438/1
f 480/438/15 479/439/15 483/439/15 484/438/15
f 478/440/16 477/437/16 485/437/16 486/440/16
f 486/440/1 485/437/1 487/437/1 488/440/1
f 482/438/17 481/438/17 489/438/17 490/438/17
f 490/438/1 489/438/1 491/438/1 492/438/1
f 484/438/1 483/439/1 493/439/1 494/438/1
f 494/438/18 493/439/18 495/439/18 496/438/18
f 496/438/1 495/439/1 497/439/1 498/438/1
f 488/440/1 487/437/1 499/437/1 500/440/1
f 492/438/1 491/438/1 501/438/1 502/438/1
f 498/438/1 497/439/1 503/439/1 504/438/1
f 488/440/19 500/440/19 503/440/19 497/440/19
f 498/438/20 504/438/20 501/438/20 491/438/20
f 499/437/1 487/437/1 505/437/1 506/437/1
f 492/438/1 502/438/1 507/438/1 508/438/1
f 500/440/21 499/437/21 509/437/21 510/440/21
f 502/438/22 501/438/22 511/438/22 512/438/22
f 504/438/23 503/439/23 513/439/23 514/438/23
f 503/440/24 500/440/24 510/440/24 513/440/24
f 501/438/25 504/438/25 514/438/25 511/438/25
f 499/437/21 506/437/21 515/437/21 509/437/21
f 507/438/26 502/438/26 512/438/26 516/438/26
f 510/440/1 509/437/1 517/437/1 518/440/1
f 512/438/1 511/438/1 519/438/1 520/438/1
f 514/438/1 513/439/1 521/439/1 522/438/1
f 513/440/1 510/440/1 518/440/1 521/440/1
f 511/438/1 514/438/1 522/438/1 519/438/1
f 509/437/1 515/437/1 523/437/1 517/437/1
f 516/438/1 512/438/1 520/438/1 524/438/1
f 307/311/1 525/311/1 526/312/1 308/312/1
f 527/311/1 528/311/1 529/311/1
f 527/311/1 530/312/1 526/312/1 525/311/1
f 307/311/1 531/311/1 532/311/1 525/311/1
f 533/311/1 534/311/1 535/311/1 536/311/1
f 536/311/27 535/311/27 537/311/27 538/311/27
f 538/311/1 537/311/1 539/311/1 540/311/1
f 533/311/1 541/311/1 542/311/1 532/311/1
f 534/311/1 533/311/1 532/311/1 531/311/1
f 543/311/1 528/311/1 544/311/1 545/311/1
f 546/311/1 529/311/1 528/311/1 543/311/1
f 545/311/1 544/311/1 547/311/1 548/311/1
f 548/311/1 547/311/1 542/311/1 541/311/1
f 543/311/1 545/311/1 549/311/1 550/311/1
f 548/311/1 541/311/1 551/311/1 552/311/1
f 550/311/28 549/311/28 553/311/28 554/311/28
f 552/311/28 551/311/28 555/311/28 556/311/28
f 554/311/1 553/311/1 557/311/1 558/311/1
f 556/311/1 555/311/1 559/311/1 560/311/1
f 540/311/29 539/311/29 561/311/29 562/311/29
f 562/311/1 561/311/1 563/311/1 564/311/1
f 558/311/1 557/311/1 565/311/1 566/311/1
f 560/311/1 559/311/1 567/311/1 568/311/1
f 564/311/1 563/311/1 569/311/1 570/311/1
f 566/311/1 565/311/1 571/311/1 572/311/1
f 568/311/1 567/311/1 573/311/1 574/311/1
f 569/311/1 563/311/1 575/311/1 576/311/1
f 564/311/30 570/311/30 573/311/30 567/311/30
f 568/311/1 574/311/1 571/311/1 565/311/1
f 566/311/1 572/311/1 577/311/1 578/311/1
f 525/311/1 532/311/1 542/311/1
f 527/311/1 544/311/1 528/311/1
f 525/311/1 547/311/1 544/311/1 527/311/1
f 525/311/1 542/311/1 547/311/1
f 303/306/1 305/309/1 579/309/1 580/306/1
f 581/309/1 582/306/1 580/306/1 579/309/1
f 580/306/1 582/306/1 583/306/1 584/306/1
f 584/306/1 583/306/1 585/306/1 586/306/1
f 587/306/1 588/306/1 589/306/1
f 588/306/1 590/306/1 591/306/1 592/306/1
f 593/306/1 594/306/1 595/306/1 596/306/1
f 589/306/1 584/306/1 586/306/1 587/306/1
f 587/306/1 586/306/1 597/306/1 598/306/1
f 599/306/1 600/306/1 593/306/1 596/306/1
f 587/306/1 598/306/1 590/306/1 588/306/1
f 599/306/1 596/306/1 592/306/1 591/306/1
f 591/306/1 590/306/1 601/306/1 602/306/1
f 598/306/1 597/306/1 603/306/1 604/306/1
f 600/306/1 599/306/1 605/306/1 606/306/1
f 604/306/31 603/306/31 607/306/31 608/306/31
f 606/306/32 605/306/32 609/306/32 610/306/32
f 608/306/1 607/306/1 611/306/1 612/306/1
f 610/306/1 609/306/1 613/306/1 614/306/1
f 602/306/33 601/306/33 615/306/33 616/306/33
f 616/306/34 615/306/34 617/306/34 618/306/34
f 618/306/35 617/306/35 619/306/35 620/306/35
f 620/306/36 619/306/36 621/306/36 622/306/36
f 612/306/1 611/306/1 623/306/1 624/306/1
f 614/306/1 613/306/1 625/306/1 626/306/1
f 622/306/36 621/306/36 627/306/36 628/306/36
f 622/306/37 628/306/37 625/306/37 613/306/37
f 612/306/38 624/306/38 627/306/38 621/306/38
f 623/306/1 611/306/1 629/306/1 630/306/1
f 614/306/1 626/306/1 631/306/1 632/306/1
f 624/306/1 623/306/1 633/306/1 634/306/1
f 626/306/1 625/306/1 635/306/1 636/306/1
f 628/306/39 627/306/39 637/306/39 638/306/39
f 625/306/40 628/306/40 638/306/40 635/306/40
f 627/306/41 624/306/41 634/306/41 637/306/41
f 623/306/1 630/306/1 639/306/1 633/306/1
f 631/306/1 626/306/1 636/306/1 640/306/1
f 592/306/1 596/306/1 595/306/1
f 588/306/1 592/306/1 595/306/1 589/306/1
f 300/302/1 299/301/1 641/301/1 642/302/1
f 642/302/1 643/441/1 644/442/1
f 645/443/1 646/443/1 647/444/1 648/444/1
f 649/301/1 650/301/1 651/445/1 652/445/1
f 653/442/1 644/442/1 643/441/1 654/441/1
f 652/445/1 651/445/1 646/443/1 645/443/1
f 654/441/1 643/441/1 648/444/1 647/444/1
f 653/442/1 655/302/1 644/442/1
f 642/302/1 648/444/1 643/441/1
f 641/301/1 649/301/1 652/445/1
f 641/301/1 652/445/1 645/443/1
f 642/302/1 641/301/1 645/443/1 648/444/1
f 651/445/1 650/301/1 656/301/1 657/445/1
f 653/442/1 654/441/1 658/441/1 659/442/1
f 647/444/1 646/443/1 660/443/1 661/444/1
f 657/445/42 656/301/42 662/301/42 663/445/42
f 659/442/42 658/441/42 664/441/42 665/442/42
f 661/444/43 660/443/43 666/443/43 667/444/43
f 667/444/1 666/443/1 668/443/1 669/444/1
f 663/445/1 662/301/1 670/301/1 671/445/1
f 665/442/1 664/441/1 672/441/1 673/442/1
f 671/445/1 670/301/1 674/301/1 675/445/1
f 673/442/1 672/441/1 676/441/1 677/442/1
f 669/444/44 668/443/44 678/443/44 679/444/44
f 679/444/1 678/443/1 680/443/1 681/444/1
f 675/445/45 674/301/45 682/301/45 683/445/45
f 677/442/46 676/441/46 684/441/46 685/442/46
f 681/444/47 680/443/47 686/443/47 687/444/47
f 675/445/48 683/445/48 686/445/48 680/445/48
f 681/444/49 687/444/49 684/444/49 676/444/49
f 677/442/50 685/442/50 688/442/50 689/442/50
f 682/301/51 674/301/51 690/301/51 691/301/51
f 683/445/1 682/301/1 692/301/1 693/445/1
f 685/442/1 684/441/1 694/441/1 695/442/1
f 687/444/1 686/443/1 696/443/1 697/444/1
f 686/445/1 683/445/1 693/445/1 696/445/1
f 684/444/1 687/444/1 697/444/1 694/444/1
f 688/442/1 685/442/1 695/442/1 698/442/1
f 682/301/1 691/301/1 699/301/1 692/301/1
f 459/437/1 471/437/1 470/440/1
f 459/437/1 470/440/1 462/439/1
f 387/418/1 376/379/1 375/378/1 439/419/1
f 312/317/1 366/369/1 363/366/1 315/319/1 313/318/1
# 404 polygons - 46 triangles
f 289/291/1 292/294/1 445/430/1 304/431/1
f 304/431/1 445/430/1 446/432/1 447/433/1
f 295/297/1 294/296/1 306/434/1 298/300/1
f 306/434/1 448/435/1 449/436/1
f 406/370/6 172/370/6 450/370/6 403/370/6
f 123/123/1 124/124/1 450/437/1 172/175/1
f 124/124/1 166/169/1 450/437/1
f 399/369/1 402/369/1 147/369/1 451/369/1
f 146/146/1 451/438/1 147/147/1 145/145/1
f 146/146/1 117/117/1 451/438/1
f 253/255/1 452/398/1 249/251/1
f 409/251/7 249/251/7 452/398/7 410/398/7
f 411/339/8 336/339/8 317/321/8 412/321/8
f 322/325/1 321/324/1 453/439/1 318/322/1 367/372/1
f 394/370/9 365/370/9 364/369/9 395/369/9
f 454/370/10 393/370/10 398/370/10 455/370/10
f 405/370/11 404/370/11 454/370/11 455/370/11
f 456/369/12 397/369/12 396/369/12 457/369/12
f 401/369/13 400/369/13 456/369/13 457/369/13
f 420/399/14 415/399/14 414/259/14 421/259/14
f 422/400/14 416/400/14 419/401/14 423/401/14
f 257/259/1 413/399/1 254/256/1
f 443/425/1 458/440/1 373/378/1
f 373/378/1 372/377/1 444/426/1 443/425/1
f 348/352/1 383/441/1 349/353/1
f 377/382/1 459/442/1 255/257/1
f 270/394/1 389/394/1 392/397/1 460/397/1
f 391/396/1 461/443/1 392/397/1
f 271/273/1 270/272/1 460/444/1 265/267/1
f 460/444/1 266/268/1 265/267/1
f 353/357/1 462/357/1 350/445/1
f 349/445/1 463/357/1 347/357/1
f 436/417/1 435/415/1 437/418/1 438/419/1
f 439/420/1 438/419/1 464/419/1 465/420/1
f 265/267/1 435/415/1 436/417/1 271/273/1
f 466/446/1 467/447/1 312/316/1 311/315/1
f 312/316/1 467/447/1 468/447/1
f 467/447/1 466/446/1 469/448/1 470/447/1
f 468/447/1 467/447/1 471/447/1 472/447/1
f 470/447/1 469/448/1 473/448/1 474/447/1
f 472/447/1 471/447/1 475/447/1 476/447/1
f 477/449/1 478/446/1 479/446/1 480/449/1
f 469/448/1 477/449/1 480/449/1 473/448/1
f 479/446/1 478/446/1 481/446/1 482/446/1
f 470/447/1 474/447/1 483/447/1
f 471/447/1 470/447/1 483/447/1 475/447/1
f 467/447/1 470/447/1 471/447/1
f 480/449/1 479/446/1 484/446/1 485/449/1
f 474/447/1 473/448/1 486/448/1 487/447/1
f 475/447/1 483/447/1 488/447/1 489/447/1
f 487/447/15 486/448/15 490/448/15 491/447/15
f 485/449/16 484/446/16 492/446/16 493/449/16
f 493/449/1 492/446/1 494/446/1 495/449/1
f 489/447/17 488/447/17 496/447/17 497/447/17
f 497/447/1 496/447/1 498/447/1 499/447/1
f 491/447/1 490/448/1 500/448/1 501/447/1
f 501/447/18 500/448/18 502/448/18 503/447/18
f 503/447/1 502/448/1 504/448/1 505/447/1
f 495/449/1 494/446/1 506/446/1 507/449/1
f 499/447/1 498/447/1 508/447/1 509/447/1
f 505/447/1 504/448/1 510/448/1 511/447/1
f 495/449/19 507/449/19 510/449/19 504/449/19
f 505/447/20 511/447/20 508/447/20 498/447/20
f 506/446/1 494/446/1 512/446/1 513/446/1
f 499/447/1 509/447/1 514/447/1 515/447/1
f 507/449/21 506/446/21 516/446/21 517/449/21
f 509/447/22 508/447/22 518/447/22 519/447/22
f 511/447/23 510/448/23 520/448/23 521/447/23
f 510/449/24 507/449/24 517/449/24 520/449/24
f 508/447/25 511/447/25 521/447/25 518/447/25
f 506/446/21 513/446/21 522/446/21 516/446/21
f 514/447/26 509/447/26 519/447/26 523/447/26
f 517/449/1 516/446/1 524/446/1 525/449/1
f 519/447/1 518/447/1 526/447/1 527/447/1
f 521/447/1 520/448/1 528/448/1 529/447/1
f 520/449/1 517/449/1 525/449/1 528/449/1
f 518/447/1 521/447/1 529/447/1 526/447/1
f 516/446/1 522/446/1 530/446/1 524/446/1
f 523/447/1 519/447/1 527/447/1 531/447/1
f 309/313/1 532/313/1 533/314/1 310/314/1
f 534/313/1 535/313/1 536/313/1
f 534/313/1 537/314/1 533/314/1 532/313/1
f 309/313/1 538/313/1 539/313/1 532/313/1
f 540/313/1 541/313/1 542/313/1 543/313/1
f 543/313/27 542/313/27 544/313/27 545/313/27
f 545/313/1 544/313/1 546/313/1 547/313/1
f 540/313/1 548/313/1 549/313/1 539/313/1
f 541/313/1 540/313/1 539/313/1 538/313/1
f 550/313/1 535/313/1 551/313/1 552/313/1
f 553/313/1 536/313/1 535/313/1 550/313/1
f 552/313/1 551/313/1 554/313/1 555/313/1
f 555/313/1 554/313/1 549/313/1 548/313/1
f 550/313/1 552/313/1 556/313/1 557/313/1
f 555/313/1 548/313/1 558/313/1 559/313/1
f 557/313/28 556/313/28 560/313/28 561/313/28
f 559/313/28 558/313/28 562/313/28 563/313/28
f 561/313/1 560/313/1 564/313/1 565/313/1
f 563/313/1 562/313/1 566/313/1 567/313/1
f 547/313/29 546/313/29 568/313/29 569/313/29
f 569/313/1 568/313/1 570/313/1 571/313/1
f 565/313/1 564/313/1 572/313/1 573/313/1
f 567/313/1 566/313/1 574/313/1 575/313/1
f 571/313/1 570/313/1 576/313/1 577/313/1
f 573/313/1 572/313/1 578/313/1 579/313/1
f 575/313/1 574/313/1 580/313/1 581/313/1
f 576/313/1 570/313/1 582/313/1 583/313/1
f 571/313/30 577/313/30 580/313/30 574/313/30
f 575/313/1 581/313/1 578/313/1 572/313/1
f 573/313/1 579/313/1 584/313/1 585/313/1
f 532/313/1 539/313/1 549/313/1
f 534/313/1 551/313/1 535/313/1
f 532/313/1 554/313/1 551/313/1 534/313/1
f 532/313/1 549/313/1 554/313/1
f 305/308/1 307/311/1 586/311/1 587/308/1
f 588/311/1 589/308/1 587/308/1 586/311/1
f 587/308/1 589/308/1 590/308/1 591/308/1
f 591/308/1 590/308/1 592/308/1 593/308/1
f 594/308/1 595/308/1 596/308/1
f 595/308/1 597/308/1 598/308/1 599/308/1
f 600/308/1 601/308/1 602/308/1 603/308/1
f 596/308/1 591/308/1 593/308/1 594/308/1
f 594/308/1 593/308/1 604/308/1 605/308/1
f 606/308/1 607/308/1 600/308/1 603/308/1
f 594/308/1 605/308/1 597/308/1 595/308/1
f 606/308/1 603/308/1 599/308/1 598/308/1
f 598/308/1 597/308/1 608/308/1 609/308/1
f 605/308/1 604/308/1 610/308/1 611/308/1
f 607/308/1 606/308/1 612/308/1 613/308/1
f 611/308/31 610/308/31 614/308/31 615/308/31
f 613/308/32 612/308/32 616/308/32 617/308/32
f 615/308/1 614/308/1 618/308/1 619/308/1
f 617/308/1 616/308/1 620/308/1 621/308/1
f 609/308/33 608/308/33 622/308/33 623/308/33
f 623/308/34 622/308/34 624/308/34 625/308/34
f 625/308/35 624/308/35 626/308/35 627/308/35
f 627/308/36 626/308/36 628/308/36 629/308/36
f 619/308/1 618/308/1 630/308/1 631/308/1
f 621/308/1 620/308/1 632/308/1 633/308/1
f 629/308/36 628/308/36 634/308/36 635/308/36
f 629/308/37 635/308/37 632/308/37 620/308/37
f 619/308/38 631/308/38 634/308/38 628/308/38
f 630/308/1 618/308/1 636/308/1 637/308/1
f 621/308/1 633/308/1 638/308/1 639/308/1
f 631/308/1 630/308/1 640/308/1 641/308/1
f 633/308/1 632/308/1 642/308/1 643/308/1
f 635/308/39 634/308/39 644/308/39 645/308/39
f 632/308/40 635/308/40 645/308/40 642/308/40
f 634/308/41 631/308/41 641/308/41 644/308/41
f 630/308/1 637/308/1 646/308/1 640/308/1
f 638/308/1 633/308/1 643/308/1 647/308/1
f 599/308/1 603/308/1 602/308/1
f 595/308/1 599/308/1 602/308/1 596/308/1
f 302/304/1 301/303/1 648/303/1 649/304/1
f 649/304/1 650/450/1 651/451/1
f 652/452/1 653/452/1 654/453/1 655/453/1
f 656/303/1 657/303/1 658/454/1 659/454/1
f 660/451/1 651/451/1 650/450/1 661/450/1
f 659/454/1 658/454/1 653/452/1 652/452/1
f 661/450/1 650/450/1 655/453/1 654/453/1
f 660/451/1 662/304/1 651/451/1
f 649/304/1 655/453/1 650/450/1
f 648/303/1 656/303/1 659/454/1
f 648/303/1 659/454/1 652/452/1
f 649/304/1 648/303/1 652/452/1 655/453/1
f 658/454/1 657/303/1 663/303/1 664/454/1
f 660/451/1 661/450/1 665/450/1 666/451/1
f 654/453/1 653/452/1 667/452/1 668/453/1
f 664/454/42 663/303/42 669/303/42 670/454/42
f 666/451/42 665/450/42 671/450/42 672/451/42
f 668/453/43 667/452/43 673/452/43 674/453/43
f 674/453/1 673/452/1 675/452/1 676/453/1
f 670/454/1 669/303/1 677/303/1 678/454/1
f 672/451/1 671/450/1 679/450/1 680/451/1
f 678/454/1 677/303/1 681/303/1 682/454/1
f 680/451/1 679/450/1 683/450/1 684/451/1
f 676/453/44 675/452/44 685/452/44 686/453/44
f 686/453/1 685/452/1 687/452/1 688/453/1
f 682/454/45 681/303/45 689/303/45 690/454/45
f 684/451/46 683/450/46 691/450/46 692/451/46
f 688/453/47 687/452/47 693/452/47 694/453/47
f 682/454/48 690/454/48 693/454/48 687/454/48
f 688/453/49 694/453/49 691/453/49 683/453/49
f 684/451/50 692/451/50 695/451/50 696/451/50
f 689/303/51 681/303/51 697/303/51 698/303/51
f 690/454/1 689/303/1 699/303/1 700/454/1
f 692/451/1 691/450/1 701/450/1 702/451/1
f 694/453/1 693/452/1 703/452/1 704/453/1
f 693/454/1 690/454/1 700/454/1 703/454/1
f 691/453/1 694/453/1 704/453/1 701/453/1
f 695/451/1 692/451/1 702/451/1 705/451/1
f 689/303/1 698/303/1 706/303/1 699/303/1
f 466/446/1 478/446/1 477/449/1
f 466/446/1 477/449/1 469/448/1
f 390/423/1 379/384/1 378/383/1 442/424/1
f 314/319/1 369/374/1 366/371/1 317/321/1 315/320/1
f 316/321/1 319/322/1 707/322/1 278/321/1
f 375/380/1 338/342/1 341/342/1 708/380/1
f 709/380/1 337/342/1 329/342/1 332/380/1
f 283/285/1 282/284/1 332/284/1 331/285/1
f 290/292/1 710/455/1 711/456/1 291/293/1
f 273/275/1 712/457/1 292/294/1 291/293/1
f 710/455/1 713/458/1 714/459/1 711/456/1
f 712/457/1 715/460/1 445/430/1 292/294/1
f 445/430/1 715/460/1 716/461/1 446/432/1
f 713/458/1 355/359/1 354/358/1 717/462/1 714/463/1
f 277/279/1 286/288/1 712/457/1 273/275/1
f 712/457/1 286/288/1 285/287/1 715/460/1
f 715/460/1 285/287/1 327/329/1 716/461/1
f 329/331/1 335/341/1 330/332/1
f 448/435/1 718/464/1 279/281/1 719/465/1
f 707/322/1 720/466/1 719/465/1
f 278/280/1 707/322/1 719/465/1 279/281/1
f 294/296/1 328/330/1 718/464/1
f 306/434/1 294/296/1 718/464/1 448/435/1
# 417 polygons - 51 triangles

File diff suppressed because it is too large Load Diff