sun-card-design 1.1.37 → 1.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -112
- package/dist/mobile/sun-card-design-mobile.es11.js +3 -3
- package/dist/mobile/sun-card-design-mobile.es3.js +4 -4
- package/dist/mobile/sun-card-design-mobile.es4.js +5 -5
- package/dist/mobile/sun-card-design-mobile.es56.js +3 -4
- package/dist/mobile/sun-card-design-mobile.es6.js +2 -10
- package/dist/pc/sun-card-design-pc.es11.js +3 -3
- package/dist/pc/sun-card-design-pc.es3.js +4 -4
- package/dist/pc/sun-card-design-pc.es4.js +5 -5
- package/dist/pc/sun-card-design-pc.es56.js +3 -4
- package/dist/pc/sun-card-design-pc.es6.js +2 -10
- package/dist/public/sun-card-design.css +1 -1
- package/package.json +98 -96
- package/dist/public/sun-card-designer.css +0 -1
- package/dist/sun-card-designer.es.js +0 -25
- package/dist/sun-card-designer.es10.js +0 -167
- package/dist/sun-card-designer.es11.js +0 -197
- package/dist/sun-card-designer.es12.js +0 -203
- package/dist/sun-card-designer.es13.js +0 -130
- package/dist/sun-card-designer.es14.js +0 -120
- package/dist/sun-card-designer.es151.js +0 -4
- package/dist/sun-card-designer.es152.js +0 -4
- package/dist/sun-card-designer.es153.js +0 -4
- package/dist/sun-card-designer.es154.js +0 -4
- package/dist/sun-card-designer.es155.js +0 -82
- package/dist/sun-card-designer.es156.js +0 -91
- package/dist/sun-card-designer.es157.js +0 -92
- package/dist/sun-card-designer.es158.js +0 -191
- package/dist/sun-card-designer.es159.js +0 -86
- package/dist/sun-card-designer.es16.js +0 -10
- package/dist/sun-card-designer.es160.js +0 -238
- package/dist/sun-card-designer.es161.js +0 -113
- package/dist/sun-card-designer.es162.js +0 -49
- package/dist/sun-card-designer.es163.js +0 -43
- package/dist/sun-card-designer.es164.js +0 -39
- package/dist/sun-card-designer.es165.js +0 -46
- package/dist/sun-card-designer.es166.js +0 -58
- package/dist/sun-card-designer.es167.js +0 -56
- package/dist/sun-card-designer.es168.js +0 -58
- package/dist/sun-card-designer.es169.js +0 -73
- package/dist/sun-card-designer.es17.js +0 -333
- package/dist/sun-card-designer.es170.js +0 -59
- package/dist/sun-card-designer.es171.js +0 -69
- package/dist/sun-card-designer.es172.js +0 -182
- package/dist/sun-card-designer.es173.js +0 -176
- package/dist/sun-card-designer.es174.js +0 -184
- package/dist/sun-card-designer.es175.js +0 -409
- package/dist/sun-card-designer.es176.js +0 -365
- package/dist/sun-card-designer.es177.js +0 -70
- package/dist/sun-card-designer.es178.js +0 -68
- package/dist/sun-card-designer.es179.js +0 -184
- package/dist/sun-card-designer.es18.js +0 -68
- package/dist/sun-card-designer.es180.js +0 -193
- package/dist/sun-card-designer.es181.js +0 -193
- package/dist/sun-card-designer.es182.js +0 -193
- package/dist/sun-card-designer.es184.js +0 -228
- package/dist/sun-card-designer.es185.js +0 -71
- package/dist/sun-card-designer.es19.js +0 -611
- package/dist/sun-card-designer.es196.js +0 -4
- package/dist/sun-card-designer.es20.js +0 -225
- package/dist/sun-card-designer.es201.js +0 -125
- package/dist/sun-card-designer.es21.js +0 -69
- package/dist/sun-card-designer.es22.js +0 -719
- package/dist/sun-card-designer.es220.js +0 -63
- package/dist/sun-card-designer.es221.js +0 -80
- package/dist/sun-card-designer.es222.js +0 -82
- package/dist/sun-card-designer.es223.js +0 -94
- package/dist/sun-card-designer.es224.js +0 -87
- package/dist/sun-card-designer.es225.js +0 -226
- package/dist/sun-card-designer.es226.js +0 -105
- package/dist/sun-card-designer.es227.js +0 -45
- package/dist/sun-card-designer.es228.js +0 -31
- package/dist/sun-card-designer.es229.js +0 -29
- package/dist/sun-card-designer.es23.js +0 -211
- package/dist/sun-card-designer.es230.js +0 -32
- package/dist/sun-card-designer.es231.js +0 -46
- package/dist/sun-card-designer.es232.js +0 -42
- package/dist/sun-card-designer.es233.js +0 -44
- package/dist/sun-card-designer.es234.js +0 -61
- package/dist/sun-card-designer.es235.js +0 -46
- package/dist/sun-card-designer.es236.js +0 -54
- package/dist/sun-card-designer.es237.js +0 -130
- package/dist/sun-card-designer.es238.js +0 -127
- package/dist/sun-card-designer.es239.js +0 -132
- package/dist/sun-card-designer.es24.js +0 -265
- package/dist/sun-card-designer.es240.js +0 -375
- package/dist/sun-card-designer.es241.js +0 -348
- package/dist/sun-card-designer.es242.js +0 -69
- package/dist/sun-card-designer.es243.js +0 -65
- package/dist/sun-card-designer.es244.js +0 -87
- package/dist/sun-card-designer.es245.js +0 -98
- package/dist/sun-card-designer.es246.js +0 -98
- package/dist/sun-card-designer.es247.js +0 -98
- package/dist/sun-card-designer.es25.js +0 -857
- package/dist/sun-card-designer.es26.js +0 -768
- package/dist/sun-card-designer.es260.js +0 -125
- package/dist/sun-card-designer.es27.js +0 -264
- package/dist/sun-card-designer.es273.js +0 -192
- package/dist/sun-card-designer.es28.js +0 -809
- package/dist/sun-card-designer.es29.js +0 -220
- package/dist/sun-card-designer.es3.js +0 -506
- package/dist/sun-card-designer.es30.js +0 -809
- package/dist/sun-card-designer.es31.js +0 -220
- package/dist/sun-card-designer.es32.js +0 -820
- package/dist/sun-card-designer.es33.js +0 -225
- package/dist/sun-card-designer.es34.js +0 -69
- package/dist/sun-card-designer.es35.js +0 -375
- package/dist/sun-card-designer.es36.js +0 -186
- package/dist/sun-card-designer.es37.js +0 -119
- package/dist/sun-card-designer.es38.js +0 -354
- package/dist/sun-card-designer.es39.js +0 -127
- package/dist/sun-card-designer.es4.js +0 -365
- package/dist/sun-card-designer.es40.js +0 -100
- package/dist/sun-card-designer.es41.js +0 -214
- package/dist/sun-card-designer.es42.js +0 -119
- package/dist/sun-card-designer.es43.js +0 -250
- package/dist/sun-card-designer.es44.js +0 -118
- package/dist/sun-card-designer.es45.js +0 -64
- package/dist/sun-card-designer.es46.js +0 -223
- package/dist/sun-card-designer.es47.js +0 -196
- package/dist/sun-card-designer.es48.js +0 -77
- package/dist/sun-card-designer.es49.js +0 -85
- package/dist/sun-card-designer.es5.js +0 -317
- package/dist/sun-card-designer.es50.js +0 -85
- package/dist/sun-card-designer.es51.js +0 -64
- package/dist/sun-card-designer.es52.js +0 -283
- package/dist/sun-card-designer.es53.js +0 -64
- package/dist/sun-card-designer.es54.js +0 -142
- package/dist/sun-card-designer.es55.js +0 -52
- package/dist/sun-card-designer.es56.js +0 -85
- package/dist/sun-card-designer.es57.js +0 -258
- package/dist/sun-card-designer.es58.js +0 -226
- package/dist/sun-card-designer.es59.js +0 -169
- package/dist/sun-card-designer.es6.js +0 -190
- package/dist/sun-card-designer.es60.js +0 -280
- package/dist/sun-card-designer.es61.js +0 -168
- package/dist/sun-card-designer.es62.js +0 -219
- package/dist/sun-card-designer.es63.js +0 -168
- package/dist/sun-card-designer.es64.js +0 -275
- package/dist/sun-card-designer.es65.js +0 -760
- package/dist/sun-card-designer.es66.js +0 -272
- package/dist/sun-card-designer.es67.js +0 -559
- package/dist/sun-card-designer.es68.js +0 -124
- package/dist/sun-card-designer.es69.js +0 -528
- package/dist/sun-card-designer.es7.js +0 -65
- package/dist/sun-card-designer.es70.js +0 -185
- package/dist/sun-card-designer.es71.js +0 -107
- package/dist/sun-card-designer.es72.js +0 -153
- package/dist/sun-card-designer.es73.js +0 -315
- package/dist/sun-card-designer.es74.js +0 -114
- package/dist/sun-card-designer.es76.js +0 -4211
- package/dist/sun-card-designer.es79.js +0 -4
- package/dist/sun-card-designer.es8.js +0 -171
- package/dist/sun-card-designer.es80.js +0 -4
- package/dist/sun-card-designer.es81.js +0 -4
- package/dist/sun-card-designer.es84.js +0 -228
- package/dist/sun-card-designer.es87.js +0 -52
- package/dist/sun-card-designer.es88.js +0 -52
- package/dist/sun-card-designer.es9.js +0 -207
- package/dist/sun-card-designer.es91.js +0 -344
- package/dist/sun-card-designer.es92.js +0 -199
- package/dist/sun-card-designer.es95.js +0 -180
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import { reactive, resolveComponent, createElementBlock, openBlock, createElementVNode, createVNode, createCommentVNode, withCtx, createTextVNode, toDisplayString, unref } from "vue";
|
|
2
|
-
import { MinusOutlined, PlusOutlined, DeleteOutlined } from "@ant-design/icons-vue";
|
|
3
|
-
import { generateShortUUID } from "./sun-card-designer.es14.js";
|
|
4
|
-
import { message } from "ant-design-vue";
|
|
5
|
-
import { useCardManageStore } from "./sun-card-designer.es13.js";
|
|
6
|
-
/* empty css */
|
|
7
|
-
import _export_sfc from "./sun-card-designer.es16.js";
|
|
8
|
-
const _hoisted_1 = { class: "grid-base" };
|
|
9
|
-
const _hoisted_2 = { key: 0 };
|
|
10
|
-
const _hoisted_3 = { class: "slot" };
|
|
11
|
-
const _hoisted_4 = { class: "a-item" };
|
|
12
|
-
const _hoisted_5 = { style: { "display": "flex" } };
|
|
13
|
-
const _hoisted_6 = { key: 0 };
|
|
14
|
-
const _hoisted_7 = { key: 1 };
|
|
15
|
-
const _sfc_main = {
|
|
16
|
-
__name: "gridBasePes",
|
|
17
|
-
props: ["record"],
|
|
18
|
-
setup(__props) {
|
|
19
|
-
const cardManageStore = useCardManageStore();
|
|
20
|
-
const props = __props;
|
|
21
|
-
const optionKeys = reactive(["固定格数", "动态格数"]);
|
|
22
|
-
const addSlot = () => {
|
|
23
|
-
props.record.columns.push({
|
|
24
|
-
list: [],
|
|
25
|
-
// 栅格中组件列表
|
|
26
|
-
flex: 1,
|
|
27
|
-
// 占位
|
|
28
|
-
type: "columns",
|
|
29
|
-
uuid: generateShortUUID(),
|
|
30
|
-
options: {
|
|
31
|
-
clickEvent: false,
|
|
32
|
-
// 是否启用点击事件
|
|
33
|
-
clickEventConfig: {
|
|
34
|
-
type: "url",
|
|
35
|
-
// url event agent tool 点击事件类型
|
|
36
|
-
value: "",
|
|
37
|
-
// 点击事件值,url event agent
|
|
38
|
-
toolItem: null,
|
|
39
|
-
// 调用工具值 tool
|
|
40
|
-
tooltemParams: []
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
const delSlot = (index) => {
|
|
46
|
-
if (props.record.columns.length < 2) {
|
|
47
|
-
message.warning("最少为一个");
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
props.record.columns.splice(index, 1);
|
|
51
|
-
};
|
|
52
|
-
const variableOptions = () => {
|
|
53
|
-
const list = cardManageStore.variableList.filter((e) => e.type === "Array");
|
|
54
|
-
return list;
|
|
55
|
-
};
|
|
56
|
-
const onChange = () => {
|
|
57
|
-
props.record.options.variableName = null;
|
|
58
|
-
props.record.columns = [
|
|
59
|
-
{
|
|
60
|
-
list: [],
|
|
61
|
-
// 栅格中组件列表
|
|
62
|
-
flex: 1,
|
|
63
|
-
// 占位
|
|
64
|
-
type: "columns",
|
|
65
|
-
uuid: generateShortUUID(),
|
|
66
|
-
options: {
|
|
67
|
-
clickEvent: false,
|
|
68
|
-
// 是否启用点击事件
|
|
69
|
-
clickEventConfig: {
|
|
70
|
-
type: "url",
|
|
71
|
-
// url event agent tool 点击事件类型
|
|
72
|
-
value: "",
|
|
73
|
-
// 点击事件值,url event agent
|
|
74
|
-
toolItem: null,
|
|
75
|
-
// 调用工具值 tool
|
|
76
|
-
tooltemParams: []
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
list: [],
|
|
82
|
-
// 栅格中组件列表
|
|
83
|
-
flex: 1,
|
|
84
|
-
// 占位
|
|
85
|
-
type: "columns",
|
|
86
|
-
uuid: generateShortUUID(),
|
|
87
|
-
options: {
|
|
88
|
-
clickEvent: false,
|
|
89
|
-
// 是否启用点击事件
|
|
90
|
-
clickEventConfig: {
|
|
91
|
-
type: "url",
|
|
92
|
-
// url event agent tool 点击事件类型
|
|
93
|
-
value: "",
|
|
94
|
-
// 点击事件值,url event agent
|
|
95
|
-
toolItem: null,
|
|
96
|
-
// 调用工具值 tool
|
|
97
|
-
tooltemParams: []
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
list: [],
|
|
103
|
-
// 栅格中组件列表
|
|
104
|
-
flex: 1,
|
|
105
|
-
// 占位
|
|
106
|
-
type: "columns",
|
|
107
|
-
uuid: generateShortUUID(),
|
|
108
|
-
options: {
|
|
109
|
-
clickEvent: false,
|
|
110
|
-
// 是否启用点击事件
|
|
111
|
-
clickEventConfig: {
|
|
112
|
-
type: "url",
|
|
113
|
-
// url event agent tool 点击事件类型
|
|
114
|
-
value: "",
|
|
115
|
-
// 点击事件值,url event agent
|
|
116
|
-
toolItem: null,
|
|
117
|
-
// 调用工具值 tool
|
|
118
|
-
tooltemParams: []
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
];
|
|
123
|
-
};
|
|
124
|
-
const selectChange = (val) => {
|
|
125
|
-
const list = cardManageStore.variableList.find((e) => e.type === "Array" && val === e.name);
|
|
126
|
-
const length = list.defaultValue ? JSON.parse(list.defaultValue).length : [];
|
|
127
|
-
props.record.columns = [];
|
|
128
|
-
const uuid = generateShortUUID();
|
|
129
|
-
const options = {
|
|
130
|
-
clickEvent: false,
|
|
131
|
-
// 是否启用点击事件
|
|
132
|
-
clickEventConfig: {
|
|
133
|
-
type: "url",
|
|
134
|
-
// url event agent tool 点击事件类型
|
|
135
|
-
value: "",
|
|
136
|
-
// 点击事件值,url event agent
|
|
137
|
-
toolItem: null,
|
|
138
|
-
// 调用工具值 tool
|
|
139
|
-
tooltemParams: []
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
for (let index = 0; index < length; index++) {
|
|
143
|
-
props.record.columns.push({
|
|
144
|
-
list: [],
|
|
145
|
-
// 栅格中组件列表
|
|
146
|
-
flex: 1,
|
|
147
|
-
// 占位
|
|
148
|
-
type: "columns",
|
|
149
|
-
uuid,
|
|
150
|
-
options
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
const minusClick = (index) => {
|
|
155
|
-
if (props.record.columns[index].flex <= 1) return;
|
|
156
|
-
props.record.columns[index].flex--;
|
|
157
|
-
};
|
|
158
|
-
const plusClick = (index) => {
|
|
159
|
-
if (props.record.columns[index].flex >= 24) return;
|
|
160
|
-
props.record.columns[index].flex++;
|
|
161
|
-
};
|
|
162
|
-
return (_ctx, _cache) => {
|
|
163
|
-
const _component_a_segmented = resolveComponent("a-segmented");
|
|
164
|
-
const _component_a_button = resolveComponent("a-button");
|
|
165
|
-
const _component_a_tag = resolveComponent("a-tag");
|
|
166
|
-
const _component_a_list_item = resolveComponent("a-list-item");
|
|
167
|
-
const _component_a_list = resolveComponent("a-list");
|
|
168
|
-
const _component_a_select = resolveComponent("a-select");
|
|
169
|
-
const _component_a_form_item = resolveComponent("a-form-item");
|
|
170
|
-
const _component_a_form = resolveComponent("a-form");
|
|
171
|
-
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
172
|
-
_cache[4] || (_cache[4] = createElementVNode("div", { class: "title" }, "数据", -1)),
|
|
173
|
-
createVNode(_component_a_segmented, {
|
|
174
|
-
style: { "margin-top": "12px" },
|
|
175
|
-
value: props.record.options.dataType,
|
|
176
|
-
"onUpdate:value": _cache[0] || (_cache[0] = ($event) => props.record.options.dataType = $event),
|
|
177
|
-
block: "",
|
|
178
|
-
options: optionKeys,
|
|
179
|
-
onChange
|
|
180
|
-
}, null, 8, ["value", "options"]),
|
|
181
|
-
props.record.options.dataType === "固定格数" ? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
182
|
-
createElementVNode("div", _hoisted_3, [
|
|
183
|
-
_cache[3] || (_cache[3] = createElementVNode("span", null, "插槽集合", -1)),
|
|
184
|
-
createVNode(_component_a_button, {
|
|
185
|
-
size: "small",
|
|
186
|
-
style: { "font-size": "13px" },
|
|
187
|
-
onClick: addSlot
|
|
188
|
-
}, {
|
|
189
|
-
default: withCtx(() => [..._cache[2] || (_cache[2] = [
|
|
190
|
-
createTextVNode("+添加插槽", -1)
|
|
191
|
-
])]),
|
|
192
|
-
_: 1
|
|
193
|
-
})
|
|
194
|
-
]),
|
|
195
|
-
createVNode(_component_a_list, {
|
|
196
|
-
bordered: "",
|
|
197
|
-
"data-source": props.record.columns
|
|
198
|
-
}, {
|
|
199
|
-
renderItem: withCtx(({ index }) => [
|
|
200
|
-
createVNode(_component_a_list_item, null, {
|
|
201
|
-
default: withCtx(() => [
|
|
202
|
-
createElementVNode("div", _hoisted_4, [
|
|
203
|
-
createElementVNode("span", null, "插槽 " + toDisplayString(index + 1), 1),
|
|
204
|
-
createElementVNode("div", _hoisted_5, [
|
|
205
|
-
props.record.options.mode === "vertical" ? (openBlock(), createElementBlock("div", _hoisted_6, [
|
|
206
|
-
createVNode(unref(MinusOutlined), {
|
|
207
|
-
onClick: ($event) => minusClick(index)
|
|
208
|
-
}, null, 8, ["onClick"]),
|
|
209
|
-
createVNode(_component_a_tag, { style: { "margin": "0 10px" } }, {
|
|
210
|
-
default: withCtx(() => [
|
|
211
|
-
createTextVNode(toDisplayString(props.record.columns[index].flex), 1)
|
|
212
|
-
]),
|
|
213
|
-
_: 2
|
|
214
|
-
}, 1024),
|
|
215
|
-
createVNode(unref(PlusOutlined), {
|
|
216
|
-
onClick: ($event) => plusClick(index)
|
|
217
|
-
}, null, 8, ["onClick"])
|
|
218
|
-
])) : createCommentVNode("", true),
|
|
219
|
-
createVNode(unref(DeleteOutlined), {
|
|
220
|
-
style: { "margin-left": "20px" },
|
|
221
|
-
onClick: ($event) => delSlot(index)
|
|
222
|
-
}, null, 8, ["onClick"])
|
|
223
|
-
])
|
|
224
|
-
])
|
|
225
|
-
]),
|
|
226
|
-
_: 2
|
|
227
|
-
}, 1024)
|
|
228
|
-
]),
|
|
229
|
-
_: 1
|
|
230
|
-
}, 8, ["data-source"])
|
|
231
|
-
])) : createCommentVNode("", true),
|
|
232
|
-
props.record.options.dataType === "动态格数" ? (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
233
|
-
createVNode(_component_a_form, {
|
|
234
|
-
layout: "vertical",
|
|
235
|
-
style: { "margin-top": "16px" }
|
|
236
|
-
}, {
|
|
237
|
-
default: withCtx(() => [
|
|
238
|
-
createVNode(_component_a_form_item, { label: "绑定数组类型变量" }, {
|
|
239
|
-
default: withCtx(() => [
|
|
240
|
-
createVNode(_component_a_select, {
|
|
241
|
-
value: props.record.options.variableName,
|
|
242
|
-
"onUpdate:value": _cache[1] || (_cache[1] = ($event) => props.record.options.variableName = $event),
|
|
243
|
-
options: variableOptions(),
|
|
244
|
-
style: { "width": "100%" },
|
|
245
|
-
"field-names": {
|
|
246
|
-
label: "name",
|
|
247
|
-
value: "name"
|
|
248
|
-
},
|
|
249
|
-
onChange: selectChange
|
|
250
|
-
}, null, 8, ["value", "options"])
|
|
251
|
-
]),
|
|
252
|
-
_: 1
|
|
253
|
-
})
|
|
254
|
-
]),
|
|
255
|
-
_: 1
|
|
256
|
-
})
|
|
257
|
-
])) : createCommentVNode("", true)
|
|
258
|
-
]);
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
};
|
|
262
|
-
const GridBasePes = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a1349e50"]]);
|
|
263
|
-
export {
|
|
264
|
-
GridBasePes as default
|
|
265
|
-
};
|
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
import { ref, computed, onMounted, onUnmounted, createElementBlock, openBlock, normalizeStyle } from "vue";
|
|
2
|
-
import * as THREE from "three";
|
|
3
|
-
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
4
|
-
import { CSS2DRenderer, CSS2DObject } from "three/examples/jsm/renderers/CSS2DRenderer.js";
|
|
5
|
-
/* empty css */
|
|
6
|
-
import _export_sfc from "./sun-card-designer.es16.js";
|
|
7
|
-
const _sfc_main = {
|
|
8
|
-
__name: "barChart3dComp",
|
|
9
|
-
props: ["record"],
|
|
10
|
-
setup(__props) {
|
|
11
|
-
const props = __props;
|
|
12
|
-
const containerRef = ref(null);
|
|
13
|
-
let renderer = null;
|
|
14
|
-
let labelRenderer = null;
|
|
15
|
-
let scene = null;
|
|
16
|
-
let camera = null;
|
|
17
|
-
let animationId = null;
|
|
18
|
-
let resizeObserver = null;
|
|
19
|
-
let barsGroup = null;
|
|
20
|
-
let controls = null;
|
|
21
|
-
let hasFramedView = false;
|
|
22
|
-
let defaultBarColor = null;
|
|
23
|
-
let envTexture = null;
|
|
24
|
-
const chartStyle = computed(() => {
|
|
25
|
-
const style = props.record?.options?.style || {};
|
|
26
|
-
return {
|
|
27
|
-
width: style.width || "100%",
|
|
28
|
-
height: style.height || "260px"
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
function getChartConfig() {
|
|
32
|
-
const options = props.record?.options || {};
|
|
33
|
-
const xAxis = options.xAxisConfig[0];
|
|
34
|
-
const series = options.seriesConfig[0];
|
|
35
|
-
const colorType = series?.itemStyle?.colorType || (typeof series?.itemStyle?.color === "object" ? "gradient" : "solid");
|
|
36
|
-
defaultBarColor = series.itemStyle.color;
|
|
37
|
-
const color = series.itemStyle.color;
|
|
38
|
-
const data = Array.isArray(series?.data) ? series.data : [];
|
|
39
|
-
const labels = Array.isArray(xAxis?.data) ? xAxis.data : data.map((_, i) => String(i + 1));
|
|
40
|
-
return { data, labels, color, colorType };
|
|
41
|
-
}
|
|
42
|
-
function initScene() {
|
|
43
|
-
if (!containerRef.value) return;
|
|
44
|
-
const { clientWidth, clientHeight } = containerRef.value;
|
|
45
|
-
scene = new THREE.Scene();
|
|
46
|
-
scene.background = null;
|
|
47
|
-
const aspect = Math.max(clientWidth, 1) / Math.max(clientHeight, 1);
|
|
48
|
-
camera = new THREE.PerspectiveCamera(40, aspect, 0.1, 1e3);
|
|
49
|
-
const { data } = getChartConfig();
|
|
50
|
-
const barWidth = 0.8;
|
|
51
|
-
const gap = 1.6;
|
|
52
|
-
const totalWidth = data.length * (barWidth + gap);
|
|
53
|
-
const centerX = totalWidth / 2;
|
|
54
|
-
const maxBarHeight = 8;
|
|
55
|
-
const centerY = maxBarHeight / 2;
|
|
56
|
-
renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
|
|
57
|
-
renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));
|
|
58
|
-
renderer.setSize(clientWidth, clientHeight);
|
|
59
|
-
renderer.toneMapping = THREE.LinearToneMapping;
|
|
60
|
-
renderer.toneMappingExposure = 1.6;
|
|
61
|
-
renderer.outputColorSpace = THREE.SRGBColorSpace;
|
|
62
|
-
containerRef.value.appendChild(renderer.domElement);
|
|
63
|
-
try {
|
|
64
|
-
const jpgUrl = new URL("/assets/pic1.jpg", import.meta.url).href;
|
|
65
|
-
const textureLoader = new THREE.TextureLoader();
|
|
66
|
-
textureLoader.load(
|
|
67
|
-
jpgUrl,
|
|
68
|
-
(tex) => {
|
|
69
|
-
tex.mapping = THREE.EquirectangularReflectionMapping;
|
|
70
|
-
tex.colorSpace = THREE.SRGBColorSpace;
|
|
71
|
-
tex.userData = { brightness: 1.6, contrast: 1.2 };
|
|
72
|
-
envTexture = tex;
|
|
73
|
-
if (scene) {
|
|
74
|
-
scene.background = envTexture;
|
|
75
|
-
scene.environment = envTexture;
|
|
76
|
-
} else {
|
|
77
|
-
envTexture.dispose();
|
|
78
|
-
envTexture = null;
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
void 0,
|
|
82
|
-
() => {
|
|
83
|
-
}
|
|
84
|
-
);
|
|
85
|
-
} catch (e) {
|
|
86
|
-
return e;
|
|
87
|
-
}
|
|
88
|
-
labelRenderer = new CSS2DRenderer();
|
|
89
|
-
labelRenderer.setSize(clientWidth, clientHeight);
|
|
90
|
-
labelRenderer.domElement.style.position = "absolute";
|
|
91
|
-
labelRenderer.domElement.style.top = "0px";
|
|
92
|
-
labelRenderer.domElement.style.pointerEvents = "none";
|
|
93
|
-
containerRef.value.appendChild(labelRenderer.domElement);
|
|
94
|
-
addXYAxes();
|
|
95
|
-
barsGroup = new THREE.Group();
|
|
96
|
-
scene.add(barsGroup);
|
|
97
|
-
buildBars();
|
|
98
|
-
controls = new OrbitControls(camera, renderer.domElement);
|
|
99
|
-
controls.enableDamping = true;
|
|
100
|
-
controls.enablePan = true;
|
|
101
|
-
controls.enableRotate = true;
|
|
102
|
-
controls.enableZoom = true;
|
|
103
|
-
controls.screenSpacePanning = true;
|
|
104
|
-
controls.panSpeed = 1;
|
|
105
|
-
controls.rotateSpeed = 0.5;
|
|
106
|
-
controls.zoomSpeed = 1;
|
|
107
|
-
controls.autoRotate = false;
|
|
108
|
-
controls.target.set(centerX, centerY, 0);
|
|
109
|
-
camera.position.set(centerX, centerY, 20);
|
|
110
|
-
camera.lookAt(centerX, centerY, 0);
|
|
111
|
-
camera.rotation.set(0, 0, 0);
|
|
112
|
-
controls.update();
|
|
113
|
-
startAnimate();
|
|
114
|
-
observeResize();
|
|
115
|
-
}
|
|
116
|
-
function clearGroup(group) {
|
|
117
|
-
if (!group) return;
|
|
118
|
-
for (let i = group.children.length - 1; i >= 0; i--) {
|
|
119
|
-
const child = group.children[i];
|
|
120
|
-
if (child.children && child.children.length) {
|
|
121
|
-
clearGroup(child);
|
|
122
|
-
}
|
|
123
|
-
if (child.isCSS2DObject && child.element && child.element.parentNode) {
|
|
124
|
-
child.element.parentNode.removeChild(child.element);
|
|
125
|
-
}
|
|
126
|
-
group.remove(child);
|
|
127
|
-
if (child.geometry) child.geometry.dispose();
|
|
128
|
-
if (child.material) {
|
|
129
|
-
if (Array.isArray(child.material)) child.material.forEach((m) => m.dispose());
|
|
130
|
-
else child.material.dispose();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
function buildBars() {
|
|
135
|
-
if (!barsGroup) return;
|
|
136
|
-
clearGroup(barsGroup);
|
|
137
|
-
const { data, color, colorType } = getChartConfig();
|
|
138
|
-
if (!Array.isArray(data) || data.length === 0) return;
|
|
139
|
-
const maxValue = Math.max(...data.map((v) => Number.isFinite(v) ? v : 0), 1);
|
|
140
|
-
const maxBarHeight = 8;
|
|
141
|
-
const barWidth = 0.8;
|
|
142
|
-
const gap = 1.6;
|
|
143
|
-
const totalWidth = data.length * (barWidth + gap);
|
|
144
|
-
const startX = barWidth / 2;
|
|
145
|
-
const materialFactory = (() => {
|
|
146
|
-
if (colorType === "gradient" && typeof color === "object" && Array.isArray(color.colorStops)) {
|
|
147
|
-
const tex = createVerticalGradientTexture(color);
|
|
148
|
-
const mat = new THREE.MeshStandardMaterial({ color: 16777215, map: tex, transparent: false });
|
|
149
|
-
mat.needsUpdate = true;
|
|
150
|
-
return () => mat;
|
|
151
|
-
}
|
|
152
|
-
return () => new THREE.MeshStandardMaterial({ color: new THREE.Color(typeof color === "string" ? color : defaultBarColor) });
|
|
153
|
-
})();
|
|
154
|
-
data.forEach((v, idx) => {
|
|
155
|
-
const value = Number(v) || 0;
|
|
156
|
-
const height = value / maxValue * maxBarHeight;
|
|
157
|
-
const geometry = new THREE.BoxGeometry(barWidth, Math.max(height, 0.01), barWidth);
|
|
158
|
-
const mesh = new THREE.Mesh(geometry, materialFactory());
|
|
159
|
-
mesh.position.set(startX + idx * (barWidth + gap), height / 2, 0);
|
|
160
|
-
mesh.castShadow = false;
|
|
161
|
-
mesh.receiveShadow = false;
|
|
162
|
-
barsGroup.add(mesh);
|
|
163
|
-
const valueDiv = document.createElement("div");
|
|
164
|
-
valueDiv.className = "bar-value-label";
|
|
165
|
-
valueDiv.textContent = String(value);
|
|
166
|
-
valueDiv.style.color = "#ffffff";
|
|
167
|
-
valueDiv.style.fontSize = "12px";
|
|
168
|
-
valueDiv.style.fontFamily = "Arial, sans-serif";
|
|
169
|
-
valueDiv.style.textAlign = "center";
|
|
170
|
-
valueDiv.style.pointerEvents = "none";
|
|
171
|
-
const valueObj = new CSS2DObject(valueDiv);
|
|
172
|
-
valueObj.position.set(startX + idx * (barWidth + gap), Math.max(height, 0.01) + 0.4, 0);
|
|
173
|
-
barsGroup.add(valueObj);
|
|
174
|
-
});
|
|
175
|
-
if (!hasFramedView) {
|
|
176
|
-
const zDistance = Math.max(14, totalWidth * 1.2);
|
|
177
|
-
const anchorX = -totalWidth * 0.5;
|
|
178
|
-
const yCenter = 10 / 2;
|
|
179
|
-
camera.position.set(anchorX, yCenter, zDistance);
|
|
180
|
-
controls && controls.target.set(anchorX, yCenter, 0);
|
|
181
|
-
camera.lookAt(anchorX, yCenter, 0);
|
|
182
|
-
hasFramedView = true;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
function addXYAxes() {
|
|
186
|
-
const axisGroup = new THREE.Group();
|
|
187
|
-
axisGroup.name = "xy-axis-group";
|
|
188
|
-
const old = scene.getObjectByName("xy-axis-group");
|
|
189
|
-
if (old) {
|
|
190
|
-
clearGroup(old);
|
|
191
|
-
scene.remove(old);
|
|
192
|
-
}
|
|
193
|
-
const materialX = new THREE.MeshBasicMaterial({ color: 16777215 });
|
|
194
|
-
const materialY = new THREE.MeshBasicMaterial({ color: 16777215 });
|
|
195
|
-
const materialTick = new THREE.MeshBasicMaterial({ color: 16777215 });
|
|
196
|
-
const { data, labels } = getChartConfig();
|
|
197
|
-
const maxValue = Math.max(...data.map((v) => Number.isFinite(v) ? v : 0), 1);
|
|
198
|
-
const xLen = Math.max(20, data.length * 1.5);
|
|
199
|
-
const yLen = 10;
|
|
200
|
-
const xCylinderGeom = new THREE.CylinderGeometry(0.05, 0.05, xLen, 8);
|
|
201
|
-
const xCylinder = new THREE.Mesh(xCylinderGeom, materialX);
|
|
202
|
-
xCylinder.rotation.z = Math.PI / 2;
|
|
203
|
-
xCylinder.position.set(xLen / 2, 0, 0);
|
|
204
|
-
axisGroup.add(xCylinder);
|
|
205
|
-
const xArrowGeom = new THREE.ConeGeometry(0.2, 0.8, 8);
|
|
206
|
-
const xArrow = new THREE.Mesh(xArrowGeom, materialX);
|
|
207
|
-
xArrow.rotation.z = -Math.PI / 2;
|
|
208
|
-
xArrow.position.set(xLen, 0, 0);
|
|
209
|
-
axisGroup.add(xArrow);
|
|
210
|
-
const barWidth = 0.8;
|
|
211
|
-
const gap = 1.6;
|
|
212
|
-
const startX = barWidth / 2;
|
|
213
|
-
labels.forEach((label, idx) => {
|
|
214
|
-
const x = startX + idx * (barWidth + gap);
|
|
215
|
-
const tickGeom = new THREE.CylinderGeometry(0.05, 0.05, 0.3, 6);
|
|
216
|
-
const tick = new THREE.Mesh(tickGeom, materialTick);
|
|
217
|
-
tick.position.set(x, -0.15, 0);
|
|
218
|
-
axisGroup.add(tick);
|
|
219
|
-
const labelDiv = document.createElement("div");
|
|
220
|
-
labelDiv.className = "axis-label";
|
|
221
|
-
labelDiv.textContent = label;
|
|
222
|
-
labelDiv.style.color = "#ffffff";
|
|
223
|
-
labelDiv.style.fontSize = "14px";
|
|
224
|
-
labelDiv.style.fontFamily = "Arial, sans-serif";
|
|
225
|
-
labelDiv.style.textAlign = "center";
|
|
226
|
-
labelDiv.style.pointerEvents = "none";
|
|
227
|
-
const labelObject = new CSS2DObject(labelDiv);
|
|
228
|
-
labelObject.position.set(x, -2, 0);
|
|
229
|
-
axisGroup.add(labelObject);
|
|
230
|
-
});
|
|
231
|
-
const yCylinderGeom = new THREE.CylinderGeometry(0.05, 0.05, yLen, 8);
|
|
232
|
-
const yCylinder = new THREE.Mesh(yCylinderGeom, materialY);
|
|
233
|
-
yCylinder.position.set(0, yLen / 2, 0);
|
|
234
|
-
axisGroup.add(yCylinder);
|
|
235
|
-
const yArrowGeom = new THREE.ConeGeometry(0.2, 0.8, 8);
|
|
236
|
-
const yArrow = new THREE.Mesh(yArrowGeom, materialY);
|
|
237
|
-
yArrow.position.set(0, yLen, 0);
|
|
238
|
-
axisGroup.add(yArrow);
|
|
239
|
-
const tickCount = 5;
|
|
240
|
-
for (let i = 0; i <= tickCount; i++) {
|
|
241
|
-
const value = maxValue / tickCount * i;
|
|
242
|
-
const y = yLen / tickCount * i;
|
|
243
|
-
const tickGeom = new THREE.CylinderGeometry(0.01, 0.01, 0.3, 6);
|
|
244
|
-
const tick = new THREE.Mesh(tickGeom, materialTick);
|
|
245
|
-
tick.rotation.z = Math.PI / 2;
|
|
246
|
-
tick.position.set(-0.15, y, 0);
|
|
247
|
-
axisGroup.add(tick);
|
|
248
|
-
const labelDiv = document.createElement("div");
|
|
249
|
-
labelDiv.className = "axis-label";
|
|
250
|
-
labelDiv.textContent = Math.round(value).toString();
|
|
251
|
-
labelDiv.style.color = "#ffffff";
|
|
252
|
-
labelDiv.style.fontSize = "12px";
|
|
253
|
-
labelDiv.style.fontFamily = "Arial, sans-serif";
|
|
254
|
-
labelDiv.style.textAlign = "right";
|
|
255
|
-
labelDiv.style.pointerEvents = "none";
|
|
256
|
-
const labelObject = new CSS2DObject(labelDiv);
|
|
257
|
-
labelObject.position.set(-1, y, 0);
|
|
258
|
-
axisGroup.add(labelObject);
|
|
259
|
-
}
|
|
260
|
-
scene.add(axisGroup);
|
|
261
|
-
}
|
|
262
|
-
function createVerticalGradientTexture(gradient) {
|
|
263
|
-
const size = 128;
|
|
264
|
-
const canvas = document.createElement("canvas");
|
|
265
|
-
canvas.width = 1;
|
|
266
|
-
canvas.height = size;
|
|
267
|
-
const ctx = canvas.getContext("2d");
|
|
268
|
-
const grd = ctx.createLinearGradient(0, 0, 0, size);
|
|
269
|
-
const stops = Array.isArray(gradient.colorStops) ? gradient.colorStops : [];
|
|
270
|
-
if (stops.length === 0) {
|
|
271
|
-
grd.addColorStop(0, "#83bff6");
|
|
272
|
-
grd.addColorStop(1, "#188df0");
|
|
273
|
-
} else {
|
|
274
|
-
stops.forEach((s) => {
|
|
275
|
-
const off = typeof s.offset === "number" ? Math.min(Math.max(s.offset, 0), 1) : 0;
|
|
276
|
-
grd.addColorStop(off, s.color || "#ffffff");
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
ctx.fillStyle = grd;
|
|
280
|
-
ctx.fillRect(0, 0, 1, size);
|
|
281
|
-
const texture = new THREE.CanvasTexture(canvas);
|
|
282
|
-
texture.wrapS = THREE.ClampToEdgeWrapping;
|
|
283
|
-
texture.wrapT = THREE.ClampToEdgeWrapping;
|
|
284
|
-
texture.needsUpdate = true;
|
|
285
|
-
return texture;
|
|
286
|
-
}
|
|
287
|
-
function startAnimate() {
|
|
288
|
-
stopAnimate();
|
|
289
|
-
const animate = () => {
|
|
290
|
-
animationId = requestAnimationFrame(animate);
|
|
291
|
-
if (controls) controls.update();
|
|
292
|
-
renderer && renderer.render(scene, camera);
|
|
293
|
-
labelRenderer && labelRenderer.render(scene, camera);
|
|
294
|
-
};
|
|
295
|
-
animate();
|
|
296
|
-
}
|
|
297
|
-
function stopAnimate() {
|
|
298
|
-
if (animationId) {
|
|
299
|
-
cancelAnimationFrame(animationId);
|
|
300
|
-
animationId = null;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
function observeResize() {
|
|
304
|
-
if (!containerRef.value) return;
|
|
305
|
-
if (resizeObserver) resizeObserver.disconnect();
|
|
306
|
-
resizeObserver = new ResizeObserver((entries) => {
|
|
307
|
-
for (const entry of entries) {
|
|
308
|
-
const cr = entry.contentRect;
|
|
309
|
-
onResize(Math.max(cr.width, 1), Math.max(cr.height, 1));
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
resizeObserver.observe(containerRef.value);
|
|
313
|
-
}
|
|
314
|
-
function onResize(width, height) {
|
|
315
|
-
if (!renderer || !camera) return;
|
|
316
|
-
renderer.setSize(width, height);
|
|
317
|
-
labelRenderer && labelRenderer.setSize(width, height);
|
|
318
|
-
camera.aspect = width / height;
|
|
319
|
-
camera.updateProjectionMatrix();
|
|
320
|
-
}
|
|
321
|
-
onMounted(() => {
|
|
322
|
-
initScene();
|
|
323
|
-
});
|
|
324
|
-
onUnmounted(() => {
|
|
325
|
-
stopAnimate();
|
|
326
|
-
if (resizeObserver) {
|
|
327
|
-
resizeObserver.disconnect();
|
|
328
|
-
resizeObserver = null;
|
|
329
|
-
}
|
|
330
|
-
if (barsGroup) {
|
|
331
|
-
clearGroup(barsGroup);
|
|
332
|
-
barsGroup = null;
|
|
333
|
-
}
|
|
334
|
-
if (renderer) {
|
|
335
|
-
renderer.dispose();
|
|
336
|
-
if (renderer.domElement && renderer.domElement.parentNode) {
|
|
337
|
-
renderer.domElement.parentNode.removeChild(renderer.domElement);
|
|
338
|
-
}
|
|
339
|
-
renderer = null;
|
|
340
|
-
}
|
|
341
|
-
if (labelRenderer) {
|
|
342
|
-
if (labelRenderer.domElement && labelRenderer.domElement.parentNode) {
|
|
343
|
-
labelRenderer.domElement.parentNode.removeChild(labelRenderer.domElement);
|
|
344
|
-
}
|
|
345
|
-
labelRenderer = null;
|
|
346
|
-
}
|
|
347
|
-
if (envTexture) {
|
|
348
|
-
envTexture.dispose();
|
|
349
|
-
envTexture = null;
|
|
350
|
-
}
|
|
351
|
-
if (controls) {
|
|
352
|
-
controls.dispose();
|
|
353
|
-
controls = null;
|
|
354
|
-
}
|
|
355
|
-
camera = null;
|
|
356
|
-
scene = null;
|
|
357
|
-
});
|
|
358
|
-
return (_ctx, _cache) => {
|
|
359
|
-
return openBlock(), createElementBlock("div", {
|
|
360
|
-
class: "mian-barChart3d",
|
|
361
|
-
ref_key: "containerRef",
|
|
362
|
-
ref: containerRef,
|
|
363
|
-
style: normalizeStyle({
|
|
364
|
-
width: chartStyle.value.width,
|
|
365
|
-
height: chartStyle.value.height,
|
|
366
|
-
padding: `${props.record.options?.style?.tbPadding || 0}px ${props.record.options?.style?.lrPadding || 0}px`
|
|
367
|
-
})
|
|
368
|
-
}, null, 4);
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
const BarChart3D = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8a4e4da8"]]);
|
|
373
|
-
export {
|
|
374
|
-
BarChart3D as default
|
|
375
|
-
};
|