UNPKG

mida

Version:

Muiltiple Instance and Data Animator for BPMN models.

133 lines (121 loc) 4.12 kB
/** * Map containing SVG paths needed by BpmnRenderer. export default function getRawPath (pathId) { this.pathMap = { 'DATA_INPUT_PATH': { d:'m 0,0 25.098039215686274,0 6.2745098039215685,6.557377049180327 0,32.78688524590164 -31.372549019607842,0 0,-39.34426229508196 25.098039215686274,0 0,6.557377049180327 6.2745098039215685,0', height: 61, width: 51, heightElements: [10, 50, 60], widthElements: [10, 40, 50, 60] }, 'DATA_OBJECT_PATH': { d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0', height: 61, width: 51, heightElements: [10, 50, 60], widthElements: [10, 40, 50, 60] }, 'DATA_OBJECT_COLLECTION_PATH': { d:'m {mx}, {my} ' + 'm 0 15 l 0 -15 ' + 'm 4 15 l 0 -15 ' + 'm 4 15 l 0 -15 ', height: 61, width: 51, heightElements: [12], widthElements: [1, 6, 12, 15] } }; return this.pathMap[pathId].d; } */ /** * Scales the path to the given height and width. * <h1>Use case</h1> * <p>Use case is to scale the content of elements (event, gateways) based * on the element bounding box's size. * </p> * <h1>Why not transform</h1> * <p>Scaling a path with transform() will also scale the stroke and IE does not support * the option 'non-scaling-stroke' to prevent this. * Also there are use cases where only some parts of a path should be * scaled.</p> * * @param {String} pathId The ID of the path. * @param {Object} param <p> * Example param object scales the path to 60% size of the container (data.width, data.height). * <pre> * { * xScaleFactor: 0.6, * yScaleFactor:0.6, * containerWidth: data.width, * containerHeight: data.height, * position: { * mx: 0.46, * my: 0.2, * } * } * </pre> * <ul> * <li>targetpathwidth = xScaleFactor * containerWidth</li> * <li>targetpathheight = yScaleFactor * containerHeight</li> * <li>Position is used to set the starting coordinate of the path. M is computed: * <ul> * <li>position.x * containerWidth</li> * <li>position.y * containerHeight</li> * </ul> * Center of the container <pre> position: { * mx: 0.5, * my: 0.5, * }</pre> * Upper left corner of the container * <pre> position: { * mx: 0.0, * my: 0.0, * }</pre> * </li> * </ul> * </p> * */ export default function getScaledPath(pathId, param) { var rawPath = this.pathMap[pathId]; // positioning // compute the start point of the path var mx, my; if (param.abspos) { mx = param.abspos.x; my = param.abspos.y; } else { mx = param.containerWidth * param.position.mx; my = param.containerHeight * param.position.my; } var coordinates = {}; // map for the scaled coordinates if (param.position) { // path var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor; var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor; // Apply height ratio for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) { coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio; } // Apply width ratio for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) { coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio; } } // Apply value to raw path var path = format( rawPath.d, { mx: mx, my: my, e: coordinates } ); return path; }; // helpers ////////////////////// // copied from https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js var tokenRegex = /\{([^}]+)\}/g, objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g; // matches .xxxxx or ["xxxxx"] to run over object properties