Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Z
zghywpc-vue
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李苏
zghywpc-vue
Commits
6be14290
Commit
6be14290
authored
Dec 27, 2024
by
李苏
💬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
中广
parent
7558f9db
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
1123 additions
and
1064 deletions
+1123
-1064
index.vue
src/views/fmegl/fmekpigl/index.vue
+7
-1
index.vue
src/views/fmegl/fmekpigl/tu/index.vue
+6
-3
index.vue
src/views/fmegl/fmezbpgl/index.vue
+6
-2
index.vue
src/views/fmegl/fmezbpgl/tu/index.vue
+13
-2
index.vue
src/views/yhlywsytst/yhlywsytst/index.vue
+1091
-1056
No files found.
src/views/fmegl/fmekpigl/index.vue
View file @
6be14290
...
...
@@ -3,7 +3,7 @@
* @Author: lisu lisu@gavelinfo.com
* @Date: 2024-09-19 10:55:27
* @LastEditors: lisu lisu@gavelinfo.com
* @LastEditTime: 2024-1
0-30 10:15:06
* @LastEditTime: 2024-1
2-27 10:23:04
* @FilePath: /zghywpc-vue/src/views/fmegl/fmekpigl/index.vue
-->
<
template
>
...
...
@@ -42,6 +42,12 @@
}
</
script
>
<
style
>
#LOADING
{
display
:
none
!important
;
}
</
style
>
<
style
lang=
"scss"
scoped
>
.fmezbpgl
{
position
:
relative
...
...
src/views/fmegl/fmekpigl/tu/index.vue
View file @
6be14290
...
...
@@ -91,6 +91,9 @@
}
}
,
beforeDestroy
()
{
clearInterval
(
this
.
timer
)
}
,
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
edckpi
=
this
.
$echarts
.
init
(
this
.
$refs
.
dckpi
)
...
...
@@ -99,9 +102,9 @@
this
.
efmetj
=
this
.
$echarts
.
init
(
this
.
$refs
.
fmetj
)
/* 生成图表*/
this
.
initAll
()
//
this.timer = setInterval(() =>
{
//
this.initAll()
//
}
,
1000
*
10
)
this
.
timer
=
setInterval
(()
=>
{
this
.
initAll
()
}
,
1000
*
5
)
}
)
}
,
...
...
src/views/fmegl/fmezbpgl/index.vue
View file @
6be14290
...
...
@@ -3,7 +3,7 @@
* @Author: lisu lisu@gavelinfo.com
* @Date: 2024-09-19 10:55:27
* @LastEditors: lisu lisu@gavelinfo.com
* @LastEditTime: 2024-1
0-29 15:28:24
* @LastEditTime: 2024-1
2-27 10:19:42
* @FilePath: /zghywpc-vue/src/views/fmegl/fmezbpgl/index.vue
-->
<
template
>
...
...
@@ -41,7 +41,11 @@
}
</
script
>
<
style
>
#LOADING
{
display
:
none
!important
;
}
</
style
>
<
style
lang=
"scss"
scoped
>
.fmezbpgl
{
position
:
relative
...
...
src/views/fmegl/fmezbpgl/tu/index.vue
View file @
6be14290
...
...
@@ -232,6 +232,7 @@
export
default
{
data
()
{
return
{
timer
:
null
,
optionsData
:
[{
id
:
1
,
name
:
"一月份"
...
...
@@ -304,11 +305,20 @@
}
},
beforeDestroy
()
{
clearInterval
(
this
.
timer
)
},
mounted
()
{
this
.
init
()
this
.
initMonth
()
this
.
queryAll
()
this
.
timer
=
setInterval
(()
=>
{
this
.
queryAll
()
},
5
*
1000
)
},
methods
:
{
queryAll
(){
this
.
init
()
this
.
initMonth
()
},
init
()
{
this
.
$post
(
'fme/ufmezbp/query'
,
{
year
:
this
.
queryParams
.
year
,
...
...
@@ -368,6 +378,7 @@
</
script
>
<
style
lang=
"scss"
scoped
>
.showMain
{
height
:
calc
(
100%
-
50px
);
width
:
100%
;
...
...
src/views/yhlywsytst/yhlywsytst/index.vue
View file @
6be14290
...
...
@@ -2,7 +2,7 @@
* @Description:
* @Author: lisu lisu@gavelinfo.com
* @LastEditors: lisu lisu@gavelinfo.com
* @LastEditTime: 2024-1
1-11 16:11:27
* @LastEditTime: 2024-1
2-27 10:36:43
* @FilePath: /zghywpc-vue/src/views/yhlywsytst/yhlywsytst/index.vue
-->
<
template
>
...
...
@@ -10,53 +10,53 @@
element-loading-background=
"rgba(0, 0, 0, 0.8)"
ref=
"app"
class=
"min_full nullbp"
>
<!-- 弹框组件dialig -->
<czDialog
@
save=
'getSave'
:app=
'this'
v-if=
'showDialog'
/>
<div
v-show=
"tdloading==false"
class=
"bigTitle animate__animated animate__fadeInDown "
>
<div
v-show=
"tdloading==false"
class=
"bigTitle animate__animated animate__fadeInDown "
>
一回路异物溯源态势图
</div>
<!-- 视角工具栏-->
<div
v-show=
"tdloading==false"
class=
"toolButton animate__animated animate__fadeInRight"
>
<div
v-show=
"tdloading==false"
class=
"toolButton animate__animated animate__fadeInRight"
>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('jyfkgl/jyfkgl')"
>
经验反馈信息
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('jyfkgl/jyfkgl')"
>
经验反馈信息
</span>
</div>
</div>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('ywxxgl/ywsjlr')"
>
防异物管理系统
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('ywxxgl/ywsjlr')"
>
防异物管理系统
</span>
</div>
</div>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('system/menuManage')"
>
系统管理
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('system/menuManage')"
>
系统管理
</span>
</div>
</div>
</div>
<div
v-show=
"tdloading==false"
class=
"toolButton2 animate__animated animate__fadeInLeft"
>
<div
v-show=
"tdloading==false"
class=
"toolButton2 animate__animated animate__fadeInLeft"
>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('sbxxgl/sbxx')"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('sbxxgl/sbxx')"
>
设备信息
</span>
</div>
</div>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('sbjxgl/sbjxxx')"
>
设备检修信息
</span>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('sbjxgl/sbjxxx')"
>
设备检修信息
</span>
</div>
</div>
<div
class=
"flex1 text-center"
>
<div
class=
"menu"
>
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('ywxxgl/ywxxgl')"
>
异物信息
<span
style=
"cursor: pointer;"
@
click=
"toFullPage('ywxxgl/ywxxgl')"
>
异物信息
</span>
</div>
...
...
@@ -67,14 +67,14 @@
<el-checkbox
v-model=
"xzjj"
>
选中时近景
</el-checkbox>
</div>
</div>
-->
<div
v-show=
"selectedModelName"
class=
"leftOpt animate__animated "
:class=
"
{
<div
v-show=
"selectedModelName"
class=
"leftOpt animate__animated "
:class=
"
{
'animate__fadeInLeft':selectedModelName
&&
showLeft,
'animate__fadeOutLeft':selectedModelName
&&
!showLeft
}" style="padding-top: 30px;">
<div
class=
"sbxxTitle"
style=
"position: absolute;top: 5px;font-weight: 800;width: 100%;"
>
{{
'设备:'
+
(
selectedModel
.
name
||
'未选中'
)
}}
<span
class=
"hiddenButton"
>
<i
style=
"cursor: pointer;"
@
click=
"hiddenLeft"
class=
"el-icon-switch-button"
></i>
<i
style=
"cursor: pointer;"
@
click=
"hiddenLeft"
class=
"el-icon-switch-button"
></i>
</span>
</div>
<!-- 隐藏样式-->
...
...
@@ -296,18 +296,17 @@
<div
class=
"full flex "
style=
"height: calc(100% - 14px);padding-top: 6px;padding-left: 10px;"
>
<div
class=
"search-item flex1"
>
<span
class=
"search-span-r"
>
<span
style=
"color: rgb(255, 73, 73); margin-right: 4px;position: absolute;left: 4px;"
>
*
</span>
功能位置
</span>
<span
style=
"color: rgb(255, 73, 73); margin-right: 4px;position: absolute;left: 4px;"
>
*
</span>
功能位置
</span>
<el-input
v-model=
"sypcQueryParams.gnwz"
></el-input>
</div>
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
最小管径
</span>
最小管径
</span>
<el-input
v-model=
"sypcQueryParams.gj"
></el-input>
</div>
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
近期引入
</span>
近期引入
</span>
<RelSelect
placeholder=
''
style=
"width: 100%;"
:optionsData=
"[
{id:true,name:'是'},
{id:false,name:'否'}
...
...
@@ -317,13 +316,13 @@
</div>
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
规格
</span>
规格
</span>
<RelSelect
placeholder=
''
style=
"width: 100%;"
src=
'sbgl/usbxx/init/gg'
filterable
clearable
:match=
"
{value:'name',label:'name'}" v-model='sypcQueryParams.gg'>
</RelSelect>
</div>
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
材质
</span>
材质
</span>
<AuxInput
:overlayClick=
'czOverlayClick'
:match=
"
{
label: 'cz',
value:'cz'
...
...
@@ -339,21 +338,21 @@
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
机组状态
</span>
<RelSelect
@
change=
"kshZtChange"
placeholder=
''
style=
"width: 100%;"
src=
'ywxxgl/uywxx/init/zt '
filterable
clea
rable
:match=
"
{value:'id',label:'name'}" v-model='sypcQueryParams.kshZt'>
</RelSelect>
机组状态
</span>
<RelSelect
@
change=
"kshZtChange"
placeholder=
''
style=
"width: 100%;"
src=
'ywxxgl/uywxx/init/zt '
filte
rable
clearable
:match=
"
{value:'id',label:'name'}" v-model='sypcQueryParams.kshZt'>
</RelSelect>
</div>
<div
class=
"search-item flex1 "
>
<span
class=
"search-span-r"
>
备用设备状态
</span>
<!--
备用设备状态
</span>
<!--
/sbgl/usbxx/init/zt/by-->
<RelSelect
placeholder=
''
:collapseTags=
'false'
multiple
style=
"width: 100%;"
src=
'sbgl/usbxx/init/zt/by'
filterable
clearable
:match=
"
{value:'id',label:'name'}" v-model='sypcQueryParams.byZts'>
</RelSelect>
<RelSelect
placeholder=
''
:collapseTags=
'false'
multiple
style=
"width: 100%;"
src=
'sbgl/usbxx/init/zt/by'
filterable
clearable
:match=
"
{value:'id',label:'name'}" v-model='sypcQueryParams.byZts'>
</RelSelect>
</div>
<div
class=
"search-item "
style=
"padding-top: 18px;margin-right: 0px;width: 200px;"
>
<div
class=
"search-item "
style=
"padding-top: 18px;margin-right: 0px;width: 200px;"
>
<el-button
style=
"background-color: rgba(7,32,96,0.0);border: 1px solid #68D8FE; color: #68D8FE;"
size=
"mini"
@
click=
"sypc()"
type=
"primary"
>
排查
</el-button>
<el-button
style=
"background-color: rgba(7,32,96,0.0);border: 1px solid #68D8FE; color: #68D8FE;"
...
...
@@ -551,6 +550,11 @@
<div
id=
"container"
ref=
"container"
class=
"full"
>
</div>
<!-- 退出系统-->
<div
class=
"out"
>
<i
style=
"cursor: pointer;"
@
click=
"logout"
class=
"el-icon-switch-button"
></i>
</div>
</div>
</
template
>
...
...
@@ -578,10 +582,10 @@
czDialog
},
computed
:
{
selectedModelName
(){
return
this
.
selectedModel
.
name
selectedModelName
()
{
return
this
.
selectedModel
.
name
},
byZts
(){
byZts
()
{
return
this
.
sypcQueryParams
.
byZts
},
optionSingleHeight
()
{
...
...
@@ -597,9 +601,9 @@
data
()
{
return
{
/* 最近的排查信息*/
lastRes
:{},
czmxzt
:
'A'
,
showLeft
:
false
,
lastRes
:
{},
czmxzt
:
'A'
,
showLeft
:
false
,
/* 材质辅助输入*/
cztypeConfig
:
{
...
...
@@ -632,7 +636,7 @@
gg
:
''
,
cz
:
''
,
kshZt
:
''
,
byZts
:
''
byZts
:
''
// ywName: '异物1RIS0218',
// jzbm: '1',
// kshZt:'QT'
...
...
@@ -652,8 +656,8 @@
},
/* 加载相关动画*/
loading
:
true
,
tdloading
:
true
,
loadingText
:
'正在加载模型,请
等待
!'
,
tdloading
:
true
,
loadingText
:
'正在加载模型,请
稍等
!'
,
viewer
:
null
,
scene
:
null
,
/* 模型加载器*/
...
...
@@ -669,20 +673,20 @@
}
},
watch
:
{
selectedModelName
(
val
){
if
(
val
)
{
this
.
showLeft
=
true
}
else
{
this
.
showLeft
=
false
selectedModelName
(
val
)
{
if
(
val
)
{
this
.
showLeft
=
true
}
else
{
this
.
showLeft
=
false
}
},
byZts
(
val
){
if
(
val
)
{
if
(
this
.
sypcQueryParams
.
kshZt
)
{
byZts
(
val
)
{
if
(
val
)
{
if
(
this
.
sypcQueryParams
.
kshZt
)
{
}
else
{
}
else
{
this
.
$warning
(
'请先选择机组状态'
)
this
.
sypcQueryParams
.
byZts
=
''
this
.
sypcQueryParams
.
byZts
=
''
}
}
},
...
...
@@ -710,560 +714,170 @@
}
},
methods
:
{
hiddenLeft
(){
this
.
showLeft
=
false
},
toFullPage
(
hash
)
{
const
url
=
`
${
location
.
origin
}
/#/
${
hash
}
`
window
.
open
(
url
,
'_blank'
);
// 第二个参数 '_blank' 表示在新窗口或标签页中打开
},
kshZtChange
(
va
){
if
(
!
va
){
this
.
sypcQueryParams
.
byZts
=
''
}
},
getSave
(
str
)
{
console
.
log
(
str
)
this
.
showDialog
=
false
this
.
sypcQueryParams
.
cz
=
str
},
czOverlayClick
()
{
this
.
showDialog
=
true
},
czmx
()
{
/* A 代表初始状态 和查询后状态*/
if
(
this
.
czmxzt
==
'A'
){
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
model
.
visible
=
true
}
});
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
});
this
.
allFlowObject
=
[];
}
if
(
Object
.
keys
(
this
.
lastRes
).
length
==
0
){
this
.
$warning
(
'暂无最近的溯源数据'
)
}
else
{
this
.
czmxzt
=
'B'
}
}
else
{
/* 如果是B的话代表 模型处理过,还原回去了*/
this
.
sypcMethods2
(
this
.
lastRes
)
this
.
czmxzt
=
'A'
}
},
/* xsqbmx相关设置废除*/
xsqbmx
()
{
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
model
.
visible
=
true
}
});
this
.
mxbshow
=
false
},
/* 获取异物信息开始请求端口溯源*/
getYwxx
(
ywxx
)
{
this
.
queryParams
.
ywName
=
ywxx
.
name
this
.
apiJzbm
()
},
/* 点击按钮弹出异物,然后选中*/
savePdf
()
{
if
(
this
.
pdfBytes
)
{
const
base64String
=
this
.
pdfBytes
;
// const linkSource = `data:application/pdf;base64,${base64String}`
// var linkSource = `data:application/pdf;base64,${base64String}`
// 将 Base64 编码的字符串转换为 Blob 对象
function
base64ToBlob
(
base64
,
contentType
)
{
var
byteCharacters
=
window
.
atob
(
base64
);
var
byteNumbers
=
new
Array
(
byteCharacters
.
length
);
for
(
var
i
=
0
;
i
<
byteCharacters
.
length
;
i
++
)
{
byteNumbers
[
i
]
=
byteCharacters
.
charCodeAt
(
i
);
}
var
byteArray
=
new
Uint8Array
(
byteNumbers
);
return
new
Blob
([
byteArray
],
{
type
:
contentType
});
}
// 创建 Blob 对象并生成 URL
var
blob
=
base64ToBlob
(
base64String
,
'application/pdf'
);
var
url
=
URL
.
createObjectURL
(
blob
);
// 设置
<
a
>
标签的
href
属性
var
link
=
document
.
createElement
(
'a'
);
link
.
href
=
url
;
link
.
target
=
'_blank'
;
// 在新标签页中打开
link
.
click
();
link
.
remove
()
}
else
{
this
.
$warning
(
'请溯源后,再保存为排查日志'
)
}
},
sypcMethods2
(
res
){
let
sbxxList
=
res
.
data
.
records
.
kshSbInfos
||
[]
const
sbxxCodeList
=
sbxxList
.
map
(
item
=>
item
.
sbxxCode
)
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
let
isbh
=
false
sbxxCodeList
.
forEach
(
item
=>
{
if
(
model
.
name
.
includes
(
item
))
{
isbh
=
true
}
})
if
(
isbh
)
{
model
.
visible
=
true
async
logout
()
{
this
.
$confirm
(
'确定注销并退出系统吗?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
this
.
$post
(
'/logout'
).
finally
(()
=>
{
localStorage
.
clear
()
this
.
$store
.
dispatch
(
'LogOut'
).
then
(()
=>
{
location
.
href
=
'/index'
;
})
}
else
{
if
(
model
.
name
&&
model
.
name
!=
'地面'
)
{
model
.
visible
=
false
}
}
}
});
},
sypcMethods
(
res
)
{
this
.
lastRes
=
res
this
.
pdfBytes
=
res
.
data
.
records
.
pdfBytes
let
gnwz
=
res
.
data
.
records
.
gnwz
let
sbxxList
=
res
.
data
.
records
.
kshSbInfos
||
[]
let
zbInfos
=
res
.
data
.
records
.
zbInfos
||
[]
this
.
$success
(
`已标记
${
sbxxList
.
length
}
个设备`
)
const
sbxxCodeList
=
sbxxList
.
map
(
item
=>
item
.
sbxxCode
)
if
(
sbxxCodeList
.
length
==
0
)
{
return
}
if
(
sbxxCodeList
.
length
!=
0
)
{
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
}
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
let
isbh
=
false
sbxxCodeList
.
forEach
(
item
=>
{
if
(
model
.
name
.
includes
(
item
))
{
isbh
=
true
}
})
if
(
isbh
)
{
model
.
visible
=
true
let
jzReMaterialQueItem
=
{
model
,
material
:
model
.
oldmaterial
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
jzReMaterialQue
.
push
(
jzReMaterialQueItem
)
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(255, 164, 7, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
}
else
{
if
(
model
.
name
&&
model
.
name
!=
'地面'
)
{
model
.
visible
=
false
}
}
}
});
/* 显示展示全部按钮*/
this
.
mxbshow
=
true
/* 匹配展示数据和本地数据*/
if
(
this
.
jzReMaterialQue
.
length
!=
0
)
{
// this.viewer.cameraControl.fitTo(this.jzReMaterialQue[0].model);
// this.sylbshow = true
// this.clickTag(this.jzReMaterialQue[0].model.name)
let
model
=
false
let
sbxxCode
=
gnwz
||
this
.
sypcQueryParams
.
gnwz
.
replace
(
/
\s
+/g
,
''
);
this
.
jzReMaterialQue
.
forEach
(
jzitem
=>
{
if
(
jzitem
.
model
&&
jzitem
.
model
.
name
&&
this
.
getFirstPartOfString
(
jzitem
.
model
.
name
)
==
sbxxCode
)
{
model
=
jzitem
.
model
})},
hiddenLeft
()
{
this
.
showLeft
=
false
},
toFullPage
(
hash
)
{
const
url
=
`
${
location
.
origin
}
/#/
${
hash
}
`
window
.
open
(
url
,
'_blank'
);
// 第二个参数 '_blank' 表示在新窗口或标签页中打开
},
kshZtChange
(
va
)
{
if
(
!
va
)
{
this
.
sypcQueryParams
.
byZts
=
''
}
}
)
if
(
model
!==
false
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
model
);
this
.
s
ylbshow
=
tru
e
this
.
clickTag
(
model
.
name
)
}
else
{
this
.
viewer
.
cameraControl
.
fitTo
(
this
.
jzReMaterialQue
[
0
].
model
);
this
.
s
ylbshow
=
true
this
.
clickTag
(
this
.
jzReMaterialQue
[
0
].
model
.
name
)
}
}
,
getSave
(
str
)
{
console
.
log
(
str
)
this
.
s
howDialog
=
fals
e
this
.
sypcQueryParams
.
cz
=
str
}
,
czOverlayClick
()
{
this
.
s
howDialog
=
true
},
czmx
()
{
}
else
{
this
.
sylbshow
=
false
}
// if (sbxxList.length > 0 && (this.jzReMaterialQue.length != sbxxList.length)) {
// this.$warning('存在与模型数据不匹配的数据!')
// }
/* 绘制全部流向*/
this
.
allPieData
=
zbInfos
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
/* 绘制全部信息*/
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
/* A 代表初始状态 和查询后状态*/
if
(
this
.
czmxzt
==
'A'
)
{
});
this
.
allFlowObject
=
[];
}
let
flowPieDatas
=
this
.
allPieData
flowPieDatas
.
forEach
(
flowPieData
=>
{
const
children
=
this
.
allPieData
.
find
((
item
)
=>
item
.
name
===
flowPieData
.
name
)?.
children
;
if
(
!
children
)
{
return
;
}
children
.
forEach
((
item
)
=>
{
if
(
item
.
data
.
length
>=
2
)
{
const
o
=
this
.
drawPipe
(
item
.
data
.
map
((
item
)
=>
[
item
.
x
,
item
.
y
,
item
.
z
]),
item
.
radius
,
this
.
flowDirection
,
);
o
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
model
.
visible
=
true
}
});
this
.
allFlowObject
.
push
(
o
);
const
box
=
new
THREE
.
Box3
();
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
}
});
})
},
sypc
()
{
if
(
!
this
.
sypcQueryParams
.
gnwz
)
{
this
.
$warning
(
'请输入功能位置后进行查询!'
)
return
}
/* 先清空 选中的机组*/
this
.
jzReMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
jzReMaterialQue
.
splice
(
0
,
this
.
jzReMaterialQue
.
length
)
this
.
loading
=
true
this
.
loadingText
=
'正在处理,请稍等。'
/* 展示重置模型*/
this
.
czmxzt
=
'A'
/* 如果流动特性只能从高到底*/
if
(
this
.
sypcQueryParams
.
ldtx
==
'B'
){
this
.
$post
(
'ksh/query/highToLow'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
/* 获取加载数据*/
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
}
else
if
(
this
.
sypcQueryParams
.
isrRecentImport
!==
''
)
{
this
.
$post
(
'ksh/check/workOrder'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
/* 获取加载数据*/
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
}
/* 另外一个接口*/
else
{
this
.
$post
(
'ksh/query'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
}
},
getFirstPartOfString
(
str
)
{
// 查找"-"在字符串中的位置
const
dashIndex
=
str
.
indexOf
(
'-'
);
// 如果找到了"-",则返回"-"之前的部分(包含起始位置,不包含结束位置)
if
(
dashIndex
!==
-
1
)
{
return
str
.
substring
(
0
,
dashIndex
);
}
// 如果没有找到"-",则返回整个字符串
return
str
;
},
apiGetLbjxx
()
{
this
.
lbjlistData
=
[]
this
.
$post
(
'sbgl/usbxx/query'
,
{
kshSbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
lbjlistData
=
res
.
data
.
records
||
[]
})
},
apiGetYwxx
()
{
this
.
ywlistData
=
[]
this
.
$post
(
'ywxxgl/uywxx/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
ywlistData
=
res
.
data
.
records
||
[]
})
},
apiGetJxxx
()
{
this
.
jxlistData
=
[]
this
.
$post
(
'jxgl/usbjx/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
jxlistData
=
res
.
data
.
records
||
[]
})
},
apiGetBgxx
()
{
this
.
bglistData
=
[]
this
.
$post
(
'sbgl/usbbg/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
bglistData
=
res
.
data
.
records
||
[]
})
},
/**
* @description:选中标签后操作
* @param {String} code
* @return {*}
* @author: lisu
*/
clickTag
(
code
)
{
if
(
!
code
)
{
return
}
else
{
this
.
sbxxQueryParams
.
code
=
code
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
let
iscx
=
false
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
this
.
sbxxQueryParams
.
code
)
{
this
.
selectedModel
=
model
iscx
=
true
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
/* */
if
(
this
.
xzjj
)
{
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
}
});
this
.
allFlowObject
=
[];
}
}
});
if
(
iscx
==
false
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'未查询到设备!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
}
},
/**
* @description:查询流向信息,没有查询所有
* @return {*}
* @author: lisu
*/
sblxcx
()
{
if
(
true
)
{
this
.
sblxCode
=
this
.
sblxCode
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
this
.
$post
(
'sbgl/usblxgx/zbInfo'
,
{
sbxxCode
:
this
.
sblxCode
}).
then
(
res
=>
{
if
(
res
.
success
)
{
let
data
=
res
.
data
.
records
||
[]
if
(
res
.
data
.
records
.
length
==
0
)
{
this
.
sblxcxwcxdxx
=
true
this
.
sblxcxwcxdxxText
=
'未查询到流向!'
setTimeout
(()
=>
{
this
.
sblxcxwcxdxx
=
false
},
2000
)
if
(
Object
.
keys
(
this
.
lastRes
).
length
==
0
)
{
this
.
$warning
(
'暂无最近的溯源数据'
)
}
else
{
this
.
czmxzt
=
'B'
}
this
.
allPieData
=
data
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
if
(
res
.
data
.
records
.
length
!=
0
)
{
this
.
$success
(
`共查询到
${
res
.
data
.
records
.
length
}
条数据!共绘制
${
this
.
allPieData
.
length
}
条流向!`
)
}
}
})
}
},
sbcx
()
{
if
(
!
this
.
sbxxQueryParams
.
code
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'请输入设备编码!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
else
{
this
.
sbxxQueryParams
.
code
=
this
.
sbxxQueryParams
.
code
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
let
iscx
=
false
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
this
.
sbxxQueryParams
.
code
)
{
this
.
selectedModel
=
model
iscx
=
true
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
}
else
{
/* 如果是B的话代表 模型处理过,还原回去了*/
this
.
sypcMethods2
(
this
.
lastRes
)
this
.
czmxzt
=
'A'
}
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
},
/* xsqbmx相关设置废除*/
xsqbmx
()
{
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
model
.
visible
=
true
}
});
this
.
mxbshow
=
false
},
/* 获取异物信息开始请求端口溯源*/
getYwxx
(
ywxx
)
{
this
.
queryParams
.
ywName
=
ywxx
.
name
this
.
apiJzbm
()
},
/* 点击按钮弹出异物,然后选中*/
savePdf
()
{
if
(
this
.
pdfBytes
)
{
const
base64String
=
this
.
pdfBytes
;
// const linkSource = `data:application/pdf;base64,${base64String}`
// var linkSource = `data:application/pdf;base64,${base64String}`
// 将 Base64 编码的字符串转换为 Blob 对象
function
base64ToBlob
(
base64
,
contentType
)
{
var
byteCharacters
=
window
.
atob
(
base64
);
var
byteNumbers
=
new
Array
(
byteCharacters
.
length
);
for
(
var
i
=
0
;
i
<
byteCharacters
.
length
;
i
++
)
{
byteNumbers
[
i
]
=
byteCharacters
.
charCodeAt
(
i
);
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
var
byteArray
=
new
Uint8Array
(
byteNumbers
);
return
new
Blob
([
byteArray
],
{
type
:
contentType
});
}
// 创建 Blob 对象并生成 URL
var
blob
=
base64ToBlob
(
base64String
,
'application/pdf'
);
var
url
=
URL
.
createObjectURL
(
blob
);
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
// 设置
<
a
>
标签的
href
属性
var
link
=
document
.
createElement
(
'a'
);
link
.
href
=
url
;
link
.
target
=
'_blank'
;
// 在新标签页中打开
link
.
click
();
link
.
remove
()
}
else
{
this
.
$warning
(
'请溯源后,再保存为排查日志'
)
}
},
sypcMethods2
(
res
)
{
let
sbxxList
=
res
.
data
.
records
.
kshSbInfos
||
[]
const
sbxxCodeList
=
sbxxList
.
map
(
item
=>
item
.
sbxxCode
)
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
let
isbh
=
false
sbxxCodeList
.
forEach
(
item
=>
{
if
(
model
.
name
.
includes
(
item
))
{
isbh
=
true
}
})
/* */
if
(
this
.
xzjj
)
{
if
(
isbh
)
{
model
.
visible
=
true
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
else
{
if
(
model
.
name
&&
model
.
name
!=
'地面'
)
{
model
.
visible
=
false
}
}
}
}
});
if
(
iscx
==
false
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'未查询到设备!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
}
},
/* 弃用*/
apiJzbm
()
{
let
params
=
_
.
cloneDeep
(
this
.
queryParams
)
delete
params
.
sbxxCode
/* 先清空 选中的机组*/
this
.
jzReMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
jzReMaterialQue
.
splice
(
0
,
this
.
jzReMaterialQue
.
length
)
this
.
$post
(
'ksh/query'
,
params
).
then
(
res
=>
{
if
(
res
.
success
)
{
let
sbxxList
=
res
.
data
.
records
||
[]
});
},
sypcMethods
(
res
)
{
this
.
lastRes
=
res
this
.
pdfBytes
=
res
.
data
.
records
.
pdfBytes
let
gnwz
=
res
.
data
.
records
.
gnwz
let
sbxxList
=
res
.
data
.
records
.
kshSbInfos
||
[]
let
zbInfos
=
res
.
data
.
records
.
zbInfos
||
[]
this
.
$success
(
`已标记
${
sbxxList
.
length
}
个设备`
)
const
sbxxCodeList
=
sbxxList
.
map
(
item
=>
item
.
sbxxCode
)
/* 解决 先缓存选中色,后渲染黄色,默认选中时颜色不对
bug: 1默认还原为原色
2.高亮为黄色触发默认选中(黄色存储在另一个队列)
3.默认选中会还原上一个颜色
4.还原为原色,触发选中。变为选中色,清除为原色,覆盖了亮色
*/
if
(
sbxxCodeList
.
length
==
0
)
{
return
}
if
(
sbxxCodeList
.
length
!=
0
)
{
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
}
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 分割,在渲染高亮清空选中的*/
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
sbxxCodeList
.
includes
(
model
.
name
))
{
let
isbh
=
false
sbxxCodeList
.
forEach
(
item
=>
{
if
(
model
.
name
.
includes
(
item
))
{
isbh
=
true
}
})
if
(
isbh
)
{
model
.
visible
=
true
let
jzReMaterialQueItem
=
{
model
,
material
:
model
.
oldmaterial
.
clone
(),
...
...
@@ -1279,564 +893,972 @@
wireframe
:
false
,
})
}
else
{
if
(
model
.
name
&&
model
.
name
!=
'地面'
)
{
model
.
visible
=
false
}
}
}
});
/* 显示展示全部按钮*/
this
.
mxbshow
=
true
/* 匹配展示数据和本地数据*/
if
(
this
.
jzReMaterialQue
.
length
!=
0
)
{
// this.viewer.cameraControl.fitTo(this.jzReMaterialQue[0].model);
// this.sylbshow = true
// this.clickTag(this.jzReMaterialQue[0].model.name)
let
model
=
false
let
sbxxCode
=
gnwz
||
this
.
sypcQueryParams
.
gnwz
.
replace
(
/
\s
+/g
,
''
);
this
.
jzReMaterialQue
.
forEach
(
jzitem
=>
{
if
(
jzitem
.
model
&&
jzitem
.
model
.
name
&&
this
.
getFirstPartOfString
(
jzitem
.
model
.
name
)
==
sbxxCode
)
{
model
=
jzitem
.
model
}
})
if
(
model
!==
false
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
model
);
this
.
sylbshow
=
true
this
.
clickTag
(
model
.
name
)
}
else
{
this
.
viewer
.
cameraControl
.
fitTo
(
this
.
jzReMaterialQue
[
0
].
model
);
this
.
sylbshow
=
true
this
.
clickTag
(
this
.
jzReMaterialQue
[
0
].
model
.
name
)
}
this
.
viewer
.
cameraControl
.
fitTo
(
this
.
jzReMaterialQue
[
0
].
model
);
this
.
sylbshow
=
true
this
.
clickTag
(
this
.
jzReMaterialQue
[
0
].
model
.
name
)
}
else
{
this
.
sylbshow
=
false
}
// if (sbxxList.length > 0 && (this.jzReMaterialQue.length != sbxxList.length)) {
// this.$warning('存在与模型数据不匹配的数据!')
// }
/* 绘制全部流向*/
this
.
allPieData
=
zbInfos
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
/* 绘制全部信息*/
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
});
this
.
allFlowObject
=
[];
}
let
flowPieDatas
=
this
.
allPieData
flowPieDatas
.
forEach
(
flowPieData
=>
{
const
children
=
this
.
allPieData
.
find
((
item
)
=>
item
.
name
===
flowPieData
.
name
)?.
children
;
if
(
!
children
)
{
return
;
}
children
.
forEach
((
item
)
=>
{
if
(
item
.
data
.
length
>=
2
)
{
const
o
=
this
.
drawPipe
(
item
.
data
.
map
((
item
)
=>
[
item
.
x
,
item
.
y
,
item
.
z
]),
item
.
radius
,
this
.
flowDirection
,
);
o
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
}
});
this
.
allFlowObject
.
push
(
o
);
const
box
=
new
THREE
.
Box3
();
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
}
});
})
},
sypc
()
{
if
(
!
this
.
sypcQueryParams
.
gnwz
)
{
this
.
$warning
(
'请输入功能位置后进行查询!'
)
return
}
/* 先清空 选中的机组*/
this
.
jzReMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
jzReMaterialQue
.
splice
(
0
,
this
.
jzReMaterialQue
.
length
)
this
.
loading
=
true
this
.
loadingText
=
'正在处理,请稍等。'
/* 展示重置模型*/
this
.
czmxzt
=
'A'
/* 如果流动特性只能从高到底*/
if
(
this
.
sypcQueryParams
.
ldtx
==
'B'
)
{
this
.
$post
(
'ksh/query/highToLow'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
/* 获取加载数据*/
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
}
})
},
/* 解决com和 相机控制器事件冲突的问题*/
canNotMousedown
(
domList
)
{
domList
.
forEach
(
vdom
=>
{
vdom
.
addEventListener
(
'mouseover'
,
function
(
event
)
{
event
.
preventDefault
();
});
})
})
},
flowPieDataChange
(
val
)
{
this
.
handlerAllFlow
()
},
/* 绘制流动方法
}
else
if
(
this
.
sypcQueryParams
.
isrRecentImport
!==
''
)
{
this
.
$post
(
'ksh/check/workOrder'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
/* 获取加载数据*/
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
}
/* 另外一个接口*/
else
{
this
.
$post
(
'ksh/query'
,
this
.
sypcQueryParams
).
then
(
res
=>
{
if
(
res
.
success
)
{
this
.
sypcMethods
(
res
)
}
}).
finally
(()
=>
{
this
.
loading
=
false
})
}
*/
handlerAllFlow
()
{
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
});
this
.
allFlowObject
=
[];
}
const
children
=
this
.
allPieData
.
find
((
item
)
=>
item
.
name
===
this
.
flowPieData
)?.
children
;
if
(
!
children
)
{
return
;
}
children
.
forEach
((
item
)
=>
{
if
(
item
.
data
.
length
>=
2
)
{
const
o
=
this
.
drawPipe
(
item
.
data
.
map
((
item
)
=>
[
item
.
x
,
item
.
y
,
item
.
z
]),
item
.
radius
,
this
.
flowDirection
,
);
o
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
}
});
this
.
allFlowObject
.
push
(
o
);
const
box
=
new
THREE
.
Box3
();
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
this
.
viewer
.
cameraControl
.
control
.
fitToBox
(
box
,
true
,
{
cover
:
true
});
}
});
},
/* 获取流向数据*/
getData
()
{
this
.
$post
(
'sbgl/usblxgx/zbInfo'
,
{}).
then
(
res
=>
{
if
(
res
.
success
)
{
let
data
=
res
.
data
.
records
||
[]
this
.
allPieData
=
data
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
/* 绘制全部信息*/
// if (this.allFlowObject.length) {
// this.allFlowObject.forEach((item) => {
// item.removeFromParent();
// });
// this.allFlowObject = [];
// }
// let flowPieDatas=this.allPieData
// flowPieDatas.forEach(flowPieData=>{
// const children = this.allPieData.find((item) => item.name === flowPieData.name)?.children;
// if (!children) {
// return;
// }
// children.forEach((item) => {
// if (item.data.length >= 2) {
// const o = this.drawPipe(
// item.data.map((item) => [item.x, item.y, item.z]),
// item.radius,
// this.flowDirection,
// );
// o.traverse((node) => {
// if (node.isMesh) {
// node._thing_tag = "helper";
// }
// });
// this.allFlowObject.push(o);
// const box = new THREE.Box3();
// o.points.forEach((item) => {
// box.expandByPoint(new THREE.Vector3(...item));
// });
// o.points.forEach((item) => {
// box.expandByPoint(new THREE.Vector3(...item));
// });
// }
// });
// })
/* 绘制全部流向操作结束 */
}
})
},
/* 流向动画*/
drawPipe
(
positions
,
radius
,
direction
)
{
const
viewer
=
this
.
viewer
;
const
points
=
positions
.
map
(
/* 根据本身的模型定位来*/
(
item
)
=>
new
THREE
.
Vector3
(
item
[
0
]
/
1000
,
item
[
2
]
/
1000
,
-
item
[
1
]
/
1000
)
);
const
flowObject
=
new
VT
.
TubeLine
({
points
:
points
,
geometry
:
{
radius
:
radius
/
1000
/
2
,
cornerRadius
:
0
,
cornerSplit
:
10
,
},
material
:
{
// color: "#0099ff",
color
:
"#a1cf95"
,
side
:
2
,
map
:
{
image
:
"vt/resources/texture/arrow.png"
,
repeat
:
[
1
,
50
],
// rotation: direction ? Math.PI : 0,
wrapS
:
THREE
.
RepeatWrapping
,
wrapT
:
THREE
.
RepeatWrapping
,
},
transparent
:
true
,
depthTest
:
true
,
getFirstPartOfString
(
str
)
{
// 查找"-"在字符串中的位置
const
dashIndex
=
str
.
indexOf
(
'-'
);
// 如果找到了"-",则返回"-"之前的部分(包含起始位置,不包含结束位置)
if
(
dashIndex
!==
-
1
)
{
return
str
.
substring
(
0
,
dashIndex
);
}
// 如果没有找到"-",则返回整个字符串
return
str
;
},
});
flowObject
.
line
.
onBeforeRender
=
()
=>
{
if
(
flowObject
.
line
.
material
.
map
)
{
flowObject
.
line
.
material
.
map
.
offset
.
x
-=
0.05
;
}
};
flowObject
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
}
});
viewer
.
scene
.
add
(
flowObject
);
return
flowObject
;
},
clearSelected
()
{
// this.viewer.scene.traverse(function(obj) {
// console.log(obj,'模型对象')
// if (obj.isMesh) {
// obj.material = new THREE.MeshPhysicalMaterial({
// clearcoat: 1.0, //物体表面清漆层或者说透明涂层的厚度
// clearcoatRoughness: 0.1, //透明涂层表面的粗糙度
// color: obj.material.color, //默认颜色
// metalness: 0.9, //车外壳金属度
// roughness: 0.5, //车外壳粗糙度
// envMapIntensity: 2.5, //环境贴图对Mesh表面影响程度
// })
// }
// })
this
.
selectedModel
=
{
name
:
''
}
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
apiGetLbjxx
()
{
this
.
lbjlistData
=
[]
this
.
$post
(
'sbgl/usbxx/query'
,
{
kshSbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
lbjlistData
=
res
.
data
.
records
||
[]
})
},
apiGetYwxx
()
{
this
.
ywlistData
=
[]
this
.
$post
(
'ywxxgl/uywxx/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
ywlistData
=
res
.
data
.
records
||
[]
})
},
apiGetJxxx
()
{
this
.
jxlistData
=
[]
this
.
$post
(
'jxgl/usbjx/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
jxlistData
=
res
.
data
.
records
||
[]
})
},
apiGetBgxx
()
{
this
.
bglistData
=
[]
this
.
$post
(
'sbgl/usbbg/query'
,
{
sbxxCode
:
this
.
getFirstPartOfString
(
this
.
selectedModel
.
name
),
}).
then
(
res
=>
{
this
.
bglistData
=
res
.
data
.
records
||
[]
})
},
/**
* @description:选中标签后操作
* @param {String} code
* @return {*}
* @author: lisu
*/
clickTag
(
code
)
{
if
(
!
code
)
{
return
}
else
{
this
.
sbxxQueryParams
.
code
=
code
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
let
iscx
=
false
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
this
.
sbxxQueryParams
.
code
)
{
this
.
selectedModel
=
model
iscx
=
true
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
},
viewCenter
()
{
this
.
cameraTo
(
this
.
viewer
.
camera
.
position
.
x
,
this
.
viewer
.
camera
.
position
.
y
,
this
.
viewer
.
camera
.
position
.
z
,
0
,
0
,
0
)
},
reView
()
{
this
.
cameraTo
(
0
,
32
,
-
82
,
0
,
0
,
0
)
},
init
()
{
/* scene*/
// this.scene = new Viewer('scene')
// this.scene.camera.position.set(0, 17, -60)
/* viewer*/
// this.viewer = new Viewer('container')
// this.viewer.camera.position.set(0, 17, -60)
// const manager = new THREE.LoadingManager();
// manager.onProgress = (item, loaded, total) => {
// let process = (loaded / total * 100).toFixed(2)
// if (process == 100) {
// this.loading = false
// }
// // 这里可以根据加载进度执行其他操作
// };
// this.modelLoader = new ModelLoader(this.viewer, manager)
// const lights = new Lights(this.viewer)
// const ambientLight = lights.addAmbientLight() // 添加环境光
// ambientLight.setOption({
// color: 0xff0000,
// intensity: 6 // 环境光强度
// })
// ambientLight.light.name = 'AmbientLight'
// // 添加平行光
// lights.addDirectionalLight([200, 200, 200], {
// color: 'rgb(253,253,253)',
// intensity: 3,
// castShadow: false // 是否投射阴影
// })
// this.loadDm()
this
.
viewer
=
new
VT
.
Viewer
({
container
:
this
.
$refs
.
container
,
scene
:
{
helper
:
{
grid
:
{
visible
:
true
,
},
},
background
:
{
skyboxPath
:
"dark"
,
},
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
/* */
if
(
this
.
xzjj
)
{
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
}
}
}
});
if
(
iscx
==
false
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'未查询到设备!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
}
},
view
:
{
position
:
[
44.81080132492321
,
48.62916741352805
,
-
75.73966237503983
],
center
:
[
48.15565686619112
,
5.221820594458009
,
5.975771281142078
],
far
:
10000
,
near
:
0.1
,
aspect
:
null
,
fov
:
45
,
isOrtho
:
false
,
zoom
:
1
,
rotation
:
[
-
2.6532966628149923
,
-
0.036133545863119475
,
-
3.1224049976510337
,
"XYZ"
],
/**
* @description:查询流向信息,没有查询所有
* @return {*}
* @author: lisu
*/
sblxcx
()
{
if
(
true
)
{
this
.
sblxCode
=
this
.
sblxCode
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
this
.
$post
(
'sbgl/usblxgx/zbInfo'
,
{
sbxxCode
:
this
.
sblxCode
}).
then
(
res
=>
{
if
(
res
.
success
)
{
let
data
=
res
.
data
.
records
||
[]
if
(
res
.
data
.
records
.
length
==
0
)
{
this
.
sblxcxwcxdxx
=
true
this
.
sblxcxwcxdxxText
=
'未查询到流向!'
setTimeout
(()
=>
{
this
.
sblxcxwcxdxx
=
false
},
2000
)
}
else
{
}
this
.
allPieData
=
data
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
if
(
res
.
data
.
records
.
length
!=
0
)
{
this
.
$success
(
`共查询到
${
res
.
data
.
records
.
length
}
条数据!共绘制
${
this
.
allPieData
.
length
}
条流向!`
)
}
}
})
}
},
});
sbcx
()
{
if
(
!
this
.
sbxxQueryParams
.
code
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'请输入设备编码!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
else
{
this
.
sbxxQueryParams
.
code
=
this
.
sbxxQueryParams
.
code
.
replace
(
/
\s
+/g
,
''
);
/* 查询*/
let
iscx
=
false
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
this
.
sbxxQueryParams
.
code
)
{
this
.
selectedModel
=
model
iscx
=
true
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
},
loadAll
()
{
var
model
=
new
VT
.
Model
({
modelType
:
"gltf"
,
src
:
"/gltf/all.gltf"
,
})
model
.
addEventListener
(
"loaded"
,
()
=>
{
this
.
loading
=
false
this
.
tdloading
=
false
/* 解决共用showleft控制没有关闭效果
放置默认不控制,初始dom是存在的直接出现关闭特效
*/
this
.
viewer
.
scene
.
traverse
(
model
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
'2RCV001EX_IN'
)
{
model
.
name
=
'2RCV001EX管'
}
if
(
model
.
name
==
'2RCV001EX'
)
{
model
.
name
=
'2RCV001EX壳'
}
if
(
model
.
name
==
'1RCV001EX_IN'
)
{
model
.
name
=
'1RCV001EX管'
}
if
(
model
.
name
==
'1RCV001EX'
)
{
model
.
name
=
'1RCV001EX壳'
}
if
(
model
.
name
==
'2RCP0620-2R8015014'
)
{
model
.
name
=
'2RCP0620A'
}
if
(
model
.
name
==
'2RCP0620-2R8015052'
)
{
model
.
name
=
'2RCP0620B'
}
if
(
model
.
name
==
'1RCP0620-1R8015045'
)
{
model
.
name
=
'1RCP0620A'
}
if
(
model
.
name
==
'1RCP0620-1R8015909'
)
{
model
.
name
=
'1RCP0620B'
model
.
material
=
new
THREE
.
MeshPhongMaterial
(
{
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
/* */
if
(
this
.
xzjj
)
{
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
}
}
}
});
if
(
iscx
==
false
)
{
this
.
sbcxwcxdxx
=
true
this
.
sbcxwcxdxxText
=
'未查询到设备!'
setTimeout
(()
=>
{
this
.
sbcxwcxdxx
=
false
},
2000
)
}
model
.
oldmaterial
=
model
.
material
.
clone
()
}
})
this
.
getData
()
},
/* 弃用*/
apiJzbm
()
{
let
params
=
_
.
cloneDeep
(
this
.
queryParams
)
delete
params
.
sbxxCode
/* 先清空 选中的机组*/
});
this
.
viewer
.
scene
.
add
(
model
);
// this.modelLoader.loadModelToScene('/glb/all.glb', (model) => {
this
.
jzReMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
jzReMaterialQue
.
splice
(
0
,
this
.
jzReMaterialQue
.
length
)
this
.
$post
(
'ksh/query'
,
params
).
then
(
res
=>
{
if
(
res
.
success
)
{
let
sbxxList
=
res
.
data
.
records
||
[]
this
.
$success
(
`已标记
${
sbxxList
.
length
}
个设备`
)
const
sbxxCodeList
=
sbxxList
.
map
(
item
=>
item
.
sbxxCode
)
/* 解决 先缓存选中色,后渲染黄色,默认选中时颜色不对
bug: 1默认还原为原色
2.高亮为黄色触发默认选中(黄色存储在另一个队列)
3.默认选中会还原上一个颜色
4.还原为原色,触发选中。变为选中色,清除为原色,覆盖了亮色
*/
if
(
sbxxCodeList
.
length
!=
0
)
{
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
}
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 分割,在渲染高亮清空选中的*/
this
.
viewer
.
scene
.
traverse
((
model
)
=>
{
if
(
model
.
isMesh
)
{
if
(
sbxxCodeList
.
includes
(
model
.
name
))
{
let
jzReMaterialQueItem
=
{
model
,
material
:
model
.
oldmaterial
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
jzReMaterialQue
.
push
(
jzReMaterialQueItem
)
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(255, 164, 7, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
// model.object.position.set(-42, -10, 0)
}
}
});
if
(
this
.
jzReMaterialQue
.
length
!=
0
)
{
// model.object.scale.set(1, 1, 1)
// model.object.updateMatrixWorld(true);
// console.log(model,'console.log(model)console.log(model)')
// }, (num) => {
// let showNum = num * 100
// if (showNum == 100) {
// this.loadingText = `模型加载完毕,请稍等!`
// /* 机组高亮测试*/
// setTimeout(() => {
// this.apiJzbm()
// }, 2000)
// } else {
// this.loadingText = `正在加载模型${showNum}%!`
// }
// /* */
this
.
viewer
.
cameraControl
.
fitTo
(
this
.
jzReMaterialQue
[
0
].
model
);
this
.
sylbshow
=
true
this
.
clickTag
(
this
.
jzReMaterialQue
[
0
].
model
.
name
)
}
else
{
this
.
sylbshow
=
false
}
// if (sbxxList.length > 0 && (this.jzReMaterialQue.length != sbxxList.length)) {
// this.$warning('存在与模型数据不匹配的数据!')
// }
// })
},
loadDm
()
{
const
geometry
=
new
THREE
.
PlaneGeometry
(
1000
,
1000
,
500
,
500
);
// 创建一个100x100的平面,水平和垂直各10条线
const
material
=
new
THREE
.
LineBasicMaterial
({
color
:
0x585858
,
linewidth
:
0.5
});
const
grid
=
new
THREE
.
LineSegments
(
geometry
,
material
);
grid
.
rotation
.
x
=
-
Math
.
PI
/
2
;
// 旋转网格,使其平铺在x-z平面上
grid
.
position
.
y
=
-
18
;
// 将网格向下移动一点,使其位于底部
grid
.
name
=
'地面'
this
.
viewer
.
scene
.
add
(
grid
);
},
/* 点击*/
tdClick
()
{
this
.
viewer
.
renderer
.
domElement
.
addEventListener
(
'click'
,
(
e
)
=>
{
const
rayCaster
=
new
THREE
.
Raycaster
()
const
mouse
=
new
THREE
.
Vector2
()
mouse
.
x
=
(
e
.
offsetX
/
this
.
viewer
.
renderer
.
domElement
.
clientWidth
)
*
2
-
1
mouse
.
y
=
-
(
e
.
offsetY
/
this
.
viewer
.
renderer
.
domElement
.
clientHeight
)
*
2
+
1
rayCaster
.
setFromCamera
(
mouse
,
this
.
viewer
.
camera
)
const
intersects
=
rayCaster
.
intersectObject
(
this
.
viewer
.
scene
,
true
)
// 计算物体和射线的焦点
if
(
intersects
[
0
])
{
if
(
intersects
[
0
].
object
.
name
==
'地面'
)
{
return
}
try
{
let
model
let
modelIndex
=
intersects
.
findIndex
(
item
=>
item
.
object
.
name
!==
''
&&
item
.
object
.
visible
==
true
)
if
(
modelIndex
!=
-
1
)
{
rconsole
.
log
(
`当前选中
${
modelIndex
}
`
)
model
=
intersects
[
modelIndex
].
object
}
else
{
console
.
log
(
'本次选中不存在name的节点'
)
}
})
},
/* 解决com和 相机控制器事件冲突的问题*/
canNotMousedown
(
domList
)
{
domList
.
forEach
(
vdom
=>
{
vdom
.
addEventListener
(
'mouseover'
,
function
(
event
)
{
event
.
preventDefault
();
});
})
},
flowPieDataChange
(
val
)
{
this
.
handlerAllFlow
()
},
/* 绘制流动方法
*/
handlerAllFlow
()
{
if
(
this
.
allFlowObject
.
length
)
{
this
.
allFlowObject
.
forEach
((
item
)
=>
{
item
.
removeFromParent
();
/* 当模型隐藏 不继续触发*/
if
(
model
.
visible
==
false
)
{
rconsole
.
log
(
'当前对象已屏蔽'
)
return
});
this
.
allFlowObject
=
[];
}
const
children
=
this
.
allPieData
.
find
((
item
)
=>
item
.
name
===
this
.
flowPieData
)?.
children
;
if
(
!
children
)
{
return
;
}
children
.
forEach
((
item
)
=>
{
if
(
item
.
data
.
length
>=
2
)
{
const
o
=
this
.
drawPipe
(
item
.
data
.
map
((
item
)
=>
[
item
.
x
,
item
.
y
,
item
.
z
]),
item
.
radius
,
this
.
flowDirection
,
);
o
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
}
});
this
.
allFlowObject
.
push
(
o
);
const
box
=
new
THREE
.
Box3
();
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
o
.
points
.
forEach
((
item
)
=>
{
box
.
expandByPoint
(
new
THREE
.
Vector3
(...
item
));
});
this
.
viewer
.
cameraControl
.
control
.
fitToBox
(
box
,
true
,
{
cover
:
true
});
}
});
},
/* 获取流向数据*/
getData
()
{
this
.
$post
(
'sbgl/usblxgx/zbInfo'
,
{}).
then
(
res
=>
{
if
(
res
.
success
)
{
let
data
=
res
.
data
.
records
||
[]
this
.
allPieData
=
data
.
filter
((
item
)
=>
{
return
item
.
children
.
some
((
child
)
=>
child
.
data
.
length
>=
2
);
});
/* 绘制全部信息*/
// if (this.allFlowObject.length) {
// this.allFlowObject.forEach((item) => {
// item.removeFromParent();
// });
// this.allFlowObject = [];
// }
// let flowPieDatas=this.allPieData
// flowPieDatas.forEach(flowPieData=>{
// const children = this.allPieData.find((item) => item.name === flowPieData.name)?.children;
// if (!children) {
// return;
// }
// children.forEach((item) => {
// if (item.data.length >= 2) {
// const o = this.drawPipe(
// item.data.map((item) => [item.x, item.y, item.z]),
// item.radius,
// this.flowDirection,
// );
// o.traverse((node) => {
// if (node.isMesh) {
// node._thing_tag = "helper";
// }
// });
// this.allFlowObject.push(o);
// const box = new THREE.Box3();
// o.points.forEach((item) => {
// box.expandByPoint(new THREE.Vector3(...item));
// });
// o.points.forEach((item) => {
// box.expandByPoint(new THREE.Vector3(...item));
// });
// }
// });
// })
/* 绘制全部流向操作结束 */
}
})
},
/* 流向动画*/
drawPipe
(
positions
,
radius
,
direction
)
{
const
viewer
=
this
.
viewer
;
const
points
=
positions
.
map
(
/* 根据本身的模型定位来*/
(
item
)
=>
new
THREE
.
Vector3
(
item
[
0
]
/
1000
,
item
[
2
]
/
1000
,
-
item
[
1
]
/
1000
)
);
const
flowObject
=
new
VT
.
TubeLine
({
points
:
points
,
geometry
:
{
radius
:
radius
/
1000
/
2
,
cornerRadius
:
0
,
cornerSplit
:
10
,
},
material
:
{
// color: "#0099ff",
color
:
"#a1cf95"
,
side
:
2
,
map
:
{
image
:
"vt/resources/texture/arrow.png"
,
repeat
:
[
1
,
50
],
// rotation: direction ? Math.PI : 0,
wrapS
:
THREE
.
RepeatWrapping
,
wrapT
:
THREE
.
RepeatWrapping
,
},
transparent
:
true
,
depthTest
:
true
,
},
});
flowObject
.
line
.
onBeforeRender
=
()
=>
{
if
(
flowObject
.
line
.
material
.
map
)
{
flowObject
.
line
.
material
.
map
.
offset
.
x
-=
0.05
;
}
};
flowObject
.
traverse
((
node
)
=>
{
if
(
node
.
isMesh
)
{
node
.
_thing_tag
=
"helper"
;
}
this
.
selectedModel
=
model
this
.
showLeft
=
true
// model.visible=false
});
viewer
.
scene
.
add
(
flowObject
);
return
flowObject
;
},
clearSelected
()
{
// this.viewer.scene.traverse(function(obj) {
// console.log(obj,'模型对象')
// if (obj.isMesh) {
// obj.material = new THREE.MeshPhysicalMaterial({
// clearcoat: 1.0, //物体表面清漆层或者说透明涂层的厚度
// clearcoatRoughness: 0.1, //透明涂层表面的粗糙度
// color: obj.material.color, //默认颜色
// metalness: 0.9, //车外壳金属度
// roughness: 0.5, //车外壳粗糙度
// envMapIntensity: 2.5, //环境贴图对Mesh表面影响程度
// })
// }
// })
this
.
selectedModel
=
{
name
:
''
}
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
},
viewCenter
()
{
this
.
cameraTo
(
this
.
viewer
.
camera
.
position
.
x
,
this
.
viewer
.
camera
.
position
.
y
,
this
.
viewer
.
camera
.
position
.
z
,
0
,
0
,
0
)
},
reView
()
{
this
.
cameraTo
(
0
,
32
,
-
82
,
0
,
0
,
0
)
},
init
()
{
/* scene*/
// this.scene = new Viewer('scene')
// this.scene.camera.position.set(0, 17, -60)
/* viewer*/
// this.viewer = new Viewer('container')
// this.viewer.camera.position.set(0, 17, -60)
// const manager = new THREE.LoadingManager();
// manager.onProgress = (item, loaded, total) => {
// let process = (loaded / total * 100).toFixed(2)
// if (process == 100) {
// this.loading = false
// }
// // 这里可以根据加载进度执行其他操作
// };
// this.modelLoader = new ModelLoader(this.viewer, manager)
// const lights = new Lights(this.viewer)
// const ambientLight = lights.addAmbientLight() // 添加环境光
// ambientLight.setOption({
// color: 0xff0000,
// intensity: 6 // 环境光强度
// })
// ambientLight.light.name = 'AmbientLight'
// // 添加平行光
// lights.addDirectionalLight([200, 200, 200], {
// color: 'rgb(253,253,253)',
// intensity: 3,
// castShadow: false // 是否投射阴影
// })
// this.loadDm()
this
.
viewer
=
new
VT
.
Viewer
({
container
:
this
.
$refs
.
container
,
scene
:
{
helper
:
{
grid
:
{
visible
:
true
,
},
},
background
:
{
skyboxPath
:
"dark"
,
},
},
view
:
{
position
:
[
44.81080132492321
,
48.62916741352805
,
-
75.73966237503983
],
center
:
[
48.15565686619112
,
5.221820594458009
,
5.975771281142078
],
far
:
10000
,
near
:
0.1
,
aspect
:
null
,
fov
:
45
,
isOrtho
:
false
,
zoom
:
1
,
rotation
:
[
-
2.6532966628149923
,
-
0.036133545863119475
,
-
3.1224049976510337
,
"XYZ"
],
},
});
},
loadAll
()
{
var
model
=
new
VT
.
Model
({
modelType
:
"gltf"
,
src
:
"/gltf/all.gltf"
,
})
model
.
addEventListener
(
"loaded"
,
()
=>
{
this
.
loading
=
false
this
.
tdloading
=
false
/* 解决共用showleft控制没有关闭效果
放置默认不控制,初始dom是存在的直接出现关闭特效
*/
this
.
viewer
.
scene
.
traverse
(
model
=>
{
if
(
model
.
isMesh
)
{
if
(
model
.
name
==
'2RCV001EX_IN'
)
{
model
.
name
=
'2RCV001EX管'
}
if
(
model
.
name
==
'2RCV001EX'
)
{
model
.
name
=
'2RCV001EX壳'
}
if
(
model
.
name
==
'1RCV001EX_IN'
)
{
model
.
name
=
'1RCV001EX管'
}
if
(
model
.
name
==
'1RCV001EX'
)
{
model
.
name
=
'1RCV001EX壳'
}
if
(
model
.
name
==
'2RCP0620-2R8015014'
)
{
model
.
name
=
'2RCP0620A'
}
if
(
model
.
name
==
'2RCP0620-2R8015052'
)
{
model
.
name
=
'2RCP0620B'
}
if
(
model
.
name
==
'1RCP0620-1R8015045'
)
{
model
.
name
=
'1RCP0620A'
}
if
(
model
.
name
==
'1RCP0620-1R8015909'
)
{
model
.
name
=
'1RCP0620B'
}
model
.
oldmaterial
=
model
.
material
.
clone
()
}
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
this
.
getData
()
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
});
this
.
viewer
.
scene
.
add
(
model
);
// this.modelLoader.loadModelToScene('/glb/all.glb', (model) => {
// model.object.position.set(-42, -10, 0)
// model.object.scale.set(1, 1, 1)
// model.object.updateMatrixWorld(true);
// console.log(model,'console.log(model)console.log(model)')
// }, (num) => {
// let showNum = num * 100
// if (showNum == 100) {
// this.loadingText = `模型加载完毕,请稍等!`
// /* 机组高亮测试*/
// setTimeout(() => {
// this.apiJzbm()
// }, 2000)
// } else {
// this.loadingText = `正在加载模型${showNum}%!`
// }
// /* */
// })
},
loadDm
()
{
const
geometry
=
new
THREE
.
PlaneGeometry
(
1000
,
1000
,
500
,
500
);
// 创建一个100x100的平面,水平和垂直各10条线
const
material
=
new
THREE
.
LineBasicMaterial
({
color
:
0x585858
,
linewidth
:
0.5
});
const
grid
=
new
THREE
.
LineSegments
(
geometry
,
material
);
grid
.
rotation
.
x
=
-
Math
.
PI
/
2
;
// 旋转网格,使其平铺在x-z平面上
grid
.
position
.
y
=
-
18
;
// 将网格向下移动一点,使其位于底部
grid
.
name
=
'地面'
this
.
viewer
.
scene
.
add
(
grid
);
},
/* 点击*/
tdClick
()
{
this
.
viewer
.
renderer
.
domElement
.
addEventListener
(
'click'
,
(
e
)
=>
{
const
rayCaster
=
new
THREE
.
Raycaster
()
const
mouse
=
new
THREE
.
Vector2
()
mouse
.
x
=
(
e
.
offsetX
/
this
.
viewer
.
renderer
.
domElement
.
clientWidth
)
*
2
-
1
mouse
.
y
=
-
(
e
.
offsetY
/
this
.
viewer
.
renderer
.
domElement
.
clientHeight
)
*
2
+
1
rayCaster
.
setFromCamera
(
mouse
,
this
.
viewer
.
camera
)
const
intersects
=
rayCaster
.
intersectObject
(
this
.
viewer
.
scene
,
true
)
// 计算物体和射线的焦点
if
(
intersects
[
0
])
{
if
(
intersects
[
0
].
object
.
name
==
'地面'
)
{
return
}
}
try
{
let
model
let
modelIndex
=
intersects
.
findIndex
(
item
=>
item
.
object
.
name
!==
''
&&
item
.
object
.
visible
==
true
)
if
(
modelIndex
!=
-
1
)
{
rconsole
.
log
(
`当前选中
${
modelIndex
}
`
)
model
=
intersects
[
modelIndex
].
object
}
else
{
console
.
log
(
'本次选中不存在name的节点'
)
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
/* 当模型隐藏 不继续触发*/
if
(
model
.
visible
==
false
)
{
rconsole
.
log
(
'当前对象已屏蔽'
)
return
}
this
.
selectedModel
=
model
this
.
showLeft
=
true
// model.visible=false
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
}
catch
(
e
)
{
rconsole
.
log
(
e
)
}
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
}
})
},
tdblClick
()
{
this
.
viewer
.
renderer
.
domElement
.
addEventListener
(
'dblclick'
,
(
e
)
=>
{
const
rayCaster
=
new
THREE
.
Raycaster
()
const
mouse
=
new
THREE
.
Vector2
()
mouse
.
x
=
(
e
.
offsetX
/
this
.
viewer
.
renderer
.
domElement
.
clientWidth
)
*
2
-
1
mouse
.
y
=
-
(
e
.
offsetY
/
this
.
viewer
.
renderer
.
domElement
.
clientHeight
)
*
2
+
1
rayCaster
.
setFromCamera
(
mouse
,
this
.
viewer
.
camera
)
const
intersects
=
rayCaster
.
intersectObject
(
this
.
viewer
.
scene
,
true
)
// 计算物体和射线的焦点
if
(
intersects
[
0
])
{
if
(
intersects
[
0
].
object
.
name
==
'地面'
)
{
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
}
catch
(
e
)
{
rconsole
.
log
(
e
)
}
return
}
let
model
if
(
intersects
[
0
].
object
.
name
==
''
)
{
model
=
intersects
[
1
].
object
}
else
{
model
=
intersects
[
0
].
object
}
this
.
selectedModel
=
model
this
.
showLeft
=
true
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
})
},
tdblClick
()
{
this
.
viewer
.
renderer
.
domElement
.
addEventListener
(
'dblclick'
,
(
e
)
=>
{
const
rayCaster
=
new
THREE
.
Raycaster
()
const
mouse
=
new
THREE
.
Vector2
()
mouse
.
x
=
(
e
.
offsetX
/
this
.
viewer
.
renderer
.
domElement
.
clientWidth
)
*
2
-
1
mouse
.
y
=
-
(
e
.
offsetY
/
this
.
viewer
.
renderer
.
domElement
.
clientHeight
)
*
2
+
1
rayCaster
.
setFromCamera
(
mouse
,
this
.
viewer
.
camera
)
const
intersects
=
rayCaster
.
intersectObject
(
this
.
viewer
.
scene
,
true
)
// 计算物体和射线的焦点
if
(
intersects
[
0
])
{
if
(
intersects
[
0
].
object
.
name
==
'地面'
)
{
return
}
let
model
if
(
intersects
[
0
].
object
.
name
==
''
)
{
model
=
intersects
[
1
].
object
}
else
{
model
=
intersects
[
0
].
object
}
this
.
selectedModel
=
model
this
.
showLeft
=
true
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
/* 执行并情况材料队列 */
this
.
reMaterialQue
.
forEach
(
item
=>
{
item
.
revert
()
})
this
.
reMaterialQue
.
splice
(
0
,
this
.
reMaterialQue
.
length
)
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
/* */
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
/* 添加材质模型队列*/
let
reMaterialQueItem
=
{
model
,
material
:
model
.
material
.
clone
(),
revert
:
function
()
{
this
.
model
.
material
=
this
.
material
}
}
this
.
reMaterialQue
.
push
(
reMaterialQueItem
)
}
})
},
/* reMaterialQue 相关操作*/
getCameraPosition
(
d
,
point
)
{
// 确保point是一个对象,并且包含x, y, z属性
if
(
!
point
||
typeof
point
.
x
!==
'number'
||
typeof
point
.
y
!==
'number'
||
typeof
point
.
z
!==
'number'
)
{
throw
new
Error
(
'Invalid point object'
);
}
model
.
material
=
new
THREE
.
MeshPhongMaterial
({
color
:
new
THREE
.
Color
(
'rgba(69, 255, 128, 0.8)'
),
transparent
:
true
,
opacity
:
0.8
,
wireframe
:
false
,
})
/* */
const
object
=
model
;
if
(
object
)
{
this
.
viewer
.
cameraControl
.
fitTo
(
object
);
}
// 计算从原点(0,0,0)到模型点的向量
const
vector
=
{
x
:
point
.
x
-
0
,
y
:
point
.
y
-
0
,
z
:
point
.
z
-
0
};
// 计算向量的长度(模)
const
length
=
Math
.
sqrt
(
vector
.
x
*
vector
.
x
+
vector
.
y
*
vector
.
y
+
vector
.
z
*
vector
.
z
);
// 如果长度为0(即模型点就是原点),则返回一个错误或默认位置
if
(
length
===
0
)
{
throw
new
Error
(
'Model point is at the origin'
);
}
}
})
},
/* reMaterialQue 相关操作*/
getCameraPosition
(
d
,
point
)
{
// 确保point是一个对象,并且包含x, y, z属性
if
(
!
point
||
typeof
point
.
x
!==
'number'
||
typeof
point
.
y
!==
'number'
||
typeof
point
.
z
!==
'number'
)
{
throw
new
Error
(
'Invalid point object'
);
}
// 计算单位向量(将向量除以它的长度)
const
unitVector
=
{
x
:
vector
.
x
/
length
,
y
:
vector
.
y
/
length
,
z
:
vector
.
z
/
length
};
// 计算相机位置:模型点位置加上单位向量乘以距离d(但注意,这里我们实际上是将相机放在模型点之后d的位置)
// 如果想要相机在模型点和原点之间,可以调整d的符号或计算方式
const
cameraPosition
=
{
x
:
point
.
x
-
d
*
unitVector
.
x
,
y
:
point
.
y
-
d
*
unitVector
.
y
,
z
:
point
.
z
-
d
*
unitVector
.
z
};
return
cameraPosition
;
},
/* 封装相机转向方法动画*/
cameraTo
(
x
,
y
,
z
,
px
,
py
,
pz
)
{
let
_camera
=
this
.
viewer
.
cameraControl
.
camera
let
currentPosition
=
_camera
.
position
.
clone
();
let
oldx
=
currentPosition
.
x
let
oldy
=
currentPosition
.
y
let
oldz
=
currentPosition
.
z
let
coldx
=
this
.
viewer
.
controls
.
target
.
x
let
coldy
=
this
.
viewer
.
controls
.
target
.
y
let
coldz
=
this
.
viewer
.
controls
.
target
.
z
let
viewer
=
this
.
viewer
/* 计算过渡差值*/
let
tl
=
gsap
.
timeline
();
tl
.
to
({},
{
duration
:
1.5
,
// 动画持续时间
ease
:
"power1.inOut"
,
// 缓动函数
onUpdate
:
function
()
{
let
progress
=
this
.
progress
();
// 获取当前进度(0到1之间)
_camera
.
position
.
set
(
oldx
+
(
x
-
oldx
)
*
progress
,
oldy
+
(
y
-
oldy
)
*
progress
,
oldz
+
(
z
-
oldz
)
*
progress
);
viewer
.
controls
.
target
.
set
(
coldx
+
(
px
-
coldx
)
*
progress
,
coldy
+
(
py
-
coldy
)
*
progress
,
coldz
+
(
pz
-
coldz
)
*
progress
)
// 计算从原点(0,0,0)到模型点的向量
const
vector
=
{
x
:
point
.
x
-
0
,
y
:
point
.
y
-
0
,
z
:
point
.
z
-
0
};
// 计算向量的长度(模)
const
length
=
Math
.
sqrt
(
vector
.
x
*
vector
.
x
+
vector
.
y
*
vector
.
y
+
vector
.
z
*
vector
.
z
);
// 如果长度为0(即模型点就是原点),则返回一个错误或默认位置
if
(
length
===
0
)
{
throw
new
Error
(
'Model point is at the origin'
);
}
// 计算单位向量(将向量除以它的长度)
const
unitVector
=
{
x
:
vector
.
x
/
length
,
y
:
vector
.
y
/
length
,
z
:
vector
.
z
/
length
};
// 计算相机位置:模型点位置加上单位向量乘以距离d(但注意,这里我们实际上是将相机放在模型点之后d的位置)
// 如果想要相机在模型点和原点之间,可以调整d的符号或计算方式
const
cameraPosition
=
{
x
:
point
.
x
-
d
*
unitVector
.
x
,
y
:
point
.
y
-
d
*
unitVector
.
y
,
z
:
point
.
z
-
d
*
unitVector
.
z
};
return
cameraPosition
;
},
/* 封装相机转向方法动画*/
cameraTo
(
x
,
y
,
z
,
px
,
py
,
pz
)
{
let
_camera
=
this
.
viewer
.
cameraControl
.
camera
let
currentPosition
=
_camera
.
position
.
clone
();
let
oldx
=
currentPosition
.
x
let
oldy
=
currentPosition
.
y
let
oldz
=
currentPosition
.
z
let
coldx
=
this
.
viewer
.
controls
.
target
.
x
let
coldy
=
this
.
viewer
.
controls
.
target
.
y
let
coldz
=
this
.
viewer
.
controls
.
target
.
z
let
viewer
=
this
.
viewer
/* 计算过渡差值*/
let
tl
=
gsap
.
timeline
();
tl
.
to
({},
{
duration
:
1.5
,
// 动画持续时间
ease
:
"power1.inOut"
,
// 缓动函数
onUpdate
:
function
()
{
let
progress
=
this
.
progress
();
// 获取当前进度(0到1之间)
_camera
.
position
.
set
(
oldx
+
(
x
-
oldx
)
*
progress
,
oldy
+
(
y
-
oldy
)
*
progress
,
oldz
+
(
z
-
oldz
)
*
progress
);
viewer
.
controls
.
target
.
set
(
coldx
+
(
px
-
coldx
)
*
progress
,
coldy
+
(
py
-
coldy
)
*
progress
,
coldz
+
(
pz
-
coldz
)
*
progress
)
}
});
}
});
}
}
}
}
}
</
script
>
<
style
>
<
style
>
#LOADING
{
display
:
none
!important
;
display
:
none
!important
;
}
</
style
>
<
style
scoped
lang=
"scss"
>
.hiddenButton
{
.hiddenButton
{
float
:
right
;
color
:
#68D8FE
;
}
}
.search-span
{
min-width
:
60px
;
float
:
right
;
...
...
@@ -1894,17 +1916,20 @@
::v-deep
.el-switch__core
::after
{
height
:
12px
;
}
::v-deep
.el-tag.el-tag--info
{
background-color
:
rgba
(
0
,
0
,
0
,
0
.6
)
!
important
;
color
:
#68D8FE
;
color
:
#68D8FE
;
border
:
1px
solid
#68D8FE
;
}
::v-deep
.el-select-dropdown__list
{
::v-deep
.el-select-dropdown__list
{
background-color
:
rgba
(
0
,
0
,
0
,
0
.6
)
!
important
;
color
:
#68D8FE
;
color
:
#68D8FE
;
border
:
1px
solid
#68D8FE
;
}
::v-deep
.el-switch__label
{
color
:
#fff
;
...
...
@@ -1929,8 +1954,9 @@
min-height
:
36px
;
// height: 30px!important;
}
.is-disabled
{
background-color
:
rgba
(
0
,
0
,
0
,
0
.0
)
!
important
;
.is-disabled
{
background-color
:
rgba
(
0
,
0
,
0
,
0
.0
)
!
important
;
}
.nullbp
{
...
...
@@ -2257,4 +2283,13 @@
background-color
:
rgba
(
0
,
0
,
0
,
0
.6
);
color
:
#68D8FE
;
}
.out
{
position
:
absolute
;
right
:
23px
;
bottom
:
18px
;
color
:
#68D8FE
;
cursor
:
pointer
;
font-size
:
20px
;
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment