diff --git a/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue b/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue
index 7c6523ce9f..f08905b9cf 100644
--- a/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue
+++ b/core/core-frontend/src/components/data-visualization/canvas/ComponentWrapper.vue
@@ -192,6 +192,17 @@ const commonBackgroundSvgInner = computed(() => {
}
})
+const slotStyle = computed(() => {
+ // 3d效果支持
+ if (config.value['multiDimensional'] && config.value['multiDimensional']?.enable) {
+ return {
+ transform: `rotateX(${config.value['multiDimensional'].x}deg) rotateY(${config.value['multiDimensional'].y}deg) rotateZ(${config.value['multiDimensional'].z}deg)`
+ }
+ } else {
+ return {}
+ }
+})
+
const onPointClick = param => {
emits('onPointClick', param)
}
@@ -232,7 +243,11 @@ const deepScale = computed(() => scale.value / 100)
:style="{ color: config.commonBackground.innerImageColor }"
:name="commonBackgroundSvgInner"
>
-
+
scale.value / 100)
background-size: 100% 100% !important;
.wrapper-inner-adaptor {
position: relative;
+ transform-style: preserve-3d;
width: 100%;
height: 100%;
}
diff --git a/core/core-frontend/src/components/data-visualization/canvas/Shape.vue b/core/core-frontend/src/components/data-visualization/canvas/Shape.vue
index 134566a607..d6a8db35d5 100644
--- a/core/core-frontend/src/components/data-visualization/canvas/Shape.vue
+++ b/core/core-frontend/src/components/data-visualization/canvas/Shape.vue
@@ -48,7 +48,7 @@
:style="{ color: element.commonBackground.innerImageColor }"
:name="commonBackgroundSvgInner"
>
-
@@ -927,6 +927,16 @@ const tabMoveInCheck = async () => {
}
}
}
+const slotStyle = computed(() => {
+ // 3d效果支持
+ if (element.value['multiDimensional'] && element.value['multiDimensional']?.enable) {
+ return {
+ transform: `rotateX(${element.value['multiDimensional'].x}deg) rotateY(${element.value['multiDimensional'].y}deg) rotateZ(${element.value['multiDimensional'].z}deg)`
+ }
+ } else {
+ return {}
+ }
+})
const batchOptFlag = computed(() => {
return batchOptStatus.value && dashboardActive.value
@@ -974,7 +984,6 @@ onMounted(() => {
diff --git a/core/core-frontend/src/components/visualization/common/ComponentPosition.vue b/core/core-frontend/src/components/visualization/common/ComponentPosition.vue
index a0a8b01c47..b63f75c21d 100644
--- a/core/core-frontend/src/components/visualization/common/ComponentPosition.vue
+++ b/core/core-frontend/src/components/visualization/common/ComponentPosition.vue
@@ -28,6 +28,61 @@
保持宽高比
+
+
+
+
+ 3D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -117,6 +172,9 @@ const maintainRadioChange = () => {
curComponent.value.aspectRatio = curComponent.value.style.width / curComponent.value.style.height
snapshotStore.recordSnapshotCache()
}
+const multiDimensionalChange = () => {
+ // do change
+}
const positionInit = () => {
if (curComponent.value) {
diff --git a/core/core-frontend/src/custom-component/component-list.ts b/core/core-frontend/src/custom-component/component-list.ts
index 5f39561fd0..a79e40b905 100644
--- a/core/core-frontend/src/custom-component/component-list.ts
+++ b/core/core-frontend/src/custom-component/component-list.ts
@@ -134,6 +134,13 @@ export const ACTION_SELECTION = {
linkageActive: 'custom'
}
+export const MULTI_DIMENSIONAL = {
+ enable: false,
+ x: 0,
+ y: 0,
+ z: 0
+}
+
export const COMMON_COMPONENT_BACKGROUND_BASE = {
backgroundColorSelect: true,
backgroundImageEnable: false,
@@ -172,6 +179,7 @@ export const commonAttr = {
animations: [],
canvasId: 'canvas-main',
events: BASE_EVENTS,
+ multiDimensional: MULTI_DIMENSIONAL, // 3d 设置
groupStyle: {}, // 当一个组件成为 Group 的子组件时使用
isLock: false, // 是否锁定组件
maintainRadio: false, // 布局时保持宽高比例
diff --git a/core/core-frontend/src/utils/attr.ts b/core/core-frontend/src/utils/attr.ts
index 2fb402bf4f..f373d9bd57 100644
--- a/core/core-frontend/src/utils/attr.ts
+++ b/core/core-frontend/src/utils/attr.ts
@@ -5,6 +5,12 @@ export const positionData = [
{ key: 'height', label: 'H', min: 10, max: 20000, step: 10 }
]
+export const multiDimensionalData = [
+ { key: 'x', label: 'X', min: -360, max: 360, step: 1 },
+ { key: 'y', label: 'W', min: -360, max: 360, step: 1 },
+ { key: 'z', label: 'Y', min: -360, max: 360, step: 1 }
+]
+
export const styleData = [
{ key: 'lineHeight', label: '行高', min: 0, max: 50, step: 1 },
{ key: 'opacity', label: '不透明度', min: 0, max: 1, step: 0.1 },
diff --git a/core/core-frontend/src/utils/canvasUtils.ts b/core/core-frontend/src/utils/canvasUtils.ts
index 54299aab9f..2bc98ab938 100644
--- a/core/core-frontend/src/utils/canvasUtils.ts
+++ b/core/core-frontend/src/utils/canvasUtils.ts
@@ -3,7 +3,8 @@ import componentList, {
ACTION_SELECTION,
BASE_EVENTS,
COMMON_COMPONENT_BACKGROUND_DARK,
- COMMON_COMPONENT_BACKGROUND_LIGHT
+ COMMON_COMPONENT_BACKGROUND_LIGHT,
+ MULTI_DIMENSIONAL
} from '@/custom-component/component-list'
import eventBus from '@/utils/eventBus'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
@@ -153,6 +154,8 @@ export function historyAdaptor(
componentItem.style['adaptation'] = componentItem.style['adaptation'] || 'adaptation'
}
componentItem['maintainRadio'] = componentItem['maintainRadio'] || false
+ componentItem['multiDimensional'] =
+ componentItem['multiDimensional'] || deepCopy(MULTI_DIMENSIONAL)
componentItem['aspectRatio'] = componentItem['aspectRatio'] || 1
if (componentItem.component === 'UserView') {
componentItem.actionSelection = componentItem.actionSelection || deepCopy(ACTION_SELECTION)