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)