import { log } from '$root/logger.js'; import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js'; import intersect from '../intersect/index.js'; import type { Node } from '$root/rendering-util/types.d.ts'; import { styles2String, userNodeOverrides, } from '$root/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.js'; import rough from 'roughjs'; import { insertPolygonShape } from './insertPolygonShape.js'; export const createDecisionBoxPathD = (x: number, y: number, size: number): string => { return [ `M${x + size / 2},${y}`, `L${x + size},${y - size / 2}`, `L${x + size / 2},${y - size}`, `L${x},${y - size / 2}`, 'Z', ].join(' '); }; export const question = async (parent: SVGAElement, node: Node): Promise => { const { labelStyles, nodeStyles } = styles2String(node); node.labelStyle = labelStyles; const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node)); const w = bbox.width + node.padding; const h = bbox.height + node.padding; const s = w + h; const points = [ { x: s / 2, y: 0 }, { x: s, y: -s / 2 }, { x: s / 2, y: -s }, { x: 0, y: -s / 2 }, ]; let polygon: d3.Selection; const { cssStyles } = node; if (node.look === 'handDrawn') { // @ts-ignore - rough is not typed const rc = rough.svg(shapeSvg); const options = userNodeOverrides(node, {}); const pathData = createDecisionBoxPathD(0, 0, s); const roughNode = rc.path(pathData, options); polygon = shapeSvg .insert(() => roughNode, ':first-child') .attr('transform', `translate(${-s / 2}, ${s / 2})`); if (cssStyles) { polygon.attr('style', cssStyles); } } else { polygon = insertPolygonShape(shapeSvg, s, s, points); } if (nodeStyles) { polygon.attr('style', nodeStyles); } updateNodeBounds(node, polygon); node.intersect = function (point) { log.debug( 'APA12 Intersect called SPLIT\npoint:', point, '\nnode:\n', node, '\nres:', intersect.polygon(node, points, point) ); return intersect.polygon(node, points, point); }; return shapeSvg; };