|
|
@@ -4,9 +4,19 @@ import { CircleData, defaultStyle as circleDefaultStyle } from "../circle";
|
|
|
import { InteractiveFix, InteractiveTo, MatResponseProps } from "../index.ts";
|
|
|
import { DrawStore } from "@/core/store/index.ts";
|
|
|
import { Pos } from "@/utils/math.ts";
|
|
|
-import { TableData } from "../table/index.ts";
|
|
|
+import {
|
|
|
+ TableCollData,
|
|
|
+ TableData,
|
|
|
+ interactiveToData as tableInteractiveToData,
|
|
|
+} from "../table/index.ts";
|
|
|
import { copy } from "@/utils/shared.ts";
|
|
|
import { ref } from "vue";
|
|
|
+import {
|
|
|
+ useGetViewBoxPositionPixel,
|
|
|
+ useViewerInvertTransform,
|
|
|
+} from "@/core/hook/use-viewer.ts";
|
|
|
+import { useHistory } from "@/core/hook/use-history.ts";
|
|
|
+import { DrawExpose } from "@/core/hook/use-expose.ts";
|
|
|
|
|
|
export {
|
|
|
getMouseStyle,
|
|
|
@@ -37,9 +47,9 @@ export const defaultStyle = {
|
|
|
strokeWidth: 2,
|
|
|
};
|
|
|
|
|
|
-export const fixedStrokeOptions:number[] = [];
|
|
|
-export const autoGenTable = ref(true)
|
|
|
-export type SerialData = CircleData;
|
|
|
+export const fixedStrokeOptions: number[] = [];
|
|
|
+export const autoGenTable = ref(true);
|
|
|
+export type SerialData = CircleData & { joinIds?: string[] };
|
|
|
|
|
|
export const getSerialFontW = (data: SerialData) => {
|
|
|
const fontSize = data.fontSize || defaultStyle.fontSize;
|
|
|
@@ -82,6 +92,7 @@ export const interactiveToData: InteractiveTo<"serial"> = ({
|
|
|
fontSize: defaultStyle.fontSize,
|
|
|
...getBaseItem(),
|
|
|
padding: 3,
|
|
|
+ joinIds: [],
|
|
|
content: getCurrentNdx(store),
|
|
|
...preset,
|
|
|
} as unknown as SerialData;
|
|
|
@@ -95,6 +106,7 @@ export const interactiveFixData: InteractiveFix<"serial"> = ({
|
|
|
}) => {
|
|
|
data.mat = new Transform().translate(info.cur!.x, info.cur!.y).m;
|
|
|
const radius = (getSerialFontW(data) * Math.sqrt(2)) / 2;
|
|
|
+ data.joinIds = info.attach || [];
|
|
|
data.radiusX = radius;
|
|
|
data.radiusY = radius;
|
|
|
return data;
|
|
|
@@ -103,7 +115,7 @@ export const interactiveFixData: InteractiveFix<"serial"> = ({
|
|
|
export const delItemRaw = (
|
|
|
table: TableData,
|
|
|
data: SerialData[],
|
|
|
- item: SerialData
|
|
|
+ item: SerialData,
|
|
|
) => {
|
|
|
const ndx = data.indexOf(item);
|
|
|
const getPosition = (itemNdx: number) => {
|
|
|
@@ -120,41 +132,17 @@ export const delItemRaw = (
|
|
|
r = s;
|
|
|
s = getPosition(i);
|
|
|
for (let j = 0; j < s[2]; j++) {
|
|
|
- Object.assign(table.content[r[0]][r[1] + j], table.content[s[0]][s[1] + j])
|
|
|
- // table.content[r[0]][r[1] + j] = copy(table.content[s[0]][s[1] + j]);
|
|
|
- // if (j === 0) {
|
|
|
- // table.content[r[0]][r[1] + j].content = oldItem.content!;
|
|
|
- // } else {
|
|
|
- // table.content[r[0]][r[1] + j].content =
|
|
|
- // table.content[s[0]][s[1] + j].content!;
|
|
|
- // }
|
|
|
+ Object.assign(
|
|
|
+ table.content[r[0]][r[1] + j],
|
|
|
+ table.content[s[0]][s[1] + j],
|
|
|
+ );
|
|
|
}
|
|
|
- // let cur = { ...data[i] };
|
|
|
- // data[i].content = oldItem.content;
|
|
|
- // const radius = (getSerialFontW(data[i]) * Math.sqrt(2)) / 2;
|
|
|
- // data[i].radiusX = radius;
|
|
|
- // data[i].radiusY = radius;
|
|
|
- // matResponse({
|
|
|
- // data: data[i],
|
|
|
- // mat: new Transform(data[i].mat),
|
|
|
- // increment: false,
|
|
|
- // });
|
|
|
- // store.setItem("serial", { id: data[i].id, value: { ...data[i] } });
|
|
|
- // oldItem = cur;
|
|
|
}
|
|
|
|
|
|
- console.log(copy(table))
|
|
|
for (let j = 0; j < s[2]; j++) {
|
|
|
- console.log({...table.content[s[0]][s[1] + j]})
|
|
|
table.content[s[0]][s[1] + j].content = "";
|
|
|
- // if (j === 0) {
|
|
|
- // table.content[r[0]][r[1] + j].content = oldItem.content!;
|
|
|
- // } else {
|
|
|
- // table.content[r[0]][r[1] + j].content =
|
|
|
- // table.content[s[0]][s[1] + j].content!;
|
|
|
- // }
|
|
|
}
|
|
|
- console.log(copy(table))
|
|
|
+ console.log(copy(table));
|
|
|
const cols = table.content.flatMap((row) => {
|
|
|
const cols = [];
|
|
|
for (let i = 0; i < row.length; i += 2) {
|
|
|
@@ -164,9 +152,8 @@ export const delItemRaw = (
|
|
|
});
|
|
|
|
|
|
const delRowCount = Math.floor(
|
|
|
- cols.filter((item) => item.content === "").length / 2
|
|
|
+ cols.filter((item) => item.content === "").length / 2,
|
|
|
);
|
|
|
- console.log('delRowCount', delRowCount, cols.filter((item) => item.content === "").length)
|
|
|
for (let i = 0; i < delRowCount; i++) {
|
|
|
table.height -= table.content.pop()![0].height;
|
|
|
}
|
|
|
@@ -174,7 +161,7 @@ export const delItemRaw = (
|
|
|
};
|
|
|
|
|
|
export const joinKey = "serial-table";
|
|
|
-export const tableTitle = `图示`
|
|
|
+export const tableTitle = `图示`;
|
|
|
export const delItem = (store: DrawStore, item: SerialData) => {
|
|
|
const table = store
|
|
|
.getTypeItems("table")
|
|
|
@@ -194,7 +181,7 @@ export const delItem = (store: DrawStore, item: SerialData) => {
|
|
|
|
|
|
export const matResponse = (
|
|
|
{ data, mat, increment }: MatResponseProps<"serial">,
|
|
|
- initRadius?: Pos
|
|
|
+ initRadius?: Pos,
|
|
|
) => {
|
|
|
if (!initRadius) {
|
|
|
initRadius = {
|
|
|
@@ -218,3 +205,167 @@ export const getPredefine = (key: keyof CircleData) => {
|
|
|
return { canun: true };
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
+const getTempContents = () => {
|
|
|
+ const tempContents: TableCollData[] = [];
|
|
|
+ for (let i = 0; i < defaultTableStyle.repColCount; i++) {
|
|
|
+ tempContents.push(
|
|
|
+ {
|
|
|
+ key: "preset-col",
|
|
|
+ content: "序号",
|
|
|
+ readonly: true,
|
|
|
+ notdel: true,
|
|
|
+ width: defaultTableStyle.nameColWidth,
|
|
|
+ height: defaultTableStyle.colHeight,
|
|
|
+ fontSize: defaultTableStyle.fontSize,
|
|
|
+ padding: defaultTableStyle.padding,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: "preset-col",
|
|
|
+ content: "描述",
|
|
|
+ readonly: true,
|
|
|
+ notdel: true,
|
|
|
+ width: defaultTableStyle.valueColWidth,
|
|
|
+ height: defaultTableStyle.colHeight,
|
|
|
+ fontSize: defaultTableStyle.fontSize,
|
|
|
+ padding: defaultTableStyle.padding,
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return tempContents;
|
|
|
+};
|
|
|
+
|
|
|
+export const addTable = (draw: DrawExpose) => {
|
|
|
+ return draw.runHook(() => {
|
|
|
+ const getPosition = useGetViewBoxPositionPixel();
|
|
|
+ const invMat = useViewerInvertTransform();
|
|
|
+ const history = useHistory();
|
|
|
+ let margin = draw.config.margin || 0;
|
|
|
+ if (!Array.isArray(margin)) {
|
|
|
+ margin = [margin, margin, margin, margin];
|
|
|
+ }
|
|
|
+
|
|
|
+ const w =
|
|
|
+ (defaultTableStyle.nameColWidth + defaultTableStyle.valueColWidth) *
|
|
|
+ defaultTableStyle.repColCount;
|
|
|
+ const h = defaultTableStyle.colHeight;
|
|
|
+
|
|
|
+ let pos = getPosition(
|
|
|
+ {
|
|
|
+ right: defaultTableStyle.right + margin[1],
|
|
|
+ top: defaultTableStyle.top + margin[0],
|
|
|
+ },
|
|
|
+ { width: w, height: h },
|
|
|
+ );
|
|
|
+ pos = invMat.value.point(pos);
|
|
|
+ const end = {
|
|
|
+ x: pos.x + w,
|
|
|
+ y: pos.y + h,
|
|
|
+ };
|
|
|
+
|
|
|
+ // const content: TableCollData[] = [];
|
|
|
+ const content: TableCollData[] = getTempContents();
|
|
|
+ return tableInteractiveToData({
|
|
|
+ info: { cur: [pos, end] },
|
|
|
+ preset: {
|
|
|
+ notaddRow: true,
|
|
|
+ notaddCol: true,
|
|
|
+ key: joinKey,
|
|
|
+ fontSize: defaultTableStyle.fontSize,
|
|
|
+ title: tableTitle,
|
|
|
+ content: [content],
|
|
|
+ strokeWidth: defaultTableStyle.tableStrokeWidth,
|
|
|
+ },
|
|
|
+ store: draw.store,
|
|
|
+ history,
|
|
|
+ notdraw: true,
|
|
|
+ } as any)!;
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+export const syncTable = (table: TableData, items: SerialData[]) => {
|
|
|
+ const tempRow = table.content[table.content.length - 1];
|
|
|
+ const presetIndex = table.content.findIndex(
|
|
|
+ (row) => row[0].key === "preset-col",
|
|
|
+ );
|
|
|
+ if (presetIndex !== -1) {
|
|
|
+ table.content.splice(presetIndex, 1);
|
|
|
+ table.height -= tempRow[0].height;
|
|
|
+ }
|
|
|
+
|
|
|
+ const colCount = tempRow.length / 2;
|
|
|
+ const oldData: Record<string, string> = {};
|
|
|
+ table.content.forEach((row) => {
|
|
|
+ for (let i = 0; i < row.length; i += colCount) {
|
|
|
+ if (row[i + 1].joinId) {
|
|
|
+ oldData[row[i + 1].joinId!] = row[i + 1].content;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (~presetIndex) {
|
|
|
+ table.content = table.content.slice(0, presetIndex + 1);
|
|
|
+ table.height = table.content.reduce((t, item) => item[0].height + t, 0)
|
|
|
+ } else {
|
|
|
+ table.content = [];
|
|
|
+ table.height = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ const cols = table.content.flatMap((row) => {
|
|
|
+ const cols = [];
|
|
|
+ for (let i = 0; i < row.length; i += 2) {
|
|
|
+ cols.push(row[i]);
|
|
|
+ }
|
|
|
+ return cols;
|
|
|
+ });
|
|
|
+
|
|
|
+ let isUpdate = false;
|
|
|
+ for (let i = 0; i < items.length; i++) {
|
|
|
+ const item = items[i];
|
|
|
+ if (cols.some((col) => col.content === item.content)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ let rowNdx = Math.floor(i / colCount);
|
|
|
+ let colNdx = (i % colCount) * 2;
|
|
|
+ const val = item.desc || oldData[item.id] || ""
|
|
|
+ if (colNdx) {
|
|
|
+ table.content[rowNdx][colNdx].content = item.content!;
|
|
|
+ table.content[rowNdx][colNdx + 1].content = val;
|
|
|
+ table.content[rowNdx][colNdx + 1].joinId = item.id
|
|
|
+ } else {
|
|
|
+ table.height += tempRow[0].height;
|
|
|
+ let cols = [
|
|
|
+ {
|
|
|
+ ...tempRow[0],
|
|
|
+ content: item.content!,
|
|
|
+ hidden: false,
|
|
|
+ key: "serial-name",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ...tempRow[1],
|
|
|
+ content: val,
|
|
|
+ readonly: false,
|
|
|
+ hidden: false,
|
|
|
+ joinId: item.id,
|
|
|
+ key: "serial-desc",
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ for (let i = 1; i < colCount; i++) {
|
|
|
+ cols.push(
|
|
|
+ { ...tempRow[2], content: "", hidden: false, key: "serial-name" },
|
|
|
+ {
|
|
|
+ ...tempRow[3],
|
|
|
+ content: "",
|
|
|
+ readonly: false,
|
|
|
+ hidden: false,
|
|
|
+ key: "serial-desc",
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
+ table.content.push(cols);
|
|
|
+ }
|
|
|
+
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
+ return isUpdate;
|
|
|
+};
|