0
Fork 0
mirror of https://github.com/penpot/penpot-exporter-figma-plugin.git synced 2024-12-22 05:33:02 -05:00

[WIP] Detect better when a shape is duplicated

This commit is contained in:
Jordi Sala Morales 2024-05-27 10:38:05 +00:00
parent 477291758e
commit 74d26d80c5
No known key found for this signature in database
GPG key ID: C5127140107F55FD
3 changed files with 70 additions and 17 deletions

18
package-lock.json generated
View file

@ -15,6 +15,7 @@
"react-hook-form": "^7.51",
"romans": "^2.0",
"slugify": "^1.6",
"svg-path-commander": "^2.0.9",
"svg-path-parser": "^1.1",
"use-resize-observer": "^9.1"
},
@ -2454,6 +2455,11 @@
"@swc/counter": "^0.1.3"
}
},
"node_modules/@thednp/dommatrix": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@thednp/dommatrix/-/dommatrix-2.0.6.tgz",
"integrity": "sha512-DXQq4Rs/akYzeXYGkNy3KiJ4JoD8+SYr1QRWTXtAGoZ0+vJcyBt0aeqA1K4CxPaBaIfKdOTE+Te1HV9sAQ4I4A=="
},
"node_modules/@trivago/prettier-plugin-sort-imports": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz",
@ -8277,6 +8283,18 @@
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
"dev": true
},
"node_modules/svg-path-commander": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/svg-path-commander/-/svg-path-commander-2.0.9.tgz",
"integrity": "sha512-VfRLznHewlpQvuahtBK0MT/PlWAapbTx8RSytqgaVwD3US2keKcc3WYYlBBk4vIOR+jB3nQu/NAVlWHKlo0Fjw==",
"dependencies": {
"@thednp/dommatrix": "^2.0.6"
},
"engines": {
"node": ">=16",
"pnpm": ">=8.6.0"
}
},
"node_modules/svg-path-parser": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/svg-path-parser/-/svg-path-parser-1.1.0.tgz",

View file

@ -28,6 +28,7 @@
"react-hook-form": "^7.51",
"romans": "^2.0",
"slugify": "^1.6",
"svg-path-commander": "^2.0.9",
"svg-path-parser": "^1.1",
"use-resize-observer": "^9.1"
},

View file

@ -1,24 +1,18 @@
import SVGPathCommander from 'svg-path-commander';
import { parseSVG } from 'svg-path-parser';
import {
transformBlend,
transformDimensionAndPositionFromVectorPath,
transformEffects,
transformProportion,
transformSceneNode,
transformStrokesFromVector
} from '@plugin/transformers/partials';
import { transformBlend, transformDimensionAndPositionFromVectorPath, transformEffects, transformProportion, transformSceneNode, transformStrokesFromVector } from '@plugin/transformers/partials';
import { translateFills } from '@plugin/translators/fills';
import {
translateCommandsToSegments,
translateLineNode,
translateVectorPaths,
translateWindingRule
} from '@plugin/translators/vectors';
import { translateCommandsToSegments, translateLineNode, translateVectorPaths, translateWindingRule } from '@plugin/translators/vectors';
import { PathAttributes } from '@ui/lib/types/shapes/pathShape';
import { PathShape } from '@ui/lib/types/shapes/pathShape';
export const transformVectorPathsAsContent = (
node: StarNode | LineNode | PolygonNode,
baseX: number,
@ -59,9 +53,27 @@ export const transformVectorPaths = async (
node.fillGeometry
.filter(
geometry =>
!node.vectorPaths.find(
vectorPath => normalizePath(vectorPath.data) === normalizePath(geometry.data)
)
!node.vectorPaths.find(vectorPath => {
// console.log(vectorPath.data, geometry.data);
console.log(
SVGPathCommander.optimizePath(SVGPathCommander.normalizePath(vectorPath.data), 2),
SVGPathCommander.optimizePath(SVGPathCommander.normalizePath(geometry.data), 2),
new SVGPathCommander(vectorPath.data, { round: 'auto' }).optimize().toString() ===
new SVGPathCommander(geometry.data, { round: 'auto' }).optimize().toString(),
SVGPathCommander.normalizePath(vectorPath.data),
SVGPathCommander.normalizePath(geometry.data),
normalizePath(vectorPath.data) === normalizePath(geometry.data),
Math.abs(
SVGPathCommander.getTotalLength(vectorPath.data) -
SVGPathCommander.getTotalLength(geometry.data)
) <= 0.01
);
// compare vertexs of the path
return normalizePath(vectorPath.data) === normalizePath(geometry.data);
})
)
.map(geometry => transformVectorPath(node, geometry, undefined, baseX, baseY))
);
@ -69,6 +81,28 @@ export const transformVectorPaths = async (
return [...geometryShapes, ...pathShapes];
};
const compareVertices = (vertices1: Vertex[], vertices2: Vertex[]): boolean => {
if (vertices1.length !== vertices2.length) {
return false;
}
const set1 = new Set(vertices1.map(v => `${v.x},${v.y}`));
const set2 = new Set(vertices2.map(v => `${v.x},${v.y}`));
if (set1.size !== set2.size) {
return false;
}
for (const vertex of set1) {
if (!set2.has(vertex)) {
return false;
}
}
return true;
}
const getVectorPaths = (node: StarNode | LineNode | PolygonNode): VectorPaths => {
switch (node.type) {
case 'STAR':