瀏覽代碼

add Model Collection Primitive

tags/2.4.0
Caven Chen 4 年之前
父節點
當前提交
50eec9a055

+ 15
- 14
modules/event/type/MouseEvent.js 查看文件

@@ -141,7 +141,7 @@ class MouseEvent extends Event {
/**
* Returns the target information for the mouse event
* @param target
* @returns {{overlay: any, feature: any, layer: any}}
* @returns {{instanceId: *, overlay: undefined, feature: undefined, layer: undefined}}
* @private
*/
_getTargetInfo(target) {
@@ -150,22 +150,22 @@ class MouseEvent extends Event {
let feature = undefined

// for Entity
if (target && target.id && target.id instanceof Cesium.Entity) {
if (target?.id instanceof Cesium.Entity) {
layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.id.layerId)[0]
if (layer && layer.getOverlay) {
if (layer?.getOverlay) {
overlay = layer.getOverlay(target.id.overlayId)
}
}

// for Cesium3DTileFeature
else if (target && target instanceof Cesium.Cesium3DTileFeature) {
else if (target instanceof Cesium.Cesium3DTileFeature) {
layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.tileset.layerId)[0]
feature = target
if (layer && layer.getOverlay) {
if (layer?.getOverlay) {
overlay = layer.getOverlay(target.tileset.overlayId)
if (feature && feature.getPropertyNames) {
let propertyNames = feature.getPropertyNames()
@@ -177,30 +177,31 @@ class MouseEvent extends Event {
}

// for Cesium3DTileset
else if (
target &&
target.primitive &&
target.primitive instanceof Cesium.Cesium3DTileset
) {
else if (target?.primitive instanceof Cesium.Cesium3DTileset) {
layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.primitive.layerId)[0]
if (layer && layer.getOverlay) {
if (layer?.getOverlay) {
overlay = layer.getOverlay(target.primitive.overlayId)
}
}

// for Primitve
else if (target && target.primitive) {
else if (target?.primitive) {
layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.primitive.layerId)[0]
if (layer && layer.getOverlay) {
if (layer?.getOverlay) {
overlay = layer.getOverlay(target.primitive.overlayId)
}
}

return { layer: layer, overlay: overlay, feature: feature }
return {
layer: layer,
overlay: overlay,
feature: feature,
instanceId: target?.instanceId
}
}

/**

+ 1
- 0
modules/overlay/index.js 查看文件

@@ -48,6 +48,7 @@ export { default as DiffuseWallPrimitive } from './primitive/DiffuseWallPrimitiv
export { default as ElecEllipsoidPrimitive } from './primitive/ElecEllipsoidPrimitive'
export { default as FlowLinePrimitive } from './primitive/FlowLinePrimitive'
export { default as LabelPrimitive } from './primitive/LabelPrimitive'
export { default as ModelCollectionPrimitive } from './primitive/ModelCollectionPrimitive'
export { default as ModelPrimitive } from './primitive/ModelPrimitive'
export { default as PointPrimitive } from './primitive/PointPrimitive.js'
export { default as PolylinePrimitive } from './primitive/PolylinePrimitive.js'

+ 129
- 0
modules/overlay/primitive/ModelCollectionPrimitive.js 查看文件

@@ -0,0 +1,129 @@
/**
* @Author: Caven
* @Date: 2021-08-02 20:12:04
*/

import { Cesium } from '@dc-modules/namespace'
import State from '@dc-modules/state/State'
import Parse from '@dc-modules/parse/Parse'
import { Transform } from '@dc-modules/transform'
import Overlay from '../Overlay'

class ModelCollectionPrimitive extends Overlay {
constructor(positions, modelUrl) {
super()
this._positions = Parse.parsePositions(positions)
this._modelUrl = modelUrl
this._attrs = []
this._state = State.INITIALIZED
}

get type() {
return Overlay.getOverlayType('model_collection_primitive')
}

set attrs(attrs) {
this._attrs = attrs
return this
}

get attrs() {
return this._attrs
}

set positions(positions) {
this._positions = Parse.parsePositions(positions)
if (this._layer) {
this._resetDelegate()
this._layer.delegate.add(this._delegate)
}
return this
}

set modelUrl(modelUrl) {
this._modelUrl = modelUrl
if (this._layer) {
this._resetDelegate()
this._layer.delegate.add(this._delegate)
}
return this
}

get modelUrl() {
return this._modelUrl
}

_resetDelegate() {
this._delegate = this._delegate && this._delegate.destroy()
this._delegate = new Cesium.ModelInstanceCollection({
url: this._modelUrl,
instances: this._positions.map(item => {
let origin = Transform.transformWGS84ToCartesian(item)
let modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
origin,
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(item.heading),
Cesium.Math.toRadians(item.pitch),
Cesium.Math.toRadians(item.roll)
)
)
this._style?.scale &&
Cesium.Matrix4.multiplyByUniformScale(
modelMatrix,
this._style?.scale,
modelMatrix
)
return {
modelMatrix
}
}),
...this._style
})
this._delegate.layerId = this._layer?.layerId
this._delegate.overlayId = this._id
}

_mountedHook() {
this._resetDelegate()
}

/**
*
* @param instanceId
* @returns {undefined}
*/
getModelInstance(instanceId) {
return this._delegate._instances[instanceId] || undefined
}

/**
*
* @param instanceId
* @returns {*|{}}
*/
getAttrByInstanceId(instanceId) {
return this._attrs[instanceId] || {}
}

/**
*
* @param style
* @returns {ModelCollectionPrimitive}
*/
setStyle(style) {
if (!style || Object.keys(style).length === 0) {
return this
}
delete style['instances'] && delete style['url']
this._style = style
if (this._layer) {
this._resetDelegate()
this._layer.delegate.add(this._delegate)
}
return this
}
}

Overlay.registerType('model_collection_primitive')

export default ModelCollectionPrimitive

+ 8
- 9
modules/widget/type/ContextMenu.js 查看文件

@@ -20,6 +20,7 @@ class ContextMenu extends Widget {
this._surfacePosition = undefined
this._wgs84SurfacePosition = undefined
this._windowPosition = undefined
this._instanceId = undefined
this._config = {}
this._defaultMenu = [
{
@@ -171,8 +172,9 @@ class ContextMenu extends Widget {
}
}
}
this._instanceId = target?.instanceId
// for Entity
if (target && target.id && target.id instanceof Cesium.Entity) {
if (target?.id instanceof Cesium.Entity) {
let layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.id.layerId)[0]
@@ -182,7 +184,7 @@ class ContextMenu extends Widget {
}

// for Cesium3DTileFeature
else if (target && target instanceof Cesium.Cesium3DTileFeature) {
else if (target instanceof Cesium.Cesium3DTileFeature) {
let layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.tileset.layerId)[0]
@@ -192,11 +194,7 @@ class ContextMenu extends Widget {
}

// for Cesium3DTileset
else if (
target &&
target.primitive &&
target.primitive instanceof Cesium.Cesium3DTileset
) {
else if (target?.primitive instanceof Cesium.Cesium3DTileset) {
let layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.primitive.layerId)[0]
@@ -206,7 +204,7 @@ class ContextMenu extends Widget {
}

// for Primitve
else if (target && target.primitive) {
else if (target?.primitive) {
let layer = this._viewer
.getLayers()
.filter(item => item.layerId === target.primitive.layerId)[0]
@@ -278,7 +276,8 @@ class ContextMenu extends Widget {
wgs84Position: self._wgs84Position,
surfacePosition: self._surfacePosition,
wgs84SurfacePosition: self._wgs84SurfacePosition,
overlay: self._overlay
overlay: self._overlay,
instanceId: self._instanceId
})
self.hide()
}

+ 2
- 0
packages/core/src/components.js 查看文件

@@ -83,6 +83,7 @@ import {
ElecEllipsoidPrimitive,
FlowLinePrimitive,
LabelPrimitive,
ModelCollectionPrimitive,
ModelPrimitive,
PointPrimitive,
PolylinePrimitive,
@@ -291,6 +292,7 @@ const components = {
ElecEllipsoidPrimitive,
FlowLinePrimitive,
LabelPrimitive,
ModelCollectionPrimitive,
ModelPrimitive,
PointPrimitive,
PolylinePrimitive,

Loading…
取消
儲存