Skip to content

Commit e523b9b

Browse files
committed
chore: manage boolean operations ("exclude" preview not fully working)
1 parent 80fa368 commit e523b9b

File tree

4 files changed

+77
-8
lines changed

4 files changed

+77
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import assert from 'assert';
2+
import { parseSVG } from 'svg-path-parser';
3+
4+
import { BooleanOperationNode, Transform } from '@figpot/src/clients/figma';
5+
import { MappingType } from '@figpot/src/features/document';
6+
import { transformBlend } from '@figpot/src/features/transformers/partials/transformBlend';
7+
import { transformChildren } from '@figpot/src/features/transformers/partials/transformChildren';
8+
import { transformDimensionAndRotationAndPosition } from '@figpot/src/features/transformers/partials/transformDimensionAndRotationAndPosition';
9+
import { transformEffects } from '@figpot/src/features/transformers/partials/transformEffects';
10+
import { transformFills } from '@figpot/src/features/transformers/partials/transformFills';
11+
import { transformLayoutAttributes } from '@figpot/src/features/transformers/partials/transformLayout';
12+
import { transformProportion } from '@figpot/src/features/transformers/partials/transformProportion';
13+
import { transformSceneNode } from '@figpot/src/features/transformers/partials/transformSceneNode';
14+
import { transformStrokes } from '@figpot/src/features/transformers/partials/transformStrokes';
15+
import { translateBoolType } from '@figpot/src/features/translators/translateBoolType';
16+
import { translateId } from '@figpot/src/features/translators/translateId';
17+
import { translateCommands } from '@figpot/src/features/translators/vectors/translateCommands';
18+
import { PenpotNode } from '@figpot/src/models/entities/penpot/node';
19+
import { BoolShape } from '@figpot/src/models/entities/penpot/shapes/bool';
20+
import { BoolContent } from '@figpot/src/models/entities/penpot/shapes/bool';
21+
22+
function translatePathNode(node: BooleanOperationNode, figmaNodeTransform: Transform): BoolContent[] {
23+
assert(node.fillGeometry);
24+
25+
// TODO: this won't work for `exclude`, the Figma path of the bool operation does seems to not involves the exclusion
26+
// Meaning within the UI the preview will be a `difference` operation, if moving position or switching back and forth to another bool mode it will adjust correctly
27+
return translateCommands(node, figmaNodeTransform, parseSVG(node.fillGeometry[0].path));
28+
}
29+
30+
export function transformBooleanNode(
31+
registeredPageNodes: PenpotNode[],
32+
node: BooleanOperationNode,
33+
closestFigmaFrameId: string,
34+
figmaNodeTransform: Transform,
35+
mapping: MappingType
36+
): BoolShape {
37+
transformChildren(registeredPageNodes, node, closestFigmaFrameId, figmaNodeTransform, mapping);
38+
39+
return {
40+
type: 'bool',
41+
name: node.name,
42+
shapes: node.children.map((figmaChild) => translateId(figmaChild.id, mapping)),
43+
boolContent: translatePathNode(node, figmaNodeTransform),
44+
boolType: translateBoolType(node.booleanOperation),
45+
...transformFills(node),
46+
...transformEffects(node, mapping),
47+
...transformStrokes(node),
48+
...transformDimensionAndRotationAndPosition(node, figmaNodeTransform),
49+
...transformSceneNode(node),
50+
...transformBlend(node),
51+
...transformProportion(node),
52+
...transformLayoutAttributes(node),
53+
};
54+
}

src/features/transformers/transformSceneNode.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { SubcanvasNode, Transform } from '@figpot/src/clients/figma';
22
import { MappingType } from '@figpot/src/features/document';
3+
import { transformBooleanNode } from '@figpot/src/features/transformers/transformBooleanNode';
34
import { transformEllipseNode } from '@figpot/src/features/transformers/transformEllipseNode';
45
import { transformFrameNode } from '@figpot/src/features/transformers/transformFrameNode';
56
import { transformGroupNode } from '@figpot/src/features/transformers/transformGroupNode';
@@ -12,7 +13,6 @@ import { PenpotNode } from '@figpot/src/models/entities/penpot/node';
1213

1314
// TODO:
1415
// import {
15-
// transformBooleanNode,
1616
// transformComponentNode,
1717
// transformInstanceNode,
1818
// } from '.';
@@ -54,9 +54,9 @@ export function transformSceneNode(
5454
case 'REGULAR_POLYGON':
5555
penpotNode = transformPathNode(figmaNode, figmaNodeTransform, mapping);
5656
break;
57-
// case 'BOOLEAN_OPERATION':
58-
// penpotNode = await transformBooleanNode(figmaNode, baseX, baseY);
59-
// break;
57+
case 'BOOLEAN_OPERATION':
58+
penpotNode = transformBooleanNode(registeredPageNodes, figmaNode, closestFigmaFrameId, figmaNodeTransform, mapping);
59+
break;
6060
// case 'CONNECTOR':
6161
// // TODO: implement it?
6262
// penpotNode = await transformConnectorNode(figmaNode, baseX, baseY);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { booleanOperation } from '@figpot/src/clients/figma';
2+
import { BoolOperations } from '@figpot/src/models/entities/penpot/shapes/bool';
3+
4+
export function translateBoolType(booleanOperation: booleanOperation): BoolOperations {
5+
switch (booleanOperation) {
6+
case 'EXCLUDE':
7+
return 'exclude';
8+
case 'INTERSECT':
9+
return 'intersection';
10+
case 'SUBTRACT':
11+
return 'difference';
12+
case 'UNION':
13+
return 'union';
14+
}
15+
}

src/models/entities/penpot/shapes/bool.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { LayoutChildAttributes } from '@figpot/src/models/entities/penpot/layout';
22
import { ShapeAttributes, ShapeBaseAttributes } from '@figpot/src/models/entities/penpot/shape';
3-
import { PathContent } from '@figpot/src/models/entities/penpot/shapes/path';
3+
import { Segment } from '@figpot/src/models/entities/penpot/shapes/path';
44
import { Point } from '@figpot/src/models/entities/penpot/traits/point';
55
import { Uuid } from '@figpot/src/models/entities/penpot/traits/uuid';
66

@@ -21,14 +21,14 @@ export type BoolOperations =
2121

2222
export type BoolShape = ShapeBaseAttributes & ShapeAttributes & BoolAttributes & LayoutChildAttributes;
2323

24-
type BoolAttributes = {
24+
export type BoolAttributes = {
2525
type?: 'bool';
2626
shapes?: Uuid[];
2727
boolType: BoolOperations;
2828
boolContent?: BoolContent[];
2929
};
3030

31-
type BoolContent = {
31+
export type BoolContent = {
3232
relative?: boolean;
3333
prevPos?: Point;
34-
} & PathContent;
34+
} & Segment;

0 commit comments

Comments
 (0)