|
@@ -14,69 +14,76 @@ import { Color } from "three";
|
|
|
|
|
|
export const shapeName = "图例";
|
|
|
export const defaultStyle = {
|
|
|
- coverFill: '#000000',
|
|
|
+ coverFill: "#000000",
|
|
|
coverOpcatiy: 0,
|
|
|
strokeScaleEnabled: false,
|
|
|
width: 80,
|
|
|
height: 80,
|
|
|
};
|
|
|
|
|
|
- type ColorCounts = [string, number][]
|
|
|
- const colorsManage = (counts: ColorCounts, color: any) => {
|
|
|
+type ColorCounts = [string, number][];
|
|
|
+const colorsManage = (counts: ColorCounts, color: any) => {
|
|
|
if (!color) {
|
|
|
return;
|
|
|
}
|
|
|
- const colorHex = new Color(color).getHexString()
|
|
|
- const item = counts.find(([c]) => c === colorHex)
|
|
|
+ const colorHex = new Color(color).getHexString();
|
|
|
+ const item = counts.find(([c]) => c === colorHex);
|
|
|
if (!item) {
|
|
|
- counts.push([colorHex, 1])
|
|
|
+ counts.push([colorHex, 1]);
|
|
|
} else {
|
|
|
- item[1]++
|
|
|
+ item[1]++;
|
|
|
}
|
|
|
-}
|
|
|
+};
|
|
|
const findColor = (counts: ColorCounts) => {
|
|
|
- let ndx = -1
|
|
|
- let max = 0
|
|
|
+ let ndx = -1;
|
|
|
+ let max = 0;
|
|
|
for (let i = 0; i < counts.length; i++) {
|
|
|
if (counts[i][1] >= max) {
|
|
|
- ndx = i
|
|
|
- max = counts[i][1]
|
|
|
+ ndx = i;
|
|
|
+ max = counts[i][1];
|
|
|
}
|
|
|
}
|
|
|
if (~ndx) {
|
|
|
- return `#${counts[ndx][0]}`
|
|
|
+ return `#${counts[ndx][0]}`;
|
|
|
}
|
|
|
-}
|
|
|
+};
|
|
|
|
|
|
-export const getIconStyle = async (url: string, width = defaultStyle.width, height = defaultStyle.height) => {
|
|
|
+export const getIconStyle = async (
|
|
|
+ url: string,
|
|
|
+ width = defaultStyle.width,
|
|
|
+ height = defaultStyle.height,
|
|
|
+ fixed = false
|
|
|
+) => {
|
|
|
const svgContent = parseSvgContent(await getSvgContent(url));
|
|
|
- if (width / height > svgContent.width / svgContent.height) {
|
|
|
- width = svgContent.width / svgContent.height * height
|
|
|
- } else {
|
|
|
- height = svgContent.height / svgContent.width * width
|
|
|
+ if (!fixed) {
|
|
|
+ if (width / height > svgContent.width / svgContent.height) {
|
|
|
+ width = (svgContent.width / svgContent.height) * height;
|
|
|
+ } else {
|
|
|
+ height = (svgContent.height / svgContent.width) * width;
|
|
|
+ }
|
|
|
}
|
|
|
- const fillColorCounts: [string, number][] = []
|
|
|
- const strokeColorCounts: [string, number][] = []
|
|
|
+ const fillColorCounts: [string, number][] = [];
|
|
|
+ const strokeColorCounts: [string, number][] = [];
|
|
|
|
|
|
for (let i = 0; i < svgContent.paths.length; i++) {
|
|
|
- colorsManage(fillColorCounts, svgContent.paths[i].fill)
|
|
|
- colorsManage(strokeColorCounts, svgContent.paths[i].stroke)
|
|
|
+ colorsManage(fillColorCounts, svgContent.paths[i].fill);
|
|
|
+ colorsManage(strokeColorCounts, svgContent.paths[i].stroke);
|
|
|
}
|
|
|
|
|
|
const color = {
|
|
|
fill: findColor(fillColorCounts) || null,
|
|
|
- stroke: findColor(strokeColorCounts) || null
|
|
|
+ stroke: findColor(strokeColorCounts) || null,
|
|
|
};
|
|
|
if (!color.fill && !color.stroke) {
|
|
|
color.stroke = "#000000";
|
|
|
- }
|
|
|
+ }
|
|
|
return {
|
|
|
url,
|
|
|
width,
|
|
|
height,
|
|
|
- ...color
|
|
|
- }
|
|
|
-}
|
|
|
+ ...color,
|
|
|
+ };
|
|
|
+};
|
|
|
|
|
|
export const addMode = "dot";
|
|
|
|
|
@@ -102,17 +109,18 @@ export const getMouseStyle = (data: IconData) => {
|
|
|
coverOpcatiy: data.coverOpcatiy || 0,
|
|
|
},
|
|
|
hover: { coverFill: fillStatus.hover, coverOpcatiy: hCoverOpcaoty },
|
|
|
- select: { coverFill: fillStatus.select, coverOpcatiy: hCoverOpcaoty },
|
|
|
- focus: { coverFill: fillStatus.select, coverOpcatiy: hCoverOpcaoty },
|
|
|
+ select: { coverFill: fillStatus.select, coverOpcatiy: hCoverOpcaoty },
|
|
|
+ focus: { coverFill: fillStatus.select, coverOpcatiy: hCoverOpcaoty },
|
|
|
press: { coverFill: fillStatus.press, coverOpcatiy: hCoverOpcaoty },
|
|
|
};
|
|
|
};
|
|
|
|
|
|
export type IconData = Partial<typeof defaultStyle> &
|
|
|
- BaseItem & Size & {
|
|
|
+ BaseItem &
|
|
|
+ Size & {
|
|
|
fill?: string | null;
|
|
|
stroke?: string | null;
|
|
|
- name?: string
|
|
|
+ name?: string;
|
|
|
strokeWidth?: number;
|
|
|
coverFill?: string;
|
|
|
coverStroke?: string;
|
|
@@ -136,7 +144,7 @@ export const interactiveToData: InteractiveTo<"icon"> = ({
|
|
|
...args
|
|
|
}) => {
|
|
|
if (info.cur) {
|
|
|
- console.error(preset)
|
|
|
+ console.error(preset);
|
|
|
return interactiveFixData({
|
|
|
...args,
|
|
|
viewTransform,
|
|
@@ -168,17 +176,17 @@ export const interactiveFixData: InteractiveFix<"icon"> = ({
|
|
|
return data;
|
|
|
};
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-export const matResponse = ({data, mat, increment}: MatResponseProps<'icon'>) => {
|
|
|
+export const matResponse = ({
|
|
|
+ data,
|
|
|
+ mat,
|
|
|
+ increment,
|
|
|
+}: MatResponseProps<"icon">) => {
|
|
|
data.mat = increment ? mat.copy().multiply(new Transform(data.mat)).m : mat.m;
|
|
|
return data;
|
|
|
-}
|
|
|
-
|
|
|
+};
|
|
|
|
|
|
export const getPredefine = (key: keyof IconData) => {
|
|
|
- if (key === 'fill' || key === 'stroke') {
|
|
|
- return { canun: true }
|
|
|
+ if (key === "fill" || key === "stroke") {
|
|
|
+ return { canun: true };
|
|
|
}
|
|
|
-}
|
|
|
+};
|