orcasvn-react-diagrams 0.1.20 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +150 -2
- package/dist/cjs/types/components/paper.d.ts +1 -1
- package/dist/cjs/types/models/IEditorContext.d.ts +10 -11
- package/dist/cjs/types/models/implementations/EditorContext.d.ts +12 -11
- package/dist/esm/index.js +150 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/paper.d.ts +1 -1
- package/dist/esm/types/models/IEditorContext.d.ts +10 -11
- package/dist/esm/types/models/implementations/EditorContext.d.ts +12 -11
- package/dist/index.d.ts +22 -22
- package/package.json +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/models/enums/PositioningAnchor.ts","../../src/models/enums/ResizingDirection.ts","../../src/models/enums/SubObjectDirection.ts","../../src/models/enums/TextAlign.ts","../../node_modules/eventemitter3/index.js","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/native.js","../../node_modules/uuid/dist/esm-browser/v4.js","../../src/utils/generateUniqueId.ts","../../src/models/implementations/Element.ts","../../node_modules/tslib/tslib.es6.js","../../src/components/shapes/shapeWrapper.tsx","../../src/components/shapes/customShape.tsx","../../src/models/implementations/Port.tsx","../../src/models/implementations/ElementLink.ts","../../src/models/implementations/Text.ts","../../src/models/implementations/EditorContext.ts","../../src/components/shapes/circle.tsx","../../src/components/shapes/halfCircle.tsx","../../src/components/shapes/rectangle.tsx","../../src/components/shapes/rectangularFrame.tsx","../../node_modules/react-dom/client.js","../../src/utils/constants.ts","../../src/components/viewControls/selectionFrame.tsx","../../src/hooks/useSelectionFrame.tsx","../../src/contexts/paperEventEmitterContext.tsx","../../src/components/texts/text.tsx","../../src/components/ports/port.tsx","../../src/utils/pathUtil.ts","../../src/utils/mathUtil.ts","../../src/components/CloseIcon.tsx","../../node_modules/flatten-js/utils/utils.js","../../node_modules/flatten-js/utils/errors.js","../../node_modules/flatten-js/classes/matrix.js","../../node_modules/flatten-interval-tree/classes/interval.js","../../node_modules/flatten-interval-tree/utils/constants.js","../../node_modules/flatten-interval-tree/classes/node.js","../../node_modules/flatten-interval-tree/index.js","../../node_modules/flatten-js/data_structures/planar_set.js","../../node_modules/flatten-js/classes/point.js","../../node_modules/flatten-js/classes/vector.js","../../node_modules/flatten-js/classes/line.js","../../node_modules/flatten-js/classes/circle.js","../../node_modules/flatten-js/classes/segment.js","../../node_modules/flatten-js/classes/arc.js","../../node_modules/flatten-js/classes/box.js","../../node_modules/flatten-js/classes/edge.js","../../node_modules/flatten-js/classes/face.js","../../node_modules/flatten-js/classes/ray.js","../../node_modules/flatten-js/algorithms/ray_shooting.js","../../node_modules/flatten-js/classes/polygon.js","../../node_modules/flatten-js/algorithms/distance.js","../../node_modules/flatten-js/index.js","../../src/utils/positionUtil.ts","../../src/components/links/elementLink.tsx","../../src/components/viewControls/ruler.tsx","../../src/components/elements/elementWrapper.tsx","../../src/utils/portSlideRailSVGUtil.ts","../../src/utils/lineUtil.ts","../../node_modules/css-layout/dist/css-layout.js","../../node_modules/react-svg-flexbox/dist/bundle.js","../../src/components/elements/element.tsx","../../src/components/BBoxDebugger.tsx","../../src/components/LinkDebugger.tsx","../../src/hooks/useKeyboardCommands.ts","../../src/components/paper.tsx","../../src/components/editor.tsx"],"sourcesContent":["export enum PositioningAnchor {\r\n TopLeft = 0,\r\n Center\r\n}","export enum ResizingDirection {\r\n TopLeft = 0,\r\n TopCenter = 1,\r\n TopRight = 2,\r\n RightCenter = 3,\r\n BottomRight = 4,\r\n BottomCenter = 5,\r\n BottomLeft = 6,\r\n LeftCenter = 7\r\n}","export enum SubObjectDirection {\r\n Radial = \"Radial\",\r\n PerpendicularInward = \"PerpendicularInward\"\r\n}","export enum TextAlign {\r\n left = 0,\r\n right,\r\n center,\r\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n var uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\n\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","var randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\r\n\r\nexport default function generateUniqueId() {\r\n return uuidv4();\r\n}","import { FC } from \"react\";\r\nimport IElement from \"../IElement\";\r\nimport IElementProps from \"../IElementProps\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\nimport IResizability from \"../IResizability\";\r\nimport IPort from \"../IPort\";\r\nimport IText from \"../IText\";\r\nimport { SubObjectDirection } from \"../enums/SubObjectDirection\";\r\nimport EventEmitter from \"eventemitter3\";\r\nimport generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IFlexboxType from \"../IFlexboxType\";\r\n\r\nexport default class Element implements IElement {\r\n private readonly _id: string;\r\n protected _position: IPosition;\r\n protected _size: ISize;\r\n private _parentElement?: IElement | undefined;\r\n cssClass?: string;\r\n /**\r\n * @deprecated This property is deprecated and will be removed in future versions.\r\n */\r\n reactElement?: FC<IElementProps> | React.FC<IElementProps> | React.ComponentClass<IElementProps>;\r\n\r\n renderShape?: (props: IElementProps) => JSX.Element;\r\n resizability: IResizability = {\r\n enabled: true,\r\n keepRatio: false\r\n };\r\n ports?: IPort[];\r\n texts?: IText[];\r\n portMoveableAreas?: IPosition[][];\r\n portSlideRailSVGClassName?: string;\r\n portDirection?: SubObjectDirection;\r\n defaultPortSize?: number;\r\n onResized?: ((width: number, height: number) => void) | undefined;\r\n onMoved?: ((x: number, y: number) => void) | undefined;\r\n\r\n textsPlaceHolderClassName?: string;\r\n textsPlaceHolderFlexStyle?: IFlexboxType;\r\n textsPlaceHolderFlexboxPosition?: IPosition;\r\n\r\n //internal properties\r\n _eventEmitter: EventEmitter = new EventEmitter();\r\n\r\n constructor(x: number, y: number, width: number, height: number, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas: IPosition[][] = [], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition) {\r\n this._id = generateUniqueId();\r\n this._position = { x, y };\r\n this._size = { width, height };\r\n this.cssClass = cssClass;\r\n this.renderShape = renderShape;\r\n this.texts = texts;\r\n this.ports = ports;\r\n this.portMoveableAreas = portMovealeAreas;\r\n this.portSlideRailSVGClassName = portSlideRailSVGClassName;\r\n this.portDirection = portDirection;\r\n this.parentElement = parentElement;\r\n this.textsPlaceHolderClassName = textsPlaceHolderClassName;\r\n this.textsPlaceHolderFlexStyle = textsPlaceHolderFlexStyle;\r\n this.textsPlaceHolderFlexboxPosition = textsPlaceHolderFlexboxPosition;\r\n }\r\n\r\n public manuallyTriggerRender (){\r\n //TODO: Implement this\r\n }\r\n\r\n public manuallyTriggerRenderPort (portId: string){\r\n //TODO: Implement this\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n\r\n public get size() {\r\n return this._size;\r\n }\r\n\r\n public set size(value: ISize) {\r\n this._size = value;\r\n if (this.onResized) this.onResized(value.width, value.height);\r\n }\r\n\r\n public set position(value: IPosition) {\r\n this._position = value;\r\n if (this.onMoved) this.onMoved(value.x, value.y);\r\n }\r\n\r\n public get position() {\r\n return this._position;\r\n }\r\n\r\n public get parentElement() {\r\n return this._parentElement;\r\n }\r\n\r\n public set parentElement(value: IElement | undefined) {\r\n const oldParent = this._parentElement;\r\n this._parentElement = value;\r\n this._eventEmitter.emit('parentChanged', oldParent, value);\r\n }\r\n\r\n public onParentChanged(callback: (oldParent?: IElement, newParent?: IElement) => void) {\r\n this._eventEmitter.on('parentChanged', callback);\r\n const canceller = () => {\r\n this._eventEmitter.off('parentChanged', callback);\r\n }\r\n return canceller;\r\n }\r\n\r\n public addPort(newPort: IPort) {\r\n if (this.ports) {\r\n this.ports.push(newPort);\r\n } else {\r\n this.ports = [newPort];\r\n }\r\n\r\n this._eventEmitter.emit('addedPort', newPort)\r\n }\r\n\r\n public onAddedPort(callback: (newPort: IPort) => void) {\r\n this._eventEmitter.on('addedPort', callback);\r\n\r\n const canceller = () => {\r\n this._eventEmitter.off('addedPort', callback);\r\n }\r\n\r\n return canceller;\r\n }\r\n\r\n public deletePort(id: string) {\r\n if (!this.ports) return;\r\n\r\n const index = this.ports.findIndex(p => p.id === id);\r\n\r\n if (index === -1) {\r\n throw new Error(`Port with id ${id} is not found`);\r\n }\r\n\r\n this.ports.splice(index, 1)\r\n this._eventEmitter.emit('deletedPort', id)\r\n }\r\n\r\n public onDeletedPort(callback: (id: string) => void) {\r\n this._eventEmitter.on('deletedPort', callback);\r\n\r\n const canceller = () => {\r\n this._eventEmitter.off('deletedPort', callback);\r\n }\r\n\r\n return canceller;\r\n }\r\n\r\n public getPort(id: string): IPort | undefined {\r\n if (!this.ports) return undefined;\r\n\r\n return this.ports.find(p => p.id === id);\r\n }\r\n}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef, useMemo } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport { PositioningAnchor } from '../../models/enums/PositioningAnchor';\r\n\r\ninterface IShapeWrapperProps extends IShape {\r\n children: React.ReactNode;\r\n viewBox?: string;\r\n};\r\n\r\nconst ShapeWrapper: React.ForwardRefExoticComponent<IShapeWrapperProps & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, IShapeWrapperProps>(\r\n function (\r\n shapeProps,\r\n ref\r\n ) {\r\n //if direction is provided, rotation is based on direction\r\n\r\n let rotation = shapeProps.rotation || 0;\r\n\r\n if (shapeProps.direction) {\r\n switch (shapeProps.direction) {\r\n case 'left':\r\n rotation = -90;\r\n break;\r\n case 'right':\r\n rotation = 90;\r\n break;\r\n case 'down':\r\n rotation = 180;\r\n break;\r\n default:\r\n rotation = 0;\r\n break;\r\n }\r\n }\r\n\r\n let position = { x: shapeProps.x, y: shapeProps.y };\r\n let transformOrigin = \"center\";\r\n\r\n if (typeof shapeProps.positioningAnchor === 'object') {\r\n position.x = position.x - shapeProps.positioningAnchor.x / 100 * shapeProps.width;\r\n position.y = position.y - shapeProps.positioningAnchor.y / 100 * shapeProps.height;\r\n\r\n transformOrigin = `${shapeProps.positioningAnchor.x}% ${shapeProps.positioningAnchor.y}%`\r\n }\r\n else if (shapeProps.positioningAnchor === PositioningAnchor.Center) {\r\n position.x = position.x - shapeProps.width / 2;\r\n position.y = position.y - shapeProps.height / 2;\r\n }\r\n\r\n const objectOfAllEventAttributes = useMemo(() => {\r\n const arrayOfAllEventAttributes = Object.entries(shapeProps).filter(([k, v]) => k.startsWith('on'));\r\n return Object.fromEntries(arrayOfAllEventAttributes);\r\n }, [shapeProps]);\r\n\r\n const viewboxWidth = shapeProps.width > shapeProps.height ? 100 : shapeProps.width / shapeProps.height * 100;\r\n const viewBoxHeight = shapeProps.height > shapeProps.width ? 100 : shapeProps.height / shapeProps.width * 100;\r\n const viewBox = shapeProps.viewBox || `0 0 ${viewboxWidth} ${viewBoxHeight}`;\r\n\r\n return (\r\n <g transform={`rotate(${rotation})`} style={{ transformOrigin: transformOrigin, transformBox: \"content-box\" }} >\r\n <svg ref={ref} style={{ overflow: \"visible\" }} x={position.x} y={position.y} width={shapeProps.width} height={shapeProps.height} className={shapeProps.cssClass} viewBox={viewBox} {...objectOfAllEventAttributes}>\r\n {shapeProps.children}\r\n </svg>\r\n </g>\r\n );\r\n });\r\n\r\nexport default ShapeWrapper;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface IShapeProps extends Omit<IShape, \"stroke\" | \"fill\" | \"strokeWidth\"> {\r\n children: React.ReactNode;\r\n};\r\n\r\nconst CustomShape: React.FC<IShapeProps> = forwardRef((props, ref) => {\r\n return (\r\n <ShapeWrapper {...props} ref={ref}>\r\n {props.children}\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default CustomShape;","import React, { forwardRef } from \"react\";\r\nimport generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IPort from \"../IPort\";\r\nimport { IPortProps } from \"../IPortProps\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\nimport CustomShape from \"../../components/shapes/customShape\";\r\nimport IElement from \"../IElement\";\r\n\r\nexport default class Port implements IPort {\r\n private readonly _id: string;\r\n position: IPosition;\r\n size?: ISize;\r\n label?: IText;\r\n renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;\r\n\r\n constructor(x: number, y: number, label?: IText,\r\n shapeRenderer?: {\r\n shape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>,\r\n customShapeWithJSX?: JSX.Element,\r\n positioningAnchor?: IPosition\r\n }, width?: number, height?: number) {\r\n this._id = generateUniqueId()\r\n this.position = { x, y };\r\n if (!height) {\r\n height = width;\r\n }\r\n if (width && height) {\r\n this.size = { width, height };\r\n }\r\n this.label = label;\r\n if (shapeRenderer && shapeRenderer.shape) {\r\n this.renderShape = shapeRenderer.shape;\r\n }\r\n else if (shapeRenderer && shapeRenderer.customShapeWithJSX) {\r\n this.renderShape = forwardRef((props, ref) => {\r\n return (\r\n <CustomShape ref={ref} x={props.x} y={props.y} width={props.width} height={props.height} rotation={props.rotation} positioningAnchor={shapeRenderer.positioningAnchor}\r\n onClick={(e: any) => props.onSelected?.(this.id, e)}\r\n onMouseDown={(e: any) => props.onMouseDown?.(this.id, e)}\r\n onMouseUp={(e: any) => props.onMouseUp?.(this.id, e)}\r\n >\r\n {shapeRenderer.customShapeWithJSX}\r\n </CustomShape>\r\n )\r\n });\r\n }\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n}","import generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IElement from \"../IElement\";\r\nimport IElementLink from \"../IElementLink\";\r\nimport IPort from \"../IPort\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\n\r\nexport default class ElementLink implements IElementLink {\r\n readonly id: string;\r\n sourceElement: IElement;\r\n targetElement?: IElement;\r\n sourcePort: IPort;\r\n targetPort?: IPort;\r\n path?: string;\r\n points: IPosition[];\r\n tempTargetPosition?: IPosition;\r\n markerStart?: JSX.Element;\r\n markerEnd?: JSX.Element;\r\n markerDistanceFromPort?: number;\r\n markerSize?: number;\r\n label?: IText;\r\n sourceLabel?: IText;\r\n targetLabel?: IText;\r\n\r\n constructor(sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);\r\n constructor(sourceElement: IElement, sourcePort: IPort, targetElement?: IElement, targetPort?: IPort, tempTargetPosition?: IPosition, points?: IPosition[], path?: string, markerStart?: JSX.Element, markerEnd?: JSX.Element, markerDistanceFromPort?: number, markerSize?: number, label?: IText, sourceLabel?: IText, targetLabel?: IText) {\r\n\r\n this.id = generateUniqueId();\r\n\r\n this.sourceElement = sourceElement;\r\n this.sourcePort = sourcePort;\r\n if (tempTargetPosition) {\r\n this.tempTargetPosition = tempTargetPosition;\r\n }\r\n\r\n if (points) {\r\n this.points = points;\r\n }\r\n else {\r\n this.points = [];\r\n }\r\n\r\n if (targetElement)\r\n this.targetElement = targetElement;\r\n\r\n if (targetPort)\r\n this.targetPort = targetPort;\r\n\r\n if (path)\r\n this.path = path;\r\n\r\n if (markerStart)\r\n this.markerStart = markerStart;\r\n\r\n if (markerEnd)\r\n this.markerEnd = markerEnd;\r\n\r\n if (markerDistanceFromPort)\r\n this.markerDistanceFromPort = markerDistanceFromPort;\r\n\r\n if (markerSize)\r\n this.markerSize = markerSize;\r\n\r\n if (label)\r\n this.label = label;\r\n\r\n if (sourceLabel)\r\n this.sourceLabel = sourceLabel;\r\n\r\n if (targetLabel)\r\n this.targetLabel = targetLabel;\r\n }\r\n}","import generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport { TextAlign } from \"../enums\";\r\nimport IFlexboxType from \"../IFlexboxType\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\n\r\nexport default class Text implements IText {\r\n private readonly _id: string;\r\n content: string;\r\n size: ISize;\r\n position?: IPosition;\r\n align?: TextAlign;\r\n fontSize?: number;\r\n border?: string;\r\n style?: IFlexboxType;\r\n\r\n constructor(content: string, width: number, height: number, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType) {\r\n this._id = generateUniqueId()\r\n this.content = content;\r\n this.align = align;\r\n this.fontSize = fontSize;\r\n this.border = border;\r\n this.size = { width, height };\r\n this.style = style;\r\n\r\n if (x && y) {\r\n this.position = { x, y };\r\n }\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n}","import IElement from \"../IElement\";\r\nimport IElementLink from \"../IElementLink\";\r\nimport IText, { IPaperText } from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport IPort from \"../IPort\";\r\nimport ISize from \"../size\";\r\nimport IEditorContext from \"../IEditorContext\";\r\n\r\nexport class EditorContext implements IEditorContext {\r\n private _elements: IElement[];\r\n private _links: IElementLink[];\r\n private _texts: IPaperText[];\r\n onPaperClicked?: () => void;\r\n onPortMoved?: (position: IPosition, port: IPort, element: IElement) => void;\r\n onPortSelected?: (port: IPort, element: IElement) => void;\r\n onElementContextMenu?: (element: IElement, mouseEvent: React.MouseEvent<SVGElement>) => void;\r\n onElementMoved?: (position: IPosition, element: IElement, index: number) => void;\r\n onElementResized?: (size: ISize, element: IElement, index: number) => void;\r\n onElementSelected?: (element: IElement) => void;\r\n \r\n onCreatingPortByLinking?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;\r\n onCreatingLink?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;\r\n onLinkSelected?: (link: IElementLink) => void;\r\n onTextSelected?: (text: IText) => void;\r\n\r\n constructor(elements: IElement[], links: IElementLink[], texts: IPaperText[]) {\r\n this._elements = elements;\r\n this._links = links;\r\n this._texts = texts;\r\n }\r\n\r\n get elements() {\r\n return this._elements;\r\n }\r\n\r\n get links() {\r\n return this._links;\r\n }\r\n\r\n get texts() {\r\n return this._texts;\r\n }\r\n\r\n getElement(elementId: string): IElement | undefined {\r\n return this._elements.find(e => e.id === elementId);\r\n }\r\n \r\n addElement(element: IElement) {\r\n this._elements.push(element);\r\n }\r\n\r\n removeElement(elementId: string) {\r\n this._elements = this._elements.filter(e => e.id !== elementId);\r\n }\r\n\r\n getLink(linkId: string): IElementLink | undefined {\r\n return this._links.find(l => l.id === linkId);\r\n }\r\n\r\n addLink(link: IElementLink) {\r\n this._links.push(link);\r\n }\r\n\r\n removeLink(linkId: string) {\r\n this._links = this._links.filter(l => l.id !== linkId);\r\n }\r\n\r\n getText(textId: string): IPaperText | undefined {\r\n return this._texts.find(t => t.id === textId);\r\n }\r\n\r\n addText(text: IPaperText) {\r\n this._texts.push(text);\r\n }\r\n\r\n removeText(textId: string) {\r\n this._texts = this._texts.filter(t => t.id !== textId);\r\n }\r\n\r\n triggerRenderElement(elementId: string) {\r\n //TODO: to be implemented\r\n }\r\n\r\n triggerRenderPort(portId: string, elementId: string) {\r\n //TODO: to be implemented\r\n }\r\n}","import React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\nimport ISize from '../../models/size';\r\n\r\ninterface CircleProps extends Omit<IShape, \"width\" | \"height\"> {\r\n r?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst Circle: React.ForwardRefExoticComponent<CircleProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n const s: ISize = { height: 100, width: 100 };\r\n\r\n if (props.r) {\r\n s.height = props.r * 2;\r\n s.width = props.r * 2;\r\n }\r\n else {\r\n if (!props.width || !props.height) {\r\n throw new Error('Circle must have a radius or size');\r\n }\r\n s.height = props.height;\r\n s.width = props.width;\r\n }\r\n\r\n return (\r\n <ShapeWrapper viewBox='0 0 100 100' {...props} width={s.width} height={s.height} ref={ref} >\r\n <circle className={`${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" cx={50} cy={50} r={50} fill={props.fill || 'transparent'} stroke={props.stroke || \"none\"} strokeWidth={props.strokeWidth} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default Circle;","import React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\nimport ISize from '../../models/size';\r\n\r\ninterface CrescentProps extends Omit<IShape, \"width\" | \"height\"> {\r\n r?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst Crescent: React.ForwardRefExoticComponent<CrescentProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n const s: ISize = { height: 100, width: 100 };\r\n\r\n if (props.r) {\r\n s.height = props.r * 2;\r\n s.width = props.r * 2;\r\n }\r\n else {\r\n if (!props.width || !props.height) {\r\n throw new Error('Half circle must have a radius or size');\r\n }\r\n s.height = props.height;\r\n s.width = props.width;\r\n }\r\n\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper ref={ref} viewBox='0 0 100 100' {...props} width={s.width} height={s.height} >\r\n <rect width={100} height={100} stroke=\"transparent\" fill='transparent'></rect>\r\n <path className={`${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" d={`M 0 75 A 50 50 0 1 1 100 75 Z`} fill={props.fill || 'none'} stroke={props.stroke || 'none'} strokeWidth={sw}></path>\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\n\r\n\r\nexport default Crescent;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface RectangleProps extends IShape {\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n}\r\nconst Rectangle: React.ForwardRefExoticComponent<RectangleProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n\r\n let scaledWidth = props.width;\r\n let scaledHeight = props.height;\r\n if (props.width > 100 || props.height > 100) {\r\n const widthRatio = props.width / 100;\r\n const heightRatio = props.height / 100;\r\n\r\n if (widthRatio > heightRatio) {\r\n scaledWidth = 100;\r\n scaledHeight = scaledHeight / widthRatio;\r\n } else {\r\n scaledHeight = 100;\r\n scaledWidth = scaledWidth / heightRatio;\r\n }\r\n }\r\n\r\n const x = 0; //(100 - scaledWidth) / 2;\r\n const y = 0; //(100 - scaledHeight) / 2;\r\n\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper {...props} ref={ref} height={props.height} width={props.width} >\r\n <rect className={`rect-border ${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" width={scaledWidth} height={scaledHeight} fill={props.fill || \"transparent\"} stroke={props.stroke || \"none\"} strokeWidth={sw} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default Rectangle;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface RectangularFrameProps extends IShape {\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n frameColor?: string;\r\n frameWidth?: number;\r\n}\r\nconst RectangularFrame: React.ForwardRefExoticComponent<RectangularFrameProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n let scaledWidth = props.width;\r\n let scaledHeight = props.height;\r\n\r\n if (props.width > 100 || props.height > 100) {\r\n const widthRatio = props.width / 100;\r\n const heightRatio = props.height / 100;\r\n\r\n if (widthRatio > heightRatio) {\r\n scaledWidth = 100;\r\n scaledHeight = scaledHeight / widthRatio;\r\n } else {\r\n scaledHeight = 100;\r\n scaledWidth = scaledWidth / heightRatio;\r\n }\r\n }\r\n\r\n const vbX = 0 //(100 - scaledWidth) / 2;\r\n const vbY = 0 //(100 - scaledHeight) / 2;\r\n\r\n let fw = props.frameColor ? (props.frameWidth || 1) : 0;\r\n let scaledFw = scaledWidth / props.width * fw;\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper {...props} ref={ref} height={props.height} width={props.width} >\r\n <rect vectorEffect=\"non-scaling-stroke\" className={`rectangular-frame-outer-border ${props.portMoveableAreaCssClass}`} x={vbX} y={vbY} width={scaledWidth} height={scaledHeight} fill={\"none\"} stroke={props.stroke || \"none\"} strokeWidth={sw} />\r\n <rect vectorEffect=\"non-scaling-stroke\" className='rectangular-frame-hallway' x={vbX + scaledFw / 2} y={vbY + scaledFw / 2} width={scaledWidth - scaledFw} height={scaledHeight - scaledFw} stroke={props.frameColor || \"none\"} strokeWidth={fw} fill={props.fill || \"transparent\"} />\r\n <rect vectorEffect=\"non-scaling-stroke\" className='rectangular-frame-inner-border' x={vbX + scaledFw} y={vbY + scaledFw} width={scaledWidth - scaledFw * 2} height={scaledHeight - scaledFw * 2} stroke={props.stroke || \"none\"} strokeWidth={sw} fill={props.fill || \"transparent\"} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default RectangularFrame;","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","export const MIN_ELEMENT_SIZE = 20;\r\n\r\n//naming convention: [element type]_[element action]\r\n//element types: paper, port, element\r\n//element actions:\r\n//for actions that we can't have different handlers before or after the action, use the infinitive tense verb. For example, click, mouse_down, mouse_up\r\n//for actions that we can have different handlers before or after the action, use the v-ing or perfect tense verb. For example, moving, moved, resizing, resized, deleting, deleted\r\nexport const EVENT_NAME = {\r\n //PAPER\r\n PAPER_CLICK: 'paper_click',\r\n\r\n //ELEMENT\r\n ELEMENT_MOVED: 'element_moved',\r\n ELEMENT_CLICK: 'element_click',\r\n ELEMENT_DRAGGED: 'element_dragged',\r\n ELEMENT_RESIZED: 'element_resized',\r\n ELEMENT_DELETED: 'element_deleted',\r\n ELEMENT_SELECTED: 'element_selected',\r\n\r\n //PORT\r\n PORT_MOUSE_DOWN: 'port_mouse_down',\r\n PORT_MOUSE_UP: 'port_mouse_up',\r\n PORT_MOVED: 'port_moved',\r\n PORT_SELECTED: 'port_selected',\r\n\r\n //COMMAND\r\n COMMAND_DELETE_SELECTED_PORT: 'command_delete_selected_port',\r\n COMMAND_DELETE_SELECTED_LINK: 'command_delete_selected_link',\r\n COMMAND_DELETE_SELECTED_ELEMENT: 'command_delete_selected_element',\r\n COMMAND_DELETE_SELECTED_TEXT: 'command_delete_selected_text',\r\n\r\n //ELEMENT LINK\r\n ELEMENT_LINK_STARTED: 'element_link_started',\r\n ELEMENT_LINK_ENDED: 'element_link_ended',\r\n\r\n //TEXT\r\n TEXT_SELECTED: 'text_selected',\r\n}\r\n\r\n//ELEMENT\r\n//export const ELEMENT_MOVING_OFFSET_THRESHOLD = 10;\r\n\r\n//ELEMENT LINK\r\nexport const MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK = 30;\r\nexport const MAX_LINK_KNOT_COUNT = 10;\r\nexport const LINK_MARKER_DISTANCE_FROM_PORT = 20;\r\nexport const LINK_MARKER_SIZE = 20;\r\nexport const LINK_CLICKABLE_STROKE_WIDTH = 15;\r\nexport const CSS_CLASS_LINK_SELECTED = \"link-selected\";\r\nexport const LINK_DEFAULT_COLOR = 'black'\r\n\r\n//TEXT\r\nexport const LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT = { x: 15, y: 15 }\r\nexport const LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT = { x: 15, y: 15 }\r\nexport const LINK_LABEL_POSITION_FROM_LINK_MID_POINT = { x: 0, y: 40 }\r\nexport const PORT_LABEL_POSITION = { x: 15, y: 0 }\r\nexport const TEXT_FONT_SIZE = 12;\r\nexport const TEXT_MOVING_OFFSET_THRESHOLD = 10;\r\n\r\n//PORT\r\nexport const PORT_PLACEHOLDER_DEFAULT_SIZE = 8;\r\nexport const PORT_PLACEHOLDER_DEFAULT_STROKE = 'green';\r\nexport const PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH = 20;\r\nexport const PORT_MOVING_OFFSET_THRESHOLD = 15;\r\nexport const PORT_DEFAULT_SIZE = 20;","import React, { useCallback, useEffect } from 'react';\r\nimport ISelectionFrameProps from '../../models/IElementSelectorProps';\r\nimport { MIN_ELEMENT_SIZE } from '../../utils/constants';\r\nimport { PositioningAnchor } from '../../models/enums/PositioningAnchor';\r\n\r\nconst SelectionFrame = (props: ISelectionFrameProps) => {\r\n\r\n const bbox = props.targetSVGElement?.getBBox();\r\n\r\n const [width, setWidth] = React.useState(props.width || bbox?.width || MIN_ELEMENT_SIZE);\r\n const [height, setHeight] = React.useState(props.height || bbox?.height || MIN_ELEMENT_SIZE);\r\n\r\n const x = 0;\r\n const y = 0;\r\n const framePadding = props.framePadding || 0;\r\n const r = 5;\r\n\r\n const [draggingRect, setDraggingRect] = React.useState(false);\r\n const [draggingCircle, setDraggingCircle] = React.useState(false);\r\n\r\n const [startX, setStartX] = React.useState(0);\r\n const [startY, setStartY] = React.useState(0);\r\n const [lastMoveTime, setLastMoveTime] = React.useState(0);\r\n\r\n const addRectHandleMouseDown = (event: React.MouseEvent<SVGRectElement>) => {\r\n event.stopPropagation()\r\n\r\n if (!draggingCircle) {\r\n //mouse down on rect\r\n setDraggingRect(true);\r\n setStartX(event.clientX);\r\n setStartY(event.clientY);\r\n }\r\n };\r\n\r\n const rectHandleMouseMove = useCallback((event: Event) => {\r\n const mouseEvent = event as MouseEvent;\r\n if (draggingRect) {\r\n let offsetX = mouseEvent.clientX - startX;\r\n let offsetY = mouseEvent.clientY - startY;\r\n\r\n if (props.movingOffsetThreshold && Math.abs(offsetX) > props.movingOffsetThreshold) {\r\n offsetX = offsetX / Math.abs(offsetX) * props.movingOffsetThreshold;\r\n }\r\n\r\n if (props.movingOffsetThreshold && Math.abs(offsetY) > props.movingOffsetThreshold) {\r\n offsetY = offsetY / Math.abs(offsetY) * props.movingOffsetThreshold;\r\n }\r\n\r\n if (Date.now() - lastMoveTime < (props.movingRate || 0)) {\r\n return;\r\n }\r\n\r\n console.info('Selection frame moved by: ', offsetX, offsetY);\r\n\r\n if (props.onMove) {\r\n props.onMove(offsetX, offsetY);\r\n setLastMoveTime(Date.now());\r\n setStartX(mouseEvent.clientX);\r\n setStartY(mouseEvent.clientY);\r\n }\r\n }\r\n }, [draggingRect, props.onMove, props.movingRate, startX, startY, lastMoveTime]);\r\n\r\n useEffect(() => {\r\n\r\n const addRectHandleMouseUp = () => {\r\n //mouse up\r\n setDraggingRect(false);\r\n };\r\n\r\n //select container if it is a string\r\n //const container = typeof props.container === 'string' ? document.querySelector(props.container) : props.container;\r\n const container = props.container;\r\n\r\n //add event listeners\r\n container?.addEventListener('mousemove', rectHandleMouseMove);\r\n container?.addEventListener('mouseup', addRectHandleMouseUp);\r\n\r\n return () => {\r\n container?.removeEventListener('mousemove', rectHandleMouseMove);\r\n container?.removeEventListener('mouseup', addRectHandleMouseUp);\r\n };\r\n }, [props.container, rectHandleMouseMove]);\r\n\r\n const circleHandleMouseDown = (event: React.MouseEvent<SVGCircleElement, MouseEvent>) => {\r\n event.stopPropagation();\r\n\r\n if (!draggingRect) {\r\n // mouse down on resizing circle\r\n setStartX(event.clientX);\r\n setStartY(event.clientY);\r\n setDraggingCircle(true);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const circleHandleMouseMove = (event: Event) => {\r\n const mouseEvent = event as MouseEvent;\r\n if (draggingCircle) {\r\n let offsetX = mouseEvent.clientX - startX;\r\n let offsetY = mouseEvent.clientY - startY;\r\n\r\n if (Date.now() - lastMoveTime < (props.movingRate || 0)) {\r\n return;\r\n }\r\n\r\n setStartX(mouseEvent.clientX);\r\n setStartY(mouseEvent.clientY);\r\n setLastMoveTime(Date.now());\r\n\r\n let newWidth = width;\r\n let newHeight = height;\r\n\r\n if (props.resizability.keepRatio) {\r\n let resizingRatio = Math.abs(offsetX) > Math.abs(offsetY) ? (Math.abs(offsetX) / width) : (Math.abs(offsetY) / height);\r\n const increasing = Math.abs(offsetX) > Math.abs(offsetY) ? offsetX > 0 : offsetY > 0;\r\n offsetX = increasing ? resizingRatio * width : -resizingRatio * width;\r\n offsetY = increasing ? resizingRatio * height : -resizingRatio * height;\r\n }\r\n\r\n newWidth += offsetX;\r\n newHeight += offsetY;\r\n\r\n if (newWidth < MIN_ELEMENT_SIZE) {\r\n newWidth = MIN_ELEMENT_SIZE;\r\n }\r\n\r\n if (newHeight < MIN_ELEMENT_SIZE) {\r\n newHeight = MIN_ELEMENT_SIZE;\r\n }\r\n\r\n setWidth(newWidth);\r\n setHeight(newHeight);\r\n\r\n if (props.onResize) {\r\n props.onResize(newWidth, newHeight);\r\n }\r\n //}\r\n }\r\n };\r\n\r\n const circleHandleMouseUp = () => {\r\n setDraggingCircle(false);\r\n };\r\n\r\n //select container if it is a string\r\n //const container = typeof props.container === 'string' ? document.querySelector(props.container) : props.container;\r\n const container = props.container\r\n\r\n container.addEventListener('mousemove', circleHandleMouseMove);\r\n container.addEventListener('mouseup', circleHandleMouseUp);\r\n\r\n return () => {\r\n container.removeEventListener('mousemove', circleHandleMouseMove);\r\n container.removeEventListener('mouseup', circleHandleMouseUp);\r\n };\r\n }, [draggingCircle, startX, startY, x, y]);\r\n\r\n const rectangleSize = Math.max(width, height);\r\n let leftX = framePadding;\r\n let topY = framePadding;\r\n\r\n if (props.anchor === PositioningAnchor.Center) {\r\n leftX -= rectangleSize / 2;\r\n topY -= rectangleSize / 2;\r\n }\r\n\r\n return (\r\n <>\r\n {props.dragDropHandlerElement && <props.dragDropHandlerElement dragging={draggingRect} onMouseDown={addRectHandleMouseDown as any} />}\r\n {<rect\r\n vectorEffect=\"non-scaling-stroke\"\r\n x={leftX}\r\n y={topY}\r\n width={width}\r\n height={height}\r\n fill='none'\r\n stroke='blue'\r\n strokeWidth={props.strokeWidth || 5}\r\n cursor={draggingRect ? 'grabbing' : 'grab'}\r\n onMouseDown={addRectHandleMouseDown}\r\n ></rect>}\r\n {props.resizability.enabled ?\r\n (\r\n <circle cursor={'se-resize'}\r\n cx={leftX + width} cy={topY + height} r={r} fill='blue' stroke='blue' onMouseDown={circleHandleMouseDown}></circle>\r\n ) : null}\r\n </>\r\n );\r\n};\r\n\r\nexport default SelectionFrame;","import React, { useEffect } from 'react';\r\nimport ISelectionFrameProps from '../models/IElementSelectorProps';\r\nimport { createRoot } from 'react-dom/client';\r\nimport SelectionFrame from '../components/viewControls/selectionFrame';\r\n\r\ninterface useSelectionFrameProps extends Omit<ISelectionFrameProps, \"container\"> {\r\n container?: HTMLElement | null;\r\n}\r\n\r\nconst useSelectionFrame = (props: useSelectionFrameProps) => {\r\n useEffect(() => {\r\n if (props.targetSVGElement && props.container) {\r\n //render SelectionFrame component to the parent element of the targetSVGElement \r\n\r\n if (props.container) {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.style.overflow = 'visible';\r\n svg.style.outline = 'none';\r\n props.targetSVGElement.appendChild(svg);\r\n const root = createRoot(svg);\r\n root.render(<SelectionFrame {...props} container={props.container as Element} />);\r\n return () => {\r\n root.unmount();\r\n if (props.targetSVGElement) {\r\n props.targetSVGElement.removeChild(svg);\r\n }\r\n }\r\n }\r\n\r\n\r\n }\r\n }, [props.targetSVGElement, props.container]);\r\n};\r\n\r\nexport default useSelectionFrame;","import EventEmitter from \"eventemitter3\";\r\nimport { createContext } from \"react\";\r\nimport { EVENT_NAME } from \"../utils/constants\";\r\nimport IPort from \"../models/IPort\";\r\nimport IElement from \"../models/IElement\";\r\nimport { onCommandDeleteSelectedHandler, OnElementLinkEnded, OnElementLinkStarted, onElementMovedHandler, onElementResizedHandler, OnElementSelected, onPortMouseDownHandler, onPortMouseUpHandler, onPortMovedHandler, OnPortSelected, OnTextSelected } from \"../models/callbackTypes\";\r\nimport IPosition from \"../models/position\";\r\nimport ISize from \"../models/size\";\r\nimport IElementLink from \"../models/IElementLink\";\r\nimport { IText } from \"../models\";\r\n\r\nconst eventEmitter = new EventEmitter();\r\n\r\nconst emitPaperClicked = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n eventEmitter.emit(EVENT_NAME.PAPER_CLICK, ev);\r\n}\r\n\r\nconst onPaperClicked = (callback: (ev: React.MouseEvent<SVGSVGElement>) => void) => {\r\n eventEmitter.on(EVENT_NAME.PAPER_CLICK, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PAPER_CLICK, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMouseUp = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOUSE_UP, ev, port, elementId);\r\n}\r\n\r\nconst onPortMouseUp = (callback: onPortMouseUpHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOUSE_UP, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOUSE_UP, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMouseDown = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOUSE_DOWN, ev, port, elementId);\r\n}\r\n\r\nconst onPortMouseDown = (callback: onPortMouseDownHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOUSE_DOWN, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOUSE_DOWN, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMoved = (port: IPort, elementId: string, oldPosition: IPosition, newPosition: IPosition) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOVED, port, elementId, oldPosition, newPosition);\r\n}\r\n\r\nconst onPortMoved = (callback: onPortMovedHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOVED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOVED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementMoved = (element: IElement, oldPosition: IPosition, newPosition: IPosition) => {\r\n eventEmitter.emit(`${EVENT_NAME.ELEMENT_MOVED}_${element.id}`);\r\n}\r\n\r\nconst onElementMoved = (elementId: string, callback: onElementMovedHandler) => {\r\n eventEmitter.on(`${EVENT_NAME.ELEMENT_MOVED}_${elementId}`, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(`${EVENT_NAME.ELEMENT_MOVED}_${elementId}`, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementResized = (element: IElement, oldSize: ISize, newSize: ISize) => {\r\n eventEmitter.emit(`${EVENT_NAME.ELEMENT_RESIZED}_${element.id}`, oldSize, newSize);\r\n}\r\n\r\nconst onElementResized = (elementId: string, callback: onElementResizedHandler) => {\r\n eventEmitter.on(`${EVENT_NAME.ELEMENT_RESIZED}_${elementId}`, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(`${EVENT_NAME.ELEMENT_RESIZED}_${elementId}`, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedPort = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT);\r\n}\r\nconst onCommandDeleteSelectedPort = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedElement = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT);\r\n}\r\nconst onCommandDeleteSelectedElement = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedLink = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK);\r\n}\r\nconst onCommandDeleteSelectedLink = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedText = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT);\r\n}\r\nconst onCommandDeleteSelectedText = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementLinkStarted = (elementLink: IElementLink) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_LINK_STARTED, elementLink);\r\n}\r\n\r\nconst onElementLinkStarted = (callback: OnElementLinkStarted) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_LINK_STARTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_LINK_STARTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementLinkEnded = (elementLink?: IElementLink) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_LINK_ENDED, elementLink);\r\n}\r\n\r\nconst onElementLinkEnded = (callback: OnElementLinkEnded) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_LINK_ENDED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_LINK_ENDED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\n\r\nconst emitElementSelected = (element: IElement) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_SELECTED, element);\r\n}\r\n\r\nconst onElementSelected = (callback: OnElementSelected) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortSelected = (port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_SELECTED, port, elementId);\r\n}\r\n\r\nconst onPortSelected = (callback: OnPortSelected) => {\r\n eventEmitter.on(EVENT_NAME.PORT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitTextSelected = (text: IText) => {\r\n eventEmitter.emit(EVENT_NAME.TEXT_SELECTED, text);\r\n}\r\n\r\nconst onTextSelected = (callback: OnTextSelected) => {\r\n eventEmitter.on(EVENT_NAME.TEXT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.TEXT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\n\r\ninterface IEventListenerReturn {\r\n off: () => void;\r\n}\r\n\r\ninterface IPaperEventContext {\r\n emitter: EventEmitter<string | symbol, any>;\r\n emitPaperClicked: (ev: React.MouseEvent<SVGSVGElement>) => void;\r\n onPaperClicked: (callback: (ev: React.MouseEvent<SVGSVGElement>) => void) => IEventListenerReturn;\r\n\r\n emitPortMouseUp: onPortMouseUpHandler;\r\n onPortMouseUp: (callback: onPortMouseUpHandler) => IEventListenerReturn;\r\n\r\n emitPortMouseDown: onPortMouseDownHandler\r\n onPortMouseDown: (callback: onPortMouseDownHandler) => IEventListenerReturn;\r\n\r\n emitPortMoved: onPortMovedHandler;\r\n onPortMoved: (callback: onPortMovedHandler) => IEventListenerReturn;\r\n\r\n emitPortSelected: OnPortSelected;\r\n onPortSelected: (callback: OnPortSelected) => IEventListenerReturn;\r\n\r\n emitElementMoved: onElementMovedHandler;\r\n onElementMoved: (elementId: string, callback: onElementMovedHandler) => IEventListenerReturn;\r\n\r\n emitElementResized: onElementResizedHandler;\r\n onElementResized: (elementId: string, callback: onElementResizedHandler) => IEventListenerReturn;\r\n\r\n emitElementSelected: OnElementSelected;\r\n onElementSelected: (callback: OnElementSelected) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedPort: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedPort: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedElement: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedElement: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedLink: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedLink: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedText: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedText: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitElementLinkStarted: OnElementLinkStarted;\r\n onElementLinkStarted: (callback: OnElementLinkStarted) => IEventListenerReturn;\r\n\r\n emitElementLinkEnded: OnElementLinkEnded;\r\n onElementLinkEnded: (callback: OnElementLinkEnded) => IEventListenerReturn;\r\n\r\n emitTextSelected: OnTextSelected;\r\n onTextSelected: (callback: OnTextSelected) => IEventListenerReturn;\r\n}\r\n\r\nexport const paperEventEmitterContext: React.Context<IPaperEventContext> = createContext({\r\n emitter: eventEmitter,\r\n emitPaperClicked,\r\n onPaperClicked,\r\n\r\n emitPortMouseUp,\r\n onPortMouseUp,\r\n\r\n emitPortMouseDown,\r\n onPortMouseDown,\r\n\r\n emitPortMoved,\r\n onPortMoved,\r\n\r\n emitPortSelected,\r\n onPortSelected,\r\n\r\n emitElementMoved,\r\n onElementMoved,\r\n\r\n emitElementResized,\r\n onElementResized,\r\n\r\n emitElementSelected,\r\n onElementSelected,\r\n\r\n emitCommandDeleteSelectedPort,\r\n onCommandDeleteSelectedPort,\r\n\r\n emitCommandDeleteSelectedElement,\r\n onCommandDeleteSelectedElement,\r\n\r\n emitCommandDeleteSelectedLink,\r\n onCommandDeleteSelectedLink,\r\n\r\n emitCommandDeleteSelectedText,\r\n onCommandDeleteSelectedText,\r\n\r\n emitElementLinkStarted,\r\n onElementLinkStarted,\r\n\r\n emitElementLinkEnded,\r\n onElementLinkEnded,\r\n\r\n emitTextSelected,\r\n onTextSelected,\r\n})\r\n\r\n\r\n","import React, { forwardRef, memo, useContext, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { TextAlign } from \"../../models/enums/TextAlign\";\r\nimport ITextProps from \"../../models/ITextProps\";\r\nimport IText from \"../../models/IText\";\r\nimport useSelectionFrame from \"../../hooks/useSelectionFrame\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport { TEXT_FONT_SIZE, TEXT_MOVING_OFFSET_THRESHOLD } from \"../../utils/constants\";\r\n\r\nconst Text: React.ForwardRefExoticComponent<ITextProps & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, ITextProps>((\r\n {\r\n id,\r\n content,\r\n x,\r\n y,\r\n width,\r\n height,\r\n align = TextAlign.left,\r\n fontSize: fontSizeProp,\r\n border,\r\n container,\r\n onSelected,\r\n onMoved,\r\n onResized,\r\n onContentChanged,\r\n },\r\n ref\r\n ) => {\r\n const [isSelected, setIsSelected] = useState<boolean>(false)\r\n const [isEditing, setIsEditing] = useState<boolean>(false)\r\n\r\n const svgRef = useRef<SVGSVGElement>()\r\n\r\n const { onPaperClicked, emitTextSelected, onPortSelected, onElementSelected, onTextSelected } = useContext(paperEventEmitterContext)\r\n\r\n useEffect(() => {\r\n const paperClickListener = onPaperClicked((ev) => {\r\n const textareaELe = svgRef.current?.querySelector('textarea')\r\n\r\n if (ev.target !== textareaELe) {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n }\r\n })\r\n\r\n const portSelectedListener = onPortSelected((port) => {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n })\r\n\r\n const elementSelectedListener = onElementSelected((element) => {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n })\r\n\r\n const textSelectedListener = onTextSelected((text) => {\r\n if (text.id !== id) {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n }\r\n })\r\n\r\n return () => {\r\n paperClickListener.off();\r\n portSelectedListener.off();\r\n elementSelectedListener.off();\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Handle click on svg element\r\n const handleClick = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n ev.stopPropagation()\r\n\r\n const position = (x === undefined || y === undefined) ? undefined : {\r\n x,\r\n y,\r\n }\r\n\r\n const text: IText = {\r\n id,\r\n content: content,\r\n position: position,\r\n size: {\r\n width,\r\n height,\r\n }\r\n }\r\n\r\n setIsSelected(true)\r\n onSelected && onSelected(text);\r\n emitTextSelected(text)\r\n }\r\n\r\n const handleChangeText = (ev: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n onContentChanged?.(ev, ev.target.value)\r\n }\r\n\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: (isSelected && svgRef.current) ? svgRef.current : undefined,\r\n resizability: {\r\n enabled: onResized ? true : false,\r\n keepRatio: false,\r\n },\r\n onMove: onMoved,\r\n onResize: onResized,\r\n strokeWidth: 3,\r\n movingOffsetThreshold: TEXT_MOVING_OFFSET_THRESHOLD,\r\n })\r\n\r\n let textAlign = useMemo(() => {\r\n switch (align) {\r\n case TextAlign.left:\r\n return 'left'\r\n\r\n case TextAlign.right:\r\n return 'right'\r\n case TextAlign.center:\r\n return 'center'\r\n\r\n default:\r\n return 'left'\r\n }\r\n }, [align]);\r\n\r\n const fontSize = fontSizeProp || TEXT_FONT_SIZE;\r\n const borderStyle = border || 'none'\r\n\r\n return (\r\n <svg style={{ overflow: \"visible\" }} x={x} y={y}\r\n ref={(node) => {\r\n svgRef.current = node!;\r\n if (typeof ref === 'function') {\r\n ref(node);\r\n } else if (ref) {\r\n ref.current = node;\r\n }\r\n }}\r\n onClick={handleClick}\r\n >\r\n <foreignObject width={width} height={height}\r\n style={{\r\n overflow: 'visible',\r\n userSelect: 'none',\r\n WebkitUserSelect: 'none',\r\n msUserSelect: 'none'\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n borderStyle: borderStyle,\r\n // whiteSpace: 'pre-wrap',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <textarea\r\n style={{\r\n fontFamily: 'initial',\r\n display: 'inline-block',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n border: 'none',\r\n background: 'transparent',\r\n outline: 'none',\r\n resize: 'none',\r\n textAlign: textAlign as any,\r\n fontSize: fontSize,\r\n }}\r\n readOnly={!isEditing}\r\n onDoubleClick={() => {\r\n if (onContentChanged) {\r\n setIsEditing(true)\r\n }\r\n }}\r\n\r\n value={content}\r\n onChange={handleChangeText}\r\n >\r\n </textarea>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n )\r\n })\r\n\r\nexport default memo(Text);","import React, { forwardRef, memo, useMemo, useRef } from \"react\";\r\nimport { IPortProps } from \"../../models/IPortProps\";\r\nimport Circle from \"../shapes/circle\";\r\nimport { PositioningAnchor } from \"../../models/enums/PositioningAnchor\";\r\nimport Text from \"../texts/text\";\r\nimport { PORT_LABEL_POSITION } from \"../../utils/constants\";\r\nimport IText from \"../../models/IText\";\r\n\r\nconst Port1: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>> = forwardRef((\r\n props,\r\n ref\r\n) => {\r\n const {\r\n id,\r\n x,\r\n y,\r\n width,\r\n height,\r\n container,\r\n label,\r\n onPortLabelMoved,\r\n onPortLabelResized,\r\n onPortLabelContentChanged,\r\n onSelected,\r\n onMouseDown,\r\n onMouseUp,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onMouseMove,\r\n calculateRotationAngle,\r\n renderShape\r\n } = props\r\n const textRef = useRef<SVGSVGElement | null>(null)\r\n\r\n const rotationAngle = useMemo(() => {\r\n if (!calculateRotationAngle) return 0;\r\n\r\n return calculateRotationAngle(x, y)\r\n }, [calculateRotationAngle, x, y])\r\n\r\n const renderLabel = (label: IText) => {\r\n const { content, size } = label;\r\n const position = label.position || PORT_LABEL_POSITION\r\n\r\n return <Text\r\n id={label.id}\r\n ref={textRef}\r\n x={x + position.x}\r\n y={y + position.y}\r\n width={size.width}\r\n height={size.height}\r\n content={content}\r\n fontSize={label.fontSize}\r\n border={label.border}\r\n container={container}\r\n\r\n onMoved={onPortLabelMoved}\r\n onResized={onPortLabelResized}\r\n onContentChanged={onPortLabelContentChanged}\r\n />\r\n }\r\n\r\n const renderedShape = useMemo(() => {\r\n if (renderShape) {\r\n const RenderShape = renderShape;\r\n return (\r\n <RenderShape ref={ref} {...props} rotation={rotationAngle}></RenderShape>\r\n )\r\n }\r\n else {\r\n return <Circle\r\n onMouseDown={(e: any) => onMouseDown?.(id, e)}\r\n onMouseUp={(e: any) => onMouseUp?.(id, e)}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n onMouseMove={onMouseMove}\r\n onClick={(e: any) => onSelected?.(id, e)}\r\n ref={ref}\r\n x={x}\r\n y={y}\r\n positioningAnchor={PositioningAnchor.Center}\r\n height={height}\r\n width={width}\r\n stroke=\"black\"\r\n fill=\"black\"\r\n >\r\n </Circle>\r\n }\r\n }, [props])\r\n\r\n\r\n return (\r\n <>\r\n {renderedShape}\r\n {label && renderLabel(label)}\r\n </>\r\n );\r\n});\r\n\r\nexport const Port = memo(Port1)","import IPosition from \"../models/position\";\r\n\r\ninterface IPathCommand {\r\n type: string;\r\n values: number[];\r\n}\r\n\r\n// Render the svg <path> element\r\nexport function getCurvePathData(points: IPosition[], smoothing: number = 0.2, closed?: boolean): IPathCommand[] {\r\n\r\n // append first 2 points for closed paths\r\n if (closed) {\r\n points = points.concat(points.slice(0, 2));\r\n }\r\n\r\n // Properties of a line\r\n const line = (pointA: IPosition, pointB: IPosition) => {\r\n const lengthX = pointB.x - pointA.x;\r\n const lengthY = pointB.y - pointA.y;\r\n return {\r\n length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\r\n angle: Math.atan2(lengthY, lengthX)\r\n };\r\n };\r\n\r\n // Position of a control point\r\n const controlPoint = (current: IPosition, previous: IPosition, next: IPosition, reverse?: boolean) => {\r\n const p = previous || current;\r\n const n = next || current;\r\n const o = line(p, n);\r\n\r\n const angle = o.angle + (reverse ? Math.PI : 0);\r\n const length = o.length * smoothing;\r\n\r\n const x = current.x + Math.cos(angle) * length;\r\n const y = current.y + Math.sin(angle) * length;\r\n return { x, y };\r\n };\r\n\r\n let pathData = [];\r\n pathData.push({ type: \"M\", values: [points[0].x, points[0].y] });\r\n\r\n for (let i = 1; i < points.length; i++) {\r\n let point = points[i];\r\n const cp1 = controlPoint(points[i - 1], points[i - 2], point);\r\n const cp2 = controlPoint(point, points[i - 1], points[i + 1], true);\r\n\r\n const command = {\r\n type: \"C\",\r\n values: [cp1.x, cp1.y, cp2.x, cp2.y, point.x, point.y]\r\n };\r\n\r\n pathData.push(command);\r\n }\r\n\r\n // copy last commands 1st controlpoint to first curveto\r\n if (closed) {\r\n let comLast = pathData[pathData.length - 1];\r\n let valuesLastC = comLast.values;\r\n let valuesFirstC = pathData[1].values;\r\n\r\n pathData[1] = {\r\n type: \"C\",\r\n values: [valuesLastC[0], valuesLastC[1], valuesFirstC.slice(2)].flat()\r\n };\r\n // delete last curveto\r\n pathData = pathData.slice(0, pathData.length - 1);\r\n }\r\n\r\n return pathData;\r\n}\r\n\r\n// convert pathdata to d attribute string\r\nexport function pathDataToD(pathData: IPathCommand[], decimals: number = 3): string {\r\n let d = pathData\r\n .map((com) => {\r\n return `${com.type}${com.values.map(value => { return +value.toFixed(decimals) }).join(\" \")}`;\r\n })\r\n .join(\" \");\r\n return d;\r\n}\r\n\r\nexport function createSmoothPathString(points: IPosition[], smoothing?: number, close?: boolean): string {\r\n const pathData = getCurvePathData(points, smoothing, close)\r\n const pathString = pathDataToD(pathData)\r\n return pathString;\r\n}\r\n\r\n// a helper function to measure the distance between 2 points\r\nexport function dist(p1: IPosition, p2: IPosition) {\r\n let dx = p2.x - p1.x;\r\n let dy = p2.y - p1.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n}\r\n\r\n//find distance from starting point of path to a point\r\nfunction getLengthForPoint(p: IPosition, thePath: SVGPathElement, precision: number = 50) {\r\n const pathLength = thePath.getTotalLength();\r\n let theRecord = pathLength; //length of path\r\n let division = pathLength / precision;\r\n\r\n let theSegment: number;\r\n\r\n for (let i = 0; i < precision; i++) {\r\n // get a point on the path for thia distance\r\n let _p = thePath.getPointAtLength(i * division);\r\n // get the distance between the new point _p and the point p\r\n let theDistance = dist(_p, p);\r\n\r\n if (theDistance < theRecord) {\r\n // if the distance is smaller than the record set the new record\r\n theRecord = theDistance;\r\n theSegment = i;\r\n }\r\n }\r\n\r\n return (theSegment! * division);\r\n}\r\n\r\n//Add points to the list of points in the correct position\r\nexport function addPointToList(point: IPosition, listPoints: IPosition[], path: SVGPathElement): IPosition[] {\r\n const getAddIndex = (startIndex: number, endIndex: number): number => {\r\n //Add in the middle if there are only 2 points\r\n if ((endIndex - startIndex) === 1) {\r\n return startIndex + 1;\r\n }\r\n\r\n const middleIndex = Math.ceil((startIndex + endIndex) / 2)\r\n\r\n const lengthOfMiddlePoint = getLengthForPoint(listPoints[middleIndex], path) //distance from start point to mid point\r\n const lengthOfAddedPoint = getLengthForPoint(point, path)//distance from adding point to mid point\r\n\r\n //compare if lengthOfMiddlePoint is less than lengthOfAddedPoint, \r\n //then new point can be added in the range of mid point to end point, \r\n //otherwise it can be added in the range of start point to middle point.\r\n if (lengthOfAddedPoint < lengthOfMiddlePoint) {\r\n return getAddIndex(startIndex, middleIndex)\r\n } else {\r\n return getAddIndex(middleIndex, endIndex)\r\n }\r\n }\r\n\r\n const addedIndex = getAddIndex(0, listPoints.length - 1)\r\n\r\n listPoints.splice(addedIndex, 0, point);\r\n\r\n return [...listPoints];\r\n}\r\n","import IPosition from \"../models/position\";\r\n\r\n// const topLeftOffsetOfSquareHoldingRect = (x: number, y: number, rectWidth: number, rectHeight: number, rotation?: number): IPosition => {\r\n\r\n// rotation = rotation || 0;\r\n// const rotationInRadians = rotation * Math.PI / 180;\r\n// //calculate the bouding edge of the square that holds the rectangle with the given width and height and rotation, knowing that the square is always parallel to the x and y axis\r\n// //calculate a1 equal sin of rotation * height\r\n// const a1 = Math.abs(Math.sin(rotationInRadians) * rectHeight);\r\n// //calculate a2 equal cos of rotation * width\r\n// const a2 = Math.abs(Math.cos(rotationInRadians) * rectWidth);\r\n// const a = a1 + a2;\r\n\r\n// console.info(`a1: ${a1}, a2: ${a2}, a: ${a}`);\r\n\r\n// //calculate b1 equal cos of rotation * height\r\n// const b1 = Math.abs(Math.cos(rotationInRadians) * rectHeight);\r\n// //calculate b2 equal sin of rotation * width\r\n// const b2 = Math.abs(Math.sin(rotationInRadians) * rectWidth);\r\n// const b = b1 + b2;\r\n\r\n// console.info(`b1: ${b1}, b2: ${b2}, b: ${b}`);\r\n\r\n// //const squareEdge = Math.max(rectWidth, rectHeight);\r\n\r\n// return {x, y};\r\n// return { x: x - (b - rectWidth) / 2, y: y - (a - rectHeight) / 2 }; \r\n// }\r\n\r\nconst diamondEdgeInsideSquare = (squareEdgeSize: number): number => {\r\n return (squareEdgeSize / 2) * Math.sqrt(2);\r\n}\r\n\r\nfunction degreeToRadian(degree: number) {\r\n return degree * (Math.PI / 180);\r\n}\r\n\r\n//rotate the four vertices of the rectangle\r\nfunction getRotatedRectangleCoordinates(actualPoints: IPosition[], centerX: number, centerY: number, angle: number): IPosition[] {\r\n const coordinatesAfterRotation = [];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const point = actualPoints[i];\r\n const tempX = point.x - centerX;\r\n const tempY = point.y - centerY;\r\n const rotatedX = tempX * Math.cos(degreeToRadian(angle)) - tempY * Math.sin(degreeToRadian(angle));\r\n const rotatedY = tempX * Math.sin(degreeToRadian(angle)) + tempY * Math.cos(degreeToRadian(angle));\r\n point.x = rotatedX + centerX;\r\n point.y = rotatedY + centerY;\r\n coordinatesAfterRotation.push({ x: point.x, y: point.y });\r\n }\r\n\r\n return coordinatesAfterRotation;\r\n}\r\n\r\n//Calculate the angle between 2 points relative to the OX axis\r\nfunction calculateAngleWithOx(pStart: IPosition, pEnd: IPosition) {\r\n const deltaX = pEnd.x - pStart.x;\r\n const deltaY = pEnd.y - pStart.y;\r\n\r\n // Calculate the angle in radians\r\n let angleInRadians = Math.atan2(deltaY, deltaX);\r\n\r\n // Convert to degrees (optional)\r\n let angleInDegrees = angleInRadians * (180 / Math.PI);\r\n\r\n // Ensure the angle is positive (optional, depending on use case)\r\n if (angleInDegrees < 0) {\r\n angleInDegrees += 360;\r\n }\r\n\r\n return angleInDegrees;\r\n}\r\n\r\nexport {\r\n //topLeftOffsetOfSquareHoldingRect,\r\n diamondEdgeInsideSquare,\r\n degreeToRadian,\r\n getRotatedRectangleCoordinates,\r\n calculateAngleWithOx,\r\n}","//Defined remove icon for element link, shown when element link is selected.\r\nimport React from 'react'\r\n\r\ninterface ICloseIconProps {\r\n onClick?: (ev: React.MouseEvent) => void;\r\n}\r\n\r\nexport default function CloseIcon({\r\n onClick\r\n}: ICloseIconProps) {\r\n\r\n return (\r\n <svg\r\n width={20}\r\n height={20}\r\n viewBox=\"0 0 24.00 24.00\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"#ff0000\"\r\n transform=\"rotate(0)\"\r\n onMouseDown={(ev) => { ev.stopPropagation() }}\r\n onClick={onClick}\r\n cursor={'pointer'}\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" strokeWidth=\"0\" transform=\"translate(3.84,3.84), scale(0.68)\">\r\n <rect x=\"0\" y=\"0\" width=\"24.00\" height=\"24.00\" rx=\"12\" fill=\"#ffffff\" strokeWidth=\"0\">\r\n </rect>\r\n </g>\r\n <g id=\"SVGRepo_tracerCarrier\" strokeLinecap=\"round\" strokeLinejoin=\"round\" stroke=\"#CCCCCC\" stroke-width=\"0.048\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <g>\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\"></path>\r\n <path d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z\"></path>\r\n </g>\r\n </g>\r\n </svg>\r\n )\r\n}","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\n/**\r\n * Global constant DP_TOL is used for comparison of floating point numbers.\r\n * It is set to 0.000001.\r\n * @type {number}\r\n */\r\nconst DP_TOL = 0.000001;\r\nconst DECIMALS = 3;\r\n\r\nmodule.exports = {\r\n DP_TOL: DP_TOL,\r\n /**\r\n * Returns *true* if value comparable to zero\r\n * @return {boolean}\r\n */\r\n EQ_0: function(x) {\r\n return ( (x) < DP_TOL && (x) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if two values are equal up to DP_TOL\r\n * @return {boolean}\r\n */\r\n EQ: function(x,y) {\r\n return ( (x)-(y) < DP_TOL && (x)-(y) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument greater than second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n GT: (x,y) => {\r\n return ( (x)-(y) > DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument greater than or equal to second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n GE: (x,y) => {\r\n return ( (x)-(y) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument less than second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n LT: (x,y) => {\r\n return ( (x)-(y) < -DP_TOL )\r\n },\r\n /**\r\n * Returns *true* if first argument less than or equal to second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n LE: (x,y) => {\r\n return ( (x)-(y) < DP_TOL );\r\n }\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/19/2017.\r\n */\r\nmodule.exports = {\r\n ILLEGAL_PARAMETERS: new ReferenceError('Illegal Parameters'),\r\n ZERO_DIVISION: new Error('Zero division')\r\n};\r\n\r\n","\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing an affine transformation 3x3 matrix:\r\n * <pre>\r\n * [ a c tx\r\n * A = b d ty\r\n * 0 0 1 ]\r\n * </pre\r\n * @type {Matrix}\r\n */\r\n Flatten.Matrix = class Matrix {\r\n /**\r\n * Construct new instance of affine transformation matrix <br/>\r\n * If parameters omitted, construct identity matrix a = 1, d = 1\r\n * @param {number} a - position(0,0) sx*cos(alpha)\r\n * @param {number} b - position (0,1) sx*sin(alpha)\r\n * @param {number} c - position (1,0) -sy*sin(alpha)\r\n * @param {number} d - position (1,1) sy*cos(alpha)\r\n * @param {number} tx - position (2,0) translation by x\r\n * @param {number} ty - position (2,1) translation by y\r\n */\r\n constructor(a=1,b=0,c=0,d=1,tx=0,ty=0) {\r\n this.a = a;\r\n this.b = b;\r\n this.c = c;\r\n this.d = d;\r\n this.tx = tx;\r\n this.ty = ty;\r\n }\r\n\r\n /**\r\n * Returns a clone of the Matrix instance.\r\n * @return {Matrix}\r\n **/\r\n clone() {\r\n return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty);\r\n };\r\n\r\n /**\r\n * Transform vector [x,y] using transformation matrix. <br/>\r\n * Vector [x,y] is an abstract array[2] of numbers and not a FlattenJS object <br/>\r\n * The result is also an abstract vector [x',y'] = A * [x,y]:\r\n * <code>\r\n * [x' [ ax + by + tx\r\n * y' = cx + dy + ty\r\n * 1] 1 ]\r\n * </code>\r\n * @param {number[]} vector - array[2] of numbers\r\n * @returns {number[]} transformation result - array[2] of numbers\r\n */\r\n transform(vector) {\r\n return [\r\n vector[0]*this.a+vector[1]*this.c+this.tx,\r\n vector[0]*this.b+vector[1]*this.d+this.ty\r\n ]\r\n };\r\n\r\n /**\r\n * Returns result of multiplication of this matrix by other matrix\r\n * @param {Matrix} other_matrix - matrix to multiply by\r\n * @returns {Matrix}\r\n */\r\n multiply(other_matrix) {\r\n return new Matrix(\r\n this.a*other_matrix.a + this.c*other_matrix.b,\r\n this.b*other_matrix.a + this.d*other_matrix.b,\r\n this.a*other_matrix.c + this.c*other_matrix.d,\r\n this.b*other_matrix.c + this.d*other_matrix.d,\r\n this.a*other_matrix.tx + this.c*other_matrix.ty + this.tx,\r\n this.b*other_matrix.tx + this.d*other_matrix.ty + this.ty\r\n )\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix(1,0,0,1,tx,ty)\r\n * @param {number} tx - translation by x\r\n * @param {number} ty - translation by y\r\n * @returns {Matrix}\r\n */\r\n translate(...args) {\r\n let tx, ty;\r\n if (args.length == 1 && (args[0] instanceof Flatten.Vector)) {\r\n tx = args[0].x;\r\n ty = args[0].y;\r\n }\r\n else if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n tx = args[0];\r\n ty = args[1];\r\n }\r\n else {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n return this.multiply(new Matrix(1,0,0,1,tx,ty))\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix that defines rotation by given angle (in radians) around\r\n * point (0,0) in counter clockwise direction\r\n * @param angle\r\n * @returns {Matrix}\r\n */\r\n rotate(angle) {\r\n let cos = Math.cos(angle);\r\n let sin = Math.sin(angle);\r\n return this.multiply(new Matrix(cos,sin,-sin,cos,0,0));\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix (sx,0,0,sy,0,0) that defines scaling\r\n * @param sx\r\n * @param sy\r\n * @returns {Matrix}\r\n */\r\n scale(sx, sy) {\r\n return this.multiply(new Matrix(sx,0,0,sy,0,0));\r\n };\r\n\r\n /**\r\n * Returns true if two matrix are equal parameter by parameter\r\n * @param {Matrix} matrix - other matrix\r\n * @returns {boolean} true if equal, false otherwise\r\n */\r\n equalTo(matrix) {\r\n if (!Flatten.Utils.EQ(this.tx, matrix.tx)) return false;\r\n if (!Flatten.Utils.EQ(this.ty, matrix.ty)) return false;\r\n if (!Flatten.Utils.EQ(this.a, matrix.a)) return false;\r\n if (!Flatten.Utils.EQ(this.b, matrix.b)) return false;\r\n if (!Flatten.Utils.EQ(this.c, matrix.c)) return false;\r\n if (!Flatten.Utils.EQ(this.d, matrix.d)) return false;\r\n return true;\r\n };\r\n };\r\n\r\n /**\r\n * Function to create matrix equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.matrix = (...args) => new Flatten.Matrix(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\nlet Interval = class Interval {\r\n constructor(low, high) {\r\n this.low = low;\r\n this.high = high;\r\n }\r\n\r\n get max() {\r\n return this.high;\r\n }\r\n\r\n interval(low, high) {\r\n return new Interval(low, high);\r\n }\r\n\r\n clone() {\r\n return new Interval(this.low, this.high);\r\n }\r\n\r\n less_than(other_interval) {\r\n return this.low < other_interval.low ||\r\n this.low == other_interval.low && this.high < other_interval.high;\r\n }\r\n\r\n equal_to(other_interval) {\r\n return this.low == other_interval.low && this.high == other_interval.high;\r\n }\r\n\r\n intersect(other_interval) {\r\n return !this.not_intersect(other_interval);\r\n }\r\n\r\n not_intersect(other_interval) {\r\n return (this.high < other_interval.low || other_interval.high < this.low);\r\n }\r\n\r\n output() {\r\n return [this.low, this.high];\r\n }\r\n\r\n maximal_val(val1, val2) {\r\n return Math.max(val1, val2);\r\n }\r\n\r\n val_less_than(val1, val2 ) { // trait to compare max property with item ?\r\n return val1 < val2;\r\n }\r\n};\r\n\r\nmodule.exports = Interval;\r\n","/**\r\n * Created by Alex Bol on 3/28/2017.\r\n */\r\n\r\n'use strict';\r\n\r\nmodule.exports = {\r\n RB_TREE_COLOR_RED: 0,\r\n RB_TREE_COLOR_BLACK: 1\r\n};","/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\n'use strict';\r\n\r\n// let defaultTraits = require('../utils/numeric_traits');\r\nlet Interval = require('../classes/interval');\r\nlet {RB_TREE_COLOR_RED, RB_TREE_COLOR_BLACK} = require('../utils/constants');\r\n\r\nlet Node = class Node {\r\n constructor(key = undefined, value = undefined,\r\n left = null, right = null, parent = null, color = RB_TREE_COLOR_BLACK) {\r\n this.left = left; // reference to left child node\r\n this.right = right; // reference to right child node\r\n this.parent = parent; // reference to parent node\r\n this.color = color;\r\n\r\n this.item = {key: key, value: value}; // key is supposed to be instance of Interval\r\n\r\n /* If not, this should by an array of two numbers */\r\n if (key && key instanceof Array && key.length == 2) {\r\n if (!Number.isNaN(key[0]) && !Number.isNaN(key[1])) {\r\n this.item.key = new Interval(Math.min(key[0], key[1]), Math.max(key[0], key[1]));\r\n }\r\n }\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n }\r\n\r\n isNil() {\r\n return (this.item.key === undefined && this.item.value === undefined &&\r\n this.left === null && this.right === null && this.color === RB_TREE_COLOR_BLACK);\r\n }\r\n\r\n less_than(other_node) {\r\n return this.item.key.less_than(other_node.item.key);\r\n }\r\n\r\n equal_to(other_node) {\r\n let value_equal = true;\r\n if (this.item.value && other_node.item.value) {\r\n value_equal = this.item.value.equal_to ? this.item.value.equal_to(other_node.item.value) :\r\n this.item.value == other_node.item.value;\r\n }\r\n return this.item.key.equal_to(other_node.item.key) && value_equal;\r\n }\r\n\r\n intersect(other_node) {\r\n return this.item.key.intersect(other_node.item.key);\r\n }\r\n\r\n copy_data(other_node) {\r\n this.item.key = other_node.item.key.clone();\r\n this.item.value = other_node.item.value;\r\n }\r\n\r\n update_max() {\r\n // use key (Interval) max property instead of key.high\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n if (this.right && this.right.max) {\r\n let maximal_val = this.item.key.maximal_val;\r\n this.max = maximal_val(this.max, this.right.max);\r\n }\r\n if (this.left && this.left.max) {\r\n let maximal_val = this.item.key.maximal_val;\r\n this.max = maximal_val(this.max, this.left.max);\r\n }\r\n }\r\n\r\n // Other_node does not intersect any node of left subtree, if this.left.max < other_node.item.key.low\r\n not_intersect_left_subtree(search_node) {\r\n let val_less_than = this.item.key.val_less_than;\r\n let high = this.left.max.high ? this.left.max.high : this.left.max;\r\n return val_less_than(high, search_node.item.key.low);\r\n }\r\n\r\n // Other_node does not intersect right subtree if other_node.item.key.high < this.right.key.low\r\n not_intersect_right_subtree(search_node) {\r\n let val_less_than = this.item.key.val_less_than;\r\n let low = this.right.max.low ? this.right.max.low : this.right.item.key.low;\r\n return val_less_than(search_node.item.key.high, low);\r\n }\r\n};\r\n\r\nmodule.exports = Node;\r\n\r\n","/**\r\n * Created by Alex Bol on 3/31/2017.\r\n */\r\n'use strict';\r\n\r\nlet Node = require('./classes/node');\r\nlet {RB_TREE_COLOR_RED, RB_TREE_COLOR_BLACK} = require('./utils/constants');\r\n\r\nlet nil_node = new Node();\r\n\r\n/**\r\n * Implementation of interval binary search tree <br/>\r\n * Interval tree may store items which are couples of {key:interval, value: value} <br/>\r\n * Interval is an object with high and low properties or simply array of numeric [low,high] values <br />\r\n * If interval is an object, it should implement and expose methods less_than, equals_to, intersect and others,\r\n * see documentation {link}\r\n * @type {IntervalTree}\r\n */\r\nlet IntervalTree = class IntervalTree {\r\n /**\r\n * Construct new empty instance of IntervalTree\r\n */\r\n constructor() {\r\n this.root = null;\r\n }\r\n\r\n /**\r\n * Returns number of items stored in the interval tree\r\n * @returns {number}\r\n */\r\n get size() {\r\n let count = 0;\r\n this.tree_walk(this.root, () => count++);\r\n return count;\r\n }\r\n\r\n /**\r\n * Returns array of sorted keys in the ascending order\r\n * @returns {Array}\r\n */\r\n get keys() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(node.item.key.output()));\r\n return res;\r\n }\r\n\r\n /**\r\n * Return array of values in the ascending keys order\r\n * @returns {Array}\r\n */\r\n get values() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(node.item.value));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns array of items (<key,value> pairs) in the ascended keys order\r\n * @returns {Array}\r\n */\r\n get items() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push({key: node.item.key.output(), value: node.item.value}));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns true if tree is empty\r\n * @returns {boolean}\r\n */\r\n get isEmpty() {\r\n return (this.root == null || this.root == nil_node);\r\n }\r\n\r\n /**\r\n * Insert new item into interval tree\r\n * @param key - interval object or array of two numbers [low, high]\r\n * @param value - value representing any object (optional)\r\n * @returns {Node} - returns reference to inserted node as an object {key:interval, value: value}\r\n */\r\n insert(key, value = key) {\r\n if (key === undefined) return;\r\n let insert_node = new Node(key, value, nil_node, nil_node, null, RB_TREE_COLOR_RED);\r\n this.tree_insert(insert_node);\r\n this.recalc_max(insert_node);\r\n return insert_node;\r\n }\r\n\r\n /**\r\n * Returns true if item {key,value} exist in the tree\r\n * @param key - interval correspondent to keys stored in the tree\r\n * @param value - value object to be checked\r\n * @returns {boolean} - true if item {key, value} exist in the tree, false otherwise\r\n */\r\n exist(key, value) {\r\n let search_node = new Node(key, value);\r\n return this.tree_search(this.root, search_node) ? true : false;\r\n }\r\n\r\n /**\r\n * Remove entry {key, value} from the tree\r\n * @param key - interval correspondent to keys stored in the tree\r\n * @param value - - value object\r\n * @returns {boolean} - true if item {key, value} deleted, false if not found\r\n */\r\n remove(key, value) {\r\n let search_node = new Node(key, value);\r\n let delete_node = this.tree_search(this.root, search_node);\r\n if (delete_node) {\r\n this.tree_delete(delete_node);\r\n }\r\n return delete_node;\r\n }\r\n\r\n /**\r\n * Returns array of entry values which keys intersect with given interval <br/>\r\n * If no values stored in the tree, returns array of keys which intersect given interval\r\n * @param interval - search interval, or array [low, high]\r\n * @returns {Array}\r\n */\r\n search(interval) {\r\n let search_node = new Node(interval);\r\n let resp_nodes = [];\r\n this.tree_search_interval(this.root, search_node, resp_nodes);\r\n let resp = [];\r\n resp_nodes.forEach((node) => {\r\n if (node.item.value) { // if there are values, return only values\r\n resp.push(node.item.value);\r\n }\r\n else { // otherwise, return keys\r\n resp.push(node.item.key.output());\r\n }\r\n }, []);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Tree visitor. For each node implement a callback function. <br/>\r\n * Method calls a callback function with two parameters (key, value)\r\n * @param visitor(key,value) - function to be called for each tree item\r\n */\r\n forEach(visitor) {\r\n this.tree_walk(this.root, (node) => visitor(node.item.key, node.item.value));\r\n }\r\n \r\n /** Value Mapper. Walk through every node and map node value to another value\r\n * @param callback(value, key) - function to be called for each tree item\r\n */\r\n map(callback) {\r\n const tree = new IntervalTree();\r\n this.tree_walk(this.root, (node) => tree.insert(node.item.key, callback(node.item.value, node.item.key)));\r\n return tree;\r\n }\r\n\r\n recalc_max(node) {\r\n let node_current = node;\r\n while (node_current.parent != null) {\r\n node_current.parent.update_max();\r\n node_current = node_current.parent;\r\n }\r\n }\r\n\r\n tree_insert(insert_node) {\r\n let current_node = this.root;\r\n let parent_node = null;\r\n\r\n if (this.root == null || this.root == nil_node) {\r\n this.root = insert_node;\r\n }\r\n else {\r\n while (current_node != nil_node) {\r\n parent_node = current_node;\r\n if (insert_node.less_than(current_node)) {\r\n current_node = current_node.left;\r\n }\r\n else {\r\n current_node = current_node.right;\r\n }\r\n }\r\n\r\n insert_node.parent = parent_node;\r\n\r\n if (insert_node.less_than(parent_node)) {\r\n parent_node.left = insert_node;\r\n }\r\n else {\r\n parent_node.right = insert_node;\r\n }\r\n }\r\n\r\n this.insert_fixup(insert_node);\r\n }\r\n\r\n// After insertion insert_node may have red-colored parent, and this is a single possible violation\r\n// Go upwords to the root and re-color until violation will be resolved\r\n insert_fixup(insert_node) {\r\n let current_node;\r\n let uncle_node;\r\n\r\n current_node = insert_node;\r\n while (current_node != this.root && current_node.parent.color == RB_TREE_COLOR_RED) {\r\n if (current_node.parent == current_node.parent.parent.left) { // parent is left child of grandfather\r\n uncle_node = current_node.parent.parent.right; // right brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 1. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else { // Case 2 & 3. Uncle is black\r\n if (current_node == current_node.parent.right) { // Case 2. Current if right child\r\n // This case is transformed into Case 3.\r\n current_node = current_node.parent;\r\n this.rotate_left(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 3. Current is left child.\r\n // Re-color father and grandfather, rotate grandfather right\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_right(current_node.parent.parent);\r\n }\r\n }\r\n else { // parent is right child of grandfather\r\n uncle_node = current_node.parent.parent.left; // left brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 4. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else {\r\n if (current_node == current_node.parent.left) { // Case 5. Current is left child\r\n // Transform into case 6\r\n current_node = current_node.parent;\r\n this.rotate_right(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 6. Current is right child.\r\n // Re-color father and grandfather, rotate grandfather left\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_left(current_node.parent.parent);\r\n }\r\n }\r\n }\r\n\r\n this.root.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_delete(delete_node) {\r\n let cut_node; // node to be cut - either delete_node or successor_node (\"y\" from 14.4)\r\n let fix_node; // node to fix rb tree property (\"x\" from 14.4)\r\n\r\n if (delete_node.left == nil_node || delete_node.right == nil_node) { // delete_node has less then 2 children\r\n cut_node = delete_node;\r\n }\r\n else { // delete_node has 2 children\r\n cut_node = this.tree_successor(delete_node);\r\n }\r\n\r\n // fix_node if single child of cut_node\r\n if (cut_node.left != nil_node) {\r\n fix_node = cut_node.left;\r\n }\r\n else {\r\n fix_node = cut_node.right;\r\n }\r\n\r\n // remove cut_node from parent\r\n /*if (fix_node != nil_node) {*/\r\n fix_node.parent = cut_node.parent;\r\n /*}*/\r\n\r\n if (cut_node == this.root) {\r\n this.root = fix_node;\r\n }\r\n else {\r\n if (cut_node == cut_node.parent.left) {\r\n cut_node.parent.left = fix_node;\r\n }\r\n else {\r\n cut_node.parent.right = fix_node;\r\n }\r\n cut_node.parent.update_max(); // update max property of the parent\r\n }\r\n\r\n this.recalc_max(fix_node); // update max property upward from fix_node to root\r\n\r\n // COPY DATA !!!\r\n // Delete_node becomes cut_node, it means that we cannot hold reference\r\n // to node in outer structure and we will have to delete by key, additional search need\r\n if (cut_node != delete_node) {\r\n delete_node.copy_data(cut_node);\r\n delete_node.update_max(); // update max property of the cut node at the new place\r\n this.recalc_max(delete_node); // update max property upward from delete_node to root\r\n }\r\n\r\n if (/*fix_node != nil_node && */cut_node.color == RB_TREE_COLOR_BLACK) {\r\n this.delete_fixup(fix_node);\r\n }\r\n }\r\n\r\n delete_fixup(fix_node) {\r\n let current_node = fix_node;\r\n let brother_node;\r\n\r\n while (current_node != this.root && current_node.parent != null && current_node.color == RB_TREE_COLOR_BLACK) {\r\n if (current_node == current_node.parent.left) { // fix node is left child\r\n brother_node = current_node.parent.right;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_left(current_node.parent);\r\n brother_node = current_node.parent.right; // update brother\r\n }\r\n // Derive to cases 2..4: brother is black\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2: both nephews black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 3: left nephew red, right nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.left.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_right(brother_node);\r\n brother_node = current_node.parent.right; // update brother\r\n // Derive to case 4: left nephew black, right nephew red\r\n }\r\n // case 4: left nephew black, right nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.right.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_left(current_node.parent);\r\n current_node = this.root; // exit from loop\r\n }\r\n }\r\n else { // fix node is right child\r\n brother_node = current_node.parent.left;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_right(current_node.parent);\r\n brother_node = current_node.parent.left; // update brother\r\n }\r\n // Go to cases 2..4\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK) { // case 3: right nephew red, left nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.right.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_left(brother_node);\r\n brother_node = current_node.parent.left; // update brother\r\n // Derive to case 4: right nephew black, left nephew red\r\n }\r\n // case 4: right nephew black, left nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.left.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_right(current_node.parent);\r\n current_node = this.root; // force exit from loop\r\n }\r\n }\r\n }\r\n\r\n current_node.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_search(node, search_node) {\r\n if (node == null || node == nil_node)\r\n return undefined;\r\n\r\n if (search_node.equal_to(node)) {\r\n return node;\r\n }\r\n if (search_node.less_than(node)) {\r\n return this.tree_search(node.left, search_node);\r\n }\r\n else {\r\n return this.tree_search(node.right, search_node);\r\n }\r\n }\r\n\r\n // Original search_interval method; container res support push() insertion\r\n // Search all intervals intersecting given one\r\n tree_search_interval(node, search_node, res) {\r\n if (node != null && node != nil_node) {\r\n // if (node->left != nil_node && node->left->max >= low) {\r\n if (node.left != nil_node && !node.not_intersect_left_subtree(search_node)) {\r\n this.tree_search_interval(node.left, search_node, res);\r\n }\r\n // if (low <= node->high && node->low <= high) {\r\n if (node.intersect(search_node)) {\r\n res.push(node);\r\n }\r\n // if (node->right != nil_node && node->low <= high) {\r\n if (node.right != nil_node && !node.not_intersect_right_subtree(search_node)) {\r\n this.tree_search_interval(node.right, search_node, res);\r\n }\r\n }\r\n }\r\n\r\n local_minimum(node) {\r\n let node_min = node;\r\n while (node_min.left != null && node_min.left != nil_node) {\r\n node_min = node_min.left;\r\n }\r\n return node_min;\r\n }\r\n\r\n // not in use\r\n local_maximum(node) {\r\n let node_max = node;\r\n while (node_max.right != null && node_max.right != nil_node) {\r\n node_max = node_max.right;\r\n }\r\n return node_max;\r\n }\r\n\r\n tree_successor(node) {\r\n let node_successor;\r\n let current_node;\r\n let parent_node;\r\n\r\n if (node.right != nil_node) {\r\n node_successor = this.local_minimum(node.right);\r\n }\r\n else {\r\n current_node = node;\r\n parent_node = node.parent;\r\n while (parent_node != null && parent_node.right == current_node) {\r\n current_node = parent_node;\r\n parent_node = parent_node.parent;\r\n }\r\n node_successor = parent_node;\r\n }\r\n return node_successor;\r\n }\r\n\r\n // | right-rotate(T,y) |\r\n // y ---------------. x\r\n // / \\ / \\\r\n // x c left-rotate(T,x) a y\r\n // / \\ <--------------- / \\\r\n // a b b c\r\n\r\n rotate_left(x) {\r\n let y = x.right;\r\n\r\n x.right = y.left; // b goes to x.right\r\n\r\n if (y.left != nil_node) {\r\n y.left.parent = x; // x becomes parent of b\r\n }\r\n y.parent = x.parent; // move parent\r\n\r\n if (x == this.root) {\r\n this.root = y; // y becomes root\r\n }\r\n else { // y becomes child of x.parent\r\n if (x == x.parent.left) {\r\n x.parent.left = y;\r\n }\r\n else {\r\n x.parent.right = y;\r\n }\r\n }\r\n y.left = x; // x becomes left child of y\r\n x.parent = y; // and y becomes parent of x\r\n\r\n if (x != null && x != nil_node) {\r\n x.update_max();\r\n }\r\n\r\n y = x.parent;\r\n if (y != null && y != nil_node) {\r\n y.update_max();\r\n }\r\n }\r\n\r\n rotate_right(y) {\r\n let x = y.left;\r\n\r\n y.left = x.right; // b goes to y.left\r\n\r\n if (x.right != nil_node) {\r\n x.right.parent = y; // y becomes parent of b\r\n }\r\n x.parent = y.parent; // move parent\r\n\r\n if (y == this.root) { // x becomes root\r\n this.root = x;\r\n }\r\n else { // y becomes child of x.parent\r\n if (y == y.parent.left) {\r\n y.parent.left = x;\r\n }\r\n else {\r\n y.parent.right = x;\r\n }\r\n }\r\n x.right = y; // y becomes right child of x\r\n y.parent = x; // and x becomes parent of y\r\n\r\n if (y != null && y != nil_node) {\r\n y.update_max();\r\n }\r\n\r\n x = y.parent;\r\n if (x != null && x != nil_node) {\r\n x.update_max();\r\n }\r\n }\r\n\r\n tree_walk(node, action) {\r\n if (node != null && node != nil_node) {\r\n this.tree_walk(node.left, action);\r\n // arr.push(node.output());\r\n action(node);\r\n this.tree_walk(node.right, action);\r\n }\r\n }\r\n\r\n /* Return true if all red nodes have exactly two black child nodes */\r\n testRedBlackProperty() {\r\n let res = true;\r\n this.tree_walk(this.root, function (node) {\r\n if (node.color == RB_TREE_COLOR_RED) {\r\n if (!(node.left.color == RB_TREE_COLOR_BLACK && node.right.color == RB_TREE_COLOR_BLACK)) {\r\n res = false;\r\n }\r\n }\r\n });\r\n return res;\r\n }\r\n\r\n /* Throw error if not every path from root to bottom has same black height */\r\n testBlackHeightProperty(node) {\r\n let height = 0;\r\n let heightLeft = 0;\r\n let heightRight = 0;\r\n if (node.color == RB_TREE_COLOR_BLACK) {\r\n height++;\r\n }\r\n if (node.left != nil_node) {\r\n heightLeft = this.testBlackHeightProperty(node.left);\r\n }\r\n else {\r\n heightLeft = 1;\r\n }\r\n if (node.right != nil_node) {\r\n heightRight = this.testBlackHeightProperty(node.right);\r\n }\r\n else {\r\n heightRight = 1;\r\n }\r\n if (heightLeft != heightRight) {\r\n throw new Error('Red-black height property violated');\r\n }\r\n height += heightLeft;\r\n return height;\r\n };\r\n};\r\n\r\nmodule.exports = IntervalTree;\r\n","/**\r\n * Created by Alex Bol on 3/12/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\n// require(\"babel-polyfill\");\r\n\r\nlet IntervalTree = require('flatten-interval-tree');\r\n\r\nmodule.exports = function (Flatten) {\r\n /**\r\n * Class representing a planar set - a generic container with ability to keep and retrieve shapes and\r\n * perform spatial queries. Planar set is an extension of Set container, so it supports\r\n * Set properties and methods\r\n */\r\n Flatten.PlanarSet = class PlanarSet extends Set {\r\n /**\r\n * Create new empty instance of PlanarSet\r\n */\r\n constructor() {\r\n super();\r\n this.index = new IntervalTree();\r\n }\r\n\r\n /**\r\n * Add new shape to planar set and to its spatial index.<br/>\r\n * If shape already exist, it will not be added again.\r\n * This happens with no error, it is possible to use <i>size</i> property to check if\r\n * a shape was actually added.<br/>\r\n * Method returns planar set object updated and may be chained\r\n * @param {Shape} shape - shape to be added, should have valid <i>box</i> property\r\n * @returns {PlanarSet}\r\n */\r\n add(shape) {\r\n let size = this.size;\r\n super.add(shape);\r\n // size not changed - item not added, probably trying to add same item twice\r\n if (this.size > size) {\r\n let node = this.index.insert(shape.box, shape);\r\n }\r\n return this; // in accordance to Set.add interface\r\n }\r\n\r\n /**\r\n * Delete shape from planar set. Returns true if shape was actually deleted, false otherwise\r\n * @param {Shape} shape - shape to be deleted\r\n * @returns {boolean}\r\n */\r\n delete(shape) {\r\n let deleted = super.delete(shape);\r\n if (deleted) {\r\n this.index.remove(shape.box, shape);\r\n }\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Clear planar set\r\n */\r\n clear() {\r\n super.clear();\r\n this.index = new IntervalTree();\r\n }\r\n\r\n /**\r\n * 2d range search in planar set.<br/>\r\n * Returns array of all shapes in planar set which bounding box is intersected with query box\r\n * @param {Box} box - query box\r\n * @returns {Shapes[]}\r\n */\r\n search(box) {\r\n let resp = this.index.search(box);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Point location test. Returns array of shapes which contains given point\r\n * @param {Point} point - query point\r\n * @returns {Array}\r\n */\r\n hit(point) {\r\n let box = new Flatten.Box(point.x - 1, point.y - 1, point.x + 1, point.y + 1);\r\n let resp = this.index.search(box);\r\n return resp.filter((shape) => point.on(shape));\r\n }\r\n\r\n /**\r\n * Returns svg string to draw all shapes in planar set\r\n * @returns {String}\r\n */\r\n svg() {\r\n let svgcontent = [...this].reduce((acc, shape) => acc + shape.svg(), \"\");\r\n return svgcontent;\r\n }\r\n }\r\n};\r\n\r\n","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\n/**\r\n *\r\n * @param Flatten\r\n */\r\nmodule.exports = function(Flatten) {\r\n /**\r\n *\r\n * Class representing a point\r\n * @type {Point}\r\n */\r\n Flatten.Point = class Point {\r\n /**\r\n * Point may be constructed by two numbers, or by array of two numbers\r\n * @param {number} x - x-coordinate (float number)\r\n * @param {number} y - y-coordinate (float number)\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof(arr[0]) == \"number\" && typeof(arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"point\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n if (typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n this.x = args[0];\r\n this.y = args[1];\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n\r\n }\r\n\r\n /**\r\n * Returns bounding box of a point\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(this.x, this.y, this.x, this.y);\r\n }\r\n\r\n /**\r\n * Method clone returns new copied instance of point\r\n * @returns {Point}\r\n */\r\n clone() {\r\n return new Flatten.Point(this.x, this.y);\r\n }\r\n\r\n get vertices() {\r\n return [this.clone()];\r\n }\r\n\r\n /**\r\n * Returns true if points are equal up to [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n equalTo(pt) {\r\n return Flatten.Utils.EQ(this.x, pt.x) && Flatten.Utils.EQ(this.y, pt.y);\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between points. Returns true if the point is less than query points, false otherwise <br/>\r\n * By definition point1 < point2 if {point1.y < point2.y || point1.y == point2.y && point1.x < point2.y <br/>\r\n * Numeric values compared with [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n lessThan(pt) {\r\n if (Flatten.Utils.LT(this.y, pt.y))\r\n return true;\r\n if (Flatten.Utils.EQ(this.y, pt.y) && Flatten.Utils.LT(this.x, pt.x))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns new point rotated by given angle around given center point.\r\n * If center point is omitted, rotates around zero point (0,0).\r\n * Positive value of angle defines rotation in counter clockwise direction,\r\n * negative angle defines rotation in clockwise clockwise direction\r\n * @param {number} angle - angle in radians\r\n * @param {Point} [center=(0,0)] center\r\n * @returns {Point}\r\n */\r\n rotate(angle, center = {x:0, y:0}) {\r\n var x_rot = center.x + (this.x - center.x) * Math.cos(angle) - (this.y - center.y) * Math.sin(angle);\r\n var y_rot = center.y + (this.x - center.x) * Math.sin(angle) + (this.y - center.y) * Math.cos(angle);\r\n\r\n return new Flatten.Point(x_rot, y_rot);\r\n }\r\n\r\n /**\r\n * Returns new point translated by given vector.\r\n * Translation vector may by also defined by a pair of numbers.\r\n * @param {Vector} vector - Translation vector defined as Flatten.Vector or\r\n * @param {number|number} - Translation vector defined as pair of numbers\r\n * @returns {Point}\r\n */\r\n translate(...args) {\r\n if (args.length == 1 && (args[0] instanceof Flatten.Vector)) {\r\n return new Flatten.Point(this.x + args[0].x, this.y + args[0].y);\r\n }\r\n\r\n if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n return new Flatten.Point(this.x + args[0], this.y + args[1]);\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new point transformed by affine transformation matrix m\r\n * @param {Matrix} m - affine transformation matrix (a,b,c,d,tx,ty)\r\n * @returns {Point}\r\n */\r\n transform(m) {\r\n // let [x,y] = m.transform([this.x,this.y]);\r\n return new Flatten.Point(m.transform([this.x,this.y]))\r\n }\r\n\r\n /**\r\n * Returns projection point on given line\r\n * @param {Line} line Line this point be projected on\r\n * @returns {Point}\r\n */\r\n projectionOn(line) {\r\n if (this.equalTo(line.pt)) // this point equal to line anchor point\r\n return this.clone();\r\n\r\n let vec = new Flatten.Vector(this, line.pt);\r\n if (Flatten.Utils.EQ_0(vec.cross(line.norm))) // vector to point from anchor point collinear to normal vector\r\n return line.pt.clone();\r\n\r\n let dist = vec.dot(line.norm); // signed distance\r\n let proj_vec = line.norm.multiply(dist);\r\n return this.translate(proj_vec);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the \"left\" semi-plane, which means, point belongs to the same semi plane where line normal vector points to\r\n * Return false if point belongs to the \"right\" semi-plane or to the line itself\r\n * @param {Line} line Query line\r\n * @returns {boolean}\r\n */\r\n leftTo(line) {\r\n let vec = new Flatten.Vector(line.pt, this);\r\n let onLeftSemiPlane = Flatten.Utils.GT(vec.dot(line.norm), 0);\r\n return onLeftSemiPlane;\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from point to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from point to shape\r\n * @returns {Segment} shortest segment between point and shape (started at point, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Point) {\r\n let dx = shape.x - this.x;\r\n let dy = shape.y - this.y;\r\n return [Math.sqrt(dx*dx + dy*dy), new Flatten.Segment(this, shape)];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Distance.point2line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Distance.point2circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Distance.point2segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n // let [dist, ...rest] = Distance.point2arc(this, shape);\r\n // return dist;\r\n return Distance.point2arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n // let [dist, ...rest] = Distance.point2polygon(this, shape);\r\n // return dist;\r\n return Distance.point2polygon(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n return Distance.shape2planarSet(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if point is on a shape, false otherwise\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon\r\n * @returns {boolean}\r\n */\r\n on(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.equalTo(shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return shape.contains(this);\r\n }\r\n }\r\n\r\n /**\r\n * Return string to draw point in svg as circle with radius \"r\" <br/>\r\n * Accept any valid attributes of svg elements as svg object\r\n * Defaults attribues are: <br/>\r\n * {\r\n * r:\"3\",\r\n * stroke:\"black\",\r\n * strokeWidth:\"1\",\r\n * fill:\"red\"\r\n * }\r\n * @param {Object} attrs - Any valid attributes of svg circle element, like \"r\", \"stroke\", \"strokeWidth\", \"fill\"\r\n * @returns {String}\r\n */\r\n svg(attrs = {}) {\r\n let {r, stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n return `\\n<circle cx=\"${this.x}\" cy=\"${this.y}\" r=\"${r || 3}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"red\"}\" ${id_str} ${class_str} />`;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"point\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create point equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.point = (...args) => new Flatten.Point(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/19/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a vector\r\n * @type {Vector}\r\n */\r\n Flatten.Vector = class Vector {\r\n /**\r\n * Vector may be constructed by two points, or by two float numbers,\r\n * or by array of two numbers\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n /* return zero vector */\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof(arr[0]) == \"number\" && typeof(arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"vector\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (typeof(a1) == \"number\" && typeof(a2) == \"number\") {\r\n this.x = a1;\r\n this.y = a2;\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.x = a2.x - a1.x;\r\n this.y = a2.y - a1.y;\r\n return;\r\n }\r\n\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone returns new instance of Vector\r\n * @returns {Vector}\r\n */\r\n clone() {\r\n return new Vector(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Slope of the vector in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let angle = Math.atan2(this.y, this.x);\r\n if (angle<0) angle = 2*Math.PI + angle;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Length of vector\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.sqrt(this.dot(this));\r\n }\r\n\r\n /**\r\n * Returns true if vectors are equal up to [DP_TOL]{@link http://localhost:63342/flatten-js/docs/global.html#DP_TOL}\r\n * tolerance\r\n * @param {Vector} v\r\n * @returns {boolean}\r\n */\r\n equalTo(v) {\r\n return Flatten.Utils.EQ(this.x, v.x) && Flatten.Utils.EQ(this.y, v.y);\r\n }\r\n\r\n /**\r\n * Returns new vector multiplied by scalar\r\n * @param {number} scalar\r\n * @returns {Vector}\r\n */\r\n multiply(scalar) {\r\n return ( new Vector(scalar * this.x, scalar * this.y) );\r\n }\r\n\r\n /**\r\n * Returns scalar product (dot product) of two vectors <br/>\r\n * <code>dot_product = (this * v)</code>\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n dot(v) {\r\n return ( this.x * v.x + this.y * v.y );\r\n }\r\n\r\n /**\r\n * Returns vector product (cross product) of two vectors <br/>\r\n * <code>cross_product = (this x v)</code>\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n cross(v) {\r\n return ( this.x * v.y - this.y * v.x );\r\n }\r\n\r\n /**\r\n * Returns unit vector.<br/>\r\n * Throw error if given vector has zero length\r\n * @returns {Vector}\r\n */\r\n normalize() {\r\n if (!Flatten.Utils.EQ_0(this.length)) {\r\n return ( new Vector(this.x / this.length, this.y / this.length) );\r\n }\r\n throw Flatten.Errors.ZERO_DIVISION;\r\n }\r\n\r\n /**\r\n * Returns new vector rotated by given angle,\r\n * positive angle defines rotation in counter clockwise direction,\r\n * negative - in clockwise direction\r\n * @param {number} angle - Angle in radians\r\n * @returns {Vector}\r\n */\r\n rotate(angle) {\r\n let point = new Flatten.Point(this.x, this.y);\r\n let rpoint = point.rotate(angle);\r\n return new Flatten.Vector(rpoint.x, rpoint.y);\r\n }\r\n\r\n /**\r\n * Returns vector rotated 90 degrees counter clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CCW() {\r\n return new Flatten.Vector(-this.y, this.x);\r\n };\r\n\r\n /**\r\n * Returns vector rotated 90 degrees clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CW() {\r\n return new Flatten.Vector(this.y, -this.x);\r\n };\r\n\r\n /**\r\n * Return inverted vector\r\n * @returns {Vector}\r\n */\r\n invert() {\r\n return new Flatten.Vector(-this.x, -this.y);\r\n }\r\n\r\n /**\r\n * Return result of addition of other vector to this vector as a new vector\r\n * @param {Vector} v Other vector\r\n * @returns {Vector}\r\n */\r\n add(v) {\r\n return new Flatten.Vector(this.x + v.x, this.y + v.y);\r\n }\r\n\r\n /**\r\n * Return result of subtraction of other vector from current vector as a new vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n subtract(v) {\r\n return new Flatten.Vector(this.x - v.x, this.y - v.y);\r\n }\r\n\r\n /**\r\n * Return angle between this vector and other vector. <br/>\r\n * Angle is measured from 0 to 2*PI in the counter clockwise direction\r\n * from current vector to other.\r\n * @param {Vector} v Another vector\r\n * @returns {number}\r\n */\r\n angleTo(v) {\r\n let norm1 = this.normalize();\r\n let norm2 = v.normalize();\r\n let angle = Math.atan2(norm1.cross(norm2), norm1.dot(norm2));\r\n if (angle<0) angle += 2*Math.PI;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Return vector projection of the current vector on another vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n projectionOn(v){\r\n let n = v.normalize();\r\n let d = this.dot(n);\r\n return n.multiply(d);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"vector\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create vector equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.vector = (...args) => new Flatten.Vector(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/20/2017.\r\n */\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a line\r\n * @type {Line}\r\n */\r\n Flatten.Line = class Line {\r\n /**\r\n * Line may be constructed by point and normal vector or by two points that a line passes through\r\n * @param {Point} pt - point that a line passes through\r\n * @param {Vector|Point} norm - normal vector to a line or second point a line passes through\r\n */\r\n constructor(...args) {\r\n /**\r\n * Point a line passes through\r\n * @type {Point}\r\n */\r\n this.pt = new Flatten.Point();\r\n /**\r\n * Normal vector to a line <br/>\r\n * Vector is normalized (length == 1)\r\n * @type {Vector}\r\n */\r\n this.norm = new Flatten.Vector(0,1);\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"line\") {\r\n let {pt, norm} = args[0];\r\n this.pt = new Flatten.Point(pt);\r\n this.norm = new Flatten.Vector(norm);\r\n return;\r\n }\r\n\r\n if (args.length == 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.pt = a1;\r\n this.norm = Line.points2norm(a1, a2);\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Vector) {\r\n if (Flatten.Utils.EQ_0(a2.x) && Flatten.Utils.EQ_0(a2.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a1.clone();\r\n this.norm = a2.clone();\r\n this.norm = this.norm.normalize();\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Vector && a2 instanceof Flatten.Point) {\r\n if (Flatten.Utils.EQ_0(a1.x) && Flatten.Utils.EQ_0(a1.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a2.clone();\r\n this.norm = a1.clone();\r\n this.norm = this.norm.normalize();\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Returns cloned new instance of a line\r\n * @returns {Line}\r\n */\r\n clone() {\r\n return new Flatten.Line(this.pt, this.norm);\r\n }\r\n\r\n /**\r\n * Slope of the line - angle in radians between line and axe x from 0 to 2PI\r\n * @returns {number} - slope of the line\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.norm.y, -this.norm.x);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Get coefficients [A,B,C] of a standard line equation in the form Ax + By = C\r\n * @code [A, B, C] = line.standard\r\n * @returns {number[]} - array of coefficients\r\n */\r\n get standard() {\r\n let A = this.norm.x;\r\n let B = this.norm.y;\r\n let C = this.norm.dot(this.pt);\r\n\r\n return [A,B,C];\r\n }\r\n\r\n /**\r\n * Return true if parallel or incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n parallelTo(other_line) {\r\n return Flatten.Utils.EQ_0(this.norm.cross(other_line.norm));\r\n }\r\n\r\n /**\r\n * Returns true if incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n incidentTo(other_line) {\r\n return this.parallelTo(other_line) && this.pt.on(other_line);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to line\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n if (this.pt.equalTo(pt)) {\r\n return true;\r\n }\r\n /* Line contains point if vector to point is orthogonal to the line normal vector */\r\n let vec = new Flatten.Vector(this.pt, pt);\r\n return Flatten.Utils.EQ_0(this.norm.dot(vec));\r\n }\r\n\r\n /**\r\n * Returns array of intersection points\r\n * @param {Shape} shape - shape to intersect with\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Line.intersectLine2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Line.intersectLine2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return Line.intersectLine2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectLine2Polygon(this, shape);\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from line to shape and returns array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of the one of the types Point, Circle, Segment, Arc, Polygon\r\n * @returns {Number}\r\n * @returns {Segment}\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = Distance.point2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = Distance.circle2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = Distance.segment2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = Distance.arc2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Return string to draw svg segment representing line inside given box\r\n * @param {Box} box Box representing drawing area\r\n * @param {Object} attrs - an object with attributes of svg circle element\r\n */\r\n svg(box, attrs = {}) {\r\n let ip = Line.intersectLine2Box(this, box);\r\n if (ip.length === 0)\r\n return \"\";\r\n let ps = ip[0];\r\n let pe = ip.length == 2 ? ip[1] : ip.find( pt => !pt.equalTo(ps) );\r\n if (pe === undefined) pe = ps;\r\n let segment = new Flatten.Segment(ps, pe);\r\n return segment.svg(attrs);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"line\"});\r\n }\r\n\r\n static points2norm(pt1, pt2) {\r\n if (pt1.equalTo(pt2)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n let vec = new Flatten.Vector(pt1, pt2);\r\n let unit = vec.normalize();\r\n return unit.rotate90CCW();\r\n }\r\n\r\n static intersectLine2Line(line1, line2) {\r\n let ip = [];\r\n\r\n let [A1, B1, C1] = line1.standard;\r\n let [A2, B2, C2] = line2.standard;\r\n\r\n /* Cramer's rule */\r\n let det = A1*B2 - B1*A2;\r\n let detX = C1*B2 - B1*C2;\r\n let detY = A1*C2 - C1*A2;\r\n\r\n if (!Flatten.Utils.EQ_0(det)) {\r\n let new_ip = new Flatten.Point( detX/det, detY/det );\r\n ip.push(new_ip);\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectLine2Circle(line, circle) {\r\n let ip = [];\r\n let prj = circle.pc.projectionOn(line); // projection of circle center on line\r\n let dist = circle.pc.distanceTo(prj)[0]; // distance from circle center to projection\r\n\r\n if (Flatten.Utils.EQ(dist, circle.r)) { // line tangent to circle - return single intersection point\r\n ip.push(prj);\r\n }\r\n else if (Flatten.Utils.LT(dist, circle.r)) { // return two intersection points\r\n let delta = Math.sqrt(circle.r*circle.r - dist*dist);\r\n let v_trans, pt;\r\n\r\n v_trans = line.norm.rotate90CCW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n\r\n v_trans = line.norm.rotate90CW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectLine2Box(line, box) {\r\n let pts = [\r\n new Flatten.Point(box.xmin, box.ymin),\r\n new Flatten.Point(box.xmax, box.ymin),\r\n new Flatten.Point(box.xmax, box.ymax),\r\n new Flatten.Point(box.xmin, box.ymax)\r\n ];\r\n let segs = [\r\n new Flatten.Segment(pts[0], pts[1]),\r\n new Flatten.Segment(pts[1], pts[2]),\r\n new Flatten.Segment(pts[2], pts[3]),\r\n new Flatten.Segment(pts[3], pts[0])\r\n ];\r\n\r\n let ips = [];\r\n\r\n for(let seg of segs) {\r\n let ips_tmp = seg.intersect(line);\r\n for (let ip of ips_tmp) {\r\n ips.push(ip);\r\n }\r\n };\r\n return ips;\r\n }\r\n\r\n static intersectLine2Arc(line, arc) {\r\n let ip = [];\r\n\r\n if (Line.intersectLine2Box(line, arc.box).length == 0) {\r\n return ip;\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = line.intersect(circle);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n };\r\n\r\n /**\r\n * Function to create line equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.line = (...args) => new Flatten.Line(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 3/6/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Arc,vector} = Flatten;\r\n /**\r\n * Class representing a circle\r\n * @type {Circle}\r\n */\r\n Flatten.Circle = class Circle {\r\n /**\r\n *\r\n * @param {Point} pc - circle center point\r\n * @param {number} r - circle radius\r\n */\r\n constructor(...args) {\r\n /**\r\n * Circle center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Circle radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"circle\") {\r\n let {pc, r} = args[0];\r\n this.pc = new Flatten.Point(pc);\r\n this.r = r;\r\n return;\r\n }\r\n else {\r\n let [pc, r] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone returns new instance of a Circle\r\n * @returns {Circle}\r\n */\r\n clone() {\r\n return new Flatten.Circle(this.pc.clone(), this.r);\r\n }\r\n\r\n /**\r\n * Circle center\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc;\r\n }\r\n\r\n /**\r\n * Circle bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n this.pc.x - this.r,\r\n this.pc.y - this.r,\r\n this.pc.x + this.r,\r\n this.pc.y + this.r\r\n );\r\n }\r\n\r\n /**\r\n * Return true if circle contains point\r\n * @param {Point} pt - test point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n return Flatten.Utils.LE(pt.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n /**\r\n * Transform circle to closed arc\r\n * @param {boolean} counterclockwise\r\n * @returns {Arc}\r\n */\r\n toArc(counterclockwise=true) {\r\n return new Flatten.Arc(this.center, this.r, Math.PI, -Math.PI, counterclockwise);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between circle and other shape\r\n * @param {Shape} shape Shape of the one of supported types\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Circle.intersectCirle2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from circle to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from circle to shape\r\n * @returns {Segment} shortest segment between circle and shape (started at circle, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n let {point2circle, circle2circle, circle2line, segment2circle, arc2circle} = Distance;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = point2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = circle2circle(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [distance, shortest_segment] = circle2line(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = segment2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = arc2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n static intersectCirle2Circle(circle1, circle2) {\r\n let ip = [];\r\n\r\n if (circle1.box.not_intersect(circle2.box)) {\r\n return ip;\r\n }\r\n\r\n let vec = new Flatten.Vector(circle1.pc, circle2.pc);\r\n\r\n let r1 = circle1.r;\r\n let r2 = circle2.r;\r\n\r\n // Degenerated circle\r\n if (Flatten.Utils.EQ_0(r1) || Flatten.Utils.EQ_0(r2))\r\n return ip;\r\n\r\n // In case of equal circles return one leftmost point\r\n if (Flatten.Utils.EQ_0(vec.x) && Flatten.Utils.EQ_0(vec.y) && Flatten.Utils.EQ(r1, r2)) {\r\n ip.push(circle1.pc.translate(-r1, 0));\r\n return ip;\r\n }\r\n\r\n let dist = circle1.pc.distanceTo(circle2.pc)[0];\r\n\r\n if (Flatten.Utils.GT(dist, r1 + r2)) // circles too far, no intersections\r\n return ip;\r\n\r\n if (Flatten.Utils.LT(dist, Math.abs(r1 - r2))) // one circle is contained within another, no intersections\r\n return ip;\r\n\r\n // Normalize vector.\r\n vec.x /= dist;\r\n vec.y /= dist;\r\n\r\n let pt;\r\n\r\n // Case of touching from outside or from inside - single intersection point\r\n // TODO: check this specifically not sure if correct\r\n if (Flatten.Utils.EQ(dist, r1 + r2) || Flatten.Utils.EQ(dist, Math.abs(r1 - r2))) {\r\n pt = circle1.pc.translate(r1*vec.x, r1*vec.y);\r\n ip.push(pt);\r\n return ip;\r\n }\r\n\r\n // Case of two intersection points\r\n\r\n // Distance from first center to center of common chord:\r\n // a = (r1^2 - r2^2 + d^2) / 2d\r\n // Separate for better accuracy\r\n let a = (r1*r1)/(2*dist) - (r2*r2)/(2*dist) + dist/2;\r\n\r\n let mid_pt = circle1.pc.translate(a*vec.x, a*vec.y);\r\n let h = Math.sqrt(r1*r1 - a*a);\r\n // let norm;\r\n\r\n // norm = vec.rotate90CCW().multiply(h);\r\n pt = mid_pt.translate(vec.rotate90CCW().multiply(h));\r\n ip.push(pt);\r\n\r\n // norm = vec.rotate90CW();\r\n pt = mid_pt.translate(vec.rotate90CW().multiply(h));\r\n ip.push(pt);\r\n\r\n return ip;\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg circle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillOpacity, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n<circle cx=\"${this.pc.x}\" cy=\"${this.pc.y}\" r=\"${this.r}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" fill-opacity=\"${fillOpacity || 1.0}\" ${id_str} ${class_str} />`;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"circle\"});\r\n }\r\n };\r\n\r\n /**\r\n * Shortcut to create new circle\r\n * @param args\r\n */\r\n Flatten.circle = (...args) => new Flatten.Circle(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function (Flatten) {\r\n /**\r\n * Class representing a segment\r\n * @type {Segment}\r\n */\r\n Flatten.Segment = class Segment {\r\n /**\r\n *\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * Start point\r\n * @type {Point}\r\n */\r\n this.ps = new Flatten.Point();\r\n /**\r\n * End Point\r\n * @type {Point}\r\n */\r\n this.pe = new Flatten.Point();\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Array && args[0].length == 4) {\r\n let coords = args[0];\r\n this.ps = new Flatten.Point(coords[0], coords[1]);\r\n this.pe = new Flatten.Point(coords[2], coords[3]);\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"segment\") {\r\n let {ps,pe} = args[0];\r\n this.ps = new Flatten.Point(ps.x, ps.y);\r\n this.pe = new Flatten.Point(pe.x, pe.y);\r\n return;\r\n }\r\n\r\n if (args.length == 2 && args[0] instanceof Flatten.Point && args[1] instanceof Flatten.Point) {\r\n this.ps = args[0].clone();\r\n this.pe = args[1].clone();\r\n return;\r\n }\r\n\r\n if (args.length == 4) {\r\n this.ps = new Flatten.Point(args[0], args[1]);\r\n this.pe = new Flatten.Point(args[2], args[3]);\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone copies segment and returns a new instance\r\n * @returns {Segment}\r\n */\r\n clone() {\r\n return new Flatten.Segment(this.start, this.end);\r\n }\r\n\r\n /**\r\n * Start point\r\n * @returns {Point}\r\n */\r\n get start() {\r\n return this.ps;\r\n }\r\n\r\n /**\r\n * End point\r\n * @returns {Point}\r\n */\r\n get end() {\r\n return this.pe;\r\n }\r\n\r\n\r\n /**\r\n * Returns array of start and end point\r\n * @returns [Point,Point]\r\n */\r\n get vertices() {\r\n return [this.ps.clone(), this.pe.clone()];\r\n }\r\n\r\n /**\r\n * Length of a segment\r\n * @returns {number}\r\n */\r\n get length() {\r\n return this.start.distanceTo(this.end)[0];\r\n }\r\n\r\n /**\r\n * Slope of the line - angle to axe x in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n Math.min(this.start.x, this.end.x),\r\n Math.min(this.start.y, this.end.y),\r\n Math.max(this.start.x, this.end.x),\r\n Math.max(this.start.y, this.end.y)\r\n )\r\n }\r\n\r\n /**\r\n * Returns true if equals to query segment, false otherwise\r\n * @param {Seg} seg - query segment\r\n * @returns {boolean}\r\n */\r\n equalTo(seg) {\r\n return this.ps.equalTo(seg.ps) && this.pe.equalTo(seg.pe);\r\n }\r\n\r\n /**\r\n * Returns true if segment contains point\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n return Flatten.Utils.EQ_0(this.distanceToPoint(pt));\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between segment and other shape\r\n * @param {Shape} shape - Shape of the one of supported types <br/>\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Segment.intersectSegment2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Segment.intersectSegment2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Segment.intersectSegment2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return Segment.intersectSegment2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from segment to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from segment to shape\r\n * @returns {Segment} shortest segment between segment and shape (started at segment, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2segment(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Distance.segment2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Distance.segment2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Distance.segment2segment(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.segment2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Returns unit vector in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Return unit vector in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.end, this.start);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Returns new segment with swapped start and end points\r\n * @returns {Segment}\r\n */\r\n reverse() {\r\n return new Segment(this.end, this.start);\r\n }\r\n\r\n /**\r\n * When point belongs to segment, return array of two segments split by given point,\r\n * if point is inside segment. Returns clone of this segment if query point is incident\r\n * to start or end point of the segment. Returns empty array if point does not belong to segment\r\n * @param {Point} pt Query point\r\n * @returns {Segment[]}\r\n */\r\n split(pt) {\r\n if (!this.contains(pt))\r\n return [];\r\n\r\n if (this.start.equalTo(this.end))\r\n return [this.clone()];\r\n\r\n if (this.start.equalTo(pt) || this.end.equalTo(pt))\r\n return [this];\r\n\r\n return [\r\n new Flatten.Segment(this.start, pt),\r\n new Flatten.Segment(pt, this.end)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the segment\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return new Flatten.Point((this.start.x + this.end.x)/2, (this.start.y + this.end.y)/2);\r\n }\r\n\r\n distanceToPoint(pt) {\r\n let [dist, ...rest] = Flatten.Distance.point2segment(pt, this);\r\n return dist;\r\n };\r\n\r\n definiteIntegral(ymin = 0.0) {\r\n let dx = this.end.x - this.start.x;\r\n let dy1 = this.start.y - ymin;\r\n let dy2 = this.end.y - ymin;\r\n return ( dx * (dy1 + dy2) / 2 );\r\n }\r\n\r\n /**\r\n * Returns new segment translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n return new Segment(this.ps.translate(...args), this.pe.translate(...args));\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Segment}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new segment transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Segment} - transformed segment\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n return new Segment(this.ps.transform(matrix), this.pe.transform(matrix))\r\n }\r\n\r\n /**\r\n * Returns true if segment start is equal to segment end up to DP_TOL\r\n * @returns {boolean}\r\n */\r\n isZeroLength() {\r\n return this.ps.equalTo(this.pe)\r\n }\r\n\r\n static intersectSegment2Line(seg, line) {\r\n let ip = [];\r\n\r\n // Boundary cases\r\n if (seg.ps.on(line)) {\r\n ip.push(seg.ps);\r\n }\r\n // If both ends lay on line, return two intersection points\r\n if (seg.pe.on(line) && !seg.isZeroLength()) {\r\n ip.push(seg.pe);\r\n }\r\n\r\n if (ip.length > 0) {\r\n return ip; // done, intersection found\r\n }\r\n\r\n // If zero-length segment and nothing found, return no intersections\r\n if (seg.isZeroLength()) {\r\n return ip;\r\n }\r\n\r\n // Not a boundary case, check if both points are on the same side and\r\n // hence there is no intersection\r\n if (seg.ps.leftTo(line) && seg.pe.leftTo(line) ||\r\n !seg.ps.leftTo(line) && !seg.pe.leftTo(line)) {\r\n return ip;\r\n }\r\n\r\n // Calculate intersection between lines\r\n let line1 = new Flatten.Line(seg.ps, seg.pe);\r\n return line1.intersect(line);\r\n }\r\n\r\n static intersectSegment2Segment(seg1, seg2) {\r\n let ip = [];\r\n\r\n // quick reject\r\n if (seg1.box.not_intersect(seg2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of seg1 zero length\r\n if (seg1.isZeroLength()) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Special case of seg2 zero length\r\n if (seg2.isZeroLength()) {\r\n if (seg2.ps.on(seg1)) {\r\n ip.push(seg2.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Neither seg1 nor seg2 is zero length\r\n let line1 = new Flatten.Line(seg1.ps, seg1.pe);\r\n let line2 = new Flatten.Line(seg2.ps, seg2.pe);\r\n\r\n // Check overlapping between segments in case of incidence\r\n // If segments touching, add one point. If overlapping, add two points\r\n if (line1.incidentTo(line2)) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n if (seg1.pe.on(seg2)) {\r\n ip.push(seg1.pe);\r\n }\r\n if (seg2.ps.on(seg1) && !seg2.ps.equalTo(seg1.ps) && !seg2.ps.equalTo(seg1.pe)) {\r\n ip.push(seg2.ps);\r\n }\r\n if (seg2.pe.on(seg1) && !seg2.pe.equalTo(seg1.ps) && !seg2.pe.equalTo(seg1.pe)) {\r\n ip.push(seg2.pe);\r\n }\r\n }\r\n else { /* not incident - parallel or intersect */\r\n // Calculate intersection between lines\r\n let new_ip = line1.intersect(line2);\r\n if (new_ip.length > 0 && new_ip[0].on(seg1) && new_ip[0].on(seg2)) {\r\n ip.push(new_ip[0]);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectSegment2Circle(segment, circle) {\r\n let ips = [];\r\n\r\n if (segment.box.not_intersect(circle.box)) {\r\n return ips;\r\n }\r\n\r\n // Special case of zero length segment\r\n if (segment.isZeroLength()) {\r\n let [dist,shortest_segment] = segment.ps.distanceTo(circle.pc);\r\n if (Flatten.Utils.EQ(dist, circle.r)) {\r\n ips.push(segment.ps);\r\n }\r\n return ips;\r\n }\r\n\r\n // Non zero-length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n\r\n let ips_tmp = line.intersect(circle);\r\n\r\n for (let ip of ips_tmp) {\r\n if (ip.on(segment)) {\r\n ips.push(ip);\r\n }\r\n }\r\n\r\n return ips;\r\n }\r\n\r\n static intersectSegment2Arc(segment, arc) {\r\n let ip = [];\r\n\r\n if (segment.box.not_intersect(arc.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of zero-length segment\r\n if (segment.isZeroLength()) {\r\n if (segment.ps.on(arc)) {\r\n ip.push(segment.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Non-zero length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n let ip_tmp = line.intersect(circle);\r\n\r\n for (let pt of ip_tmp) {\r\n if (pt.on(segment) && pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n\r\n }\r\n\r\n /**\r\n * Return string to draw segment in svg\r\n * @param {Object} attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n<line x1=\"${this.start.x}\" y1=\"${this.start.y}\" x2=\"${this.end.x}\" y2=\"${this.end.y}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" ${id_str} ${class_str} />`;\r\n\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"segment\"});\r\n }\r\n };\r\n\r\n /**\r\n * Shortcut method to create new segment\r\n */\r\n Flatten.segment = (...args) => new Flatten.Segment(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a circular arc\r\n * @type {Arc}\r\n */\r\n Flatten.Arc = class Arc {\r\n /**\r\n *\r\n * @param {Point} pc - arc center\r\n * @param {number} r - arc radius\r\n * @param {number} startAngle - start angle in radians from 0 to 2*PI\r\n * @param {number} endAngle - end angle in radians from 0 to 2*PI\r\n * @param {boolean} counterClockwise - arc direction, true - clockwise, false - counter clockwise\r\n */\r\n constructor(...args) {\r\n /**\r\n * Arc center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Arc radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n /**\r\n * Arc start angle in radians\r\n * @type {number}\r\n */\r\n this.startAngle = 0;\r\n /**\r\n * Arc end angle in radians\r\n * @type {number}\r\n */\r\n this.endAngle = 2*Math.PI;\r\n /**\r\n * Arc orientation\r\n * @type {boolean}\r\n */\r\n this.counterClockwise = Flatten.CCW;\r\n\r\n if (args.length == 0)\r\n return;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"arc\") {\r\n let {pc, r, startAngle, endAngle, counterClockwise} = args[0];\r\n this.pc = new Flatten.Point(pc.x, pc.y);\r\n this.r = r;\r\n this.startAngle = startAngle;\r\n this.endAngle = endAngle;\r\n this.counterClockwise = counterClockwise;\r\n return;\r\n }\r\n else {\r\n let [pc, r, startAngle, endAngle, counterClockwise] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n if (startAngle !== undefined) this.startAngle = startAngle;\r\n if (endAngle!== undefined) this.endAngle = endAngle;\r\n if (counterClockwise !== undefined) this.counterClockwise = counterClockwise;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new instance of arc\r\n * @returns {Arc}\r\n */\r\n clone() {\r\n return new Flatten.Arc(this.pc.clone(), this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Get sweep angle in radians. Sweep angle is non-negative number from 0 to 2*PI\r\n * @returns {number}\r\n */\r\n get sweep() {\r\n if (Flatten.Utils.EQ(this.startAngle, this.endAngle))\r\n return 0.0;\r\n if (Flatten.Utils.EQ(Math.abs(this.startAngle - this.endAngle), Flatten.PIx2)) {\r\n return Flatten.PIx2;\r\n }\r\n let sweep;\r\n if (this.counterClockwise) {\r\n sweep = Flatten.Utils.GT(this.endAngle, this.startAngle) ?\r\n this.endAngle - this.startAngle : this.endAngle - this.startAngle + Flatten.PIx2;\r\n } else {\r\n sweep = Flatten.Utils.GT(this.startAngle, this.endAngle) ?\r\n this.startAngle - this.endAngle : this.startAngle - this.endAngle + Flatten.PIx2;\r\n }\r\n\r\n if ( Flatten.Utils.GT(sweep, Flatten.PIx2) ) {\r\n sweep -= Flatten.PIx2;\r\n }\r\n if ( Flatten.Utils.LT(sweep, 0) ) {\r\n sweep += Flatten.PIx2;\r\n }\r\n return sweep;\r\n }\r\n\r\n /**\r\n * Get start point of arc\r\n * @returns {Point}\r\n */\r\n get start() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.startAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get end point of arc\r\n * @returns {Point}\r\n */\r\n get end() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.endAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get center of arc\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc.clone();\r\n }\r\n\r\n get vertices() {\r\n return [this.start.clone(), this.end.clone()];\r\n }\r\n\r\n /**\r\n * Get arc length\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.abs(this.sweep*this.r);\r\n }\r\n\r\n /**\r\n * Get bounding box of the arc\r\n * @returns {Box}\r\n */\r\n get box() {\r\n let func_arcs = this.breakToFunctional();\r\n let box = func_arcs.reduce( (acc, arc) => acc.merge(arc.start.box), new Flatten.Box() );\r\n box = box.merge(this.end.box);\r\n return box;\r\n }\r\n\r\n /**\r\n * Returns true if arc contains point, false otherwise\r\n * @param {Point} pt - point to test\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n // first check if point on circle (pc,r)\r\n if (!Flatten.Utils.EQ(this.pc.distanceTo(pt)[0], this.r))\r\n return false;\r\n\r\n // point on circle\r\n\r\n if (pt.equalTo(this.start))\r\n return true;\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n let test_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise);\r\n return Flatten.Utils.LE(test_arc.length, this.length);\r\n }\r\n\r\n /**\r\n * When given point belongs to arc, return array of two arcs split by this point. If points is incident\r\n * to start or end point of the arc, return clone of the arc. If point does not belong to the arcs, return\r\n * empty array.\r\n * @param {Point} pt Query point\r\n * @returns {Arc[]}\r\n */\r\n split(pt) {\r\n if (!this.contains(pt))\r\n return [];\r\n\r\n if (Flatten.Utils.EQ_0(this.sweep))\r\n return [this.clone()];\r\n\r\n if (this.start.equalTo(pt) || this.end.equalTo(pt))\r\n return [this.clone()];\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n\r\n return [\r\n new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise),\r\n new Flatten.Arc(this.pc, this.r, angle, this.endAngle, this.counterClockwise)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the arc\r\n * @returns {Point}\r\n */\r\n middle() {\r\n let endAngle = this.counterClockwise ? this.startAngle + this.sweep/2 : this.startAngle - this.sweep/2;\r\n let arc = new Flatten.Arc(this.pc, this.r, this.startAngle, endAngle, this.counterClockwise);\r\n return arc.end;\r\n }\r\n\r\n /**\r\n * Returns chord height (\"sagitta\") of the arc\r\n * @returns {number}\r\n */\r\n chordHeight() {\r\n return (1.0 - Math.cos(Math.abs(this.sweep/2.0))) * this.r;\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between arc and other shape\r\n * @param {Shape} shape Shape of the one of supported types <br/>\r\n * @returns {Points[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Circle) {\r\n return Arc.intersectArc2Circle(this, shape);\r\n }\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Arc) {\r\n return Arc.intersectArc2Arc(this, shape);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from arc to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from arc to shape\r\n * @returns {Segment} shortest segment between arc and shape (started at arc, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Distance.arc2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Distance.arc2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Distance.segment2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.arc2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Breaks arc in extreme point 0, pi/2, pi, 3*pi/2 and returns array of sub-arcs\r\n * @returns {Arcs[]}\r\n */\r\n breakToFunctional() {\r\n let func_arcs_array = [];\r\n let angles = [0, Math.PI/2, 2*Math.PI/2, 3*Math.PI/2];\r\n let pts = [\r\n this.pc.translate(this.r,0),\r\n this.pc.translate(0,this.r),\r\n this.pc.translate(-this.r,0),\r\n this.pc.translate(0,-this.r)\r\n ];\r\n\r\n // If arc contains extreme point,\r\n // create test arc started at start point and ended at this extreme point\r\n let test_arcs = [];\r\n for (let i=0; i < 4; i++) {\r\n if (pts[i].on(this)) {\r\n test_arcs.push(new Flatten.Arc(this.pc, this.r, this.startAngle, angles[i], this.counterClockwise));\r\n }\r\n }\r\n\r\n if (test_arcs.length == 0) { // arc does contain any extreme point\r\n func_arcs_array.push(this.clone());\r\n }\r\n else { // arc passes extreme point\r\n // sort these arcs by length\r\n test_arcs.sort((arc1, arc2) => arc1.length - arc2.length);\r\n\r\n for (let i = 0; i < test_arcs.length; i++) {\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n }\r\n else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n }\r\n if (!Flatten.Utils.EQ_0(new_arc.length)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n\r\n // add last sub arc\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, this.endAngle, this.counterClockwise);\r\n }\r\n else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n if (!Flatten.Utils.EQ_0(new_arc.length)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n return func_arcs_array;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the start point in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.pc, this.start);\r\n let angle = this.counterClockwise ? Math.PI/2. : -Math.PI/2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the end point in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.pc, this.end);\r\n let angle = this.counterClockwise ? -Math.PI/2. : Math.PI/2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Returns new arc with swapped start and end angles and reversed direction\r\n * @returns {Arc}\r\n */\r\n reverse() {\r\n return new Arc(this.pc, this.r, this.endAngle, this.startAngle, !this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Returns new arc translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n let arc = this.clone();\r\n arc.pc = this.pc.translate(...args);\r\n return arc;\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Arc}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new arc transformed using affine transformation matrix <br/>\r\n * Note, that non-equal scaling by x and y (matrix[0] != matrix[3]) produce illegal result\r\n * TODO: support non-equal scaling arc to ellipse or throw exception ?\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Arc}\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newStart = this.start.transform(matrix);\r\n let newEnd = this.end.transform(matrix);\r\n let newCenter = this.pc.transform(matrix);\r\n let arc = Arc.arcSE(newCenter, newStart, newEnd, this.counterClockwise);\r\n return arc;\r\n }\r\n\r\n static arcSE(center, start, end, counterClockwise) {\r\n let {vector} = Flatten;\r\n let startAngle = vector(center,start).slope;\r\n let endAngle = vector(center, end).slope;\r\n if (Flatten.Utils.EQ(startAngle, endAngle)) {\r\n endAngle += 2*Math.PI;\r\n counterClockwise = true;\r\n }\r\n let r = vector(center, start).length;\r\n\r\n return new Arc(center, r, startAngle, endAngle, counterClockwise);\r\n }\r\n\r\n static intersectArc2Arc(arc1, arc2) {\r\n var ip = [];\r\n\r\n if (arc1.box.not_intersect(arc2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case: overlapping arcs\r\n // May return up to 4 intersection points\r\n if (arc1.pc.equalTo(arc2.pc) && Flatten.Utils.EQ(arc1.r, arc2.r)) {\r\n let pt;\r\n\r\n pt = arc1.start;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc1.end;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc2.start;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n pt = arc2.end;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = new Flatten.Circle(arc1.pc, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.pc, arc2.r);\r\n let ip_tmp = circle1.intersect(circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc1) && pt.on(arc2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectArc2Circle(arc, circle) {\r\n let ip = [];\r\n\r\n if (arc.box.not_intersect(circle.box)) {\r\n return ip;\r\n }\r\n\r\n // Case when arc center incident to circle center\r\n // Return arc's end points as 2 intersection points\r\n if (circle.pc.equalTo(arc.pc) && Flatten.Utils.EQ(circle.r, arc.r)) {\r\n ip.push(arc.start);\r\n ip.push(arc.end);\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = circle;\r\n let circle2 = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = circle1.intersect(circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n\r\n definiteIntegral(ymin=0) {\r\n let f_arcs = this.breakToFunctional();\r\n let area = f_arcs.reduce( (acc, arc) => acc + arc.circularSegmentDefiniteIntegral(ymin), 0.0 );\r\n return area;\r\n }\r\n\r\n circularSegmentDefiniteIntegral(ymin) {\r\n let line = new Flatten.Line(this.start, this.end);\r\n let onLeftSide = this.pc.leftTo(line);\r\n let segment = new Flatten.Segment(this.start, this.end);\r\n let areaTrapez = segment.definiteIntegral(ymin);\r\n let areaCircularSegment = this.circularSegmentArea();\r\n let area = onLeftSide ? areaTrapez - areaCircularSegment : areaTrapez + areaCircularSegment;\r\n return area;\r\n }\r\n\r\n circularSegmentArea() {\r\n return (0.5*this.r*this.r*(this.sweep - Math.sin(this.sweep)))\r\n }\r\n\r\n /**\r\n * Return string to draw arc in svg\r\n * @param {Object} attrs - an object with attributes of svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let largeArcFlag = this.sweep <= Math.PI ? \"0\" : \"1\";\r\n let sweepFlag = this.counterClockwise ? \"1\" : \"0\";\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n if (Flatten.Utils.EQ(this.sweep, 2*Math.PI)) {\r\n let circle = new Flatten.Circle(this.pc, this.r);\r\n return circle.svg(attrs);\r\n }\r\n else {\r\n return `\\n<path d=\"M${this.start.x},${this.start.y}\r\n A${this.r},${this.r} 0 ${largeArcFlag},${sweepFlag} ${this.end.x},${this.end.y}\"\r\n stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" ${id_str} ${class_str} />`\r\n }\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"arc\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create arc equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.arc = (...args) => new Flatten.Arc(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/7/2017.\r\n */\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class Box represent bounding box of the shape\r\n * @type {Box}\r\n */\r\n Flatten.Box = class Box {\r\n /**\r\n *\r\n * @param {number} xmin - minimal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n constructor(xmin=undefined, ymin=undefined, xmax=undefined, ymax=undefined) {\r\n /**\r\n * Minimal x coordinate\r\n * @type {number}\r\n */\r\n this.xmin = xmin;\r\n /**\r\n * Minimal y coordinate\r\n * @type {number}\r\n */\r\n this.ymin = ymin;\r\n /**\r\n * Maximal x coordinate\r\n * @type {number}\r\n */\r\n this.xmax = xmax;\r\n /**\r\n * Maximal y coordinate\r\n * @type {number}\r\n */\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Clones and returns new instance of box\r\n * @returns {Box}\r\n */\r\n clone() {\r\n return new Box(this.xmin, this.ymin, this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property low need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get low() {\r\n return new Flatten.Point(this.xmin, this.ymin);\r\n }\r\n\r\n /**\r\n * Property high need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get high() {\r\n return new Flatten.Point(this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property max returns the box itself !\r\n * @returns {Box}\r\n */\r\n get max() {\r\n return this.clone();\r\n }\r\n\r\n /**\r\n * Return center of the box\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return new Flatten.Point( (this.xmin + this.xmax)/2, (this.ymin + this.ymax)/2 );\r\n }\r\n\r\n /**\r\n * Returns true if not intersected with other box\r\n * @param {Box} other_box - other box to test\r\n * @returns {boolean}\r\n */\r\n not_intersect(other_box) {\r\n return (\r\n this.xmax < other_box.xmin ||\r\n this.xmin > other_box.xmax ||\r\n this.ymax < other_box.ymin ||\r\n this.ymin > other_box.ymax\r\n );\r\n }\r\n\r\n /**\r\n * Returns true if intersected with other box\r\n * @param {Box} other_box - Query box\r\n * @returns {boolean}\r\n */\r\n intersect(other_box) {\r\n return !this.not_intersect(other_box);\r\n }\r\n\r\n /**\r\n * Returns new box merged with other box\r\n * @param {Box} other_box - Other box to merge with\r\n * @returns {Box}\r\n */\r\n merge(other_box) {\r\n return new Box(\r\n this.xmin === undefined ? other_box.xmin : Math.min(this.xmin, other_box.xmin),\r\n this.ymin === undefined ? other_box.ymin : Math.min(this.ymin, other_box.ymin),\r\n this.xmax === undefined ? other_box.xmax : Math.max(this.xmax, other_box.xmax),\r\n this.ymax === undefined ? other_box.ymax : Math.max(this.ymax, other_box.ymax)\r\n );\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between two boxes. Need for interval index\r\n * @param {Box} other_box - other box\r\n * @returns {boolean} - true if this box less than other box, false otherwise\r\n */\r\n less_than(other_box) {\r\n if (this.low.lessThan(other_box.low))\r\n return true;\r\n if (this.low.equalTo(other_box.low) && this.high.lessThan(other_box.high))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if this box is equal to other box, false otherwise\r\n * @param {Box} other_box - query box\r\n * @returns {boolean}\r\n */\r\n equal_to(other_box) {\r\n return (this.low.equalTo(other_box.low) && this.high.equalTo(other_box.high));\r\n }\r\n\r\n output() {\r\n return this.clone();\r\n }\r\n\r\n maximal_val(box1, box2) {\r\n // return pt1.lessThan(pt2) ? pt2.clone() : pt1.clone();\r\n return box1.merge(box2);\r\n }\r\n\r\n val_less_than(pt1, pt2) {\r\n return pt1.lessThan(pt2);\r\n }\r\n\r\n /**\r\n * Set new values to the box object\r\n * @param {number} xmin - miminal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n set(xmin, ymin, xmax, ymax) {\r\n this.xmin = xmin;\r\n this.ymin = ymin;\r\n this.xmax = xmax;\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg rectangle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n let width = this.xmax - this.xmin;\r\n let height = this.ymax - this.ymin;\r\n\r\n return `\\n<rect x=\"${this.xmin}\" y=\"${this.ymin}\" width=${width} height=${height} stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" ${id_str} ${class_str} />`;\r\n };\r\n };\r\n\r\n /**\r\n * Shortcut to create new circle\r\n * @param args\r\n * @returns {Box}\r\n */\r\n Flatten.box = (...args) => new Flatten.Box(...args);\r\n\r\n};\r\n","/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing an edge of polygon. Edge shape may be Segment or Arc.\r\n * Each edge contains references to the next and previous edges in the face of the polygon.\r\n *\r\n * @type {Edge}\r\n */\r\n Flatten.Edge = class Edge {\r\n /**\r\n * Construct new instance of edge\r\n * @param {Shape} shape Shape of type Segment of Arc\r\n */\r\n constructor(shape) {\r\n /**\r\n * Shape of the edge: Segment or Arc\r\n */\r\n this.shape = shape;\r\n /**\r\n * Pointer to the next edge in the face\r\n */\r\n this.next;\r\n /**\r\n * Pointer to the previous edge in the face\r\n */\r\n this.prev;\r\n /**\r\n * Pointer to the face containing this edge\r\n * @type {Face}\r\n */\r\n this.face;\r\n /**\r\n * \"Arc distance\" from the face start\r\n * @type {number}\r\n */\r\n this.arc_length = 0;\r\n /**\r\n * Start inclusion flag (inside/outside/boundary)\r\n * @type {Boolean}\r\n */\r\n this.bvStart = undefined;\r\n /**\r\n * End inclusion flag (inside/outside/boundary)\r\n * @type {Boolean}\r\n */\r\n this.bvEnd = undefined;\r\n /**\r\n * Edge inclusion flag (Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY)\r\n * @type {*}\r\n */\r\n this.bv = undefined;\r\n /**\r\n * Overlap flag for boundary edge (Flatten.OVERLAP_SAME/Flatten.OVERLAP_OPPOSITE)\r\n * @type {*}\r\n */\r\n this.overlap = undefined;\r\n }\r\n\r\n /**\r\n * Get edge start point\r\n */\r\n get start() {\r\n return this.shape.start;\r\n }\r\n\r\n /**\r\n * Get edge end point\r\n */\r\n get end() {\r\n return this.shape.end;\r\n }\r\n\r\n /**\r\n * Get edge length\r\n */\r\n get length() {\r\n return this.shape.length;\r\n }\r\n\r\n /**\r\n * Get bounding box of the edge\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return this.shape.box;\r\n }\r\n\r\n isSegment() {\r\n return this.shape instanceof Flatten.Segment;\r\n }\r\n\r\n isArc() {\r\n return this.shape instanceof Flatten.Arc;\r\n }\r\n /**\r\n * Get middle point of the edge\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return this.shape.middle();\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the edge, false otherwise\r\n * @param {Point} pt - test point\r\n */\r\n contains(pt) {\r\n return this.shape.contains(pt);\r\n }\r\n\r\n /**\r\n * Set inclusion flag of the edge with respect to another polygon\r\n * Inclusion flag is one of Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY\r\n * @param polygon\r\n */\r\n setInclusion(polygon) {\r\n if (this.bv !== undefined) return this.bv;\r\n\r\n if (this.bvStart === undefined) {\r\n this.bvStart = Flatten.ray_shoot(polygon, this.start);\r\n }\r\n if (this.bvEnd === undefined) {\r\n this.bvEnd = Flatten.ray_shoot(polygon, this.end);\r\n }\r\n /* At least one end outside - the whole edge outside */\r\n if (this.bvStart === Flatten.OUTSIDE || this.bvEnd == Flatten.OUTSIDE) {\r\n this.bv = Flatten.OUTSIDE;\r\n }\r\n /* At least one end inside - the whole edge inside */\r\n else if (this.bvStart === Flatten.INSIDE || this.bvEnd == Flatten.INSIDE) {\r\n this.bv = Flatten.INSIDE;\r\n }\r\n /* Both are boundary - check the middle point */\r\n else {\r\n let bvMiddle = Flatten.ray_shoot(polygon, this.middle());\r\n this.bv = bvMiddle;\r\n }\r\n return this.bv;\r\n }\r\n\r\n /**\r\n * Set overlapping between two coincident boundary edges\r\n * Overlapping flag is one of Flatten.OVERLAP_SAME or Flatten.OVERLAP_OPPOSITE\r\n * @param edge\r\n */\r\n setOverlap(edge) {\r\n let flag = undefined;\r\n let shape1 = this.shape;\r\n let shape2 = edge.shape;\r\n\r\n if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end)) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start)) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n else if (shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Arc) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && /*shape1.counterClockwise === shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && /*shape1.counterClockwise !== shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n else if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Arc ||\r\n shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n\r\n /* Do not update overlap flag if already set on previous chain */\r\n if (this.overlap === undefined) this.overlap = flag;\r\n if (edge.overlap === undefined) edge.overlap = flag;\r\n }\r\n\r\n svg() {\r\n if (this.shape instanceof Flatten.Segment) {\r\n return ` L${this.shape.end.x},${this.shape.end.y}`;\r\n }\r\n else if (this.shape instanceof Flatten.Arc) {\r\n let arc = this.shape;\r\n let largeArcFlag;\r\n let sweepFlag = arc.counterClockwise ? \"1\" : \"0\";\r\n\r\n // Draw full circe arc as special case: split it into two half-circles\r\n if (Flatten.Utils.EQ(arc.sweep, 2*Math.PI)) {\r\n let sign = arc.counterClockwise ? 1 : -1;\r\n let halfArc1 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle, arc.startAngle + sign*Math.PI, arc.counterClockwise);\r\n let halfArc2 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle + sign*Math.PI, arc.endAngle, arc.counterClockwise);\r\n\r\n largeArcFlag = \"0\";\r\n\r\n return ` A${halfArc1.r},${halfArc1.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc1.end.x},${halfArc1.end.y}\r\n A${halfArc2.r},${halfArc2.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc2.end.x},${halfArc2.end.y}`\r\n }\r\n else {\r\n largeArcFlag = arc.sweep <= Math.PI ? \"0\" : \"1\";\r\n\r\n return ` A${arc.r},${arc.r} 0 ${largeArcFlag},${sweepFlag} ${arc.end.x},${arc.end.y}`;\r\n }\r\n }\r\n }\r\n\r\n toJSON() {\r\n return this.shape.toJSON();\r\n }\r\n };\r\n};","/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function (Flatten) {\r\n let {Point, point, Segment, segment, Arc, Box, Edge, Circle} = Flatten;\r\n\r\n /**\r\n * Class representing a face (closed loop) in a [polygon]{@link Flatten.Polygon} object.\r\n * Face is a circular bidirectional linked list of [edges]{@link Flatten.Edge}.\r\n * Face object cannot be instantiated with a constructor.\r\n * Instead, use [polygon.addFace()]{@link Flatten.Polygon#addFace} method.\r\n * <br/>\r\n * Note, that face only set entry point to the linked list of edges but does not contain edges by itself.\r\n * Container of edges is a property of the polygon object. <br/>\r\n *\r\n * @example\r\n * // Face implements \"next\" iterator which enables to iterate edges in for loop:\r\n * for (let edge of face) {\r\n * console.log(edge.shape.length) // do something\r\n * }\r\n *\r\n * // Instead, it is possible to iterate edges as linked list, starting from face.first:\r\n * let edge = face.first;\r\n * do {\r\n * console.log(edge.shape.length); // do something\r\n * edge = edge.next;\r\n * } while (edge != face.first)\r\n */\r\n Flatten.Face = class Face {\r\n constructor(polygon, ...args) {\r\n /**\r\n * Reference to the first edge in face\r\n */\r\n this.first;\r\n /**\r\n * Reference to the last edge in face\r\n */\r\n this.last;\r\n\r\n this._box = undefined; // new Box();\r\n this._orientation = undefined;\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n /* If passed an array it supposed to be:\r\n 1) array of shapes that performs close loop or\r\n 2) array of points that performs set of vertices\r\n */\r\n if (args.length == 1) {\r\n if (args[0] instanceof Array) {\r\n // let argsArray = args[0];\r\n let shapes = args[0]; // argsArray[0];\r\n if (shapes.length == 0)\r\n return;\r\n\r\n if (shapes.every((shape) => {\r\n return shape instanceof Point\r\n })) {\r\n let segments = Face.points2segments(shapes);\r\n this.shapes2face(polygon.edges, segments);\r\n }\r\n else if (shapes.every((shape) => {\r\n return (shape instanceof Segment || shape instanceof Arc)\r\n })) {\r\n this.shapes2face(polygon.edges, shapes);\r\n }\r\n // this is from JSON.parse object\r\n else if (shapes.every((shape) => {\r\n return (shape.name === \"segment\" || shape.name === \"arc\")\r\n })) {\r\n let flattenShapes = [];\r\n for (let shape of shapes) {\r\n let flattenShape;\r\n if (shape.name === \"segment\") {\r\n flattenShape = new Segment(shape);\r\n }\r\n else {\r\n flattenShape = new Arc(shape);\r\n }\r\n flattenShapes.push(flattenShape);\r\n }\r\n this.shapes2face(polygon.edges, flattenShapes);\r\n }\r\n }\r\n /* Create new face and copy edges into polygon.edges set */\r\n else if (args[0] instanceof Face) {\r\n let face = args[0];\r\n this.first = face.first;\r\n this.last = face.last;\r\n for (let edge of face) {\r\n polygon.edges.add(edge);\r\n }\r\n }\r\n /* Instantiate face from circle circle in CCW orientation */\r\n else if (args[0] instanceof Circle) {\r\n this.shapes2face(polygon.edges, [args[0].toArc(Flatten.CCW)]);\r\n }\r\n /* Instantiate face from a box in CCW orientation */\r\n else if (args[0] instanceof Box) {\r\n let box = args[0];\r\n this.shapes2face(polygon.edges, [\r\n segment(point(box.xmin, box.ymin), point(box.xmax, box.ymin)),\r\n segment(point(box.xmax, box.ymin), point(box.xmax, box.ymax)),\r\n segment(point(box.xmax, box.ymax), point(box.xmin, box.ymax)),\r\n segment(point(box.xmin, box.ymax), point(box.xmin, box.ymin))\r\n ]);\r\n }\r\n }\r\n /* If passed two edges, consider them as start and end of the face loop */\r\n /* THIS METHOD WILL BE USED BY BOOLEAN OPERATIONS */\r\n /* Assume that edges already copied to polygon.edges set in the clip algorithm !!! */\r\n if (args.length == 2 && args[0] instanceof Edge && args[1] instanceof Edge) {\r\n this.first = args[0]; // first edge in face or undefined\r\n this.last = args[1]; // last edge in face or undefined\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n this.setArcLength();\r\n /*\r\n let edge = this.first;\r\n edge.arc_length = 0;\r\n edge = edge.next;\r\n while (edge !== this.first) {\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n edge = edge.next;\r\n }\r\n */\r\n\r\n // this.box = this.getBox();\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n }\r\n\r\n [Symbol.iterator]() {\r\n let edge = undefined;\r\n return {\r\n next: () => {\r\n let value = edge ? edge : this.first;\r\n let done = this.first ? (edge ? edge === this.first : false) : true;\r\n edge = value ? value.next : undefined;\r\n return {value: value, done: done};\r\n }\r\n };\r\n };\r\n\r\n /**\r\n * Return array of edges from first to last\r\n * @returns {Array}\r\n */\r\n get edges() {\r\n let face_edges = [];\r\n for (let edge of this) {\r\n face_edges.push(edge);\r\n }\r\n return face_edges;\r\n }\r\n\r\n /**\r\n * Return number of edges in the face\r\n * @returns {number}\r\n */\r\n get size() {\r\n let counter = 0;\r\n for (let edge of this) {\r\n counter++;\r\n }\r\n return counter;\r\n }\r\n\r\n /**\r\n * Return bounding box of the face\r\n * @returns {Box}\r\n */\r\n get box() {\r\n if (this._box === undefined) {\r\n let box = new Flatten.Box();\r\n for (let edge of this) {\r\n box = box.merge(edge.box);\r\n }\r\n this._box = box;\r\n }\r\n return this._box;\r\n }\r\n\r\n static points2segments(points) {\r\n let segments = [];\r\n for (let i = 0; i < points.length; i++) {\r\n segments.push(new Segment(points[i], points[(i + 1) % points.length]));\r\n }\r\n return segments;\r\n }\r\n\r\n shapes2face(edges, shapes) {\r\n for (let shape of shapes) {\r\n let edge = new Edge(shape);\r\n this.append(edges, edge);\r\n // this.box = this.box.merge(shape.box);\r\n // edges.add(edge);\r\n }\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n\r\n /**\r\n * Returns true if face is empty, false otherwise\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return (this.first === undefined && this.last === undefined)\r\n }\r\n\r\n /**\r\n * Append given edge after the last edge (and before the first edge). <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} edge - Edge to be appended to the linked list\r\n */\r\n append(edges, edge) {\r\n if (this.first === undefined) {\r\n edge.prev = edge;\r\n edge.next = edge;\r\n this.first = edge;\r\n this.last = edge;\r\n edge.arc_length = 0;\r\n }\r\n else {\r\n // append to end\r\n edge.prev = this.last;\r\n this.last.next = edge;\r\n\r\n // update edge to be last\r\n this.last = edge;\r\n\r\n // restore circular links\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n edge.face = this;\r\n\r\n edges.add(edge); // Add new edges into edges container\r\n }\r\n\r\n /**\r\n * Insert edge newEdge into the linked list after the edge edgeBefore <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} newEdge - Edge to be inserted into linked list\r\n * @param {Edge} edgeBefore - Edge to insert newEdge after it\r\n */\r\n insert(edges, newEdge, edgeBefore) {\r\n if (this.first === undefined) {\r\n newEdge.prev = newEdge;\r\n newEdge.next = newEdge;\r\n this.first = newEdge;\r\n this.last = newEdge;\r\n }\r\n else {\r\n /* set links to new edge */\r\n let edgeAfter = edgeBefore.next;\r\n edgeBefore.next = newEdge;\r\n edgeAfter.prev = newEdge;\r\n\r\n /* set links from new edge */\r\n newEdge.prev = edgeBefore;\r\n newEdge.next = edgeAfter;\r\n\r\n /* extend chain if new edge added after last edge */\r\n if (this.last === edgeBefore)\r\n this.first = newEdge;\r\n }\r\n newEdge.face = this;\r\n\r\n // set arc length\r\n if (newEdge.prev === this.last) {\r\n newEdge.arc_length = 0;\r\n }\r\n else {\r\n newEdge.arc_length = newEdge.prev.arc_length + newEdge.prev.length;\r\n }\r\n\r\n edges.add(newEdge); // Add new edges into edges container\r\n }\r\n\r\n /**\r\n * Remove the given edge from the linked list of the face <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} edge - Edge to be removed\r\n */\r\n remove(edges, edge) {\r\n // special case if last edge removed\r\n if (edge === this.first && edge === this.last) {\r\n this.first = undefined;\r\n this.last = undefined;\r\n }\r\n else {\r\n // update linked list\r\n edge.prev.next = edge.next;\r\n edge.next.prev = edge.prev;\r\n // update first if need\r\n if (edge === this.first) {\r\n this.first = edge.next;\r\n }\r\n // update last if need\r\n if (edge === this.last) {\r\n this.last = edge.prev;\r\n }\r\n }\r\n edges.delete(edge); // delete from PlanarSet of edges and update index\r\n }\r\n\r\n /**\r\n * Reverse orientation of the face: first edge become last and vice a verse,\r\n * all edges starts and ends swapped, direction of arcs inverted.\r\n */\r\n reverse() {\r\n // collect edges in revert order with reverted shapes\r\n let edges = [];\r\n let edge_tmp = this.last;\r\n do {\r\n // reverse shape\r\n edge_tmp.shape = edge_tmp.shape.reverse();\r\n edges.push(edge_tmp);\r\n edge_tmp = edge_tmp.prev;\r\n } while (edge_tmp !== this.last);\r\n\r\n // restore linked list\r\n this.first = undefined;\r\n this.last = undefined;\r\n for (let edge of edges) {\r\n if (this.first === undefined) {\r\n edge.prev = edge;\r\n edge.next = edge;\r\n this.first = edge;\r\n this.last = edge;\r\n edge.arc_length = 0;\r\n }\r\n else {\r\n // append to end\r\n edge.prev = this.last;\r\n this.last.next = edge;\r\n\r\n // update edge to be last\r\n this.last = edge;\r\n\r\n // restore circular links\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n }\r\n\r\n // Recalculate orientation, if set\r\n if (this._orientation !== undefined) {\r\n this._orientation = undefined;\r\n this._orientation = this.orientation();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Set arc_length property for each of the edges in the face.\r\n * Arc_length of the edge it the arc length from the first edge of the face\r\n */\r\n setArcLength() {\r\n for (let edge of this) {\r\n if (edge === this.first) {\r\n edge.arc_length = 0.0;\r\n }\r\n else {\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n edge.face = this;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the absolute value of the area of the face\r\n * @returns {number}\r\n */\r\n area() {\r\n return Math.abs(this.signedArea());\r\n }\r\n\r\n /**\r\n * Returns signed area of the simple face.\r\n * Face is simple if it has no self intersections that change its orientation.\r\n * Then the area will be positive if the orientation of the face is clockwise,\r\n * and negative if orientation is counterclockwise.\r\n * It may be zero if polygon is degenerated.\r\n * @returns {number}\r\n */\r\n signedArea() {\r\n let sArea = 0;\r\n let ymin = this.box.ymin;\r\n for (let edge of this) {\r\n sArea += edge.shape.definiteIntegral(ymin);\r\n }\r\n return sArea;\r\n }\r\n\r\n /**\r\n * Return face orientation: one of Flatten.ORIENTATION.CCW, Flatten.ORIENTATION.CW, Flatten.ORIENTATION.NOT_ORIENTABLE <br/>\r\n * According to Green theorem the area of a closed curve may be calculated as double integral,\r\n * and the sign of the integral will be defined by the direction of the curve.\r\n * When the integral (\"signed area\") will be negative, direction is counter clockwise,\r\n * when positive - clockwise and when it is zero, polygon is not orientable.\r\n * See {@link https://mathinsight.org/greens_theorem_find_area}\r\n * @returns {number}\r\n */\r\n orientation() {\r\n if (this._orientation === undefined) {\r\n let area = this.signedArea();\r\n if (Flatten.Utils.EQ_0(area)) {\r\n this._orientation = Flatten.ORIENTATION.NOT_ORIENTABLE;\r\n }\r\n else if (Flatten.Utils.LT(area, 0)) {\r\n this._orientation = Flatten.ORIENTATION.CCW;\r\n }\r\n else {\r\n this._orientation = Flatten.ORIENTATION.CW;\r\n }\r\n }\r\n return this._orientation;\r\n }\r\n\r\n /**\r\n * Returns true if face of the polygon is simple (no self-intersection points found)\r\n * NOTE: this method is incomplete because it doe not exclude touching points\r\n * Real self intersection inverts orientation of the polygon.\r\n * But this is also good enough for the demonstration of the idea\r\n * @param {Edges} edges - reference to polygon.edges to provide search index\r\n * @returns {boolean}\r\n */\r\n isSimple(edges) {\r\n let ip = Face.getSelfIntersections(this, edges, true);\r\n return ip.length == 0;\r\n }\r\n\r\n static getSelfIntersections(face, edges, exitOnFirst = false) {\r\n let int_points = [];\r\n\r\n // calculate intersections\r\n for (let edge1 of face) {\r\n\r\n // request edges of polygon in the box of edge1\r\n let resp = edges.search(edge1.box);\r\n\r\n // for each edge2 in response\r\n for (let edge2 of resp) {\r\n\r\n // Skip itself\r\n if (edge1 === edge2)\r\n continue;\r\n\r\n // Skip next and previous edge if both are segment (if one of them arc - calc intersection)\r\n if (edge1.shape instanceof Flatten.Segment && edge2.shape instanceof Flatten.Segment &&\r\n (edge1.next === edge2 || edge1.prev === edge2))\r\n continue;\r\n\r\n // calculate intersections between edge1 and edge2\r\n let ip = edge1.shape.intersect(edge2.shape);\r\n\r\n // for each intersection point\r\n for (let pt of ip) {\r\n\r\n // skip start-end connections\r\n if (pt.equalTo(edge1.start) && pt.equalTo(edge2.end) && edge2 === edge1.prev)\r\n continue;\r\n if (pt.equalTo(edge1.end) && pt.equalTo(edge2.start) && edge2 === edge1.next)\r\n continue;\r\n\r\n int_points.push(pt);\r\n\r\n if (exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n\r\n }\r\n return int_points;\r\n }\r\n\r\n toJSON() {\r\n return this.edges.map(edge => edge.toJSON());\r\n }\r\n\r\n /**\r\n * Returns string to be assigned to \"d\" attribute inside defined \"path\"\r\n * @returns {string}\r\n */\r\n svg() {\r\n let svgStr = `\\nM${this.first.start.x},${this.first.start.y}`;\r\n for (let edge of this) {\r\n svgStr += edge.svg();\r\n }\r\n svgStr += ` z`;\r\n return svgStr;\r\n }\r\n\r\n };\r\n};","\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Point, Segment, Line, Circle, Arc, Box, Vector} = Flatten;\r\n /**\r\n * Class representing a horizontal ray, used by ray shooting algorithm\r\n * @type {Ray}\r\n */\r\n Flatten.Ray = class Ray {\r\n /**\r\n * Construct ray by setting start point\r\n * @param {Point} pt - start point\r\n */\r\n constructor(...args) {\r\n this.pt = new Point();\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Point) {\r\n this.pt = args[0].clone();\r\n return;\r\n }\r\n\r\n if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n this.pt = new Point(args[0], args[1]);\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Returns copied instance of the ray object\r\n * @returns {Ray}\r\n */\r\n clone() {\r\n return new Ray(this.pt);\r\n }\r\n\r\n /**\r\n * Returns half-infinite bounding box of the ray\r\n * @returns {Box} - bounding box\r\n */\r\n get box() {\r\n return new Box(\r\n this.pt.x,\r\n this.pt.y,\r\n Number.POSITIVE_INFINITY,\r\n this.pt.y\r\n )\r\n }\r\n\r\n /**\r\n * Return ray start point\r\n * @returns {Point} - ray start point\r\n */\r\n get start() {\r\n return this.pt;\r\n }\r\n\r\n /**\r\n * Return ray normal vector (0,1) - horizontal ray\r\n * @returns {Vector} - ray normal vector\r\n */\r\n get norm() {\r\n return new Vector(0,1);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between ray and segment or arc\r\n * @param {Segment|Arc} - Shape to intersect with ray\r\n * @returns {Array} array of intersection points\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Segment) {\r\n return this.intersectRay2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Arc) {\r\n return this.intersectRay2Arc(this, shape);\r\n }\r\n }\r\n\r\n intersectRay2Segment(ray, segment) {\r\n let ip = [];\r\n\r\n if (ray.box.not_intersect(segment.box)) {\r\n return ip;\r\n }\r\n\r\n let line = new Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(segment);\r\n\r\n for (let pt of ip_tmp) {\r\n if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n /* If there were two intersection points between line and ray,\r\n and now there is exactly one left, it means ray starts between these points\r\n and there is another intersection point - start of the ray */\r\n if (ip_tmp.length == 2 && ip.length == 1 && ray.start.on(line)) {\r\n ip.push(ray.start);\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n intersectRay2Arc(ray, arc) {\r\n let ip = [];\r\n\r\n if (ray.box.not_intersect(arc.box)) {\r\n return ip;\r\n }\r\n\r\n let line = new Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(arc);\r\n\r\n for (let pt of ip_tmp) {\r\n if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n };\r\n\r\n Flatten.ray = (...args) => new Flatten.Ray(...args);\r\n};","\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Polygon, Point, Segment, Arc, Line, Ray} = Flatten;\r\n\r\n Flatten.ray_shoot = function(polygon, point) {\r\n let contains = undefined;\r\n\r\n // if (!(polygon instanceof Polygon && point instanceof Point)) {\r\n // throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n // }\r\n\r\n // 1. Quick reject\r\n if (polygon.box.not_intersect(point.box)) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n let ray = new Ray(point);\r\n let line = new Line(ray.pt, ray.norm);\r\n\r\n // 2. Locate relevant edges of the polygon\r\n let resp_edges = polygon.edges.search(ray.box);\r\n\r\n if (resp_edges.length == 0) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n // 3. Calculate intersections\r\n let intersections = [];\r\n for (let edge of resp_edges) {\r\n for (let ip of ray.intersect(edge.shape)) {\r\n\r\n // If intersection is equal to query point then point lays on boundary\r\n if (ip.equalTo(point)) {\r\n return Flatten.BOUNDARY;\r\n }\r\n\r\n intersections.push({\r\n pt: ip,\r\n edge: edge\r\n });\r\n }\r\n }\r\n\r\n // 4. Sort intersection in x-ascending order\r\n intersections.sort( (i1, i2) => {\r\n if (Flatten.Utils.LT(i1.pt.x, i2.pt.x)) {\r\n return -1;\r\n }\r\n if (Flatten.Utils.GT(i1.pt.x, i2.pt.x)) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n // 5. Count real intersections, exclude touching\r\n let counter = 0;\r\n\r\n for (let i=0; i < intersections.length; i++) {\r\n let intersection = intersections[i];\r\n if (intersection.pt.equalTo(intersection.edge.shape.start)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i-1].pt) &&\r\n intersection.edge.prev === intersections[i-1].edge) {\r\n continue;\r\n }\r\n let prev_edge = intersection.edge.prev;\r\n while (Flatten.Utils.EQ_0(prev_edge.length)) {\r\n prev_edge = prev_edge.prev;\r\n }\r\n let prev_tangent = prev_edge.shape.tangentInEnd();\r\n let prev_point = intersection.pt.translate(prev_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInStart();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let prev_on_the_left = prev_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ( (prev_on_the_left && !cur_on_the_left) || (!prev_on_the_left && cur_on_the_left) ) {\r\n counter++;\r\n }\r\n }\r\n else if (intersection.pt.equalTo(intersection.edge.shape.end)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i-1].pt) &&\r\n intersection.edge.next === intersections[i-1].edge) {\r\n continue;\r\n }\r\n let next_edge = intersection.edge.next;\r\n while (Flatten.Utils.EQ_0(next_edge.length)) {\r\n next_edge = next_edge.next;\r\n }\r\n let next_tangent = next_edge.shape.tangentInStart();\r\n let next_point = intersection.pt.translate(next_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInEnd();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let next_on_the_left = next_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ( (next_on_the_left && !cur_on_the_left) || (!next_on_the_left && cur_on_the_left) ) {\r\n counter++;\r\n }\r\n }\r\n else { /* intersection point is not a coincident with a vertex */\r\n if (intersection.edge.shape instanceof Segment) {\r\n counter++;\r\n }\r\n else {\r\n /* Check if ray does not touch the curve in the extremal (top or bottom) point */\r\n let box = intersection.edge.shape.box;\r\n if ( !(Flatten.Utils.EQ(intersection.pt.y, box.ymin) ||\r\n Flatten.Utils.EQ(intersection.pt.y, box.ymax)) ) {\r\n counter++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 6. Odd or even?\r\n contains = counter % 2 == 1 ? Flatten.INSIDE : Flatten.OUTSIDE;\r\n\r\n return contains;\r\n };\r\n};","/**\r\n * Created by Alex Bol on 3/15/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Edge, Face, PlanarSet, Box} = Flatten;\r\n let {ray_shoot} = Flatten;\r\n /**\r\n * Class representing a polygon.<br/>\r\n * Polygon in FlattenJS is a multipolygon comprised from a set of [faces]{@link Flatten.Face}. <br/>\r\n * Face, in turn, is a closed loop of [edges]{@link Flatten.Edge}, where edge may be segment or circular arc<br/>\r\n * @type {Polygon}\r\n */\r\n Flatten.Polygon = class Polygon {\r\n /**\r\n * Constructor creates new instance of polygon.<br/>\r\n * New polygon is empty. Add face to the polygon using method <br/>\r\n * <code>\r\n * polygon.addFace(Points[]|Segments[]|Arcs[])\r\n * </code>\r\n */\r\n constructor() {\r\n /**\r\n * Container of faces (closed loops), may be empty\r\n * @type {PlanarSet}\r\n */\r\n this.faces = new PlanarSet();\r\n /**\r\n * Container of edges\r\n * @type {PlanarSet}\r\n */\r\n this.edges = new PlanarSet();\r\n }\r\n\r\n /**\r\n * (Getter) Returns bounding box of the polygon\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return [...this.faces].reduce( (acc, face) => acc.merge(face.box), new Box() );\r\n }\r\n\r\n /**\r\n * (Getter) Returns array of vertices\r\n * @returns {Array}\r\n */\r\n get vertices() {\r\n return [...this.edges].map( edge => edge.start);\r\n }\r\n\r\n /**\r\n * Return true is polygon has no edges\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return this.edges.size === 0;\r\n }\r\n\r\n /**\r\n * Add new face to polygon. Returns added face\r\n * @param {Points[]|Segments[]|Arcs[]|Circle|Box} args - new face may be create with one of the following ways: <br/>\r\n * 1) array of points that describe closed path (edges are segments) <br/>\r\n * 2) array of shapes (segments and arcs) which describe closed path <br/>\r\n * 3) circle - will be added as counterclockwise arc <br/>\r\n * 4) box - will be added as counterclockwise rectangle <br/>\r\n * You can chain method face.reverse() is you need to change direction of the creates face\r\n * @returns {Face}\r\n */\r\n addFace(...args) {\r\n let face = new Face(this, ...args);\r\n this.faces.add(face);\r\n return face;\r\n }\r\n\r\n /**\r\n * Delete existing face from polygon\r\n * @param {Face} face Face to be deleted\r\n * @returns {boolean}\r\n */\r\n deleteFace(face) {\r\n for (let edge of face) {\r\n let deleted = this.edges.delete(edge);\r\n }\r\n let deleted = this.faces.delete(face);\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Delete chain of edges from the face.\r\n * @param {Face} face Face to remove chain\r\n * @param {Edge} edgeFrom Start of the chain of edges to be removed\r\n * @param {Edge} edgeTo End of the chain of edges to be removed\r\n */\r\n removeChain(face, edgeFrom, edgeTo) {\r\n // Special case: all edges removed\r\n if (edgeTo.next === edgeFrom) {\r\n this.deleteFace(face);\r\n return;\r\n }\r\n for (let edge = edgeFrom; edge !== edgeTo.next; edge = edge.next ) {\r\n face.remove(this.edges, edge);\r\n // this.edges.delete(edge); // delete from PlanarSet of edges and update index\r\n if (face.isEmpty()) {\r\n this.deleteFace(face); // delete from PlanarSet of faces and update index\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add point as a new vertex and split edge. Point supposed to belong to an edge.\r\n * When edge is split, new edge created from the start of the edge to the new vertex\r\n * and inserted before current edge.\r\n * Current edge is trimmed and updated. Method returns new edge added.\r\n * @param {Edge} edge Edge to be split with new vertex and then trimmed from start\r\n * @param {Point} pt Point to be added as a new vertex\r\n * @returns {Edge}\r\n */\r\n addVertex(pt, edge) {\r\n let shapes = edge.shape.split(pt);\r\n if (shapes.length < 2) return;\r\n let newEdge = new Flatten.Edge(shapes[0]);\r\n let edgeBefore = edge.prev;\r\n\r\n /* Insert first split edge into linked list after edgeBefore */\r\n edge.face.insert(this.edges, newEdge, edgeBefore);\r\n\r\n // Remove old edge from edges container and 2d index\r\n this.edges.delete(edge);\r\n\r\n // Update edge shape with second split edge keeping links\r\n edge.shape = shapes[1];\r\n\r\n // Add updated edge to the edges container and 2d index\r\n this.edges.add(edge);\r\n\r\n return newEdge;\r\n }\r\n\r\n reverse() {\r\n for (let face of this.faces) {\r\n face.reverse();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Create new copied instance of the polygon\r\n * @returns {Polygon}\r\n */\r\n clone() {\r\n let polygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.clone());\r\n }\r\n polygon.addFace(shapes);\r\n }\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Returns area of the polygon. Area of an island will be added, area of a hole will be subtracted\r\n * @returns {number}\r\n */\r\n area() {\r\n let signedArea = [...this.faces].reduce((acc,face) => acc + face.signedArea(), 0);\r\n return Math.abs(signedArea);\r\n }\r\n\r\n /**\r\n * Returns true if polygon contains point, including polygon boundary, false otherwise\r\n * Point in polygon test based on ray shooting algorithm\r\n * @param {Point} point - test point\r\n * @returns {boolean}\r\n */\r\n contains(point) {\r\n let rel = ray_shoot(this, point);\r\n return (rel == Flatten.INSIDE || rel == Flatten.BOUNDARY) ? true : false;\r\n }\r\n\r\n /**\r\n * Return distance and shortest segment between polygon and other shape as array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of one of the types Point, Circle, Line, Segment, Arc or Polygon\r\n * @returns {Number | Segment}\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle ||\r\n shape instanceof Flatten.Line ||\r\n shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /* this method is bit faster */\r\n if (shape instanceof Flatten.Polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n let dist, shortest_segment;\r\n\r\n for (let edge of this.edges) {\r\n // let [dist, shortest_segment] = Distance.shape2polygon(edge.shape, shape);\r\n let min_stop = min_dist_and_segment[0];\r\n [dist, shortest_segment] = Distance.shape2planarSet(edge.shape, shape.edges, min_stop);\r\n if (Flatten.Utils.LT(dist, min_stop)) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n }\r\n\r\n /**\r\n * Return array of intersection points between polygon and other shape\r\n * @param shape Shape of the one of supported types <br/>\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Polygon.intersectLine2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle ||\r\n shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc) {\r\n return Polygon.intersectShape2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Polygon.intersectPolygon2Polygon(shape, this);\r\n }\r\n }\r\n\r\n /**\r\n * Return true if polygon is valid for boolean operations\r\n * Polygon is valid if <br/>\r\n * 1. All faces are simple polygons (there are no self-intersected polygons) <br/>\r\n * 2. All faces are orientable and there is no island inside island or hole inside hole - TODO <br/>\r\n * 3. There is no intersections between faces (excluding touching) - TODO <br/>\r\n * @returns {boolean}\r\n */\r\n isValid() {\r\n let valid = true;\r\n // 1. Polygon is invalid if at least one face is not simple\r\n for (let face of this.faces) {\r\n if (!face.isSimple(this.edges)) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n // 2. TODO: check if no island inside island and no hole inside hole\r\n // 3. TODO: check the there is no intersection between faces\r\n return valid;\r\n }\r\n\r\n /**\r\n * Returns new polygon translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Polygon}\r\n */\r\n translate(vec) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.translate(vec));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - rotation center, default is (0,0)\r\n * @returns {Polygon} - new rotated polygon\r\n */\r\n rotate(angle=0, center=new Flatten.Point()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.rotate(angle, center));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Polygon} - new polygon\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.transform(matrix));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n static intersectShape2Polygon(shape, polygon) {\r\n let ip = [];\r\n\r\n if ( polygon.isEmpty() || shape.box.not_intersect(polygon.box) ) {\r\n return ip;\r\n }\r\n\r\n let resp_edges = polygon.edges.search(shape.box);\r\n\r\n for (let edge of resp_edges) {\r\n for (let pt of shape.intersect(edge.shape)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectLine2Polygon(line, polygon) {\r\n let ip = [];\r\n\r\n if ( polygon.isEmpty() ) {\r\n return ip;\r\n }\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of line.intersect(edge.shape)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectPolygon2Polygon(polygon1, polygon2) {\r\n let ip = [];\r\n\r\n if (polygon1.isEmpty() || polygon2.isEmpty()) {\r\n return ip;\r\n }\r\n\r\n if (polygon1.box.not_intersect(polygon2.box)) {\r\n return ip;\r\n }\r\n\r\n for (let edge1 of polygon1.edges) {\r\n for (let pt of Polygon.intersectShape2Polygon(edge1.shape, polygon2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n /**\r\n * Return string to draw polygon in svg\r\n * @param attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\", \"fillRule\", \"fillOpacity\"\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"lightcyan\", fillRule:\"evenodd\", fillOpacity: \"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillRule, fillOpacity, id, className} = attrs;\r\n // let restStr = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n let svgStr = `\\n<path stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"lightcyan\"}\" fill-rule=\"${fillRule || \"evenodd\"}\" fill-opacity=\"${fillOpacity || 1.0}\" ${id_str} ${class_str} d=\"`;\r\n for (let face of this.faces) {\r\n svgStr += face.svg();\r\n }\r\n svgStr += `\" >\\n</path>`;\r\n return svgStr;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return [...this.faces].map(face => face.toJSON());\r\n }\r\n }\r\n};","\"use strict\";\r\n\r\nlet IntervalTree = require('flatten-interval-tree');\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Polygon, Point, Segment, Arc, Circle, Line, Ray, Vector} = Flatten;\r\n\r\n let {vector} = Flatten;\r\n\r\n Flatten.Distance = class Distance {\r\n /**\r\n * Calculate distance and shortest segment between points\r\n * @param pt1\r\n * @param pt2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2point(pt1, pt2) {\r\n return pt1.distanceTo(pt2);\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and line\r\n * @param pt\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2line(pt, line) {\r\n let closest_point = pt.projectionOn(line);\r\n let vec = vector(pt, closest_point);\r\n return [vec.length, new Segment(pt, closest_point)];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and circle\r\n * @param pt\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2circle(pt, circle) {\r\n let [dist2center, shortest_dist] = pt.distanceTo(circle.center);\r\n if (Flatten.Utils.EQ_0(dist2center)) {\r\n return [circle.r, new Segment(pt, circle.toArc().start)];\r\n }\r\n else {\r\n let dist = Math.abs(dist2center - circle.r);\r\n let v = vector(circle.pc, pt).normalize().multiply(circle.r);\r\n let closest_point = circle.pc.translate(v);\r\n return [dist, new Segment(pt, closest_point)];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and segment\r\n * @param pt\r\n * @param segment\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2segment(pt, segment) {\r\n /* Degenerated case of zero-length segment */\r\n if (segment.start.equalTo(segment.end)) {\r\n return Distance.point2point(pt, segment.start);\r\n }\r\n\r\n let v_seg = new Flatten.Vector(segment.start, segment.end);\r\n let v_ps2pt = new Flatten.Vector(segment.start, pt);\r\n let v_pe2pt = new Flatten.Vector(segment.end, pt);\r\n let start_sp = v_seg.dot(v_ps2pt);\r\n /* dot product v_seg * v_ps2pt */\r\n let end_sp = -v_seg.dot(v_pe2pt);\r\n /* minus dot product v_seg * v_pe2pt */\r\n\r\n let dist;\r\n let closest_point;\r\n if (Flatten.Utils.GE(start_sp, 0) && Flatten.Utils.GE(end_sp, 0)) { /* point inside segment scope */\r\n let v_unit = segment.tangentInStart(); // new Flatten.Vector(v_seg.x / this.length, v_seg.y / this.length);\r\n /* unit vector ||v_unit|| = 1 */\r\n dist = Math.abs(v_unit.cross(v_ps2pt));\r\n /* dist = abs(v_unit x v_ps2pt) */\r\n closest_point = segment.start.translate(v_unit.multiply(v_unit.dot(v_ps2pt)));\r\n return [dist, new Segment(pt, closest_point)];\r\n }\r\n else if (start_sp < 0) { /* point is out of scope closer to ps */\r\n return pt.distanceTo(segment.start);\r\n }\r\n else { /* point is out of scope closer to pe */\r\n return pt.distanceTo(segment.end);\r\n }\r\n };\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and arc\r\n * @param pt\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2arc(pt, arc) {\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let dist_and_segment = [];\r\n let dist, shortest_segment;\r\n [dist, shortest_segment] = Distance.point2circle(pt, circle);\r\n if (shortest_segment.end.on(arc)) {\r\n dist_and_segment.push(Distance.point2circle(pt, circle));\r\n }\r\n dist_and_segment.push( Distance.point2point(pt, arc.start) );\r\n dist_and_segment.push( Distance.point2point(pt, arc.end) );\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and line\r\n * @param seg\r\n * @param line\r\n * @returns {Number | Segment}\r\n */\r\n static segment2line(seg, line) {\r\n let ip = seg.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0],ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2line(seg.start, line));\r\n dist_and_segment.push(Distance.point2line(seg.end, line));\r\n\r\n Distance.sort( dist_and_segment );\r\n return dist_and_segment[0];\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two segments\r\n * @param seg1\r\n * @param seg2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2segment(seg1, seg2) {\r\n let ip = Segment.intersectSegment2Segment(seg1, seg2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0],ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n\r\n // Seg1 and seg2 not intersected\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2segment(seg2.start, seg1));\r\n dist_and_segment.push(Distance.point2segment(seg2.end, seg1));\r\n dist_and_segment.push(Distance.point2segment(seg1.start, seg2));\r\n dist_and_segment.push(Distance.point2segment(seg1.end, seg2));\r\n\r\n Distance.sort( dist_and_segment );\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and circle\r\n * @param seg\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2circle(seg, circle) {\r\n /* Case 1 Segment and circle intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(circle);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and circle\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius\r\n * And projection point belong to segment\r\n * Then measure again distance from projection to circle and return it */\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let [dist, shortest_segment] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist, circle.r) && shortest_segment.end.on(seg)) {\r\n return Distance.point2circle(shortest_segment.end, circle);\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n else {\r\n let [dist_from_start, shortest_segment_from_start] = Distance.point2circle(seg.start, circle);\r\n let [dist_from_end, shortest_segment_from_end] = Distance.point2circle(seg.end, circle);\r\n return Flatten.Utils.LT(dist_from_start, dist_from_end) ?\r\n [dist_from_start, shortest_segment_from_start] :\r\n [dist_from_end, shortest_segment_from_end];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and arc\r\n * @param seg\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2arc(seg, arc) {\r\n /* Case 1 Segment and arc intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and arc\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r) && shortest_segment_from_center.end.on(seg)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2arc(seg.start, arc));\r\n dist_and_segment.push(Distance.point2arc(seg.end, arc));\r\n\r\n let dist_tmp, segment_tmp;\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.start, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.end, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle1\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2circle(circle1, circle2) {\r\n let ip = circle1.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // Case 1. Concentric circles. Convert to arcs and take distance between two arc starts\r\n if (circle1.center.equalTo(circle2.center)) {\r\n let arc1 = circle1.toArc();\r\n let arc2 = circle2.toArc();\r\n return Distance.point2point(arc1.start, arc2.start);\r\n }\r\n else {\r\n // Case 2. Not concentric circles\r\n let line = new Line(circle1.center, circle2.center);\r\n let ip1 = line.intersect(circle1);\r\n let ip2 = line.intersect(circle2);\r\n\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[1]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[1]));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2line(circle, line) {\r\n let ip = circle.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n let [dist, shortest_segment] = Distance.point2circle(shortest_segment_from_center.end, circle);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and line\r\n * @param arc\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2line(arc, line) {\r\n /* Case 1 Line and arc intersected. Return the first point and zero distance */\r\n let ip = line.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.center, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n dist_and_segment.push( Distance.point2line(arc.start, line) );\r\n dist_and_segment.push( Distance.point2line(arc.end, line) );\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and circle\r\n * @param arc\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2circle(arc, circle2) {\r\n let ip = arc.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc.center, arc.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc)) {\r\n return [dist, shortest_segment];\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2circle(arc.start, circle2));\r\n dist_and_segment.push(Distance.point2circle(arc.end, circle2));\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two arcs\r\n * @param arc1\r\n * @param arc2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2arc(arc1, arc2) {\r\n let ip = arc1.intersect(arc2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc1.center, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.center, arc2.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc1) && shortest_segment.end.on(arc2)) {\r\n return [dist, shortest_segment];\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n\r\n let dist_tmp, segment_tmp;\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.start, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.end, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.start, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.end, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and polygon\r\n * @param point\r\n * @param polygon\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2polygon(point, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = (edge.shape instanceof Segment) ?\r\n Distance.point2segment(point, edge.shape) : Distance.point2arc(point, edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static shape2polygon(shape, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = shape.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n/*\r\n static arc2polygon(arc, polygon) {\r\n let ip = arc.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = arc.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static line2polygon(line, polygon) {\r\n let ip = line.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = line.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static circle2polygon(circle, polygon) {\r\n let ip = circle.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = circle.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n*/\r\n\r\n /**\r\n * Calculate distance and shortest segment between two polygons\r\n * @param polygon1\r\n * @param polygon2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static polygon2polygon(polygon1, polygon2) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n for (let edge1 of polygon1.edges) {\r\n for (let edge2 of polygon2.edges) {\r\n let [dist, shortest_segment] = edge1.shape.distanceTo(edge2.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n /**\r\n * Returns [mindist, maxdist] array of squared minimal and maximal distance between boxes\r\n * Minimal distance by x is\r\n * (box2.xmin - box1.xmax), if box1 is left to box2\r\n * (box1.xmin - box2.xmax), if box2 is left to box1\r\n * 0, if box1 and box2 are intersected by x\r\n * Minimal distance by y is defined in the same way\r\n *\r\n * Maximal distance is estimated as a sum of squared dimensions of the merged box\r\n *\r\n * @param box1\r\n * @param box2\r\n * @returns {Number | Number} - minimal and maximal distance\r\n */\r\n static box2box_minmax(box1, box2) {\r\n let mindist_x = Math.max( Math.max(box1.xmin - box2.xmax, 0), Math.max(box2.xmin - box1.xmax, 0) );\r\n let mindist_y = Math.max( Math.max(box1.ymin - box2.ymax, 0), Math.max(box2.ymin - box1.ymax, 0) );\r\n let mindist = mindist_x*mindist_x + mindist_y*mindist_y;\r\n\r\n let box = box1.merge(box2);\r\n let dx = box.xmax - box.xmin;\r\n let dy = box.ymax - box.ymin;\r\n let maxdist = dx*dx + dy*dy;\r\n\r\n return [mindist, maxdist];\r\n }\r\n\r\n static minmax_tree_process_level(shape, level, min_stop, tree) {\r\n // Calculate minmax distance to each shape in current level\r\n // Insert result into the interval tree for further processing\r\n // update min_stop with maxdist, it will be the new stop distance\r\n let mindist, maxdist;\r\n for (let node of level) {\r\n\r\n // [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n // if (Flatten.Utils.GT(mindist, min_stop))\r\n // continue;\r\n\r\n // Estimate min-max dist to the shape stored in the node.item, using node.item.key which is shape's box\r\n [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.item.key);\r\n if (node.item.value instanceof Flatten.Edge) {\r\n tree.insert([mindist, maxdist], node.item.value.shape);\r\n }\r\n else {\r\n tree.insert([mindist, maxdist], node.item.value);\r\n }\r\n if (Flatten.Utils.LT(maxdist, min_stop)) {\r\n min_stop = maxdist; // this will be the new distance estimation\r\n }\r\n }\r\n\r\n if (level.length === 0)\r\n return min_stop;\r\n\r\n // Calculate new level from left and right children of the current\r\n let new_level_left = level.map(node => node.left.isNil() ? undefined : node.left ).filter(node => node !== undefined);\r\n let new_level_right = level.map(node => node.right.isNil() ? undefined : node.right).filter(node => node !== undefined);\r\n // Merge left and right subtrees and leave only relevant subtrees\r\n let new_level = [...new_level_left, ...new_level_right].filter( node => {\r\n // Node subtree quick reject, node.max is a subtree box\r\n let [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n return (Flatten.Utils.LE(mindist, min_stop));\r\n });\r\n\r\n min_stop = Distance.minmax_tree_process_level(shape, new_level, min_stop, tree);\r\n return min_stop;\r\n }\r\n\r\n /**\r\n * Calculates sorted tree of [mindist, maxdist] intervals between query shape\r\n * and shapes of the planar set.\r\n * @param shape\r\n * @param set\r\n */\r\n static minmax_tree(shape, set, min_stop) {\r\n let tree = new IntervalTree();\r\n let level = [set.index.root];\r\n let squared_min_stop = min_stop < Number.POSITIVE_INFINITY ? min_stop*min_stop : Number.POSITIVE_INFINITY;\r\n squared_min_stop = Distance.minmax_tree_process_level(shape, level, squared_min_stop, tree);\r\n return tree;\r\n }\r\n\r\n static minmax_tree_calc_distance(shape, node, min_dist_and_segment) {\r\n let min_dist_and_segment_new, stop;\r\n if (node != null && !node.isNil()) {\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.left, min_dist_and_segment);\r\n\r\n if (stop) {\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n if (Flatten.Utils.LT(min_dist_and_segment_new[0], Math.sqrt(node.item.key.low))) {\r\n return [min_dist_and_segment_new, true]; // stop condition\r\n }\r\n\r\n let [dist, shortest_segment] = Distance.distance(shape, node.item.value);\r\n // console.log(dist)\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment_new[0])) {\r\n min_dist_and_segment_new = [dist, shortest_segment];\r\n }\r\n\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.right, min_dist_and_segment_new);\r\n\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n return [min_dist_and_segment, false];\r\n }\r\n\r\n /**\r\n * Calculates distance between shape and Planar Set of shapes\r\n * @param shape\r\n * @param {PlanarSet} set\r\n * @param {Number} min_stop\r\n * @returns {*}\r\n */\r\n static shape2planarSet(shape, set, min_stop = Number.POSITIVE_INFINITY) {\r\n let min_dist_and_segment = [min_stop, new Flatten.Segment()];\r\n let stop = false;\r\n if (set instanceof Flatten.PlanarSet) {\r\n let tree = Distance.minmax_tree(shape, set, min_stop);\r\n [min_dist_and_segment, stop] = Distance.minmax_tree_calc_distance(shape, tree.root, min_dist_and_segment);\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static sort(dist_and_segment) {\r\n dist_and_segment.sort((d1, d2) => {\r\n if (Flatten.Utils.LT(d1[0], d2[0])) {\r\n return -1;\r\n }\r\n if (Flatten.Utils.GT(d1[0], d2[0])) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n static distance(shape1, shape2) {\r\n return shape1.distanceTo(shape2);\r\n }\r\n }\r\n};","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n'use strict';\r\n\r\nlet Utils = require(\"./utils/utils\");\r\nlet Errors = require(\"./utils/errors\");\r\n\r\n/**\r\n * FlattenJS - library for 2d geometry\r\n * @type {Flatten}\r\n */\r\nlet Flatten = class Flatten {\r\n constructor() {\r\n this.DP_TOL = Utils.DP_TOL;\r\n this.CCW = true;\r\n this.CW = false;\r\n this.ORIENTATION = {CCW:-1, CW:1, NOT_ORIENTABLE: 0};\r\n this.PIx2 = 2 * Math.PI;\r\n // this.PI_2 = 0.5 * Math.PI;\r\n this.INSIDE = 1;\r\n this.OUTSIDE = 0;\r\n this.BOUNDARY = 2;\r\n this.CONTAINS = 3;\r\n this.INTERLACE = 4;\r\n this.OVERLAP_SAME = 1;\r\n this.OVERLAP_OPPOSITE = 2;\r\n this.Utils = Utils;\r\n this.Errors = Errors;\r\n }\r\n};\r\n\r\nlet f = new Flatten();\r\n\r\nrequire(\"./classes/matrix\")(f);\r\nrequire(\"./data_structures/planar_set\")(f);\r\nrequire(\"./classes/point\")(f);\r\nrequire(\"./classes/vector\")(f);\r\nrequire(\"./classes/line\")(f);\r\nrequire(\"./classes/circle\")(f);\r\nrequire(\"./classes/segment\")(f);\r\nrequire(\"./classes/arc\")(f);\r\nrequire(\"./classes/box\")(f);\r\nrequire(\"./classes/edge\")(f);\r\nrequire(\"./classes/face\")(f);\r\nrequire(\"./classes/ray\")(f);\r\nrequire(\"./algorithms/ray_shooting\")(f);\r\nrequire(\"./classes/polygon\")(f);\r\nrequire(\"./algorithms/distance\")(f);\r\n\r\nmodule.exports = f;\r\n","import Flatten from \"flatten-js\"\r\nimport IPosition from \"../models/position\"\r\nimport IElement from \"../models/IElement\"\r\n\r\n/**\r\n * Check if position 1 is within the radius r of position 2\r\n * @returns boolean\r\n */\r\nexport const checkSamePosition = (p1: IPosition, p2: IPosition, r: number = 3) => {\r\n return (p2.x - r < p1.x && p2.x + r > p1.x) && (p2.y - r < p1.y && p2.y + r > p1.y)\r\n}\r\n\r\nexport function removeDuplicatePosition<T extends IPosition>(positions: T[]) {\r\n return positions.reduce((acc, p) => acc.some(_p => _p.x === p.x && _p.y === p.y) ? acc : [...acc, p], [] as T[])\r\n}\r\n\r\n/**\r\n * Find the closest point from a list of points to the destination point\r\n*/\r\nexport const findNearestPosition = (listPositions: IPosition[], targetPosition: IPosition) => {\r\n let nearestPoint = listPositions[0];\r\n\r\n if (listPositions.length === 1) return nearestPoint;\r\n\r\n for (let i = 1; i < listPositions.length; i++) {\r\n const curPoint = listPositions[i];\r\n\r\n const [nearestDistance] = Flatten.point(nearestPoint.x, nearestPoint.y).distanceTo(Flatten.point(targetPosition.x, targetPosition.y))\r\n const [curDistance] = Flatten.point(curPoint.x, curPoint.y).distanceTo(Flatten.point(targetPosition.x, targetPosition.y))\r\n\r\n nearestPoint = curDistance < nearestDistance ? curPoint : nearestPoint;\r\n }\r\n\r\n return nearestPoint;\r\n}\r\n\r\n/**\r\n * @param ele : IElement\r\n * @returns Flatten.Polygon\r\n */\r\nexport const makePolygonOfElement = (ele: IElement): Flatten.Polygon => {\r\n const polygon = new Flatten.Polygon()\r\n polygon.addFace([\r\n Flatten.point(ele.position.x, ele.position.y),\r\n Flatten.point(ele.position.x + ele.size.width, ele.position.y),\r\n Flatten.point(ele.position.x + ele.size.width, ele.position.y + ele.size.height),\r\n Flatten.point(ele.position.x, ele.position.y + ele.size.height),\r\n ])\r\n\r\n return polygon;\r\n}\r\n\r\nexport const getIntersectionPositions = (pointStart: IPosition, pointEnd: IPosition, ele: IElement): IPosition[] => {\r\n const segment = Flatten.segment(\r\n Flatten.point(pointStart.x, pointStart.y),\r\n Flatten.point(pointEnd.x, pointEnd.y)\r\n )\r\n\r\n const polygonOfEle = makePolygonOfElement(ele)\r\n\r\n /* Remove duplicate positions from the result of finding the intersection points between a segment and a polygon. \r\n It then maps the intersection points to objects with rounded x and y coordinates. */\r\n return removeDuplicatePosition(segment.intersect(polygonOfEle).map(p => ({ x: Math.round(p.x), y: Math.round(p.y) })))\r\n}\r\n\r\n//Find the first intersection point of the line starting from startPosition to endPosition on the elements\r\nexport const getFirstIntersection = (startPosition: IPosition, endPosition: IPosition, elements: IElement[]) => {\r\n let result: {\r\n nearestIntersection: IPosition,\r\n intersectionPointsList: IPosition[],\r\n element: IElement,\r\n } | undefined;\r\n\r\n for (const element of elements) {\r\n //Find intersection positions on element\r\n const intersectionPoints = getIntersectionPositions(startPosition, endPosition, element);\r\n\r\n //If the line intersects at 1 point (can be the starting point or the ending point) or no point then ignore\r\n if (intersectionPoints.length <= 1) {\r\n continue;\r\n }\r\n\r\n const selectablePointsList = [...intersectionPoints]\r\n\r\n //If a point is found on a previous element, add it to the list of intersection points on the current element.\r\n if (result?.nearestIntersection) {\r\n selectablePointsList.push(result.nearestIntersection)\r\n }\r\n\r\n const nearest = findNearestPosition(selectablePointsList, startPosition)\r\n\r\n //If the closest intersection point to the starting point is not found or the new point is different from the previously found point, set a new value.\r\n if (!result?.nearestIntersection || !checkSamePosition(nearest, result.nearestIntersection)) {\r\n result = {\r\n element: element,\r\n intersectionPointsList: intersectionPoints,\r\n nearestIntersection: nearest,\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n//Find a point next to an element from a point on the element\r\nexport const generateSubstitutePosition = (intersectedPosition: IPosition, targetPosition: IPosition, ele: IElement): IPosition => {\r\n const translationOffset = 20;\r\n\r\n const vertex1Position = {\r\n x: ele.position.x,\r\n y: ele.position.y,\r\n }\r\n\r\n const vertex2Position = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y,\r\n }\r\n\r\n const vertex3Position = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n const vertex4Position = {\r\n x: ele.position.x,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n let replacementPosition: IPosition = null!;\r\n\r\n if (checkSamePosition(vertex1Position, intersectedPosition, 0)) {\r\n //Cut at vertex 1 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x - translationOffset;\r\n replacementPosition.y = vertex1Position.y - translationOffset;\r\n }\r\n\r\n else if (checkSamePosition(vertex2Position, intersectedPosition, 0)) {\r\n //Cut at vertex 2 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x + translationOffset;\r\n replacementPosition.y = vertex1Position.y - translationOffset;\r\n }\r\n\r\n else if (checkSamePosition(vertex3Position, intersectedPosition, 0)) {\r\n //Cut at vertex 3 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x + translationOffset;\r\n replacementPosition.y = vertex1Position.y + translationOffset;\r\n }\r\n else if (checkSamePosition(vertex4Position, intersectedPosition, 0)) {\r\n //Cut at vertex 4 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x - translationOffset;\r\n replacementPosition.y = vertex1Position.y + translationOffset;\r\n }\r\n\r\n else if (intersectedPosition.y === ele.position.y) {\r\n //cut top edge, move left or right\r\n\r\n const lineOfVertex12 = Flatten.line(Flatten.point(vertex1Position.x, vertex1Position.y), Flatten.point(vertex2Position.x, vertex2Position.y))\r\n\r\n //Check if the line lies on the edge of the bbox then move the starting point out 1 distance perpendicular to the edge.\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex12)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex12)[0] === 0\r\n ) {\r\n //lie on a straight line 1-2\r\n replacementPosition = {\r\n x: intersectedPosition.x,\r\n y: intersectedPosition.y - translationOffset,\r\n }\r\n } else {\r\n const leftPosition = {\r\n x: ele.position.x - translationOffset,\r\n y: ele.position.y,\r\n }\r\n\r\n const rightPosition = {\r\n x: ele.position.x + ele.size.width + translationOffset,\r\n y: ele.position.y,\r\n }\r\n\r\n replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.y === ele.position.y + ele.size.height) {\r\n //cut bottom edge, move left or right\r\n\r\n const lineOfVertex34 = Flatten.line(Flatten.point(vertex3Position.x, vertex3Position.y), Flatten.point(vertex4Position.x, vertex4Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex34)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex34)[0] === 0\r\n ) {\r\n //lie on a straight line 3-4\r\n replacementPosition = {\r\n x: intersectedPosition.x,\r\n y: intersectedPosition.y + translationOffset,\r\n }\r\n } else {\r\n const leftPosition = {\r\n x: ele.position.x - translationOffset,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n const rightPosition = {\r\n x: ele.position.x + ele.size.width + translationOffset,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.x === ele.position.x) {\r\n //cut left edge, move up or down\r\n\r\n const lineOfVertex14 = Flatten.line(Flatten.point(vertex1Position.x, vertex1Position.y), Flatten.point(vertex4Position.x, vertex4Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex14)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex14)[0] === 0\r\n ) {\r\n //lie on a straight line 1-4\r\n replacementPosition = {\r\n x: intersectedPosition.x - translationOffset,\r\n y: intersectedPosition.y,\r\n }\r\n } else {\r\n const topPosition = {\r\n x: ele.position.x,\r\n y: ele.position.y - translationOffset,\r\n }\r\n\r\n const bottomPosition = {\r\n x: ele.position.x,\r\n y: ele.position.y + ele.size.height + translationOffset,\r\n }\r\n\r\n replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.x === ele.position.x + ele.size.width) {\r\n //cut right edge, move up or down\r\n\r\n const lineOfVertex23 = Flatten.line(Flatten.point(vertex2Position.x, vertex2Position.y), Flatten.point(vertex3Position.x, vertex3Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex23)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex23)[0] === 0\r\n ) {\r\n //lie on a straight line 2-3\r\n replacementPosition = {\r\n x: intersectedPosition.x + translationOffset,\r\n y: intersectedPosition.y,\r\n }\r\n } else {\r\n const topPosition = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y - translationOffset,\r\n }\r\n\r\n const bottomPosition = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y + ele.size.height + translationOffset,\r\n }\r\n\r\n replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition)\r\n }\r\n\r\n }\r\n\r\n return replacementPosition;\r\n}\r\n\r\nexport const getRelativePosition = (clientPosition: IPosition, relativeElement: Element): IPosition => {\r\n const relativeRect = relativeElement.getBoundingClientRect();\r\n\r\n return {\r\n x: clientPosition.x - relativeRect.left,\r\n y: clientPosition.y - relativeRect.top,\r\n }\r\n}","import React, { memo, useContext, useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport IElementLinkProps from \"../../models/IElementLinkProps\";\r\nimport IPosition from \"../../models/position\";\r\nimport { addPointToList, createSmoothPathString, dist } from \"../../utils/pathUtil\";\r\nimport { CSS_CLASS_LINK_SELECTED, LINK_CLICKABLE_STROKE_WIDTH, LINK_DEFAULT_COLOR, LINK_LABEL_POSITION_FROM_LINK_MID_POINT, LINK_MARKER_DISTANCE_FROM_PORT, LINK_MARKER_SIZE, LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT, LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT, MAX_LINK_KNOT_COUNT, MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK } from \"../../utils/constants\";\r\nimport { calculateAngleWithOx } from \"../../utils/mathUtil\";\r\nimport Text from \"../texts/text\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport IText from \"../../models/IText\";\r\nimport CloseIcon from \"../CloseIcon\";\r\nimport { getRelativePosition } from \"../../utils/positionUtil\";\r\n\r\nconst makerStart = <circle cx={10} cy={10} r={10} fill=\"blue\"></circle>\r\nconst makerEnd = <path d=\"M0 0 L 20 10 L0 20 Z\" fill=\"blue\"></path>//<path d=\"M0 0 L 10 5 L0 10 Z\"></path>\r\n\r\nconst IElementLink: React.FC<IElementLinkProps> = ({\r\n id,\r\n path,\r\n stroke,\r\n strokeWidth = 4,\r\n points: pointsProp,\r\n sourcePosition,\r\n targetPosition,\r\n onPathChanged,\r\n onClickDelete,\r\n onSelected,\r\n onDeselected,\r\n container,\r\n markerStart = makerStart,\r\n markerEnd = makerEnd,\r\n markerDistanceFromPort = LINK_MARKER_DISTANCE_FROM_PORT,\r\n markerSize = LINK_MARKER_SIZE,\r\n label,\r\n sourceLabel,\r\n targetLabel,\r\n onLabelMoved,\r\n onLabelResized,\r\n onLabelContentChanged,\r\n}) => {\r\n const [pathStr, setPathStr] = useState<string | undefined>(path)\r\n const [points, setPoints] = useState<IPosition[]>(pointsProp ?? [])\r\n const [isDragging, setIsDragging] = useState(false)\r\n const [draggingPointIndex, setDraggingPointIndex] = useState<number>()\r\n const [selectedLabelRef, setSelectedLabelRef] = useState<React.RefObject<SVGSVGElement | null>>({\r\n current: null,\r\n })\r\n const [isSelectedLink, setIsSelectedLink] = useState<boolean>(false)\r\n\r\n const { onPaperClicked, onElementSelected } = useContext(paperEventEmitterContext)\r\n const pathRef = useRef<SVGPathElement>(null)\r\n const labelRef = useRef<SVGSVGElement>(null)\r\n const sourceLabelRef = useRef<SVGSVGElement>(null)\r\n const targetLabelRef = useRef<SVGSVGElement>(null)\r\n\r\n useEffect(() => {\r\n const paperClickListener = onPaperClicked(() => {\r\n setSelectedLabelRef({\r\n current: null,\r\n })\r\n setIsSelectedLink(false)\r\n onDeselected?.()\r\n })\r\n\r\n return () => {\r\n paperClickListener.off();\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n const elementSelectedListener = onElementSelected(() => {\r\n setSelectedLabelRef({\r\n current: null,\r\n })\r\n setIsSelectedLink(false)\r\n onDeselected?.()\r\n })\r\n\r\n return () => {\r\n elementSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(\r\n () => {\r\n const pointsList = [sourcePosition, ...points, targetPosition]\r\n\r\n let _pathStr = createSmoothPathString(pointsList, undefined, false)\r\n\r\n setPathStr(_pathStr)\r\n },\r\n [sourcePosition, points, targetPosition]\r\n )\r\n\r\n useEffect(() => {\r\n if (!pathStr) return;\r\n\r\n onPathChanged?.(pathStr, id)\r\n }, [pathStr, id])\r\n\r\n useLayoutEffect(() => {\r\n //handle when creating and moving point\r\n const handleMouseMove = (ev: Event) => {\r\n const mouseEvent = ev as MouseEvent;\r\n\r\n if (isDragging && draggingPointIndex !== undefined && container) {\r\n const offset = getRelativePosition(\r\n { x: mouseEvent.clientX, y: mouseEvent.clientY },\r\n container\r\n )\r\n\r\n setPoints(prev => {\r\n const temp = [...prev];\r\n temp[draggingPointIndex] = offset;\r\n return temp;\r\n })\r\n }\r\n }\r\n\r\n const mouseUp = () => {\r\n setDraggingPointIndex(undefined)\r\n setIsDragging(false)\r\n }\r\n\r\n container?.addEventListener('mousemove', handleMouseMove)\r\n container?.addEventListener('mouseup', mouseUp)\r\n\r\n return () => {\r\n container?.removeEventListener('mousemove', handleMouseMove)\r\n container?.removeEventListener('mouseup', mouseUp)\r\n }\r\n }, [container, isDragging, draggingPointIndex])\r\n\r\n const handleMouseDownOnPath = (ev: React.MouseEvent) => {\r\n ev.preventDefault();\r\n\r\n const svgContainer = (ev.target as SVGSVGElement).ownerSVGElement!;\r\n //add point if click on path\r\n setIsDragging(true)\r\n\r\n const rect = svgContainer.getBoundingClientRect();\r\n\r\n const offsetX = ev.clientX - rect.left;\r\n const offsetY = ev.clientY - rect.top;\r\n\r\n //Position of the new point on the path\r\n const newPoint = {\r\n x: offsetX,\r\n y: offsetY\r\n }\r\n\r\n const newPoints = addPointToList(newPoint, [sourcePosition, ...points, targetPosition], pathRef.current!)\r\n const pointsWithoutStartEndPoint = newPoints.slice(1, newPoints.length - 1)\r\n\r\n const addedIndex = pointsWithoutStartEndPoint.findIndex(p => p.x === newPoint.x && p.y === newPoint.y)\r\n\r\n const leftPointIndex = addedIndex - 1;\r\n const rightPointIndex = addedIndex + 1;\r\n\r\n let distFromLeftPoint;\r\n if (pointsWithoutStartEndPoint[leftPointIndex]) {\r\n distFromLeftPoint = dist(pointsWithoutStartEndPoint[leftPointIndex], pointsWithoutStartEndPoint[addedIndex])\r\n }\r\n\r\n let distFromRightPoint;\r\n if (pointsWithoutStartEndPoint[rightPointIndex]) {\r\n distFromRightPoint = dist(pointsWithoutStartEndPoint[rightPointIndex], pointsWithoutStartEndPoint[addedIndex])\r\n }\r\n\r\n let _draggingPointIndex;\r\n\r\n if (pointsWithoutStartEndPoint.length > MAX_LINK_KNOT_COUNT) {\r\n //Delete the point closest to the added point and get the index of the dragged point\r\n if (\r\n distFromLeftPoint !== undefined &&\r\n (\r\n distFromRightPoint === undefined ||\r\n distFromLeftPoint < distFromRightPoint\r\n )\r\n ) {\r\n //Remove left point\r\n pointsWithoutStartEndPoint.splice(leftPointIndex, 1)\r\n }\r\n\r\n else if (\r\n distFromRightPoint !== undefined &&\r\n (\r\n distFromLeftPoint === undefined ||\r\n distFromRightPoint < distFromLeftPoint\r\n )\r\n ) {\r\n //Remove right point\r\n pointsWithoutStartEndPoint.splice(rightPointIndex, 1)\r\n }\r\n\r\n } else {\r\n //get the index of the nearest point to the added point\r\n if (\r\n distFromRightPoint !== undefined && distFromRightPoint < MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK\r\n ) {\r\n //If the distance between the right point and the added point is less than MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK, then remove it.\r\n pointsWithoutStartEndPoint.splice(rightPointIndex, 1)\r\n }\r\n\r\n if (\r\n distFromLeftPoint !== undefined && distFromLeftPoint < MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK\r\n ) {\r\n //If the distance between the left point and the added point is less than MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK, then remove it.\r\n pointsWithoutStartEndPoint.splice(leftPointIndex, 1)\r\n }\r\n\r\n }\r\n\r\n //Find new index of added point\r\n _draggingPointIndex = pointsWithoutStartEndPoint.findIndex(p => p.x === newPoint.x && p.y === newPoint.y)\r\n\r\n setDraggingPointIndex(_draggingPointIndex)\r\n setPoints(pointsWithoutStartEndPoint)\r\n }\r\n\r\n const handleLabelMoved = (offsetX: number, offsetY: number) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleLabelResized = (width: number, height: number) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelResized?.(width, height, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelResized?.(width, height, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelResized?.(width, height, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleLabelContentChanged = (ev: React.ChangeEvent, newValue: string) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelContentChanged?.(newValue, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelContentChanged?.(newValue, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelContentChanged?.(newValue, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleClickPath = () => {\r\n setIsSelectedLink(true)\r\n onSelected?.()\r\n }\r\n\r\n const renderLabel = (label: IText, labelType: 'middle' | 'source' | 'target', relativePositionTo: IPosition = { x: 0, y: 0 }) => {\r\n const { content, size } = label;\r\n let relativePosition = label.position;\r\n let curLabelRef: React.RefObject<SVGSVGElement>;\r\n\r\n switch (labelType) {\r\n case 'middle':\r\n curLabelRef = labelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_LABEL_POSITION_FROM_LINK_MID_POINT\r\n }\r\n break;\r\n case 'source':\r\n curLabelRef = sourceLabelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT\r\n }\r\n break;\r\n case 'target':\r\n curLabelRef = targetLabelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error('This type of label does not exist.')\r\n }\r\n\r\n const position = {\r\n x: relativePosition.x + relativePositionTo.x,\r\n y: relativePosition.y + relativePositionTo.y,\r\n }\r\n\r\n return (\r\n <Text\r\n id={label.id}\r\n x={position.x}\r\n y={position.y}\r\n width={size.width}\r\n height={size.height}\r\n content={content}\r\n fontSize={label.fontSize}\r\n border={label.border}\r\n ref={curLabelRef}\r\n container={container!}\r\n onSelected={() => setSelectedLabelRef(curLabelRef)}\r\n onMoved={handleLabelMoved}\r\n onResized={handleLabelResized}\r\n onContentChanged={handleLabelContentChanged}\r\n />\r\n )\r\n }\r\n\r\n let angleMarkerStart: string | number = '0';\r\n let angleMarkerEnd: string | number = '0';\r\n\r\n let markerStartPosition;\r\n let markerEndPosition;\r\n\r\n let centerPathPosition;\r\n\r\n if (pathRef.current?.getAttribute('d')) {\r\n if (markerStart) {\r\n markerStartPosition = pathRef.current.getPointAtLength(markerDistanceFromPort)\r\n angleMarkerStart = calculateAngleWithOx(sourcePosition, markerStartPosition)\r\n }\r\n\r\n if (markerEnd) {\r\n markerEndPosition = pathRef.current.getPointAtLength(pathRef.current.getTotalLength() - markerDistanceFromPort)\r\n angleMarkerEnd = calculateAngleWithOx(markerEndPosition, targetPosition)\r\n }\r\n\r\n centerPathPosition = pathRef.current?.getPointAtLength(pathRef.current.getTotalLength() / 2);\r\n }\r\n\r\n return (\r\n <g>\r\n <path\r\n ref={pathRef}\r\n d={pathStr}\r\n className={isSelectedLink ? CSS_CLASS_LINK_SELECTED : ''}\r\n fill=\"none\" stroke={stroke || LINK_DEFAULT_COLOR}\r\n strokeWidth={strokeWidth}\r\n />\r\n <path\r\n d={pathStr}\r\n fill=\"none\"\r\n stroke={'transparent'}\r\n strokeWidth={LINK_CLICKABLE_STROKE_WIDTH}\r\n onClick={handleClickPath}\r\n onMouseDown={handleMouseDownOnPath}\r\n />\r\n\r\n {isSelectedLink && centerPathPosition && <svg x={centerPathPosition.x - 10} y={centerPathPosition.y - 10}>\r\n <CloseIcon onClick={onClickDelete} />\r\n </svg>}\r\n\r\n {label && renderLabel(label, 'middle', centerPathPosition)}\r\n {sourceLabel && renderLabel(sourceLabel, 'source', sourcePosition)}\r\n {targetLabel && renderLabel(targetLabel, 'target', targetPosition)}\r\n\r\n {markerStartPosition && <g transform={`rotate(${angleMarkerStart})`} style={{ transformOrigin: 'center', transformBox: 'content-box' }}>\r\n <svg x={markerStartPosition.x - markerSize / 2} y={markerStartPosition.y - markerSize / 2} width={markerSize} height={markerSize}>\r\n {markerStart}\r\n </svg>\r\n </g>}\r\n {markerEndPosition && <g transform={`rotate(${angleMarkerEnd})`} style={{ transformOrigin: 'center', transformBox: 'content-box' }}>\r\n <svg x={markerEndPosition.x - markerSize / 2} y={markerEndPosition.y - markerSize / 2} width={markerSize} height={markerSize}>\r\n {markerEnd}\r\n </svg>\r\n </g>}\r\n </g>\r\n )\r\n};\r\n\r\nexport default memo(IElementLink);","import React from 'react';\r\n\r\ninterface RulerProps {\r\n squareSize: number;\r\n border: string;\r\n}\r\n\r\nconst Ruler: React.FC<RulerProps> = ({ squareSize, border }) => {\r\n const numColumns = Math.ceil(3000 / squareSize);\r\n const numRows = Math.ceil(3000 / squareSize);\r\n\r\n const tableWidth = numColumns * squareSize;\r\n\r\n return (\r\n <table style={{ position: 'absolute', zIndex: -1, top: 0, left: 0, borderCollapse: 'collapse', width: tableWidth }}>\r\n <tbody>\r\n {Array.from({ length: numRows }).map((_, rowIndex) => (\r\n <tr key={rowIndex} style={{ margin: 0, padding: 0 }}>\r\n {Array.from({ length: numColumns }).map((_, colIndex) => (\r\n <td\r\n key={colIndex}\r\n style={{\r\n width: squareSize,\r\n height: squareSize,\r\n border: border,\r\n margin: 0,\r\n padding: 0,\r\n boxSizing: 'border-box',\r\n verticalAlign: 'top',\r\n position: 'relative',\r\n fontSize: 12,\r\n }}\r\n >\r\n {rowIndex === 0 ? <span style={{marginLeft: \"-12px\"}}>\r\n {colIndex * squareSize}\r\n </span> : \"\"}\r\n {colIndex === 0 ? <span style={{ top: \"-9px\", position: \"absolute\" }}>\r\n {rowIndex * squareSize}\r\n </span> : \"\"}\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n );\r\n};\r\n\r\nexport default Ruler;","import React, { forwardRef } from \"react\";\r\nimport IPort from \"../../models/IPort\";\r\n\r\ninterface IElementWrapper {\r\n x?: number;\r\n y?: number;\r\n onClick?: (e: React.MouseEvent<SVGElement>) => void;\r\n onContextMenu?: (e: React.MouseEvent<SVGElement>) => void;\r\n children: React.ReactNode;\r\n portPlaceholders?: SVGElement[];\r\n ports?: IPort[];\r\n\r\n onMouseMove?: (event: React.MouseEvent) => void;\r\n onMouseLeave?: (event: React.MouseEvent) => void;\r\n onMouseUp?: (event: React.MouseEvent) => void;\r\n}\r\n\r\nconst ElementWrapper: React.ForwardRefExoticComponent<IElementWrapper & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, IElementWrapper>(\r\n function (\r\n { x, y, children, portPlaceholders, ports, onClick, onContextMenu, onMouseMove, onMouseLeave, onMouseUp\r\n },\r\n ref\r\n ) {\r\n\r\n const handleMouseDown = (ev: React.MouseEvent<SVGElement>) => {\r\n ev.stopPropagation();\r\n }\r\n\r\n const handleClick = (ev: React.MouseEvent<SVGElement>) => {\r\n if (ev.type === 'click') {\r\n if (onClick) onClick(ev);\r\n } else if (ev.type === 'contextmenu') {\r\n if (onContextMenu) onContextMenu(ev);\r\n }\r\n }\r\n\r\n return (\r\n <svg x={x} y={y} onClick={handleClick} onContextMenu={handleClick} onMouseDown={handleMouseDown} ref={ref} style={{ overflow: \"visible\" }} onMouseMove={onMouseMove} onMouseLeave={onMouseLeave} onMouseUp={onMouseUp}>\r\n {children}\r\n </svg>\r\n );\r\n }\r\n )\r\n\r\nexport default ElementWrapper;","import IPosition from \"../models/position\";\r\n\r\n// Calculate the position of the 4 vertices of a rectangle relative to its parent svg\r\nexport const getRectangleCorners = (rectSVG: SVGRectElement): IPosition[] => {\r\n const ownerSVG = rectSVG.ownerSVGElement;\r\n const rectStrokeWidth = Number(rectSVG.getAttribute('stroke-width')) || 0\r\n const strokeWidthOffset = rectStrokeWidth / 2\r\n\r\n if (!ownerSVG) {\r\n throw new Error('Rectangle does not wrapper by svg.')\r\n }\r\n\r\n const ownerX = ownerSVG.x.baseVal.value\r\n const ownerY = ownerSVG.y.baseVal.value\r\n const ownerWidth = ownerSVG.width.baseVal.value\r\n const ownerHeight = ownerSVG.height.baseVal.value\r\n\r\n const a: IPosition = { x: ownerX + strokeWidthOffset, y: ownerY + strokeWidthOffset }\r\n const b: IPosition = { x: ownerX + ownerWidth - strokeWidthOffset, y: ownerY + strokeWidthOffset }\r\n const c: IPosition = { x: ownerX + ownerWidth - strokeWidthOffset, y: ownerY + ownerHeight - strokeWidthOffset }\r\n const d: IPosition = { x: ownerX + strokeWidthOffset, y: ownerY + ownerHeight - strokeWidthOffset }\r\n\r\n return [a, b, c, d]\r\n}\r\n\r\n//find rotation angle of svg element on g element\r\nexport const getElementRotationInfo = (element: SVGSVGElement) => {\r\n let gElement: SVGGElement = element;\r\n let rotationAngle = 0;\r\n\r\n while (!(gElement instanceof SVGGElement)) {\r\n gElement = (gElement as HTMLElement).parentElement as any;\r\n }\r\n\r\n const transform = gElement.getAttribute('transform');\r\n\r\n if (transform) {\r\n // Match the rotation value using a regular expression\r\n const rotateMatch = transform.match(/rotate\\(([-\\d.]+)(?:\\s+[-\\d.]+\\s+[-\\d.]+)?\\)/);\r\n\r\n if (rotateMatch) {\r\n // The first capture group is the rotation angle\r\n rotationAngle = parseFloat(rotateMatch[1]);\r\n }\r\n }\r\n\r\n return rotationAngle;\r\n}","import Flatten from \"flatten-js\"\r\nimport IPosition from \"../models/position\"\r\n\r\nconst checkPositionOnLine = (position: IPosition, line: IPosition[]): boolean => {\r\n const point = Flatten.point(position.x, position.y);\r\n const _line = Flatten.segment(Flatten.point(line[0].x, line[0].y), Flatten.point(line[1].x, line[1].y))\r\n\r\n return _line.contains(point)\r\n}\r\n\r\nexport {\r\n checkPositionOnLine,\r\n}","// UMD (Universal Module Definition)\n// See https://github.com/umdjs/umd for reference\n//\n// This file uses the following specific UMD implementation:\n// https://github.com/umdjs/umd/blob/master/returnExports.js\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.computeLayout = factory();\n }\n}(this, function() {\n /**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nvar computeLayout = (function() {\n\n var CSS_UNDEFINED;\n\n var CSS_DIRECTION_INHERIT = 'inherit';\n var CSS_DIRECTION_LTR = 'ltr';\n var CSS_DIRECTION_RTL = 'rtl';\n\n var CSS_FLEX_DIRECTION_ROW = 'row';\n var CSS_FLEX_DIRECTION_ROW_REVERSE = 'row-reverse';\n var CSS_FLEX_DIRECTION_COLUMN = 'column';\n var CSS_FLEX_DIRECTION_COLUMN_REVERSE = 'column-reverse';\n\n var CSS_JUSTIFY_FLEX_START = 'flex-start';\n var CSS_JUSTIFY_CENTER = 'center';\n var CSS_JUSTIFY_FLEX_END = 'flex-end';\n var CSS_JUSTIFY_SPACE_BETWEEN = 'space-between';\n var CSS_JUSTIFY_SPACE_AROUND = 'space-around';\n\n var CSS_ALIGN_FLEX_START = 'flex-start';\n var CSS_ALIGN_CENTER = 'center';\n var CSS_ALIGN_FLEX_END = 'flex-end';\n var CSS_ALIGN_STRETCH = 'stretch';\n\n var CSS_POSITION_RELATIVE = 'relative';\n var CSS_POSITION_ABSOLUTE = 'absolute';\n\n var leading = {\n 'row': 'left',\n 'row-reverse': 'right',\n 'column': 'top',\n 'column-reverse': 'bottom'\n };\n var trailing = {\n 'row': 'right',\n 'row-reverse': 'left',\n 'column': 'bottom',\n 'column-reverse': 'top'\n };\n var pos = {\n 'row': 'left',\n 'row-reverse': 'right',\n 'column': 'top',\n 'column-reverse': 'bottom'\n };\n var dim = {\n 'row': 'width',\n 'row-reverse': 'width',\n 'column': 'height',\n 'column-reverse': 'height'\n };\n\n // When transpiled to Java / C the node type has layout, children and style\n // properties. For the JavaScript version this function adds these properties\n // if they don't already exist.\n function fillNodes(node) {\n if (!node.layout || node.isDirty) {\n node.layout = {\n width: undefined,\n height: undefined,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n };\n }\n\n if (!node.style) {\n node.style = {};\n }\n\n if (!node.children) {\n node.children = [];\n }\n node.children.forEach(fillNodes);\n return node;\n }\n\n function isUndefined(value) {\n return value === undefined;\n }\n\n function isRowDirection(flexDirection) {\n return flexDirection === CSS_FLEX_DIRECTION_ROW ||\n flexDirection === CSS_FLEX_DIRECTION_ROW_REVERSE;\n }\n\n function isColumnDirection(flexDirection) {\n return flexDirection === CSS_FLEX_DIRECTION_COLUMN ||\n flexDirection === CSS_FLEX_DIRECTION_COLUMN_REVERSE;\n }\n\n function getLeadingMargin(node, axis) {\n if (node.style.marginStart !== undefined && isRowDirection(axis)) {\n return node.style.marginStart;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.marginLeft; break;\n case 'row-reverse': value = node.style.marginRight; break;\n case 'column': value = node.style.marginTop; break;\n case 'column-reverse': value = node.style.marginBottom; break;\n }\n\n if (value !== undefined) {\n return value;\n }\n\n if (node.style.margin !== undefined) {\n return node.style.margin;\n }\n\n return 0;\n }\n\n function getTrailingMargin(node, axis) {\n if (node.style.marginEnd !== undefined && isRowDirection(axis)) {\n return node.style.marginEnd;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.marginRight; break;\n case 'row-reverse': value = node.style.marginLeft; break;\n case 'column': value = node.style.marginBottom; break;\n case 'column-reverse': value = node.style.marginTop; break;\n }\n\n if (value != null) {\n return value;\n }\n\n if (node.style.margin !== undefined) {\n return node.style.margin;\n }\n\n return 0;\n }\n\n function getLeadingPadding(node, axis) {\n if (node.style.paddingStart !== undefined && node.style.paddingStart >= 0\n && isRowDirection(axis)) {\n return node.style.paddingStart;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.paddingLeft; break;\n case 'row-reverse': value = node.style.paddingRight; break;\n case 'column': value = node.style.paddingTop; break;\n case 'column-reverse': value = node.style.paddingBottom; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.padding !== undefined && node.style.padding >= 0) {\n return node.style.padding;\n }\n\n return 0;\n }\n\n function getTrailingPadding(node, axis) {\n if (node.style.paddingEnd !== undefined && node.style.paddingEnd >= 0\n && isRowDirection(axis)) {\n return node.style.paddingEnd;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.paddingRight; break;\n case 'row-reverse': value = node.style.paddingLeft; break;\n case 'column': value = node.style.paddingBottom; break;\n case 'column-reverse': value = node.style.paddingTop; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.padding !== undefined && node.style.padding >= 0) {\n return node.style.padding;\n }\n\n return 0;\n }\n\n function getLeadingBorder(node, axis) {\n if (node.style.borderStartWidth !== undefined && node.style.borderStartWidth >= 0\n && isRowDirection(axis)) {\n return node.style.borderStartWidth;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.borderLeftWidth; break;\n case 'row-reverse': value = node.style.borderRightWidth; break;\n case 'column': value = node.style.borderTopWidth; break;\n case 'column-reverse': value = node.style.borderBottomWidth; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.borderWidth !== undefined && node.style.borderWidth >= 0) {\n return node.style.borderWidth;\n }\n\n return 0;\n }\n\n function getTrailingBorder(node, axis) {\n if (node.style.borderEndWidth !== undefined && node.style.borderEndWidth >= 0\n && isRowDirection(axis)) {\n return node.style.borderEndWidth;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.borderRightWidth; break;\n case 'row-reverse': value = node.style.borderLeftWidth; break;\n case 'column': value = node.style.borderBottomWidth; break;\n case 'column-reverse': value = node.style.borderTopWidth; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.borderWidth !== undefined && node.style.borderWidth >= 0) {\n return node.style.borderWidth;\n }\n\n return 0;\n }\n\n function getLeadingPaddingAndBorder(node, axis) {\n return getLeadingPadding(node, axis) + getLeadingBorder(node, axis);\n }\n\n function getTrailingPaddingAndBorder(node, axis) {\n return getTrailingPadding(node, axis) + getTrailingBorder(node, axis);\n }\n\n function getBorderAxis(node, axis) {\n return getLeadingBorder(node, axis) + getTrailingBorder(node, axis);\n }\n\n function getMarginAxis(node, axis) {\n return getLeadingMargin(node, axis) + getTrailingMargin(node, axis);\n }\n\n function getPaddingAndBorderAxis(node, axis) {\n return getLeadingPaddingAndBorder(node, axis) +\n getTrailingPaddingAndBorder(node, axis);\n }\n\n function getJustifyContent(node) {\n if (node.style.justifyContent) {\n return node.style.justifyContent;\n }\n return 'flex-start';\n }\n\n function getAlignContent(node) {\n if (node.style.alignContent) {\n return node.style.alignContent;\n }\n return 'flex-start';\n }\n\n function getAlignItem(node, child) {\n if (child.style.alignSelf) {\n return child.style.alignSelf;\n }\n if (node.style.alignItems) {\n return node.style.alignItems;\n }\n return 'stretch';\n }\n\n function resolveAxis(axis, direction) {\n if (direction === CSS_DIRECTION_RTL) {\n if (axis === CSS_FLEX_DIRECTION_ROW) {\n return CSS_FLEX_DIRECTION_ROW_REVERSE;\n } else if (axis === CSS_FLEX_DIRECTION_ROW_REVERSE) {\n return CSS_FLEX_DIRECTION_ROW;\n }\n }\n\n return axis;\n }\n\n function resolveDirection(node, parentDirection) {\n var direction;\n if (node.style.direction) {\n direction = node.style.direction;\n } else {\n direction = CSS_DIRECTION_INHERIT;\n }\n\n if (direction === CSS_DIRECTION_INHERIT) {\n direction = (parentDirection === undefined ? CSS_DIRECTION_LTR : parentDirection);\n }\n\n return direction;\n }\n\n function getFlexDirection(node) {\n if (node.style.flexDirection) {\n return node.style.flexDirection;\n }\n return CSS_FLEX_DIRECTION_COLUMN;\n }\n\n function getCrossFlexDirection(flexDirection, direction) {\n if (isColumnDirection(flexDirection)) {\n return resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);\n } else {\n return CSS_FLEX_DIRECTION_COLUMN;\n }\n }\n\n function getPositionType(node) {\n if (node.style.position) {\n return node.style.position;\n }\n return 'relative';\n }\n\n function isFlex(node) {\n return (\n getPositionType(node) === CSS_POSITION_RELATIVE &&\n node.style.flex > 0\n );\n }\n\n function isFlexWrap(node) {\n return node.style.flexWrap === 'wrap';\n }\n\n function getDimWithMargin(node, axis) {\n return node.layout[dim[axis]] + getMarginAxis(node, axis);\n }\n\n function isDimDefined(node, axis) {\n return node.style[dim[axis]] !== undefined && node.style[dim[axis]] >= 0;\n }\n\n function isPosDefined(node, pos) {\n return node.style[pos] !== undefined;\n }\n\n function isMeasureDefined(node) {\n return node.style.measure !== undefined;\n }\n\n function getPosition(node, pos) {\n if (node.style[pos] !== undefined) {\n return node.style[pos];\n }\n return 0;\n }\n\n function boundAxis(node, axis, value) {\n var min = {\n 'row': node.style.minWidth,\n 'row-reverse': node.style.minWidth,\n 'column': node.style.minHeight,\n 'column-reverse': node.style.minHeight\n }[axis];\n\n var max = {\n 'row': node.style.maxWidth,\n 'row-reverse': node.style.maxWidth,\n 'column': node.style.maxHeight,\n 'column-reverse': node.style.maxHeight\n }[axis];\n\n var boundValue = value;\n if (max !== undefined && max >= 0 && boundValue > max) {\n boundValue = max;\n }\n if (min !== undefined && min >= 0 && boundValue < min) {\n boundValue = min;\n }\n return boundValue;\n }\n\n function fmaxf(a, b) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n // When the user specifically sets a value for width or height\n function setDimensionFromStyle(node, axis) {\n // The parent already computed us a width or height. We just skip it\n if (node.layout[dim[axis]] !== undefined) {\n return;\n }\n // We only run if there's a width or height defined\n if (!isDimDefined(node, axis)) {\n return;\n }\n\n // The dimensions can never be smaller than the padding and border\n node.layout[dim[axis]] = fmaxf(\n boundAxis(node, axis, node.style[dim[axis]]),\n getPaddingAndBorderAxis(node, axis)\n );\n }\n\n function setTrailingPosition(node, child, axis) {\n child.layout[trailing[axis]] = node.layout[dim[axis]] -\n child.layout[dim[axis]] - child.layout[pos[axis]];\n }\n\n // If both left and right are defined, then use left. Otherwise return\n // +left or -right depending on which is defined.\n function getRelativePosition(node, axis) {\n if (node.style[leading[axis]] !== undefined) {\n return getPosition(node, leading[axis]);\n }\n return -getPosition(node, trailing[axis]);\n }\n\n function layoutNodeImpl(node, parentMaxWidth, /*css_direction_t*/parentDirection) {\n var/*css_direction_t*/ direction = resolveDirection(node, parentDirection);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ mainAxis = resolveAxis(getFlexDirection(node), direction);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ crossAxis = getCrossFlexDirection(mainAxis, direction);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ resolvedRowAxis = resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);\n\n // Handle width and height style attributes\n setDimensionFromStyle(node, mainAxis);\n setDimensionFromStyle(node, crossAxis);\n\n // Set the resolved resolution in the node's layout\n node.layout.direction = direction;\n\n // The position is set by the parent, but we need to complete it with a\n // delta composed of the margin and left/top/right/bottom\n node.layout[leading[mainAxis]] += getLeadingMargin(node, mainAxis) +\n getRelativePosition(node, mainAxis);\n node.layout[trailing[mainAxis]] += getTrailingMargin(node, mainAxis) +\n getRelativePosition(node, mainAxis);\n node.layout[leading[crossAxis]] += getLeadingMargin(node, crossAxis) +\n getRelativePosition(node, crossAxis);\n node.layout[trailing[crossAxis]] += getTrailingMargin(node, crossAxis) +\n getRelativePosition(node, crossAxis);\n\n // Inline immutable values from the target node to avoid excessive method\n // invocations during the layout calculation.\n var/*int*/ childCount = node.children.length;\n var/*float*/ paddingAndBorderAxisResolvedRow = getPaddingAndBorderAxis(node, resolvedRowAxis);\n\n if (isMeasureDefined(node)) {\n var/*bool*/ isResolvedRowDimDefined = !isUndefined(node.layout[dim[resolvedRowAxis]]);\n\n var/*float*/ width = CSS_UNDEFINED;\n if (isDimDefined(node, resolvedRowAxis)) {\n width = node.style.width;\n } else if (isResolvedRowDimDefined) {\n width = node.layout[dim[resolvedRowAxis]];\n } else {\n width = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis);\n }\n width -= paddingAndBorderAxisResolvedRow;\n\n // We only need to give a dimension for the text if we haven't got any\n // for it computed yet. It can either be from the style attribute or because\n // the element is flexible.\n var/*bool*/ isRowUndefined = !isDimDefined(node, resolvedRowAxis) && !isResolvedRowDimDefined;\n var/*bool*/ isColumnUndefined = !isDimDefined(node, CSS_FLEX_DIRECTION_COLUMN) &&\n isUndefined(node.layout[dim[CSS_FLEX_DIRECTION_COLUMN]]);\n\n // Let's not measure the text if we already know both dimensions\n if (isRowUndefined || isColumnUndefined) {\n var/*css_dim_t*/ measureDim = node.style.measure(\n /*(c)!node->context,*/\n /*(java)!layoutContext.measureOutput,*/\n width\n );\n if (isRowUndefined) {\n node.layout.width = measureDim.width +\n paddingAndBorderAxisResolvedRow;\n }\n if (isColumnUndefined) {\n node.layout.height = measureDim.height +\n getPaddingAndBorderAxis(node, CSS_FLEX_DIRECTION_COLUMN);\n }\n }\n if (childCount === 0) {\n return;\n }\n }\n\n var/*bool*/ isNodeFlexWrap = isFlexWrap(node);\n\n var/*css_justify_t*/ justifyContent = getJustifyContent(node);\n\n var/*float*/ leadingPaddingAndBorderMain = getLeadingPaddingAndBorder(node, mainAxis);\n var/*float*/ leadingPaddingAndBorderCross = getLeadingPaddingAndBorder(node, crossAxis);\n var/*float*/ paddingAndBorderAxisMain = getPaddingAndBorderAxis(node, mainAxis);\n var/*float*/ paddingAndBorderAxisCross = getPaddingAndBorderAxis(node, crossAxis);\n\n var/*bool*/ isMainDimDefined = !isUndefined(node.layout[dim[mainAxis]]);\n var/*bool*/ isCrossDimDefined = !isUndefined(node.layout[dim[crossAxis]]);\n var/*bool*/ isMainRowDirection = isRowDirection(mainAxis);\n\n var/*int*/ i;\n var/*int*/ ii;\n var/*css_node_t**/ child;\n var/*(c)!css_flex_direction_t*//*(java)!int*/ axis;\n\n var/*css_node_t**/ firstAbsoluteChild = null;\n var/*css_node_t**/ currentAbsoluteChild = null;\n\n var/*float*/ definedMainDim = CSS_UNDEFINED;\n if (isMainDimDefined) {\n definedMainDim = node.layout[dim[mainAxis]] - paddingAndBorderAxisMain;\n }\n\n // We want to execute the next two loops one per line with flex-wrap\n var/*int*/ startLine = 0;\n var/*int*/ endLine = 0;\n // var/*int*/ nextOffset = 0;\n var/*int*/ alreadyComputedNextLayout = 0;\n // We aggregate the total dimensions of the container in those two variables\n var/*float*/ linesCrossDim = 0;\n var/*float*/ linesMainDim = 0;\n var/*int*/ linesCount = 0;\n while (endLine < childCount) {\n // <Loop A> Layout non flexible children and count children by type\n\n // mainContentDim is accumulation of the dimensions and margin of all the\n // non flexible children. This will be used in order to either set the\n // dimensions of the node if none already exist, or to compute the\n // remaining space left for the flexible children.\n var/*float*/ mainContentDim = 0;\n\n // There are three kind of children, non flexible, flexible and absolute.\n // We need to know how many there are in order to distribute the space.\n var/*int*/ flexibleChildrenCount = 0;\n var/*float*/ totalFlexible = 0;\n var/*int*/ nonFlexibleChildrenCount = 0;\n\n // Use the line loop to position children in the main axis for as long\n // as they are using a simple stacking behaviour. Children that are\n // immediately stacked in the initial loop will not be touched again\n // in <Loop C>.\n var/*bool*/ isSimpleStackMain =\n (isMainDimDefined && justifyContent === CSS_JUSTIFY_FLEX_START) ||\n (!isMainDimDefined && justifyContent !== CSS_JUSTIFY_CENTER);\n var/*int*/ firstComplexMain = (isSimpleStackMain ? childCount : startLine);\n\n // Use the initial line loop to position children in the cross axis for\n // as long as they are relatively positioned with alignment STRETCH or\n // FLEX_START. Children that are immediately stacked in the initial loop\n // will not be touched again in <Loop D>.\n var/*bool*/ isSimpleStackCross = true;\n var/*int*/ firstComplexCross = childCount;\n\n var/*css_node_t**/ firstFlexChild = null;\n var/*css_node_t**/ currentFlexChild = null;\n\n var/*float*/ mainDim = leadingPaddingAndBorderMain;\n var/*float*/ crossDim = 0;\n\n var/*float*/ maxWidth;\n for (i = startLine; i < childCount; ++i) {\n child = node.children[i];\n child.lineIndex = linesCount;\n\n child.nextAbsoluteChild = null;\n child.nextFlexChild = null;\n\n var/*css_align_t*/ alignItem = getAlignItem(node, child);\n\n // Pre-fill cross axis dimensions when the child is using stretch before\n // we call the recursive layout pass\n if (alignItem === CSS_ALIGN_STRETCH &&\n getPositionType(child) === CSS_POSITION_RELATIVE &&\n isCrossDimDefined &&\n !isDimDefined(child, crossAxis)) {\n child.layout[dim[crossAxis]] = fmaxf(\n boundAxis(child, crossAxis, node.layout[dim[crossAxis]] -\n paddingAndBorderAxisCross - getMarginAxis(child, crossAxis)),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, crossAxis)\n );\n } else if (getPositionType(child) === CSS_POSITION_ABSOLUTE) {\n // Store a private linked list of absolutely positioned children\n // so that we can efficiently traverse them later.\n if (firstAbsoluteChild === null) {\n firstAbsoluteChild = child;\n }\n if (currentAbsoluteChild !== null) {\n currentAbsoluteChild.nextAbsoluteChild = child;\n }\n currentAbsoluteChild = child;\n\n // Pre-fill dimensions when using absolute position and both offsets for the axis are defined (either both\n // left and right or top and bottom).\n for (ii = 0; ii < 2; ii++) {\n axis = (ii !== 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;\n if (!isUndefined(node.layout[dim[axis]]) &&\n !isDimDefined(child, axis) &&\n isPosDefined(child, leading[axis]) &&\n isPosDefined(child, trailing[axis])) {\n child.layout[dim[axis]] = fmaxf(\n boundAxis(child, axis, node.layout[dim[axis]] -\n getPaddingAndBorderAxis(node, axis) -\n getMarginAxis(child, axis) -\n getPosition(child, leading[axis]) -\n getPosition(child, trailing[axis])),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, axis)\n );\n }\n }\n }\n\n var/*float*/ nextContentDim = 0;\n\n // It only makes sense to consider a child flexible if we have a computed\n // dimension for the node.\n if (isMainDimDefined && isFlex(child)) {\n flexibleChildrenCount++;\n totalFlexible += child.style.flex;\n\n // Store a private linked list of flexible children so that we can\n // efficiently traverse them later.\n if (firstFlexChild === null) {\n firstFlexChild = child;\n }\n if (currentFlexChild !== null) {\n currentFlexChild.nextFlexChild = child;\n }\n currentFlexChild = child;\n\n // Even if we don't know its exact size yet, we already know the padding,\n // border and margin. We'll use this partial information, which represents\n // the smallest possible size for the child, to compute the remaining\n // available space.\n nextContentDim = getPaddingAndBorderAxis(child, mainAxis) +\n getMarginAxis(child, mainAxis);\n\n } else {\n maxWidth = CSS_UNDEFINED;\n if (!isMainRowDirection) {\n if (isDimDefined(node, resolvedRowAxis)) {\n maxWidth = node.layout[dim[resolvedRowAxis]] -\n paddingAndBorderAxisResolvedRow;\n } else {\n maxWidth = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis) -\n paddingAndBorderAxisResolvedRow;\n }\n }\n\n // This is the main recursive call. We layout non flexible children.\n if (alreadyComputedNextLayout === 0) {\n layoutNode(/*(java)!layoutContext, */child, maxWidth, direction);\n }\n\n // Absolute positioned elements do not take part of the layout, so we\n // don't use them to compute mainContentDim\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n nonFlexibleChildrenCount++;\n // At this point we know the final size and margin of the element.\n nextContentDim = getDimWithMargin(child, mainAxis);\n }\n }\n\n // The element we are about to add would make us go to the next line\n if (isNodeFlexWrap &&\n isMainDimDefined &&\n mainContentDim + nextContentDim > definedMainDim &&\n // If there's only one element, then it's bigger than the content\n // and needs its own line\n i !== startLine) {\n nonFlexibleChildrenCount--;\n alreadyComputedNextLayout = 1;\n break;\n }\n\n // Disable simple stacking in the main axis for the current line as\n // we found a non-trivial child. The remaining children will be laid out\n // in <Loop C>.\n if (isSimpleStackMain &&\n (getPositionType(child) !== CSS_POSITION_RELATIVE || isFlex(child))) {\n isSimpleStackMain = false;\n firstComplexMain = i;\n }\n\n // Disable simple stacking in the cross axis for the current line as\n // we found a non-trivial child. The remaining children will be laid out\n // in <Loop D>.\n if (isSimpleStackCross &&\n (getPositionType(child) !== CSS_POSITION_RELATIVE ||\n (alignItem !== CSS_ALIGN_STRETCH && alignItem !== CSS_ALIGN_FLEX_START) ||\n isUndefined(child.layout[dim[crossAxis]]))) {\n isSimpleStackCross = false;\n firstComplexCross = i;\n }\n\n if (isSimpleStackMain) {\n child.layout[pos[mainAxis]] += mainDim;\n if (isMainDimDefined) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n mainDim += getDimWithMargin(child, mainAxis);\n crossDim = fmaxf(crossDim, boundAxis(child, crossAxis, getDimWithMargin(child, crossAxis)));\n }\n\n if (isSimpleStackCross) {\n child.layout[pos[crossAxis]] += linesCrossDim + leadingPaddingAndBorderCross;\n if (isCrossDimDefined) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n\n alreadyComputedNextLayout = 0;\n mainContentDim += nextContentDim;\n endLine = i + 1;\n }\n\n // <Loop B> Layout flexible children and allocate empty space\n\n // In order to position the elements in the main axis, we have two\n // controls. The space between the beginning and the first element\n // and the space between each two elements.\n var/*float*/ leadingMainDim = 0;\n var/*float*/ betweenMainDim = 0;\n\n // The remaining available space that needs to be allocated\n var/*float*/ remainingMainDim = 0;\n if (isMainDimDefined) {\n remainingMainDim = definedMainDim - mainContentDim;\n } else {\n remainingMainDim = fmaxf(mainContentDim, 0) - mainContentDim;\n }\n\n // If there are flexible children in the mix, they are going to fill the\n // remaining space\n if (flexibleChildrenCount !== 0) {\n var/*float*/ flexibleMainDim = remainingMainDim / totalFlexible;\n var/*float*/ baseMainDim;\n var/*float*/ boundMainDim;\n\n // If the flex share of remaining space doesn't meet min/max bounds,\n // remove this child from flex calculations.\n currentFlexChild = firstFlexChild;\n while (currentFlexChild !== null) {\n baseMainDim = flexibleMainDim * currentFlexChild.style.flex +\n getPaddingAndBorderAxis(currentFlexChild, mainAxis);\n boundMainDim = boundAxis(currentFlexChild, mainAxis, baseMainDim);\n\n if (baseMainDim !== boundMainDim) {\n remainingMainDim -= boundMainDim;\n totalFlexible -= currentFlexChild.style.flex;\n }\n\n currentFlexChild = currentFlexChild.nextFlexChild;\n }\n flexibleMainDim = remainingMainDim / totalFlexible;\n\n // The non flexible children can overflow the container, in this case\n // we should just assume that there is no space available.\n if (flexibleMainDim < 0) {\n flexibleMainDim = 0;\n }\n\n currentFlexChild = firstFlexChild;\n while (currentFlexChild !== null) {\n // At this point we know the final size of the element in the main\n // dimension\n currentFlexChild.layout[dim[mainAxis]] = boundAxis(currentFlexChild, mainAxis,\n flexibleMainDim * currentFlexChild.style.flex +\n getPaddingAndBorderAxis(currentFlexChild, mainAxis)\n );\n\n maxWidth = CSS_UNDEFINED;\n if (isDimDefined(node, resolvedRowAxis)) {\n maxWidth = node.layout[dim[resolvedRowAxis]] -\n paddingAndBorderAxisResolvedRow;\n } else if (!isMainRowDirection) {\n maxWidth = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis) -\n paddingAndBorderAxisResolvedRow;\n }\n\n // And we recursively call the layout algorithm for this child\n layoutNode(/*(java)!layoutContext, */currentFlexChild, maxWidth, direction);\n\n child = currentFlexChild;\n currentFlexChild = currentFlexChild.nextFlexChild;\n child.nextFlexChild = null;\n }\n\n // We use justifyContent to figure out how to allocate the remaining\n // space available\n } else if (justifyContent !== CSS_JUSTIFY_FLEX_START) {\n if (justifyContent === CSS_JUSTIFY_CENTER) {\n leadingMainDim = remainingMainDim / 2;\n } else if (justifyContent === CSS_JUSTIFY_FLEX_END) {\n leadingMainDim = remainingMainDim;\n } else if (justifyContent === CSS_JUSTIFY_SPACE_BETWEEN) {\n remainingMainDim = fmaxf(remainingMainDim, 0);\n if (flexibleChildrenCount + nonFlexibleChildrenCount - 1 !== 0) {\n betweenMainDim = remainingMainDim /\n (flexibleChildrenCount + nonFlexibleChildrenCount - 1);\n } else {\n betweenMainDim = 0;\n }\n } else if (justifyContent === CSS_JUSTIFY_SPACE_AROUND) {\n // Space on the edges is half of the space between elements\n betweenMainDim = remainingMainDim /\n (flexibleChildrenCount + nonFlexibleChildrenCount);\n leadingMainDim = betweenMainDim / 2;\n }\n }\n\n // <Loop C> Position elements in the main axis and compute dimensions\n\n // At this point, all the children have their dimensions set. We need to\n // find their position. In order to do that, we accumulate data in\n // variables that are also useful to compute the total dimensions of the\n // container!\n mainDim += leadingMainDim;\n\n for (i = firstComplexMain; i < endLine; ++i) {\n child = node.children[i];\n\n if (getPositionType(child) === CSS_POSITION_ABSOLUTE &&\n isPosDefined(child, leading[mainAxis])) {\n // In case the child is position absolute and has left/top being\n // defined, we override the position to whatever the user said\n // (and margin/border).\n child.layout[pos[mainAxis]] = getPosition(child, leading[mainAxis]) +\n getLeadingBorder(node, mainAxis) +\n getLeadingMargin(child, mainAxis);\n } else {\n // If the child is position absolute (without top/left) or relative,\n // we put it at the current accumulated offset.\n child.layout[pos[mainAxis]] += mainDim;\n\n // Define the trailing position accordingly.\n if (isMainDimDefined) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n // Now that we placed the element, we need to update the variables\n // We only need to do that for relative elements. Absolute elements\n // do not take part in that phase.\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n // The main dimension is the sum of all the elements dimension plus\n // the spacing.\n mainDim += betweenMainDim + getDimWithMargin(child, mainAxis);\n // The cross dimension is the max of the elements dimension since there\n // can only be one element in that cross dimension.\n crossDim = fmaxf(crossDim, boundAxis(child, crossAxis, getDimWithMargin(child, crossAxis)));\n }\n }\n }\n\n var/*float*/ containerCrossAxis = node.layout[dim[crossAxis]];\n if (!isCrossDimDefined) {\n containerCrossAxis = fmaxf(\n // For the cross dim, we add both sides at the end because the value\n // is aggregate via a max function. Intermediate negative values\n // can mess this computation otherwise\n boundAxis(node, crossAxis, crossDim + paddingAndBorderAxisCross),\n paddingAndBorderAxisCross\n );\n }\n\n // <Loop D> Position elements in the cross axis\n for (i = firstComplexCross; i < endLine; ++i) {\n child = node.children[i];\n\n if (getPositionType(child) === CSS_POSITION_ABSOLUTE &&\n isPosDefined(child, leading[crossAxis])) {\n // In case the child is absolutely positionned and has a\n // top/left/bottom/right being set, we override all the previously\n // computed positions to set it correctly.\n child.layout[pos[crossAxis]] = getPosition(child, leading[crossAxis]) +\n getLeadingBorder(node, crossAxis) +\n getLeadingMargin(child, crossAxis);\n\n } else {\n var/*float*/ leadingCrossDim = leadingPaddingAndBorderCross;\n\n // For a relative children, we're either using alignItems (parent) or\n // alignSelf (child) in order to determine the position in the cross axis\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n /*eslint-disable */\n // This variable is intentionally re-defined as the code is transpiled to a block scope language\n var/*css_align_t*/ alignItem = getAlignItem(node, child);\n /*eslint-enable */\n if (alignItem === CSS_ALIGN_STRETCH) {\n // You can only stretch if the dimension has not already been set\n // previously.\n if (isUndefined(child.layout[dim[crossAxis]])) {\n child.layout[dim[crossAxis]] = fmaxf(\n boundAxis(child, crossAxis, containerCrossAxis -\n paddingAndBorderAxisCross - getMarginAxis(child, crossAxis)),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, crossAxis)\n );\n }\n } else if (alignItem !== CSS_ALIGN_FLEX_START) {\n // The remaining space between the parent dimensions+padding and child\n // dimensions+margin.\n var/*float*/ remainingCrossDim = containerCrossAxis -\n paddingAndBorderAxisCross - getDimWithMargin(child, crossAxis);\n\n if (alignItem === CSS_ALIGN_CENTER) {\n leadingCrossDim += remainingCrossDim / 2;\n } else { // CSS_ALIGN_FLEX_END\n leadingCrossDim += remainingCrossDim;\n }\n }\n }\n\n // And we apply the position\n child.layout[pos[crossAxis]] += linesCrossDim + leadingCrossDim;\n\n // Define the trailing position accordingly.\n if (isCrossDimDefined) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n }\n\n linesCrossDim += crossDim;\n linesMainDim = fmaxf(linesMainDim, mainDim);\n linesCount += 1;\n startLine = endLine;\n }\n\n // <Loop E>\n //\n // Note(prenaux): More than one line, we need to layout the crossAxis\n // according to alignContent.\n //\n // Note that we could probably remove <Loop D> and handle the one line case\n // here too, but for the moment this is safer since it won't interfere with\n // previously working code.\n //\n // See specs:\n // http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/#layout-algorithm\n // section 9.4\n //\n if (linesCount > 1 && isCrossDimDefined) {\n var/*float*/ nodeCrossAxisInnerSize = node.layout[dim[crossAxis]] -\n paddingAndBorderAxisCross;\n var/*float*/ remainingAlignContentDim = nodeCrossAxisInnerSize - linesCrossDim;\n\n var/*float*/ crossDimLead = 0;\n var/*float*/ currentLead = leadingPaddingAndBorderCross;\n\n var/*css_align_t*/ alignContent = getAlignContent(node);\n if (alignContent === CSS_ALIGN_FLEX_END) {\n currentLead += remainingAlignContentDim;\n } else if (alignContent === CSS_ALIGN_CENTER) {\n currentLead += remainingAlignContentDim / 2;\n } else if (alignContent === CSS_ALIGN_STRETCH) {\n if (nodeCrossAxisInnerSize > linesCrossDim) {\n crossDimLead = (remainingAlignContentDim / linesCount);\n }\n }\n\n var/*int*/ endIndex = 0;\n for (i = 0; i < linesCount; ++i) {\n var/*int*/ startIndex = endIndex;\n\n // compute the line's height and find the endIndex\n var/*float*/ lineHeight = 0;\n for (ii = startIndex; ii < childCount; ++ii) {\n child = node.children[ii];\n if (getPositionType(child) !== CSS_POSITION_RELATIVE) {\n continue;\n }\n if (child.lineIndex !== i) {\n break;\n }\n if (!isUndefined(child.layout[dim[crossAxis]])) {\n lineHeight = fmaxf(\n lineHeight,\n child.layout[dim[crossAxis]] + getMarginAxis(child, crossAxis)\n );\n }\n }\n endIndex = ii;\n lineHeight += crossDimLead;\n\n for (ii = startIndex; ii < endIndex; ++ii) {\n child = node.children[ii];\n if (getPositionType(child) !== CSS_POSITION_RELATIVE) {\n continue;\n }\n\n var/*css_align_t*/ alignContentAlignItem = getAlignItem(node, child);\n if (alignContentAlignItem === CSS_ALIGN_FLEX_START) {\n child.layout[pos[crossAxis]] = currentLead + getLeadingMargin(child, crossAxis);\n } else if (alignContentAlignItem === CSS_ALIGN_FLEX_END) {\n child.layout[pos[crossAxis]] = currentLead + lineHeight - getTrailingMargin(child, crossAxis) - child.layout[dim[crossAxis]];\n } else if (alignContentAlignItem === CSS_ALIGN_CENTER) {\n var/*float*/ childHeight = child.layout[dim[crossAxis]];\n child.layout[pos[crossAxis]] = currentLead + (lineHeight - childHeight) / 2;\n } else if (alignContentAlignItem === CSS_ALIGN_STRETCH) {\n child.layout[pos[crossAxis]] = currentLead + getLeadingMargin(child, crossAxis);\n // TODO(prenaux): Correctly set the height of items with undefined\n // (auto) crossAxis dimension.\n }\n }\n\n currentLead += lineHeight;\n }\n }\n\n var/*bool*/ needsMainTrailingPos = false;\n var/*bool*/ needsCrossTrailingPos = false;\n\n // If the user didn't specify a width or height, and it has not been set\n // by the container, then we set it via the children.\n if (!isMainDimDefined) {\n node.layout[dim[mainAxis]] = fmaxf(\n // We're missing the last padding at this point to get the final\n // dimension\n boundAxis(node, mainAxis, linesMainDim + getTrailingPaddingAndBorder(node, mainAxis)),\n // We can never assign a width smaller than the padding and borders\n paddingAndBorderAxisMain\n );\n\n if (mainAxis === CSS_FLEX_DIRECTION_ROW_REVERSE ||\n mainAxis === CSS_FLEX_DIRECTION_COLUMN_REVERSE) {\n needsMainTrailingPos = true;\n }\n }\n\n if (!isCrossDimDefined) {\n node.layout[dim[crossAxis]] = fmaxf(\n // For the cross dim, we add both sides at the end because the value\n // is aggregate via a max function. Intermediate negative values\n // can mess this computation otherwise\n boundAxis(node, crossAxis, linesCrossDim + paddingAndBorderAxisCross),\n paddingAndBorderAxisCross\n );\n\n if (crossAxis === CSS_FLEX_DIRECTION_ROW_REVERSE ||\n crossAxis === CSS_FLEX_DIRECTION_COLUMN_REVERSE) {\n needsCrossTrailingPos = true;\n }\n }\n\n // <Loop F> Set trailing position if necessary\n if (needsMainTrailingPos || needsCrossTrailingPos) {\n for (i = 0; i < childCount; ++i) {\n child = node.children[i];\n\n if (needsMainTrailingPos) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n if (needsCrossTrailingPos) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n }\n\n // <Loop G> Calculate dimensions for absolutely positioned elements\n currentAbsoluteChild = firstAbsoluteChild;\n while (currentAbsoluteChild !== null) {\n // Pre-fill dimensions when using absolute position and both offsets for\n // the axis are defined (either both left and right or top and bottom).\n for (ii = 0; ii < 2; ii++) {\n axis = (ii !== 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;\n\n if (!isUndefined(node.layout[dim[axis]]) &&\n !isDimDefined(currentAbsoluteChild, axis) &&\n isPosDefined(currentAbsoluteChild, leading[axis]) &&\n isPosDefined(currentAbsoluteChild, trailing[axis])) {\n currentAbsoluteChild.layout[dim[axis]] = fmaxf(\n boundAxis(currentAbsoluteChild, axis, node.layout[dim[axis]] -\n getBorderAxis(node, axis) -\n getMarginAxis(currentAbsoluteChild, axis) -\n getPosition(currentAbsoluteChild, leading[axis]) -\n getPosition(currentAbsoluteChild, trailing[axis])\n ),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(currentAbsoluteChild, axis)\n );\n }\n\n if (isPosDefined(currentAbsoluteChild, trailing[axis]) &&\n !isPosDefined(currentAbsoluteChild, leading[axis])) {\n currentAbsoluteChild.layout[leading[axis]] =\n node.layout[dim[axis]] -\n currentAbsoluteChild.layout[dim[axis]] -\n getPosition(currentAbsoluteChild, trailing[axis]);\n }\n }\n\n child = currentAbsoluteChild;\n currentAbsoluteChild = currentAbsoluteChild.nextAbsoluteChild;\n child.nextAbsoluteChild = null;\n }\n }\n\n function layoutNode(node, parentMaxWidth, parentDirection) {\n node.shouldUpdate = true;\n\n var direction = node.style.direction || CSS_DIRECTION_LTR;\n var skipLayout =\n !node.isDirty &&\n node.lastLayout &&\n node.lastLayout.requestedHeight === node.layout.height &&\n node.lastLayout.requestedWidth === node.layout.width &&\n node.lastLayout.parentMaxWidth === parentMaxWidth &&\n node.lastLayout.direction === direction;\n\n if (skipLayout) {\n node.layout.width = node.lastLayout.width;\n node.layout.height = node.lastLayout.height;\n node.layout.top = node.lastLayout.top;\n node.layout.left = node.lastLayout.left;\n } else {\n if (!node.lastLayout) {\n node.lastLayout = {};\n }\n\n node.lastLayout.requestedWidth = node.layout.width;\n node.lastLayout.requestedHeight = node.layout.height;\n node.lastLayout.parentMaxWidth = parentMaxWidth;\n node.lastLayout.direction = direction;\n\n // Reset child layouts\n node.children.forEach(function(child) {\n child.layout.width = undefined;\n child.layout.height = undefined;\n child.layout.top = 0;\n child.layout.left = 0;\n });\n\n layoutNodeImpl(node, parentMaxWidth, parentDirection);\n\n node.lastLayout.width = node.layout.width;\n node.lastLayout.height = node.layout.height;\n node.lastLayout.top = node.layout.top;\n node.lastLayout.left = node.layout.left;\n }\n }\n\n return {\n layoutNodeImpl: layoutNodeImpl,\n computeLayout: layoutNode,\n fillNodes: fillNodes\n };\n})();\n\n// This module export is only used for the purposes of unit testing this file. When\n// the library is packaged this file is included within css-layout.js which forms\n// the public API.\nif (typeof exports === 'object') {\n module.exports = computeLayout;\n}\n\n\n return function(node) {\n /*eslint-disable */\n // disabling ESLint because this code relies on the above include\n computeLayout.fillNodes(node);\n computeLayout.computeLayout(node);\n /*eslint-enable */\n };\n}));\n","\"use strict\";function _interopDefault(e){return e&&\"object\"==typeof e&&\"default\"in e?e.default:e}var React=_interopDefault(require(\"react\")),reactDom=require(\"react-dom\"),computeLayout=_interopDefault(require(\"css-layout\"));function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);\"function\"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_defineProperty(e,t,r[t])})}return e}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}function _typeof2(e){return(_typeof2=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function _typeof(e){return(_typeof=\"function\"==typeof Symbol&&\"symbol\"===_typeof2(Symbol.iterator)?function(e){return _typeof2(e)}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":_typeof2(e)})(e)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function _possibleConstructorReturn(e,t){return!t||\"object\"!==_typeof(t)&&\"function\"!=typeof t?_assertThisInitialized(e):t}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}var Flexbox=function(e){function t(){var e;return _classCallCheck(this,t),(e=_possibleConstructorReturn(this,_getPrototypeOf(t).call(this))).childRefs=[],e.shouldUpdateAgain=!1,e.state={layout:{children:[]}},e}return _inherits(t,React.Component),_createClass(t,[{key:\"componentDidMount\",value:function(){this.forceUpdate()}},{key:\"componentDidUpdate\",value:function(){if(this.shouldUpdateAgain=!this.shouldUpdateAgain,this.shouldUpdateAgain){var e=this.props,t=e.children,r=e.onLayout,n=e.style,o=this.getChildrenMeasured(this.childRefs),i=this.getFlattenedChildren(t),u=this.getChildrenAsMergedStyles(i,o),c=this.getComputedLayout(u,n);r(c),this.setState({layout:c})}}},{key:\"getFlattenedChildren\",value:function(e){return e.filter(function(e){return e}).filter(function(e){return\"string\"!=typeof e}).map(function(e){return Array.isArray(e)?e:[e]}).reduce(function(e,t){return e.concat(t)},[])}},{key:\"getChildrenAsMergedStyles\",value:function(e,t){return t.map(function(t,r){var n=e[r]||{},o=n&&n.props?n.props.style:{};return{style:_objectSpread({},o,{height:t.height||o.height,width:t.width||o.width})}})}},{key:\"getChildrenMeasured\",value:function(e){return e&&e.length?e.map(function(e){return e.getBBox?e.getBBox():reactDom.findDOMNode(e).getBBox()}):[]}},{key:\"getComputedLayout\",value:function(e,t){var r={children:Array.from(e||[]),style:_objectSpread({},t)};return computeLayout(r),r}},{key:\"getLayoutChildren\",value:function(e){return e&&e.children&&e.children.length?e.children:[]}},{key:\"getLayoutAttributesForChild\",value:function(e,t){if(t&&t.layout){var r=t.layout,n=r.left,o=r.top;switch(e.type){case\"circle\":var i=e.props.r||0;return{cx:n+i,cy:o+i};case\"ellipse\":return{cx:n+(e.props.rx||0),cy:o+(e.props.ry||0)};case\"g\":case\"path\":case\"polygon\":case\"polyline\":return{transform:\"translate(\".concat(n,\" \").concat(o,\")\")};default:return{x:n,y:o}}}return{}}},{key:\"render\",value:function(){var e=this,t=this.props,r=t.children,n=t.className,o=t.x,i=t.y,u=this.state.layout;this.childRefs=[];var c=this.getFlattenedChildren(r),a=this.getLayoutChildren(u);return React.createElement(\"g\",{className:n,transform:\"translate(\".concat(o,\" \").concat(i,\")\")},c.map(function(t,r){return React.cloneElement(t,_objectSpread({},t.props,e.getLayoutAttributesForChild(t,a[r]),{key:\"child-\".concat(r),ref:function(t){return t?e.childRefs.push(t):null}}))}))}}]),t}();Flexbox.defaultProps={children:[],className:null,onLayout:function(){},style:{},x:0,y:0},module.exports=Flexbox;\n","import ElementWrapper from \"./elementWrapper\";\r\nimport { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\nimport IPosition from \"../../models/position\";\r\nimport IElementProps from \"../../models/IElementProps\";\r\nimport IPort from \"../../models/IPort\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport Flatten from \"flatten-js\";\r\nimport { getElementRotationInfo, getRectangleCorners } from \"../../utils/portSlideRailSVGUtil\";\r\nimport { calculateAngleWithOx, getRotatedRectangleCoordinates } from \"../../utils/mathUtil\";\r\nimport { checkSamePosition, findNearestPosition } from \"../../utils/positionUtil\";\r\nimport Text from \"../texts/text\";\r\nimport { SubObjectDirection } from \"../../models/enums/SubObjectDirection\";\r\nimport { checkPositionOnLine } from \"../../utils/lineUtil\";\r\nimport React from \"react\";\r\nimport useSelectionFrame from \"../../hooks/useSelectionFrame\";\r\nimport { PORT_DEFAULT_SIZE, PORT_LABEL_POSITION, PORT_MOVING_OFFSET_THRESHOLD, PORT_PLACEHOLDER_DEFAULT_SIZE, PORT_PLACEHOLDER_DEFAULT_STROKE, PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH } from \"../../utils/constants\";\r\nimport IElementLink from \"../../models/IElementLink\";\r\nimport { Port } from \"../ports/port\";\r\nimport Flexbox from 'react-svg-flexbox'\r\n\r\ninterface IPortState extends IPort {\r\n ref: React.RefObject<SVGSVGElement>\r\n}\r\n\r\nconst Element: React.FC<IElementProps> = (props) => {\r\n const { id, x, y, width, height, portPlaceholderShape, children, container, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize, onClick, onContextMenu, renderShape, onMoved, onPortMoved, onResized, onPortMouseDown, onPortMouseUp, onMouseMove, onMouseLeave, onMouseUp, onMouseUpAtLinkedPortPlaceholder, onTextUpdated } = props;\r\n\r\n const [selectedPort, setSelectedPort] = useState<IPortState>();\r\n const [hoveredPort, setHoveredPort] = useState<IPortState>();\r\n\r\n const [ports, setPorts] = useState<IPortState[]>(props.ports?.map(p => {\r\n return {\r\n ...p,\r\n id: p.id, // clone id to avoid mutation\r\n ref: React.createRef<SVGSVGElement>()\r\n } as IPortState\r\n }) ?? [])\r\n const [someElementLinkStarted, setSomeElementLinkStarted] = useState<boolean>(false)\r\n const [potentialPortPosition, setPotentialPortPosition] = useState<IPosition>()\r\n\r\n const _paperEventEmitterContext = useContext(paperEventEmitterContext);\r\n const elementRef = useRef<SVGSVGElement>(null)\r\n const elementLinkStarted = useRef<IElementLink>()\r\n\r\n //Listen a new port is created, after add new port to ports state\r\n useEffect(() => {\r\n setPorts(prev => props.ports?.map((p, index) => {\r\n let position = p.position;\r\n\r\n //Handle the case when the port is created.\r\n if (!prev[index]?.ref) {\r\n position = normalizePortPosition(position)\r\n onPortMoved?.(p, id, p.position, position)\r\n _paperEventEmitterContext.emitPortMoved(p, id, p.position, position)\r\n }\r\n\r\n return {\r\n ...p,\r\n position,\r\n id: p.id, // clone id to avoid mutation\r\n ref: prev[index]?.ref || React.createRef<SVGSVGElement>()\r\n } as IPortState\r\n }) ?? [])\r\n }, [props.ports?.length])\r\n\r\n //Listen trigger of Delete key, handle delete port is selected\r\n useEffect(() => {\r\n const listener = _paperEventEmitterContext.onCommandDeleteSelectedPort(() => {\r\n if (selectedPort) {\r\n setPorts(prev => prev.filter(p => p.id !== selectedPort.id))\r\n setSelectedPort(undefined)\r\n }\r\n })\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedPort])\r\n\r\n useEffect(() => {\r\n //Listener onMouseDown event on #paper-container\r\n const eventListener = _paperEventEmitterContext.onPaperClicked((ev) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n //listen element resize to update position of the ports by element size.\r\n const eleResizeListener = _paperEventEmitterContext.onElementResized(id, () => {\r\n const newPorts = ports.map(port => {\r\n const newPosition = normalizePortPosition({ x: port.position.x, y: port.position.y })\r\n\r\n //Check port moved\r\n if (port.position.x !== newPosition.x || port.position.y !== newPosition.y) {\r\n onPortMoved?.(port, id, port.position, newPosition)\r\n _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition)\r\n }\r\n\r\n return {\r\n ...port,\r\n position: newPosition\r\n }\r\n })\r\n\r\n setPorts(newPorts)\r\n })\r\n\r\n return () => {\r\n eventListener.off();\r\n eleResizeListener.off();\r\n }\r\n }, [ports, onPortMoved])\r\n\r\n //Listen creating element link started, ended.\r\n useEffect(() => {\r\n const elementStartedListener = _paperEventEmitterContext.onElementLinkStarted((tempLink: IElementLink) => {\r\n elementLinkStarted.current = tempLink;\r\n setSomeElementLinkStarted(true)\r\n\r\n })\r\n\r\n const elementEndedListener = _paperEventEmitterContext.onElementLinkEnded(() => {\r\n elementLinkStarted.current = undefined;\r\n setSomeElementLinkStarted(false)\r\n setPotentialPortPosition(undefined)\r\n setHoveredPort(undefined)\r\n })\r\n\r\n return () => {\r\n elementStartedListener.off()\r\n elementEndedListener.off()\r\n }\r\n }, [])\r\n\r\n //Listen another port is selected\r\n useEffect(() => {\r\n const portSelectedListener = _paperEventEmitterContext.onPortSelected((port, elementId) => {\r\n if (elementId !== id) {\r\n setSelectedPort(undefined)\r\n }\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen text is selected\r\n useEffect(() => {\r\n const textSelectedListener = _paperEventEmitterContext.onTextSelected((text) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n return () => {\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen another element is selected\r\n useEffect(() => {\r\n const portSelectedListener = _paperEventEmitterContext.onElementSelected((element) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n const handleSelectedPort = (port: IPortState, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n setSelectedPort(port)\r\n _paperEventEmitterContext.emitPortSelected(port, id)\r\n }\r\n\r\n //From one point find another point on the line segment so that the distance between the two points is the shortest.\r\n const findNearestPointOnSegment = (position: IPosition, linePoints: IPosition[]): IPosition => {\r\n const [beginPosition, endPosition] = linePoints;\r\n const point = Flatten.point(position.x, position.y);\r\n\r\n let segment = Flatten.segment(Flatten.point(beginPosition.x, beginPosition.y), Flatten.point(endPosition.x, endPosition.y));\r\n\r\n const [num, segmentFromPointToSegment] = point.distanceTo(segment)\r\n\r\n return {\r\n x: segmentFromPointToSegment.pe.x,\r\n y: segmentFromPointToSegment.pe.y\r\n }\r\n }\r\n\r\n //From 1 point find another point on the line segment so that the distance between 2 points is shortest.\r\n const findNearestProjectedPoint = (position: IPosition, linePositions: IPosition[][]) => {\r\n const possiblePoints = linePositions.map(p => findNearestPointOnSegment(position, p))\r\n\r\n const nearestPoint = findNearestPosition(possiblePoints, position)\r\n return nearestPoint;\r\n }\r\n\r\n //Check if a point is inside a polygon\r\n const checkPointContainsPolygon = (position: IPosition, polygonPoints: IPosition[]): boolean => {\r\n const polygon = new Flatten.Polygon();\r\n polygon.addFace(polygonPoints.map(p => Flatten.point(p.x, p.y)))\r\n\r\n return polygon.contains(Flatten.point(position.x, position.y))\r\n }\r\n\r\n //Normalize a point so that it can lie exactly on an area\r\n const normalizePortPositionOnMoveableAreas = (moveableAreas: IPosition[][], position: IPosition): IPosition | undefined => {\r\n const lines = moveableAreas.filter(area => area.length === 2)\r\n const polygons = moveableAreas.filter(area => area.length >= 3);\r\n\r\n let normalizedPosition;\r\n\r\n //If moveableAreas is lines\r\n if (lines.length > 0) {\r\n const newPosition = findNearestProjectedPoint({ x: position.x, y: position.y }, lines)\r\n\r\n if (newPosition) {\r\n normalizedPosition = newPosition;\r\n }\r\n }\r\n //If moveableAreas is polygons\r\n else if (polygons.length > 0) {\r\n const newPosition = { x: position.x, y: position.y }\r\n const isContainsInPolygons = polygons.some(p => checkPointContainsPolygon(newPosition, p))\r\n\r\n if (isContainsInPolygons) {\r\n normalizedPosition = newPosition;\r\n }\r\n }\r\n\r\n return normalizedPosition;\r\n }\r\n\r\n //Calculate the position of the 4 vertices of a rectangle relative to element\r\n const calculateSlideRailRectSVGPositions = (slideRailSVG: SVGRectElement): IPosition[] => {\r\n let coordinates = getRectangleCorners(slideRailSVG)\r\n const ownerSVG = slideRailSVG.ownerSVGElement;\r\n\r\n const rotationAngle = getElementRotationInfo(ownerSVG!)\r\n\r\n if (rotationAngle !== 0) {\r\n const rotationCenterX = width / 2;\r\n const rotationCenterY = height / 2;\r\n coordinates = getRotatedRectangleCoordinates(coordinates, rotationCenterX, rotationCenterY, rotationAngle)\r\n }\r\n\r\n return coordinates;\r\n }\r\n\r\n const getSlideRailSVG = useCallback((portSlideRailSVGClassName: string) => {\r\n const slideRailSVG = elementRef.current?.querySelector(`.${portSlideRailSVGClassName}`)\r\n return slideRailSVG;\r\n }, [elementRef.current])\r\n\r\n const normalizePortPositionOnSlideRailSVG = (portSlideRailSVGClassName: string, position: IPosition): IPosition | undefined => {\r\n const slideRailSVG = getSlideRailSVG(portSlideRailSVGClassName)\r\n if (!slideRailSVG) return;\r\n\r\n let moveTo;\r\n\r\n //check and get new position if Rect element\r\n if (slideRailSVG instanceof SVGRectElement) {\r\n const [a, b, c, d] = calculateSlideRailRectSVGPositions(slideRailSVG); //Get 4 vertices of rect element\r\n\r\n const moveableAreas = [\r\n [a, b],\r\n [b, c],\r\n [c, d],\r\n [d, a]\r\n ]\r\n\r\n const newPosition = normalizePortPositionOnMoveableAreas(moveableAreas, position)\r\n\r\n if (newPosition) {\r\n moveTo = newPosition\r\n }\r\n } else if (slideRailSVG instanceof SVGCircleElement) { //check and get new position if circle element\r\n const cx = Number(slideRailSVG.getAttribute('cx'))\r\n const cy = Number(slideRailSVG.getAttribute('cy'))\r\n const r = Number(slideRailSVG.getAttribute('r'))\r\n const circle = Flatten.circle(Flatten.point(cx, cy), r)\r\n const [num, segment] = circle.distanceTo(Flatten.point(position.x, position.y))\r\n\r\n if (num <= r) {\r\n moveTo = {\r\n x: segment.ps.x,\r\n y: segment.ps.y,\r\n }\r\n }\r\n }\r\n\r\n return moveTo;\r\n }\r\n\r\n //Normalize port position\r\n const normalizePortPosition = (tempNewPosition: IPosition): IPosition => {\r\n let newPosition;\r\n\r\n if (portMoveableAreas && portMoveableAreas.length > 0) { //If moveable areas is defined\r\n newPosition = normalizePortPositionOnMoveableAreas(portMoveableAreas, tempNewPosition)\r\n }\r\n\r\n else if (portSlideRailSVGClassName) { //If port slide rail svg classname is defined\r\n newPosition = normalizePortPositionOnSlideRailSVG(portSlideRailSVGClassName, tempNewPosition)\r\n }\r\n\r\n return newPosition || tempNewPosition;\r\n }\r\n\r\n const handlePortMove = (offsetX: number, offsetY: number) => {\r\n if (!selectedPort) return;\r\n\r\n const oldPosition = { ...selectedPort.position };\r\n const tempNewPosition = { x: oldPosition.x + offsetX, y: oldPosition.y + offsetY };\r\n\r\n //handle to keep the port always in the correct allowed position\r\n const newPosition = normalizePortPosition(tempNewPosition);\r\n\r\n if (newPosition) {\r\n selectedPort.position = newPosition;\r\n\r\n onPortMoved?.(selectedPort, id, oldPosition, newPosition)\r\n setPorts([...ports])\r\n _paperEventEmitterContext.emitPortMoved(selectedPort, id, oldPosition, newPosition)\r\n }\r\n }\r\n\r\n //Handle when mouse down on port\r\n const handlePortMouseDown = (portId: string, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n const port = ports.find(p => p.id === portId)\r\n\r\n _paperEventEmitterContext.emitPortMouseDown(e, port!, id)\r\n onPortMouseDown?.(e, port!, id)\r\n }\r\n\r\n //Handle when mouse up on port\r\n const handlePortMouseUp = (portId: string, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n const port = ports.find(p => p.id === portId)\r\n\r\n _paperEventEmitterContext.emitPortMouseUp(e, port!, id)\r\n onPortMouseUp?.(e, port!, id)\r\n\r\n //Remove port placeholder if mouse up on port\r\n if (potentialPortPosition) {\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n\r\n //Update state when label of port is moved\r\n const handlePortLabelMoved = (offsetX: number, offsetY: number, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n const labelPos = port.label.position || PORT_LABEL_POSITION\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n const newLabelPosition = {\r\n x: labelPos.x + offsetX,\r\n y: labelPos.y + offsetY\r\n }\r\n\r\n newPorts[index].label!.position = newLabelPosition;\r\n return newPorts\r\n })\r\n }\r\n\r\n //Update state when label of port is resized\r\n const handlePortLabelResized = (width: number, height: number, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n const newLabelSize = {\r\n width,\r\n height\r\n }\r\n\r\n newPorts[index].label!.size = newLabelSize;\r\n return newPorts\r\n })\r\n }\r\n\r\n //Update state when label of port is changed content\r\n const handlePortLabelContentChanged = (newValue: string, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n newPorts[index].label!.content = newValue;\r\n return newPorts\r\n })\r\n }\r\n\r\n\r\n function handleElementMouseMove(ev: React.MouseEvent) {\r\n //ev.stopPropagation(); //Can't use stopPropagation here, because do not create tempLink\r\n\r\n if (someElementLinkStarted && elementRef.current) {\r\n //If an element link is being created, calculate the potential port position when the mouse moves over the element.\r\n if (hoveredPort) {\r\n setPotentialPortPosition(undefined)\r\n return;\r\n }\r\n /* The above code is calculating the relative position of the mouse within a specific\r\n element on the page. It first gets the bounding rectangle of the element using\r\n `getBoundingClientRect()` and the bounding box of the element using `getBBox()`. Then,\r\n it calculates the relative position of the mouse within the element by subtracting the\r\n element's position from the mouse's position. The result is stored in the\r\n `mousePositionOnElement` object, which contains the x and y coordinates of the mouse\r\n relative to the element. */\r\n const elementBounding = elementRef.current.getBoundingClientRect()\r\n const elementBBox = elementRef.current.getBBox();\r\n\r\n //Get relative position of mouse on element\r\n const mousePositionOnElement = {\r\n x: ev.clientX - (elementBounding.left - elementBBox.x),\r\n y: ev.clientY - (elementBounding.top - elementBBox.y),\r\n }\r\n\r\n const tempPotentialPortPosition = normalizePortPosition(mousePositionOnElement)\r\n\r\n //Kiểm tra điểm potential(Điểm này nằm trên portMoveableAreas) có nằm trong phạm vi bán kính của vị trí con trỏ chuột không\r\n //Nếu có thì cho nó là potentialPortPosition và hiện portPlaceholderShape\r\n //Nếu không thì bỏ qua hoặc xóa potentialPortPosition.\r\n if (checkSamePosition(mousePositionOnElement, tempPotentialPortPosition, 5)) {\r\n setPotentialPortPosition(tempPotentialPortPosition)\r\n } else {\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n }\r\n\r\n function handleElementMouseLeave(ev: React.MouseEvent) {\r\n ev.stopPropagation()\r\n\r\n if (someElementLinkStarted) { //If an element link is being created, clear the placeholder when the mouse leaves the element.\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n\r\n const handleElementMouseUp = (ev: React.MouseEvent) => {\r\n ev.stopPropagation();\r\n\r\n //If an element link is being created, trigger onMouseUpAtLinkedPortPlaceholder when the mouse up the element.\r\n if (potentialPortPosition && elementLinkStarted.current) {\r\n const newElementLink: IElementLink = {\r\n ...elementLinkStarted.current,\r\n tempTargetPosition: undefined,\r\n }\r\n\r\n onMouseUpAtLinkedPortPlaceholder?.(newElementLink, potentialPortPosition)\r\n elementLinkStarted.current = undefined;\r\n }\r\n }\r\n\r\n //Get rotate angle of port by port direction is defined.\r\n const rotatePort = useCallback((x: number, y: number): number => {\r\n // console.info('calculating port rotation', x, y)\r\n\r\n if (!portSlideRailSVGClassName) return 0;\r\n\r\n const slideRailSVG = getSlideRailSVG(portSlideRailSVGClassName)\r\n if (!slideRailSVG) return 0;\r\n\r\n let rotationAngle: number = 0;\r\n\r\n //Standardize the port position to be in the correct position\r\n const normalizedPosition = normalizePortPosition({ x, y })\r\n\r\n switch (portDirection) {\r\n case SubObjectDirection.Radial:\r\n const center = {\r\n x: width / 2,\r\n y: height / 2\r\n }\r\n\r\n rotationAngle = calculateAngleWithOx(normalizedPosition, center)\r\n break;\r\n\r\n case SubObjectDirection.PerpendicularInward:\r\n //0,90,180,270;\r\n //Hardcode with port move on rect svg case.\r\n const [a, b, c, d] = calculateSlideRailRectSVGPositions(slideRailSVG as SVGRectElement)\r\n\r\n const rotationAngleOfElement = getElementRotationInfo((slideRailSVG as SVGRectElement).ownerSVGElement!)\r\n\r\n if (checkPositionOnLine(normalizedPosition, [a, b])) { //Check position of port on top segment\r\n rotationAngle = 90;\r\n } else if (checkPositionOnLine(normalizedPosition, [b, c])) { //Check position of port on right segment\r\n rotationAngle = 180;\r\n } else if (checkPositionOnLine(normalizedPosition, [c, d])) { //Check position of port on bottom segment\r\n rotationAngle = 270;\r\n } else if (checkPositionOnLine(normalizedPosition, [d, a])) { //Check position of port on left segment\r\n rotationAngle = 0;\r\n }\r\n\r\n rotationAngle += rotationAngleOfElement;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return rotationAngle;\r\n }, [portSlideRailSVGClassName, portDirection, getSlideRailSVG])\r\n\r\n const renderedShape = useMemo(() => {\r\n if (renderShape) return renderShape(props);\r\n return null;\r\n }, [props])\r\n\r\n\r\n //Re-render port again after rendered to automation rotate port\r\n //Because elementRef.current equals null in first render so automation rotate port is incorrect.\r\n //TODO: check if this is still needed -> Still needed\r\n useLayoutEffect(() => {\r\n if (elementRef.current) {\r\n setPorts(prev => [...prev])\r\n }\r\n }, [])\r\n\r\n\r\n //use selection frame\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: selectedPort?.ref.current || undefined,\r\n resizability: {\r\n enabled: false,\r\n keepRatio: false\r\n },\r\n // width: selectedPort?.size.width,\r\n // height: selectedPort?.size.height,\r\n movingOffsetThreshold: PORT_MOVING_OFFSET_THRESHOLD,\r\n onMove: handlePortMove\r\n });\r\n\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: hoveredPort?.ref.current || undefined,\r\n resizability: {\r\n enabled: false,\r\n keepRatio: false\r\n },\r\n });\r\n\r\n return (\r\n <ElementWrapper\r\n ref={elementRef}\r\n x={x}\r\n y={y}\r\n onClick={(e) => onClick ? onClick(id, e, elementRef.current) : true}\r\n onMouseMove={handleElementMouseMove}\r\n onMouseLeave={handleElementMouseLeave}\r\n onMouseUp={handleElementMouseUp}\r\n onContextMenu={(e) => onContextMenu ? onContextMenu(id, e, elementRef.current) : true}\r\n >\r\n {/* Shape of the element */}\r\n {renderedShape}\r\n {potentialPortPosition && (\r\n portPlaceholderShape\r\n ? <svg\r\n x={potentialPortPosition.x}\r\n y={potentialPortPosition.y}\r\n >\r\n {portPlaceholderShape}\r\n </svg>\r\n : <rect\r\n x={potentialPortPosition.x - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2}\r\n y={potentialPortPosition.y - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2}\r\n width={PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH}\r\n height={PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH}\r\n rx={PORT_PLACEHOLDER_DEFAULT_SIZE}\r\n ry={PORT_PLACEHOLDER_DEFAULT_SIZE}\r\n stroke={PORT_PLACEHOLDER_DEFAULT_STROKE}\r\n fill=\"none\"\r\n strokeWidth={3}\r\n />)}\r\n {ports?.map((p, index) => {\r\n return <Port\r\n key={p.id}\r\n ref={p.ref}\r\n id={p.id}\r\n x={p.position.x}\r\n y={p.position.y}\r\n width={p.size?.width ?? defaultPortSize ?? PORT_DEFAULT_SIZE}\r\n height={p.size?.height ?? defaultPortSize ?? PORT_DEFAULT_SIZE}\r\n container={container}\r\n // rotation={rotatePort(p)}\r\n calculateRotationAngle={rotatePort}\r\n\r\n label={p.label}\r\n onPortLabelMoved={(x, y) => handlePortLabelMoved(x, y, p, index)}\r\n onPortLabelResized={(w, h) => handlePortLabelResized(w, h, p, index)}\r\n onPortLabelContentChanged={(ev, newValue) => handlePortLabelContentChanged(newValue, p, index)}\r\n\r\n onSelected={(portId, event) => handleSelectedPort(p, event)}\r\n onMouseDown={handlePortMouseDown}\r\n onMouseUp={handlePortMouseUp}\r\n onMouseMove={() => {\r\n if (someElementLinkStarted) setHoveredPort(p)\r\n }}\r\n // onMouseEnter={() => {\r\n // if (someElementLinkStarted) setHoveredPort(p)\r\n // }}\r\n\r\n onMouseLeave={() => {\r\n console.log('onMouseLeave')\r\n if (someElementLinkStarted) setHoveredPort(undefined)\r\n }}\r\n\r\n renderShape={p.renderShape}\r\n />\r\n })}\r\n <Flexbox\r\n className={textsPlaceHolderClassName}\r\n style={textsPlaceHolderFlexStyle}\r\n x={textsPlaceHolderFlexboxPosition?.x}\r\n y={textsPlaceHolderFlexboxPosition?.y}\r\n >\r\n {texts?.map((t, index) => {\r\n return <Text\r\n id={t.id}\r\n key={index}\r\n content={t.content}\r\n x={t.position?.x}\r\n y={t.position?.y}\r\n width={t.size.width}\r\n height={t.size.height}\r\n align={t.align}\r\n fontSize={t.fontSize}\r\n border={t.border}\r\n container={container}\r\n style={t.style}\r\n onContentChanged={(ev, newContent) => onTextUpdated?.(t.id, newContent)}\r\n />\r\n })}\r\n </Flexbox>\r\n {children}\r\n </ElementWrapper>\r\n );\r\n};\r\n\r\nexport default Element;","import React, { useEffect, useRef, useState } from \"react\"\r\n\r\n\r\nconst createRect = (x: number, y: number, width: number, height: number, strokeWidth: number, transformOrigin: string, transform?: string | null) => {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', x.toString())\r\n rect.setAttribute('y', y.toString())\r\n rect.setAttribute('width', width.toString())\r\n rect.setAttribute('height', height.toString())\r\n rect.setAttribute('fill', 'none')\r\n rect.setAttribute('stroke', 'green')\r\n rect.setAttribute('stroke-width', strokeWidth.toString())\r\n transform && rect.setAttribute('transform', transform)\r\n rect.style.transformBox = 'content-box';\r\n rect.style.transformOrigin = transformOrigin\r\n\r\n return rect;\r\n}\r\ninterface IBBoxDebuggerProps {\r\n elementSVG: SVGSVGElement | null;\r\n}\r\n\r\nexport default function BBoxDebugger({\r\n elementSVG\r\n}: IBBoxDebuggerProps) {\r\n const [isTurnOn, setIsTurnOn] = useState<boolean>(false)\r\n const displayedBBoxDebug = useRef<SVGRectElement[]>([])\r\n\r\n useEffect(() => {\r\n const keyPress = (ev: KeyboardEvent) => {\r\n if (ev.ctrlKey && ev.key === 'b') {\r\n setIsTurnOn(prev => !prev)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', keyPress)\r\n\r\n return () => {\r\n window.removeEventListener('keydown', keyPress)\r\n }\r\n }, [])\r\n\r\n //Get all child elements of current element\r\n const getSVGChild = (svgElement: SVGGraphicsElement): SVGGraphicsElement[] => {\r\n return Array.from(svgElement.childNodes.values()) as SVGGraphicsElement[];\r\n }\r\n\r\n const getListChildrenAndGroupSameLevel = (svgElement: SVGGraphicsElement): SVGGraphicsElement[][] => {\r\n const result = [[svgElement]]; //svg elements is grouped by level;\r\n\r\n let childArray = [svgElement]\r\n do {\r\n const childChild = childArray.reduce<SVGGraphicsElement[]>((acc, item) => {\r\n const child = getSVGChild(item as SVGGraphicsElement)\r\n return acc.concat(child)\r\n }, [])\r\n\r\n if (childChild.length === 0) break;\r\n\r\n result.push(childChild)\r\n childArray = childChild;\r\n } while (childArray.length > 0);\r\n\r\n return result\r\n }\r\n\r\n //Remove all bbox debugger is shown.\r\n const clearBBoxDebugger = (displayedBBox: SVGRectElement[]) => {\r\n while (displayedBBox.length > 0) {\r\n const ele = displayedBBox.pop()\r\n ele?.remove()\r\n }\r\n }\r\n\r\n //Render bbox debugger for element\r\n const createBBoxDebugger = (element: SVGGraphicsElement): SVGRectElement => {\r\n let container;\r\n\r\n if (element instanceof SVGSVGElement) {\r\n container = element\r\n } else {\r\n container = element.ownerSVGElement\r\n }\r\n\r\n const bbox = element.getBBox();\r\n const strokeWidth = Number(element.getAttribute('stroke-width')) || 4\r\n const transform = element.getAttribute('transform')\r\n const transformOrigin = element.style.transformOrigin;\r\n const rect = createRect(bbox.x, bbox.y, bbox.width, bbox.height, strokeWidth, transformOrigin, transform)\r\n\r\n container?.appendChild(rect)\r\n\r\n return rect;\r\n }\r\n\r\n //Displays the debugger bboxes for elements in sequence by level.\r\n const showBBoxDebugger = (listChildrenGroupByLevel: SVGGraphicsElement[][]) => {\r\n let increment = 1;\r\n let currentIndex = 0;\r\n\r\n const intervalId = setInterval(() => {\r\n //Clear bbox debugger of previous level\r\n clearBBoxDebugger(displayedBBoxDebug.current)\r\n\r\n if (currentIndex === listChildrenGroupByLevel.length) { //If at the last level, run back\r\n increment = -1;\r\n currentIndex = listChildrenGroupByLevel.length - 2;\r\n return;\r\n } else if (currentIndex === -1) { //If on first level, run to next level\r\n increment = 1;\r\n currentIndex = 0;\r\n return;\r\n }\r\n\r\n const svgChildCurrentLevel = listChildrenGroupByLevel[currentIndex];\r\n\r\n svgChildCurrentLevel.forEach(svg => {\r\n const rect = createBBoxDebugger(svg);\r\n displayedBBoxDebug.current.push(rect)\r\n })\r\n\r\n currentIndex += increment;\r\n }, 1000)\r\n\r\n return intervalId;\r\n }\r\n\r\n useEffect(() => {\r\n if (!isTurnOn || !elementSVG) return;\r\n\r\n const listChildrenGroupByLevel = getListChildrenAndGroupSameLevel(elementSVG);\r\n\r\n const intervalId = showBBoxDebugger(listChildrenGroupByLevel)\r\n\r\n return () => {\r\n //Run clear function on svg element\r\n clearInterval(intervalId)\r\n\r\n //Clear all bbox debugger when debug mode or elementSVG is changed\r\n clearBBoxDebugger(displayedBBoxDebug.current)\r\n }\r\n }, [isTurnOn, elementSVG])\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: 20,\r\n right: 20\r\n }}\r\n >\r\n <div\r\n style={{\r\n backgroundColor: 'white',\r\n boxShadow: '0px 1px 4px 1px',\r\n borderRadius: 4,\r\n padding: 4,\r\n fontSize: 18,\r\n fontWeight: 500\r\n }}\r\n >\r\n Debugger mode: {isTurnOn ? 'ON' : 'OFF'}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import React, { useEffect, useRef, useState } from \"react\"\r\nimport IElementLink from \"../models/IElementLink\"\r\n\r\nconst createDebuggerPoint = (cx: number, cy: number) => {\r\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n circle.setAttribute('cx', cx.toString())\r\n circle.setAttribute('cy', cy.toString())\r\n circle.setAttribute('r', '4')\r\n circle.setAttribute('fill', 'none')\r\n circle.setAttribute('stroke', 'red')\r\n circle.setAttribute('stroke-width', '2')\r\n\r\n return circle;\r\n}\r\n\r\ninterface ILinkDebuggerProps {\r\n links: IElementLink[];\r\n svgContainer: SVGSVGElement;\r\n}\r\nconst LinkDebugger: React.FC<ILinkDebuggerProps> = ({\r\n links,\r\n svgContainer\r\n}) => {\r\n const [isTurnOn, setIsTurnOn] = useState<boolean>(false)\r\n const displayedDebuggerPoint = useRef<SVGCircleElement[]>([])\r\n\r\n useEffect(() => {\r\n const keyPress = (ev: KeyboardEvent) => {\r\n if (ev.ctrlKey && ev.key === 'l') {\r\n setIsTurnOn(prev => !prev)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', keyPress)\r\n\r\n return () => {\r\n window.removeEventListener('keydown', keyPress)\r\n }\r\n }, [])\r\n\r\n const clearDebuggerPoint = () => {\r\n while (displayedDebuggerPoint.current.length > 0) {\r\n const ele = displayedDebuggerPoint.current.pop()\r\n ele?.remove()\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (isTurnOn) {\r\n links.forEach(link => {\r\n link.points?.forEach(p => {\r\n const debuggerPoint = createDebuggerPoint(p.x, p.y)\r\n displayedDebuggerPoint.current.push(debuggerPoint)\r\n svgContainer.appendChild(debuggerPoint)\r\n })\r\n })\r\n }\r\n\r\n return () => {\r\n clearDebuggerPoint()\r\n }\r\n }, [isTurnOn, links])\r\n\r\n return (\r\n <div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default LinkDebugger;","import { useContext, useEffect } from \"react\";\r\nimport { paperEventEmitterContext } from \"../contexts/paperEventEmitterContext\";\r\n\r\ninterface IUseKeyboardCommands {\r\n element?: Element | null;\r\n}\r\n\r\nexport default function useKeyboardCommands({\r\n element,\r\n}: IUseKeyboardCommands) {\r\n const {\r\n emitCommandDeleteSelectedElement,\r\n emitCommandDeleteSelectedLink,\r\n emitCommandDeleteSelectedPort,\r\n emitCommandDeleteSelectedText\r\n } = useContext(paperEventEmitterContext);\r\n\r\n useEffect(() => {\r\n const callback = (ev: Event) => {\r\n const keyboardEv: React.KeyboardEvent<Element> = ev as any;\r\n\r\n if (keyboardEv.key === \"Delete\") {\r\n emitCommandDeleteSelectedElement()\r\n emitCommandDeleteSelectedLink()\r\n emitCommandDeleteSelectedPort()\r\n emitCommandDeleteSelectedText()\r\n }\r\n }\r\n\r\n const _element = element || window;\r\n _element.addEventListener('keydown', callback)\r\n\r\n return () => {\r\n _element.removeEventListener('keydown', callback)\r\n }\r\n }, [element])\r\n}\r\n","import React, { EventHandler, useCallback, useContext, useEffect, useState } from 'react';\r\nimport IElement from '../models/IElement';\r\nimport Ruler from './viewControls/ruler';\r\nimport Element from './elements/element';\r\nimport { paperEventEmitterContext } from '../contexts/paperEventEmitterContext';\r\nimport IElementLink from '../models/IElementLink';\r\nimport ElementLink from './links/elementLink';\r\nimport IPosition from '../models/position';\r\nimport IPort from '../models/IPort';\r\nimport { generateSubstitutePosition, getFirstIntersection } from '../utils/positionUtil';\r\nimport BBoxDebugger from './BBoxDebugger';\r\nimport { LINK_LABEL_POSITION_FROM_LINK_MID_POINT, LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT, LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT, MAX_LINK_KNOT_COUNT } from '../utils/constants';\r\nimport LinkDebugger from './LinkDebugger';\r\nimport useSelectionFrame from '../hooks/useSelectionFrame';\r\nimport useKeyboardCommands from '../hooks/useKeyboardCommands';\r\nimport IText, { IPaperText } from '../models/IText';\r\nimport Text from './texts/text';\r\nimport ISize from '../models/size';\r\nimport generateUniqueId from '../utils/generateUniqueId';\r\n\r\nfunction convertElementsToTree(elements: IElementState[]): IElementInTreeState[] {\r\n //Find child elements in the child elements, that is possible child of element, then return element with child of it.\r\n function findChildElementsOfNode(elementNodeInTree: IElementInTreeState, possibleChildElements: IElementInTreeState[]): IElementInTreeState {\r\n if (possibleChildElements.length === 0) {\r\n elementNodeInTree.childrenElements = undefined;\r\n return elementNodeInTree\r\n };\r\n\r\n const foundChildElements = possibleChildElements.filter(ele => ele.parentElement?.id === elementNodeInTree.id);\r\n const orphanedElements = possibleChildElements.filter(ele => ele.parentElement?.id !== elementNodeInTree.id);\r\n\r\n const childElementsWithChild = foundChildElements.map(_elementNodeInTree => {\r\n const relativePosition = {\r\n x: _elementNodeInTree.position.x - elementNodeInTree.position.x,\r\n y: _elementNodeInTree.position.y - elementNodeInTree.position.y,\r\n }\r\n\r\n _elementNodeInTree.relativePosition = relativePosition;\r\n const newNode = findChildElementsOfNode(_elementNodeInTree, orphanedElements)\r\n return newNode;\r\n })\r\n\r\n elementNodeInTree.childrenElements = childElementsWithChild;\r\n return elementNodeInTree;\r\n }\r\n\r\n const parentElms = elements.filter(e => !e.parentElement);\r\n const childElms = elements.filter(e => e.parentElement);\r\n\r\n const parsedElementsInTree = parentElms.map(ele => {\r\n ele.relativePosition = ele.position;\r\n const eleWithChild = findChildElementsOfNode(ele, childElms);\r\n return eleWithChild;\r\n })\r\n\r\n return parsedElementsInTree;\r\n}\r\n\r\ninterface PaperProps {\r\n size: { width: number, height: number };\r\n elements: IElement[];\r\n links?: IElementLink[];\r\n texts: IPaperText[];\r\n\r\n onPaperClicked?: () => void;\r\n onPortMoved?: (position: IPosition, port: IPort, element: IElement) => void;\r\n onPortSelected?: (port: IPort, element: IElement) => void;\r\n onElementContextMenu?: (element: IElement, mouseEvent: React.MouseEvent<SVGElement>) => void;\r\n onElementMoved?: (position: IPosition, element: IElement, index: number) => void;\r\n onElementResized?: (size: ISize, element: IElement, index: number) => void;\r\n onElementSelected?: (element: IElement) => void;\r\n onLinkSelected?: (link: IElementLink) => void;\r\n onTextSelected?: (text: IText) => void;\r\n\r\n onCreatingPortByLinking?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;\r\n onCreatingLink?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;\r\n}\r\n\r\ninterface IElementState extends IElement {\r\n relativePosition?: IPosition;\r\n}\r\n\r\ninterface IElementInTreeState extends IElementState {\r\n childrenElements?: IElementInTreeState[];\r\n}\r\n\r\nconst Paper: React.FC<PaperProps> = (props) => {\r\n const [elements, setElements] = React.useState<IElementState[]>(props.elements);\r\n const [elementsInTree, setElementsInTree] = React.useState<IElementInTreeState[]>([]);\r\n\r\n const [selectedElement, setSelectedElement] = React.useState<IElementInTreeState>();\r\n\r\n const [links, setLinks] = useState<IElementLink[]>(props.links ?? [])\r\n const [selectedLink, setSelectedLink] = useState<IElementLink>();\r\n const [tempLink, setTempLink] = useState<IElementLink>()\r\n\r\n const [texts, setTexts] = useState<IPaperText[]>(props.texts)\r\n const [selectedText, setSelectedText] = useState<IPaperText>()\r\n\r\n const [selectedElementSVG, setSelectedElementSVG] = useState<SVGSVGElement | null>(null)\r\n const [mouseDownedOnPaper, setMouseDownedOnPaper] = React.useState<boolean>(false);\r\n\r\n const paperEventEmitter = useContext(paperEventEmitterContext)\r\n\r\n const paperContainerRef = React.useRef<SVGSVGElement>(null);\r\n\r\n useKeyboardCommands({\r\n element: paperContainerRef.current as Element\r\n })\r\n\r\n const updateElementsTree = () => {\r\n const parsedElementsInTree = convertElementsToTree(elements)\r\n setElementsInTree(parsedElementsInTree)\r\n }\r\n\r\n //Listen text is selected\r\n useEffect(() => {\r\n const textSelectedListener = paperEventEmitter.onTextSelected((text) => {\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n setSelectedLink(undefined)\r\n\r\n //broadcast selected text to parent component\r\n props.onTextSelected?.(text);\r\n })\r\n\r\n return () => {\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen port is selected\r\n useEffect(() => {\r\n const portSelectedListener = paperEventEmitter.onPortSelected((port, elementId) => {\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n setSelectedLink(undefined)\r\n \r\n //broadcast selected port to parent component\r\n const element = elements.find(e => e.id === elementId);\r\n if (element) {\r\n props.onPortSelected?.(port, element)\r\n }\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n //Listen parent of elements changed, then update elements tree\r\n const parentChangedCancelers = elements.map(element => {\r\n return element.onParentChanged?.((newPa, oldPa) => {\r\n updateElementsTree();\r\n })\r\n })\r\n\r\n //Listen a new port added, then re-render the element component\r\n const addedPortCancelers = elements.map(element => {\r\n return element.onAddedPort?.((newPort) => {\r\n\r\n //Set state to re-render component\r\n setElements(prev => prev.map(ele => {\r\n if (ele.id === element.id) {\r\n ele.ports = [...(ele.ports || [])]\r\n }\r\n\r\n return ele\r\n }))\r\n })\r\n })\r\n\r\n return () => {\r\n parentChangedCancelers.forEach(canceller => canceller?.())\r\n addedPortCancelers.forEach(canceller => canceller())\r\n }\r\n }, elements)\r\n\r\n //Update elements tree when length of elements change\r\n useEffect(() => {\r\n updateElementsTree();\r\n }, [elements.length])\r\n\r\n //Get all child elements of the deleted element\r\n const getDeletedChildElements = (deletedElement: IElementInTreeState): IElement[] => {\r\n if (!deletedElement.childrenElements) return [];\r\n\r\n const childElms = deletedElement.childrenElements;\r\n\r\n const childOfChildElements = childElms.reduce((acc, ele) => {\r\n return [...acc, ...getDeletedChildElements(ele)]\r\n }, [] as IElement[])\r\n\r\n return [...childElms, ...childOfChildElements]\r\n }\r\n\r\n //Listen command delete selected for element\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedElement(() => {\r\n if (selectedElement) {\r\n const deletedChildElements = getDeletedChildElements(selectedElement)\r\n\r\n const deletedElementIds = [...deletedChildElements, selectedElement].map(e => e.id);\r\n\r\n setElements(prev => prev.filter(e => !deletedElementIds.includes(e.id)))\r\n setLinks(prevLinks => prevLinks.filter(l => !deletedElementIds.includes(l.sourceElement.id) && !deletedElementIds.includes(l.targetElement!.id)))\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n }\r\n })\r\n\r\n //broadcast selected element to parent component\r\n if (selectedElement) {\r\n props.onElementSelected?.(selectedElement);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedElement])\r\n\r\n //Listen command delete selected for link\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedLink(() => {\r\n if (selectedLink) {\r\n setLinks(prev => prev.filter(l => l.id !== selectedLink.id))\r\n setSelectedLink(undefined)\r\n }\r\n })\r\n \r\n //broadcast selected link to parent component\r\n if (selectedLink) {\r\n props.onLinkSelected?.(selectedLink);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedLink])\r\n\r\n //Listen command delete selected for Text\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedText(() => {\r\n if (selectedText) {\r\n setTexts(prev => prev.filter(t => t.id !== selectedText.id))\r\n setSelectedText(undefined)\r\n }\r\n })\r\n\r\n //broadcast selected text to parent component\r\n if (selectedText) {\r\n props.onTextSelected?.(selectedText);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedText])\r\n\r\n const size = props.size;\r\n\r\n //Automatically add points on the link so that the link does not cross elements, default maximum 10 points\r\n const automationAddPointsToLink = (eleLink: IElementLink, limitPoint: number = 10) => {\r\n const { sourceElement, sourcePort, targetElement, targetPort } = eleLink;\r\n let sourcePosition = {\r\n x: sourceElement.position.x + sourcePort.position.x,\r\n y: sourceElement.position.y + sourcePort.position.y\r\n }\r\n\r\n const targetPosition = {\r\n x: targetElement!.position.x + targetPort!.position.x,\r\n y: targetElement!.position.y + targetPort!.position.y\r\n }\r\n\r\n let numberOfPoints = 0;\r\n\r\n //create points between the start and end points, to create a line segment that passes through the points without intersecting the elements\r\n function generatePositions(sourcePosition: IPosition, targetPosition: IPosition, elements: IElement[]): IPosition[] {\r\n const firstIntersection = getFirstIntersection(sourcePosition, targetPosition, elements)\r\n\r\n //If there is no intersection point, then the line connecting the two points does not intersect any element.\r\n if (!firstIntersection || limitPoint === numberOfPoints) return [];\r\n\r\n const { nearestIntersection, intersectionPointsList, element: intersectedElement } = firstIntersection;\r\n\r\n //Calculate to create a replacement point\r\n const replacementPosition = generateSubstitutePosition(nearestIntersection, targetPosition, intersectedElement)\r\n\r\n //Increases the number of points found by 1 \r\n numberOfPoints += 1;\r\n\r\n //Create points with the starting point being the sourcePosition and the ending point being the newly created point\r\n const prependedPoints = generatePositions(sourcePosition, replacementPosition, elements)\r\n\r\n //Create points with the starting point being the new newly created point and the ending point being the targetPosition\r\n const appendedPoints = generatePositions(replacementPosition, targetPosition, elements)\r\n\r\n return [...prependedPoints, replacementPosition, ...appendedPoints]\r\n }\r\n\r\n const points = generatePositions(sourcePosition, targetPosition, elements)\r\n\r\n return {\r\n ...eleLink,\r\n points: points,\r\n }\r\n }\r\n\r\n const handlePaperMouseMove = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n\r\n //if there is a temp link, update the temp target point\r\n if (tempLink) {\r\n const { currentTarget } = ev;\r\n\r\n //get offset x,y of the temp target point relative paper container\r\n const rect = currentTarget.getBoundingClientRect();\r\n const offsetX = ev.clientX - rect.left;\r\n const offsetY = ev.clientY - rect.top;\r\n\r\n const sourcePosition = {\r\n x: tempLink.sourceElement.position.x + tempLink.sourcePort.position.x,\r\n y: tempLink.sourceElement.position.y + tempLink.sourcePort.position.y\r\n }\r\n\r\n //reduce the position of offset to the direction of the source point 1 unit to avoid the link to reach the current mouse position\r\n const tempTargetPosition = {\r\n x: offsetX - (offsetX > sourcePosition.x ? 1 : -1),\r\n y: offsetY - (offsetY > sourcePosition.y ? 1 : -1)\r\n }\r\n\r\n setTempLink(prev => ({\r\n ...prev!,\r\n tempTargetPosition: tempTargetPosition\r\n }))\r\n }\r\n }\r\n\r\n const handleMouseDownOnPaper = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n setMouseDownedOnPaper(true);\r\n\r\n props.onPaperClicked?.()\r\n paperEventEmitter.emitPaperClicked(ev)\r\n }\r\n\r\n const handleMouseUpOnPaper = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n if (mouseDownedOnPaper) {\r\n setSelectedElement(undefined);\r\n setSelectedElementSVG(null)\r\n }\r\n\r\n //clear temp link if exists\r\n if (tempLink) {\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n //Clear selected text\r\n if (selectedText) {\r\n setSelectedText(undefined)\r\n }\r\n\r\n setMouseDownedOnPaper(false);\r\n }\r\n\r\n const handlePathChange = useCallback((path: string, id: string) => {\r\n //Update path of element link, that changed\r\n setLinks(prevLinks => {\r\n const updatedLinkIndex = prevLinks.findIndex(l => l.id === id)\r\n prevLinks[updatedLinkIndex].path = path;\r\n return [...prevLinks]\r\n })\r\n }, [])\r\n\r\n const handlePortMoved = (port: IPort, elementId: string, oldPosition: IPosition, newPosition: IPosition) => {\r\n const element = elements.find(e => e.id === elementId)!\r\n\r\n if (props.onPortMoved) {\r\n props.onPortMoved(newPosition, port, element)\r\n }\r\n\r\n //set links equals a clone links to re-render links with new position\r\n setLinks(prev => prev.map(link => {\r\n if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {\r\n link.sourcePort.position = newPosition;\r\n }\r\n\r\n if (link.targetElement?.id === elementId && link.targetPort?.id === port.id) {\r\n link.targetPort.position = newPosition;\r\n }\r\n\r\n return link;\r\n }))\r\n\r\n //Update port position in element, not re-render\r\n setElements(prevElements => {\r\n const updatedElementIndex = prevElements.findIndex(e => e.id === elementId);\r\n\r\n prevElements[updatedElementIndex].ports = prevElements[updatedElementIndex].ports?.map(p => {\r\n if (p.id === port.id) {\r\n p.position = newPosition\r\n }\r\n return p\r\n })\r\n return prevElements;\r\n })\r\n }\r\n\r\n\r\n //Handle creating a new element link\r\n const handlePortMouseDown = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n ev.stopPropagation()\r\n //Return if creating a new element link\r\n if (tempLink) return;\r\n\r\n const sourceElement = elements.find(e => e.id === elementId)!\r\n\r\n //handle create temp element link;\r\n const newLink: IElementLink = {\r\n id: generateUniqueId(),\r\n points: [],\r\n sourceElement: sourceElement!,\r\n sourcePort: port,\r\n }\r\n\r\n setTempLink(newLink)\r\n paperEventEmitter.emitElementLinkStarted(newLink)\r\n }\r\n\r\n const createElementLink = (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement): IElementLink | null => {\r\n\r\n //if no onCreatingLink prop, no link will be created\r\n if (!props.onCreatingLink) { return null; }\r\n\r\n let newElementLink: IElementLink | null = props.onCreatingLink(sourcePort, sourceElement, targetPort, targetElement)\r\n\r\n if (!newElementLink) return null;\r\n\r\n //Automatic bending, if is not defined points\r\n if (!newElementLink.points || newElementLink.points.length === 0) {\r\n newElementLink = automationAddPointsToLink(newElementLink, MAX_LINK_KNOT_COUNT)\r\n }\r\n \r\n return newElementLink;\r\n }\r\n\r\n const handlePortMouseUp = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n ev.stopPropagation();\r\n\r\n //Create new element link, if has tempLink\r\n if (tempLink) {\r\n //Check if mouse up point is mouse down point or not\r\n const isMouseUpOnNotSelf = tempLink.sourcePort.id !== port.id || tempLink.sourceElement.id !== elementId\r\n\r\n let newElementLink: IElementLink | null = null;\r\n\r\n if (isMouseUpOnNotSelf) {\r\n const { sourcePort, sourceElement } = tempLink;\r\n const targetElement = elements.find(e => e.id === elementId)!\r\n\r\n newElementLink = createElementLink(sourcePort, sourceElement, port, targetElement)\r\n }\r\n\r\n if (newElementLink) {\r\n setLinks(prev => [...prev, newElementLink!])\r\n paperEventEmitter.emitElementLinkEnded(newElementLink)\r\n } else {\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n setTempLink(undefined)\r\n }\r\n }\r\n\r\n const handleLinkLabelMoved = useCallback((offsetX: number, offsetY: number, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n const oldPosition = currentLink.label!.position || LINK_LABEL_POSITION_FROM_LINK_MID_POINT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.label!.position = newPosition;\r\n break;\r\n }\r\n case 'source': {\r\n const oldPosition = currentLink.sourceLabel!.position || LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.sourceLabel!.position = newPosition;\r\n break;\r\n }\r\n case 'target': {\r\n const oldPosition = currentLink.targetLabel!.position || LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.targetLabel!.position = newPosition;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleLinkLabelResized = useCallback((width: number, height: number, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.label!.size = newSize;\r\n break;\r\n }\r\n case 'source': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.sourceLabel!.size = newSize;\r\n break;\r\n }\r\n case 'target': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.targetLabel!.size = newSize;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleLinkLabelContentChanged = useCallback((newValue: string, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n currentLink.label!.content = newValue;\r\n break;\r\n }\r\n case 'source': {\r\n currentLink.sourceLabel!.content = newValue;\r\n break;\r\n }\r\n case 'target': {\r\n currentLink.targetLabel!.content = newValue;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleSelectLink = (link: IElementLink, index: number) => {\r\n setSelectedLink(link)\r\n }\r\n\r\n const handleDeselectLink = (link: IElementLink, index: number) => {\r\n setSelectedLink(undefined)\r\n }\r\n\r\n //update absolute position of element and absolute position of children elements\r\n const updateElementPosition = (element: IElementInTreeState, movementX: number, movementY: number): IElementInTreeState => {\r\n element.position.x += movementX;\r\n element.position.y += movementY;\r\n\r\n if (element.childrenElements && element.childrenElements.length > 0) {\r\n element.childrenElements = element.childrenElements.map(child => updateElementPosition(child, movementX, movementY));\r\n }\r\n\r\n return element;\r\n }\r\n\r\n //use selection frame\r\n useSelectionFrame({\r\n container: paperContainerRef.current as unknown as HTMLElement,\r\n targetSVGElement: selectedElementSVG || undefined,\r\n resizability: selectedElement?.resizability || {\r\n enabled: true,\r\n keepRatio: true\r\n },\r\n width: selectedElement?.size.width,\r\n height: selectedElement?.size.height,\r\n //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,\r\n onMove: (offsetX, offsetY) => {\r\n if (!selectedElement) return;\r\n\r\n const oldPosition = { ...selectedElement.position };\r\n\r\n const newElementPosition = updateElementPosition(selectedElement, offsetX, offsetY)\r\n\r\n newElementPosition.relativePosition = {\r\n x: newElementPosition.relativePosition!.x + offsetX,\r\n y: newElementPosition.relativePosition!.y + offsetY\r\n }\r\n\r\n const indexSelectedElement = elements.findIndex(e => e.id === selectedElement.id)\r\n\r\n //Set state to re-render UI with new position\r\n setElementsInTree(prev => [...prev]);\r\n\r\n if (props.onElementMoved) {\r\n props.onElementMoved(newElementPosition.position, selectedElement, indexSelectedElement)\r\n }\r\n\r\n paperEventEmitter.emitElementMoved(selectedElement, oldPosition, newElementPosition.position)\r\n setMouseDownedOnPaper(false);\r\n },\r\n onResize: (width, height) => {\r\n if (!selectedElement) return;\r\n const indexSelectedElement = elements.findIndex(e => e.id === selectedElement.id)\r\n\r\n const oldSize = selectedElement.size;\r\n const newSize = { width, height }\r\n\r\n elements[indexSelectedElement].size = newSize;\r\n\r\n setElements([...elements]);\r\n\r\n if (props.onElementResized) {\r\n props.onElementResized(newSize, selectedElement, indexSelectedElement)\r\n }\r\n\r\n paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize)\r\n setMouseDownedOnPaper(false);\r\n }\r\n });\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelMoved = useCallback((index: number) => {\r\n return (offsetX: number, offsetY: number, labelType: string) => {\r\n handleLinkLabelMoved(offsetX, offsetY, index, labelType as any)\r\n }\r\n }, [handleLinkLabelMoved])\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelResized = useCallback((index: number) => {\r\n return (width: number, height: number, labelType: string) => {\r\n handleLinkLabelResized(width, height, index, labelType as any)\r\n }\r\n }, [handleLinkLabelResized])\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelContentChanged = useCallback((index: number) => {\r\n return (newValue: string, labelType: string) => {\r\n handleLinkLabelContentChanged(newValue, index, labelType as any)\r\n }\r\n }, [handleLinkLabelContentChanged])\r\n\r\n const handleClickLinkDelete = useCallback((link: IElementLink, index: number) => {\r\n return () => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks];\r\n newLinks.splice(index, 1)\r\n return newLinks;\r\n })\r\n }\r\n }, [])\r\n\r\n const handleMouseUpAtLinkedPortPlaceholder = (link: IElementLink, position: IPosition, targetElement: IElement) => {\r\n console.log(`A port could have been created at position ${JSON.stringify(position)} on element ${targetElement.id}`)\r\n\r\n if (props.onCreatingPortByLinking) {\r\n const { sourcePort, sourceElement } = link;\r\n\r\n //Handle create port via onCreatingPortByLinking prop\r\n const targetPort = props.onCreatingPortByLinking(sourceElement, sourcePort, targetElement, position);\r\n\r\n if (targetPort) {\r\n //Add new port to target element\r\n targetElement.addPort(targetPort);\r\n\r\n //Create new link with created port, that is returned.\r\n const newElementLink = createElementLink(sourcePort, sourceElement, targetPort, targetElement)\r\n\r\n //Create link and clear some thing, then return\r\n if (newElementLink) {\r\n setLinks(prev => [...prev, newElementLink])\r\n paperEventEmitter.emitElementLinkEnded(newElementLink)\r\n setTempLink(undefined)\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n //Clear tempLink\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n const handleElementTextChange = (element: IElement, textId: string, newContent: string) => {\r\n setElements(prevElms => {\r\n return prevElms.map(curEle => {\r\n //Find changed text of element to update the content for it.\r\n if (curEle.id === element.id && curEle.texts) {\r\n const updatedTextId = curEle.texts.findIndex(t => t.id === textId)\r\n\r\n if (updatedTextId !== undefined) {\r\n curEle.texts[updatedTextId].content = newContent;\r\n }\r\n }\r\n\r\n return curEle;\r\n })\r\n })\r\n }\r\n\r\n const handleElementClicked = (id: any, e: any, ref: SVGSVGElement | null, element: IElementInTreeState) => {\r\n e.stopPropagation();\r\n\r\n if (tempLink) {\r\n //Clear tempLink\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n } else {\r\n setSelectedElementSVG(ref)\r\n setSelectedElement(element);\r\n paperEventEmitter.emitElementSelected(element)\r\n }\r\n\r\n setMouseDownedOnPaper(false);\r\n }\r\n\r\n const renderElementInTree = (element: IElementInTreeState) => {\r\n //use the defined react element or the default Element component\r\n const ReactElement = element.reactElement || Element;\r\n\r\n return (\r\n <g key={element.id}>\r\n {\r\n <ReactElement\r\n key={`element-${element.id}`}\r\n id={element.id}\r\n height={element.size.height}\r\n width={element.size.width}\r\n x={element.relativePosition?.x!}\r\n y={element.relativePosition?.y!}\r\n onClick={(id: any, e: any, ref: SVGSVGElement | null) => {\r\n handleElementClicked(id, e, ref, element);\r\n }}\r\n onContextMenu={(id: any, e: any, ref: SVGSVGElement | null) => {\r\n handleElementClicked(id, e, ref, element);\r\n props.onElementContextMenu?.(element, e);\r\n }}\r\n container={paperContainerRef.current as SVGSVGElement}\r\n renderShape={element.renderShape}\r\n cssClass={element.cssClass}\r\n texts={element.texts}\r\n ports={element.ports}\r\n portMoveableAreas={element.portMoveableAreas}\r\n portSlideRailSVGClassName={element.portSlideRailSVGClassName}\r\n portDirection={element.portDirection}\r\n defaultPortSize={element.defaultPortSize}\r\n onPortMoved={handlePortMoved}\r\n onPortMouseDown={handlePortMouseDown}\r\n onPortMouseUp={handlePortMouseUp}\r\n // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}\r\n onMouseUpAtLinkedPortPlaceholder={(elementLink, position) => handleMouseUpAtLinkedPortPlaceholder(elementLink, position, element)}\r\n onTextUpdated={(textId, newContent) => handleElementTextChange(element, textId, newContent)}\r\n\r\n textsPlaceHolderClassName={element.textsPlaceHolderClassName}\r\n textsPlaceHolderFlexStyle={element.textsPlaceHolderFlexStyle}\r\n textsPlaceHolderFlexboxPosition={element.textsPlaceHolderFlexboxPosition}\r\n >\r\n {element.childrenElements && element.childrenElements.map(renderElementInTree)}\r\n </ReactElement>\r\n }\r\n </g>)\r\n }\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <Ruler squareSize={100} border='1px dashed grey' ></Ruler>\r\n <svg tabIndex={0} width={size.width} height={size.height} ref={paperContainerRef} id=\"paper-container\" onMouseMove={handlePaperMouseMove} onMouseDown={handleMouseDownOnPaper} onMouseUp={handleMouseUpOnPaper}>\r\n {paperContainerRef.current ? elementsInTree.map((element, index) => {\r\n return renderElementInTree(element)\r\n }) : \"\"}\r\n {\r\n links && links.map((link, index) => {\r\n return (\r\n <ElementLink\r\n key={link.id}\r\n id={link.id}\r\n path={link.path}\r\n sourcePosition={{\r\n x: link.sourceElement.position.x + link.sourcePort.position.x,\r\n y: link.sourceElement.position.y + link.sourcePort.position.y\r\n }}\r\n targetPosition={{\r\n x: link.targetElement?.position.x! + link.targetPort?.position.x!,\r\n y: link.targetElement?.position.y! + link.targetPort?.position.y!\r\n }}\r\n points={link.points}\r\n onPathChanged={handlePathChange}\r\n onClickDelete={handleClickLinkDelete(link, index)}\r\n onSelected={() => handleSelectLink(link, index)}\r\n onDeselected={() => handleDeselectLink(link, index)}\r\n\r\n container={paperContainerRef.current}\r\n markerStart={link.markerStart}\r\n markerEnd={link.markerEnd}\r\n markerDistanceFromPort={link.markerDistanceFromPort}\r\n markerSize={link.markerSize}\r\n\r\n label={link.label}\r\n sourceLabel={link.sourceLabel}\r\n targetLabel={link.targetLabel}\r\n\r\n onLabelMoved={onLabelMoved(index)}\r\n onLabelResized={onLabelResized(index)}\r\n onLabelContentChanged={onLabelContentChanged(index)}\r\n />\r\n )\r\n })\r\n }\r\n {tempLink?.tempTargetPosition && <ElementLink\r\n id={tempLink.id}\r\n points={tempLink.points}\r\n sourcePosition={{\r\n x: tempLink.sourceElement.position.x + tempLink.sourcePort.position.x,\r\n y: tempLink.sourceElement.position.y + tempLink.sourcePort.position.y\r\n }}\r\n targetPosition={tempLink.tempTargetPosition}\r\n container={paperContainerRef.current}\r\n markerStart={tempLink.markerStart}\r\n markerEnd={tempLink.markerEnd}\r\n markerDistanceFromPort={tempLink.markerDistanceFromPort}\r\n markerSize={tempLink.markerSize}\r\n />}\r\n\r\n {texts.map((text, index) => (\r\n <Text\r\n key={text.id}\r\n id={text.id}\r\n x={text.position.x}\r\n y={text.position.y}\r\n width={text.size.width}\r\n height={text.size.height}\r\n fontSize={text.fontSize}\r\n border={text.border}\r\n\r\n container={paperContainerRef.current!}\r\n content={text.content}\r\n align={text.align}\r\n onSelected={() => {\r\n setSelectedText(text)\r\n }}\r\n />\r\n ))}\r\n </svg>\r\n <BBoxDebugger elementSVG={selectedElementSVG} />\r\n <LinkDebugger links={links} svgContainer={paperContainerRef.current!} />\r\n </div>\r\n\r\n );\r\n};\r\n\r\nexport default Paper;","import React from 'react'\r\nimport { EditorContext } from \"../models/implementations/EditorContext\";\r\nimport Paper from \"./paper\";\r\n\r\ninterface IEditorProps {\r\n editorContext: EditorContext;\r\n}\r\n\r\nexport default function Editor({\r\n editorContext\r\n}: IEditorProps) {\r\n\r\n return (\r\n <>\r\n <Paper\r\n size={{ width: 3000, height: 3000 }}\r\n elements={editorContext.elements}\r\n links={editorContext.links}\r\n texts={editorContext.texts}\r\n onPaperClicked={editorContext.onPaperClicked}\r\n onPortMoved={editorContext.onPortMoved}\r\n onPortSelected={editorContext.onPortSelected}\r\n onElementContextMenu={editorContext.onElementContextMenu}\r\n onElementMoved={editorContext.onElementMoved}\r\n onElementResized={editorContext.onElementResized}\r\n onElementSelected={editorContext.onElementSelected}\r\n onCreatingLink={editorContext.onCreatingLink}\r\n onCreatingPortByLinking={editorContext.onCreatingPortByLinking}\r\n onLinkSelected={editorContext.onLinkSelected}\r\n onTextSelected={editorContext.onTextSelected}\r\n />\r\n </>\r\n )\r\n}\r\n"],"names":["i","uuidv4","Element","React","Port","ElementLink","Text","Interval","require$$0","RB_TREE_COLOR_RED","RB_TREE_COLOR_BLACK","require$$1","Node","IntervalTree","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","Flatten","this","bundleModule","Flexbox"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,11,22,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,60,61]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/models/enums/PositioningAnchor.ts","../../src/models/enums/ResizingDirection.ts","../../src/models/enums/SubObjectDirection.ts","../../src/models/enums/TextAlign.ts","../../node_modules/eventemitter3/index.js","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/native.js","../../node_modules/uuid/dist/esm-browser/v4.js","../../src/utils/generateUniqueId.ts","../../src/models/implementations/Element.ts","../../node_modules/tslib/tslib.es6.js","../../src/components/shapes/shapeWrapper.tsx","../../src/components/shapes/customShape.tsx","../../src/models/implementations/Port.tsx","../../src/models/implementations/ElementLink.ts","../../src/models/implementations/Text.ts","../../src/models/implementations/EditorContext.ts","../../src/components/shapes/circle.tsx","../../src/components/shapes/halfCircle.tsx","../../src/components/shapes/rectangle.tsx","../../src/components/shapes/rectangularFrame.tsx","../../node_modules/react-dom/client.js","../../src/utils/constants.ts","../../src/components/viewControls/selectionFrame.tsx","../../src/hooks/useSelectionFrame.tsx","../../src/contexts/paperEventEmitterContext.tsx","../../src/components/texts/text.tsx","../../src/components/ports/port.tsx","../../src/utils/pathUtil.ts","../../src/utils/mathUtil.ts","../../src/components/CloseIcon.tsx","../../node_modules/flatten-js/utils/utils.js","../../node_modules/flatten-js/utils/errors.js","../../node_modules/flatten-js/classes/matrix.js","../../node_modules/flatten-interval-tree/classes/interval.js","../../node_modules/flatten-interval-tree/utils/constants.js","../../node_modules/flatten-interval-tree/classes/node.js","../../node_modules/flatten-interval-tree/index.js","../../node_modules/flatten-js/data_structures/planar_set.js","../../node_modules/flatten-js/classes/point.js","../../node_modules/flatten-js/classes/vector.js","../../node_modules/flatten-js/classes/line.js","../../node_modules/flatten-js/classes/circle.js","../../node_modules/flatten-js/classes/segment.js","../../node_modules/flatten-js/classes/arc.js","../../node_modules/flatten-js/classes/box.js","../../node_modules/flatten-js/classes/edge.js","../../node_modules/flatten-js/classes/face.js","../../node_modules/flatten-js/classes/ray.js","../../node_modules/flatten-js/algorithms/ray_shooting.js","../../node_modules/flatten-js/classes/polygon.js","../../node_modules/flatten-js/algorithms/distance.js","../../node_modules/flatten-js/index.js","../../src/utils/positionUtil.ts","../../src/components/links/elementLink.tsx","../../src/components/viewControls/ruler.tsx","../../src/components/elements/elementWrapper.tsx","../../src/utils/portSlideRailSVGUtil.ts","../../src/utils/lineUtil.ts","../../node_modules/css-layout/dist/css-layout.js","../../node_modules/react-svg-flexbox/dist/bundle.js","../../src/components/elements/element.tsx","../../src/components/BBoxDebugger.tsx","../../src/components/LinkDebugger.tsx","../../src/hooks/useKeyboardCommands.ts","../../src/components/paper.tsx","../../src/components/editor.tsx"],"sourcesContent":["export enum PositioningAnchor {\r\n TopLeft = 0,\r\n Center\r\n}","export enum ResizingDirection {\r\n TopLeft = 0,\r\n TopCenter = 1,\r\n TopRight = 2,\r\n RightCenter = 3,\r\n BottomRight = 4,\r\n BottomCenter = 5,\r\n BottomLeft = 6,\r\n LeftCenter = 7\r\n}","export enum SubObjectDirection {\r\n Radial = \"Radial\",\r\n PerpendicularInward = \"PerpendicularInward\"\r\n}","export enum TextAlign {\r\n left = 0,\r\n right,\r\n center,\r\n}","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n var uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\n\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","var randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import { v4 as uuidv4 } from 'uuid'\r\n\r\nexport default function generateUniqueId() {\r\n return uuidv4();\r\n}","import { FC } from \"react\";\r\nimport IElement from \"../IElement\";\r\nimport IElementProps from \"../IElementProps\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\nimport IResizability from \"../IResizability\";\r\nimport IPort from \"../IPort\";\r\nimport IText from \"../IText\";\r\nimport { SubObjectDirection } from \"../enums/SubObjectDirection\";\r\nimport EventEmitter from \"eventemitter3\";\r\nimport generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IFlexboxType from \"../IFlexboxType\";\r\n\r\nexport default class Element implements IElement {\r\n private readonly _id: string;\r\n protected _position: IPosition;\r\n protected _size: ISize;\r\n private _parentElement?: IElement | undefined;\r\n cssClass?: string;\r\n /**\r\n * @deprecated This property is deprecated and will be removed in future versions.\r\n */\r\n reactElement?: FC<IElementProps> | React.FC<IElementProps> | React.ComponentClass<IElementProps>;\r\n\r\n renderShape?: (props: IElementProps) => JSX.Element;\r\n resizability: IResizability = {\r\n enabled: true,\r\n keepRatio: false\r\n };\r\n ports?: IPort[];\r\n texts?: IText[];\r\n portMoveableAreas?: IPosition[][];\r\n portSlideRailSVGClassName?: string;\r\n portDirection?: SubObjectDirection;\r\n defaultPortSize?: number;\r\n onResized?: ((width: number, height: number) => void) | undefined;\r\n onMoved?: ((x: number, y: number) => void) | undefined;\r\n\r\n textsPlaceHolderClassName?: string;\r\n textsPlaceHolderFlexStyle?: IFlexboxType;\r\n textsPlaceHolderFlexboxPosition?: IPosition;\r\n\r\n //internal properties\r\n _eventEmitter: EventEmitter = new EventEmitter();\r\n\r\n constructor(x: number, y: number, width: number, height: number, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas: IPosition[][] = [], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition) {\r\n this._id = generateUniqueId();\r\n this._position = { x, y };\r\n this._size = { width, height };\r\n this.cssClass = cssClass;\r\n this.renderShape = renderShape;\r\n this.texts = texts;\r\n this.ports = ports;\r\n this.portMoveableAreas = portMovealeAreas;\r\n this.portSlideRailSVGClassName = portSlideRailSVGClassName;\r\n this.portDirection = portDirection;\r\n this.parentElement = parentElement;\r\n this.textsPlaceHolderClassName = textsPlaceHolderClassName;\r\n this.textsPlaceHolderFlexStyle = textsPlaceHolderFlexStyle;\r\n this.textsPlaceHolderFlexboxPosition = textsPlaceHolderFlexboxPosition;\r\n }\r\n\r\n public manuallyTriggerRender (){\r\n //TODO: Implement this\r\n }\r\n\r\n public manuallyTriggerRenderPort (portId: string){\r\n //TODO: Implement this\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n\r\n public get size() {\r\n return this._size;\r\n }\r\n\r\n public set size(value: ISize) {\r\n this._size = value;\r\n if (this.onResized) this.onResized(value.width, value.height);\r\n }\r\n\r\n public set position(value: IPosition) {\r\n this._position = value;\r\n if (this.onMoved) this.onMoved(value.x, value.y);\r\n }\r\n\r\n public get position() {\r\n return this._position;\r\n }\r\n\r\n public get parentElement() {\r\n return this._parentElement;\r\n }\r\n\r\n public set parentElement(value: IElement | undefined) {\r\n const oldParent = this._parentElement;\r\n this._parentElement = value;\r\n this._eventEmitter.emit('parentChanged', oldParent, value);\r\n }\r\n\r\n public onParentChanged(callback: (oldParent?: IElement, newParent?: IElement) => void) {\r\n this._eventEmitter.on('parentChanged', callback);\r\n const canceller = () => {\r\n this._eventEmitter.off('parentChanged', callback);\r\n }\r\n return canceller;\r\n }\r\n\r\n public addPort(newPort: IPort) {\r\n if (this.ports) {\r\n this.ports.push(newPort);\r\n } else {\r\n this.ports = [newPort];\r\n }\r\n\r\n this._eventEmitter.emit('addedPort', newPort)\r\n }\r\n\r\n public onAddedPort(callback: (newPort: IPort) => void) {\r\n this._eventEmitter.on('addedPort', callback);\r\n\r\n const canceller = () => {\r\n this._eventEmitter.off('addedPort', callback);\r\n }\r\n\r\n return canceller;\r\n }\r\n\r\n public deletePort(id: string) {\r\n if (!this.ports) return;\r\n\r\n const index = this.ports.findIndex(p => p.id === id);\r\n\r\n if (index === -1) {\r\n throw new Error(`Port with id ${id} is not found`);\r\n }\r\n\r\n this.ports.splice(index, 1)\r\n this._eventEmitter.emit('deletedPort', id)\r\n }\r\n\r\n public onDeletedPort(callback: (id: string) => void) {\r\n this._eventEmitter.on('deletedPort', callback);\r\n\r\n const canceller = () => {\r\n this._eventEmitter.off('deletedPort', callback);\r\n }\r\n\r\n return canceller;\r\n }\r\n\r\n public getPort(id: string): IPort | undefined {\r\n if (!this.ports) return undefined;\r\n\r\n return this.ports.find(p => p.id === id);\r\n }\r\n}","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef, useMemo } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport { PositioningAnchor } from '../../models/enums/PositioningAnchor';\r\n\r\ninterface IShapeWrapperProps extends IShape {\r\n children: React.ReactNode;\r\n viewBox?: string;\r\n};\r\n\r\nconst ShapeWrapper: React.ForwardRefExoticComponent<IShapeWrapperProps & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, IShapeWrapperProps>(\r\n function (\r\n shapeProps,\r\n ref\r\n ) {\r\n //if direction is provided, rotation is based on direction\r\n\r\n let rotation = shapeProps.rotation || 0;\r\n\r\n if (shapeProps.direction) {\r\n switch (shapeProps.direction) {\r\n case 'left':\r\n rotation = -90;\r\n break;\r\n case 'right':\r\n rotation = 90;\r\n break;\r\n case 'down':\r\n rotation = 180;\r\n break;\r\n default:\r\n rotation = 0;\r\n break;\r\n }\r\n }\r\n\r\n let position = { x: shapeProps.x, y: shapeProps.y };\r\n let transformOrigin = \"center\";\r\n\r\n if (typeof shapeProps.positioningAnchor === 'object') {\r\n position.x = position.x - shapeProps.positioningAnchor.x / 100 * shapeProps.width;\r\n position.y = position.y - shapeProps.positioningAnchor.y / 100 * shapeProps.height;\r\n\r\n transformOrigin = `${shapeProps.positioningAnchor.x}% ${shapeProps.positioningAnchor.y}%`\r\n }\r\n else if (shapeProps.positioningAnchor === PositioningAnchor.Center) {\r\n position.x = position.x - shapeProps.width / 2;\r\n position.y = position.y - shapeProps.height / 2;\r\n }\r\n\r\n const objectOfAllEventAttributes = useMemo(() => {\r\n const arrayOfAllEventAttributes = Object.entries(shapeProps).filter(([k, v]) => k.startsWith('on'));\r\n return Object.fromEntries(arrayOfAllEventAttributes);\r\n }, [shapeProps]);\r\n\r\n const viewboxWidth = shapeProps.width > shapeProps.height ? 100 : shapeProps.width / shapeProps.height * 100;\r\n const viewBoxHeight = shapeProps.height > shapeProps.width ? 100 : shapeProps.height / shapeProps.width * 100;\r\n const viewBox = shapeProps.viewBox || `0 0 ${viewboxWidth} ${viewBoxHeight}`;\r\n\r\n return (\r\n <g transform={`rotate(${rotation})`} style={{ transformOrigin: transformOrigin, transformBox: \"content-box\" }} >\r\n <svg ref={ref} style={{ overflow: \"visible\" }} x={position.x} y={position.y} width={shapeProps.width} height={shapeProps.height} className={shapeProps.cssClass} viewBox={viewBox} {...objectOfAllEventAttributes}>\r\n {shapeProps.children}\r\n </svg>\r\n </g>\r\n );\r\n });\r\n\r\nexport default ShapeWrapper;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface IShapeProps extends Omit<IShape, \"stroke\" | \"fill\" | \"strokeWidth\"> {\r\n children: React.ReactNode;\r\n};\r\n\r\nconst CustomShape: React.FC<IShapeProps> = forwardRef((props, ref) => {\r\n return (\r\n <ShapeWrapper {...props} ref={ref}>\r\n {props.children}\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default CustomShape;","import React, { forwardRef } from \"react\";\r\nimport generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IPort from \"../IPort\";\r\nimport { IPortProps } from \"../IPortProps\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\nimport CustomShape from \"../../components/shapes/customShape\";\r\nimport IElement from \"../IElement\";\r\n\r\nexport default class Port implements IPort {\r\n private readonly _id: string;\r\n position: IPosition;\r\n size?: ISize;\r\n label?: IText;\r\n renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;\r\n\r\n constructor(x: number, y: number, label?: IText,\r\n shapeRenderer?: {\r\n shape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>,\r\n customShapeWithJSX?: JSX.Element,\r\n positioningAnchor?: IPosition\r\n }, width?: number, height?: number) {\r\n this._id = generateUniqueId()\r\n this.position = { x, y };\r\n if (!height) {\r\n height = width;\r\n }\r\n if (width && height) {\r\n this.size = { width, height };\r\n }\r\n this.label = label;\r\n if (shapeRenderer && shapeRenderer.shape) {\r\n this.renderShape = shapeRenderer.shape;\r\n }\r\n else if (shapeRenderer && shapeRenderer.customShapeWithJSX) {\r\n this.renderShape = forwardRef((props, ref) => {\r\n return (\r\n <CustomShape ref={ref} x={props.x} y={props.y} width={props.width} height={props.height} rotation={props.rotation} positioningAnchor={shapeRenderer.positioningAnchor}\r\n onClick={(e: any) => props.onSelected?.(this.id, e)}\r\n onMouseDown={(e: any) => props.onMouseDown?.(this.id, e)}\r\n onMouseUp={(e: any) => props.onMouseUp?.(this.id, e)}\r\n >\r\n {shapeRenderer.customShapeWithJSX}\r\n </CustomShape>\r\n )\r\n });\r\n }\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n}","import generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport IElement from \"../IElement\";\r\nimport IElementLink from \"../IElementLink\";\r\nimport IPort from \"../IPort\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\n\r\nexport default class ElementLink implements IElementLink {\r\n readonly id: string;\r\n sourceElement: IElement;\r\n targetElement?: IElement;\r\n sourcePort: IPort;\r\n targetPort?: IPort;\r\n path?: string;\r\n points: IPosition[];\r\n tempTargetPosition?: IPosition;\r\n markerStart?: JSX.Element;\r\n markerEnd?: JSX.Element;\r\n markerDistanceFromPort?: number;\r\n markerSize?: number;\r\n label?: IText;\r\n sourceLabel?: IText;\r\n targetLabel?: IText;\r\n\r\n constructor(sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);\r\n constructor(sourceElement: IElement, sourcePort: IPort, targetElement?: IElement, targetPort?: IPort, tempTargetPosition?: IPosition, points?: IPosition[], path?: string, markerStart?: JSX.Element, markerEnd?: JSX.Element, markerDistanceFromPort?: number, markerSize?: number, label?: IText, sourceLabel?: IText, targetLabel?: IText) {\r\n\r\n this.id = generateUniqueId();\r\n\r\n this.sourceElement = sourceElement;\r\n this.sourcePort = sourcePort;\r\n if (tempTargetPosition) {\r\n this.tempTargetPosition = tempTargetPosition;\r\n }\r\n\r\n if (points) {\r\n this.points = points;\r\n }\r\n else {\r\n this.points = [];\r\n }\r\n\r\n if (targetElement)\r\n this.targetElement = targetElement;\r\n\r\n if (targetPort)\r\n this.targetPort = targetPort;\r\n\r\n if (path)\r\n this.path = path;\r\n\r\n if (markerStart)\r\n this.markerStart = markerStart;\r\n\r\n if (markerEnd)\r\n this.markerEnd = markerEnd;\r\n\r\n if (markerDistanceFromPort)\r\n this.markerDistanceFromPort = markerDistanceFromPort;\r\n\r\n if (markerSize)\r\n this.markerSize = markerSize;\r\n\r\n if (label)\r\n this.label = label;\r\n\r\n if (sourceLabel)\r\n this.sourceLabel = sourceLabel;\r\n\r\n if (targetLabel)\r\n this.targetLabel = targetLabel;\r\n }\r\n}","import generateUniqueId from \"../../utils/generateUniqueId\";\r\nimport { TextAlign } from \"../enums\";\r\nimport IFlexboxType from \"../IFlexboxType\";\r\nimport IText from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport ISize from \"../size\";\r\n\r\nexport default class Text implements IText {\r\n private readonly _id: string;\r\n content: string;\r\n size: ISize;\r\n position?: IPosition;\r\n align?: TextAlign;\r\n fontSize?: number;\r\n border?: string;\r\n style?: IFlexboxType;\r\n\r\n constructor(content: string, width: number, height: number, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType) {\r\n this._id = generateUniqueId()\r\n this.content = content;\r\n this.align = align;\r\n this.fontSize = fontSize;\r\n this.border = border;\r\n this.size = { width, height };\r\n this.style = style;\r\n\r\n if (x && y) {\r\n this.position = { x, y };\r\n }\r\n }\r\n\r\n public get id() {\r\n return this._id;\r\n }\r\n}","import IElement from \"../IElement\";\r\nimport IElementLink from \"../IElementLink\";\r\nimport IText, { IPaperText } from \"../IText\";\r\nimport IPosition from \"../position\";\r\nimport IPort from \"../IPort\";\r\nimport ISize from \"../size\";\r\nimport IEditorContext from \"../IEditorContext\";\r\nimport EventEmitter from \"eventemitter3\";\r\n\r\nconst EVENT_PAPER_CLICKED = 'paperClicked';\r\nconst EVENT_PORT_MOVED = 'portMoved';\r\nconst EVENT_PORT_SELECTED = 'portSelected';\r\nconst EVENT_ELEMENT_CONTEXT_MENU = 'elementContextMenu';\r\nconst EVENT_ELEMENT_MOVED = 'elementMoved';\r\nconst EVENT_ELEMENT_RESIZED = 'elementResized';\r\nconst EVENT_ELEMENT_SELECTED = 'elementSelected';\r\nconst EVENT_LINK_SELECTED = 'linkSelected';\r\nconst EVENT_TEXT_SELECTED = 'textSelected';\r\n\r\nexport class EditorContext implements IEditorContext {\r\n private _elements: IElement[];\r\n private _links: IElementLink[];\r\n private _texts: IPaperText[];\r\n private _eventEmitter: EventEmitter;\r\n\r\n //these are the event handlers that are set by the user of the editor, allow only one handler per event, so there is no off method\r\n onCreatingPortByLinkingHandler?: ((sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null) | undefined;\r\n onCreatingLinkHandler?: ((sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null) | undefined;\r\n\r\n constructor(elements: IElement[], links: IElementLink[], texts: IPaperText[]) {\r\n this._elements = elements;\r\n this._links = links;\r\n this._texts = texts;\r\n this._eventEmitter = new EventEmitter();\r\n }\r\n\r\n get elements() {\r\n return this._elements;\r\n }\r\n\r\n get links() {\r\n return this._links;\r\n }\r\n\r\n get texts() {\r\n return this._texts;\r\n }\r\n\r\n getElement(elementId: string): IElement | undefined {\r\n return this._elements.find(e => e.id === elementId);\r\n }\r\n\r\n addElement(element: IElement) {\r\n this._elements.push(element);\r\n }\r\n\r\n removeElement(elementId: string) {\r\n this._elements = this._elements.filter(e => e.id !== elementId);\r\n }\r\n\r\n getLink(linkId: string): IElementLink | undefined {\r\n return this._links.find(l => l.id === linkId);\r\n }\r\n\r\n addLink(link: IElementLink) {\r\n this._links.push(link);\r\n }\r\n\r\n removeLink(linkId: string) {\r\n this._links = this._links.filter(l => l.id !== linkId);\r\n }\r\n\r\n getText(textId: string): IPaperText | undefined {\r\n return this._texts.find(t => t.id === textId);\r\n }\r\n\r\n addText(text: IPaperText) {\r\n this._texts.push(text);\r\n }\r\n\r\n removeText(textId: string) {\r\n this._texts = this._texts.filter(t => t.id !== textId);\r\n }\r\n\r\n onPaperClicked(callback: (position: IPosition) => void) {\r\n this._eventEmitter.on(EVENT_PAPER_CLICKED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_PAPER_CLICKED, callback);\r\n }\r\n\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onPaperClickedHandler(position: IPosition) {\r\n this._eventEmitter.emit(EVENT_PAPER_CLICKED, position);\r\n }\r\n\r\n onPortMoved(callback: (position: IPosition, port: IPort, element: IElement) => void) {\r\n this._eventEmitter.on(EVENT_PORT_MOVED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_PORT_MOVED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onPortMovedHandler(position: IPosition, port: IPort, element: IElement) {\r\n this._eventEmitter.emit(EVENT_PORT_MOVED, position, port, element);\r\n }\r\n\r\n onPortSelected(callback: (port: IPort, element: IElement) => void) {\r\n this._eventEmitter.on(EVENT_PORT_SELECTED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_PORT_SELECTED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onPortSelectedHandler(port: IPort, element: IElement) {\r\n this._eventEmitter.emit(EVENT_PORT_SELECTED, port, element);\r\n }\r\n\r\n onElementContextMenu(callback: (element: IElement, mouseEvent: React.MouseEvent<SVGElement>) => void) {\r\n this._eventEmitter.on(EVENT_ELEMENT_CONTEXT_MENU, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_ELEMENT_CONTEXT_MENU, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onElementContextMenuHandler(element: IElement, mouseEvent: React.MouseEvent<SVGElement>) {\r\n this._eventEmitter.emit(EVENT_ELEMENT_CONTEXT_MENU, element, mouseEvent);\r\n }\r\n\r\n onElementMoved(callback: (position: IPosition, element: IElement) => void) {\r\n this._eventEmitter.on(EVENT_ELEMENT_MOVED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_ELEMENT_MOVED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onElementMovedHandler(position: IPosition, element: IElement) {\r\n this._eventEmitter.emit(EVENT_ELEMENT_MOVED, position, element);\r\n }\r\n\r\n onElementResized(callback: (size: ISize, element: IElement) => void) {\r\n this._eventEmitter.on(EVENT_ELEMENT_RESIZED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_ELEMENT_RESIZED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onElementResizedHandler(size: ISize, element: IElement) {\r\n this._eventEmitter.emit(EVENT_ELEMENT_RESIZED, size, element);\r\n }\r\n\r\n onElementSelected(callback: (element: IElement) => void) {\r\n this._eventEmitter.on(EVENT_ELEMENT_SELECTED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_ELEMENT_SELECTED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onElementSelectedHandler(element: IElement) {\r\n this._eventEmitter.emit(EVENT_ELEMENT_SELECTED, element);\r\n }\r\n\r\n onLinkSelected(callback: (link: IElementLink) => void) {\r\n this._eventEmitter.on(EVENT_LINK_SELECTED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_LINK_SELECTED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onLinkSelectedHandler(link: IElementLink) {\r\n this._eventEmitter.emit(EVENT_LINK_SELECTED, link);\r\n }\r\n\r\n onTextSelected(callback: (text: IText) => void) {\r\n this._eventEmitter.on(EVENT_TEXT_SELECTED, callback);\r\n const off = () => {\r\n this._eventEmitter.off(EVENT_TEXT_SELECTED, callback);\r\n }\r\n return off;\r\n }\r\n\r\n /** @internal */\r\n onTextSelectedHandler(text: IText) {\r\n this._eventEmitter.emit(EVENT_TEXT_SELECTED, text);\r\n }\r\n\r\n triggerRenderElement(elementId: string) {\r\n //TODO: to be implemented\r\n }\r\n\r\n triggerRenderPort(portId: string, elementId: string) {\r\n //TODO: to be implemented\r\n }\r\n\r\n\r\n}","import React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\nimport ISize from '../../models/size';\r\n\r\ninterface CircleProps extends Omit<IShape, \"width\" | \"height\"> {\r\n r?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst Circle: React.ForwardRefExoticComponent<CircleProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n const s: ISize = { height: 100, width: 100 };\r\n\r\n if (props.r) {\r\n s.height = props.r * 2;\r\n s.width = props.r * 2;\r\n }\r\n else {\r\n if (!props.width || !props.height) {\r\n throw new Error('Circle must have a radius or size');\r\n }\r\n s.height = props.height;\r\n s.width = props.width;\r\n }\r\n\r\n return (\r\n <ShapeWrapper viewBox='0 0 100 100' {...props} width={s.width} height={s.height} ref={ref} >\r\n <circle className={`${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" cx={50} cy={50} r={50} fill={props.fill || 'transparent'} stroke={props.stroke || \"none\"} strokeWidth={props.strokeWidth} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default Circle;","import React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\nimport ISize from '../../models/size';\r\n\r\ninterface CrescentProps extends Omit<IShape, \"width\" | \"height\"> {\r\n r?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst Crescent: React.ForwardRefExoticComponent<CrescentProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n const s: ISize = { height: 100, width: 100 };\r\n\r\n if (props.r) {\r\n s.height = props.r * 2;\r\n s.width = props.r * 2;\r\n }\r\n else {\r\n if (!props.width || !props.height) {\r\n throw new Error('Half circle must have a radius or size');\r\n }\r\n s.height = props.height;\r\n s.width = props.width;\r\n }\r\n\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper ref={ref} viewBox='0 0 100 100' {...props} width={s.width} height={s.height} >\r\n <rect width={100} height={100} stroke=\"transparent\" fill='transparent'></rect>\r\n <path className={`${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" d={`M 0 75 A 50 50 0 1 1 100 75 Z`} fill={props.fill || 'none'} stroke={props.stroke || 'none'} strokeWidth={sw}></path>\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\n\r\n\r\nexport default Crescent;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface RectangleProps extends IShape {\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n}\r\nconst Rectangle: React.ForwardRefExoticComponent<RectangleProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n\r\n let scaledWidth = props.width;\r\n let scaledHeight = props.height;\r\n if (props.width > 100 || props.height > 100) {\r\n const widthRatio = props.width / 100;\r\n const heightRatio = props.height / 100;\r\n\r\n if (widthRatio > heightRatio) {\r\n scaledWidth = 100;\r\n scaledHeight = scaledHeight / widthRatio;\r\n } else {\r\n scaledHeight = 100;\r\n scaledWidth = scaledWidth / heightRatio;\r\n }\r\n }\r\n\r\n const x = 0; //(100 - scaledWidth) / 2;\r\n const y = 0; //(100 - scaledHeight) / 2;\r\n\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper {...props} ref={ref} height={props.height} width={props.width} >\r\n <rect className={`rect-border ${props.portMoveableAreaCssClass}`} vectorEffect=\"non-scaling-stroke\" width={scaledWidth} height={scaledHeight} fill={props.fill || \"transparent\"} stroke={props.stroke || \"none\"} strokeWidth={sw} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default Rectangle;","//rectangle react component to draw a rectangle using svg with properties width, height, fill, stroke, and strokeWidth\r\nimport React, { forwardRef } from 'react';\r\nimport IShape from '../../models/IShape';\r\nimport ShapeWrapper from './shapeWrapper';\r\n\r\ninterface RectangularFrameProps extends IShape {\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n frameColor?: string;\r\n frameWidth?: number;\r\n}\r\nconst RectangularFrame: React.ForwardRefExoticComponent<RectangularFrameProps & React.RefAttributes<SVGSVGElement>> = forwardRef((props, ref) => {\r\n let scaledWidth = props.width;\r\n let scaledHeight = props.height;\r\n\r\n if (props.width > 100 || props.height > 100) {\r\n const widthRatio = props.width / 100;\r\n const heightRatio = props.height / 100;\r\n\r\n if (widthRatio > heightRatio) {\r\n scaledWidth = 100;\r\n scaledHeight = scaledHeight / widthRatio;\r\n } else {\r\n scaledHeight = 100;\r\n scaledWidth = scaledWidth / heightRatio;\r\n }\r\n }\r\n\r\n const vbX = 0 //(100 - scaledWidth) / 2;\r\n const vbY = 0 //(100 - scaledHeight) / 2;\r\n\r\n let fw = props.frameColor ? (props.frameWidth || 1) : 0;\r\n let scaledFw = scaledWidth / props.width * fw;\r\n let sw = props.stroke ? (props.strokeWidth || 1) : 0;\r\n\r\n return (\r\n <ShapeWrapper {...props} ref={ref} height={props.height} width={props.width} >\r\n <rect vectorEffect=\"non-scaling-stroke\" className={`rectangular-frame-outer-border ${props.portMoveableAreaCssClass}`} x={vbX} y={vbY} width={scaledWidth} height={scaledHeight} fill={\"none\"} stroke={props.stroke || \"none\"} strokeWidth={sw} />\r\n <rect vectorEffect=\"non-scaling-stroke\" className='rectangular-frame-hallway' x={vbX + scaledFw / 2} y={vbY + scaledFw / 2} width={scaledWidth - scaledFw} height={scaledHeight - scaledFw} stroke={props.frameColor || \"none\"} strokeWidth={fw} fill={props.fill || \"transparent\"} />\r\n <rect vectorEffect=\"non-scaling-stroke\" className='rectangular-frame-inner-border' x={vbX + scaledFw} y={vbY + scaledFw} width={scaledWidth - scaledFw * 2} height={scaledHeight - scaledFw * 2} stroke={props.stroke || \"none\"} strokeWidth={sw} fill={props.fill || \"transparent\"} />\r\n </ShapeWrapper>\r\n );\r\n});\r\n\r\nexport default RectangularFrame;","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","export const MIN_ELEMENT_SIZE = 20;\r\n\r\n//naming convention: [element type]_[element action]\r\n//element types: paper, port, element\r\n//element actions:\r\n//for actions that we can't have different handlers before or after the action, use the infinitive tense verb. For example, click, mouse_down, mouse_up\r\n//for actions that we can have different handlers before or after the action, use the v-ing or perfect tense verb. For example, moving, moved, resizing, resized, deleting, deleted\r\nexport const EVENT_NAME = {\r\n //PAPER\r\n PAPER_CLICK: 'paper_click',\r\n\r\n //ELEMENT\r\n ELEMENT_MOVED: 'element_moved',\r\n ELEMENT_CLICK: 'element_click',\r\n ELEMENT_DRAGGED: 'element_dragged',\r\n ELEMENT_RESIZED: 'element_resized',\r\n ELEMENT_DELETED: 'element_deleted',\r\n ELEMENT_SELECTED: 'element_selected',\r\n\r\n //PORT\r\n PORT_MOUSE_DOWN: 'port_mouse_down',\r\n PORT_MOUSE_UP: 'port_mouse_up',\r\n PORT_MOVED: 'port_moved',\r\n PORT_SELECTED: 'port_selected',\r\n\r\n //COMMAND\r\n COMMAND_DELETE_SELECTED_PORT: 'command_delete_selected_port',\r\n COMMAND_DELETE_SELECTED_LINK: 'command_delete_selected_link',\r\n COMMAND_DELETE_SELECTED_ELEMENT: 'command_delete_selected_element',\r\n COMMAND_DELETE_SELECTED_TEXT: 'command_delete_selected_text',\r\n\r\n //ELEMENT LINK\r\n ELEMENT_LINK_STARTED: 'element_link_started',\r\n ELEMENT_LINK_ENDED: 'element_link_ended',\r\n\r\n //TEXT\r\n TEXT_SELECTED: 'text_selected',\r\n}\r\n\r\n//ELEMENT\r\n//export const ELEMENT_MOVING_OFFSET_THRESHOLD = 10;\r\n\r\n//ELEMENT LINK\r\nexport const MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK = 30;\r\nexport const MAX_LINK_KNOT_COUNT = 10;\r\nexport const LINK_MARKER_DISTANCE_FROM_PORT = 20;\r\nexport const LINK_MARKER_SIZE = 20;\r\nexport const LINK_CLICKABLE_STROKE_WIDTH = 15;\r\nexport const CSS_CLASS_LINK_SELECTED = \"link-selected\";\r\nexport const LINK_DEFAULT_COLOR = 'black'\r\n\r\n//TEXT\r\nexport const LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT = { x: 15, y: 15 }\r\nexport const LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT = { x: 15, y: 15 }\r\nexport const LINK_LABEL_POSITION_FROM_LINK_MID_POINT = { x: 0, y: 40 }\r\nexport const PORT_LABEL_POSITION = { x: 15, y: 0 }\r\nexport const TEXT_FONT_SIZE = 12;\r\nexport const TEXT_MOVING_OFFSET_THRESHOLD = 10;\r\n\r\n//PORT\r\nexport const PORT_PLACEHOLDER_DEFAULT_SIZE = 8;\r\nexport const PORT_PLACEHOLDER_DEFAULT_STROKE = 'green';\r\nexport const PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH = 20;\r\nexport const PORT_MOVING_OFFSET_THRESHOLD = 15;\r\nexport const PORT_DEFAULT_SIZE = 20;","import React, { useCallback, useEffect } from 'react';\r\nimport ISelectionFrameProps from '../../models/IElementSelectorProps';\r\nimport { MIN_ELEMENT_SIZE } from '../../utils/constants';\r\nimport { PositioningAnchor } from '../../models/enums/PositioningAnchor';\r\n\r\nconst SelectionFrame = (props: ISelectionFrameProps) => {\r\n\r\n const bbox = props.targetSVGElement?.getBBox();\r\n\r\n const [width, setWidth] = React.useState(props.width || bbox?.width || MIN_ELEMENT_SIZE);\r\n const [height, setHeight] = React.useState(props.height || bbox?.height || MIN_ELEMENT_SIZE);\r\n\r\n const x = 0;\r\n const y = 0;\r\n const framePadding = props.framePadding || 0;\r\n const r = 5;\r\n\r\n const [draggingRect, setDraggingRect] = React.useState(false);\r\n const [draggingCircle, setDraggingCircle] = React.useState(false);\r\n\r\n const [startX, setStartX] = React.useState(0);\r\n const [startY, setStartY] = React.useState(0);\r\n const [lastMoveTime, setLastMoveTime] = React.useState(0);\r\n\r\n const addRectHandleMouseDown = (event: React.MouseEvent<SVGRectElement>) => {\r\n event.stopPropagation()\r\n\r\n if (!draggingCircle) {\r\n //mouse down on rect\r\n setDraggingRect(true);\r\n setStartX(event.clientX);\r\n setStartY(event.clientY);\r\n }\r\n };\r\n\r\n const rectHandleMouseMove = useCallback((event: Event) => {\r\n const mouseEvent = event as MouseEvent;\r\n if (draggingRect) {\r\n let offsetX = mouseEvent.clientX - startX;\r\n let offsetY = mouseEvent.clientY - startY;\r\n\r\n if (props.movingOffsetThreshold && Math.abs(offsetX) > props.movingOffsetThreshold) {\r\n offsetX = offsetX / Math.abs(offsetX) * props.movingOffsetThreshold;\r\n }\r\n\r\n if (props.movingOffsetThreshold && Math.abs(offsetY) > props.movingOffsetThreshold) {\r\n offsetY = offsetY / Math.abs(offsetY) * props.movingOffsetThreshold;\r\n }\r\n\r\n if (Date.now() - lastMoveTime < (props.movingRate || 0)) {\r\n return;\r\n }\r\n\r\n console.info('Selection frame moved by: ', offsetX, offsetY);\r\n\r\n if (props.onMove) {\r\n props.onMove(offsetX, offsetY);\r\n setLastMoveTime(Date.now());\r\n setStartX(mouseEvent.clientX);\r\n setStartY(mouseEvent.clientY);\r\n }\r\n }\r\n }, [draggingRect, props.onMove, props.movingRate, startX, startY, lastMoveTime]);\r\n\r\n useEffect(() => {\r\n\r\n const addRectHandleMouseUp = () => {\r\n //mouse up\r\n setDraggingRect(false);\r\n };\r\n\r\n //select container if it is a string\r\n //const container = typeof props.container === 'string' ? document.querySelector(props.container) : props.container;\r\n const container = props.container;\r\n\r\n //add event listeners\r\n container?.addEventListener('mousemove', rectHandleMouseMove);\r\n container?.addEventListener('mouseup', addRectHandleMouseUp);\r\n\r\n return () => {\r\n container?.removeEventListener('mousemove', rectHandleMouseMove);\r\n container?.removeEventListener('mouseup', addRectHandleMouseUp);\r\n };\r\n }, [props.container, rectHandleMouseMove]);\r\n\r\n const circleHandleMouseDown = (event: React.MouseEvent<SVGCircleElement, MouseEvent>) => {\r\n event.stopPropagation();\r\n\r\n if (!draggingRect) {\r\n // mouse down on resizing circle\r\n setStartX(event.clientX);\r\n setStartY(event.clientY);\r\n setDraggingCircle(true);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const circleHandleMouseMove = (event: Event) => {\r\n const mouseEvent = event as MouseEvent;\r\n if (draggingCircle) {\r\n let offsetX = mouseEvent.clientX - startX;\r\n let offsetY = mouseEvent.clientY - startY;\r\n\r\n if (Date.now() - lastMoveTime < (props.movingRate || 0)) {\r\n return;\r\n }\r\n\r\n setStartX(mouseEvent.clientX);\r\n setStartY(mouseEvent.clientY);\r\n setLastMoveTime(Date.now());\r\n\r\n let newWidth = width;\r\n let newHeight = height;\r\n\r\n if (props.resizability.keepRatio) {\r\n let resizingRatio = Math.abs(offsetX) > Math.abs(offsetY) ? (Math.abs(offsetX) / width) : (Math.abs(offsetY) / height);\r\n const increasing = Math.abs(offsetX) > Math.abs(offsetY) ? offsetX > 0 : offsetY > 0;\r\n offsetX = increasing ? resizingRatio * width : -resizingRatio * width;\r\n offsetY = increasing ? resizingRatio * height : -resizingRatio * height;\r\n }\r\n\r\n newWidth += offsetX;\r\n newHeight += offsetY;\r\n\r\n if (newWidth < MIN_ELEMENT_SIZE) {\r\n newWidth = MIN_ELEMENT_SIZE;\r\n }\r\n\r\n if (newHeight < MIN_ELEMENT_SIZE) {\r\n newHeight = MIN_ELEMENT_SIZE;\r\n }\r\n\r\n setWidth(newWidth);\r\n setHeight(newHeight);\r\n\r\n if (props.onResize) {\r\n props.onResize(newWidth, newHeight);\r\n }\r\n //}\r\n }\r\n };\r\n\r\n const circleHandleMouseUp = () => {\r\n setDraggingCircle(false);\r\n };\r\n\r\n //select container if it is a string\r\n //const container = typeof props.container === 'string' ? document.querySelector(props.container) : props.container;\r\n const container = props.container\r\n\r\n container.addEventListener('mousemove', circleHandleMouseMove);\r\n container.addEventListener('mouseup', circleHandleMouseUp);\r\n\r\n return () => {\r\n container.removeEventListener('mousemove', circleHandleMouseMove);\r\n container.removeEventListener('mouseup', circleHandleMouseUp);\r\n };\r\n }, [draggingCircle, startX, startY, x, y]);\r\n\r\n const rectangleSize = Math.max(width, height);\r\n let leftX = framePadding;\r\n let topY = framePadding;\r\n\r\n if (props.anchor === PositioningAnchor.Center) {\r\n leftX -= rectangleSize / 2;\r\n topY -= rectangleSize / 2;\r\n }\r\n\r\n return (\r\n <>\r\n {props.dragDropHandlerElement && <props.dragDropHandlerElement dragging={draggingRect} onMouseDown={addRectHandleMouseDown as any} />}\r\n {<rect\r\n vectorEffect=\"non-scaling-stroke\"\r\n x={leftX}\r\n y={topY}\r\n width={width}\r\n height={height}\r\n fill='none'\r\n stroke='blue'\r\n strokeWidth={props.strokeWidth || 5}\r\n cursor={draggingRect ? 'grabbing' : 'grab'}\r\n onMouseDown={addRectHandleMouseDown}\r\n ></rect>}\r\n {props.resizability.enabled ?\r\n (\r\n <circle cursor={'se-resize'}\r\n cx={leftX + width} cy={topY + height} r={r} fill='blue' stroke='blue' onMouseDown={circleHandleMouseDown}></circle>\r\n ) : null}\r\n </>\r\n );\r\n};\r\n\r\nexport default SelectionFrame;","import React, { useEffect } from 'react';\r\nimport ISelectionFrameProps from '../models/IElementSelectorProps';\r\nimport { createRoot } from 'react-dom/client';\r\nimport SelectionFrame from '../components/viewControls/selectionFrame';\r\n\r\ninterface useSelectionFrameProps extends Omit<ISelectionFrameProps, \"container\"> {\r\n container?: HTMLElement | null;\r\n}\r\n\r\nconst useSelectionFrame = (props: useSelectionFrameProps) => {\r\n useEffect(() => {\r\n if (props.targetSVGElement && props.container) {\r\n //render SelectionFrame component to the parent element of the targetSVGElement \r\n\r\n if (props.container) {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.style.overflow = 'visible';\r\n svg.style.outline = 'none';\r\n props.targetSVGElement.appendChild(svg);\r\n const root = createRoot(svg);\r\n root.render(<SelectionFrame {...props} container={props.container as Element} />);\r\n return () => {\r\n root.unmount();\r\n if (props.targetSVGElement) {\r\n props.targetSVGElement.removeChild(svg);\r\n }\r\n }\r\n }\r\n\r\n\r\n }\r\n }, [props.targetSVGElement, props.container]);\r\n};\r\n\r\nexport default useSelectionFrame;","import EventEmitter from \"eventemitter3\";\r\nimport { createContext } from \"react\";\r\nimport { EVENT_NAME } from \"../utils/constants\";\r\nimport IPort from \"../models/IPort\";\r\nimport IElement from \"../models/IElement\";\r\nimport { onCommandDeleteSelectedHandler, OnElementLinkEnded, OnElementLinkStarted, onElementMovedHandler, onElementResizedHandler, OnElementSelected, onPortMouseDownHandler, onPortMouseUpHandler, onPortMovedHandler, OnPortSelected, OnTextSelected } from \"../models/callbackTypes\";\r\nimport IPosition from \"../models/position\";\r\nimport ISize from \"../models/size\";\r\nimport IElementLink from \"../models/IElementLink\";\r\nimport { IText } from \"../models\";\r\n\r\nconst eventEmitter = new EventEmitter();\r\n\r\nconst emitPaperClicked = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n eventEmitter.emit(EVENT_NAME.PAPER_CLICK, ev);\r\n}\r\n\r\nconst onPaperClicked = (callback: (ev: React.MouseEvent<SVGSVGElement>) => void) => {\r\n eventEmitter.on(EVENT_NAME.PAPER_CLICK, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PAPER_CLICK, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMouseUp = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOUSE_UP, ev, port, elementId);\r\n}\r\n\r\nconst onPortMouseUp = (callback: onPortMouseUpHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOUSE_UP, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOUSE_UP, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMouseDown = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOUSE_DOWN, ev, port, elementId);\r\n}\r\n\r\nconst onPortMouseDown = (callback: onPortMouseDownHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOUSE_DOWN, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOUSE_DOWN, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortMoved = (port: IPort, elementId: string, oldPosition: IPosition, newPosition: IPosition) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_MOVED, port, elementId, oldPosition, newPosition);\r\n}\r\n\r\nconst onPortMoved = (callback: onPortMovedHandler) => {\r\n eventEmitter.on(EVENT_NAME.PORT_MOVED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_MOVED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementMoved = (element: IElement, oldPosition: IPosition, newPosition: IPosition) => {\r\n eventEmitter.emit(`${EVENT_NAME.ELEMENT_MOVED}_${element.id}`);\r\n}\r\n\r\nconst onElementMoved = (elementId: string, callback: onElementMovedHandler) => {\r\n eventEmitter.on(`${EVENT_NAME.ELEMENT_MOVED}_${elementId}`, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(`${EVENT_NAME.ELEMENT_MOVED}_${elementId}`, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementResized = (element: IElement, oldSize: ISize, newSize: ISize) => {\r\n eventEmitter.emit(`${EVENT_NAME.ELEMENT_RESIZED}_${element.id}`, oldSize, newSize);\r\n}\r\n\r\nconst onElementResized = (elementId: string, callback: onElementResizedHandler) => {\r\n eventEmitter.on(`${EVENT_NAME.ELEMENT_RESIZED}_${elementId}`, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(`${EVENT_NAME.ELEMENT_RESIZED}_${elementId}`, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedPort = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT);\r\n}\r\nconst onCommandDeleteSelectedPort = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_PORT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedElement = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT);\r\n}\r\nconst onCommandDeleteSelectedElement = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_ELEMENT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedLink = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK);\r\n}\r\nconst onCommandDeleteSelectedLink = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_LINK, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitCommandDeleteSelectedText = () => {\r\n eventEmitter.emit(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT);\r\n}\r\nconst onCommandDeleteSelectedText = (callback: onCommandDeleteSelectedHandler) => {\r\n eventEmitter.on(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.COMMAND_DELETE_SELECTED_TEXT, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementLinkStarted = (elementLink: IElementLink) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_LINK_STARTED, elementLink);\r\n}\r\n\r\nconst onElementLinkStarted = (callback: OnElementLinkStarted) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_LINK_STARTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_LINK_STARTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitElementLinkEnded = (elementLink?: IElementLink) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_LINK_ENDED, elementLink);\r\n}\r\n\r\nconst onElementLinkEnded = (callback: OnElementLinkEnded) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_LINK_ENDED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_LINK_ENDED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\n\r\nconst emitElementSelected = (element: IElement) => {\r\n eventEmitter.emit(EVENT_NAME.ELEMENT_SELECTED, element);\r\n}\r\n\r\nconst onElementSelected = (callback: OnElementSelected) => {\r\n eventEmitter.on(EVENT_NAME.ELEMENT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.ELEMENT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitPortSelected = (port: IPort, elementId: string) => {\r\n eventEmitter.emit(EVENT_NAME.PORT_SELECTED, port, elementId);\r\n}\r\n\r\nconst onPortSelected = (callback: OnPortSelected) => {\r\n eventEmitter.on(EVENT_NAME.PORT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.PORT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\nconst emitTextSelected = (text: IText) => {\r\n eventEmitter.emit(EVENT_NAME.TEXT_SELECTED, text);\r\n}\r\n\r\nconst onTextSelected = (callback: OnTextSelected) => {\r\n eventEmitter.on(EVENT_NAME.TEXT_SELECTED, callback);\r\n\r\n const off = () => {\r\n eventEmitter.off(EVENT_NAME.TEXT_SELECTED, callback);\r\n }\r\n\r\n return {\r\n off\r\n }\r\n}\r\n\r\n\r\ninterface IEventListenerReturn {\r\n off: () => void;\r\n}\r\n\r\ninterface IPaperEventContext {\r\n emitter: EventEmitter<string | symbol, any>;\r\n emitPaperClicked: (ev: React.MouseEvent<SVGSVGElement>) => void;\r\n onPaperClicked: (callback: (ev: React.MouseEvent<SVGSVGElement>) => void) => IEventListenerReturn;\r\n\r\n emitPortMouseUp: onPortMouseUpHandler;\r\n onPortMouseUp: (callback: onPortMouseUpHandler) => IEventListenerReturn;\r\n\r\n emitPortMouseDown: onPortMouseDownHandler\r\n onPortMouseDown: (callback: onPortMouseDownHandler) => IEventListenerReturn;\r\n\r\n emitPortMoved: onPortMovedHandler;\r\n onPortMoved: (callback: onPortMovedHandler) => IEventListenerReturn;\r\n\r\n emitPortSelected: OnPortSelected;\r\n onPortSelected: (callback: OnPortSelected) => IEventListenerReturn;\r\n\r\n emitElementMoved: onElementMovedHandler;\r\n onElementMoved: (elementId: string, callback: onElementMovedHandler) => IEventListenerReturn;\r\n\r\n emitElementResized: onElementResizedHandler;\r\n onElementResized: (elementId: string, callback: onElementResizedHandler) => IEventListenerReturn;\r\n\r\n emitElementSelected: OnElementSelected;\r\n onElementSelected: (callback: OnElementSelected) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedPort: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedPort: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedElement: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedElement: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedLink: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedLink: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitCommandDeleteSelectedText: onCommandDeleteSelectedHandler;\r\n onCommandDeleteSelectedText: (callback: onCommandDeleteSelectedHandler) => IEventListenerReturn;\r\n\r\n emitElementLinkStarted: OnElementLinkStarted;\r\n onElementLinkStarted: (callback: OnElementLinkStarted) => IEventListenerReturn;\r\n\r\n emitElementLinkEnded: OnElementLinkEnded;\r\n onElementLinkEnded: (callback: OnElementLinkEnded) => IEventListenerReturn;\r\n\r\n emitTextSelected: OnTextSelected;\r\n onTextSelected: (callback: OnTextSelected) => IEventListenerReturn;\r\n}\r\n\r\nexport const paperEventEmitterContext: React.Context<IPaperEventContext> = createContext({\r\n emitter: eventEmitter,\r\n emitPaperClicked,\r\n onPaperClicked,\r\n\r\n emitPortMouseUp,\r\n onPortMouseUp,\r\n\r\n emitPortMouseDown,\r\n onPortMouseDown,\r\n\r\n emitPortMoved,\r\n onPortMoved,\r\n\r\n emitPortSelected,\r\n onPortSelected,\r\n\r\n emitElementMoved,\r\n onElementMoved,\r\n\r\n emitElementResized,\r\n onElementResized,\r\n\r\n emitElementSelected,\r\n onElementSelected,\r\n\r\n emitCommandDeleteSelectedPort,\r\n onCommandDeleteSelectedPort,\r\n\r\n emitCommandDeleteSelectedElement,\r\n onCommandDeleteSelectedElement,\r\n\r\n emitCommandDeleteSelectedLink,\r\n onCommandDeleteSelectedLink,\r\n\r\n emitCommandDeleteSelectedText,\r\n onCommandDeleteSelectedText,\r\n\r\n emitElementLinkStarted,\r\n onElementLinkStarted,\r\n\r\n emitElementLinkEnded,\r\n onElementLinkEnded,\r\n\r\n emitTextSelected,\r\n onTextSelected,\r\n})\r\n\r\n\r\n","import React, { forwardRef, memo, useContext, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { TextAlign } from \"../../models/enums/TextAlign\";\r\nimport ITextProps from \"../../models/ITextProps\";\r\nimport IText from \"../../models/IText\";\r\nimport useSelectionFrame from \"../../hooks/useSelectionFrame\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport { TEXT_FONT_SIZE, TEXT_MOVING_OFFSET_THRESHOLD } from \"../../utils/constants\";\r\n\r\nconst Text: React.ForwardRefExoticComponent<ITextProps & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, ITextProps>((\r\n {\r\n id,\r\n content,\r\n x,\r\n y,\r\n width,\r\n height,\r\n align = TextAlign.left,\r\n fontSize: fontSizeProp,\r\n border,\r\n container,\r\n onSelected,\r\n onMoved,\r\n onResized,\r\n onContentChanged,\r\n },\r\n ref\r\n ) => {\r\n const [isSelected, setIsSelected] = useState<boolean>(false)\r\n const [isEditing, setIsEditing] = useState<boolean>(false)\r\n\r\n const svgRef = useRef<SVGSVGElement>()\r\n\r\n const { onPaperClicked, emitTextSelected, onPortSelected, onElementSelected, onTextSelected } = useContext(paperEventEmitterContext)\r\n\r\n useEffect(() => {\r\n const paperClickListener = onPaperClicked((ev) => {\r\n const textareaELe = svgRef.current?.querySelector('textarea')\r\n\r\n if (ev.target !== textareaELe) {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n }\r\n })\r\n\r\n const portSelectedListener = onPortSelected((port) => {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n })\r\n\r\n const elementSelectedListener = onElementSelected((element) => {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n })\r\n\r\n const textSelectedListener = onTextSelected((text) => {\r\n if (text.id !== id) {\r\n setIsSelected(false)\r\n setIsEditing(false)\r\n }\r\n })\r\n\r\n return () => {\r\n paperClickListener.off();\r\n portSelectedListener.off();\r\n elementSelectedListener.off();\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Handle click on svg element\r\n const handleClick = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n ev.stopPropagation()\r\n\r\n const position = (x === undefined || y === undefined) ? undefined : {\r\n x,\r\n y,\r\n }\r\n\r\n const text: IText = {\r\n id,\r\n content: content,\r\n position: position,\r\n size: {\r\n width,\r\n height,\r\n }\r\n }\r\n\r\n setIsSelected(true)\r\n onSelected && onSelected(text);\r\n emitTextSelected(text)\r\n }\r\n\r\n const handleChangeText = (ev: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n onContentChanged?.(ev, ev.target.value)\r\n }\r\n\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: (isSelected && svgRef.current) ? svgRef.current : undefined,\r\n resizability: {\r\n enabled: onResized ? true : false,\r\n keepRatio: false,\r\n },\r\n onMove: onMoved,\r\n onResize: onResized,\r\n strokeWidth: 3,\r\n movingOffsetThreshold: TEXT_MOVING_OFFSET_THRESHOLD,\r\n })\r\n\r\n let textAlign = useMemo(() => {\r\n switch (align) {\r\n case TextAlign.left:\r\n return 'left'\r\n\r\n case TextAlign.right:\r\n return 'right'\r\n case TextAlign.center:\r\n return 'center'\r\n\r\n default:\r\n return 'left'\r\n }\r\n }, [align]);\r\n\r\n const fontSize = fontSizeProp || TEXT_FONT_SIZE;\r\n const borderStyle = border || 'none'\r\n\r\n return (\r\n <svg style={{ overflow: \"visible\" }} x={x} y={y}\r\n ref={(node) => {\r\n svgRef.current = node!;\r\n if (typeof ref === 'function') {\r\n ref(node);\r\n } else if (ref) {\r\n ref.current = node;\r\n }\r\n }}\r\n onClick={handleClick}\r\n >\r\n <foreignObject width={width} height={height}\r\n style={{\r\n overflow: 'visible',\r\n userSelect: 'none',\r\n WebkitUserSelect: 'none',\r\n msUserSelect: 'none'\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n borderStyle: borderStyle,\r\n // whiteSpace: 'pre-wrap',\r\n boxSizing: 'border-box',\r\n }}\r\n >\r\n <textarea\r\n style={{\r\n fontFamily: 'initial',\r\n display: 'inline-block',\r\n width: '100%',\r\n height: '100%',\r\n overflow: 'hidden',\r\n border: 'none',\r\n background: 'transparent',\r\n outline: 'none',\r\n resize: 'none',\r\n textAlign: textAlign as any,\r\n fontSize: fontSize,\r\n }}\r\n readOnly={!isEditing}\r\n onDoubleClick={() => {\r\n if (onContentChanged) {\r\n setIsEditing(true)\r\n }\r\n }}\r\n\r\n value={content}\r\n onChange={handleChangeText}\r\n >\r\n </textarea>\r\n </div>\r\n </foreignObject>\r\n </svg>\r\n )\r\n })\r\n\r\nexport default memo(Text);","import React, { forwardRef, memo, useMemo, useRef } from \"react\";\r\nimport { IPortProps } from \"../../models/IPortProps\";\r\nimport Circle from \"../shapes/circle\";\r\nimport { PositioningAnchor } from \"../../models/enums/PositioningAnchor\";\r\nimport Text from \"../texts/text\";\r\nimport { PORT_LABEL_POSITION } from \"../../utils/constants\";\r\nimport IText from \"../../models/IText\";\r\n\r\nconst Port1: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>> = forwardRef((\r\n props,\r\n ref\r\n) => {\r\n const {\r\n id,\r\n x,\r\n y,\r\n width,\r\n height,\r\n container,\r\n label,\r\n onPortLabelMoved,\r\n onPortLabelResized,\r\n onPortLabelContentChanged,\r\n onSelected,\r\n onMouseDown,\r\n onMouseUp,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onMouseMove,\r\n calculateRotationAngle,\r\n renderShape\r\n } = props\r\n const textRef = useRef<SVGSVGElement | null>(null)\r\n\r\n const rotationAngle = useMemo(() => {\r\n if (!calculateRotationAngle) return 0;\r\n\r\n return calculateRotationAngle(x, y)\r\n }, [calculateRotationAngle, x, y])\r\n\r\n const renderLabel = (label: IText) => {\r\n const { content, size } = label;\r\n const position = label.position || PORT_LABEL_POSITION\r\n\r\n return <Text\r\n id={label.id}\r\n ref={textRef}\r\n x={x + position.x}\r\n y={y + position.y}\r\n width={size.width}\r\n height={size.height}\r\n content={content}\r\n fontSize={label.fontSize}\r\n border={label.border}\r\n container={container}\r\n\r\n onMoved={onPortLabelMoved}\r\n onResized={onPortLabelResized}\r\n onContentChanged={onPortLabelContentChanged}\r\n />\r\n }\r\n\r\n const renderedShape = useMemo(() => {\r\n if (renderShape) {\r\n const RenderShape = renderShape;\r\n return (\r\n <RenderShape ref={ref} {...props} rotation={rotationAngle}></RenderShape>\r\n )\r\n }\r\n else {\r\n return <Circle\r\n onMouseDown={(e: any) => onMouseDown?.(id, e)}\r\n onMouseUp={(e: any) => onMouseUp?.(id, e)}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n onMouseMove={onMouseMove}\r\n onClick={(e: any) => onSelected?.(id, e)}\r\n ref={ref}\r\n x={x}\r\n y={y}\r\n positioningAnchor={PositioningAnchor.Center}\r\n height={height}\r\n width={width}\r\n stroke=\"black\"\r\n fill=\"black\"\r\n >\r\n </Circle>\r\n }\r\n }, [props])\r\n\r\n\r\n return (\r\n <>\r\n {renderedShape}\r\n {label && renderLabel(label)}\r\n </>\r\n );\r\n});\r\n\r\nexport const Port = memo(Port1)","import IPosition from \"../models/position\";\r\n\r\ninterface IPathCommand {\r\n type: string;\r\n values: number[];\r\n}\r\n\r\n// Render the svg <path> element\r\nexport function getCurvePathData(points: IPosition[], smoothing: number = 0.2, closed?: boolean): IPathCommand[] {\r\n\r\n // append first 2 points for closed paths\r\n if (closed) {\r\n points = points.concat(points.slice(0, 2));\r\n }\r\n\r\n // Properties of a line\r\n const line = (pointA: IPosition, pointB: IPosition) => {\r\n const lengthX = pointB.x - pointA.x;\r\n const lengthY = pointB.y - pointA.y;\r\n return {\r\n length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\r\n angle: Math.atan2(lengthY, lengthX)\r\n };\r\n };\r\n\r\n // Position of a control point\r\n const controlPoint = (current: IPosition, previous: IPosition, next: IPosition, reverse?: boolean) => {\r\n const p = previous || current;\r\n const n = next || current;\r\n const o = line(p, n);\r\n\r\n const angle = o.angle + (reverse ? Math.PI : 0);\r\n const length = o.length * smoothing;\r\n\r\n const x = current.x + Math.cos(angle) * length;\r\n const y = current.y + Math.sin(angle) * length;\r\n return { x, y };\r\n };\r\n\r\n let pathData = [];\r\n pathData.push({ type: \"M\", values: [points[0].x, points[0].y] });\r\n\r\n for (let i = 1; i < points.length; i++) {\r\n let point = points[i];\r\n const cp1 = controlPoint(points[i - 1], points[i - 2], point);\r\n const cp2 = controlPoint(point, points[i - 1], points[i + 1], true);\r\n\r\n const command = {\r\n type: \"C\",\r\n values: [cp1.x, cp1.y, cp2.x, cp2.y, point.x, point.y]\r\n };\r\n\r\n pathData.push(command);\r\n }\r\n\r\n // copy last commands 1st controlpoint to first curveto\r\n if (closed) {\r\n let comLast = pathData[pathData.length - 1];\r\n let valuesLastC = comLast.values;\r\n let valuesFirstC = pathData[1].values;\r\n\r\n pathData[1] = {\r\n type: \"C\",\r\n values: [valuesLastC[0], valuesLastC[1], valuesFirstC.slice(2)].flat()\r\n };\r\n // delete last curveto\r\n pathData = pathData.slice(0, pathData.length - 1);\r\n }\r\n\r\n return pathData;\r\n}\r\n\r\n// convert pathdata to d attribute string\r\nexport function pathDataToD(pathData: IPathCommand[], decimals: number = 3): string {\r\n let d = pathData\r\n .map((com) => {\r\n return `${com.type}${com.values.map(value => { return +value.toFixed(decimals) }).join(\" \")}`;\r\n })\r\n .join(\" \");\r\n return d;\r\n}\r\n\r\nexport function createSmoothPathString(points: IPosition[], smoothing?: number, close?: boolean): string {\r\n const pathData = getCurvePathData(points, smoothing, close)\r\n const pathString = pathDataToD(pathData)\r\n return pathString;\r\n}\r\n\r\n// a helper function to measure the distance between 2 points\r\nexport function dist(p1: IPosition, p2: IPosition) {\r\n let dx = p2.x - p1.x;\r\n let dy = p2.y - p1.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n}\r\n\r\n//find distance from starting point of path to a point\r\nfunction getLengthForPoint(p: IPosition, thePath: SVGPathElement, precision: number = 50) {\r\n const pathLength = thePath.getTotalLength();\r\n let theRecord = pathLength; //length of path\r\n let division = pathLength / precision;\r\n\r\n let theSegment: number;\r\n\r\n for (let i = 0; i < precision; i++) {\r\n // get a point on the path for thia distance\r\n let _p = thePath.getPointAtLength(i * division);\r\n // get the distance between the new point _p and the point p\r\n let theDistance = dist(_p, p);\r\n\r\n if (theDistance < theRecord) {\r\n // if the distance is smaller than the record set the new record\r\n theRecord = theDistance;\r\n theSegment = i;\r\n }\r\n }\r\n\r\n return (theSegment! * division);\r\n}\r\n\r\n//Add points to the list of points in the correct position\r\nexport function addPointToList(point: IPosition, listPoints: IPosition[], path: SVGPathElement): IPosition[] {\r\n const getAddIndex = (startIndex: number, endIndex: number): number => {\r\n //Add in the middle if there are only 2 points\r\n if ((endIndex - startIndex) === 1) {\r\n return startIndex + 1;\r\n }\r\n\r\n const middleIndex = Math.ceil((startIndex + endIndex) / 2)\r\n\r\n const lengthOfMiddlePoint = getLengthForPoint(listPoints[middleIndex], path) //distance from start point to mid point\r\n const lengthOfAddedPoint = getLengthForPoint(point, path)//distance from adding point to mid point\r\n\r\n //compare if lengthOfMiddlePoint is less than lengthOfAddedPoint, \r\n //then new point can be added in the range of mid point to end point, \r\n //otherwise it can be added in the range of start point to middle point.\r\n if (lengthOfAddedPoint < lengthOfMiddlePoint) {\r\n return getAddIndex(startIndex, middleIndex)\r\n } else {\r\n return getAddIndex(middleIndex, endIndex)\r\n }\r\n }\r\n\r\n const addedIndex = getAddIndex(0, listPoints.length - 1)\r\n\r\n listPoints.splice(addedIndex, 0, point);\r\n\r\n return [...listPoints];\r\n}\r\n","import IPosition from \"../models/position\";\r\n\r\n// const topLeftOffsetOfSquareHoldingRect = (x: number, y: number, rectWidth: number, rectHeight: number, rotation?: number): IPosition => {\r\n\r\n// rotation = rotation || 0;\r\n// const rotationInRadians = rotation * Math.PI / 180;\r\n// //calculate the bouding edge of the square that holds the rectangle with the given width and height and rotation, knowing that the square is always parallel to the x and y axis\r\n// //calculate a1 equal sin of rotation * height\r\n// const a1 = Math.abs(Math.sin(rotationInRadians) * rectHeight);\r\n// //calculate a2 equal cos of rotation * width\r\n// const a2 = Math.abs(Math.cos(rotationInRadians) * rectWidth);\r\n// const a = a1 + a2;\r\n\r\n// console.info(`a1: ${a1}, a2: ${a2}, a: ${a}`);\r\n\r\n// //calculate b1 equal cos of rotation * height\r\n// const b1 = Math.abs(Math.cos(rotationInRadians) * rectHeight);\r\n// //calculate b2 equal sin of rotation * width\r\n// const b2 = Math.abs(Math.sin(rotationInRadians) * rectWidth);\r\n// const b = b1 + b2;\r\n\r\n// console.info(`b1: ${b1}, b2: ${b2}, b: ${b}`);\r\n\r\n// //const squareEdge = Math.max(rectWidth, rectHeight);\r\n\r\n// return {x, y};\r\n// return { x: x - (b - rectWidth) / 2, y: y - (a - rectHeight) / 2 }; \r\n// }\r\n\r\nconst diamondEdgeInsideSquare = (squareEdgeSize: number): number => {\r\n return (squareEdgeSize / 2) * Math.sqrt(2);\r\n}\r\n\r\nfunction degreeToRadian(degree: number) {\r\n return degree * (Math.PI / 180);\r\n}\r\n\r\n//rotate the four vertices of the rectangle\r\nfunction getRotatedRectangleCoordinates(actualPoints: IPosition[], centerX: number, centerY: number, angle: number): IPosition[] {\r\n const coordinatesAfterRotation = [];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const point = actualPoints[i];\r\n const tempX = point.x - centerX;\r\n const tempY = point.y - centerY;\r\n const rotatedX = tempX * Math.cos(degreeToRadian(angle)) - tempY * Math.sin(degreeToRadian(angle));\r\n const rotatedY = tempX * Math.sin(degreeToRadian(angle)) + tempY * Math.cos(degreeToRadian(angle));\r\n point.x = rotatedX + centerX;\r\n point.y = rotatedY + centerY;\r\n coordinatesAfterRotation.push({ x: point.x, y: point.y });\r\n }\r\n\r\n return coordinatesAfterRotation;\r\n}\r\n\r\n//Calculate the angle between 2 points relative to the OX axis\r\nfunction calculateAngleWithOx(pStart: IPosition, pEnd: IPosition) {\r\n const deltaX = pEnd.x - pStart.x;\r\n const deltaY = pEnd.y - pStart.y;\r\n\r\n // Calculate the angle in radians\r\n let angleInRadians = Math.atan2(deltaY, deltaX);\r\n\r\n // Convert to degrees (optional)\r\n let angleInDegrees = angleInRadians * (180 / Math.PI);\r\n\r\n // Ensure the angle is positive (optional, depending on use case)\r\n if (angleInDegrees < 0) {\r\n angleInDegrees += 360;\r\n }\r\n\r\n return angleInDegrees;\r\n}\r\n\r\nexport {\r\n //topLeftOffsetOfSquareHoldingRect,\r\n diamondEdgeInsideSquare,\r\n degreeToRadian,\r\n getRotatedRectangleCoordinates,\r\n calculateAngleWithOx,\r\n}","//Defined remove icon for element link, shown when element link is selected.\r\nimport React from 'react'\r\n\r\ninterface ICloseIconProps {\r\n onClick?: (ev: React.MouseEvent) => void;\r\n}\r\n\r\nexport default function CloseIcon({\r\n onClick\r\n}: ICloseIconProps) {\r\n\r\n return (\r\n <svg\r\n width={20}\r\n height={20}\r\n viewBox=\"0 0 24.00 24.00\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"#ff0000\"\r\n transform=\"rotate(0)\"\r\n onMouseDown={(ev) => { ev.stopPropagation() }}\r\n onClick={onClick}\r\n cursor={'pointer'}\r\n >\r\n <g id=\"SVGRepo_bgCarrier\" strokeWidth=\"0\" transform=\"translate(3.84,3.84), scale(0.68)\">\r\n <rect x=\"0\" y=\"0\" width=\"24.00\" height=\"24.00\" rx=\"12\" fill=\"#ffffff\" strokeWidth=\"0\">\r\n </rect>\r\n </g>\r\n <g id=\"SVGRepo_tracerCarrier\" strokeLinecap=\"round\" strokeLinejoin=\"round\" stroke=\"#CCCCCC\" stroke-width=\"0.048\"></g>\r\n <g id=\"SVGRepo_iconCarrier\">\r\n <g>\r\n <path fill=\"none\" d=\"M0 0h24v24H0z\"></path>\r\n <path d=\"M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z\"></path>\r\n </g>\r\n </g>\r\n </svg>\r\n )\r\n}","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\n/**\r\n * Global constant DP_TOL is used for comparison of floating point numbers.\r\n * It is set to 0.000001.\r\n * @type {number}\r\n */\r\nconst DP_TOL = 0.000001;\r\nconst DECIMALS = 3;\r\n\r\nmodule.exports = {\r\n DP_TOL: DP_TOL,\r\n /**\r\n * Returns *true* if value comparable to zero\r\n * @return {boolean}\r\n */\r\n EQ_0: function(x) {\r\n return ( (x) < DP_TOL && (x) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if two values are equal up to DP_TOL\r\n * @return {boolean}\r\n */\r\n EQ: function(x,y) {\r\n return ( (x)-(y) < DP_TOL && (x)-(y) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument greater than second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n GT: (x,y) => {\r\n return ( (x)-(y) > DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument greater than or equal to second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n GE: (x,y) => {\r\n return ( (x)-(y) > -DP_TOL );\r\n },\r\n /**\r\n * Returns *true* if first argument less than second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n LT: (x,y) => {\r\n return ( (x)-(y) < -DP_TOL )\r\n },\r\n /**\r\n * Returns *true* if first argument less than or equal to second argument up to DP_TOL\r\n * @return {boolean}\r\n */\r\n LE: (x,y) => {\r\n return ( (x)-(y) < DP_TOL );\r\n }\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/19/2017.\r\n */\r\nmodule.exports = {\r\n ILLEGAL_PARAMETERS: new ReferenceError('Illegal Parameters'),\r\n ZERO_DIVISION: new Error('Zero division')\r\n};\r\n\r\n","\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing an affine transformation 3x3 matrix:\r\n * <pre>\r\n * [ a c tx\r\n * A = b d ty\r\n * 0 0 1 ]\r\n * </pre\r\n * @type {Matrix}\r\n */\r\n Flatten.Matrix = class Matrix {\r\n /**\r\n * Construct new instance of affine transformation matrix <br/>\r\n * If parameters omitted, construct identity matrix a = 1, d = 1\r\n * @param {number} a - position(0,0) sx*cos(alpha)\r\n * @param {number} b - position (0,1) sx*sin(alpha)\r\n * @param {number} c - position (1,0) -sy*sin(alpha)\r\n * @param {number} d - position (1,1) sy*cos(alpha)\r\n * @param {number} tx - position (2,0) translation by x\r\n * @param {number} ty - position (2,1) translation by y\r\n */\r\n constructor(a=1,b=0,c=0,d=1,tx=0,ty=0) {\r\n this.a = a;\r\n this.b = b;\r\n this.c = c;\r\n this.d = d;\r\n this.tx = tx;\r\n this.ty = ty;\r\n }\r\n\r\n /**\r\n * Returns a clone of the Matrix instance.\r\n * @return {Matrix}\r\n **/\r\n clone() {\r\n return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty);\r\n };\r\n\r\n /**\r\n * Transform vector [x,y] using transformation matrix. <br/>\r\n * Vector [x,y] is an abstract array[2] of numbers and not a FlattenJS object <br/>\r\n * The result is also an abstract vector [x',y'] = A * [x,y]:\r\n * <code>\r\n * [x' [ ax + by + tx\r\n * y' = cx + dy + ty\r\n * 1] 1 ]\r\n * </code>\r\n * @param {number[]} vector - array[2] of numbers\r\n * @returns {number[]} transformation result - array[2] of numbers\r\n */\r\n transform(vector) {\r\n return [\r\n vector[0]*this.a+vector[1]*this.c+this.tx,\r\n vector[0]*this.b+vector[1]*this.d+this.ty\r\n ]\r\n };\r\n\r\n /**\r\n * Returns result of multiplication of this matrix by other matrix\r\n * @param {Matrix} other_matrix - matrix to multiply by\r\n * @returns {Matrix}\r\n */\r\n multiply(other_matrix) {\r\n return new Matrix(\r\n this.a*other_matrix.a + this.c*other_matrix.b,\r\n this.b*other_matrix.a + this.d*other_matrix.b,\r\n this.a*other_matrix.c + this.c*other_matrix.d,\r\n this.b*other_matrix.c + this.d*other_matrix.d,\r\n this.a*other_matrix.tx + this.c*other_matrix.ty + this.tx,\r\n this.b*other_matrix.tx + this.d*other_matrix.ty + this.ty\r\n )\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix(1,0,0,1,tx,ty)\r\n * @param {number} tx - translation by x\r\n * @param {number} ty - translation by y\r\n * @returns {Matrix}\r\n */\r\n translate(...args) {\r\n let tx, ty;\r\n if (args.length == 1 && (args[0] instanceof Flatten.Vector)) {\r\n tx = args[0].x;\r\n ty = args[0].y;\r\n }\r\n else if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n tx = args[0];\r\n ty = args[1];\r\n }\r\n else {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n return this.multiply(new Matrix(1,0,0,1,tx,ty))\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix that defines rotation by given angle (in radians) around\r\n * point (0,0) in counter clockwise direction\r\n * @param angle\r\n * @returns {Matrix}\r\n */\r\n rotate(angle) {\r\n let cos = Math.cos(angle);\r\n let sin = Math.sin(angle);\r\n return this.multiply(new Matrix(cos,sin,-sin,cos,0,0));\r\n };\r\n\r\n /**\r\n * Return new matrix as a result of multiplication of the current matrix\r\n * by the matrix (sx,0,0,sy,0,0) that defines scaling\r\n * @param sx\r\n * @param sy\r\n * @returns {Matrix}\r\n */\r\n scale(sx, sy) {\r\n return this.multiply(new Matrix(sx,0,0,sy,0,0));\r\n };\r\n\r\n /**\r\n * Returns true if two matrix are equal parameter by parameter\r\n * @param {Matrix} matrix - other matrix\r\n * @returns {boolean} true if equal, false otherwise\r\n */\r\n equalTo(matrix) {\r\n if (!Flatten.Utils.EQ(this.tx, matrix.tx)) return false;\r\n if (!Flatten.Utils.EQ(this.ty, matrix.ty)) return false;\r\n if (!Flatten.Utils.EQ(this.a, matrix.a)) return false;\r\n if (!Flatten.Utils.EQ(this.b, matrix.b)) return false;\r\n if (!Flatten.Utils.EQ(this.c, matrix.c)) return false;\r\n if (!Flatten.Utils.EQ(this.d, matrix.d)) return false;\r\n return true;\r\n };\r\n };\r\n\r\n /**\r\n * Function to create matrix equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.matrix = (...args) => new Flatten.Matrix(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\nlet Interval = class Interval {\r\n constructor(low, high) {\r\n this.low = low;\r\n this.high = high;\r\n }\r\n\r\n get max() {\r\n return this.high;\r\n }\r\n\r\n interval(low, high) {\r\n return new Interval(low, high);\r\n }\r\n\r\n clone() {\r\n return new Interval(this.low, this.high);\r\n }\r\n\r\n less_than(other_interval) {\r\n return this.low < other_interval.low ||\r\n this.low == other_interval.low && this.high < other_interval.high;\r\n }\r\n\r\n equal_to(other_interval) {\r\n return this.low == other_interval.low && this.high == other_interval.high;\r\n }\r\n\r\n intersect(other_interval) {\r\n return !this.not_intersect(other_interval);\r\n }\r\n\r\n not_intersect(other_interval) {\r\n return (this.high < other_interval.low || other_interval.high < this.low);\r\n }\r\n\r\n output() {\r\n return [this.low, this.high];\r\n }\r\n\r\n maximal_val(val1, val2) {\r\n return Math.max(val1, val2);\r\n }\r\n\r\n val_less_than(val1, val2 ) { // trait to compare max property with item ?\r\n return val1 < val2;\r\n }\r\n};\r\n\r\nmodule.exports = Interval;\r\n","/**\r\n * Created by Alex Bol on 3/28/2017.\r\n */\r\n\r\n'use strict';\r\n\r\nmodule.exports = {\r\n RB_TREE_COLOR_RED: 0,\r\n RB_TREE_COLOR_BLACK: 1\r\n};","/**\r\n * Created by Alex Bol on 4/1/2017.\r\n */\r\n\r\n'use strict';\r\n\r\n// let defaultTraits = require('../utils/numeric_traits');\r\nlet Interval = require('../classes/interval');\r\nlet {RB_TREE_COLOR_RED, RB_TREE_COLOR_BLACK} = require('../utils/constants');\r\n\r\nlet Node = class Node {\r\n constructor(key = undefined, value = undefined,\r\n left = null, right = null, parent = null, color = RB_TREE_COLOR_BLACK) {\r\n this.left = left; // reference to left child node\r\n this.right = right; // reference to right child node\r\n this.parent = parent; // reference to parent node\r\n this.color = color;\r\n\r\n this.item = {key: key, value: value}; // key is supposed to be instance of Interval\r\n\r\n /* If not, this should by an array of two numbers */\r\n if (key && key instanceof Array && key.length == 2) {\r\n if (!Number.isNaN(key[0]) && !Number.isNaN(key[1])) {\r\n this.item.key = new Interval(Math.min(key[0], key[1]), Math.max(key[0], key[1]));\r\n }\r\n }\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n }\r\n\r\n isNil() {\r\n return (this.item.key === undefined && this.item.value === undefined &&\r\n this.left === null && this.right === null && this.color === RB_TREE_COLOR_BLACK);\r\n }\r\n\r\n less_than(other_node) {\r\n return this.item.key.less_than(other_node.item.key);\r\n }\r\n\r\n equal_to(other_node) {\r\n let value_equal = true;\r\n if (this.item.value && other_node.item.value) {\r\n value_equal = this.item.value.equal_to ? this.item.value.equal_to(other_node.item.value) :\r\n this.item.value == other_node.item.value;\r\n }\r\n return this.item.key.equal_to(other_node.item.key) && value_equal;\r\n }\r\n\r\n intersect(other_node) {\r\n return this.item.key.intersect(other_node.item.key);\r\n }\r\n\r\n copy_data(other_node) {\r\n this.item.key = other_node.item.key.clone();\r\n this.item.value = other_node.item.value;\r\n }\r\n\r\n update_max() {\r\n // use key (Interval) max property instead of key.high\r\n this.max = this.item.key ? this.item.key.max : undefined;\r\n if (this.right && this.right.max) {\r\n let maximal_val = this.item.key.maximal_val;\r\n this.max = maximal_val(this.max, this.right.max);\r\n }\r\n if (this.left && this.left.max) {\r\n let maximal_val = this.item.key.maximal_val;\r\n this.max = maximal_val(this.max, this.left.max);\r\n }\r\n }\r\n\r\n // Other_node does not intersect any node of left subtree, if this.left.max < other_node.item.key.low\r\n not_intersect_left_subtree(search_node) {\r\n let val_less_than = this.item.key.val_less_than;\r\n let high = this.left.max.high ? this.left.max.high : this.left.max;\r\n return val_less_than(high, search_node.item.key.low);\r\n }\r\n\r\n // Other_node does not intersect right subtree if other_node.item.key.high < this.right.key.low\r\n not_intersect_right_subtree(search_node) {\r\n let val_less_than = this.item.key.val_less_than;\r\n let low = this.right.max.low ? this.right.max.low : this.right.item.key.low;\r\n return val_less_than(search_node.item.key.high, low);\r\n }\r\n};\r\n\r\nmodule.exports = Node;\r\n\r\n","/**\r\n * Created by Alex Bol on 3/31/2017.\r\n */\r\n'use strict';\r\n\r\nlet Node = require('./classes/node');\r\nlet {RB_TREE_COLOR_RED, RB_TREE_COLOR_BLACK} = require('./utils/constants');\r\n\r\nlet nil_node = new Node();\r\n\r\n/**\r\n * Implementation of interval binary search tree <br/>\r\n * Interval tree may store items which are couples of {key:interval, value: value} <br/>\r\n * Interval is an object with high and low properties or simply array of numeric [low,high] values <br />\r\n * If interval is an object, it should implement and expose methods less_than, equals_to, intersect and others,\r\n * see documentation {link}\r\n * @type {IntervalTree}\r\n */\r\nlet IntervalTree = class IntervalTree {\r\n /**\r\n * Construct new empty instance of IntervalTree\r\n */\r\n constructor() {\r\n this.root = null;\r\n }\r\n\r\n /**\r\n * Returns number of items stored in the interval tree\r\n * @returns {number}\r\n */\r\n get size() {\r\n let count = 0;\r\n this.tree_walk(this.root, () => count++);\r\n return count;\r\n }\r\n\r\n /**\r\n * Returns array of sorted keys in the ascending order\r\n * @returns {Array}\r\n */\r\n get keys() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(node.item.key.output()));\r\n return res;\r\n }\r\n\r\n /**\r\n * Return array of values in the ascending keys order\r\n * @returns {Array}\r\n */\r\n get values() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push(node.item.value));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns array of items (<key,value> pairs) in the ascended keys order\r\n * @returns {Array}\r\n */\r\n get items() {\r\n let res = [];\r\n this.tree_walk(this.root, (node) => res.push({key: node.item.key.output(), value: node.item.value}));\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns true if tree is empty\r\n * @returns {boolean}\r\n */\r\n get isEmpty() {\r\n return (this.root == null || this.root == nil_node);\r\n }\r\n\r\n /**\r\n * Insert new item into interval tree\r\n * @param key - interval object or array of two numbers [low, high]\r\n * @param value - value representing any object (optional)\r\n * @returns {Node} - returns reference to inserted node as an object {key:interval, value: value}\r\n */\r\n insert(key, value = key) {\r\n if (key === undefined) return;\r\n let insert_node = new Node(key, value, nil_node, nil_node, null, RB_TREE_COLOR_RED);\r\n this.tree_insert(insert_node);\r\n this.recalc_max(insert_node);\r\n return insert_node;\r\n }\r\n\r\n /**\r\n * Returns true if item {key,value} exist in the tree\r\n * @param key - interval correspondent to keys stored in the tree\r\n * @param value - value object to be checked\r\n * @returns {boolean} - true if item {key, value} exist in the tree, false otherwise\r\n */\r\n exist(key, value) {\r\n let search_node = new Node(key, value);\r\n return this.tree_search(this.root, search_node) ? true : false;\r\n }\r\n\r\n /**\r\n * Remove entry {key, value} from the tree\r\n * @param key - interval correspondent to keys stored in the tree\r\n * @param value - - value object\r\n * @returns {boolean} - true if item {key, value} deleted, false if not found\r\n */\r\n remove(key, value) {\r\n let search_node = new Node(key, value);\r\n let delete_node = this.tree_search(this.root, search_node);\r\n if (delete_node) {\r\n this.tree_delete(delete_node);\r\n }\r\n return delete_node;\r\n }\r\n\r\n /**\r\n * Returns array of entry values which keys intersect with given interval <br/>\r\n * If no values stored in the tree, returns array of keys which intersect given interval\r\n * @param interval - search interval, or array [low, high]\r\n * @returns {Array}\r\n */\r\n search(interval) {\r\n let search_node = new Node(interval);\r\n let resp_nodes = [];\r\n this.tree_search_interval(this.root, search_node, resp_nodes);\r\n let resp = [];\r\n resp_nodes.forEach((node) => {\r\n if (node.item.value) { // if there are values, return only values\r\n resp.push(node.item.value);\r\n }\r\n else { // otherwise, return keys\r\n resp.push(node.item.key.output());\r\n }\r\n }, []);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Tree visitor. For each node implement a callback function. <br/>\r\n * Method calls a callback function with two parameters (key, value)\r\n * @param visitor(key,value) - function to be called for each tree item\r\n */\r\n forEach(visitor) {\r\n this.tree_walk(this.root, (node) => visitor(node.item.key, node.item.value));\r\n }\r\n \r\n /** Value Mapper. Walk through every node and map node value to another value\r\n * @param callback(value, key) - function to be called for each tree item\r\n */\r\n map(callback) {\r\n const tree = new IntervalTree();\r\n this.tree_walk(this.root, (node) => tree.insert(node.item.key, callback(node.item.value, node.item.key)));\r\n return tree;\r\n }\r\n\r\n recalc_max(node) {\r\n let node_current = node;\r\n while (node_current.parent != null) {\r\n node_current.parent.update_max();\r\n node_current = node_current.parent;\r\n }\r\n }\r\n\r\n tree_insert(insert_node) {\r\n let current_node = this.root;\r\n let parent_node = null;\r\n\r\n if (this.root == null || this.root == nil_node) {\r\n this.root = insert_node;\r\n }\r\n else {\r\n while (current_node != nil_node) {\r\n parent_node = current_node;\r\n if (insert_node.less_than(current_node)) {\r\n current_node = current_node.left;\r\n }\r\n else {\r\n current_node = current_node.right;\r\n }\r\n }\r\n\r\n insert_node.parent = parent_node;\r\n\r\n if (insert_node.less_than(parent_node)) {\r\n parent_node.left = insert_node;\r\n }\r\n else {\r\n parent_node.right = insert_node;\r\n }\r\n }\r\n\r\n this.insert_fixup(insert_node);\r\n }\r\n\r\n// After insertion insert_node may have red-colored parent, and this is a single possible violation\r\n// Go upwords to the root and re-color until violation will be resolved\r\n insert_fixup(insert_node) {\r\n let current_node;\r\n let uncle_node;\r\n\r\n current_node = insert_node;\r\n while (current_node != this.root && current_node.parent.color == RB_TREE_COLOR_RED) {\r\n if (current_node.parent == current_node.parent.parent.left) { // parent is left child of grandfather\r\n uncle_node = current_node.parent.parent.right; // right brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 1. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else { // Case 2 & 3. Uncle is black\r\n if (current_node == current_node.parent.right) { // Case 2. Current if right child\r\n // This case is transformed into Case 3.\r\n current_node = current_node.parent;\r\n this.rotate_left(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 3. Current is left child.\r\n // Re-color father and grandfather, rotate grandfather right\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_right(current_node.parent.parent);\r\n }\r\n }\r\n else { // parent is right child of grandfather\r\n uncle_node = current_node.parent.parent.left; // left brother of parent\r\n if (uncle_node.color == RB_TREE_COLOR_RED) { // Case 4. Uncle is red\r\n // re-color father and uncle into black\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n uncle_node.color = RB_TREE_COLOR_BLACK;\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n current_node = current_node.parent.parent;\r\n }\r\n else {\r\n if (current_node == current_node.parent.left) { // Case 5. Current is left child\r\n // Transform into case 6\r\n current_node = current_node.parent;\r\n this.rotate_right(current_node);\r\n }\r\n current_node.parent.color = RB_TREE_COLOR_BLACK; // Case 6. Current is right child.\r\n // Re-color father and grandfather, rotate grandfather left\r\n current_node.parent.parent.color = RB_TREE_COLOR_RED;\r\n this.rotate_left(current_node.parent.parent);\r\n }\r\n }\r\n }\r\n\r\n this.root.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_delete(delete_node) {\r\n let cut_node; // node to be cut - either delete_node or successor_node (\"y\" from 14.4)\r\n let fix_node; // node to fix rb tree property (\"x\" from 14.4)\r\n\r\n if (delete_node.left == nil_node || delete_node.right == nil_node) { // delete_node has less then 2 children\r\n cut_node = delete_node;\r\n }\r\n else { // delete_node has 2 children\r\n cut_node = this.tree_successor(delete_node);\r\n }\r\n\r\n // fix_node if single child of cut_node\r\n if (cut_node.left != nil_node) {\r\n fix_node = cut_node.left;\r\n }\r\n else {\r\n fix_node = cut_node.right;\r\n }\r\n\r\n // remove cut_node from parent\r\n /*if (fix_node != nil_node) {*/\r\n fix_node.parent = cut_node.parent;\r\n /*}*/\r\n\r\n if (cut_node == this.root) {\r\n this.root = fix_node;\r\n }\r\n else {\r\n if (cut_node == cut_node.parent.left) {\r\n cut_node.parent.left = fix_node;\r\n }\r\n else {\r\n cut_node.parent.right = fix_node;\r\n }\r\n cut_node.parent.update_max(); // update max property of the parent\r\n }\r\n\r\n this.recalc_max(fix_node); // update max property upward from fix_node to root\r\n\r\n // COPY DATA !!!\r\n // Delete_node becomes cut_node, it means that we cannot hold reference\r\n // to node in outer structure and we will have to delete by key, additional search need\r\n if (cut_node != delete_node) {\r\n delete_node.copy_data(cut_node);\r\n delete_node.update_max(); // update max property of the cut node at the new place\r\n this.recalc_max(delete_node); // update max property upward from delete_node to root\r\n }\r\n\r\n if (/*fix_node != nil_node && */cut_node.color == RB_TREE_COLOR_BLACK) {\r\n this.delete_fixup(fix_node);\r\n }\r\n }\r\n\r\n delete_fixup(fix_node) {\r\n let current_node = fix_node;\r\n let brother_node;\r\n\r\n while (current_node != this.root && current_node.parent != null && current_node.color == RB_TREE_COLOR_BLACK) {\r\n if (current_node == current_node.parent.left) { // fix node is left child\r\n brother_node = current_node.parent.right;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_left(current_node.parent);\r\n brother_node = current_node.parent.right; // update brother\r\n }\r\n // Derive to cases 2..4: brother is black\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2: both nephews black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 3: left nephew red, right nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.left.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_right(brother_node);\r\n brother_node = current_node.parent.right; // update brother\r\n // Derive to case 4: left nephew black, right nephew red\r\n }\r\n // case 4: left nephew black, right nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.right.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_left(current_node.parent);\r\n current_node = this.root; // exit from loop\r\n }\r\n }\r\n else { // fix node is right child\r\n brother_node = current_node.parent.left;\r\n if (brother_node.color == RB_TREE_COLOR_RED) { // Case 1. Brother is red\r\n brother_node.color = RB_TREE_COLOR_BLACK; // re-color brother\r\n current_node.parent.color = RB_TREE_COLOR_RED; // re-color father\r\n this.rotate_right(current_node.parent);\r\n brother_node = current_node.parent.left; // update brother\r\n }\r\n // Go to cases 2..4\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK &&\r\n brother_node.right.color == RB_TREE_COLOR_BLACK) { // case 2\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n current_node = current_node.parent; // continue iteration\r\n }\r\n else {\r\n if (brother_node.left.color == RB_TREE_COLOR_BLACK) { // case 3: right nephew red, left nephew black\r\n brother_node.color = RB_TREE_COLOR_RED; // re-color brother\r\n brother_node.right.color = RB_TREE_COLOR_BLACK; // re-color nephew\r\n this.rotate_left(brother_node);\r\n brother_node = current_node.parent.left; // update brother\r\n // Derive to case 4: right nephew black, left nephew red\r\n }\r\n // case 4: right nephew black, left nephew red\r\n brother_node.color = current_node.parent.color;\r\n current_node.parent.color = RB_TREE_COLOR_BLACK;\r\n brother_node.left.color = RB_TREE_COLOR_BLACK;\r\n this.rotate_right(current_node.parent);\r\n current_node = this.root; // force exit from loop\r\n }\r\n }\r\n }\r\n\r\n current_node.color = RB_TREE_COLOR_BLACK;\r\n }\r\n\r\n tree_search(node, search_node) {\r\n if (node == null || node == nil_node)\r\n return undefined;\r\n\r\n if (search_node.equal_to(node)) {\r\n return node;\r\n }\r\n if (search_node.less_than(node)) {\r\n return this.tree_search(node.left, search_node);\r\n }\r\n else {\r\n return this.tree_search(node.right, search_node);\r\n }\r\n }\r\n\r\n // Original search_interval method; container res support push() insertion\r\n // Search all intervals intersecting given one\r\n tree_search_interval(node, search_node, res) {\r\n if (node != null && node != nil_node) {\r\n // if (node->left != nil_node && node->left->max >= low) {\r\n if (node.left != nil_node && !node.not_intersect_left_subtree(search_node)) {\r\n this.tree_search_interval(node.left, search_node, res);\r\n }\r\n // if (low <= node->high && node->low <= high) {\r\n if (node.intersect(search_node)) {\r\n res.push(node);\r\n }\r\n // if (node->right != nil_node && node->low <= high) {\r\n if (node.right != nil_node && !node.not_intersect_right_subtree(search_node)) {\r\n this.tree_search_interval(node.right, search_node, res);\r\n }\r\n }\r\n }\r\n\r\n local_minimum(node) {\r\n let node_min = node;\r\n while (node_min.left != null && node_min.left != nil_node) {\r\n node_min = node_min.left;\r\n }\r\n return node_min;\r\n }\r\n\r\n // not in use\r\n local_maximum(node) {\r\n let node_max = node;\r\n while (node_max.right != null && node_max.right != nil_node) {\r\n node_max = node_max.right;\r\n }\r\n return node_max;\r\n }\r\n\r\n tree_successor(node) {\r\n let node_successor;\r\n let current_node;\r\n let parent_node;\r\n\r\n if (node.right != nil_node) {\r\n node_successor = this.local_minimum(node.right);\r\n }\r\n else {\r\n current_node = node;\r\n parent_node = node.parent;\r\n while (parent_node != null && parent_node.right == current_node) {\r\n current_node = parent_node;\r\n parent_node = parent_node.parent;\r\n }\r\n node_successor = parent_node;\r\n }\r\n return node_successor;\r\n }\r\n\r\n // | right-rotate(T,y) |\r\n // y ---------------. x\r\n // / \\ / \\\r\n // x c left-rotate(T,x) a y\r\n // / \\ <--------------- / \\\r\n // a b b c\r\n\r\n rotate_left(x) {\r\n let y = x.right;\r\n\r\n x.right = y.left; // b goes to x.right\r\n\r\n if (y.left != nil_node) {\r\n y.left.parent = x; // x becomes parent of b\r\n }\r\n y.parent = x.parent; // move parent\r\n\r\n if (x == this.root) {\r\n this.root = y; // y becomes root\r\n }\r\n else { // y becomes child of x.parent\r\n if (x == x.parent.left) {\r\n x.parent.left = y;\r\n }\r\n else {\r\n x.parent.right = y;\r\n }\r\n }\r\n y.left = x; // x becomes left child of y\r\n x.parent = y; // and y becomes parent of x\r\n\r\n if (x != null && x != nil_node) {\r\n x.update_max();\r\n }\r\n\r\n y = x.parent;\r\n if (y != null && y != nil_node) {\r\n y.update_max();\r\n }\r\n }\r\n\r\n rotate_right(y) {\r\n let x = y.left;\r\n\r\n y.left = x.right; // b goes to y.left\r\n\r\n if (x.right != nil_node) {\r\n x.right.parent = y; // y becomes parent of b\r\n }\r\n x.parent = y.parent; // move parent\r\n\r\n if (y == this.root) { // x becomes root\r\n this.root = x;\r\n }\r\n else { // y becomes child of x.parent\r\n if (y == y.parent.left) {\r\n y.parent.left = x;\r\n }\r\n else {\r\n y.parent.right = x;\r\n }\r\n }\r\n x.right = y; // y becomes right child of x\r\n y.parent = x; // and x becomes parent of y\r\n\r\n if (y != null && y != nil_node) {\r\n y.update_max();\r\n }\r\n\r\n x = y.parent;\r\n if (x != null && x != nil_node) {\r\n x.update_max();\r\n }\r\n }\r\n\r\n tree_walk(node, action) {\r\n if (node != null && node != nil_node) {\r\n this.tree_walk(node.left, action);\r\n // arr.push(node.output());\r\n action(node);\r\n this.tree_walk(node.right, action);\r\n }\r\n }\r\n\r\n /* Return true if all red nodes have exactly two black child nodes */\r\n testRedBlackProperty() {\r\n let res = true;\r\n this.tree_walk(this.root, function (node) {\r\n if (node.color == RB_TREE_COLOR_RED) {\r\n if (!(node.left.color == RB_TREE_COLOR_BLACK && node.right.color == RB_TREE_COLOR_BLACK)) {\r\n res = false;\r\n }\r\n }\r\n });\r\n return res;\r\n }\r\n\r\n /* Throw error if not every path from root to bottom has same black height */\r\n testBlackHeightProperty(node) {\r\n let height = 0;\r\n let heightLeft = 0;\r\n let heightRight = 0;\r\n if (node.color == RB_TREE_COLOR_BLACK) {\r\n height++;\r\n }\r\n if (node.left != nil_node) {\r\n heightLeft = this.testBlackHeightProperty(node.left);\r\n }\r\n else {\r\n heightLeft = 1;\r\n }\r\n if (node.right != nil_node) {\r\n heightRight = this.testBlackHeightProperty(node.right);\r\n }\r\n else {\r\n heightRight = 1;\r\n }\r\n if (heightLeft != heightRight) {\r\n throw new Error('Red-black height property violated');\r\n }\r\n height += heightLeft;\r\n return height;\r\n };\r\n};\r\n\r\nmodule.exports = IntervalTree;\r\n","/**\r\n * Created by Alex Bol on 3/12/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\n// require(\"babel-polyfill\");\r\n\r\nlet IntervalTree = require('flatten-interval-tree');\r\n\r\nmodule.exports = function (Flatten) {\r\n /**\r\n * Class representing a planar set - a generic container with ability to keep and retrieve shapes and\r\n * perform spatial queries. Planar set is an extension of Set container, so it supports\r\n * Set properties and methods\r\n */\r\n Flatten.PlanarSet = class PlanarSet extends Set {\r\n /**\r\n * Create new empty instance of PlanarSet\r\n */\r\n constructor() {\r\n super();\r\n this.index = new IntervalTree();\r\n }\r\n\r\n /**\r\n * Add new shape to planar set and to its spatial index.<br/>\r\n * If shape already exist, it will not be added again.\r\n * This happens with no error, it is possible to use <i>size</i> property to check if\r\n * a shape was actually added.<br/>\r\n * Method returns planar set object updated and may be chained\r\n * @param {Shape} shape - shape to be added, should have valid <i>box</i> property\r\n * @returns {PlanarSet}\r\n */\r\n add(shape) {\r\n let size = this.size;\r\n super.add(shape);\r\n // size not changed - item not added, probably trying to add same item twice\r\n if (this.size > size) {\r\n let node = this.index.insert(shape.box, shape);\r\n }\r\n return this; // in accordance to Set.add interface\r\n }\r\n\r\n /**\r\n * Delete shape from planar set. Returns true if shape was actually deleted, false otherwise\r\n * @param {Shape} shape - shape to be deleted\r\n * @returns {boolean}\r\n */\r\n delete(shape) {\r\n let deleted = super.delete(shape);\r\n if (deleted) {\r\n this.index.remove(shape.box, shape);\r\n }\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Clear planar set\r\n */\r\n clear() {\r\n super.clear();\r\n this.index = new IntervalTree();\r\n }\r\n\r\n /**\r\n * 2d range search in planar set.<br/>\r\n * Returns array of all shapes in planar set which bounding box is intersected with query box\r\n * @param {Box} box - query box\r\n * @returns {Shapes[]}\r\n */\r\n search(box) {\r\n let resp = this.index.search(box);\r\n return resp;\r\n }\r\n\r\n /**\r\n * Point location test. Returns array of shapes which contains given point\r\n * @param {Point} point - query point\r\n * @returns {Array}\r\n */\r\n hit(point) {\r\n let box = new Flatten.Box(point.x - 1, point.y - 1, point.x + 1, point.y + 1);\r\n let resp = this.index.search(box);\r\n return resp.filter((shape) => point.on(shape));\r\n }\r\n\r\n /**\r\n * Returns svg string to draw all shapes in planar set\r\n * @returns {String}\r\n */\r\n svg() {\r\n let svgcontent = [...this].reduce((acc, shape) => acc + shape.svg(), \"\");\r\n return svgcontent;\r\n }\r\n }\r\n};\r\n\r\n","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n\r\n/**\r\n *\r\n * @param Flatten\r\n */\r\nmodule.exports = function(Flatten) {\r\n /**\r\n *\r\n * Class representing a point\r\n * @type {Point}\r\n */\r\n Flatten.Point = class Point {\r\n /**\r\n * Point may be constructed by two numbers, or by array of two numbers\r\n * @param {number} x - x-coordinate (float number)\r\n * @param {number} y - y-coordinate (float number)\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof(arr[0]) == \"number\" && typeof(arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"point\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n if (typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n this.x = args[0];\r\n this.y = args[1];\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n\r\n }\r\n\r\n /**\r\n * Returns bounding box of a point\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(this.x, this.y, this.x, this.y);\r\n }\r\n\r\n /**\r\n * Method clone returns new copied instance of point\r\n * @returns {Point}\r\n */\r\n clone() {\r\n return new Flatten.Point(this.x, this.y);\r\n }\r\n\r\n get vertices() {\r\n return [this.clone()];\r\n }\r\n\r\n /**\r\n * Returns true if points are equal up to [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n equalTo(pt) {\r\n return Flatten.Utils.EQ(this.x, pt.x) && Flatten.Utils.EQ(this.y, pt.y);\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between points. Returns true if the point is less than query points, false otherwise <br/>\r\n * By definition point1 < point2 if {point1.y < point2.y || point1.y == point2.y && point1.x < point2.y <br/>\r\n * Numeric values compared with [Flatten.Utils.DP_TOL]{@link DP_TOL} tolerance\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n lessThan(pt) {\r\n if (Flatten.Utils.LT(this.y, pt.y))\r\n return true;\r\n if (Flatten.Utils.EQ(this.y, pt.y) && Flatten.Utils.LT(this.x, pt.x))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns new point rotated by given angle around given center point.\r\n * If center point is omitted, rotates around zero point (0,0).\r\n * Positive value of angle defines rotation in counter clockwise direction,\r\n * negative angle defines rotation in clockwise clockwise direction\r\n * @param {number} angle - angle in radians\r\n * @param {Point} [center=(0,0)] center\r\n * @returns {Point}\r\n */\r\n rotate(angle, center = {x:0, y:0}) {\r\n var x_rot = center.x + (this.x - center.x) * Math.cos(angle) - (this.y - center.y) * Math.sin(angle);\r\n var y_rot = center.y + (this.x - center.x) * Math.sin(angle) + (this.y - center.y) * Math.cos(angle);\r\n\r\n return new Flatten.Point(x_rot, y_rot);\r\n }\r\n\r\n /**\r\n * Returns new point translated by given vector.\r\n * Translation vector may by also defined by a pair of numbers.\r\n * @param {Vector} vector - Translation vector defined as Flatten.Vector or\r\n * @param {number|number} - Translation vector defined as pair of numbers\r\n * @returns {Point}\r\n */\r\n translate(...args) {\r\n if (args.length == 1 && (args[0] instanceof Flatten.Vector)) {\r\n return new Flatten.Point(this.x + args[0].x, this.y + args[0].y);\r\n }\r\n\r\n if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n return new Flatten.Point(this.x + args[0], this.y + args[1]);\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new point transformed by affine transformation matrix m\r\n * @param {Matrix} m - affine transformation matrix (a,b,c,d,tx,ty)\r\n * @returns {Point}\r\n */\r\n transform(m) {\r\n // let [x,y] = m.transform([this.x,this.y]);\r\n return new Flatten.Point(m.transform([this.x,this.y]))\r\n }\r\n\r\n /**\r\n * Returns projection point on given line\r\n * @param {Line} line Line this point be projected on\r\n * @returns {Point}\r\n */\r\n projectionOn(line) {\r\n if (this.equalTo(line.pt)) // this point equal to line anchor point\r\n return this.clone();\r\n\r\n let vec = new Flatten.Vector(this, line.pt);\r\n if (Flatten.Utils.EQ_0(vec.cross(line.norm))) // vector to point from anchor point collinear to normal vector\r\n return line.pt.clone();\r\n\r\n let dist = vec.dot(line.norm); // signed distance\r\n let proj_vec = line.norm.multiply(dist);\r\n return this.translate(proj_vec);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the \"left\" semi-plane, which means, point belongs to the same semi plane where line normal vector points to\r\n * Return false if point belongs to the \"right\" semi-plane or to the line itself\r\n * @param {Line} line Query line\r\n * @returns {boolean}\r\n */\r\n leftTo(line) {\r\n let vec = new Flatten.Vector(line.pt, this);\r\n let onLeftSemiPlane = Flatten.Utils.GT(vec.dot(line.norm), 0);\r\n return onLeftSemiPlane;\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from point to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from point to shape\r\n * @returns {Segment} shortest segment between point and shape (started at point, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Point) {\r\n let dx = shape.x - this.x;\r\n let dy = shape.y - this.y;\r\n return [Math.sqrt(dx*dx + dy*dy), new Flatten.Segment(this, shape)];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Distance.point2line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Distance.point2circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Distance.point2segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n // let [dist, ...rest] = Distance.point2arc(this, shape);\r\n // return dist;\r\n return Distance.point2arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n // let [dist, ...rest] = Distance.point2polygon(this, shape);\r\n // return dist;\r\n return Distance.point2polygon(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n return Distance.shape2planarSet(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if point is on a shape, false otherwise\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon\r\n * @returns {boolean}\r\n */\r\n on(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.equalTo(shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return shape.contains(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return shape.contains(this);\r\n }\r\n }\r\n\r\n /**\r\n * Return string to draw point in svg as circle with radius \"r\" <br/>\r\n * Accept any valid attributes of svg elements as svg object\r\n * Defaults attribues are: <br/>\r\n * {\r\n * r:\"3\",\r\n * stroke:\"black\",\r\n * strokeWidth:\"1\",\r\n * fill:\"red\"\r\n * }\r\n * @param {Object} attrs - Any valid attributes of svg circle element, like \"r\", \"stroke\", \"strokeWidth\", \"fill\"\r\n * @returns {String}\r\n */\r\n svg(attrs = {}) {\r\n let {r, stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n return `\\n<circle cx=\"${this.x}\" cy=\"${this.y}\" r=\"${r || 3}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"red\"}\" ${id_str} ${class_str} />`;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"point\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create point equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.point = (...args) => new Flatten.Point(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/19/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a vector\r\n * @type {Vector}\r\n */\r\n Flatten.Vector = class Vector {\r\n /**\r\n * Vector may be constructed by two points, or by two float numbers,\r\n * or by array of two numbers\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * x-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.x = 0;\r\n /**\r\n * y-coordinate of a vector (float number)\r\n * @type {number}\r\n */\r\n this.y = 0;\r\n\r\n /* return zero vector */\r\n if (args.length === 0) {\r\n return;\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Array && args[0].length === 2) {\r\n let arr = args[0];\r\n if (typeof(arr[0]) == \"number\" && typeof(arr[1]) == \"number\") {\r\n this.x = arr[0];\r\n this.y = arr[1];\r\n return;\r\n }\r\n }\r\n\r\n if (args.length === 1 && args[0] instanceof Object && args[0].name === \"vector\") {\r\n let {x, y} = args[0];\r\n this.x = x;\r\n this.y = y;\r\n return;\r\n }\r\n\r\n if (args.length === 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (typeof(a1) == \"number\" && typeof(a2) == \"number\") {\r\n this.x = a1;\r\n this.y = a2;\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.x = a2.x - a1.x;\r\n this.y = a2.y - a1.y;\r\n return;\r\n }\r\n\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone returns new instance of Vector\r\n * @returns {Vector}\r\n */\r\n clone() {\r\n return new Vector(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Slope of the vector in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let angle = Math.atan2(this.y, this.x);\r\n if (angle<0) angle = 2*Math.PI + angle;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Length of vector\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.sqrt(this.dot(this));\r\n }\r\n\r\n /**\r\n * Returns true if vectors are equal up to [DP_TOL]{@link http://localhost:63342/flatten-js/docs/global.html#DP_TOL}\r\n * tolerance\r\n * @param {Vector} v\r\n * @returns {boolean}\r\n */\r\n equalTo(v) {\r\n return Flatten.Utils.EQ(this.x, v.x) && Flatten.Utils.EQ(this.y, v.y);\r\n }\r\n\r\n /**\r\n * Returns new vector multiplied by scalar\r\n * @param {number} scalar\r\n * @returns {Vector}\r\n */\r\n multiply(scalar) {\r\n return ( new Vector(scalar * this.x, scalar * this.y) );\r\n }\r\n\r\n /**\r\n * Returns scalar product (dot product) of two vectors <br/>\r\n * <code>dot_product = (this * v)</code>\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n dot(v) {\r\n return ( this.x * v.x + this.y * v.y );\r\n }\r\n\r\n /**\r\n * Returns vector product (cross product) of two vectors <br/>\r\n * <code>cross_product = (this x v)</code>\r\n * @param {Vector} v Other vector\r\n * @returns {number}\r\n */\r\n cross(v) {\r\n return ( this.x * v.y - this.y * v.x );\r\n }\r\n\r\n /**\r\n * Returns unit vector.<br/>\r\n * Throw error if given vector has zero length\r\n * @returns {Vector}\r\n */\r\n normalize() {\r\n if (!Flatten.Utils.EQ_0(this.length)) {\r\n return ( new Vector(this.x / this.length, this.y / this.length) );\r\n }\r\n throw Flatten.Errors.ZERO_DIVISION;\r\n }\r\n\r\n /**\r\n * Returns new vector rotated by given angle,\r\n * positive angle defines rotation in counter clockwise direction,\r\n * negative - in clockwise direction\r\n * @param {number} angle - Angle in radians\r\n * @returns {Vector}\r\n */\r\n rotate(angle) {\r\n let point = new Flatten.Point(this.x, this.y);\r\n let rpoint = point.rotate(angle);\r\n return new Flatten.Vector(rpoint.x, rpoint.y);\r\n }\r\n\r\n /**\r\n * Returns vector rotated 90 degrees counter clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CCW() {\r\n return new Flatten.Vector(-this.y, this.x);\r\n };\r\n\r\n /**\r\n * Returns vector rotated 90 degrees clockwise\r\n * @returns {Vector}\r\n */\r\n rotate90CW() {\r\n return new Flatten.Vector(this.y, -this.x);\r\n };\r\n\r\n /**\r\n * Return inverted vector\r\n * @returns {Vector}\r\n */\r\n invert() {\r\n return new Flatten.Vector(-this.x, -this.y);\r\n }\r\n\r\n /**\r\n * Return result of addition of other vector to this vector as a new vector\r\n * @param {Vector} v Other vector\r\n * @returns {Vector}\r\n */\r\n add(v) {\r\n return new Flatten.Vector(this.x + v.x, this.y + v.y);\r\n }\r\n\r\n /**\r\n * Return result of subtraction of other vector from current vector as a new vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n subtract(v) {\r\n return new Flatten.Vector(this.x - v.x, this.y - v.y);\r\n }\r\n\r\n /**\r\n * Return angle between this vector and other vector. <br/>\r\n * Angle is measured from 0 to 2*PI in the counter clockwise direction\r\n * from current vector to other.\r\n * @param {Vector} v Another vector\r\n * @returns {number}\r\n */\r\n angleTo(v) {\r\n let norm1 = this.normalize();\r\n let norm2 = v.normalize();\r\n let angle = Math.atan2(norm1.cross(norm2), norm1.dot(norm2));\r\n if (angle<0) angle += 2*Math.PI;\r\n return angle;\r\n }\r\n\r\n /**\r\n * Return vector projection of the current vector on another vector\r\n * @param {Vector} v Another vector\r\n * @returns {Vector}\r\n */\r\n projectionOn(v){\r\n let n = v.normalize();\r\n let d = this.dot(n);\r\n return n.multiply(d);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"vector\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create vector equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.vector = (...args) => new Flatten.Vector(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 2/20/2017.\r\n */\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a line\r\n * @type {Line}\r\n */\r\n Flatten.Line = class Line {\r\n /**\r\n * Line may be constructed by point and normal vector or by two points that a line passes through\r\n * @param {Point} pt - point that a line passes through\r\n * @param {Vector|Point} norm - normal vector to a line or second point a line passes through\r\n */\r\n constructor(...args) {\r\n /**\r\n * Point a line passes through\r\n * @type {Point}\r\n */\r\n this.pt = new Flatten.Point();\r\n /**\r\n * Normal vector to a line <br/>\r\n * Vector is normalized (length == 1)\r\n * @type {Vector}\r\n */\r\n this.norm = new Flatten.Vector(0,1);\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"line\") {\r\n let {pt, norm} = args[0];\r\n this.pt = new Flatten.Point(pt);\r\n this.norm = new Flatten.Vector(norm);\r\n return;\r\n }\r\n\r\n if (args.length == 2) {\r\n let a1 = args[0];\r\n let a2 = args[1];\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Point) {\r\n this.pt = a1;\r\n this.norm = Line.points2norm(a1, a2);\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Point && a2 instanceof Flatten.Vector) {\r\n if (Flatten.Utils.EQ_0(a2.x) && Flatten.Utils.EQ_0(a2.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a1.clone();\r\n this.norm = a2.clone();\r\n this.norm = this.norm.normalize();\r\n return;\r\n }\r\n\r\n if (a1 instanceof Flatten.Vector && a2 instanceof Flatten.Point) {\r\n if (Flatten.Utils.EQ_0(a1.x) && Flatten.Utils.EQ_0(a1.y)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n this.pt = a2.clone();\r\n this.norm = a1.clone();\r\n this.norm = this.norm.normalize();\r\n return;\r\n }\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Returns cloned new instance of a line\r\n * @returns {Line}\r\n */\r\n clone() {\r\n return new Flatten.Line(this.pt, this.norm);\r\n }\r\n\r\n /**\r\n * Slope of the line - angle in radians between line and axe x from 0 to 2PI\r\n * @returns {number} - slope of the line\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.norm.y, -this.norm.x);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Get coefficients [A,B,C] of a standard line equation in the form Ax + By = C\r\n * @code [A, B, C] = line.standard\r\n * @returns {number[]} - array of coefficients\r\n */\r\n get standard() {\r\n let A = this.norm.x;\r\n let B = this.norm.y;\r\n let C = this.norm.dot(this.pt);\r\n\r\n return [A,B,C];\r\n }\r\n\r\n /**\r\n * Return true if parallel or incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n parallelTo(other_line) {\r\n return Flatten.Utils.EQ_0(this.norm.cross(other_line.norm));\r\n }\r\n\r\n /**\r\n * Returns true if incident to other line\r\n * @param {Line} other_line - line to check\r\n * @returns {boolean}\r\n */\r\n incidentTo(other_line) {\r\n return this.parallelTo(other_line) && this.pt.on(other_line);\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to line\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n if (this.pt.equalTo(pt)) {\r\n return true;\r\n }\r\n /* Line contains point if vector to point is orthogonal to the line normal vector */\r\n let vec = new Flatten.Vector(this.pt, pt);\r\n return Flatten.Utils.EQ_0(this.norm.dot(vec));\r\n }\r\n\r\n /**\r\n * Returns array of intersection points\r\n * @param {Shape} shape - shape to intersect with\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Line.intersectLine2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Line.intersectLine2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return Line.intersectLine2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectLine2Polygon(this, shape);\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from line to shape and returns array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of the one of the types Point, Circle, Segment, Arc, Polygon\r\n * @returns {Number}\r\n * @returns {Segment}\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = Distance.point2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = Distance.circle2line(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = Distance.segment2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = Distance.arc2line(shape, this);\r\n return [distance, shortest_segment.reverse()];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Return string to draw svg segment representing line inside given box\r\n * @param {Box} box Box representing drawing area\r\n * @param {Object} attrs - an object with attributes of svg circle element\r\n */\r\n svg(box, attrs = {}) {\r\n let ip = Line.intersectLine2Box(this, box);\r\n if (ip.length === 0)\r\n return \"\";\r\n let ps = ip[0];\r\n let pe = ip.length == 2 ? ip[1] : ip.find( pt => !pt.equalTo(ps) );\r\n if (pe === undefined) pe = ps;\r\n let segment = new Flatten.Segment(ps, pe);\r\n return segment.svg(attrs);\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"line\"});\r\n }\r\n\r\n static points2norm(pt1, pt2) {\r\n if (pt1.equalTo(pt2)) {\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n let vec = new Flatten.Vector(pt1, pt2);\r\n let unit = vec.normalize();\r\n return unit.rotate90CCW();\r\n }\r\n\r\n static intersectLine2Line(line1, line2) {\r\n let ip = [];\r\n\r\n let [A1, B1, C1] = line1.standard;\r\n let [A2, B2, C2] = line2.standard;\r\n\r\n /* Cramer's rule */\r\n let det = A1*B2 - B1*A2;\r\n let detX = C1*B2 - B1*C2;\r\n let detY = A1*C2 - C1*A2;\r\n\r\n if (!Flatten.Utils.EQ_0(det)) {\r\n let new_ip = new Flatten.Point( detX/det, detY/det );\r\n ip.push(new_ip);\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectLine2Circle(line, circle) {\r\n let ip = [];\r\n let prj = circle.pc.projectionOn(line); // projection of circle center on line\r\n let dist = circle.pc.distanceTo(prj)[0]; // distance from circle center to projection\r\n\r\n if (Flatten.Utils.EQ(dist, circle.r)) { // line tangent to circle - return single intersection point\r\n ip.push(prj);\r\n }\r\n else if (Flatten.Utils.LT(dist, circle.r)) { // return two intersection points\r\n let delta = Math.sqrt(circle.r*circle.r - dist*dist);\r\n let v_trans, pt;\r\n\r\n v_trans = line.norm.rotate90CCW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n\r\n v_trans = line.norm.rotate90CW().multiply(delta);\r\n pt = prj.translate(v_trans);\r\n ip.push(pt);\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectLine2Box(line, box) {\r\n let pts = [\r\n new Flatten.Point(box.xmin, box.ymin),\r\n new Flatten.Point(box.xmax, box.ymin),\r\n new Flatten.Point(box.xmax, box.ymax),\r\n new Flatten.Point(box.xmin, box.ymax)\r\n ];\r\n let segs = [\r\n new Flatten.Segment(pts[0], pts[1]),\r\n new Flatten.Segment(pts[1], pts[2]),\r\n new Flatten.Segment(pts[2], pts[3]),\r\n new Flatten.Segment(pts[3], pts[0])\r\n ];\r\n\r\n let ips = [];\r\n\r\n for(let seg of segs) {\r\n let ips_tmp = seg.intersect(line);\r\n for (let ip of ips_tmp) {\r\n ips.push(ip);\r\n }\r\n };\r\n return ips;\r\n }\r\n\r\n static intersectLine2Arc(line, arc) {\r\n let ip = [];\r\n\r\n if (Line.intersectLine2Box(line, arc.box).length == 0) {\r\n return ip;\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = line.intersect(circle);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n };\r\n\r\n /**\r\n * Function to create line equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.line = (...args) => new Flatten.Line(...args);\r\n};\r\n","/**\r\n * Created by Alex Bol on 3/6/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Arc,vector} = Flatten;\r\n /**\r\n * Class representing a circle\r\n * @type {Circle}\r\n */\r\n Flatten.Circle = class Circle {\r\n /**\r\n *\r\n * @param {Point} pc - circle center point\r\n * @param {number} r - circle radius\r\n */\r\n constructor(...args) {\r\n /**\r\n * Circle center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Circle radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"circle\") {\r\n let {pc, r} = args[0];\r\n this.pc = new Flatten.Point(pc);\r\n this.r = r;\r\n return;\r\n }\r\n else {\r\n let [pc, r] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone returns new instance of a Circle\r\n * @returns {Circle}\r\n */\r\n clone() {\r\n return new Flatten.Circle(this.pc.clone(), this.r);\r\n }\r\n\r\n /**\r\n * Circle center\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc;\r\n }\r\n\r\n /**\r\n * Circle bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n this.pc.x - this.r,\r\n this.pc.y - this.r,\r\n this.pc.x + this.r,\r\n this.pc.y + this.r\r\n );\r\n }\r\n\r\n /**\r\n * Return true if circle contains point\r\n * @param {Point} pt - test point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n return Flatten.Utils.LE(pt.distanceTo(this.center)[0], this.r);\r\n }\r\n\r\n /**\r\n * Transform circle to closed arc\r\n * @param {boolean} counterclockwise\r\n * @returns {Arc}\r\n */\r\n toArc(counterclockwise=true) {\r\n return new Flatten.Arc(this.center, this.r, Math.PI, -Math.PI, counterclockwise);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between circle and other shape\r\n * @param {Shape} shape Shape of the one of supported types\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Circle.intersectCirle2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from circle to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from circle to shape\r\n * @returns {Segment} shortest segment between circle and shape (started at circle, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n let {point2circle, circle2circle, circle2line, segment2circle, arc2circle} = Distance;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [distance, shortest_segment] = point2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [distance, shortest_segment] = circle2circle(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [distance, shortest_segment] = circle2line(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [distance, shortest_segment] = segment2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [distance, shortest_segment] = arc2circle(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [distance, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [distance, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n static intersectCirle2Circle(circle1, circle2) {\r\n let ip = [];\r\n\r\n if (circle1.box.not_intersect(circle2.box)) {\r\n return ip;\r\n }\r\n\r\n let vec = new Flatten.Vector(circle1.pc, circle2.pc);\r\n\r\n let r1 = circle1.r;\r\n let r2 = circle2.r;\r\n\r\n // Degenerated circle\r\n if (Flatten.Utils.EQ_0(r1) || Flatten.Utils.EQ_0(r2))\r\n return ip;\r\n\r\n // In case of equal circles return one leftmost point\r\n if (Flatten.Utils.EQ_0(vec.x) && Flatten.Utils.EQ_0(vec.y) && Flatten.Utils.EQ(r1, r2)) {\r\n ip.push(circle1.pc.translate(-r1, 0));\r\n return ip;\r\n }\r\n\r\n let dist = circle1.pc.distanceTo(circle2.pc)[0];\r\n\r\n if (Flatten.Utils.GT(dist, r1 + r2)) // circles too far, no intersections\r\n return ip;\r\n\r\n if (Flatten.Utils.LT(dist, Math.abs(r1 - r2))) // one circle is contained within another, no intersections\r\n return ip;\r\n\r\n // Normalize vector.\r\n vec.x /= dist;\r\n vec.y /= dist;\r\n\r\n let pt;\r\n\r\n // Case of touching from outside or from inside - single intersection point\r\n // TODO: check this specifically not sure if correct\r\n if (Flatten.Utils.EQ(dist, r1 + r2) || Flatten.Utils.EQ(dist, Math.abs(r1 - r2))) {\r\n pt = circle1.pc.translate(r1*vec.x, r1*vec.y);\r\n ip.push(pt);\r\n return ip;\r\n }\r\n\r\n // Case of two intersection points\r\n\r\n // Distance from first center to center of common chord:\r\n // a = (r1^2 - r2^2 + d^2) / 2d\r\n // Separate for better accuracy\r\n let a = (r1*r1)/(2*dist) - (r2*r2)/(2*dist) + dist/2;\r\n\r\n let mid_pt = circle1.pc.translate(a*vec.x, a*vec.y);\r\n let h = Math.sqrt(r1*r1 - a*a);\r\n // let norm;\r\n\r\n // norm = vec.rotate90CCW().multiply(h);\r\n pt = mid_pt.translate(vec.rotate90CCW().multiply(h));\r\n ip.push(pt);\r\n\r\n // norm = vec.rotate90CW();\r\n pt = mid_pt.translate(vec.rotate90CW().multiply(h));\r\n ip.push(pt);\r\n\r\n return ip;\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg circle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillOpacity, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n<circle cx=\"${this.pc.x}\" cy=\"${this.pc.y}\" r=\"${this.r}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" fill-opacity=\"${fillOpacity || 1.0}\" ${id_str} ${class_str} />`;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"circle\"});\r\n }\r\n };\r\n\r\n /**\r\n * Shortcut to create new circle\r\n * @param args\r\n */\r\n Flatten.circle = (...args) => new Flatten.Circle(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function (Flatten) {\r\n /**\r\n * Class representing a segment\r\n * @type {Segment}\r\n */\r\n Flatten.Segment = class Segment {\r\n /**\r\n *\r\n * @param {Point} ps - start point\r\n * @param {Point} pe - end point\r\n */\r\n constructor(...args) {\r\n /**\r\n * Start point\r\n * @type {Point}\r\n */\r\n this.ps = new Flatten.Point();\r\n /**\r\n * End Point\r\n * @type {Point}\r\n */\r\n this.pe = new Flatten.Point();\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Array && args[0].length == 4) {\r\n let coords = args[0];\r\n this.ps = new Flatten.Point(coords[0], coords[1]);\r\n this.pe = new Flatten.Point(coords[2], coords[3]);\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"segment\") {\r\n let {ps,pe} = args[0];\r\n this.ps = new Flatten.Point(ps.x, ps.y);\r\n this.pe = new Flatten.Point(pe.x, pe.y);\r\n return;\r\n }\r\n\r\n if (args.length == 2 && args[0] instanceof Flatten.Point && args[1] instanceof Flatten.Point) {\r\n this.ps = args[0].clone();\r\n this.pe = args[1].clone();\r\n return;\r\n }\r\n\r\n if (args.length == 4) {\r\n this.ps = new Flatten.Point(args[0], args[1]);\r\n this.pe = new Flatten.Point(args[2], args[3]);\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Method clone copies segment and returns a new instance\r\n * @returns {Segment}\r\n */\r\n clone() {\r\n return new Flatten.Segment(this.start, this.end);\r\n }\r\n\r\n /**\r\n * Start point\r\n * @returns {Point}\r\n */\r\n get start() {\r\n return this.ps;\r\n }\r\n\r\n /**\r\n * End point\r\n * @returns {Point}\r\n */\r\n get end() {\r\n return this.pe;\r\n }\r\n\r\n\r\n /**\r\n * Returns array of start and end point\r\n * @returns [Point,Point]\r\n */\r\n get vertices() {\r\n return [this.ps.clone(), this.pe.clone()];\r\n }\r\n\r\n /**\r\n * Length of a segment\r\n * @returns {number}\r\n */\r\n get length() {\r\n return this.start.distanceTo(this.end)[0];\r\n }\r\n\r\n /**\r\n * Slope of the line - angle to axe x in radians from 0 to 2PI\r\n * @returns {number}\r\n */\r\n get slope() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.slope;\r\n }\r\n\r\n /**\r\n * Bounding box\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return new Flatten.Box(\r\n Math.min(this.start.x, this.end.x),\r\n Math.min(this.start.y, this.end.y),\r\n Math.max(this.start.x, this.end.x),\r\n Math.max(this.start.y, this.end.y)\r\n )\r\n }\r\n\r\n /**\r\n * Returns true if equals to query segment, false otherwise\r\n * @param {Seg} seg - query segment\r\n * @returns {boolean}\r\n */\r\n equalTo(seg) {\r\n return this.ps.equalTo(seg.ps) && this.pe.equalTo(seg.pe);\r\n }\r\n\r\n /**\r\n * Returns true if segment contains point\r\n * @param {Point} pt Query point\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n return Flatten.Utils.EQ_0(this.distanceToPoint(pt));\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between segment and other shape\r\n * @param {Shape} shape - Shape of the one of supported types <br/>\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Segment.intersectSegment2Line(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n return Segment.intersectSegment2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n return Segment.intersectSegment2Circle(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n return Segment.intersectSegment2Arc(this, shape);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from segment to shape and return as array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from segment to shape\r\n * @returns {Segment} shortest segment between segment and shape (started at segment, ended at shape)\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2segment(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Distance.segment2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Distance.segment2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Distance.segment2segment(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.segment2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Returns unit vector in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.start, this.end);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Return unit vector in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.end, this.start);\r\n return vec.normalize();\r\n }\r\n\r\n /**\r\n * Returns new segment with swapped start and end points\r\n * @returns {Segment}\r\n */\r\n reverse() {\r\n return new Segment(this.end, this.start);\r\n }\r\n\r\n /**\r\n * When point belongs to segment, return array of two segments split by given point,\r\n * if point is inside segment. Returns clone of this segment if query point is incident\r\n * to start or end point of the segment. Returns empty array if point does not belong to segment\r\n * @param {Point} pt Query point\r\n * @returns {Segment[]}\r\n */\r\n split(pt) {\r\n if (!this.contains(pt))\r\n return [];\r\n\r\n if (this.start.equalTo(this.end))\r\n return [this.clone()];\r\n\r\n if (this.start.equalTo(pt) || this.end.equalTo(pt))\r\n return [this];\r\n\r\n return [\r\n new Flatten.Segment(this.start, pt),\r\n new Flatten.Segment(pt, this.end)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the segment\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return new Flatten.Point((this.start.x + this.end.x)/2, (this.start.y + this.end.y)/2);\r\n }\r\n\r\n distanceToPoint(pt) {\r\n let [dist, ...rest] = Flatten.Distance.point2segment(pt, this);\r\n return dist;\r\n };\r\n\r\n definiteIntegral(ymin = 0.0) {\r\n let dx = this.end.x - this.start.x;\r\n let dy1 = this.start.y - ymin;\r\n let dy2 = this.end.y - ymin;\r\n return ( dx * (dy1 + dy2) / 2 );\r\n }\r\n\r\n /**\r\n * Returns new segment translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n return new Segment(this.ps.translate(...args), this.pe.translate(...args));\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Segment}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new segment transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Segment} - transformed segment\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n return new Segment(this.ps.transform(matrix), this.pe.transform(matrix))\r\n }\r\n\r\n /**\r\n * Returns true if segment start is equal to segment end up to DP_TOL\r\n * @returns {boolean}\r\n */\r\n isZeroLength() {\r\n return this.ps.equalTo(this.pe)\r\n }\r\n\r\n static intersectSegment2Line(seg, line) {\r\n let ip = [];\r\n\r\n // Boundary cases\r\n if (seg.ps.on(line)) {\r\n ip.push(seg.ps);\r\n }\r\n // If both ends lay on line, return two intersection points\r\n if (seg.pe.on(line) && !seg.isZeroLength()) {\r\n ip.push(seg.pe);\r\n }\r\n\r\n if (ip.length > 0) {\r\n return ip; // done, intersection found\r\n }\r\n\r\n // If zero-length segment and nothing found, return no intersections\r\n if (seg.isZeroLength()) {\r\n return ip;\r\n }\r\n\r\n // Not a boundary case, check if both points are on the same side and\r\n // hence there is no intersection\r\n if (seg.ps.leftTo(line) && seg.pe.leftTo(line) ||\r\n !seg.ps.leftTo(line) && !seg.pe.leftTo(line)) {\r\n return ip;\r\n }\r\n\r\n // Calculate intersection between lines\r\n let line1 = new Flatten.Line(seg.ps, seg.pe);\r\n return line1.intersect(line);\r\n }\r\n\r\n static intersectSegment2Segment(seg1, seg2) {\r\n let ip = [];\r\n\r\n // quick reject\r\n if (seg1.box.not_intersect(seg2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of seg1 zero length\r\n if (seg1.isZeroLength()) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Special case of seg2 zero length\r\n if (seg2.isZeroLength()) {\r\n if (seg2.ps.on(seg1)) {\r\n ip.push(seg2.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Neither seg1 nor seg2 is zero length\r\n let line1 = new Flatten.Line(seg1.ps, seg1.pe);\r\n let line2 = new Flatten.Line(seg2.ps, seg2.pe);\r\n\r\n // Check overlapping between segments in case of incidence\r\n // If segments touching, add one point. If overlapping, add two points\r\n if (line1.incidentTo(line2)) {\r\n if (seg1.ps.on(seg2)) {\r\n ip.push(seg1.ps);\r\n }\r\n if (seg1.pe.on(seg2)) {\r\n ip.push(seg1.pe);\r\n }\r\n if (seg2.ps.on(seg1) && !seg2.ps.equalTo(seg1.ps) && !seg2.ps.equalTo(seg1.pe)) {\r\n ip.push(seg2.ps);\r\n }\r\n if (seg2.pe.on(seg1) && !seg2.pe.equalTo(seg1.ps) && !seg2.pe.equalTo(seg1.pe)) {\r\n ip.push(seg2.pe);\r\n }\r\n }\r\n else { /* not incident - parallel or intersect */\r\n // Calculate intersection between lines\r\n let new_ip = line1.intersect(line2);\r\n if (new_ip.length > 0 && new_ip[0].on(seg1) && new_ip[0].on(seg2)) {\r\n ip.push(new_ip[0]);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectSegment2Circle(segment, circle) {\r\n let ips = [];\r\n\r\n if (segment.box.not_intersect(circle.box)) {\r\n return ips;\r\n }\r\n\r\n // Special case of zero length segment\r\n if (segment.isZeroLength()) {\r\n let [dist,shortest_segment] = segment.ps.distanceTo(circle.pc);\r\n if (Flatten.Utils.EQ(dist, circle.r)) {\r\n ips.push(segment.ps);\r\n }\r\n return ips;\r\n }\r\n\r\n // Non zero-length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n\r\n let ips_tmp = line.intersect(circle);\r\n\r\n for (let ip of ips_tmp) {\r\n if (ip.on(segment)) {\r\n ips.push(ip);\r\n }\r\n }\r\n\r\n return ips;\r\n }\r\n\r\n static intersectSegment2Arc(segment, arc) {\r\n let ip = [];\r\n\r\n if (segment.box.not_intersect(arc.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case of zero-length segment\r\n if (segment.isZeroLength()) {\r\n if (segment.ps.on(arc)) {\r\n ip.push(segment.ps);\r\n }\r\n return ip;\r\n }\r\n\r\n // Non-zero length segment\r\n let line = new Flatten.Line(segment.ps, segment.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n let ip_tmp = line.intersect(circle);\r\n\r\n for (let pt of ip_tmp) {\r\n if (pt.on(segment) && pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n\r\n }\r\n\r\n /**\r\n * Return string to draw segment in svg\r\n * @param {Object} attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n return `\\n<line x1=\"${this.start.x}\" y1=\"${this.start.y}\" x2=\"${this.end.x}\" y2=\"${this.end.y}\" stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" ${id_str} ${class_str} />`;\r\n\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"segment\"});\r\n }\r\n };\r\n\r\n /**\r\n * Shortcut method to create new segment\r\n */\r\n Flatten.segment = (...args) => new Flatten.Segment(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/10/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing a circular arc\r\n * @type {Arc}\r\n */\r\n Flatten.Arc = class Arc {\r\n /**\r\n *\r\n * @param {Point} pc - arc center\r\n * @param {number} r - arc radius\r\n * @param {number} startAngle - start angle in radians from 0 to 2*PI\r\n * @param {number} endAngle - end angle in radians from 0 to 2*PI\r\n * @param {boolean} counterClockwise - arc direction, true - clockwise, false - counter clockwise\r\n */\r\n constructor(...args) {\r\n /**\r\n * Arc center\r\n * @type {Point}\r\n */\r\n this.pc = new Flatten.Point();\r\n /**\r\n * Arc radius\r\n * @type {number}\r\n */\r\n this.r = 1;\r\n /**\r\n * Arc start angle in radians\r\n * @type {number}\r\n */\r\n this.startAngle = 0;\r\n /**\r\n * Arc end angle in radians\r\n * @type {number}\r\n */\r\n this.endAngle = 2*Math.PI;\r\n /**\r\n * Arc orientation\r\n * @type {boolean}\r\n */\r\n this.counterClockwise = Flatten.CCW;\r\n\r\n if (args.length == 0)\r\n return;\r\n\r\n if (args.length == 1 && args[0] instanceof Object && args[0].name === \"arc\") {\r\n let {pc, r, startAngle, endAngle, counterClockwise} = args[0];\r\n this.pc = new Flatten.Point(pc.x, pc.y);\r\n this.r = r;\r\n this.startAngle = startAngle;\r\n this.endAngle = endAngle;\r\n this.counterClockwise = counterClockwise;\r\n return;\r\n }\r\n else {\r\n let [pc, r, startAngle, endAngle, counterClockwise] = [...args];\r\n if (pc && pc instanceof Flatten.Point) this.pc = pc.clone();\r\n if (r !== undefined) this.r = r;\r\n if (startAngle !== undefined) this.startAngle = startAngle;\r\n if (endAngle!== undefined) this.endAngle = endAngle;\r\n if (counterClockwise !== undefined) this.counterClockwise = counterClockwise;\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Return new instance of arc\r\n * @returns {Arc}\r\n */\r\n clone() {\r\n return new Flatten.Arc(this.pc.clone(), this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Get sweep angle in radians. Sweep angle is non-negative number from 0 to 2*PI\r\n * @returns {number}\r\n */\r\n get sweep() {\r\n if (Flatten.Utils.EQ(this.startAngle, this.endAngle))\r\n return 0.0;\r\n if (Flatten.Utils.EQ(Math.abs(this.startAngle - this.endAngle), Flatten.PIx2)) {\r\n return Flatten.PIx2;\r\n }\r\n let sweep;\r\n if (this.counterClockwise) {\r\n sweep = Flatten.Utils.GT(this.endAngle, this.startAngle) ?\r\n this.endAngle - this.startAngle : this.endAngle - this.startAngle + Flatten.PIx2;\r\n } else {\r\n sweep = Flatten.Utils.GT(this.startAngle, this.endAngle) ?\r\n this.startAngle - this.endAngle : this.startAngle - this.endAngle + Flatten.PIx2;\r\n }\r\n\r\n if ( Flatten.Utils.GT(sweep, Flatten.PIx2) ) {\r\n sweep -= Flatten.PIx2;\r\n }\r\n if ( Flatten.Utils.LT(sweep, 0) ) {\r\n sweep += Flatten.PIx2;\r\n }\r\n return sweep;\r\n }\r\n\r\n /**\r\n * Get start point of arc\r\n * @returns {Point}\r\n */\r\n get start() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.startAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get end point of arc\r\n * @returns {Point}\r\n */\r\n get end() {\r\n let p0 = new Flatten.Point(this.pc.x + this.r, this.pc.y);\r\n return p0.rotate(this.endAngle, this.pc);\r\n }\r\n\r\n /**\r\n * Get center of arc\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return this.pc.clone();\r\n }\r\n\r\n get vertices() {\r\n return [this.start.clone(), this.end.clone()];\r\n }\r\n\r\n /**\r\n * Get arc length\r\n * @returns {number}\r\n */\r\n get length() {\r\n return Math.abs(this.sweep*this.r);\r\n }\r\n\r\n /**\r\n * Get bounding box of the arc\r\n * @returns {Box}\r\n */\r\n get box() {\r\n let func_arcs = this.breakToFunctional();\r\n let box = func_arcs.reduce( (acc, arc) => acc.merge(arc.start.box), new Flatten.Box() );\r\n box = box.merge(this.end.box);\r\n return box;\r\n }\r\n\r\n /**\r\n * Returns true if arc contains point, false otherwise\r\n * @param {Point} pt - point to test\r\n * @returns {boolean}\r\n */\r\n contains(pt) {\r\n // first check if point on circle (pc,r)\r\n if (!Flatten.Utils.EQ(this.pc.distanceTo(pt)[0], this.r))\r\n return false;\r\n\r\n // point on circle\r\n\r\n if (pt.equalTo(this.start))\r\n return true;\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n let test_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise);\r\n return Flatten.Utils.LE(test_arc.length, this.length);\r\n }\r\n\r\n /**\r\n * When given point belongs to arc, return array of two arcs split by this point. If points is incident\r\n * to start or end point of the arc, return clone of the arc. If point does not belong to the arcs, return\r\n * empty array.\r\n * @param {Point} pt Query point\r\n * @returns {Arc[]}\r\n */\r\n split(pt) {\r\n if (!this.contains(pt))\r\n return [];\r\n\r\n if (Flatten.Utils.EQ_0(this.sweep))\r\n return [this.clone()];\r\n\r\n if (this.start.equalTo(pt) || this.end.equalTo(pt))\r\n return [this.clone()];\r\n\r\n let angle = new Flatten.Vector(this.pc, pt).slope;\r\n\r\n return [\r\n new Flatten.Arc(this.pc, this.r, this.startAngle, angle, this.counterClockwise),\r\n new Flatten.Arc(this.pc, this.r, angle, this.endAngle, this.counterClockwise)\r\n ]\r\n }\r\n\r\n /**\r\n * Return middle point of the arc\r\n * @returns {Point}\r\n */\r\n middle() {\r\n let endAngle = this.counterClockwise ? this.startAngle + this.sweep/2 : this.startAngle - this.sweep/2;\r\n let arc = new Flatten.Arc(this.pc, this.r, this.startAngle, endAngle, this.counterClockwise);\r\n return arc.end;\r\n }\r\n\r\n /**\r\n * Returns chord height (\"sagitta\") of the arc\r\n * @returns {number}\r\n */\r\n chordHeight() {\r\n return (1.0 - Math.cos(Math.abs(this.sweep/2.0))) * this.r;\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between arc and other shape\r\n * @param {Shape} shape Shape of the one of supported types <br/>\r\n * @returns {Points[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n if (shape instanceof Flatten.Line) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Circle) {\r\n return Arc.intersectArc2Circle(this, shape);\r\n }\r\n if (shape instanceof Flatten.Segment) {\r\n return shape.intersect(this);\r\n }\r\n if (shape instanceof Flatten.Arc) {\r\n return Arc.intersectArc2Arc(this, shape);\r\n }\r\n if (shape instanceof Flatten.Polygon) {\r\n return Flatten.Polygon.intersectShape2Polygon(this, shape);\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment from arc to shape and return array [distance, shortest segment]\r\n * @param {Shape} shape Shape of the one of supported types Point, Line, Circle, Segment, Arc, Polygon or Planar Set\r\n * @returns {number} distance from arc to shape\r\n * @returns {Segment} shortest segment between arc and shape (started at arc, ended at shape)\r\n\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle) {\r\n let [dist, shortest_segment] = Distance.arc2circle(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n let [dist, shortest_segment] = Distance.arc2line(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Segment) {\r\n let [dist, shortest_segment] = Distance.segment2arc(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.arc2arc(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.PlanarSet) {\r\n let [dist, shortest_segment] = Distance.shape2planarSet(this, shape);\r\n return [dist, shortest_segment];\r\n }\r\n }\r\n\r\n /**\r\n * Breaks arc in extreme point 0, pi/2, pi, 3*pi/2 and returns array of sub-arcs\r\n * @returns {Arcs[]}\r\n */\r\n breakToFunctional() {\r\n let func_arcs_array = [];\r\n let angles = [0, Math.PI/2, 2*Math.PI/2, 3*Math.PI/2];\r\n let pts = [\r\n this.pc.translate(this.r,0),\r\n this.pc.translate(0,this.r),\r\n this.pc.translate(-this.r,0),\r\n this.pc.translate(0,-this.r)\r\n ];\r\n\r\n // If arc contains extreme point,\r\n // create test arc started at start point and ended at this extreme point\r\n let test_arcs = [];\r\n for (let i=0; i < 4; i++) {\r\n if (pts[i].on(this)) {\r\n test_arcs.push(new Flatten.Arc(this.pc, this.r, this.startAngle, angles[i], this.counterClockwise));\r\n }\r\n }\r\n\r\n if (test_arcs.length == 0) { // arc does contain any extreme point\r\n func_arcs_array.push(this.clone());\r\n }\r\n else { // arc passes extreme point\r\n // sort these arcs by length\r\n test_arcs.sort((arc1, arc2) => arc1.length - arc2.length);\r\n\r\n for (let i = 0; i < test_arcs.length; i++) {\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n }\r\n else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, test_arcs[i].endAngle, this.counterClockwise);\r\n }\r\n if (!Flatten.Utils.EQ_0(new_arc.length)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n\r\n // add last sub arc\r\n let prev_arc = func_arcs_array.length > 0 ? func_arcs_array[func_arcs_array.length - 1] : undefined;\r\n let new_arc;\r\n if (prev_arc) {\r\n new_arc = new Flatten.Arc(this.pc, this.r, prev_arc.endAngle, this.endAngle, this.counterClockwise);\r\n }\r\n else {\r\n new_arc = new Flatten.Arc(this.pc, this.r, this.startAngle, this.endAngle, this.counterClockwise);\r\n }\r\n if (!Flatten.Utils.EQ_0(new_arc.length)) {\r\n func_arcs_array.push(new_arc.clone());\r\n }\r\n }\r\n return func_arcs_array;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the start point in the direction from start to end\r\n * @returns {Vector}\r\n */\r\n tangentInStart() {\r\n let vec = new Flatten.Vector(this.pc, this.start);\r\n let angle = this.counterClockwise ? Math.PI/2. : -Math.PI/2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Return tangent unit vector in the end point in the direction from end to start\r\n * @returns {Vector}\r\n */\r\n tangentInEnd() {\r\n let vec = new Flatten.Vector(this.pc, this.end);\r\n let angle = this.counterClockwise ? -Math.PI/2. : Math.PI/2.;\r\n let tangent = vec.rotate(angle).normalize();\r\n return tangent;\r\n }\r\n\r\n /**\r\n * Returns new arc with swapped start and end angles and reversed direction\r\n * @returns {Arc}\r\n */\r\n reverse() {\r\n return new Arc(this.pc, this.r, this.endAngle, this.startAngle, !this.counterClockwise);\r\n }\r\n\r\n /**\r\n * Returns new arc translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Segment}\r\n */\r\n translate(...args) {\r\n let arc = this.clone();\r\n arc.pc = this.pc.translate(...args);\r\n return arc;\r\n }\r\n\r\n /**\r\n * Return new segment rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - center point, default is (0,0)\r\n * @returns {Arc}\r\n */\r\n rotate(angle = 0, center = new Flatten.Point()) {\r\n let m = new Flatten.Matrix();\r\n m = m.translate(center.x, center.y).rotate(angle).translate(-center.x, -center.y);\r\n return this.transform(m);\r\n }\r\n\r\n /**\r\n * Return new arc transformed using affine transformation matrix <br/>\r\n * Note, that non-equal scaling by x and y (matrix[0] != matrix[3]) produce illegal result\r\n * TODO: support non-equal scaling arc to ellipse or throw exception ?\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Arc}\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newStart = this.start.transform(matrix);\r\n let newEnd = this.end.transform(matrix);\r\n let newCenter = this.pc.transform(matrix);\r\n let arc = Arc.arcSE(newCenter, newStart, newEnd, this.counterClockwise);\r\n return arc;\r\n }\r\n\r\n static arcSE(center, start, end, counterClockwise) {\r\n let {vector} = Flatten;\r\n let startAngle = vector(center,start).slope;\r\n let endAngle = vector(center, end).slope;\r\n if (Flatten.Utils.EQ(startAngle, endAngle)) {\r\n endAngle += 2*Math.PI;\r\n counterClockwise = true;\r\n }\r\n let r = vector(center, start).length;\r\n\r\n return new Arc(center, r, startAngle, endAngle, counterClockwise);\r\n }\r\n\r\n static intersectArc2Arc(arc1, arc2) {\r\n var ip = [];\r\n\r\n if (arc1.box.not_intersect(arc2.box)) {\r\n return ip;\r\n }\r\n\r\n // Special case: overlapping arcs\r\n // May return up to 4 intersection points\r\n if (arc1.pc.equalTo(arc2.pc) && Flatten.Utils.EQ(arc1.r, arc2.r)) {\r\n let pt;\r\n\r\n pt = arc1.start;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc1.end;\r\n if (pt.on(arc2))\r\n ip.push(pt);\r\n\r\n pt = arc2.start;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n pt = arc2.end;\r\n if (pt.on(arc1)) ip.push(pt);\r\n\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = new Flatten.Circle(arc1.pc, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.pc, arc2.r);\r\n let ip_tmp = circle1.intersect(circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc1) && pt.on(arc2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n\r\n static intersectArc2Circle(arc, circle) {\r\n let ip = [];\r\n\r\n if (arc.box.not_intersect(circle.box)) {\r\n return ip;\r\n }\r\n\r\n // Case when arc center incident to circle center\r\n // Return arc's end points as 2 intersection points\r\n if (circle.pc.equalTo(arc.pc) && Flatten.Utils.EQ(circle.r, arc.r)) {\r\n ip.push(arc.start);\r\n ip.push(arc.end);\r\n return ip;\r\n }\r\n\r\n // Common case\r\n let circle1 = circle;\r\n let circle2 = new Flatten.Circle(arc.pc, arc.r);\r\n let ip_tmp = circle1.intersect(circle2);\r\n for (let pt of ip_tmp) {\r\n if (pt.on(arc)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n\r\n definiteIntegral(ymin=0) {\r\n let f_arcs = this.breakToFunctional();\r\n let area = f_arcs.reduce( (acc, arc) => acc + arc.circularSegmentDefiniteIntegral(ymin), 0.0 );\r\n return area;\r\n }\r\n\r\n circularSegmentDefiniteIntegral(ymin) {\r\n let line = new Flatten.Line(this.start, this.end);\r\n let onLeftSide = this.pc.leftTo(line);\r\n let segment = new Flatten.Segment(this.start, this.end);\r\n let areaTrapez = segment.definiteIntegral(ymin);\r\n let areaCircularSegment = this.circularSegmentArea();\r\n let area = onLeftSide ? areaTrapez - areaCircularSegment : areaTrapez + areaCircularSegment;\r\n return area;\r\n }\r\n\r\n circularSegmentArea() {\r\n return (0.5*this.r*this.r*(this.sweep - Math.sin(this.sweep)))\r\n }\r\n\r\n /**\r\n * Return string to draw arc in svg\r\n * @param {Object} attrs - an object with attributes of svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let largeArcFlag = this.sweep <= Math.PI ? \"0\" : \"1\";\r\n let sweepFlag = this.counterClockwise ? \"1\" : \"0\";\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n if (Flatten.Utils.EQ(this.sweep, 2*Math.PI)) {\r\n let circle = new Flatten.Circle(this.pc, this.r);\r\n return circle.svg(attrs);\r\n }\r\n else {\r\n return `\\n<path d=\"M${this.start.x},${this.start.y}\r\n A${this.r},${this.r} 0 ${largeArcFlag},${sweepFlag} ${this.end.x},${this.end.y}\"\r\n stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" ${id_str} ${class_str} />`\r\n }\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return Object.assign({},this,{name:\"arc\"});\r\n }\r\n };\r\n\r\n /**\r\n * Function to create arc equivalent to \"new\" constructor\r\n * @param args\r\n */\r\n Flatten.arc = (...args) => new Flatten.Arc(...args);\r\n};","/**\r\n * Created by Alex Bol on 3/7/2017.\r\n */\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class Box represent bounding box of the shape\r\n * @type {Box}\r\n */\r\n Flatten.Box = class Box {\r\n /**\r\n *\r\n * @param {number} xmin - minimal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n constructor(xmin=undefined, ymin=undefined, xmax=undefined, ymax=undefined) {\r\n /**\r\n * Minimal x coordinate\r\n * @type {number}\r\n */\r\n this.xmin = xmin;\r\n /**\r\n * Minimal y coordinate\r\n * @type {number}\r\n */\r\n this.ymin = ymin;\r\n /**\r\n * Maximal x coordinate\r\n * @type {number}\r\n */\r\n this.xmax = xmax;\r\n /**\r\n * Maximal y coordinate\r\n * @type {number}\r\n */\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Clones and returns new instance of box\r\n * @returns {Box}\r\n */\r\n clone() {\r\n return new Box(this.xmin, this.ymin, this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property low need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get low() {\r\n return new Flatten.Point(this.xmin, this.ymin);\r\n }\r\n\r\n /**\r\n * Property high need for interval tree interface\r\n * @returns {Point}\r\n */\r\n get high() {\r\n return new Flatten.Point(this.xmax, this.ymax);\r\n }\r\n\r\n /**\r\n * Property max returns the box itself !\r\n * @returns {Box}\r\n */\r\n get max() {\r\n return this.clone();\r\n }\r\n\r\n /**\r\n * Return center of the box\r\n * @returns {Point}\r\n */\r\n get center() {\r\n return new Flatten.Point( (this.xmin + this.xmax)/2, (this.ymin + this.ymax)/2 );\r\n }\r\n\r\n /**\r\n * Returns true if not intersected with other box\r\n * @param {Box} other_box - other box to test\r\n * @returns {boolean}\r\n */\r\n not_intersect(other_box) {\r\n return (\r\n this.xmax < other_box.xmin ||\r\n this.xmin > other_box.xmax ||\r\n this.ymax < other_box.ymin ||\r\n this.ymin > other_box.ymax\r\n );\r\n }\r\n\r\n /**\r\n * Returns true if intersected with other box\r\n * @param {Box} other_box - Query box\r\n * @returns {boolean}\r\n */\r\n intersect(other_box) {\r\n return !this.not_intersect(other_box);\r\n }\r\n\r\n /**\r\n * Returns new box merged with other box\r\n * @param {Box} other_box - Other box to merge with\r\n * @returns {Box}\r\n */\r\n merge(other_box) {\r\n return new Box(\r\n this.xmin === undefined ? other_box.xmin : Math.min(this.xmin, other_box.xmin),\r\n this.ymin === undefined ? other_box.ymin : Math.min(this.ymin, other_box.ymin),\r\n this.xmax === undefined ? other_box.xmax : Math.max(this.xmax, other_box.xmax),\r\n this.ymax === undefined ? other_box.ymax : Math.max(this.ymax, other_box.ymax)\r\n );\r\n }\r\n\r\n /**\r\n * Defines predicate \"less than\" between two boxes. Need for interval index\r\n * @param {Box} other_box - other box\r\n * @returns {boolean} - true if this box less than other box, false otherwise\r\n */\r\n less_than(other_box) {\r\n if (this.low.lessThan(other_box.low))\r\n return true;\r\n if (this.low.equalTo(other_box.low) && this.high.lessThan(other_box.high))\r\n return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns true if this box is equal to other box, false otherwise\r\n * @param {Box} other_box - query box\r\n * @returns {boolean}\r\n */\r\n equal_to(other_box) {\r\n return (this.low.equalTo(other_box.low) && this.high.equalTo(other_box.high));\r\n }\r\n\r\n output() {\r\n return this.clone();\r\n }\r\n\r\n maximal_val(box1, box2) {\r\n // return pt1.lessThan(pt2) ? pt2.clone() : pt1.clone();\r\n return box1.merge(box2);\r\n }\r\n\r\n val_less_than(pt1, pt2) {\r\n return pt1.lessThan(pt2);\r\n }\r\n\r\n /**\r\n * Set new values to the box object\r\n * @param {number} xmin - miminal x coordinate\r\n * @param {number} ymin - minimal y coordinate\r\n * @param {number} xmax - maximal x coordinate\r\n * @param {number} ymax - maximal y coordinate\r\n */\r\n set(xmin, ymin, xmax, ymax) {\r\n this.xmin = xmin;\r\n this.ymin = ymin;\r\n this.xmax = xmax;\r\n this.ymax = ymax;\r\n }\r\n\r\n /**\r\n * Return string to draw circle in svg\r\n * @param {Object} attrs - an object with attributes of svg rectangle element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\" <br/>\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"none\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, id, className} = attrs;\r\n // let rest_str = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n let width = this.xmax - this.xmin;\r\n let height = this.ymax - this.ymin;\r\n\r\n return `\\n<rect x=\"${this.xmin}\" y=\"${this.ymin}\" width=${width} height=${height} stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"none\"}\" ${id_str} ${class_str} />`;\r\n };\r\n };\r\n\r\n /**\r\n * Shortcut to create new circle\r\n * @param args\r\n * @returns {Box}\r\n */\r\n Flatten.box = (...args) => new Flatten.Box(...args);\r\n\r\n};\r\n","/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\nmodule.exports = function(Flatten) {\r\n /**\r\n * Class representing an edge of polygon. Edge shape may be Segment or Arc.\r\n * Each edge contains references to the next and previous edges in the face of the polygon.\r\n *\r\n * @type {Edge}\r\n */\r\n Flatten.Edge = class Edge {\r\n /**\r\n * Construct new instance of edge\r\n * @param {Shape} shape Shape of type Segment of Arc\r\n */\r\n constructor(shape) {\r\n /**\r\n * Shape of the edge: Segment or Arc\r\n */\r\n this.shape = shape;\r\n /**\r\n * Pointer to the next edge in the face\r\n */\r\n this.next;\r\n /**\r\n * Pointer to the previous edge in the face\r\n */\r\n this.prev;\r\n /**\r\n * Pointer to the face containing this edge\r\n * @type {Face}\r\n */\r\n this.face;\r\n /**\r\n * \"Arc distance\" from the face start\r\n * @type {number}\r\n */\r\n this.arc_length = 0;\r\n /**\r\n * Start inclusion flag (inside/outside/boundary)\r\n * @type {Boolean}\r\n */\r\n this.bvStart = undefined;\r\n /**\r\n * End inclusion flag (inside/outside/boundary)\r\n * @type {Boolean}\r\n */\r\n this.bvEnd = undefined;\r\n /**\r\n * Edge inclusion flag (Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY)\r\n * @type {*}\r\n */\r\n this.bv = undefined;\r\n /**\r\n * Overlap flag for boundary edge (Flatten.OVERLAP_SAME/Flatten.OVERLAP_OPPOSITE)\r\n * @type {*}\r\n */\r\n this.overlap = undefined;\r\n }\r\n\r\n /**\r\n * Get edge start point\r\n */\r\n get start() {\r\n return this.shape.start;\r\n }\r\n\r\n /**\r\n * Get edge end point\r\n */\r\n get end() {\r\n return this.shape.end;\r\n }\r\n\r\n /**\r\n * Get edge length\r\n */\r\n get length() {\r\n return this.shape.length;\r\n }\r\n\r\n /**\r\n * Get bounding box of the edge\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return this.shape.box;\r\n }\r\n\r\n isSegment() {\r\n return this.shape instanceof Flatten.Segment;\r\n }\r\n\r\n isArc() {\r\n return this.shape instanceof Flatten.Arc;\r\n }\r\n /**\r\n * Get middle point of the edge\r\n * @returns {Point}\r\n */\r\n middle() {\r\n return this.shape.middle();\r\n }\r\n\r\n /**\r\n * Returns true if point belongs to the edge, false otherwise\r\n * @param {Point} pt - test point\r\n */\r\n contains(pt) {\r\n return this.shape.contains(pt);\r\n }\r\n\r\n /**\r\n * Set inclusion flag of the edge with respect to another polygon\r\n * Inclusion flag is one of Flatten.INSIDE, Flatten.OUTSIDE, Flatten.BOUNDARY\r\n * @param polygon\r\n */\r\n setInclusion(polygon) {\r\n if (this.bv !== undefined) return this.bv;\r\n\r\n if (this.bvStart === undefined) {\r\n this.bvStart = Flatten.ray_shoot(polygon, this.start);\r\n }\r\n if (this.bvEnd === undefined) {\r\n this.bvEnd = Flatten.ray_shoot(polygon, this.end);\r\n }\r\n /* At least one end outside - the whole edge outside */\r\n if (this.bvStart === Flatten.OUTSIDE || this.bvEnd == Flatten.OUTSIDE) {\r\n this.bv = Flatten.OUTSIDE;\r\n }\r\n /* At least one end inside - the whole edge inside */\r\n else if (this.bvStart === Flatten.INSIDE || this.bvEnd == Flatten.INSIDE) {\r\n this.bv = Flatten.INSIDE;\r\n }\r\n /* Both are boundary - check the middle point */\r\n else {\r\n let bvMiddle = Flatten.ray_shoot(polygon, this.middle());\r\n this.bv = bvMiddle;\r\n }\r\n return this.bv;\r\n }\r\n\r\n /**\r\n * Set overlapping between two coincident boundary edges\r\n * Overlapping flag is one of Flatten.OVERLAP_SAME or Flatten.OVERLAP_OPPOSITE\r\n * @param edge\r\n */\r\n setOverlap(edge) {\r\n let flag = undefined;\r\n let shape1 = this.shape;\r\n let shape2 = edge.shape;\r\n\r\n if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end)) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start)) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n else if (shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Arc) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && /*shape1.counterClockwise === shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && /*shape1.counterClockwise !== shape2.counterClockwise &&*/\r\n shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n else if (shape1 instanceof Flatten.Segment && shape2 instanceof Flatten.Arc ||\r\n shape1 instanceof Flatten.Arc && shape2 instanceof Flatten.Segment) {\r\n if (shape1.start.equalTo(shape2.start) && shape1.end.equalTo(shape2.end) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_SAME;\r\n }\r\n else if (shape1.start.equalTo(shape2.end) && shape1.end.equalTo(shape2.start) && shape1.middle().equalTo(shape2.middle())) {\r\n flag = Flatten.OVERLAP_OPPOSITE;\r\n }\r\n }\r\n\r\n /* Do not update overlap flag if already set on previous chain */\r\n if (this.overlap === undefined) this.overlap = flag;\r\n if (edge.overlap === undefined) edge.overlap = flag;\r\n }\r\n\r\n svg() {\r\n if (this.shape instanceof Flatten.Segment) {\r\n return ` L${this.shape.end.x},${this.shape.end.y}`;\r\n }\r\n else if (this.shape instanceof Flatten.Arc) {\r\n let arc = this.shape;\r\n let largeArcFlag;\r\n let sweepFlag = arc.counterClockwise ? \"1\" : \"0\";\r\n\r\n // Draw full circe arc as special case: split it into two half-circles\r\n if (Flatten.Utils.EQ(arc.sweep, 2*Math.PI)) {\r\n let sign = arc.counterClockwise ? 1 : -1;\r\n let halfArc1 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle, arc.startAngle + sign*Math.PI, arc.counterClockwise);\r\n let halfArc2 = new Flatten.Arc(arc.pc, arc.r, arc.startAngle + sign*Math.PI, arc.endAngle, arc.counterClockwise);\r\n\r\n largeArcFlag = \"0\";\r\n\r\n return ` A${halfArc1.r},${halfArc1.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc1.end.x},${halfArc1.end.y}\r\n A${halfArc2.r},${halfArc2.r} 0 ${largeArcFlag},${sweepFlag} ${halfArc2.end.x},${halfArc2.end.y}`\r\n }\r\n else {\r\n largeArcFlag = arc.sweep <= Math.PI ? \"0\" : \"1\";\r\n\r\n return ` A${arc.r},${arc.r} 0 ${largeArcFlag},${sweepFlag} ${arc.end.x},${arc.end.y}`;\r\n }\r\n }\r\n }\r\n\r\n toJSON() {\r\n return this.shape.toJSON();\r\n }\r\n };\r\n};","/**\r\n * Created by Alex Bol on 3/17/2017.\r\n */\r\n\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function (Flatten) {\r\n let {Point, point, Segment, segment, Arc, Box, Edge, Circle} = Flatten;\r\n\r\n /**\r\n * Class representing a face (closed loop) in a [polygon]{@link Flatten.Polygon} object.\r\n * Face is a circular bidirectional linked list of [edges]{@link Flatten.Edge}.\r\n * Face object cannot be instantiated with a constructor.\r\n * Instead, use [polygon.addFace()]{@link Flatten.Polygon#addFace} method.\r\n * <br/>\r\n * Note, that face only set entry point to the linked list of edges but does not contain edges by itself.\r\n * Container of edges is a property of the polygon object. <br/>\r\n *\r\n * @example\r\n * // Face implements \"next\" iterator which enables to iterate edges in for loop:\r\n * for (let edge of face) {\r\n * console.log(edge.shape.length) // do something\r\n * }\r\n *\r\n * // Instead, it is possible to iterate edges as linked list, starting from face.first:\r\n * let edge = face.first;\r\n * do {\r\n * console.log(edge.shape.length); // do something\r\n * edge = edge.next;\r\n * } while (edge != face.first)\r\n */\r\n Flatten.Face = class Face {\r\n constructor(polygon, ...args) {\r\n /**\r\n * Reference to the first edge in face\r\n */\r\n this.first;\r\n /**\r\n * Reference to the last edge in face\r\n */\r\n this.last;\r\n\r\n this._box = undefined; // new Box();\r\n this._orientation = undefined;\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n /* If passed an array it supposed to be:\r\n 1) array of shapes that performs close loop or\r\n 2) array of points that performs set of vertices\r\n */\r\n if (args.length == 1) {\r\n if (args[0] instanceof Array) {\r\n // let argsArray = args[0];\r\n let shapes = args[0]; // argsArray[0];\r\n if (shapes.length == 0)\r\n return;\r\n\r\n if (shapes.every((shape) => {\r\n return shape instanceof Point\r\n })) {\r\n let segments = Face.points2segments(shapes);\r\n this.shapes2face(polygon.edges, segments);\r\n }\r\n else if (shapes.every((shape) => {\r\n return (shape instanceof Segment || shape instanceof Arc)\r\n })) {\r\n this.shapes2face(polygon.edges, shapes);\r\n }\r\n // this is from JSON.parse object\r\n else if (shapes.every((shape) => {\r\n return (shape.name === \"segment\" || shape.name === \"arc\")\r\n })) {\r\n let flattenShapes = [];\r\n for (let shape of shapes) {\r\n let flattenShape;\r\n if (shape.name === \"segment\") {\r\n flattenShape = new Segment(shape);\r\n }\r\n else {\r\n flattenShape = new Arc(shape);\r\n }\r\n flattenShapes.push(flattenShape);\r\n }\r\n this.shapes2face(polygon.edges, flattenShapes);\r\n }\r\n }\r\n /* Create new face and copy edges into polygon.edges set */\r\n else if (args[0] instanceof Face) {\r\n let face = args[0];\r\n this.first = face.first;\r\n this.last = face.last;\r\n for (let edge of face) {\r\n polygon.edges.add(edge);\r\n }\r\n }\r\n /* Instantiate face from circle circle in CCW orientation */\r\n else if (args[0] instanceof Circle) {\r\n this.shapes2face(polygon.edges, [args[0].toArc(Flatten.CCW)]);\r\n }\r\n /* Instantiate face from a box in CCW orientation */\r\n else if (args[0] instanceof Box) {\r\n let box = args[0];\r\n this.shapes2face(polygon.edges, [\r\n segment(point(box.xmin, box.ymin), point(box.xmax, box.ymin)),\r\n segment(point(box.xmax, box.ymin), point(box.xmax, box.ymax)),\r\n segment(point(box.xmax, box.ymax), point(box.xmin, box.ymax)),\r\n segment(point(box.xmin, box.ymax), point(box.xmin, box.ymin))\r\n ]);\r\n }\r\n }\r\n /* If passed two edges, consider them as start and end of the face loop */\r\n /* THIS METHOD WILL BE USED BY BOOLEAN OPERATIONS */\r\n /* Assume that edges already copied to polygon.edges set in the clip algorithm !!! */\r\n if (args.length == 2 && args[0] instanceof Edge && args[1] instanceof Edge) {\r\n this.first = args[0]; // first edge in face or undefined\r\n this.last = args[1]; // last edge in face or undefined\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n this.setArcLength();\r\n /*\r\n let edge = this.first;\r\n edge.arc_length = 0;\r\n edge = edge.next;\r\n while (edge !== this.first) {\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n edge = edge.next;\r\n }\r\n */\r\n\r\n // this.box = this.getBox();\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n }\r\n\r\n [Symbol.iterator]() {\r\n let edge = undefined;\r\n return {\r\n next: () => {\r\n let value = edge ? edge : this.first;\r\n let done = this.first ? (edge ? edge === this.first : false) : true;\r\n edge = value ? value.next : undefined;\r\n return {value: value, done: done};\r\n }\r\n };\r\n };\r\n\r\n /**\r\n * Return array of edges from first to last\r\n * @returns {Array}\r\n */\r\n get edges() {\r\n let face_edges = [];\r\n for (let edge of this) {\r\n face_edges.push(edge);\r\n }\r\n return face_edges;\r\n }\r\n\r\n /**\r\n * Return number of edges in the face\r\n * @returns {number}\r\n */\r\n get size() {\r\n let counter = 0;\r\n for (let edge of this) {\r\n counter++;\r\n }\r\n return counter;\r\n }\r\n\r\n /**\r\n * Return bounding box of the face\r\n * @returns {Box}\r\n */\r\n get box() {\r\n if (this._box === undefined) {\r\n let box = new Flatten.Box();\r\n for (let edge of this) {\r\n box = box.merge(edge.box);\r\n }\r\n this._box = box;\r\n }\r\n return this._box;\r\n }\r\n\r\n static points2segments(points) {\r\n let segments = [];\r\n for (let i = 0; i < points.length; i++) {\r\n segments.push(new Segment(points[i], points[(i + 1) % points.length]));\r\n }\r\n return segments;\r\n }\r\n\r\n shapes2face(edges, shapes) {\r\n for (let shape of shapes) {\r\n let edge = new Edge(shape);\r\n this.append(edges, edge);\r\n // this.box = this.box.merge(shape.box);\r\n // edges.add(edge);\r\n }\r\n // this.orientation = this.getOrientation(); // face direction cw or ccw\r\n }\r\n\r\n /**\r\n * Returns true if face is empty, false otherwise\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return (this.first === undefined && this.last === undefined)\r\n }\r\n\r\n /**\r\n * Append given edge after the last edge (and before the first edge). <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} edge - Edge to be appended to the linked list\r\n */\r\n append(edges, edge) {\r\n if (this.first === undefined) {\r\n edge.prev = edge;\r\n edge.next = edge;\r\n this.first = edge;\r\n this.last = edge;\r\n edge.arc_length = 0;\r\n }\r\n else {\r\n // append to end\r\n edge.prev = this.last;\r\n this.last.next = edge;\r\n\r\n // update edge to be last\r\n this.last = edge;\r\n\r\n // restore circular links\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n edge.face = this;\r\n\r\n edges.add(edge); // Add new edges into edges container\r\n }\r\n\r\n /**\r\n * Insert edge newEdge into the linked list after the edge edgeBefore <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} newEdge - Edge to be inserted into linked list\r\n * @param {Edge} edgeBefore - Edge to insert newEdge after it\r\n */\r\n insert(edges, newEdge, edgeBefore) {\r\n if (this.first === undefined) {\r\n newEdge.prev = newEdge;\r\n newEdge.next = newEdge;\r\n this.first = newEdge;\r\n this.last = newEdge;\r\n }\r\n else {\r\n /* set links to new edge */\r\n let edgeAfter = edgeBefore.next;\r\n edgeBefore.next = newEdge;\r\n edgeAfter.prev = newEdge;\r\n\r\n /* set links from new edge */\r\n newEdge.prev = edgeBefore;\r\n newEdge.next = edgeAfter;\r\n\r\n /* extend chain if new edge added after last edge */\r\n if (this.last === edgeBefore)\r\n this.first = newEdge;\r\n }\r\n newEdge.face = this;\r\n\r\n // set arc length\r\n if (newEdge.prev === this.last) {\r\n newEdge.arc_length = 0;\r\n }\r\n else {\r\n newEdge.arc_length = newEdge.prev.arc_length + newEdge.prev.length;\r\n }\r\n\r\n edges.add(newEdge); // Add new edges into edges container\r\n }\r\n\r\n /**\r\n * Remove the given edge from the linked list of the face <br/>\r\n * This method mutates current object and does not return any value\r\n * @param {PlanarSet} edges - Container of edges\r\n * @param {Edge} edge - Edge to be removed\r\n */\r\n remove(edges, edge) {\r\n // special case if last edge removed\r\n if (edge === this.first && edge === this.last) {\r\n this.first = undefined;\r\n this.last = undefined;\r\n }\r\n else {\r\n // update linked list\r\n edge.prev.next = edge.next;\r\n edge.next.prev = edge.prev;\r\n // update first if need\r\n if (edge === this.first) {\r\n this.first = edge.next;\r\n }\r\n // update last if need\r\n if (edge === this.last) {\r\n this.last = edge.prev;\r\n }\r\n }\r\n edges.delete(edge); // delete from PlanarSet of edges and update index\r\n }\r\n\r\n /**\r\n * Reverse orientation of the face: first edge become last and vice a verse,\r\n * all edges starts and ends swapped, direction of arcs inverted.\r\n */\r\n reverse() {\r\n // collect edges in revert order with reverted shapes\r\n let edges = [];\r\n let edge_tmp = this.last;\r\n do {\r\n // reverse shape\r\n edge_tmp.shape = edge_tmp.shape.reverse();\r\n edges.push(edge_tmp);\r\n edge_tmp = edge_tmp.prev;\r\n } while (edge_tmp !== this.last);\r\n\r\n // restore linked list\r\n this.first = undefined;\r\n this.last = undefined;\r\n for (let edge of edges) {\r\n if (this.first === undefined) {\r\n edge.prev = edge;\r\n edge.next = edge;\r\n this.first = edge;\r\n this.last = edge;\r\n edge.arc_length = 0;\r\n }\r\n else {\r\n // append to end\r\n edge.prev = this.last;\r\n this.last.next = edge;\r\n\r\n // update edge to be last\r\n this.last = edge;\r\n\r\n // restore circular links\r\n this.last.next = this.first;\r\n this.first.prev = this.last;\r\n\r\n // set arc length\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n }\r\n\r\n // Recalculate orientation, if set\r\n if (this._orientation !== undefined) {\r\n this._orientation = undefined;\r\n this._orientation = this.orientation();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Set arc_length property for each of the edges in the face.\r\n * Arc_length of the edge it the arc length from the first edge of the face\r\n */\r\n setArcLength() {\r\n for (let edge of this) {\r\n if (edge === this.first) {\r\n edge.arc_length = 0.0;\r\n }\r\n else {\r\n edge.arc_length = edge.prev.arc_length + edge.prev.length;\r\n }\r\n edge.face = this;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the absolute value of the area of the face\r\n * @returns {number}\r\n */\r\n area() {\r\n return Math.abs(this.signedArea());\r\n }\r\n\r\n /**\r\n * Returns signed area of the simple face.\r\n * Face is simple if it has no self intersections that change its orientation.\r\n * Then the area will be positive if the orientation of the face is clockwise,\r\n * and negative if orientation is counterclockwise.\r\n * It may be zero if polygon is degenerated.\r\n * @returns {number}\r\n */\r\n signedArea() {\r\n let sArea = 0;\r\n let ymin = this.box.ymin;\r\n for (let edge of this) {\r\n sArea += edge.shape.definiteIntegral(ymin);\r\n }\r\n return sArea;\r\n }\r\n\r\n /**\r\n * Return face orientation: one of Flatten.ORIENTATION.CCW, Flatten.ORIENTATION.CW, Flatten.ORIENTATION.NOT_ORIENTABLE <br/>\r\n * According to Green theorem the area of a closed curve may be calculated as double integral,\r\n * and the sign of the integral will be defined by the direction of the curve.\r\n * When the integral (\"signed area\") will be negative, direction is counter clockwise,\r\n * when positive - clockwise and when it is zero, polygon is not orientable.\r\n * See {@link https://mathinsight.org/greens_theorem_find_area}\r\n * @returns {number}\r\n */\r\n orientation() {\r\n if (this._orientation === undefined) {\r\n let area = this.signedArea();\r\n if (Flatten.Utils.EQ_0(area)) {\r\n this._orientation = Flatten.ORIENTATION.NOT_ORIENTABLE;\r\n }\r\n else if (Flatten.Utils.LT(area, 0)) {\r\n this._orientation = Flatten.ORIENTATION.CCW;\r\n }\r\n else {\r\n this._orientation = Flatten.ORIENTATION.CW;\r\n }\r\n }\r\n return this._orientation;\r\n }\r\n\r\n /**\r\n * Returns true if face of the polygon is simple (no self-intersection points found)\r\n * NOTE: this method is incomplete because it doe not exclude touching points\r\n * Real self intersection inverts orientation of the polygon.\r\n * But this is also good enough for the demonstration of the idea\r\n * @param {Edges} edges - reference to polygon.edges to provide search index\r\n * @returns {boolean}\r\n */\r\n isSimple(edges) {\r\n let ip = Face.getSelfIntersections(this, edges, true);\r\n return ip.length == 0;\r\n }\r\n\r\n static getSelfIntersections(face, edges, exitOnFirst = false) {\r\n let int_points = [];\r\n\r\n // calculate intersections\r\n for (let edge1 of face) {\r\n\r\n // request edges of polygon in the box of edge1\r\n let resp = edges.search(edge1.box);\r\n\r\n // for each edge2 in response\r\n for (let edge2 of resp) {\r\n\r\n // Skip itself\r\n if (edge1 === edge2)\r\n continue;\r\n\r\n // Skip next and previous edge if both are segment (if one of them arc - calc intersection)\r\n if (edge1.shape instanceof Flatten.Segment && edge2.shape instanceof Flatten.Segment &&\r\n (edge1.next === edge2 || edge1.prev === edge2))\r\n continue;\r\n\r\n // calculate intersections between edge1 and edge2\r\n let ip = edge1.shape.intersect(edge2.shape);\r\n\r\n // for each intersection point\r\n for (let pt of ip) {\r\n\r\n // skip start-end connections\r\n if (pt.equalTo(edge1.start) && pt.equalTo(edge2.end) && edge2 === edge1.prev)\r\n continue;\r\n if (pt.equalTo(edge1.end) && pt.equalTo(edge2.start) && edge2 === edge1.next)\r\n continue;\r\n\r\n int_points.push(pt);\r\n\r\n if (exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n }\r\n\r\n if (int_points.length > 0 && exitOnFirst)\r\n break;\r\n\r\n }\r\n return int_points;\r\n }\r\n\r\n toJSON() {\r\n return this.edges.map(edge => edge.toJSON());\r\n }\r\n\r\n /**\r\n * Returns string to be assigned to \"d\" attribute inside defined \"path\"\r\n * @returns {string}\r\n */\r\n svg() {\r\n let svgStr = `\\nM${this.first.start.x},${this.first.start.y}`;\r\n for (let edge of this) {\r\n svgStr += edge.svg();\r\n }\r\n svgStr += ` z`;\r\n return svgStr;\r\n }\r\n\r\n };\r\n};","\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Point, Segment, Line, Circle, Arc, Box, Vector} = Flatten;\r\n /**\r\n * Class representing a horizontal ray, used by ray shooting algorithm\r\n * @type {Ray}\r\n */\r\n Flatten.Ray = class Ray {\r\n /**\r\n * Construct ray by setting start point\r\n * @param {Point} pt - start point\r\n */\r\n constructor(...args) {\r\n this.pt = new Point();\r\n\r\n if (args.length == 0) {\r\n return;\r\n }\r\n\r\n if (args.length == 1 && args[0] instanceof Point) {\r\n this.pt = args[0].clone();\r\n return;\r\n }\r\n\r\n if (args.length == 2 && typeof(args[0]) == \"number\" && typeof(args[1]) == \"number\") {\r\n this.pt = new Point(args[0], args[1]);\r\n return;\r\n }\r\n\r\n throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n }\r\n\r\n /**\r\n * Returns copied instance of the ray object\r\n * @returns {Ray}\r\n */\r\n clone() {\r\n return new Ray(this.pt);\r\n }\r\n\r\n /**\r\n * Returns half-infinite bounding box of the ray\r\n * @returns {Box} - bounding box\r\n */\r\n get box() {\r\n return new Box(\r\n this.pt.x,\r\n this.pt.y,\r\n Number.POSITIVE_INFINITY,\r\n this.pt.y\r\n )\r\n }\r\n\r\n /**\r\n * Return ray start point\r\n * @returns {Point} - ray start point\r\n */\r\n get start() {\r\n return this.pt;\r\n }\r\n\r\n /**\r\n * Return ray normal vector (0,1) - horizontal ray\r\n * @returns {Vector} - ray normal vector\r\n */\r\n get norm() {\r\n return new Vector(0,1);\r\n }\r\n\r\n /**\r\n * Returns array of intersection points between ray and segment or arc\r\n * @param {Segment|Arc} - Shape to intersect with ray\r\n * @returns {Array} array of intersection points\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Segment) {\r\n return this.intersectRay2Segment(this, shape);\r\n }\r\n\r\n if (shape instanceof Arc) {\r\n return this.intersectRay2Arc(this, shape);\r\n }\r\n }\r\n\r\n intersectRay2Segment(ray, segment) {\r\n let ip = [];\r\n\r\n if (ray.box.not_intersect(segment.box)) {\r\n return ip;\r\n }\r\n\r\n let line = new Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(segment);\r\n\r\n for (let pt of ip_tmp) {\r\n if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n /* If there were two intersection points between line and ray,\r\n and now there is exactly one left, it means ray starts between these points\r\n and there is another intersection point - start of the ray */\r\n if (ip_tmp.length == 2 && ip.length == 1 && ray.start.on(line)) {\r\n ip.push(ray.start);\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n intersectRay2Arc(ray, arc) {\r\n let ip = [];\r\n\r\n if (ray.box.not_intersect(arc.box)) {\r\n return ip;\r\n }\r\n\r\n let line = new Line(ray.start, ray.norm);\r\n let ip_tmp = line.intersect(arc);\r\n\r\n for (let pt of ip_tmp) {\r\n if (Flatten.Utils.GE(pt.x, ray.start.x)) {\r\n ip.push(pt);\r\n }\r\n }\r\n return ip;\r\n }\r\n };\r\n\r\n Flatten.ray = (...args) => new Flatten.Ray(...args);\r\n};","\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Polygon, Point, Segment, Arc, Line, Ray} = Flatten;\r\n\r\n Flatten.ray_shoot = function(polygon, point) {\r\n let contains = undefined;\r\n\r\n // if (!(polygon instanceof Polygon && point instanceof Point)) {\r\n // throw Flatten.Errors.ILLEGAL_PARAMETERS;\r\n // }\r\n\r\n // 1. Quick reject\r\n if (polygon.box.not_intersect(point.box)) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n let ray = new Ray(point);\r\n let line = new Line(ray.pt, ray.norm);\r\n\r\n // 2. Locate relevant edges of the polygon\r\n let resp_edges = polygon.edges.search(ray.box);\r\n\r\n if (resp_edges.length == 0) {\r\n return Flatten.OUTSIDE;\r\n }\r\n\r\n // 3. Calculate intersections\r\n let intersections = [];\r\n for (let edge of resp_edges) {\r\n for (let ip of ray.intersect(edge.shape)) {\r\n\r\n // If intersection is equal to query point then point lays on boundary\r\n if (ip.equalTo(point)) {\r\n return Flatten.BOUNDARY;\r\n }\r\n\r\n intersections.push({\r\n pt: ip,\r\n edge: edge\r\n });\r\n }\r\n }\r\n\r\n // 4. Sort intersection in x-ascending order\r\n intersections.sort( (i1, i2) => {\r\n if (Flatten.Utils.LT(i1.pt.x, i2.pt.x)) {\r\n return -1;\r\n }\r\n if (Flatten.Utils.GT(i1.pt.x, i2.pt.x)) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n\r\n // 5. Count real intersections, exclude touching\r\n let counter = 0;\r\n\r\n for (let i=0; i < intersections.length; i++) {\r\n let intersection = intersections[i];\r\n if (intersection.pt.equalTo(intersection.edge.shape.start)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i-1].pt) &&\r\n intersection.edge.prev === intersections[i-1].edge) {\r\n continue;\r\n }\r\n let prev_edge = intersection.edge.prev;\r\n while (Flatten.Utils.EQ_0(prev_edge.length)) {\r\n prev_edge = prev_edge.prev;\r\n }\r\n let prev_tangent = prev_edge.shape.tangentInEnd();\r\n let prev_point = intersection.pt.translate(prev_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInStart();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let prev_on_the_left = prev_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ( (prev_on_the_left && !cur_on_the_left) || (!prev_on_the_left && cur_on_the_left) ) {\r\n counter++;\r\n }\r\n }\r\n else if (intersection.pt.equalTo(intersection.edge.shape.end)) {\r\n /* skip same point between same edges if already counted */\r\n if (i > 0 && intersection.pt.equalTo(intersections[i-1].pt) &&\r\n intersection.edge.next === intersections[i-1].edge) {\r\n continue;\r\n }\r\n let next_edge = intersection.edge.next;\r\n while (Flatten.Utils.EQ_0(next_edge.length)) {\r\n next_edge = next_edge.next;\r\n }\r\n let next_tangent = next_edge.shape.tangentInStart();\r\n let next_point = intersection.pt.translate(next_tangent);\r\n\r\n let cur_tangent = intersection.edge.shape.tangentInEnd();\r\n let cur_point = intersection.pt.translate(cur_tangent);\r\n\r\n let next_on_the_left = next_point.leftTo(line);\r\n let cur_on_the_left = cur_point.leftTo(line);\r\n\r\n if ( (next_on_the_left && !cur_on_the_left) || (!next_on_the_left && cur_on_the_left) ) {\r\n counter++;\r\n }\r\n }\r\n else { /* intersection point is not a coincident with a vertex */\r\n if (intersection.edge.shape instanceof Segment) {\r\n counter++;\r\n }\r\n else {\r\n /* Check if ray does not touch the curve in the extremal (top or bottom) point */\r\n let box = intersection.edge.shape.box;\r\n if ( !(Flatten.Utils.EQ(intersection.pt.y, box.ymin) ||\r\n Flatten.Utils.EQ(intersection.pt.y, box.ymax)) ) {\r\n counter++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 6. Odd or even?\r\n contains = counter % 2 == 1 ? Flatten.INSIDE : Flatten.OUTSIDE;\r\n\r\n return contains;\r\n };\r\n};","/**\r\n * Created by Alex Bol on 3/15/2017.\r\n */\r\n\r\n\"use strict\";\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Edge, Face, PlanarSet, Box} = Flatten;\r\n let {ray_shoot} = Flatten;\r\n /**\r\n * Class representing a polygon.<br/>\r\n * Polygon in FlattenJS is a multipolygon comprised from a set of [faces]{@link Flatten.Face}. <br/>\r\n * Face, in turn, is a closed loop of [edges]{@link Flatten.Edge}, where edge may be segment or circular arc<br/>\r\n * @type {Polygon}\r\n */\r\n Flatten.Polygon = class Polygon {\r\n /**\r\n * Constructor creates new instance of polygon.<br/>\r\n * New polygon is empty. Add face to the polygon using method <br/>\r\n * <code>\r\n * polygon.addFace(Points[]|Segments[]|Arcs[])\r\n * </code>\r\n */\r\n constructor() {\r\n /**\r\n * Container of faces (closed loops), may be empty\r\n * @type {PlanarSet}\r\n */\r\n this.faces = new PlanarSet();\r\n /**\r\n * Container of edges\r\n * @type {PlanarSet}\r\n */\r\n this.edges = new PlanarSet();\r\n }\r\n\r\n /**\r\n * (Getter) Returns bounding box of the polygon\r\n * @returns {Box}\r\n */\r\n get box() {\r\n return [...this.faces].reduce( (acc, face) => acc.merge(face.box), new Box() );\r\n }\r\n\r\n /**\r\n * (Getter) Returns array of vertices\r\n * @returns {Array}\r\n */\r\n get vertices() {\r\n return [...this.edges].map( edge => edge.start);\r\n }\r\n\r\n /**\r\n * Return true is polygon has no edges\r\n * @returns {boolean}\r\n */\r\n isEmpty() {\r\n return this.edges.size === 0;\r\n }\r\n\r\n /**\r\n * Add new face to polygon. Returns added face\r\n * @param {Points[]|Segments[]|Arcs[]|Circle|Box} args - new face may be create with one of the following ways: <br/>\r\n * 1) array of points that describe closed path (edges are segments) <br/>\r\n * 2) array of shapes (segments and arcs) which describe closed path <br/>\r\n * 3) circle - will be added as counterclockwise arc <br/>\r\n * 4) box - will be added as counterclockwise rectangle <br/>\r\n * You can chain method face.reverse() is you need to change direction of the creates face\r\n * @returns {Face}\r\n */\r\n addFace(...args) {\r\n let face = new Face(this, ...args);\r\n this.faces.add(face);\r\n return face;\r\n }\r\n\r\n /**\r\n * Delete existing face from polygon\r\n * @param {Face} face Face to be deleted\r\n * @returns {boolean}\r\n */\r\n deleteFace(face) {\r\n for (let edge of face) {\r\n let deleted = this.edges.delete(edge);\r\n }\r\n let deleted = this.faces.delete(face);\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Delete chain of edges from the face.\r\n * @param {Face} face Face to remove chain\r\n * @param {Edge} edgeFrom Start of the chain of edges to be removed\r\n * @param {Edge} edgeTo End of the chain of edges to be removed\r\n */\r\n removeChain(face, edgeFrom, edgeTo) {\r\n // Special case: all edges removed\r\n if (edgeTo.next === edgeFrom) {\r\n this.deleteFace(face);\r\n return;\r\n }\r\n for (let edge = edgeFrom; edge !== edgeTo.next; edge = edge.next ) {\r\n face.remove(this.edges, edge);\r\n // this.edges.delete(edge); // delete from PlanarSet of edges and update index\r\n if (face.isEmpty()) {\r\n this.deleteFace(face); // delete from PlanarSet of faces and update index\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add point as a new vertex and split edge. Point supposed to belong to an edge.\r\n * When edge is split, new edge created from the start of the edge to the new vertex\r\n * and inserted before current edge.\r\n * Current edge is trimmed and updated. Method returns new edge added.\r\n * @param {Edge} edge Edge to be split with new vertex and then trimmed from start\r\n * @param {Point} pt Point to be added as a new vertex\r\n * @returns {Edge}\r\n */\r\n addVertex(pt, edge) {\r\n let shapes = edge.shape.split(pt);\r\n if (shapes.length < 2) return;\r\n let newEdge = new Flatten.Edge(shapes[0]);\r\n let edgeBefore = edge.prev;\r\n\r\n /* Insert first split edge into linked list after edgeBefore */\r\n edge.face.insert(this.edges, newEdge, edgeBefore);\r\n\r\n // Remove old edge from edges container and 2d index\r\n this.edges.delete(edge);\r\n\r\n // Update edge shape with second split edge keeping links\r\n edge.shape = shapes[1];\r\n\r\n // Add updated edge to the edges container and 2d index\r\n this.edges.add(edge);\r\n\r\n return newEdge;\r\n }\r\n\r\n reverse() {\r\n for (let face of this.faces) {\r\n face.reverse();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Create new copied instance of the polygon\r\n * @returns {Polygon}\r\n */\r\n clone() {\r\n let polygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.clone());\r\n }\r\n polygon.addFace(shapes);\r\n }\r\n return polygon;\r\n }\r\n\r\n /**\r\n * Returns area of the polygon. Area of an island will be added, area of a hole will be subtracted\r\n * @returns {number}\r\n */\r\n area() {\r\n let signedArea = [...this.faces].reduce((acc,face) => acc + face.signedArea(), 0);\r\n return Math.abs(signedArea);\r\n }\r\n\r\n /**\r\n * Returns true if polygon contains point, including polygon boundary, false otherwise\r\n * Point in polygon test based on ray shooting algorithm\r\n * @param {Point} point - test point\r\n * @returns {boolean}\r\n */\r\n contains(point) {\r\n let rel = ray_shoot(this, point);\r\n return (rel == Flatten.INSIDE || rel == Flatten.BOUNDARY) ? true : false;\r\n }\r\n\r\n /**\r\n * Return distance and shortest segment between polygon and other shape as array [distance, shortest_segment]\r\n * @param {Shape} shape Shape of one of the types Point, Circle, Line, Segment, Arc or Polygon\r\n * @returns {Number | Segment}\r\n */\r\n distanceTo(shape) {\r\n let {Distance} = Flatten;\r\n\r\n if (shape instanceof Flatten.Point) {\r\n let [dist, shortest_segment] = Distance.point2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n if (shape instanceof Flatten.Circle ||\r\n shape instanceof Flatten.Line ||\r\n shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc) {\r\n let [dist, shortest_segment] = Distance.shape2polygon(shape, this);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /* this method is bit faster */\r\n if (shape instanceof Flatten.Polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n let dist, shortest_segment;\r\n\r\n for (let edge of this.edges) {\r\n // let [dist, shortest_segment] = Distance.shape2polygon(edge.shape, shape);\r\n let min_stop = min_dist_and_segment[0];\r\n [dist, shortest_segment] = Distance.shape2planarSet(edge.shape, shape.edges, min_stop);\r\n if (Flatten.Utils.LT(dist, min_stop)) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n }\r\n\r\n /**\r\n * Return array of intersection points between polygon and other shape\r\n * @param shape Shape of the one of supported types <br/>\r\n * @returns {Point[]}\r\n */\r\n intersect(shape) {\r\n if (shape instanceof Flatten.Point) {\r\n return this.contains(shape) ? [shape] : [];\r\n }\r\n\r\n if (shape instanceof Flatten.Line) {\r\n return Polygon.intersectLine2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Circle ||\r\n shape instanceof Flatten.Segment ||\r\n shape instanceof Flatten.Arc) {\r\n return Polygon.intersectShape2Polygon(shape, this);\r\n }\r\n\r\n if (shape instanceof Flatten.Polygon) {\r\n return Polygon.intersectPolygon2Polygon(shape, this);\r\n }\r\n }\r\n\r\n /**\r\n * Return true if polygon is valid for boolean operations\r\n * Polygon is valid if <br/>\r\n * 1. All faces are simple polygons (there are no self-intersected polygons) <br/>\r\n * 2. All faces are orientable and there is no island inside island or hole inside hole - TODO <br/>\r\n * 3. There is no intersections between faces (excluding touching) - TODO <br/>\r\n * @returns {boolean}\r\n */\r\n isValid() {\r\n let valid = true;\r\n // 1. Polygon is invalid if at least one face is not simple\r\n for (let face of this.faces) {\r\n if (!face.isSimple(this.edges)) {\r\n valid = false;\r\n break;\r\n }\r\n }\r\n // 2. TODO: check if no island inside island and no hole inside hole\r\n // 3. TODO: check the there is no intersection between faces\r\n return valid;\r\n }\r\n\r\n /**\r\n * Returns new polygon translated by vector vec\r\n * @param {Vector} vec\r\n * @returns {Polygon}\r\n */\r\n translate(vec) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.translate(vec));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon rotated by given angle around given point\r\n * If point omitted, rotate around origin (0,0)\r\n * Positive value of angle defines rotation counter clockwise, negative - clockwise\r\n * @param {number} angle - rotation angle in radians\r\n * @param {Point} center - rotation center, default is (0,0)\r\n * @returns {Polygon} - new rotated polygon\r\n */\r\n rotate(angle=0, center=new Flatten.Point()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.rotate(angle, center));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n /**\r\n * Return new polygon transformed using affine transformation matrix\r\n * @param {Matrix} matrix - affine transformation matrix\r\n * @returns {Polygon} - new polygon\r\n */\r\n transform(matrix = new Flatten.Matrix()) {\r\n let newPolygon = new Polygon();\r\n for (let face of this.faces) {\r\n let shapes = [];\r\n for (let edge of face) {\r\n shapes.push(edge.shape.transform(matrix));\r\n }\r\n newPolygon.addFace(shapes);\r\n }\r\n return newPolygon;\r\n }\r\n\r\n static intersectShape2Polygon(shape, polygon) {\r\n let ip = [];\r\n\r\n if ( polygon.isEmpty() || shape.box.not_intersect(polygon.box) ) {\r\n return ip;\r\n }\r\n\r\n let resp_edges = polygon.edges.search(shape.box);\r\n\r\n for (let edge of resp_edges) {\r\n for (let pt of shape.intersect(edge.shape)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectLine2Polygon(line, polygon) {\r\n let ip = [];\r\n\r\n if ( polygon.isEmpty() ) {\r\n return ip;\r\n }\r\n\r\n for (let edge of polygon.edges) {\r\n for (let pt of line.intersect(edge.shape)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n static intersectPolygon2Polygon(polygon1, polygon2) {\r\n let ip = [];\r\n\r\n if (polygon1.isEmpty() || polygon2.isEmpty()) {\r\n return ip;\r\n }\r\n\r\n if (polygon1.box.not_intersect(polygon2.box)) {\r\n return ip;\r\n }\r\n\r\n for (let edge1 of polygon1.edges) {\r\n for (let pt of Polygon.intersectShape2Polygon(edge1.shape, polygon2)) {\r\n ip.push(pt);\r\n }\r\n }\r\n\r\n return ip;\r\n }\r\n\r\n /**\r\n * Return string to draw polygon in svg\r\n * @param attrs - an object with attributes for svg path element,\r\n * like \"stroke\", \"strokeWidth\", \"fill\", \"fillRule\", \"fillOpacity\"\r\n * Defaults are stroke:\"black\", strokeWidth:\"1\", fill:\"lightcyan\", fillRule:\"evenodd\", fillOpacity: \"1\"\r\n * @returns {string}\r\n */\r\n svg(attrs = {}) {\r\n let {stroke, strokeWidth, fill, fillRule, fillOpacity, id, className} = attrs;\r\n // let restStr = Object.keys(rest).reduce( (acc, key) => acc += ` ${key}=\"${rest[key]}\"`, \"\");\r\n let id_str = (id && id.length > 0) ? `id=\"${id}\"` : \"\";\r\n let class_str = (className && className.length > 0) ? `class=\"${className}\"` : \"\";\r\n\r\n let svgStr = `\\n<path stroke=\"${stroke || \"black\"}\" stroke-width=\"${strokeWidth || 1}\" fill=\"${fill || \"lightcyan\"}\" fill-rule=\"${fillRule || \"evenodd\"}\" fill-opacity=\"${fillOpacity || 1.0}\" ${id_str} ${class_str} d=\"`;\r\n for (let face of this.faces) {\r\n svgStr += face.svg();\r\n }\r\n svgStr += `\" >\\n</path>`;\r\n return svgStr;\r\n }\r\n\r\n /**\r\n * This method returns an object that defines how data will be\r\n * serialized when called JSON.stringify() method\r\n * @returns {Object}\r\n */\r\n toJSON() {\r\n return [...this.faces].map(face => face.toJSON());\r\n }\r\n }\r\n};","\"use strict\";\r\n\r\nlet IntervalTree = require('flatten-interval-tree');\r\n\r\nmodule.exports = function(Flatten) {\r\n let {Polygon, Point, Segment, Arc, Circle, Line, Ray, Vector} = Flatten;\r\n\r\n let {vector} = Flatten;\r\n\r\n Flatten.Distance = class Distance {\r\n /**\r\n * Calculate distance and shortest segment between points\r\n * @param pt1\r\n * @param pt2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2point(pt1, pt2) {\r\n return pt1.distanceTo(pt2);\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and line\r\n * @param pt\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2line(pt, line) {\r\n let closest_point = pt.projectionOn(line);\r\n let vec = vector(pt, closest_point);\r\n return [vec.length, new Segment(pt, closest_point)];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and circle\r\n * @param pt\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2circle(pt, circle) {\r\n let [dist2center, shortest_dist] = pt.distanceTo(circle.center);\r\n if (Flatten.Utils.EQ_0(dist2center)) {\r\n return [circle.r, new Segment(pt, circle.toArc().start)];\r\n }\r\n else {\r\n let dist = Math.abs(dist2center - circle.r);\r\n let v = vector(circle.pc, pt).normalize().multiply(circle.r);\r\n let closest_point = circle.pc.translate(v);\r\n return [dist, new Segment(pt, closest_point)];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and segment\r\n * @param pt\r\n * @param segment\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2segment(pt, segment) {\r\n /* Degenerated case of zero-length segment */\r\n if (segment.start.equalTo(segment.end)) {\r\n return Distance.point2point(pt, segment.start);\r\n }\r\n\r\n let v_seg = new Flatten.Vector(segment.start, segment.end);\r\n let v_ps2pt = new Flatten.Vector(segment.start, pt);\r\n let v_pe2pt = new Flatten.Vector(segment.end, pt);\r\n let start_sp = v_seg.dot(v_ps2pt);\r\n /* dot product v_seg * v_ps2pt */\r\n let end_sp = -v_seg.dot(v_pe2pt);\r\n /* minus dot product v_seg * v_pe2pt */\r\n\r\n let dist;\r\n let closest_point;\r\n if (Flatten.Utils.GE(start_sp, 0) && Flatten.Utils.GE(end_sp, 0)) { /* point inside segment scope */\r\n let v_unit = segment.tangentInStart(); // new Flatten.Vector(v_seg.x / this.length, v_seg.y / this.length);\r\n /* unit vector ||v_unit|| = 1 */\r\n dist = Math.abs(v_unit.cross(v_ps2pt));\r\n /* dist = abs(v_unit x v_ps2pt) */\r\n closest_point = segment.start.translate(v_unit.multiply(v_unit.dot(v_ps2pt)));\r\n return [dist, new Segment(pt, closest_point)];\r\n }\r\n else if (start_sp < 0) { /* point is out of scope closer to ps */\r\n return pt.distanceTo(segment.start);\r\n }\r\n else { /* point is out of scope closer to pe */\r\n return pt.distanceTo(segment.end);\r\n }\r\n };\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and arc\r\n * @param pt\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2arc(pt, arc) {\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n let dist_and_segment = [];\r\n let dist, shortest_segment;\r\n [dist, shortest_segment] = Distance.point2circle(pt, circle);\r\n if (shortest_segment.end.on(arc)) {\r\n dist_and_segment.push(Distance.point2circle(pt, circle));\r\n }\r\n dist_and_segment.push( Distance.point2point(pt, arc.start) );\r\n dist_and_segment.push( Distance.point2point(pt, arc.end) );\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and line\r\n * @param seg\r\n * @param line\r\n * @returns {Number | Segment}\r\n */\r\n static segment2line(seg, line) {\r\n let ip = seg.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0],ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2line(seg.start, line));\r\n dist_and_segment.push(Distance.point2line(seg.end, line));\r\n\r\n Distance.sort( dist_and_segment );\r\n return dist_and_segment[0];\r\n\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two segments\r\n * @param seg1\r\n * @param seg2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2segment(seg1, seg2) {\r\n let ip = Segment.intersectSegment2Segment(seg1, seg2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0],ip[0])]; // distance = 0, closest point is the first point\r\n }\r\n\r\n // Seg1 and seg2 not intersected\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2segment(seg2.start, seg1));\r\n dist_and_segment.push(Distance.point2segment(seg2.end, seg1));\r\n dist_and_segment.push(Distance.point2segment(seg1.start, seg2));\r\n dist_and_segment.push(Distance.point2segment(seg1.end, seg2));\r\n\r\n Distance.sort( dist_and_segment );\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and circle\r\n * @param seg\r\n * @param circle\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2circle(seg, circle) {\r\n /* Case 1 Segment and circle intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(circle);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and circle\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius\r\n * And projection point belong to segment\r\n * Then measure again distance from projection to circle and return it */\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let [dist, shortest_segment] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist, circle.r) && shortest_segment.end.on(seg)) {\r\n return Distance.point2circle(shortest_segment.end, circle);\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n else {\r\n let [dist_from_start, shortest_segment_from_start] = Distance.point2circle(seg.start, circle);\r\n let [dist_from_end, shortest_segment_from_end] = Distance.point2circle(seg.end, circle);\r\n return Flatten.Utils.LT(dist_from_start, dist_from_end) ?\r\n [dist_from_start, shortest_segment_from_start] :\r\n [dist_from_end, shortest_segment_from_end];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between segment and arc\r\n * @param seg\r\n * @param arc\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static segment2arc(seg, arc) {\r\n /* Case 1 Segment and arc intersected. Return the first point and zero distance */\r\n let ip = seg.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // No intersection between segment and arc\r\n let line = new Flatten.Line(seg.ps, seg.pe);\r\n let circle = new Flatten.Circle(arc.pc, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r) && shortest_segment_from_center.end.on(seg)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n }\r\n /* Case 3. Otherwise closest point is one of the end points of the segment */\r\n let dist_and_segment = [];\r\n dist_and_segment.push(Distance.point2arc(seg.start, arc));\r\n dist_and_segment.push(Distance.point2arc(seg.end, arc));\r\n\r\n let dist_tmp, segment_tmp;\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.start, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2segment(arc.end, seg);\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle1\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2circle(circle1, circle2) {\r\n let ip = circle1.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n // Case 1. Concentric circles. Convert to arcs and take distance between two arc starts\r\n if (circle1.center.equalTo(circle2.center)) {\r\n let arc1 = circle1.toArc();\r\n let arc2 = circle2.toArc();\r\n return Distance.point2point(arc1.start, arc2.start);\r\n }\r\n else {\r\n // Case 2. Not concentric circles\r\n let line = new Line(circle1.center, circle2.center);\r\n let ip1 = line.intersect(circle1);\r\n let ip2 = line.intersect(circle2);\r\n\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[0], ip2[1]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[0]));\r\n dist_and_segment.push(Distance.point2point(ip1[1], ip2[1]));\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two circles\r\n * @param circle\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static circle2line(circle, line) {\r\n let ip = circle.intersect(line);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n let [dist, shortest_segment] = Distance.point2circle(shortest_segment_from_center.end, circle);\r\n shortest_segment = shortest_segment.reverse();\r\n return [dist, shortest_segment];\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and line\r\n * @param arc\r\n * @param line\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2line(arc, line) {\r\n /* Case 1 Line and arc intersected. Return the first point and zero distance */\r\n let ip = line.intersect(arc);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle = new Flatten.Circle(arc.center, arc.r);\r\n\r\n /* Case 2. Distance to projection of center point to line bigger than radius AND\r\n * projection point belongs to segment AND\r\n * distance from projection point to circle belongs to arc =>\r\n * return this distance from projection to circle */\r\n let [dist_from_center, shortest_segment_from_center] = Distance.point2line(circle.center, line);\r\n if (Flatten.Utils.GE(dist_from_center, circle.r)) {\r\n let [dist_from_projection, shortest_segment_from_projection] =\r\n Distance.point2circle(shortest_segment_from_center.end, circle);\r\n if (shortest_segment_from_projection.end.on(arc)) {\r\n return [dist_from_projection, shortest_segment_from_projection];\r\n }\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n dist_and_segment.push( Distance.point2line(arc.start, line) );\r\n dist_and_segment.push( Distance.point2line(arc.end, line) );\r\n\r\n Distance.sort(dist_and_segment);\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between arc and circle\r\n * @param arc\r\n * @param circle2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2circle(arc, circle2) {\r\n let ip = arc.intersect(circle2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc.center, arc.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc)) {\r\n return [dist, shortest_segment];\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n\r\n dist_and_segment.push(Distance.point2circle(arc.start, circle2));\r\n dist_and_segment.push(Distance.point2circle(arc.end, circle2));\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between two arcs\r\n * @param arc1\r\n * @param arc2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static arc2arc(arc1, arc2) {\r\n let ip = arc1.intersect(arc2);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let circle1 = new Flatten.Circle(arc1.center, arc1.r);\r\n let circle2 = new Flatten.Circle(arc2.center, arc2.r);\r\n\r\n let [dist, shortest_segment] = Distance.circle2circle(circle1, circle2);\r\n if (shortest_segment.start.on(arc1) && shortest_segment.end.on(arc2)) {\r\n return [dist, shortest_segment];\r\n }\r\n else {\r\n let dist_and_segment = [];\r\n\r\n let dist_tmp, segment_tmp;\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.start, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc1.end, arc2);\r\n if (segment_tmp.end.on(arc2)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.start, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2arc(arc2.end, arc1);\r\n if (segment_tmp.end.on(arc1)) {\r\n dist_and_segment.push([dist_tmp, segment_tmp.reverse()]);\r\n }\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.start, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.start);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n [dist_tmp, segment_tmp] = Distance.point2point(arc1.end, arc2.end);\r\n dist_and_segment.push([dist_tmp, segment_tmp]);\r\n\r\n Distance.sort(dist_and_segment);\r\n\r\n return dist_and_segment[0];\r\n }\r\n }\r\n\r\n /**\r\n * Calculate distance and shortest segment between point and polygon\r\n * @param point\r\n * @param polygon\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static point2polygon(point, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = (edge.shape instanceof Segment) ?\r\n Distance.point2segment(point, edge.shape) : Distance.point2arc(point, edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static shape2polygon(shape, polygon) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = shape.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n/*\r\n static arc2polygon(arc, polygon) {\r\n let ip = arc.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = arc.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static line2polygon(line, polygon) {\r\n let ip = line.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = line.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static circle2polygon(circle, polygon) {\r\n let ip = circle.intersect(polygon);\r\n if (ip.length > 0) {\r\n return [0, new Segment(ip[0], ip[0])];\r\n }\r\n\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Segment()];\r\n for (let edge of polygon.edges) {\r\n let [dist, shortest_segment] = circle.distanceTo(edge.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n*/\r\n\r\n /**\r\n * Calculate distance and shortest segment between two polygons\r\n * @param polygon1\r\n * @param polygon2\r\n * @returns {Number | Segment} - distance and shortest segment\r\n */\r\n static polygon2polygon(polygon1, polygon2) {\r\n let min_dist_and_segment = [Number.POSITIVE_INFINITY, new Flatten.Segment()];\r\n for (let edge1 of polygon1.edges) {\r\n for (let edge2 of polygon2.edges) {\r\n let [dist, shortest_segment] = edge1.shape.distanceTo(edge2.shape);\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment[0])) {\r\n min_dist_and_segment = [dist, shortest_segment];\r\n }\r\n }\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n /**\r\n * Returns [mindist, maxdist] array of squared minimal and maximal distance between boxes\r\n * Minimal distance by x is\r\n * (box2.xmin - box1.xmax), if box1 is left to box2\r\n * (box1.xmin - box2.xmax), if box2 is left to box1\r\n * 0, if box1 and box2 are intersected by x\r\n * Minimal distance by y is defined in the same way\r\n *\r\n * Maximal distance is estimated as a sum of squared dimensions of the merged box\r\n *\r\n * @param box1\r\n * @param box2\r\n * @returns {Number | Number} - minimal and maximal distance\r\n */\r\n static box2box_minmax(box1, box2) {\r\n let mindist_x = Math.max( Math.max(box1.xmin - box2.xmax, 0), Math.max(box2.xmin - box1.xmax, 0) );\r\n let mindist_y = Math.max( Math.max(box1.ymin - box2.ymax, 0), Math.max(box2.ymin - box1.ymax, 0) );\r\n let mindist = mindist_x*mindist_x + mindist_y*mindist_y;\r\n\r\n let box = box1.merge(box2);\r\n let dx = box.xmax - box.xmin;\r\n let dy = box.ymax - box.ymin;\r\n let maxdist = dx*dx + dy*dy;\r\n\r\n return [mindist, maxdist];\r\n }\r\n\r\n static minmax_tree_process_level(shape, level, min_stop, tree) {\r\n // Calculate minmax distance to each shape in current level\r\n // Insert result into the interval tree for further processing\r\n // update min_stop with maxdist, it will be the new stop distance\r\n let mindist, maxdist;\r\n for (let node of level) {\r\n\r\n // [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n // if (Flatten.Utils.GT(mindist, min_stop))\r\n // continue;\r\n\r\n // Estimate min-max dist to the shape stored in the node.item, using node.item.key which is shape's box\r\n [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.item.key);\r\n if (node.item.value instanceof Flatten.Edge) {\r\n tree.insert([mindist, maxdist], node.item.value.shape);\r\n }\r\n else {\r\n tree.insert([mindist, maxdist], node.item.value);\r\n }\r\n if (Flatten.Utils.LT(maxdist, min_stop)) {\r\n min_stop = maxdist; // this will be the new distance estimation\r\n }\r\n }\r\n\r\n if (level.length === 0)\r\n return min_stop;\r\n\r\n // Calculate new level from left and right children of the current\r\n let new_level_left = level.map(node => node.left.isNil() ? undefined : node.left ).filter(node => node !== undefined);\r\n let new_level_right = level.map(node => node.right.isNil() ? undefined : node.right).filter(node => node !== undefined);\r\n // Merge left and right subtrees and leave only relevant subtrees\r\n let new_level = [...new_level_left, ...new_level_right].filter( node => {\r\n // Node subtree quick reject, node.max is a subtree box\r\n let [mindist, maxdist] = Distance.box2box_minmax(shape.box, node.max);\r\n return (Flatten.Utils.LE(mindist, min_stop));\r\n });\r\n\r\n min_stop = Distance.minmax_tree_process_level(shape, new_level, min_stop, tree);\r\n return min_stop;\r\n }\r\n\r\n /**\r\n * Calculates sorted tree of [mindist, maxdist] intervals between query shape\r\n * and shapes of the planar set.\r\n * @param shape\r\n * @param set\r\n */\r\n static minmax_tree(shape, set, min_stop) {\r\n let tree = new IntervalTree();\r\n let level = [set.index.root];\r\n let squared_min_stop = min_stop < Number.POSITIVE_INFINITY ? min_stop*min_stop : Number.POSITIVE_INFINITY;\r\n squared_min_stop = Distance.minmax_tree_process_level(shape, level, squared_min_stop, tree);\r\n return tree;\r\n }\r\n\r\n static minmax_tree_calc_distance(shape, node, min_dist_and_segment) {\r\n let min_dist_and_segment_new, stop;\r\n if (node != null && !node.isNil()) {\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.left, min_dist_and_segment);\r\n\r\n if (stop) {\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n if (Flatten.Utils.LT(min_dist_and_segment_new[0], Math.sqrt(node.item.key.low))) {\r\n return [min_dist_and_segment_new, true]; // stop condition\r\n }\r\n\r\n let [dist, shortest_segment] = Distance.distance(shape, node.item.value);\r\n // console.log(dist)\r\n if (Flatten.Utils.LT(dist, min_dist_and_segment_new[0])) {\r\n min_dist_and_segment_new = [dist, shortest_segment];\r\n }\r\n\r\n [min_dist_and_segment_new, stop] = Distance.minmax_tree_calc_distance(shape, node.right, min_dist_and_segment_new);\r\n\r\n return [min_dist_and_segment_new, stop];\r\n }\r\n\r\n return [min_dist_and_segment, false];\r\n }\r\n\r\n /**\r\n * Calculates distance between shape and Planar Set of shapes\r\n * @param shape\r\n * @param {PlanarSet} set\r\n * @param {Number} min_stop\r\n * @returns {*}\r\n */\r\n static shape2planarSet(shape, set, min_stop = Number.POSITIVE_INFINITY) {\r\n let min_dist_and_segment = [min_stop, new Flatten.Segment()];\r\n let stop = false;\r\n if (set instanceof Flatten.PlanarSet) {\r\n let tree = Distance.minmax_tree(shape, set, min_stop);\r\n [min_dist_and_segment, stop] = Distance.minmax_tree_calc_distance(shape, tree.root, min_dist_and_segment);\r\n }\r\n return min_dist_and_segment;\r\n }\r\n\r\n static sort(dist_and_segment) {\r\n dist_and_segment.sort((d1, d2) => {\r\n if (Flatten.Utils.LT(d1[0], d2[0])) {\r\n return -1;\r\n }\r\n if (Flatten.Utils.GT(d1[0], d2[0])) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n static distance(shape1, shape2) {\r\n return shape1.distanceTo(shape2);\r\n }\r\n }\r\n};","/**\r\n * Created by Alex Bol on 2/18/2017.\r\n */\r\n'use strict';\r\n\r\nlet Utils = require(\"./utils/utils\");\r\nlet Errors = require(\"./utils/errors\");\r\n\r\n/**\r\n * FlattenJS - library for 2d geometry\r\n * @type {Flatten}\r\n */\r\nlet Flatten = class Flatten {\r\n constructor() {\r\n this.DP_TOL = Utils.DP_TOL;\r\n this.CCW = true;\r\n this.CW = false;\r\n this.ORIENTATION = {CCW:-1, CW:1, NOT_ORIENTABLE: 0};\r\n this.PIx2 = 2 * Math.PI;\r\n // this.PI_2 = 0.5 * Math.PI;\r\n this.INSIDE = 1;\r\n this.OUTSIDE = 0;\r\n this.BOUNDARY = 2;\r\n this.CONTAINS = 3;\r\n this.INTERLACE = 4;\r\n this.OVERLAP_SAME = 1;\r\n this.OVERLAP_OPPOSITE = 2;\r\n this.Utils = Utils;\r\n this.Errors = Errors;\r\n }\r\n};\r\n\r\nlet f = new Flatten();\r\n\r\nrequire(\"./classes/matrix\")(f);\r\nrequire(\"./data_structures/planar_set\")(f);\r\nrequire(\"./classes/point\")(f);\r\nrequire(\"./classes/vector\")(f);\r\nrequire(\"./classes/line\")(f);\r\nrequire(\"./classes/circle\")(f);\r\nrequire(\"./classes/segment\")(f);\r\nrequire(\"./classes/arc\")(f);\r\nrequire(\"./classes/box\")(f);\r\nrequire(\"./classes/edge\")(f);\r\nrequire(\"./classes/face\")(f);\r\nrequire(\"./classes/ray\")(f);\r\nrequire(\"./algorithms/ray_shooting\")(f);\r\nrequire(\"./classes/polygon\")(f);\r\nrequire(\"./algorithms/distance\")(f);\r\n\r\nmodule.exports = f;\r\n","import Flatten from \"flatten-js\"\r\nimport IPosition from \"../models/position\"\r\nimport IElement from \"../models/IElement\"\r\n\r\n/**\r\n * Check if position 1 is within the radius r of position 2\r\n * @returns boolean\r\n */\r\nexport const checkSamePosition = (p1: IPosition, p2: IPosition, r: number = 3) => {\r\n return (p2.x - r < p1.x && p2.x + r > p1.x) && (p2.y - r < p1.y && p2.y + r > p1.y)\r\n}\r\n\r\nexport function removeDuplicatePosition<T extends IPosition>(positions: T[]) {\r\n return positions.reduce((acc, p) => acc.some(_p => _p.x === p.x && _p.y === p.y) ? acc : [...acc, p], [] as T[])\r\n}\r\n\r\n/**\r\n * Find the closest point from a list of points to the destination point\r\n*/\r\nexport const findNearestPosition = (listPositions: IPosition[], targetPosition: IPosition) => {\r\n let nearestPoint = listPositions[0];\r\n\r\n if (listPositions.length === 1) return nearestPoint;\r\n\r\n for (let i = 1; i < listPositions.length; i++) {\r\n const curPoint = listPositions[i];\r\n\r\n const [nearestDistance] = Flatten.point(nearestPoint.x, nearestPoint.y).distanceTo(Flatten.point(targetPosition.x, targetPosition.y))\r\n const [curDistance] = Flatten.point(curPoint.x, curPoint.y).distanceTo(Flatten.point(targetPosition.x, targetPosition.y))\r\n\r\n nearestPoint = curDistance < nearestDistance ? curPoint : nearestPoint;\r\n }\r\n\r\n return nearestPoint;\r\n}\r\n\r\n/**\r\n * @param ele : IElement\r\n * @returns Flatten.Polygon\r\n */\r\nexport const makePolygonOfElement = (ele: IElement): Flatten.Polygon => {\r\n const polygon = new Flatten.Polygon()\r\n polygon.addFace([\r\n Flatten.point(ele.position.x, ele.position.y),\r\n Flatten.point(ele.position.x + ele.size.width, ele.position.y),\r\n Flatten.point(ele.position.x + ele.size.width, ele.position.y + ele.size.height),\r\n Flatten.point(ele.position.x, ele.position.y + ele.size.height),\r\n ])\r\n\r\n return polygon;\r\n}\r\n\r\nexport const getIntersectionPositions = (pointStart: IPosition, pointEnd: IPosition, ele: IElement): IPosition[] => {\r\n const segment = Flatten.segment(\r\n Flatten.point(pointStart.x, pointStart.y),\r\n Flatten.point(pointEnd.x, pointEnd.y)\r\n )\r\n\r\n const polygonOfEle = makePolygonOfElement(ele)\r\n\r\n /* Remove duplicate positions from the result of finding the intersection points between a segment and a polygon. \r\n It then maps the intersection points to objects with rounded x and y coordinates. */\r\n return removeDuplicatePosition(segment.intersect(polygonOfEle).map(p => ({ x: Math.round(p.x), y: Math.round(p.y) })))\r\n}\r\n\r\n//Find the first intersection point of the line starting from startPosition to endPosition on the elements\r\nexport const getFirstIntersection = (startPosition: IPosition, endPosition: IPosition, elements: IElement[]) => {\r\n let result: {\r\n nearestIntersection: IPosition,\r\n intersectionPointsList: IPosition[],\r\n element: IElement,\r\n } | undefined;\r\n\r\n for (const element of elements) {\r\n //Find intersection positions on element\r\n const intersectionPoints = getIntersectionPositions(startPosition, endPosition, element);\r\n\r\n //If the line intersects at 1 point (can be the starting point or the ending point) or no point then ignore\r\n if (intersectionPoints.length <= 1) {\r\n continue;\r\n }\r\n\r\n const selectablePointsList = [...intersectionPoints]\r\n\r\n //If a point is found on a previous element, add it to the list of intersection points on the current element.\r\n if (result?.nearestIntersection) {\r\n selectablePointsList.push(result.nearestIntersection)\r\n }\r\n\r\n const nearest = findNearestPosition(selectablePointsList, startPosition)\r\n\r\n //If the closest intersection point to the starting point is not found or the new point is different from the previously found point, set a new value.\r\n if (!result?.nearestIntersection || !checkSamePosition(nearest, result.nearestIntersection)) {\r\n result = {\r\n element: element,\r\n intersectionPointsList: intersectionPoints,\r\n nearestIntersection: nearest,\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n//Find a point next to an element from a point on the element\r\nexport const generateSubstitutePosition = (intersectedPosition: IPosition, targetPosition: IPosition, ele: IElement): IPosition => {\r\n const translationOffset = 20;\r\n\r\n const vertex1Position = {\r\n x: ele.position.x,\r\n y: ele.position.y,\r\n }\r\n\r\n const vertex2Position = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y,\r\n }\r\n\r\n const vertex3Position = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n const vertex4Position = {\r\n x: ele.position.x,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n let replacementPosition: IPosition = null!;\r\n\r\n if (checkSamePosition(vertex1Position, intersectedPosition, 0)) {\r\n //Cut at vertex 1 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x - translationOffset;\r\n replacementPosition.y = vertex1Position.y - translationOffset;\r\n }\r\n\r\n else if (checkSamePosition(vertex2Position, intersectedPosition, 0)) {\r\n //Cut at vertex 2 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x + translationOffset;\r\n replacementPosition.y = vertex1Position.y - translationOffset;\r\n }\r\n\r\n else if (checkSamePosition(vertex3Position, intersectedPosition, 0)) {\r\n //Cut at vertex 3 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x + translationOffset;\r\n replacementPosition.y = vertex1Position.y + translationOffset;\r\n }\r\n else if (checkSamePosition(vertex4Position, intersectedPosition, 0)) {\r\n //Cut at vertex 4 of bbox, move out a distance x,y\r\n replacementPosition.x = vertex1Position.x - translationOffset;\r\n replacementPosition.y = vertex1Position.y + translationOffset;\r\n }\r\n\r\n else if (intersectedPosition.y === ele.position.y) {\r\n //cut top edge, move left or right\r\n\r\n const lineOfVertex12 = Flatten.line(Flatten.point(vertex1Position.x, vertex1Position.y), Flatten.point(vertex2Position.x, vertex2Position.y))\r\n\r\n //Check if the line lies on the edge of the bbox then move the starting point out 1 distance perpendicular to the edge.\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex12)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex12)[0] === 0\r\n ) {\r\n //lie on a straight line 1-2\r\n replacementPosition = {\r\n x: intersectedPosition.x,\r\n y: intersectedPosition.y - translationOffset,\r\n }\r\n } else {\r\n const leftPosition = {\r\n x: ele.position.x - translationOffset,\r\n y: ele.position.y,\r\n }\r\n\r\n const rightPosition = {\r\n x: ele.position.x + ele.size.width + translationOffset,\r\n y: ele.position.y,\r\n }\r\n\r\n replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.y === ele.position.y + ele.size.height) {\r\n //cut bottom edge, move left or right\r\n\r\n const lineOfVertex34 = Flatten.line(Flatten.point(vertex3Position.x, vertex3Position.y), Flatten.point(vertex4Position.x, vertex4Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex34)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex34)[0] === 0\r\n ) {\r\n //lie on a straight line 3-4\r\n replacementPosition = {\r\n x: intersectedPosition.x,\r\n y: intersectedPosition.y + translationOffset,\r\n }\r\n } else {\r\n const leftPosition = {\r\n x: ele.position.x - translationOffset,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n const rightPosition = {\r\n x: ele.position.x + ele.size.width + translationOffset,\r\n y: ele.position.y + ele.size.height,\r\n }\r\n\r\n replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.x === ele.position.x) {\r\n //cut left edge, move up or down\r\n\r\n const lineOfVertex14 = Flatten.line(Flatten.point(vertex1Position.x, vertex1Position.y), Flatten.point(vertex4Position.x, vertex4Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex14)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex14)[0] === 0\r\n ) {\r\n //lie on a straight line 1-4\r\n replacementPosition = {\r\n x: intersectedPosition.x - translationOffset,\r\n y: intersectedPosition.y,\r\n }\r\n } else {\r\n const topPosition = {\r\n x: ele.position.x,\r\n y: ele.position.y - translationOffset,\r\n }\r\n\r\n const bottomPosition = {\r\n x: ele.position.x,\r\n y: ele.position.y + ele.size.height + translationOffset,\r\n }\r\n\r\n replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition)\r\n }\r\n }\r\n\r\n else if (intersectedPosition.x === ele.position.x + ele.size.width) {\r\n //cut right edge, move up or down\r\n\r\n const lineOfVertex23 = Flatten.line(Flatten.point(vertex2Position.x, vertex2Position.y), Flatten.point(vertex3Position.x, vertex3Position.y))\r\n\r\n if (\r\n Flatten.point(intersectedPosition.x, intersectedPosition.y).distanceTo(lineOfVertex23)[0] === 0 &&\r\n Flatten.point(targetPosition.x, targetPosition.y).distanceTo(lineOfVertex23)[0] === 0\r\n ) {\r\n //lie on a straight line 2-3\r\n replacementPosition = {\r\n x: intersectedPosition.x + translationOffset,\r\n y: intersectedPosition.y,\r\n }\r\n } else {\r\n const topPosition = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y - translationOffset,\r\n }\r\n\r\n const bottomPosition = {\r\n x: ele.position.x + ele.size.width,\r\n y: ele.position.y + ele.size.height + translationOffset,\r\n }\r\n\r\n replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition)\r\n }\r\n\r\n }\r\n\r\n return replacementPosition;\r\n}\r\n\r\nexport const getRelativePosition = (clientPosition: IPosition, relativeElement: Element): IPosition => {\r\n const relativeRect = relativeElement.getBoundingClientRect();\r\n\r\n return {\r\n x: clientPosition.x - relativeRect.left,\r\n y: clientPosition.y - relativeRect.top,\r\n }\r\n}","import React, { memo, useContext, useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport IElementLinkProps from \"../../models/IElementLinkProps\";\r\nimport IPosition from \"../../models/position\";\r\nimport { addPointToList, createSmoothPathString, dist } from \"../../utils/pathUtil\";\r\nimport { CSS_CLASS_LINK_SELECTED, LINK_CLICKABLE_STROKE_WIDTH, LINK_DEFAULT_COLOR, LINK_LABEL_POSITION_FROM_LINK_MID_POINT, LINK_MARKER_DISTANCE_FROM_PORT, LINK_MARKER_SIZE, LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT, LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT, MAX_LINK_KNOT_COUNT, MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK } from \"../../utils/constants\";\r\nimport { calculateAngleWithOx } from \"../../utils/mathUtil\";\r\nimport Text from \"../texts/text\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport IText from \"../../models/IText\";\r\nimport CloseIcon from \"../CloseIcon\";\r\nimport { getRelativePosition } from \"../../utils/positionUtil\";\r\n\r\nconst makerStart = <circle cx={10} cy={10} r={10} fill=\"blue\"></circle>\r\nconst makerEnd = <path d=\"M0 0 L 20 10 L0 20 Z\" fill=\"blue\"></path>//<path d=\"M0 0 L 10 5 L0 10 Z\"></path>\r\n\r\nconst IElementLink: React.FC<IElementLinkProps> = ({\r\n id,\r\n path,\r\n stroke,\r\n strokeWidth = 4,\r\n points: pointsProp,\r\n sourcePosition,\r\n targetPosition,\r\n onPathChanged,\r\n onClickDelete,\r\n onSelected,\r\n onDeselected,\r\n container,\r\n markerStart = makerStart,\r\n markerEnd = makerEnd,\r\n markerDistanceFromPort = LINK_MARKER_DISTANCE_FROM_PORT,\r\n markerSize = LINK_MARKER_SIZE,\r\n label,\r\n sourceLabel,\r\n targetLabel,\r\n onLabelMoved,\r\n onLabelResized,\r\n onLabelContentChanged,\r\n}) => {\r\n const [pathStr, setPathStr] = useState<string | undefined>(path)\r\n const [points, setPoints] = useState<IPosition[]>(pointsProp ?? [])\r\n const [isDragging, setIsDragging] = useState(false)\r\n const [draggingPointIndex, setDraggingPointIndex] = useState<number>()\r\n const [selectedLabelRef, setSelectedLabelRef] = useState<React.RefObject<SVGSVGElement | null>>({\r\n current: null,\r\n })\r\n const [isSelectedLink, setIsSelectedLink] = useState<boolean>(false)\r\n\r\n const { onPaperClicked, onElementSelected } = useContext(paperEventEmitterContext)\r\n const pathRef = useRef<SVGPathElement>(null)\r\n const labelRef = useRef<SVGSVGElement>(null)\r\n const sourceLabelRef = useRef<SVGSVGElement>(null)\r\n const targetLabelRef = useRef<SVGSVGElement>(null)\r\n\r\n useEffect(() => {\r\n const paperClickListener = onPaperClicked(() => {\r\n setSelectedLabelRef({\r\n current: null,\r\n })\r\n setIsSelectedLink(false)\r\n onDeselected?.()\r\n })\r\n\r\n return () => {\r\n paperClickListener.off();\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n const elementSelectedListener = onElementSelected(() => {\r\n setSelectedLabelRef({\r\n current: null,\r\n })\r\n setIsSelectedLink(false)\r\n onDeselected?.()\r\n })\r\n\r\n return () => {\r\n elementSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n useLayoutEffect(\r\n () => {\r\n const pointsList = [sourcePosition, ...points, targetPosition]\r\n\r\n let _pathStr = createSmoothPathString(pointsList, undefined, false)\r\n\r\n setPathStr(_pathStr)\r\n },\r\n [sourcePosition, points, targetPosition]\r\n )\r\n\r\n useEffect(() => {\r\n if (!pathStr) return;\r\n\r\n onPathChanged?.(pathStr, id)\r\n }, [pathStr, id])\r\n\r\n useLayoutEffect(() => {\r\n //handle when creating and moving point\r\n const handleMouseMove = (ev: Event) => {\r\n const mouseEvent = ev as MouseEvent;\r\n\r\n if (isDragging && draggingPointIndex !== undefined && container) {\r\n const offset = getRelativePosition(\r\n { x: mouseEvent.clientX, y: mouseEvent.clientY },\r\n container\r\n )\r\n\r\n setPoints(prev => {\r\n const temp = [...prev];\r\n temp[draggingPointIndex] = offset;\r\n return temp;\r\n })\r\n }\r\n }\r\n\r\n const mouseUp = () => {\r\n setDraggingPointIndex(undefined)\r\n setIsDragging(false)\r\n }\r\n\r\n container?.addEventListener('mousemove', handleMouseMove)\r\n container?.addEventListener('mouseup', mouseUp)\r\n\r\n return () => {\r\n container?.removeEventListener('mousemove', handleMouseMove)\r\n container?.removeEventListener('mouseup', mouseUp)\r\n }\r\n }, [container, isDragging, draggingPointIndex])\r\n\r\n const handleMouseDownOnPath = (ev: React.MouseEvent) => {\r\n ev.preventDefault();\r\n\r\n const svgContainer = (ev.target as SVGSVGElement).ownerSVGElement!;\r\n //add point if click on path\r\n setIsDragging(true)\r\n\r\n const rect = svgContainer.getBoundingClientRect();\r\n\r\n const offsetX = ev.clientX - rect.left;\r\n const offsetY = ev.clientY - rect.top;\r\n\r\n //Position of the new point on the path\r\n const newPoint = {\r\n x: offsetX,\r\n y: offsetY\r\n }\r\n\r\n const newPoints = addPointToList(newPoint, [sourcePosition, ...points, targetPosition], pathRef.current!)\r\n const pointsWithoutStartEndPoint = newPoints.slice(1, newPoints.length - 1)\r\n\r\n const addedIndex = pointsWithoutStartEndPoint.findIndex(p => p.x === newPoint.x && p.y === newPoint.y)\r\n\r\n const leftPointIndex = addedIndex - 1;\r\n const rightPointIndex = addedIndex + 1;\r\n\r\n let distFromLeftPoint;\r\n if (pointsWithoutStartEndPoint[leftPointIndex]) {\r\n distFromLeftPoint = dist(pointsWithoutStartEndPoint[leftPointIndex], pointsWithoutStartEndPoint[addedIndex])\r\n }\r\n\r\n let distFromRightPoint;\r\n if (pointsWithoutStartEndPoint[rightPointIndex]) {\r\n distFromRightPoint = dist(pointsWithoutStartEndPoint[rightPointIndex], pointsWithoutStartEndPoint[addedIndex])\r\n }\r\n\r\n let _draggingPointIndex;\r\n\r\n if (pointsWithoutStartEndPoint.length > MAX_LINK_KNOT_COUNT) {\r\n //Delete the point closest to the added point and get the index of the dragged point\r\n if (\r\n distFromLeftPoint !== undefined &&\r\n (\r\n distFromRightPoint === undefined ||\r\n distFromLeftPoint < distFromRightPoint\r\n )\r\n ) {\r\n //Remove left point\r\n pointsWithoutStartEndPoint.splice(leftPointIndex, 1)\r\n }\r\n\r\n else if (\r\n distFromRightPoint !== undefined &&\r\n (\r\n distFromLeftPoint === undefined ||\r\n distFromRightPoint < distFromLeftPoint\r\n )\r\n ) {\r\n //Remove right point\r\n pointsWithoutStartEndPoint.splice(rightPointIndex, 1)\r\n }\r\n\r\n } else {\r\n //get the index of the nearest point to the added point\r\n if (\r\n distFromRightPoint !== undefined && distFromRightPoint < MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK\r\n ) {\r\n //If the distance between the right point and the added point is less than MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK, then remove it.\r\n pointsWithoutStartEndPoint.splice(rightPointIndex, 1)\r\n }\r\n\r\n if (\r\n distFromLeftPoint !== undefined && distFromLeftPoint < MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK\r\n ) {\r\n //If the distance between the left point and the added point is less than MIN_DISTANCE_BETWEEN_KNOTS_ON_LINK, then remove it.\r\n pointsWithoutStartEndPoint.splice(leftPointIndex, 1)\r\n }\r\n\r\n }\r\n\r\n //Find new index of added point\r\n _draggingPointIndex = pointsWithoutStartEndPoint.findIndex(p => p.x === newPoint.x && p.y === newPoint.y)\r\n\r\n setDraggingPointIndex(_draggingPointIndex)\r\n setPoints(pointsWithoutStartEndPoint)\r\n }\r\n\r\n const handleLabelMoved = (offsetX: number, offsetY: number) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelMoved?.(offsetX, offsetY, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleLabelResized = (width: number, height: number) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelResized?.(width, height, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelResized?.(width, height, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelResized?.(width, height, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleLabelContentChanged = (ev: React.ChangeEvent, newValue: string) => {\r\n switch (selectedLabelRef.current) {\r\n case labelRef.current:\r\n onLabelContentChanged?.(newValue, 'middle')\r\n break;\r\n case sourceLabelRef.current:\r\n onLabelContentChanged?.(newValue, 'source')\r\n break;\r\n case targetLabelRef.current:\r\n onLabelContentChanged?.(newValue, 'target')\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const handleClickPath = () => {\r\n setIsSelectedLink(true)\r\n onSelected?.()\r\n }\r\n\r\n const renderLabel = (label: IText, labelType: 'middle' | 'source' | 'target', relativePositionTo: IPosition = { x: 0, y: 0 }) => {\r\n const { content, size } = label;\r\n let relativePosition = label.position;\r\n let curLabelRef: React.RefObject<SVGSVGElement>;\r\n\r\n switch (labelType) {\r\n case 'middle':\r\n curLabelRef = labelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_LABEL_POSITION_FROM_LINK_MID_POINT\r\n }\r\n break;\r\n case 'source':\r\n curLabelRef = sourceLabelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT\r\n }\r\n break;\r\n case 'target':\r\n curLabelRef = targetLabelRef;\r\n\r\n if (!relativePosition) {\r\n relativePosition = LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error('This type of label does not exist.')\r\n }\r\n\r\n const position = {\r\n x: relativePosition.x + relativePositionTo.x,\r\n y: relativePosition.y + relativePositionTo.y,\r\n }\r\n\r\n return (\r\n <Text\r\n id={label.id}\r\n x={position.x}\r\n y={position.y}\r\n width={size.width}\r\n height={size.height}\r\n content={content}\r\n fontSize={label.fontSize}\r\n border={label.border}\r\n ref={curLabelRef}\r\n container={container!}\r\n onSelected={() => setSelectedLabelRef(curLabelRef)}\r\n onMoved={handleLabelMoved}\r\n onResized={handleLabelResized}\r\n onContentChanged={handleLabelContentChanged}\r\n />\r\n )\r\n }\r\n\r\n let angleMarkerStart: string | number = '0';\r\n let angleMarkerEnd: string | number = '0';\r\n\r\n let markerStartPosition;\r\n let markerEndPosition;\r\n\r\n let centerPathPosition;\r\n\r\n if (pathRef.current?.getAttribute('d')) {\r\n if (markerStart) {\r\n markerStartPosition = pathRef.current.getPointAtLength(markerDistanceFromPort)\r\n angleMarkerStart = calculateAngleWithOx(sourcePosition, markerStartPosition)\r\n }\r\n\r\n if (markerEnd) {\r\n markerEndPosition = pathRef.current.getPointAtLength(pathRef.current.getTotalLength() - markerDistanceFromPort)\r\n angleMarkerEnd = calculateAngleWithOx(markerEndPosition, targetPosition)\r\n }\r\n\r\n centerPathPosition = pathRef.current?.getPointAtLength(pathRef.current.getTotalLength() / 2);\r\n }\r\n\r\n return (\r\n <g>\r\n <path\r\n ref={pathRef}\r\n d={pathStr}\r\n className={isSelectedLink ? CSS_CLASS_LINK_SELECTED : ''}\r\n fill=\"none\" stroke={stroke || LINK_DEFAULT_COLOR}\r\n strokeWidth={strokeWidth}\r\n />\r\n <path\r\n d={pathStr}\r\n fill=\"none\"\r\n stroke={'transparent'}\r\n strokeWidth={LINK_CLICKABLE_STROKE_WIDTH}\r\n onClick={handleClickPath}\r\n onMouseDown={handleMouseDownOnPath}\r\n />\r\n\r\n {isSelectedLink && centerPathPosition && <svg x={centerPathPosition.x - 10} y={centerPathPosition.y - 10}>\r\n <CloseIcon onClick={onClickDelete} />\r\n </svg>}\r\n\r\n {label && renderLabel(label, 'middle', centerPathPosition)}\r\n {sourceLabel && renderLabel(sourceLabel, 'source', sourcePosition)}\r\n {targetLabel && renderLabel(targetLabel, 'target', targetPosition)}\r\n\r\n {markerStartPosition && <g transform={`rotate(${angleMarkerStart})`} style={{ transformOrigin: 'center', transformBox: 'content-box' }}>\r\n <svg x={markerStartPosition.x - markerSize / 2} y={markerStartPosition.y - markerSize / 2} width={markerSize} height={markerSize}>\r\n {markerStart}\r\n </svg>\r\n </g>}\r\n {markerEndPosition && <g transform={`rotate(${angleMarkerEnd})`} style={{ transformOrigin: 'center', transformBox: 'content-box' }}>\r\n <svg x={markerEndPosition.x - markerSize / 2} y={markerEndPosition.y - markerSize / 2} width={markerSize} height={markerSize}>\r\n {markerEnd}\r\n </svg>\r\n </g>}\r\n </g>\r\n )\r\n};\r\n\r\nexport default memo(IElementLink);","import React from 'react';\r\n\r\ninterface RulerProps {\r\n squareSize: number;\r\n border: string;\r\n}\r\n\r\nconst Ruler: React.FC<RulerProps> = ({ squareSize, border }) => {\r\n const numColumns = Math.ceil(3000 / squareSize);\r\n const numRows = Math.ceil(3000 / squareSize);\r\n\r\n const tableWidth = numColumns * squareSize;\r\n\r\n return (\r\n <table style={{ position: 'absolute', zIndex: -1, top: 0, left: 0, borderCollapse: 'collapse', width: tableWidth }}>\r\n <tbody>\r\n {Array.from({ length: numRows }).map((_, rowIndex) => (\r\n <tr key={rowIndex} style={{ margin: 0, padding: 0 }}>\r\n {Array.from({ length: numColumns }).map((_, colIndex) => (\r\n <td\r\n key={colIndex}\r\n style={{\r\n width: squareSize,\r\n height: squareSize,\r\n border: border,\r\n margin: 0,\r\n padding: 0,\r\n boxSizing: 'border-box',\r\n verticalAlign: 'top',\r\n position: 'relative',\r\n fontSize: 12,\r\n }}\r\n >\r\n {rowIndex === 0 ? <span style={{marginLeft: \"-12px\"}}>\r\n {colIndex * squareSize}\r\n </span> : \"\"}\r\n {colIndex === 0 ? <span style={{ top: \"-9px\", position: \"absolute\" }}>\r\n {rowIndex * squareSize}\r\n </span> : \"\"}\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n );\r\n};\r\n\r\nexport default Ruler;","import React, { forwardRef } from \"react\";\r\nimport IPort from \"../../models/IPort\";\r\n\r\ninterface IElementWrapper {\r\n x?: number;\r\n y?: number;\r\n onClick?: (e: React.MouseEvent<SVGElement>) => void;\r\n onContextMenu?: (e: React.MouseEvent<SVGElement>) => void;\r\n children: React.ReactNode;\r\n portPlaceholders?: SVGElement[];\r\n ports?: IPort[];\r\n\r\n onMouseMove?: (event: React.MouseEvent) => void;\r\n onMouseLeave?: (event: React.MouseEvent) => void;\r\n onMouseUp?: (event: React.MouseEvent) => void;\r\n}\r\n\r\nconst ElementWrapper: React.ForwardRefExoticComponent<IElementWrapper & React.RefAttributes<SVGSVGElement>> =\r\n forwardRef<SVGSVGElement, IElementWrapper>(\r\n function (\r\n { x, y, children, portPlaceholders, ports, onClick, onContextMenu, onMouseMove, onMouseLeave, onMouseUp\r\n },\r\n ref\r\n ) {\r\n\r\n const handleMouseDown = (ev: React.MouseEvent<SVGElement>) => {\r\n ev.stopPropagation();\r\n }\r\n\r\n const handleClick = (ev: React.MouseEvent<SVGElement>) => {\r\n if (ev.type === 'click') {\r\n if (onClick) onClick(ev);\r\n } else if (ev.type === 'contextmenu') {\r\n if (onContextMenu) onContextMenu(ev);\r\n }\r\n }\r\n\r\n return (\r\n <svg x={x} y={y} onClick={handleClick} onContextMenu={handleClick} onMouseDown={handleMouseDown} ref={ref} style={{ overflow: \"visible\" }} onMouseMove={onMouseMove} onMouseLeave={onMouseLeave} onMouseUp={onMouseUp}>\r\n {children}\r\n </svg>\r\n );\r\n }\r\n )\r\n\r\nexport default ElementWrapper;","import IPosition from \"../models/position\";\r\n\r\n// Calculate the position of the 4 vertices of a rectangle relative to its parent svg\r\nexport const getRectangleCorners = (rectSVG: SVGRectElement): IPosition[] => {\r\n const ownerSVG = rectSVG.ownerSVGElement;\r\n const rectStrokeWidth = Number(rectSVG.getAttribute('stroke-width')) || 0\r\n const strokeWidthOffset = rectStrokeWidth / 2\r\n\r\n if (!ownerSVG) {\r\n throw new Error('Rectangle does not wrapper by svg.')\r\n }\r\n\r\n const ownerX = ownerSVG.x.baseVal.value\r\n const ownerY = ownerSVG.y.baseVal.value\r\n const ownerWidth = ownerSVG.width.baseVal.value\r\n const ownerHeight = ownerSVG.height.baseVal.value\r\n\r\n const a: IPosition = { x: ownerX + strokeWidthOffset, y: ownerY + strokeWidthOffset }\r\n const b: IPosition = { x: ownerX + ownerWidth - strokeWidthOffset, y: ownerY + strokeWidthOffset }\r\n const c: IPosition = { x: ownerX + ownerWidth - strokeWidthOffset, y: ownerY + ownerHeight - strokeWidthOffset }\r\n const d: IPosition = { x: ownerX + strokeWidthOffset, y: ownerY + ownerHeight - strokeWidthOffset }\r\n\r\n return [a, b, c, d]\r\n}\r\n\r\n//find rotation angle of svg element on g element\r\nexport const getElementRotationInfo = (element: SVGSVGElement) => {\r\n let gElement: SVGGElement = element;\r\n let rotationAngle = 0;\r\n\r\n while (!(gElement instanceof SVGGElement)) {\r\n gElement = (gElement as HTMLElement).parentElement as any;\r\n }\r\n\r\n const transform = gElement.getAttribute('transform');\r\n\r\n if (transform) {\r\n // Match the rotation value using a regular expression\r\n const rotateMatch = transform.match(/rotate\\(([-\\d.]+)(?:\\s+[-\\d.]+\\s+[-\\d.]+)?\\)/);\r\n\r\n if (rotateMatch) {\r\n // The first capture group is the rotation angle\r\n rotationAngle = parseFloat(rotateMatch[1]);\r\n }\r\n }\r\n\r\n return rotationAngle;\r\n}","import Flatten from \"flatten-js\"\r\nimport IPosition from \"../models/position\"\r\n\r\nconst checkPositionOnLine = (position: IPosition, line: IPosition[]): boolean => {\r\n const point = Flatten.point(position.x, position.y);\r\n const _line = Flatten.segment(Flatten.point(line[0].x, line[0].y), Flatten.point(line[1].x, line[1].y))\r\n\r\n return _line.contains(point)\r\n}\r\n\r\nexport {\r\n checkPositionOnLine,\r\n}","// UMD (Universal Module Definition)\n// See https://github.com/umdjs/umd for reference\n//\n// This file uses the following specific UMD implementation:\n// https://github.com/umdjs/umd/blob/master/returnExports.js\n(function(root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory);\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.computeLayout = factory();\n }\n}(this, function() {\n /**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nvar computeLayout = (function() {\n\n var CSS_UNDEFINED;\n\n var CSS_DIRECTION_INHERIT = 'inherit';\n var CSS_DIRECTION_LTR = 'ltr';\n var CSS_DIRECTION_RTL = 'rtl';\n\n var CSS_FLEX_DIRECTION_ROW = 'row';\n var CSS_FLEX_DIRECTION_ROW_REVERSE = 'row-reverse';\n var CSS_FLEX_DIRECTION_COLUMN = 'column';\n var CSS_FLEX_DIRECTION_COLUMN_REVERSE = 'column-reverse';\n\n var CSS_JUSTIFY_FLEX_START = 'flex-start';\n var CSS_JUSTIFY_CENTER = 'center';\n var CSS_JUSTIFY_FLEX_END = 'flex-end';\n var CSS_JUSTIFY_SPACE_BETWEEN = 'space-between';\n var CSS_JUSTIFY_SPACE_AROUND = 'space-around';\n\n var CSS_ALIGN_FLEX_START = 'flex-start';\n var CSS_ALIGN_CENTER = 'center';\n var CSS_ALIGN_FLEX_END = 'flex-end';\n var CSS_ALIGN_STRETCH = 'stretch';\n\n var CSS_POSITION_RELATIVE = 'relative';\n var CSS_POSITION_ABSOLUTE = 'absolute';\n\n var leading = {\n 'row': 'left',\n 'row-reverse': 'right',\n 'column': 'top',\n 'column-reverse': 'bottom'\n };\n var trailing = {\n 'row': 'right',\n 'row-reverse': 'left',\n 'column': 'bottom',\n 'column-reverse': 'top'\n };\n var pos = {\n 'row': 'left',\n 'row-reverse': 'right',\n 'column': 'top',\n 'column-reverse': 'bottom'\n };\n var dim = {\n 'row': 'width',\n 'row-reverse': 'width',\n 'column': 'height',\n 'column-reverse': 'height'\n };\n\n // When transpiled to Java / C the node type has layout, children and style\n // properties. For the JavaScript version this function adds these properties\n // if they don't already exist.\n function fillNodes(node) {\n if (!node.layout || node.isDirty) {\n node.layout = {\n width: undefined,\n height: undefined,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n };\n }\n\n if (!node.style) {\n node.style = {};\n }\n\n if (!node.children) {\n node.children = [];\n }\n node.children.forEach(fillNodes);\n return node;\n }\n\n function isUndefined(value) {\n return value === undefined;\n }\n\n function isRowDirection(flexDirection) {\n return flexDirection === CSS_FLEX_DIRECTION_ROW ||\n flexDirection === CSS_FLEX_DIRECTION_ROW_REVERSE;\n }\n\n function isColumnDirection(flexDirection) {\n return flexDirection === CSS_FLEX_DIRECTION_COLUMN ||\n flexDirection === CSS_FLEX_DIRECTION_COLUMN_REVERSE;\n }\n\n function getLeadingMargin(node, axis) {\n if (node.style.marginStart !== undefined && isRowDirection(axis)) {\n return node.style.marginStart;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.marginLeft; break;\n case 'row-reverse': value = node.style.marginRight; break;\n case 'column': value = node.style.marginTop; break;\n case 'column-reverse': value = node.style.marginBottom; break;\n }\n\n if (value !== undefined) {\n return value;\n }\n\n if (node.style.margin !== undefined) {\n return node.style.margin;\n }\n\n return 0;\n }\n\n function getTrailingMargin(node, axis) {\n if (node.style.marginEnd !== undefined && isRowDirection(axis)) {\n return node.style.marginEnd;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.marginRight; break;\n case 'row-reverse': value = node.style.marginLeft; break;\n case 'column': value = node.style.marginBottom; break;\n case 'column-reverse': value = node.style.marginTop; break;\n }\n\n if (value != null) {\n return value;\n }\n\n if (node.style.margin !== undefined) {\n return node.style.margin;\n }\n\n return 0;\n }\n\n function getLeadingPadding(node, axis) {\n if (node.style.paddingStart !== undefined && node.style.paddingStart >= 0\n && isRowDirection(axis)) {\n return node.style.paddingStart;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.paddingLeft; break;\n case 'row-reverse': value = node.style.paddingRight; break;\n case 'column': value = node.style.paddingTop; break;\n case 'column-reverse': value = node.style.paddingBottom; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.padding !== undefined && node.style.padding >= 0) {\n return node.style.padding;\n }\n\n return 0;\n }\n\n function getTrailingPadding(node, axis) {\n if (node.style.paddingEnd !== undefined && node.style.paddingEnd >= 0\n && isRowDirection(axis)) {\n return node.style.paddingEnd;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.paddingRight; break;\n case 'row-reverse': value = node.style.paddingLeft; break;\n case 'column': value = node.style.paddingBottom; break;\n case 'column-reverse': value = node.style.paddingTop; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.padding !== undefined && node.style.padding >= 0) {\n return node.style.padding;\n }\n\n return 0;\n }\n\n function getLeadingBorder(node, axis) {\n if (node.style.borderStartWidth !== undefined && node.style.borderStartWidth >= 0\n && isRowDirection(axis)) {\n return node.style.borderStartWidth;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.borderLeftWidth; break;\n case 'row-reverse': value = node.style.borderRightWidth; break;\n case 'column': value = node.style.borderTopWidth; break;\n case 'column-reverse': value = node.style.borderBottomWidth; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.borderWidth !== undefined && node.style.borderWidth >= 0) {\n return node.style.borderWidth;\n }\n\n return 0;\n }\n\n function getTrailingBorder(node, axis) {\n if (node.style.borderEndWidth !== undefined && node.style.borderEndWidth >= 0\n && isRowDirection(axis)) {\n return node.style.borderEndWidth;\n }\n\n var value = null;\n switch (axis) {\n case 'row': value = node.style.borderRightWidth; break;\n case 'row-reverse': value = node.style.borderLeftWidth; break;\n case 'column': value = node.style.borderBottomWidth; break;\n case 'column-reverse': value = node.style.borderTopWidth; break;\n }\n\n if (value != null && value >= 0) {\n return value;\n }\n\n if (node.style.borderWidth !== undefined && node.style.borderWidth >= 0) {\n return node.style.borderWidth;\n }\n\n return 0;\n }\n\n function getLeadingPaddingAndBorder(node, axis) {\n return getLeadingPadding(node, axis) + getLeadingBorder(node, axis);\n }\n\n function getTrailingPaddingAndBorder(node, axis) {\n return getTrailingPadding(node, axis) + getTrailingBorder(node, axis);\n }\n\n function getBorderAxis(node, axis) {\n return getLeadingBorder(node, axis) + getTrailingBorder(node, axis);\n }\n\n function getMarginAxis(node, axis) {\n return getLeadingMargin(node, axis) + getTrailingMargin(node, axis);\n }\n\n function getPaddingAndBorderAxis(node, axis) {\n return getLeadingPaddingAndBorder(node, axis) +\n getTrailingPaddingAndBorder(node, axis);\n }\n\n function getJustifyContent(node) {\n if (node.style.justifyContent) {\n return node.style.justifyContent;\n }\n return 'flex-start';\n }\n\n function getAlignContent(node) {\n if (node.style.alignContent) {\n return node.style.alignContent;\n }\n return 'flex-start';\n }\n\n function getAlignItem(node, child) {\n if (child.style.alignSelf) {\n return child.style.alignSelf;\n }\n if (node.style.alignItems) {\n return node.style.alignItems;\n }\n return 'stretch';\n }\n\n function resolveAxis(axis, direction) {\n if (direction === CSS_DIRECTION_RTL) {\n if (axis === CSS_FLEX_DIRECTION_ROW) {\n return CSS_FLEX_DIRECTION_ROW_REVERSE;\n } else if (axis === CSS_FLEX_DIRECTION_ROW_REVERSE) {\n return CSS_FLEX_DIRECTION_ROW;\n }\n }\n\n return axis;\n }\n\n function resolveDirection(node, parentDirection) {\n var direction;\n if (node.style.direction) {\n direction = node.style.direction;\n } else {\n direction = CSS_DIRECTION_INHERIT;\n }\n\n if (direction === CSS_DIRECTION_INHERIT) {\n direction = (parentDirection === undefined ? CSS_DIRECTION_LTR : parentDirection);\n }\n\n return direction;\n }\n\n function getFlexDirection(node) {\n if (node.style.flexDirection) {\n return node.style.flexDirection;\n }\n return CSS_FLEX_DIRECTION_COLUMN;\n }\n\n function getCrossFlexDirection(flexDirection, direction) {\n if (isColumnDirection(flexDirection)) {\n return resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);\n } else {\n return CSS_FLEX_DIRECTION_COLUMN;\n }\n }\n\n function getPositionType(node) {\n if (node.style.position) {\n return node.style.position;\n }\n return 'relative';\n }\n\n function isFlex(node) {\n return (\n getPositionType(node) === CSS_POSITION_RELATIVE &&\n node.style.flex > 0\n );\n }\n\n function isFlexWrap(node) {\n return node.style.flexWrap === 'wrap';\n }\n\n function getDimWithMargin(node, axis) {\n return node.layout[dim[axis]] + getMarginAxis(node, axis);\n }\n\n function isDimDefined(node, axis) {\n return node.style[dim[axis]] !== undefined && node.style[dim[axis]] >= 0;\n }\n\n function isPosDefined(node, pos) {\n return node.style[pos] !== undefined;\n }\n\n function isMeasureDefined(node) {\n return node.style.measure !== undefined;\n }\n\n function getPosition(node, pos) {\n if (node.style[pos] !== undefined) {\n return node.style[pos];\n }\n return 0;\n }\n\n function boundAxis(node, axis, value) {\n var min = {\n 'row': node.style.minWidth,\n 'row-reverse': node.style.minWidth,\n 'column': node.style.minHeight,\n 'column-reverse': node.style.minHeight\n }[axis];\n\n var max = {\n 'row': node.style.maxWidth,\n 'row-reverse': node.style.maxWidth,\n 'column': node.style.maxHeight,\n 'column-reverse': node.style.maxHeight\n }[axis];\n\n var boundValue = value;\n if (max !== undefined && max >= 0 && boundValue > max) {\n boundValue = max;\n }\n if (min !== undefined && min >= 0 && boundValue < min) {\n boundValue = min;\n }\n return boundValue;\n }\n\n function fmaxf(a, b) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n // When the user specifically sets a value for width or height\n function setDimensionFromStyle(node, axis) {\n // The parent already computed us a width or height. We just skip it\n if (node.layout[dim[axis]] !== undefined) {\n return;\n }\n // We only run if there's a width or height defined\n if (!isDimDefined(node, axis)) {\n return;\n }\n\n // The dimensions can never be smaller than the padding and border\n node.layout[dim[axis]] = fmaxf(\n boundAxis(node, axis, node.style[dim[axis]]),\n getPaddingAndBorderAxis(node, axis)\n );\n }\n\n function setTrailingPosition(node, child, axis) {\n child.layout[trailing[axis]] = node.layout[dim[axis]] -\n child.layout[dim[axis]] - child.layout[pos[axis]];\n }\n\n // If both left and right are defined, then use left. Otherwise return\n // +left or -right depending on which is defined.\n function getRelativePosition(node, axis) {\n if (node.style[leading[axis]] !== undefined) {\n return getPosition(node, leading[axis]);\n }\n return -getPosition(node, trailing[axis]);\n }\n\n function layoutNodeImpl(node, parentMaxWidth, /*css_direction_t*/parentDirection) {\n var/*css_direction_t*/ direction = resolveDirection(node, parentDirection);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ mainAxis = resolveAxis(getFlexDirection(node), direction);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ crossAxis = getCrossFlexDirection(mainAxis, direction);\n var/*(c)!css_flex_direction_t*//*(java)!int*/ resolvedRowAxis = resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);\n\n // Handle width and height style attributes\n setDimensionFromStyle(node, mainAxis);\n setDimensionFromStyle(node, crossAxis);\n\n // Set the resolved resolution in the node's layout\n node.layout.direction = direction;\n\n // The position is set by the parent, but we need to complete it with a\n // delta composed of the margin and left/top/right/bottom\n node.layout[leading[mainAxis]] += getLeadingMargin(node, mainAxis) +\n getRelativePosition(node, mainAxis);\n node.layout[trailing[mainAxis]] += getTrailingMargin(node, mainAxis) +\n getRelativePosition(node, mainAxis);\n node.layout[leading[crossAxis]] += getLeadingMargin(node, crossAxis) +\n getRelativePosition(node, crossAxis);\n node.layout[trailing[crossAxis]] += getTrailingMargin(node, crossAxis) +\n getRelativePosition(node, crossAxis);\n\n // Inline immutable values from the target node to avoid excessive method\n // invocations during the layout calculation.\n var/*int*/ childCount = node.children.length;\n var/*float*/ paddingAndBorderAxisResolvedRow = getPaddingAndBorderAxis(node, resolvedRowAxis);\n\n if (isMeasureDefined(node)) {\n var/*bool*/ isResolvedRowDimDefined = !isUndefined(node.layout[dim[resolvedRowAxis]]);\n\n var/*float*/ width = CSS_UNDEFINED;\n if (isDimDefined(node, resolvedRowAxis)) {\n width = node.style.width;\n } else if (isResolvedRowDimDefined) {\n width = node.layout[dim[resolvedRowAxis]];\n } else {\n width = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis);\n }\n width -= paddingAndBorderAxisResolvedRow;\n\n // We only need to give a dimension for the text if we haven't got any\n // for it computed yet. It can either be from the style attribute or because\n // the element is flexible.\n var/*bool*/ isRowUndefined = !isDimDefined(node, resolvedRowAxis) && !isResolvedRowDimDefined;\n var/*bool*/ isColumnUndefined = !isDimDefined(node, CSS_FLEX_DIRECTION_COLUMN) &&\n isUndefined(node.layout[dim[CSS_FLEX_DIRECTION_COLUMN]]);\n\n // Let's not measure the text if we already know both dimensions\n if (isRowUndefined || isColumnUndefined) {\n var/*css_dim_t*/ measureDim = node.style.measure(\n /*(c)!node->context,*/\n /*(java)!layoutContext.measureOutput,*/\n width\n );\n if (isRowUndefined) {\n node.layout.width = measureDim.width +\n paddingAndBorderAxisResolvedRow;\n }\n if (isColumnUndefined) {\n node.layout.height = measureDim.height +\n getPaddingAndBorderAxis(node, CSS_FLEX_DIRECTION_COLUMN);\n }\n }\n if (childCount === 0) {\n return;\n }\n }\n\n var/*bool*/ isNodeFlexWrap = isFlexWrap(node);\n\n var/*css_justify_t*/ justifyContent = getJustifyContent(node);\n\n var/*float*/ leadingPaddingAndBorderMain = getLeadingPaddingAndBorder(node, mainAxis);\n var/*float*/ leadingPaddingAndBorderCross = getLeadingPaddingAndBorder(node, crossAxis);\n var/*float*/ paddingAndBorderAxisMain = getPaddingAndBorderAxis(node, mainAxis);\n var/*float*/ paddingAndBorderAxisCross = getPaddingAndBorderAxis(node, crossAxis);\n\n var/*bool*/ isMainDimDefined = !isUndefined(node.layout[dim[mainAxis]]);\n var/*bool*/ isCrossDimDefined = !isUndefined(node.layout[dim[crossAxis]]);\n var/*bool*/ isMainRowDirection = isRowDirection(mainAxis);\n\n var/*int*/ i;\n var/*int*/ ii;\n var/*css_node_t**/ child;\n var/*(c)!css_flex_direction_t*//*(java)!int*/ axis;\n\n var/*css_node_t**/ firstAbsoluteChild = null;\n var/*css_node_t**/ currentAbsoluteChild = null;\n\n var/*float*/ definedMainDim = CSS_UNDEFINED;\n if (isMainDimDefined) {\n definedMainDim = node.layout[dim[mainAxis]] - paddingAndBorderAxisMain;\n }\n\n // We want to execute the next two loops one per line with flex-wrap\n var/*int*/ startLine = 0;\n var/*int*/ endLine = 0;\n // var/*int*/ nextOffset = 0;\n var/*int*/ alreadyComputedNextLayout = 0;\n // We aggregate the total dimensions of the container in those two variables\n var/*float*/ linesCrossDim = 0;\n var/*float*/ linesMainDim = 0;\n var/*int*/ linesCount = 0;\n while (endLine < childCount) {\n // <Loop A> Layout non flexible children and count children by type\n\n // mainContentDim is accumulation of the dimensions and margin of all the\n // non flexible children. This will be used in order to either set the\n // dimensions of the node if none already exist, or to compute the\n // remaining space left for the flexible children.\n var/*float*/ mainContentDim = 0;\n\n // There are three kind of children, non flexible, flexible and absolute.\n // We need to know how many there are in order to distribute the space.\n var/*int*/ flexibleChildrenCount = 0;\n var/*float*/ totalFlexible = 0;\n var/*int*/ nonFlexibleChildrenCount = 0;\n\n // Use the line loop to position children in the main axis for as long\n // as they are using a simple stacking behaviour. Children that are\n // immediately stacked in the initial loop will not be touched again\n // in <Loop C>.\n var/*bool*/ isSimpleStackMain =\n (isMainDimDefined && justifyContent === CSS_JUSTIFY_FLEX_START) ||\n (!isMainDimDefined && justifyContent !== CSS_JUSTIFY_CENTER);\n var/*int*/ firstComplexMain = (isSimpleStackMain ? childCount : startLine);\n\n // Use the initial line loop to position children in the cross axis for\n // as long as they are relatively positioned with alignment STRETCH or\n // FLEX_START. Children that are immediately stacked in the initial loop\n // will not be touched again in <Loop D>.\n var/*bool*/ isSimpleStackCross = true;\n var/*int*/ firstComplexCross = childCount;\n\n var/*css_node_t**/ firstFlexChild = null;\n var/*css_node_t**/ currentFlexChild = null;\n\n var/*float*/ mainDim = leadingPaddingAndBorderMain;\n var/*float*/ crossDim = 0;\n\n var/*float*/ maxWidth;\n for (i = startLine; i < childCount; ++i) {\n child = node.children[i];\n child.lineIndex = linesCount;\n\n child.nextAbsoluteChild = null;\n child.nextFlexChild = null;\n\n var/*css_align_t*/ alignItem = getAlignItem(node, child);\n\n // Pre-fill cross axis dimensions when the child is using stretch before\n // we call the recursive layout pass\n if (alignItem === CSS_ALIGN_STRETCH &&\n getPositionType(child) === CSS_POSITION_RELATIVE &&\n isCrossDimDefined &&\n !isDimDefined(child, crossAxis)) {\n child.layout[dim[crossAxis]] = fmaxf(\n boundAxis(child, crossAxis, node.layout[dim[crossAxis]] -\n paddingAndBorderAxisCross - getMarginAxis(child, crossAxis)),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, crossAxis)\n );\n } else if (getPositionType(child) === CSS_POSITION_ABSOLUTE) {\n // Store a private linked list of absolutely positioned children\n // so that we can efficiently traverse them later.\n if (firstAbsoluteChild === null) {\n firstAbsoluteChild = child;\n }\n if (currentAbsoluteChild !== null) {\n currentAbsoluteChild.nextAbsoluteChild = child;\n }\n currentAbsoluteChild = child;\n\n // Pre-fill dimensions when using absolute position and both offsets for the axis are defined (either both\n // left and right or top and bottom).\n for (ii = 0; ii < 2; ii++) {\n axis = (ii !== 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;\n if (!isUndefined(node.layout[dim[axis]]) &&\n !isDimDefined(child, axis) &&\n isPosDefined(child, leading[axis]) &&\n isPosDefined(child, trailing[axis])) {\n child.layout[dim[axis]] = fmaxf(\n boundAxis(child, axis, node.layout[dim[axis]] -\n getPaddingAndBorderAxis(node, axis) -\n getMarginAxis(child, axis) -\n getPosition(child, leading[axis]) -\n getPosition(child, trailing[axis])),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, axis)\n );\n }\n }\n }\n\n var/*float*/ nextContentDim = 0;\n\n // It only makes sense to consider a child flexible if we have a computed\n // dimension for the node.\n if (isMainDimDefined && isFlex(child)) {\n flexibleChildrenCount++;\n totalFlexible += child.style.flex;\n\n // Store a private linked list of flexible children so that we can\n // efficiently traverse them later.\n if (firstFlexChild === null) {\n firstFlexChild = child;\n }\n if (currentFlexChild !== null) {\n currentFlexChild.nextFlexChild = child;\n }\n currentFlexChild = child;\n\n // Even if we don't know its exact size yet, we already know the padding,\n // border and margin. We'll use this partial information, which represents\n // the smallest possible size for the child, to compute the remaining\n // available space.\n nextContentDim = getPaddingAndBorderAxis(child, mainAxis) +\n getMarginAxis(child, mainAxis);\n\n } else {\n maxWidth = CSS_UNDEFINED;\n if (!isMainRowDirection) {\n if (isDimDefined(node, resolvedRowAxis)) {\n maxWidth = node.layout[dim[resolvedRowAxis]] -\n paddingAndBorderAxisResolvedRow;\n } else {\n maxWidth = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis) -\n paddingAndBorderAxisResolvedRow;\n }\n }\n\n // This is the main recursive call. We layout non flexible children.\n if (alreadyComputedNextLayout === 0) {\n layoutNode(/*(java)!layoutContext, */child, maxWidth, direction);\n }\n\n // Absolute positioned elements do not take part of the layout, so we\n // don't use them to compute mainContentDim\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n nonFlexibleChildrenCount++;\n // At this point we know the final size and margin of the element.\n nextContentDim = getDimWithMargin(child, mainAxis);\n }\n }\n\n // The element we are about to add would make us go to the next line\n if (isNodeFlexWrap &&\n isMainDimDefined &&\n mainContentDim + nextContentDim > definedMainDim &&\n // If there's only one element, then it's bigger than the content\n // and needs its own line\n i !== startLine) {\n nonFlexibleChildrenCount--;\n alreadyComputedNextLayout = 1;\n break;\n }\n\n // Disable simple stacking in the main axis for the current line as\n // we found a non-trivial child. The remaining children will be laid out\n // in <Loop C>.\n if (isSimpleStackMain &&\n (getPositionType(child) !== CSS_POSITION_RELATIVE || isFlex(child))) {\n isSimpleStackMain = false;\n firstComplexMain = i;\n }\n\n // Disable simple stacking in the cross axis for the current line as\n // we found a non-trivial child. The remaining children will be laid out\n // in <Loop D>.\n if (isSimpleStackCross &&\n (getPositionType(child) !== CSS_POSITION_RELATIVE ||\n (alignItem !== CSS_ALIGN_STRETCH && alignItem !== CSS_ALIGN_FLEX_START) ||\n isUndefined(child.layout[dim[crossAxis]]))) {\n isSimpleStackCross = false;\n firstComplexCross = i;\n }\n\n if (isSimpleStackMain) {\n child.layout[pos[mainAxis]] += mainDim;\n if (isMainDimDefined) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n mainDim += getDimWithMargin(child, mainAxis);\n crossDim = fmaxf(crossDim, boundAxis(child, crossAxis, getDimWithMargin(child, crossAxis)));\n }\n\n if (isSimpleStackCross) {\n child.layout[pos[crossAxis]] += linesCrossDim + leadingPaddingAndBorderCross;\n if (isCrossDimDefined) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n\n alreadyComputedNextLayout = 0;\n mainContentDim += nextContentDim;\n endLine = i + 1;\n }\n\n // <Loop B> Layout flexible children and allocate empty space\n\n // In order to position the elements in the main axis, we have two\n // controls. The space between the beginning and the first element\n // and the space between each two elements.\n var/*float*/ leadingMainDim = 0;\n var/*float*/ betweenMainDim = 0;\n\n // The remaining available space that needs to be allocated\n var/*float*/ remainingMainDim = 0;\n if (isMainDimDefined) {\n remainingMainDim = definedMainDim - mainContentDim;\n } else {\n remainingMainDim = fmaxf(mainContentDim, 0) - mainContentDim;\n }\n\n // If there are flexible children in the mix, they are going to fill the\n // remaining space\n if (flexibleChildrenCount !== 0) {\n var/*float*/ flexibleMainDim = remainingMainDim / totalFlexible;\n var/*float*/ baseMainDim;\n var/*float*/ boundMainDim;\n\n // If the flex share of remaining space doesn't meet min/max bounds,\n // remove this child from flex calculations.\n currentFlexChild = firstFlexChild;\n while (currentFlexChild !== null) {\n baseMainDim = flexibleMainDim * currentFlexChild.style.flex +\n getPaddingAndBorderAxis(currentFlexChild, mainAxis);\n boundMainDim = boundAxis(currentFlexChild, mainAxis, baseMainDim);\n\n if (baseMainDim !== boundMainDim) {\n remainingMainDim -= boundMainDim;\n totalFlexible -= currentFlexChild.style.flex;\n }\n\n currentFlexChild = currentFlexChild.nextFlexChild;\n }\n flexibleMainDim = remainingMainDim / totalFlexible;\n\n // The non flexible children can overflow the container, in this case\n // we should just assume that there is no space available.\n if (flexibleMainDim < 0) {\n flexibleMainDim = 0;\n }\n\n currentFlexChild = firstFlexChild;\n while (currentFlexChild !== null) {\n // At this point we know the final size of the element in the main\n // dimension\n currentFlexChild.layout[dim[mainAxis]] = boundAxis(currentFlexChild, mainAxis,\n flexibleMainDim * currentFlexChild.style.flex +\n getPaddingAndBorderAxis(currentFlexChild, mainAxis)\n );\n\n maxWidth = CSS_UNDEFINED;\n if (isDimDefined(node, resolvedRowAxis)) {\n maxWidth = node.layout[dim[resolvedRowAxis]] -\n paddingAndBorderAxisResolvedRow;\n } else if (!isMainRowDirection) {\n maxWidth = parentMaxWidth -\n getMarginAxis(node, resolvedRowAxis) -\n paddingAndBorderAxisResolvedRow;\n }\n\n // And we recursively call the layout algorithm for this child\n layoutNode(/*(java)!layoutContext, */currentFlexChild, maxWidth, direction);\n\n child = currentFlexChild;\n currentFlexChild = currentFlexChild.nextFlexChild;\n child.nextFlexChild = null;\n }\n\n // We use justifyContent to figure out how to allocate the remaining\n // space available\n } else if (justifyContent !== CSS_JUSTIFY_FLEX_START) {\n if (justifyContent === CSS_JUSTIFY_CENTER) {\n leadingMainDim = remainingMainDim / 2;\n } else if (justifyContent === CSS_JUSTIFY_FLEX_END) {\n leadingMainDim = remainingMainDim;\n } else if (justifyContent === CSS_JUSTIFY_SPACE_BETWEEN) {\n remainingMainDim = fmaxf(remainingMainDim, 0);\n if (flexibleChildrenCount + nonFlexibleChildrenCount - 1 !== 0) {\n betweenMainDim = remainingMainDim /\n (flexibleChildrenCount + nonFlexibleChildrenCount - 1);\n } else {\n betweenMainDim = 0;\n }\n } else if (justifyContent === CSS_JUSTIFY_SPACE_AROUND) {\n // Space on the edges is half of the space between elements\n betweenMainDim = remainingMainDim /\n (flexibleChildrenCount + nonFlexibleChildrenCount);\n leadingMainDim = betweenMainDim / 2;\n }\n }\n\n // <Loop C> Position elements in the main axis and compute dimensions\n\n // At this point, all the children have their dimensions set. We need to\n // find their position. In order to do that, we accumulate data in\n // variables that are also useful to compute the total dimensions of the\n // container!\n mainDim += leadingMainDim;\n\n for (i = firstComplexMain; i < endLine; ++i) {\n child = node.children[i];\n\n if (getPositionType(child) === CSS_POSITION_ABSOLUTE &&\n isPosDefined(child, leading[mainAxis])) {\n // In case the child is position absolute and has left/top being\n // defined, we override the position to whatever the user said\n // (and margin/border).\n child.layout[pos[mainAxis]] = getPosition(child, leading[mainAxis]) +\n getLeadingBorder(node, mainAxis) +\n getLeadingMargin(child, mainAxis);\n } else {\n // If the child is position absolute (without top/left) or relative,\n // we put it at the current accumulated offset.\n child.layout[pos[mainAxis]] += mainDim;\n\n // Define the trailing position accordingly.\n if (isMainDimDefined) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n // Now that we placed the element, we need to update the variables\n // We only need to do that for relative elements. Absolute elements\n // do not take part in that phase.\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n // The main dimension is the sum of all the elements dimension plus\n // the spacing.\n mainDim += betweenMainDim + getDimWithMargin(child, mainAxis);\n // The cross dimension is the max of the elements dimension since there\n // can only be one element in that cross dimension.\n crossDim = fmaxf(crossDim, boundAxis(child, crossAxis, getDimWithMargin(child, crossAxis)));\n }\n }\n }\n\n var/*float*/ containerCrossAxis = node.layout[dim[crossAxis]];\n if (!isCrossDimDefined) {\n containerCrossAxis = fmaxf(\n // For the cross dim, we add both sides at the end because the value\n // is aggregate via a max function. Intermediate negative values\n // can mess this computation otherwise\n boundAxis(node, crossAxis, crossDim + paddingAndBorderAxisCross),\n paddingAndBorderAxisCross\n );\n }\n\n // <Loop D> Position elements in the cross axis\n for (i = firstComplexCross; i < endLine; ++i) {\n child = node.children[i];\n\n if (getPositionType(child) === CSS_POSITION_ABSOLUTE &&\n isPosDefined(child, leading[crossAxis])) {\n // In case the child is absolutely positionned and has a\n // top/left/bottom/right being set, we override all the previously\n // computed positions to set it correctly.\n child.layout[pos[crossAxis]] = getPosition(child, leading[crossAxis]) +\n getLeadingBorder(node, crossAxis) +\n getLeadingMargin(child, crossAxis);\n\n } else {\n var/*float*/ leadingCrossDim = leadingPaddingAndBorderCross;\n\n // For a relative children, we're either using alignItems (parent) or\n // alignSelf (child) in order to determine the position in the cross axis\n if (getPositionType(child) === CSS_POSITION_RELATIVE) {\n /*eslint-disable */\n // This variable is intentionally re-defined as the code is transpiled to a block scope language\n var/*css_align_t*/ alignItem = getAlignItem(node, child);\n /*eslint-enable */\n if (alignItem === CSS_ALIGN_STRETCH) {\n // You can only stretch if the dimension has not already been set\n // previously.\n if (isUndefined(child.layout[dim[crossAxis]])) {\n child.layout[dim[crossAxis]] = fmaxf(\n boundAxis(child, crossAxis, containerCrossAxis -\n paddingAndBorderAxisCross - getMarginAxis(child, crossAxis)),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(child, crossAxis)\n );\n }\n } else if (alignItem !== CSS_ALIGN_FLEX_START) {\n // The remaining space between the parent dimensions+padding and child\n // dimensions+margin.\n var/*float*/ remainingCrossDim = containerCrossAxis -\n paddingAndBorderAxisCross - getDimWithMargin(child, crossAxis);\n\n if (alignItem === CSS_ALIGN_CENTER) {\n leadingCrossDim += remainingCrossDim / 2;\n } else { // CSS_ALIGN_FLEX_END\n leadingCrossDim += remainingCrossDim;\n }\n }\n }\n\n // And we apply the position\n child.layout[pos[crossAxis]] += linesCrossDim + leadingCrossDim;\n\n // Define the trailing position accordingly.\n if (isCrossDimDefined) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n }\n\n linesCrossDim += crossDim;\n linesMainDim = fmaxf(linesMainDim, mainDim);\n linesCount += 1;\n startLine = endLine;\n }\n\n // <Loop E>\n //\n // Note(prenaux): More than one line, we need to layout the crossAxis\n // according to alignContent.\n //\n // Note that we could probably remove <Loop D> and handle the one line case\n // here too, but for the moment this is safer since it won't interfere with\n // previously working code.\n //\n // See specs:\n // http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/#layout-algorithm\n // section 9.4\n //\n if (linesCount > 1 && isCrossDimDefined) {\n var/*float*/ nodeCrossAxisInnerSize = node.layout[dim[crossAxis]] -\n paddingAndBorderAxisCross;\n var/*float*/ remainingAlignContentDim = nodeCrossAxisInnerSize - linesCrossDim;\n\n var/*float*/ crossDimLead = 0;\n var/*float*/ currentLead = leadingPaddingAndBorderCross;\n\n var/*css_align_t*/ alignContent = getAlignContent(node);\n if (alignContent === CSS_ALIGN_FLEX_END) {\n currentLead += remainingAlignContentDim;\n } else if (alignContent === CSS_ALIGN_CENTER) {\n currentLead += remainingAlignContentDim / 2;\n } else if (alignContent === CSS_ALIGN_STRETCH) {\n if (nodeCrossAxisInnerSize > linesCrossDim) {\n crossDimLead = (remainingAlignContentDim / linesCount);\n }\n }\n\n var/*int*/ endIndex = 0;\n for (i = 0; i < linesCount; ++i) {\n var/*int*/ startIndex = endIndex;\n\n // compute the line's height and find the endIndex\n var/*float*/ lineHeight = 0;\n for (ii = startIndex; ii < childCount; ++ii) {\n child = node.children[ii];\n if (getPositionType(child) !== CSS_POSITION_RELATIVE) {\n continue;\n }\n if (child.lineIndex !== i) {\n break;\n }\n if (!isUndefined(child.layout[dim[crossAxis]])) {\n lineHeight = fmaxf(\n lineHeight,\n child.layout[dim[crossAxis]] + getMarginAxis(child, crossAxis)\n );\n }\n }\n endIndex = ii;\n lineHeight += crossDimLead;\n\n for (ii = startIndex; ii < endIndex; ++ii) {\n child = node.children[ii];\n if (getPositionType(child) !== CSS_POSITION_RELATIVE) {\n continue;\n }\n\n var/*css_align_t*/ alignContentAlignItem = getAlignItem(node, child);\n if (alignContentAlignItem === CSS_ALIGN_FLEX_START) {\n child.layout[pos[crossAxis]] = currentLead + getLeadingMargin(child, crossAxis);\n } else if (alignContentAlignItem === CSS_ALIGN_FLEX_END) {\n child.layout[pos[crossAxis]] = currentLead + lineHeight - getTrailingMargin(child, crossAxis) - child.layout[dim[crossAxis]];\n } else if (alignContentAlignItem === CSS_ALIGN_CENTER) {\n var/*float*/ childHeight = child.layout[dim[crossAxis]];\n child.layout[pos[crossAxis]] = currentLead + (lineHeight - childHeight) / 2;\n } else if (alignContentAlignItem === CSS_ALIGN_STRETCH) {\n child.layout[pos[crossAxis]] = currentLead + getLeadingMargin(child, crossAxis);\n // TODO(prenaux): Correctly set the height of items with undefined\n // (auto) crossAxis dimension.\n }\n }\n\n currentLead += lineHeight;\n }\n }\n\n var/*bool*/ needsMainTrailingPos = false;\n var/*bool*/ needsCrossTrailingPos = false;\n\n // If the user didn't specify a width or height, and it has not been set\n // by the container, then we set it via the children.\n if (!isMainDimDefined) {\n node.layout[dim[mainAxis]] = fmaxf(\n // We're missing the last padding at this point to get the final\n // dimension\n boundAxis(node, mainAxis, linesMainDim + getTrailingPaddingAndBorder(node, mainAxis)),\n // We can never assign a width smaller than the padding and borders\n paddingAndBorderAxisMain\n );\n\n if (mainAxis === CSS_FLEX_DIRECTION_ROW_REVERSE ||\n mainAxis === CSS_FLEX_DIRECTION_COLUMN_REVERSE) {\n needsMainTrailingPos = true;\n }\n }\n\n if (!isCrossDimDefined) {\n node.layout[dim[crossAxis]] = fmaxf(\n // For the cross dim, we add both sides at the end because the value\n // is aggregate via a max function. Intermediate negative values\n // can mess this computation otherwise\n boundAxis(node, crossAxis, linesCrossDim + paddingAndBorderAxisCross),\n paddingAndBorderAxisCross\n );\n\n if (crossAxis === CSS_FLEX_DIRECTION_ROW_REVERSE ||\n crossAxis === CSS_FLEX_DIRECTION_COLUMN_REVERSE) {\n needsCrossTrailingPos = true;\n }\n }\n\n // <Loop F> Set trailing position if necessary\n if (needsMainTrailingPos || needsCrossTrailingPos) {\n for (i = 0; i < childCount; ++i) {\n child = node.children[i];\n\n if (needsMainTrailingPos) {\n setTrailingPosition(node, child, mainAxis);\n }\n\n if (needsCrossTrailingPos) {\n setTrailingPosition(node, child, crossAxis);\n }\n }\n }\n\n // <Loop G> Calculate dimensions for absolutely positioned elements\n currentAbsoluteChild = firstAbsoluteChild;\n while (currentAbsoluteChild !== null) {\n // Pre-fill dimensions when using absolute position and both offsets for\n // the axis are defined (either both left and right or top and bottom).\n for (ii = 0; ii < 2; ii++) {\n axis = (ii !== 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;\n\n if (!isUndefined(node.layout[dim[axis]]) &&\n !isDimDefined(currentAbsoluteChild, axis) &&\n isPosDefined(currentAbsoluteChild, leading[axis]) &&\n isPosDefined(currentAbsoluteChild, trailing[axis])) {\n currentAbsoluteChild.layout[dim[axis]] = fmaxf(\n boundAxis(currentAbsoluteChild, axis, node.layout[dim[axis]] -\n getBorderAxis(node, axis) -\n getMarginAxis(currentAbsoluteChild, axis) -\n getPosition(currentAbsoluteChild, leading[axis]) -\n getPosition(currentAbsoluteChild, trailing[axis])\n ),\n // You never want to go smaller than padding\n getPaddingAndBorderAxis(currentAbsoluteChild, axis)\n );\n }\n\n if (isPosDefined(currentAbsoluteChild, trailing[axis]) &&\n !isPosDefined(currentAbsoluteChild, leading[axis])) {\n currentAbsoluteChild.layout[leading[axis]] =\n node.layout[dim[axis]] -\n currentAbsoluteChild.layout[dim[axis]] -\n getPosition(currentAbsoluteChild, trailing[axis]);\n }\n }\n\n child = currentAbsoluteChild;\n currentAbsoluteChild = currentAbsoluteChild.nextAbsoluteChild;\n child.nextAbsoluteChild = null;\n }\n }\n\n function layoutNode(node, parentMaxWidth, parentDirection) {\n node.shouldUpdate = true;\n\n var direction = node.style.direction || CSS_DIRECTION_LTR;\n var skipLayout =\n !node.isDirty &&\n node.lastLayout &&\n node.lastLayout.requestedHeight === node.layout.height &&\n node.lastLayout.requestedWidth === node.layout.width &&\n node.lastLayout.parentMaxWidth === parentMaxWidth &&\n node.lastLayout.direction === direction;\n\n if (skipLayout) {\n node.layout.width = node.lastLayout.width;\n node.layout.height = node.lastLayout.height;\n node.layout.top = node.lastLayout.top;\n node.layout.left = node.lastLayout.left;\n } else {\n if (!node.lastLayout) {\n node.lastLayout = {};\n }\n\n node.lastLayout.requestedWidth = node.layout.width;\n node.lastLayout.requestedHeight = node.layout.height;\n node.lastLayout.parentMaxWidth = parentMaxWidth;\n node.lastLayout.direction = direction;\n\n // Reset child layouts\n node.children.forEach(function(child) {\n child.layout.width = undefined;\n child.layout.height = undefined;\n child.layout.top = 0;\n child.layout.left = 0;\n });\n\n layoutNodeImpl(node, parentMaxWidth, parentDirection);\n\n node.lastLayout.width = node.layout.width;\n node.lastLayout.height = node.layout.height;\n node.lastLayout.top = node.layout.top;\n node.lastLayout.left = node.layout.left;\n }\n }\n\n return {\n layoutNodeImpl: layoutNodeImpl,\n computeLayout: layoutNode,\n fillNodes: fillNodes\n };\n})();\n\n// This module export is only used for the purposes of unit testing this file. When\n// the library is packaged this file is included within css-layout.js which forms\n// the public API.\nif (typeof exports === 'object') {\n module.exports = computeLayout;\n}\n\n\n return function(node) {\n /*eslint-disable */\n // disabling ESLint because this code relies on the above include\n computeLayout.fillNodes(node);\n computeLayout.computeLayout(node);\n /*eslint-enable */\n };\n}));\n","\"use strict\";function _interopDefault(e){return e&&\"object\"==typeof e&&\"default\"in e?e.default:e}var React=_interopDefault(require(\"react\")),reactDom=require(\"react-dom\"),computeLayout=_interopDefault(require(\"css-layout\"));function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);\"function\"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){_defineProperty(e,t,r[t])})}return e}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}function _typeof2(e){return(_typeof2=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function _typeof(e){return(_typeof=\"function\"==typeof Symbol&&\"symbol\"===_typeof2(Symbol.iterator)?function(e){return _typeof2(e)}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":_typeof2(e)})(e)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function _possibleConstructorReturn(e,t){return!t||\"object\"!==_typeof(t)&&\"function\"!=typeof t?_assertThisInitialized(e):t}function _getPrototypeOf(e){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function _setPrototypeOf(e,t){return(_setPrototypeOf=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function _inherits(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_setPrototypeOf(e,t)}var Flexbox=function(e){function t(){var e;return _classCallCheck(this,t),(e=_possibleConstructorReturn(this,_getPrototypeOf(t).call(this))).childRefs=[],e.shouldUpdateAgain=!1,e.state={layout:{children:[]}},e}return _inherits(t,React.Component),_createClass(t,[{key:\"componentDidMount\",value:function(){this.forceUpdate()}},{key:\"componentDidUpdate\",value:function(){if(this.shouldUpdateAgain=!this.shouldUpdateAgain,this.shouldUpdateAgain){var e=this.props,t=e.children,r=e.onLayout,n=e.style,o=this.getChildrenMeasured(this.childRefs),i=this.getFlattenedChildren(t),u=this.getChildrenAsMergedStyles(i,o),c=this.getComputedLayout(u,n);r(c),this.setState({layout:c})}}},{key:\"getFlattenedChildren\",value:function(e){return e.filter(function(e){return e}).filter(function(e){return\"string\"!=typeof e}).map(function(e){return Array.isArray(e)?e:[e]}).reduce(function(e,t){return e.concat(t)},[])}},{key:\"getChildrenAsMergedStyles\",value:function(e,t){return t.map(function(t,r){var n=e[r]||{},o=n&&n.props?n.props.style:{};return{style:_objectSpread({},o,{height:t.height||o.height,width:t.width||o.width})}})}},{key:\"getChildrenMeasured\",value:function(e){return e&&e.length?e.map(function(e){return e.getBBox?e.getBBox():reactDom.findDOMNode(e).getBBox()}):[]}},{key:\"getComputedLayout\",value:function(e,t){var r={children:Array.from(e||[]),style:_objectSpread({},t)};return computeLayout(r),r}},{key:\"getLayoutChildren\",value:function(e){return e&&e.children&&e.children.length?e.children:[]}},{key:\"getLayoutAttributesForChild\",value:function(e,t){if(t&&t.layout){var r=t.layout,n=r.left,o=r.top;switch(e.type){case\"circle\":var i=e.props.r||0;return{cx:n+i,cy:o+i};case\"ellipse\":return{cx:n+(e.props.rx||0),cy:o+(e.props.ry||0)};case\"g\":case\"path\":case\"polygon\":case\"polyline\":return{transform:\"translate(\".concat(n,\" \").concat(o,\")\")};default:return{x:n,y:o}}}return{}}},{key:\"render\",value:function(){var e=this,t=this.props,r=t.children,n=t.className,o=t.x,i=t.y,u=this.state.layout;this.childRefs=[];var c=this.getFlattenedChildren(r),a=this.getLayoutChildren(u);return React.createElement(\"g\",{className:n,transform:\"translate(\".concat(o,\" \").concat(i,\")\")},c.map(function(t,r){return React.cloneElement(t,_objectSpread({},t.props,e.getLayoutAttributesForChild(t,a[r]),{key:\"child-\".concat(r),ref:function(t){return t?e.childRefs.push(t):null}}))}))}}]),t}();Flexbox.defaultProps={children:[],className:null,onLayout:function(){},style:{},x:0,y:0},module.exports=Flexbox;\n","import ElementWrapper from \"./elementWrapper\";\r\nimport { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\r\nimport IPosition from \"../../models/position\";\r\nimport IElementProps from \"../../models/IElementProps\";\r\nimport IPort from \"../../models/IPort\";\r\nimport { paperEventEmitterContext } from \"../../contexts/paperEventEmitterContext\";\r\nimport Flatten from \"flatten-js\";\r\nimport { getElementRotationInfo, getRectangleCorners } from \"../../utils/portSlideRailSVGUtil\";\r\nimport { calculateAngleWithOx, getRotatedRectangleCoordinates } from \"../../utils/mathUtil\";\r\nimport { checkSamePosition, findNearestPosition } from \"../../utils/positionUtil\";\r\nimport Text from \"../texts/text\";\r\nimport { SubObjectDirection } from \"../../models/enums/SubObjectDirection\";\r\nimport { checkPositionOnLine } from \"../../utils/lineUtil\";\r\nimport React from \"react\";\r\nimport useSelectionFrame from \"../../hooks/useSelectionFrame\";\r\nimport { PORT_DEFAULT_SIZE, PORT_LABEL_POSITION, PORT_MOVING_OFFSET_THRESHOLD, PORT_PLACEHOLDER_DEFAULT_SIZE, PORT_PLACEHOLDER_DEFAULT_STROKE, PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH } from \"../../utils/constants\";\r\nimport IElementLink from \"../../models/IElementLink\";\r\nimport { Port } from \"../ports/port\";\r\nimport Flexbox from 'react-svg-flexbox'\r\n\r\ninterface IPortState extends IPort {\r\n ref: React.RefObject<SVGSVGElement>\r\n}\r\n\r\nconst Element: React.FC<IElementProps> = (props) => {\r\n const { id, x, y, width, height, portPlaceholderShape, children, container, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize, onClick, onContextMenu, renderShape, onMoved, onPortMoved, onResized, onPortMouseDown, onPortMouseUp, onMouseMove, onMouseLeave, onMouseUp, onMouseUpAtLinkedPortPlaceholder, onTextUpdated } = props;\r\n\r\n const [selectedPort, setSelectedPort] = useState<IPortState>();\r\n const [hoveredPort, setHoveredPort] = useState<IPortState>();\r\n\r\n const [ports, setPorts] = useState<IPortState[]>(props.ports?.map(p => {\r\n return {\r\n ...p,\r\n id: p.id, // clone id to avoid mutation\r\n ref: React.createRef<SVGSVGElement>()\r\n } as IPortState\r\n }) ?? [])\r\n const [someElementLinkStarted, setSomeElementLinkStarted] = useState<boolean>(false)\r\n const [potentialPortPosition, setPotentialPortPosition] = useState<IPosition>()\r\n\r\n const _paperEventEmitterContext = useContext(paperEventEmitterContext);\r\n const elementRef = useRef<SVGSVGElement>(null)\r\n const elementLinkStarted = useRef<IElementLink>()\r\n\r\n //Listen a new port is created, after add new port to ports state\r\n useEffect(() => {\r\n setPorts(prev => props.ports?.map((p, index) => {\r\n let position = p.position;\r\n\r\n //Handle the case when the port is created.\r\n if (!prev[index]?.ref) {\r\n position = normalizePortPosition(position)\r\n onPortMoved?.(p, id, p.position, position)\r\n _paperEventEmitterContext.emitPortMoved(p, id, p.position, position)\r\n }\r\n\r\n return {\r\n ...p,\r\n position,\r\n id: p.id, // clone id to avoid mutation\r\n ref: prev[index]?.ref || React.createRef<SVGSVGElement>()\r\n } as IPortState\r\n }) ?? [])\r\n }, [props.ports?.length])\r\n\r\n //Listen trigger of Delete key, handle delete port is selected\r\n useEffect(() => {\r\n const listener = _paperEventEmitterContext.onCommandDeleteSelectedPort(() => {\r\n if (selectedPort) {\r\n setPorts(prev => prev.filter(p => p.id !== selectedPort.id))\r\n setSelectedPort(undefined)\r\n }\r\n })\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedPort])\r\n\r\n useEffect(() => {\r\n //Listener onMouseDown event on #paper-container\r\n const eventListener = _paperEventEmitterContext.onPaperClicked((ev) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n //listen element resize to update position of the ports by element size.\r\n const eleResizeListener = _paperEventEmitterContext.onElementResized(id, () => {\r\n const newPorts = ports.map(port => {\r\n const newPosition = normalizePortPosition({ x: port.position.x, y: port.position.y })\r\n\r\n //Check port moved\r\n if (port.position.x !== newPosition.x || port.position.y !== newPosition.y) {\r\n onPortMoved?.(port, id, port.position, newPosition)\r\n _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition)\r\n }\r\n\r\n return {\r\n ...port,\r\n position: newPosition\r\n }\r\n })\r\n\r\n setPorts(newPorts)\r\n })\r\n\r\n return () => {\r\n eventListener.off();\r\n eleResizeListener.off();\r\n }\r\n }, [ports, onPortMoved])\r\n\r\n //Listen creating element link started, ended.\r\n useEffect(() => {\r\n const elementStartedListener = _paperEventEmitterContext.onElementLinkStarted((tempLink: IElementLink) => {\r\n elementLinkStarted.current = tempLink;\r\n setSomeElementLinkStarted(true)\r\n\r\n })\r\n\r\n const elementEndedListener = _paperEventEmitterContext.onElementLinkEnded(() => {\r\n elementLinkStarted.current = undefined;\r\n setSomeElementLinkStarted(false)\r\n setPotentialPortPosition(undefined)\r\n setHoveredPort(undefined)\r\n })\r\n\r\n return () => {\r\n elementStartedListener.off()\r\n elementEndedListener.off()\r\n }\r\n }, [])\r\n\r\n //Listen another port is selected\r\n useEffect(() => {\r\n const portSelectedListener = _paperEventEmitterContext.onPortSelected((port, elementId) => {\r\n if (elementId !== id) {\r\n setSelectedPort(undefined)\r\n }\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen text is selected\r\n useEffect(() => {\r\n const textSelectedListener = _paperEventEmitterContext.onTextSelected((text) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n return () => {\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen another element is selected\r\n useEffect(() => {\r\n const portSelectedListener = _paperEventEmitterContext.onElementSelected((element) => {\r\n setSelectedPort(undefined)\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n const handleSelectedPort = (port: IPortState, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n setSelectedPort(port)\r\n _paperEventEmitterContext.emitPortSelected(port, id)\r\n }\r\n\r\n //From one point find another point on the line segment so that the distance between the two points is the shortest.\r\n const findNearestPointOnSegment = (position: IPosition, linePoints: IPosition[]): IPosition => {\r\n const [beginPosition, endPosition] = linePoints;\r\n const point = Flatten.point(position.x, position.y);\r\n\r\n let segment = Flatten.segment(Flatten.point(beginPosition.x, beginPosition.y), Flatten.point(endPosition.x, endPosition.y));\r\n\r\n const [num, segmentFromPointToSegment] = point.distanceTo(segment)\r\n\r\n return {\r\n x: segmentFromPointToSegment.pe.x,\r\n y: segmentFromPointToSegment.pe.y\r\n }\r\n }\r\n\r\n //From 1 point find another point on the line segment so that the distance between 2 points is shortest.\r\n const findNearestProjectedPoint = (position: IPosition, linePositions: IPosition[][]) => {\r\n const possiblePoints = linePositions.map(p => findNearestPointOnSegment(position, p))\r\n\r\n const nearestPoint = findNearestPosition(possiblePoints, position)\r\n return nearestPoint;\r\n }\r\n\r\n //Check if a point is inside a polygon\r\n const checkPointContainsPolygon = (position: IPosition, polygonPoints: IPosition[]): boolean => {\r\n const polygon = new Flatten.Polygon();\r\n polygon.addFace(polygonPoints.map(p => Flatten.point(p.x, p.y)))\r\n\r\n return polygon.contains(Flatten.point(position.x, position.y))\r\n }\r\n\r\n //Normalize a point so that it can lie exactly on an area\r\n const normalizePortPositionOnMoveableAreas = (moveableAreas: IPosition[][], position: IPosition): IPosition | undefined => {\r\n const lines = moveableAreas.filter(area => area.length === 2)\r\n const polygons = moveableAreas.filter(area => area.length >= 3);\r\n\r\n let normalizedPosition;\r\n\r\n //If moveableAreas is lines\r\n if (lines.length > 0) {\r\n const newPosition = findNearestProjectedPoint({ x: position.x, y: position.y }, lines)\r\n\r\n if (newPosition) {\r\n normalizedPosition = newPosition;\r\n }\r\n }\r\n //If moveableAreas is polygons\r\n else if (polygons.length > 0) {\r\n const newPosition = { x: position.x, y: position.y }\r\n const isContainsInPolygons = polygons.some(p => checkPointContainsPolygon(newPosition, p))\r\n\r\n if (isContainsInPolygons) {\r\n normalizedPosition = newPosition;\r\n }\r\n }\r\n\r\n return normalizedPosition;\r\n }\r\n\r\n //Calculate the position of the 4 vertices of a rectangle relative to element\r\n const calculateSlideRailRectSVGPositions = (slideRailSVG: SVGRectElement): IPosition[] => {\r\n let coordinates = getRectangleCorners(slideRailSVG)\r\n const ownerSVG = slideRailSVG.ownerSVGElement;\r\n\r\n const rotationAngle = getElementRotationInfo(ownerSVG!)\r\n\r\n if (rotationAngle !== 0) {\r\n const rotationCenterX = width / 2;\r\n const rotationCenterY = height / 2;\r\n coordinates = getRotatedRectangleCoordinates(coordinates, rotationCenterX, rotationCenterY, rotationAngle)\r\n }\r\n\r\n return coordinates;\r\n }\r\n\r\n const getSlideRailSVG = useCallback((portSlideRailSVGClassName: string) => {\r\n const slideRailSVG = elementRef.current?.querySelector(`.${portSlideRailSVGClassName}`)\r\n return slideRailSVG;\r\n }, [elementRef.current])\r\n\r\n const normalizePortPositionOnSlideRailSVG = (portSlideRailSVGClassName: string, position: IPosition): IPosition | undefined => {\r\n const slideRailSVG = getSlideRailSVG(portSlideRailSVGClassName)\r\n if (!slideRailSVG) return;\r\n\r\n let moveTo;\r\n\r\n //check and get new position if Rect element\r\n if (slideRailSVG instanceof SVGRectElement) {\r\n const [a, b, c, d] = calculateSlideRailRectSVGPositions(slideRailSVG); //Get 4 vertices of rect element\r\n\r\n const moveableAreas = [\r\n [a, b],\r\n [b, c],\r\n [c, d],\r\n [d, a]\r\n ]\r\n\r\n const newPosition = normalizePortPositionOnMoveableAreas(moveableAreas, position)\r\n\r\n if (newPosition) {\r\n moveTo = newPosition\r\n }\r\n } else if (slideRailSVG instanceof SVGCircleElement) { //check and get new position if circle element\r\n const cx = Number(slideRailSVG.getAttribute('cx'))\r\n const cy = Number(slideRailSVG.getAttribute('cy'))\r\n const r = Number(slideRailSVG.getAttribute('r'))\r\n const circle = Flatten.circle(Flatten.point(cx, cy), r)\r\n const [num, segment] = circle.distanceTo(Flatten.point(position.x, position.y))\r\n\r\n if (num <= r) {\r\n moveTo = {\r\n x: segment.ps.x,\r\n y: segment.ps.y,\r\n }\r\n }\r\n }\r\n\r\n return moveTo;\r\n }\r\n\r\n //Normalize port position\r\n const normalizePortPosition = (tempNewPosition: IPosition): IPosition => {\r\n let newPosition;\r\n\r\n if (portMoveableAreas && portMoveableAreas.length > 0) { //If moveable areas is defined\r\n newPosition = normalizePortPositionOnMoveableAreas(portMoveableAreas, tempNewPosition)\r\n }\r\n\r\n else if (portSlideRailSVGClassName) { //If port slide rail svg classname is defined\r\n newPosition = normalizePortPositionOnSlideRailSVG(portSlideRailSVGClassName, tempNewPosition)\r\n }\r\n\r\n return newPosition || tempNewPosition;\r\n }\r\n\r\n const handlePortMove = (offsetX: number, offsetY: number) => {\r\n if (!selectedPort) return;\r\n\r\n const oldPosition = { ...selectedPort.position };\r\n const tempNewPosition = { x: oldPosition.x + offsetX, y: oldPosition.y + offsetY };\r\n\r\n //handle to keep the port always in the correct allowed position\r\n const newPosition = normalizePortPosition(tempNewPosition);\r\n\r\n if (newPosition) {\r\n selectedPort.position = newPosition;\r\n\r\n onPortMoved?.(selectedPort, id, oldPosition, newPosition)\r\n setPorts([...ports])\r\n _paperEventEmitterContext.emitPortMoved(selectedPort, id, oldPosition, newPosition)\r\n }\r\n }\r\n\r\n //Handle when mouse down on port\r\n const handlePortMouseDown = (portId: string, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n const port = ports.find(p => p.id === portId)\r\n\r\n _paperEventEmitterContext.emitPortMouseDown(e, port!, id)\r\n onPortMouseDown?.(e, port!, id)\r\n }\r\n\r\n //Handle when mouse up on port\r\n const handlePortMouseUp = (portId: string, e: React.MouseEvent<SVGElement>) => {\r\n e.stopPropagation();\r\n\r\n const port = ports.find(p => p.id === portId)\r\n\r\n _paperEventEmitterContext.emitPortMouseUp(e, port!, id)\r\n onPortMouseUp?.(e, port!, id)\r\n\r\n //Remove port placeholder if mouse up on port\r\n if (potentialPortPosition) {\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n\r\n //Update state when label of port is moved\r\n const handlePortLabelMoved = (offsetX: number, offsetY: number, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n const labelPos = port.label.position || PORT_LABEL_POSITION\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n const newLabelPosition = {\r\n x: labelPos.x + offsetX,\r\n y: labelPos.y + offsetY\r\n }\r\n\r\n newPorts[index].label!.position = newLabelPosition;\r\n return newPorts\r\n })\r\n }\r\n\r\n //Update state when label of port is resized\r\n const handlePortLabelResized = (width: number, height: number, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n const newLabelSize = {\r\n width,\r\n height\r\n }\r\n\r\n newPorts[index].label!.size = newLabelSize;\r\n return newPorts\r\n })\r\n }\r\n\r\n //Update state when label of port is changed content\r\n const handlePortLabelContentChanged = (newValue: string, port: IPortState, index: number) => {\r\n if (!port.label) return;\r\n\r\n setPorts(prevPorts => {\r\n const newPorts = [...prevPorts]\r\n newPorts[index].label!.content = newValue;\r\n return newPorts\r\n })\r\n }\r\n\r\n\r\n function handleElementMouseMove(ev: React.MouseEvent) {\r\n //ev.stopPropagation(); //Can't use stopPropagation here, because do not create tempLink\r\n\r\n if (someElementLinkStarted && elementRef.current) {\r\n //If an element link is being created, calculate the potential port position when the mouse moves over the element.\r\n if (hoveredPort) {\r\n setPotentialPortPosition(undefined)\r\n return;\r\n }\r\n /* The above code is calculating the relative position of the mouse within a specific\r\n element on the page. It first gets the bounding rectangle of the element using\r\n `getBoundingClientRect()` and the bounding box of the element using `getBBox()`. Then,\r\n it calculates the relative position of the mouse within the element by subtracting the\r\n element's position from the mouse's position. The result is stored in the\r\n `mousePositionOnElement` object, which contains the x and y coordinates of the mouse\r\n relative to the element. */\r\n const elementBounding = elementRef.current.getBoundingClientRect()\r\n const elementBBox = elementRef.current.getBBox();\r\n\r\n //Get relative position of mouse on element\r\n const mousePositionOnElement = {\r\n x: ev.clientX - (elementBounding.left - elementBBox.x),\r\n y: ev.clientY - (elementBounding.top - elementBBox.y),\r\n }\r\n\r\n const tempPotentialPortPosition = normalizePortPosition(mousePositionOnElement)\r\n\r\n //Kiểm tra điểm potential(Điểm này nằm trên portMoveableAreas) có nằm trong phạm vi bán kính của vị trí con trỏ chuột không\r\n //Nếu có thì cho nó là potentialPortPosition và hiện portPlaceholderShape\r\n //Nếu không thì bỏ qua hoặc xóa potentialPortPosition.\r\n if (checkSamePosition(mousePositionOnElement, tempPotentialPortPosition, 5)) {\r\n setPotentialPortPosition(tempPotentialPortPosition)\r\n } else {\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n }\r\n\r\n function handleElementMouseLeave(ev: React.MouseEvent) {\r\n ev.stopPropagation()\r\n\r\n if (someElementLinkStarted) { //If an element link is being created, clear the placeholder when the mouse leaves the element.\r\n setPotentialPortPosition(undefined)\r\n }\r\n }\r\n\r\n const handleElementMouseUp = (ev: React.MouseEvent) => {\r\n ev.stopPropagation();\r\n\r\n //If an element link is being created, trigger onMouseUpAtLinkedPortPlaceholder when the mouse up the element.\r\n if (potentialPortPosition && elementLinkStarted.current) {\r\n const newElementLink: IElementLink = {\r\n ...elementLinkStarted.current,\r\n tempTargetPosition: undefined,\r\n }\r\n\r\n onMouseUpAtLinkedPortPlaceholder?.(newElementLink, potentialPortPosition)\r\n elementLinkStarted.current = undefined;\r\n }\r\n }\r\n\r\n //Get rotate angle of port by port direction is defined.\r\n const rotatePort = useCallback((x: number, y: number): number => {\r\n // console.info('calculating port rotation', x, y)\r\n\r\n if (!portSlideRailSVGClassName) return 0;\r\n\r\n const slideRailSVG = getSlideRailSVG(portSlideRailSVGClassName)\r\n if (!slideRailSVG) return 0;\r\n\r\n let rotationAngle: number = 0;\r\n\r\n //Standardize the port position to be in the correct position\r\n const normalizedPosition = normalizePortPosition({ x, y })\r\n\r\n switch (portDirection) {\r\n case SubObjectDirection.Radial:\r\n const center = {\r\n x: width / 2,\r\n y: height / 2\r\n }\r\n\r\n rotationAngle = calculateAngleWithOx(normalizedPosition, center)\r\n break;\r\n\r\n case SubObjectDirection.PerpendicularInward:\r\n //0,90,180,270;\r\n //Hardcode with port move on rect svg case.\r\n const [a, b, c, d] = calculateSlideRailRectSVGPositions(slideRailSVG as SVGRectElement)\r\n\r\n const rotationAngleOfElement = getElementRotationInfo((slideRailSVG as SVGRectElement).ownerSVGElement!)\r\n\r\n if (checkPositionOnLine(normalizedPosition, [a, b])) { //Check position of port on top segment\r\n rotationAngle = 90;\r\n } else if (checkPositionOnLine(normalizedPosition, [b, c])) { //Check position of port on right segment\r\n rotationAngle = 180;\r\n } else if (checkPositionOnLine(normalizedPosition, [c, d])) { //Check position of port on bottom segment\r\n rotationAngle = 270;\r\n } else if (checkPositionOnLine(normalizedPosition, [d, a])) { //Check position of port on left segment\r\n rotationAngle = 0;\r\n }\r\n\r\n rotationAngle += rotationAngleOfElement;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return rotationAngle;\r\n }, [portSlideRailSVGClassName, portDirection, getSlideRailSVG])\r\n\r\n const renderedShape = useMemo(() => {\r\n if (renderShape) return renderShape(props);\r\n return null;\r\n }, [props])\r\n\r\n\r\n //Re-render port again after rendered to automation rotate port\r\n //Because elementRef.current equals null in first render so automation rotate port is incorrect.\r\n //TODO: check if this is still needed -> Still needed\r\n useLayoutEffect(() => {\r\n if (elementRef.current) {\r\n setPorts(prev => [...prev])\r\n }\r\n }, [])\r\n\r\n\r\n //use selection frame\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: selectedPort?.ref.current || undefined,\r\n resizability: {\r\n enabled: false,\r\n keepRatio: false\r\n },\r\n // width: selectedPort?.size.width,\r\n // height: selectedPort?.size.height,\r\n movingOffsetThreshold: PORT_MOVING_OFFSET_THRESHOLD,\r\n onMove: handlePortMove\r\n });\r\n\r\n useSelectionFrame({\r\n container: container as HTMLElement,\r\n targetSVGElement: hoveredPort?.ref.current || undefined,\r\n resizability: {\r\n enabled: false,\r\n keepRatio: false\r\n },\r\n });\r\n\r\n return (\r\n <ElementWrapper\r\n ref={elementRef}\r\n x={x}\r\n y={y}\r\n onClick={(e) => onClick ? onClick(id, e, elementRef.current) : true}\r\n onMouseMove={handleElementMouseMove}\r\n onMouseLeave={handleElementMouseLeave}\r\n onMouseUp={handleElementMouseUp}\r\n onContextMenu={(e) => onContextMenu ? onContextMenu(id, e, elementRef.current) : true}\r\n >\r\n {/* Shape of the element */}\r\n {renderedShape}\r\n {potentialPortPosition && (\r\n portPlaceholderShape\r\n ? <svg\r\n x={potentialPortPosition.x}\r\n y={potentialPortPosition.y}\r\n >\r\n {portPlaceholderShape}\r\n </svg>\r\n : <rect\r\n x={potentialPortPosition.x - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2}\r\n y={potentialPortPosition.y - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2}\r\n width={PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH}\r\n height={PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH}\r\n rx={PORT_PLACEHOLDER_DEFAULT_SIZE}\r\n ry={PORT_PLACEHOLDER_DEFAULT_SIZE}\r\n stroke={PORT_PLACEHOLDER_DEFAULT_STROKE}\r\n fill=\"none\"\r\n strokeWidth={3}\r\n />)}\r\n {ports?.map((p, index) => {\r\n return <Port\r\n key={p.id}\r\n ref={p.ref}\r\n id={p.id}\r\n x={p.position.x}\r\n y={p.position.y}\r\n width={p.size?.width ?? defaultPortSize ?? PORT_DEFAULT_SIZE}\r\n height={p.size?.height ?? defaultPortSize ?? PORT_DEFAULT_SIZE}\r\n container={container}\r\n // rotation={rotatePort(p)}\r\n calculateRotationAngle={rotatePort}\r\n\r\n label={p.label}\r\n onPortLabelMoved={(x, y) => handlePortLabelMoved(x, y, p, index)}\r\n onPortLabelResized={(w, h) => handlePortLabelResized(w, h, p, index)}\r\n onPortLabelContentChanged={(ev, newValue) => handlePortLabelContentChanged(newValue, p, index)}\r\n\r\n onSelected={(portId, event) => handleSelectedPort(p, event)}\r\n onMouseDown={handlePortMouseDown}\r\n onMouseUp={handlePortMouseUp}\r\n onMouseMove={() => {\r\n if (someElementLinkStarted) setHoveredPort(p)\r\n }}\r\n // onMouseEnter={() => {\r\n // if (someElementLinkStarted) setHoveredPort(p)\r\n // }}\r\n\r\n onMouseLeave={() => {\r\n console.log('onMouseLeave')\r\n if (someElementLinkStarted) setHoveredPort(undefined)\r\n }}\r\n\r\n renderShape={p.renderShape}\r\n />\r\n })}\r\n <Flexbox\r\n className={textsPlaceHolderClassName}\r\n style={textsPlaceHolderFlexStyle}\r\n x={textsPlaceHolderFlexboxPosition?.x}\r\n y={textsPlaceHolderFlexboxPosition?.y}\r\n >\r\n {texts?.map((t, index) => {\r\n return <Text\r\n id={t.id}\r\n key={index}\r\n content={t.content}\r\n x={t.position?.x}\r\n y={t.position?.y}\r\n width={t.size.width}\r\n height={t.size.height}\r\n align={t.align}\r\n fontSize={t.fontSize}\r\n border={t.border}\r\n container={container}\r\n style={t.style}\r\n onContentChanged={(ev, newContent) => onTextUpdated?.(t.id, newContent)}\r\n />\r\n })}\r\n </Flexbox>\r\n {children}\r\n </ElementWrapper>\r\n );\r\n};\r\n\r\nexport default Element;","import React, { useEffect, useRef, useState } from \"react\"\r\n\r\n\r\nconst createRect = (x: number, y: number, width: number, height: number, strokeWidth: number, transformOrigin: string, transform?: string | null) => {\r\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\r\n rect.setAttribute('x', x.toString())\r\n rect.setAttribute('y', y.toString())\r\n rect.setAttribute('width', width.toString())\r\n rect.setAttribute('height', height.toString())\r\n rect.setAttribute('fill', 'none')\r\n rect.setAttribute('stroke', 'green')\r\n rect.setAttribute('stroke-width', strokeWidth.toString())\r\n transform && rect.setAttribute('transform', transform)\r\n rect.style.transformBox = 'content-box';\r\n rect.style.transformOrigin = transformOrigin\r\n\r\n return rect;\r\n}\r\ninterface IBBoxDebuggerProps {\r\n elementSVG: SVGSVGElement | null;\r\n}\r\n\r\nexport default function BBoxDebugger({\r\n elementSVG\r\n}: IBBoxDebuggerProps) {\r\n const [isTurnOn, setIsTurnOn] = useState<boolean>(false)\r\n const displayedBBoxDebug = useRef<SVGRectElement[]>([])\r\n\r\n useEffect(() => {\r\n const keyPress = (ev: KeyboardEvent) => {\r\n if (ev.ctrlKey && ev.key === 'b') {\r\n setIsTurnOn(prev => !prev)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', keyPress)\r\n\r\n return () => {\r\n window.removeEventListener('keydown', keyPress)\r\n }\r\n }, [])\r\n\r\n //Get all child elements of current element\r\n const getSVGChild = (svgElement: SVGGraphicsElement): SVGGraphicsElement[] => {\r\n return Array.from(svgElement.childNodes.values()) as SVGGraphicsElement[];\r\n }\r\n\r\n const getListChildrenAndGroupSameLevel = (svgElement: SVGGraphicsElement): SVGGraphicsElement[][] => {\r\n const result = [[svgElement]]; //svg elements is grouped by level;\r\n\r\n let childArray = [svgElement]\r\n do {\r\n const childChild = childArray.reduce<SVGGraphicsElement[]>((acc, item) => {\r\n const child = getSVGChild(item as SVGGraphicsElement)\r\n return acc.concat(child)\r\n }, [])\r\n\r\n if (childChild.length === 0) break;\r\n\r\n result.push(childChild)\r\n childArray = childChild;\r\n } while (childArray.length > 0);\r\n\r\n return result\r\n }\r\n\r\n //Remove all bbox debugger is shown.\r\n const clearBBoxDebugger = (displayedBBox: SVGRectElement[]) => {\r\n while (displayedBBox.length > 0) {\r\n const ele = displayedBBox.pop()\r\n ele?.remove()\r\n }\r\n }\r\n\r\n //Render bbox debugger for element\r\n const createBBoxDebugger = (element: SVGGraphicsElement): SVGRectElement => {\r\n let container;\r\n\r\n if (element instanceof SVGSVGElement) {\r\n container = element\r\n } else {\r\n container = element.ownerSVGElement\r\n }\r\n\r\n const bbox = element.getBBox();\r\n const strokeWidth = Number(element.getAttribute('stroke-width')) || 4\r\n const transform = element.getAttribute('transform')\r\n const transformOrigin = element.style.transformOrigin;\r\n const rect = createRect(bbox.x, bbox.y, bbox.width, bbox.height, strokeWidth, transformOrigin, transform)\r\n\r\n container?.appendChild(rect)\r\n\r\n return rect;\r\n }\r\n\r\n //Displays the debugger bboxes for elements in sequence by level.\r\n const showBBoxDebugger = (listChildrenGroupByLevel: SVGGraphicsElement[][]) => {\r\n let increment = 1;\r\n let currentIndex = 0;\r\n\r\n const intervalId = setInterval(() => {\r\n //Clear bbox debugger of previous level\r\n clearBBoxDebugger(displayedBBoxDebug.current)\r\n\r\n if (currentIndex === listChildrenGroupByLevel.length) { //If at the last level, run back\r\n increment = -1;\r\n currentIndex = listChildrenGroupByLevel.length - 2;\r\n return;\r\n } else if (currentIndex === -1) { //If on first level, run to next level\r\n increment = 1;\r\n currentIndex = 0;\r\n return;\r\n }\r\n\r\n const svgChildCurrentLevel = listChildrenGroupByLevel[currentIndex];\r\n\r\n svgChildCurrentLevel.forEach(svg => {\r\n const rect = createBBoxDebugger(svg);\r\n displayedBBoxDebug.current.push(rect)\r\n })\r\n\r\n currentIndex += increment;\r\n }, 1000)\r\n\r\n return intervalId;\r\n }\r\n\r\n useEffect(() => {\r\n if (!isTurnOn || !elementSVG) return;\r\n\r\n const listChildrenGroupByLevel = getListChildrenAndGroupSameLevel(elementSVG);\r\n\r\n const intervalId = showBBoxDebugger(listChildrenGroupByLevel)\r\n\r\n return () => {\r\n //Run clear function on svg element\r\n clearInterval(intervalId)\r\n\r\n //Clear all bbox debugger when debug mode or elementSVG is changed\r\n clearBBoxDebugger(displayedBBoxDebug.current)\r\n }\r\n }, [isTurnOn, elementSVG])\r\n\r\n return (\r\n <div\r\n style={{\r\n position: 'fixed',\r\n top: 20,\r\n right: 20\r\n }}\r\n >\r\n <div\r\n style={{\r\n backgroundColor: 'white',\r\n boxShadow: '0px 1px 4px 1px',\r\n borderRadius: 4,\r\n padding: 4,\r\n fontSize: 18,\r\n fontWeight: 500\r\n }}\r\n >\r\n Debugger mode: {isTurnOn ? 'ON' : 'OFF'}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import React, { useEffect, useRef, useState } from \"react\"\r\nimport IElementLink from \"../models/IElementLink\"\r\n\r\nconst createDebuggerPoint = (cx: number, cy: number) => {\r\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\r\n circle.setAttribute('cx', cx.toString())\r\n circle.setAttribute('cy', cy.toString())\r\n circle.setAttribute('r', '4')\r\n circle.setAttribute('fill', 'none')\r\n circle.setAttribute('stroke', 'red')\r\n circle.setAttribute('stroke-width', '2')\r\n\r\n return circle;\r\n}\r\n\r\ninterface ILinkDebuggerProps {\r\n links: IElementLink[];\r\n svgContainer: SVGSVGElement;\r\n}\r\nconst LinkDebugger: React.FC<ILinkDebuggerProps> = ({\r\n links,\r\n svgContainer\r\n}) => {\r\n const [isTurnOn, setIsTurnOn] = useState<boolean>(false)\r\n const displayedDebuggerPoint = useRef<SVGCircleElement[]>([])\r\n\r\n useEffect(() => {\r\n const keyPress = (ev: KeyboardEvent) => {\r\n if (ev.ctrlKey && ev.key === 'l') {\r\n setIsTurnOn(prev => !prev)\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', keyPress)\r\n\r\n return () => {\r\n window.removeEventListener('keydown', keyPress)\r\n }\r\n }, [])\r\n\r\n const clearDebuggerPoint = () => {\r\n while (displayedDebuggerPoint.current.length > 0) {\r\n const ele = displayedDebuggerPoint.current.pop()\r\n ele?.remove()\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (isTurnOn) {\r\n links.forEach(link => {\r\n link.points?.forEach(p => {\r\n const debuggerPoint = createDebuggerPoint(p.x, p.y)\r\n displayedDebuggerPoint.current.push(debuggerPoint)\r\n svgContainer.appendChild(debuggerPoint)\r\n })\r\n })\r\n }\r\n\r\n return () => {\r\n clearDebuggerPoint()\r\n }\r\n }, [isTurnOn, links])\r\n\r\n return (\r\n <div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default LinkDebugger;","import { useContext, useEffect } from \"react\";\r\nimport { paperEventEmitterContext } from \"../contexts/paperEventEmitterContext\";\r\n\r\ninterface IUseKeyboardCommands {\r\n element?: Element | null;\r\n}\r\n\r\nexport default function useKeyboardCommands({\r\n element,\r\n}: IUseKeyboardCommands) {\r\n const {\r\n emitCommandDeleteSelectedElement,\r\n emitCommandDeleteSelectedLink,\r\n emitCommandDeleteSelectedPort,\r\n emitCommandDeleteSelectedText\r\n } = useContext(paperEventEmitterContext);\r\n\r\n useEffect(() => {\r\n const callback = (ev: Event) => {\r\n const keyboardEv: React.KeyboardEvent<Element> = ev as any;\r\n\r\n if (keyboardEv.key === \"Delete\") {\r\n emitCommandDeleteSelectedElement()\r\n emitCommandDeleteSelectedLink()\r\n emitCommandDeleteSelectedPort()\r\n emitCommandDeleteSelectedText()\r\n }\r\n }\r\n\r\n const _element = element || window;\r\n _element.addEventListener('keydown', callback)\r\n\r\n return () => {\r\n _element.removeEventListener('keydown', callback)\r\n }\r\n }, [element])\r\n}\r\n","import React, { EventHandler, useCallback, useContext, useEffect, useState } from 'react';\r\nimport IElement from '../models/IElement';\r\nimport Ruler from './viewControls/ruler';\r\nimport Element from './elements/element';\r\nimport { paperEventEmitterContext } from '../contexts/paperEventEmitterContext';\r\nimport IElementLink from '../models/IElementLink';\r\nimport ElementLink from './links/elementLink';\r\nimport IPosition from '../models/position';\r\nimport IPort from '../models/IPort';\r\nimport { generateSubstitutePosition, getFirstIntersection } from '../utils/positionUtil';\r\nimport BBoxDebugger from './BBoxDebugger';\r\nimport { LINK_LABEL_POSITION_FROM_LINK_MID_POINT, LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT, LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT, MAX_LINK_KNOT_COUNT } from '../utils/constants';\r\nimport LinkDebugger from './LinkDebugger';\r\nimport useSelectionFrame from '../hooks/useSelectionFrame';\r\nimport useKeyboardCommands from '../hooks/useKeyboardCommands';\r\nimport IText, { IPaperText } from '../models/IText';\r\nimport Text from './texts/text';\r\nimport ISize from '../models/size';\r\nimport generateUniqueId from '../utils/generateUniqueId';\r\n\r\nfunction convertElementsToTree(elements: IElementState[]): IElementInTreeState[] {\r\n //Find child elements in the child elements, that is possible child of element, then return element with child of it.\r\n function findChildElementsOfNode(elementNodeInTree: IElementInTreeState, possibleChildElements: IElementInTreeState[]): IElementInTreeState {\r\n if (possibleChildElements.length === 0) {\r\n elementNodeInTree.childrenElements = undefined;\r\n return elementNodeInTree\r\n };\r\n\r\n const foundChildElements = possibleChildElements.filter(ele => ele.parentElement?.id === elementNodeInTree.id);\r\n const orphanedElements = possibleChildElements.filter(ele => ele.parentElement?.id !== elementNodeInTree.id);\r\n\r\n const childElementsWithChild = foundChildElements.map(_elementNodeInTree => {\r\n const relativePosition = {\r\n x: _elementNodeInTree.position.x - elementNodeInTree.position.x,\r\n y: _elementNodeInTree.position.y - elementNodeInTree.position.y,\r\n }\r\n\r\n _elementNodeInTree.relativePosition = relativePosition;\r\n const newNode = findChildElementsOfNode(_elementNodeInTree, orphanedElements)\r\n return newNode;\r\n })\r\n\r\n elementNodeInTree.childrenElements = childElementsWithChild;\r\n return elementNodeInTree;\r\n }\r\n\r\n const parentElms = elements.filter(e => !e.parentElement);\r\n const childElms = elements.filter(e => e.parentElement);\r\n\r\n const parsedElementsInTree = parentElms.map(ele => {\r\n ele.relativePosition = ele.position;\r\n const eleWithChild = findChildElementsOfNode(ele, childElms);\r\n return eleWithChild;\r\n })\r\n\r\n return parsedElementsInTree;\r\n}\r\n\r\ninterface PaperProps {\r\n size: { width: number, height: number };\r\n elements: IElement[];\r\n links?: IElementLink[];\r\n texts: IPaperText[];\r\n\r\n onPaperClicked?: (position: IPosition) => void;\r\n onPortMoved?: (position: IPosition, port: IPort, element: IElement) => void;\r\n onPortSelected?: (port: IPort, element: IElement) => void;\r\n onElementContextMenu?: (element: IElement, mouseEvent: React.MouseEvent<SVGElement>) => void;\r\n onElementMoved?: (position: IPosition, element: IElement, index: number) => void;\r\n onElementResized?: (size: ISize, element: IElement, index: number) => void;\r\n onElementSelected?: (element: IElement) => void;\r\n onLinkSelected?: (link: IElementLink) => void;\r\n onTextSelected?: (text: IText) => void;\r\n\r\n onCreatingPortByLinking?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;\r\n onCreatingLink?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;\r\n}\r\n\r\ninterface IElementState extends IElement {\r\n relativePosition?: IPosition;\r\n}\r\n\r\ninterface IElementInTreeState extends IElementState {\r\n childrenElements?: IElementInTreeState[];\r\n}\r\n\r\nconst Paper: React.FC<PaperProps> = (props) => {\r\n const [elements, setElements] = React.useState<IElementState[]>(props.elements);\r\n const [elementsInTree, setElementsInTree] = React.useState<IElementInTreeState[]>([]);\r\n\r\n const [selectedElement, setSelectedElement] = React.useState<IElementInTreeState>();\r\n\r\n const [links, setLinks] = useState<IElementLink[]>(props.links ?? [])\r\n const [selectedLink, setSelectedLink] = useState<IElementLink>();\r\n const [tempLink, setTempLink] = useState<IElementLink>()\r\n\r\n const [texts, setTexts] = useState<IPaperText[]>(props.texts)\r\n const [selectedText, setSelectedText] = useState<IPaperText>()\r\n\r\n const [selectedElementSVG, setSelectedElementSVG] = useState<SVGSVGElement | null>(null)\r\n const [mouseDownedOnPaper, setMouseDownedOnPaper] = React.useState<boolean>(false);\r\n\r\n const paperEventEmitter = useContext(paperEventEmitterContext)\r\n\r\n const paperContainerRef = React.useRef<SVGSVGElement>(null);\r\n\r\n useKeyboardCommands({\r\n element: paperContainerRef.current as Element\r\n })\r\n\r\n const updateElementsTree = () => {\r\n const parsedElementsInTree = convertElementsToTree(elements)\r\n setElementsInTree(parsedElementsInTree)\r\n }\r\n\r\n //Listen text is selected\r\n useEffect(() => {\r\n const textSelectedListener = paperEventEmitter.onTextSelected((text) => {\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n setSelectedLink(undefined)\r\n\r\n //broadcast selected text to parent component\r\n props.onTextSelected?.(text);\r\n })\r\n\r\n return () => {\r\n textSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n //Listen port is selected\r\n useEffect(() => {\r\n const portSelectedListener = paperEventEmitter.onPortSelected((port, elementId) => {\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n setSelectedLink(undefined)\r\n \r\n //broadcast selected port to parent component\r\n const element = elements.find(e => e.id === elementId);\r\n if (element) {\r\n props.onPortSelected?.(port, element)\r\n }\r\n })\r\n\r\n return () => {\r\n portSelectedListener.off();\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n //Listen parent of elements changed, then update elements tree\r\n const parentChangedCancelers = elements.map(element => {\r\n return element.onParentChanged?.((newPa, oldPa) => {\r\n updateElementsTree();\r\n })\r\n })\r\n\r\n //Listen a new port added, then re-render the element component\r\n const addedPortCancelers = elements.map(element => {\r\n return element.onAddedPort?.((newPort) => {\r\n\r\n //Set state to re-render component\r\n setElements(prev => prev.map(ele => {\r\n if (ele.id === element.id) {\r\n ele.ports = [...(ele.ports || [])]\r\n }\r\n\r\n return ele\r\n }))\r\n })\r\n })\r\n\r\n return () => {\r\n parentChangedCancelers.forEach(canceller => canceller?.())\r\n addedPortCancelers.forEach(canceller => canceller())\r\n }\r\n }, elements)\r\n\r\n //Update elements tree when length of elements change\r\n useEffect(() => {\r\n updateElementsTree();\r\n }, [elements.length])\r\n\r\n //Get all child elements of the deleted element\r\n const getDeletedChildElements = (deletedElement: IElementInTreeState): IElement[] => {\r\n if (!deletedElement.childrenElements) return [];\r\n\r\n const childElms = deletedElement.childrenElements;\r\n\r\n const childOfChildElements = childElms.reduce((acc, ele) => {\r\n return [...acc, ...getDeletedChildElements(ele)]\r\n }, [] as IElement[])\r\n\r\n return [...childElms, ...childOfChildElements]\r\n }\r\n\r\n //Listen command delete selected for element\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedElement(() => {\r\n if (selectedElement) {\r\n const deletedChildElements = getDeletedChildElements(selectedElement)\r\n\r\n const deletedElementIds = [...deletedChildElements, selectedElement].map(e => e.id);\r\n\r\n setElements(prev => prev.filter(e => !deletedElementIds.includes(e.id)))\r\n setLinks(prevLinks => prevLinks.filter(l => !deletedElementIds.includes(l.sourceElement.id) && !deletedElementIds.includes(l.targetElement!.id)))\r\n setSelectedElement(undefined)\r\n setSelectedElementSVG(null)\r\n }\r\n })\r\n\r\n //broadcast selected element to parent component\r\n if (selectedElement) {\r\n props.onElementSelected?.(selectedElement);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedElement])\r\n\r\n //Listen command delete selected for link\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedLink(() => {\r\n if (selectedLink) {\r\n setLinks(prev => prev.filter(l => l.id !== selectedLink.id))\r\n setSelectedLink(undefined)\r\n }\r\n })\r\n \r\n //broadcast selected link to parent component\r\n if (selectedLink) {\r\n props.onLinkSelected?.(selectedLink);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedLink])\r\n\r\n //Listen command delete selected for Text\r\n useEffect(() => {\r\n const listener = paperEventEmitter.onCommandDeleteSelectedText(() => {\r\n if (selectedText) {\r\n setTexts(prev => prev.filter(t => t.id !== selectedText.id))\r\n setSelectedText(undefined)\r\n }\r\n })\r\n\r\n //broadcast selected text to parent component\r\n if (selectedText) {\r\n props.onTextSelected?.(selectedText);\r\n }\r\n\r\n return () => {\r\n listener.off()\r\n }\r\n }, [selectedText])\r\n\r\n const size = props.size;\r\n\r\n //Automatically add points on the link so that the link does not cross elements, default maximum 10 points\r\n const automationAddPointsToLink = (eleLink: IElementLink, limitPoint: number = 10) => {\r\n const { sourceElement, sourcePort, targetElement, targetPort } = eleLink;\r\n let sourcePosition = {\r\n x: sourceElement.position.x + sourcePort.position.x,\r\n y: sourceElement.position.y + sourcePort.position.y\r\n }\r\n\r\n const targetPosition = {\r\n x: targetElement!.position.x + targetPort!.position.x,\r\n y: targetElement!.position.y + targetPort!.position.y\r\n }\r\n\r\n let numberOfPoints = 0;\r\n\r\n //create points between the start and end points, to create a line segment that passes through the points without intersecting the elements\r\n function generatePositions(sourcePosition: IPosition, targetPosition: IPosition, elements: IElement[]): IPosition[] {\r\n const firstIntersection = getFirstIntersection(sourcePosition, targetPosition, elements)\r\n\r\n //If there is no intersection point, then the line connecting the two points does not intersect any element.\r\n if (!firstIntersection || limitPoint === numberOfPoints) return [];\r\n\r\n const { nearestIntersection, intersectionPointsList, element: intersectedElement } = firstIntersection;\r\n\r\n //Calculate to create a replacement point\r\n const replacementPosition = generateSubstitutePosition(nearestIntersection, targetPosition, intersectedElement)\r\n\r\n //Increases the number of points found by 1 \r\n numberOfPoints += 1;\r\n\r\n //Create points with the starting point being the sourcePosition and the ending point being the newly created point\r\n const prependedPoints = generatePositions(sourcePosition, replacementPosition, elements)\r\n\r\n //Create points with the starting point being the new newly created point and the ending point being the targetPosition\r\n const appendedPoints = generatePositions(replacementPosition, targetPosition, elements)\r\n\r\n return [...prependedPoints, replacementPosition, ...appendedPoints]\r\n }\r\n\r\n const points = generatePositions(sourcePosition, targetPosition, elements)\r\n\r\n return {\r\n ...eleLink,\r\n points: points,\r\n }\r\n }\r\n\r\n const handlePaperMouseMove = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n\r\n //if there is a temp link, update the temp target point\r\n if (tempLink) {\r\n const { currentTarget } = ev;\r\n\r\n //get offset x,y of the temp target point relative paper container\r\n const rect = currentTarget.getBoundingClientRect();\r\n const offsetX = ev.clientX - rect.left;\r\n const offsetY = ev.clientY - rect.top;\r\n\r\n const sourcePosition = {\r\n x: tempLink.sourceElement.position.x + tempLink.sourcePort.position.x,\r\n y: tempLink.sourceElement.position.y + tempLink.sourcePort.position.y\r\n }\r\n\r\n //reduce the position of offset to the direction of the source point 1 unit to avoid the link to reach the current mouse position\r\n const tempTargetPosition = {\r\n x: offsetX - (offsetX > sourcePosition.x ? 1 : -1),\r\n y: offsetY - (offsetY > sourcePosition.y ? 1 : -1)\r\n }\r\n\r\n setTempLink(prev => ({\r\n ...prev!,\r\n tempTargetPosition: tempTargetPosition\r\n }))\r\n }\r\n }\r\n\r\n const handleMouseDownOnPaper = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n setMouseDownedOnPaper(true);\r\n\r\n props.onPaperClicked?.({\r\n x: ev.clientX,\r\n y: ev.clientY\r\n })\r\n paperEventEmitter.emitPaperClicked(ev)\r\n }\r\n\r\n const handleMouseUpOnPaper = (ev: React.MouseEvent<SVGSVGElement>) => {\r\n if (mouseDownedOnPaper) {\r\n setSelectedElement(undefined);\r\n setSelectedElementSVG(null)\r\n }\r\n\r\n //clear temp link if exists\r\n if (tempLink) {\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n //Clear selected text\r\n if (selectedText) {\r\n setSelectedText(undefined)\r\n }\r\n\r\n setMouseDownedOnPaper(false);\r\n }\r\n\r\n const handlePathChange = useCallback((path: string, id: string) => {\r\n //Update path of element link, that changed\r\n setLinks(prevLinks => {\r\n const updatedLinkIndex = prevLinks.findIndex(l => l.id === id)\r\n prevLinks[updatedLinkIndex].path = path;\r\n return [...prevLinks]\r\n })\r\n }, [])\r\n\r\n const handlePortMoved = (port: IPort, elementId: string, oldPosition: IPosition, newPosition: IPosition) => {\r\n const element = elements.find(e => e.id === elementId)!\r\n\r\n if (props.onPortMoved) {\r\n props.onPortMoved(newPosition, port, element)\r\n }\r\n\r\n //set links equals a clone links to re-render links with new position\r\n setLinks(prev => prev.map(link => {\r\n if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {\r\n link.sourcePort.position = newPosition;\r\n }\r\n\r\n if (link.targetElement?.id === elementId && link.targetPort?.id === port.id) {\r\n link.targetPort.position = newPosition;\r\n }\r\n\r\n return link;\r\n }))\r\n\r\n //Update port position in element, not re-render\r\n setElements(prevElements => {\r\n const updatedElementIndex = prevElements.findIndex(e => e.id === elementId);\r\n\r\n prevElements[updatedElementIndex].ports = prevElements[updatedElementIndex].ports?.map(p => {\r\n if (p.id === port.id) {\r\n p.position = newPosition\r\n }\r\n return p\r\n })\r\n return prevElements;\r\n })\r\n }\r\n\r\n\r\n //Handle creating a new element link\r\n const handlePortMouseDown = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n ev.stopPropagation()\r\n //Return if creating a new element link\r\n if (tempLink) return;\r\n\r\n const sourceElement = elements.find(e => e.id === elementId)!\r\n\r\n //handle create temp element link;\r\n const newLink: IElementLink = {\r\n id: generateUniqueId(),\r\n points: [],\r\n sourceElement: sourceElement!,\r\n sourcePort: port,\r\n }\r\n\r\n setTempLink(newLink)\r\n paperEventEmitter.emitElementLinkStarted(newLink)\r\n }\r\n\r\n const createElementLink = (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement): IElementLink | null => {\r\n\r\n //if no onCreatingLink prop, no link will be created\r\n if (!props.onCreatingLink) { return null; }\r\n\r\n let newElementLink: IElementLink | null = props.onCreatingLink(sourcePort, sourceElement, targetPort, targetElement)\r\n\r\n if (!newElementLink) return null;\r\n\r\n //Automatic bending, if is not defined points\r\n if (!newElementLink.points || newElementLink.points.length === 0) {\r\n newElementLink = automationAddPointsToLink(newElementLink, MAX_LINK_KNOT_COUNT)\r\n }\r\n \r\n return newElementLink;\r\n }\r\n\r\n const handlePortMouseUp = (ev: React.MouseEvent<SVGElement>, port: IPort, elementId: string) => {\r\n ev.stopPropagation();\r\n\r\n //Create new element link, if has tempLink\r\n if (tempLink) {\r\n //Check if mouse up point is mouse down point or not\r\n const isMouseUpOnNotSelf = tempLink.sourcePort.id !== port.id || tempLink.sourceElement.id !== elementId\r\n\r\n let newElementLink: IElementLink | null = null;\r\n\r\n if (isMouseUpOnNotSelf) {\r\n const { sourcePort, sourceElement } = tempLink;\r\n const targetElement = elements.find(e => e.id === elementId)!\r\n\r\n newElementLink = createElementLink(sourcePort, sourceElement, port, targetElement)\r\n }\r\n\r\n if (newElementLink) {\r\n setLinks(prev => [...prev, newElementLink!])\r\n paperEventEmitter.emitElementLinkEnded(newElementLink)\r\n } else {\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n setTempLink(undefined)\r\n }\r\n }\r\n\r\n const handleLinkLabelMoved = useCallback((offsetX: number, offsetY: number, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n const oldPosition = currentLink.label!.position || LINK_LABEL_POSITION_FROM_LINK_MID_POINT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.label!.position = newPosition;\r\n break;\r\n }\r\n case 'source': {\r\n const oldPosition = currentLink.sourceLabel!.position || LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.sourceLabel!.position = newPosition;\r\n break;\r\n }\r\n case 'target': {\r\n const oldPosition = currentLink.targetLabel!.position || LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT\r\n\r\n const newPosition = {\r\n x: oldPosition.x + offsetX,\r\n y: oldPosition.y + offsetY,\r\n }\r\n currentLink.targetLabel!.position = newPosition;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleLinkLabelResized = useCallback((width: number, height: number, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.label!.size = newSize;\r\n break;\r\n }\r\n case 'source': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.sourceLabel!.size = newSize;\r\n break;\r\n }\r\n case 'target': {\r\n const newSize = {\r\n width,\r\n height,\r\n }\r\n currentLink.targetLabel!.size = newSize;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleLinkLabelContentChanged = useCallback((newValue: string, index: number, labelType: 'middle' | 'source' | 'target') => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks]\r\n const currentLink = newLinks[index]\r\n\r\n switch (labelType) {\r\n case 'middle': {\r\n currentLink.label!.content = newValue;\r\n break;\r\n }\r\n case 'source': {\r\n currentLink.sourceLabel!.content = newValue;\r\n break;\r\n }\r\n case 'target': {\r\n currentLink.targetLabel!.content = newValue;\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return newLinks;\r\n })\r\n }, [])\r\n\r\n const handleSelectLink = (link: IElementLink, index: number) => {\r\n setSelectedLink(link)\r\n }\r\n\r\n const handleDeselectLink = (link: IElementLink, index: number) => {\r\n setSelectedLink(undefined)\r\n }\r\n\r\n //update absolute position of element and absolute position of children elements\r\n const updateElementPosition = (element: IElementInTreeState, movementX: number, movementY: number): IElementInTreeState => {\r\n element.position.x += movementX;\r\n element.position.y += movementY;\r\n\r\n if (element.childrenElements && element.childrenElements.length > 0) {\r\n element.childrenElements = element.childrenElements.map(child => updateElementPosition(child, movementX, movementY));\r\n }\r\n\r\n return element;\r\n }\r\n\r\n //use selection frame\r\n useSelectionFrame({\r\n container: paperContainerRef.current as unknown as HTMLElement,\r\n targetSVGElement: selectedElementSVG || undefined,\r\n resizability: selectedElement?.resizability || {\r\n enabled: true,\r\n keepRatio: true\r\n },\r\n width: selectedElement?.size.width,\r\n height: selectedElement?.size.height,\r\n //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,\r\n onMove: (offsetX, offsetY) => {\r\n if (!selectedElement) return;\r\n\r\n const oldPosition = { ...selectedElement.position };\r\n\r\n const newElementPosition = updateElementPosition(selectedElement, offsetX, offsetY)\r\n\r\n newElementPosition.relativePosition = {\r\n x: newElementPosition.relativePosition!.x + offsetX,\r\n y: newElementPosition.relativePosition!.y + offsetY\r\n }\r\n\r\n const indexSelectedElement = elements.findIndex(e => e.id === selectedElement.id)\r\n\r\n //Set state to re-render UI with new position\r\n setElementsInTree(prev => [...prev]);\r\n\r\n if (props.onElementMoved) {\r\n props.onElementMoved(newElementPosition.position, selectedElement, indexSelectedElement)\r\n }\r\n\r\n paperEventEmitter.emitElementMoved(selectedElement, oldPosition, newElementPosition.position)\r\n setMouseDownedOnPaper(false);\r\n },\r\n onResize: (width, height) => {\r\n if (!selectedElement) return;\r\n const indexSelectedElement = elements.findIndex(e => e.id === selectedElement.id)\r\n\r\n const oldSize = selectedElement.size;\r\n const newSize = { width, height }\r\n\r\n elements[indexSelectedElement].size = newSize;\r\n\r\n setElements([...elements]);\r\n\r\n if (props.onElementResized) {\r\n props.onElementResized(newSize, selectedElement, indexSelectedElement)\r\n }\r\n\r\n paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize)\r\n setMouseDownedOnPaper(false);\r\n }\r\n });\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelMoved = useCallback((index: number) => {\r\n return (offsetX: number, offsetY: number, labelType: string) => {\r\n handleLinkLabelMoved(offsetX, offsetY, index, labelType as any)\r\n }\r\n }, [handleLinkLabelMoved])\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelResized = useCallback((index: number) => {\r\n return (width: number, height: number, labelType: string) => {\r\n handleLinkLabelResized(width, height, index, labelType as any)\r\n }\r\n }, [handleLinkLabelResized])\r\n\r\n /*\r\n Cache to avoid re-initializing the function when the component re-renders to \r\n avoid causing the components using it to re-render unnecessarily\r\n */\r\n const onLabelContentChanged = useCallback((index: number) => {\r\n return (newValue: string, labelType: string) => {\r\n handleLinkLabelContentChanged(newValue, index, labelType as any)\r\n }\r\n }, [handleLinkLabelContentChanged])\r\n\r\n const handleClickLinkDelete = useCallback((link: IElementLink, index: number) => {\r\n return () => {\r\n setLinks(prevLinks => {\r\n const newLinks = [...prevLinks];\r\n newLinks.splice(index, 1)\r\n return newLinks;\r\n })\r\n }\r\n }, [])\r\n\r\n const handleMouseUpAtLinkedPortPlaceholder = (link: IElementLink, position: IPosition, targetElement: IElement) => {\r\n console.log(`A port could have been created at position ${JSON.stringify(position)} on element ${targetElement.id}`)\r\n\r\n if (props.onCreatingPortByLinking) {\r\n const { sourcePort, sourceElement } = link;\r\n\r\n //Handle create port via onCreatingPortByLinking prop\r\n const targetPort = props.onCreatingPortByLinking(sourceElement, sourcePort, targetElement, position);\r\n\r\n if (targetPort) {\r\n //Add new port to target element\r\n targetElement.addPort(targetPort);\r\n\r\n //Create new link with created port, that is returned.\r\n const newElementLink = createElementLink(sourcePort, sourceElement, targetPort, targetElement)\r\n\r\n //Create link and clear some thing, then return\r\n if (newElementLink) {\r\n setLinks(prev => [...prev, newElementLink])\r\n paperEventEmitter.emitElementLinkEnded(newElementLink)\r\n setTempLink(undefined)\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n //Clear tempLink\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n }\r\n\r\n const handleElementTextChange = (element: IElement, textId: string, newContent: string) => {\r\n setElements(prevElms => {\r\n return prevElms.map(curEle => {\r\n //Find changed text of element to update the content for it.\r\n if (curEle.id === element.id && curEle.texts) {\r\n const updatedTextId = curEle.texts.findIndex(t => t.id === textId)\r\n\r\n if (updatedTextId !== undefined) {\r\n curEle.texts[updatedTextId].content = newContent;\r\n }\r\n }\r\n\r\n return curEle;\r\n })\r\n })\r\n }\r\n\r\n const handleElementClicked = (id: any, e: any, ref: SVGSVGElement | null, element: IElementInTreeState) => {\r\n e.stopPropagation();\r\n\r\n if (tempLink) {\r\n //Clear tempLink\r\n setTempLink(undefined)\r\n paperEventEmitter.emitElementLinkEnded()\r\n } else {\r\n setSelectedElementSVG(ref)\r\n setSelectedElement(element);\r\n paperEventEmitter.emitElementSelected(element)\r\n }\r\n\r\n setMouseDownedOnPaper(false);\r\n }\r\n\r\n const renderElementInTree = (element: IElementInTreeState) => {\r\n //use the defined react element or the default Element component\r\n const ReactElement = element.reactElement || Element;\r\n\r\n return (\r\n <g key={element.id}>\r\n {\r\n <ReactElement\r\n key={`element-${element.id}`}\r\n id={element.id}\r\n height={element.size.height}\r\n width={element.size.width}\r\n x={element.relativePosition?.x!}\r\n y={element.relativePosition?.y!}\r\n onClick={(id: any, e: any, ref: SVGSVGElement | null) => {\r\n handleElementClicked(id, e, ref, element);\r\n }}\r\n onContextMenu={(id: any, e: any, ref: SVGSVGElement | null) => {\r\n handleElementClicked(id, e, ref, element);\r\n props.onElementContextMenu?.(element, e);\r\n }}\r\n container={paperContainerRef.current as SVGSVGElement}\r\n renderShape={element.renderShape}\r\n cssClass={element.cssClass}\r\n texts={element.texts}\r\n ports={element.ports}\r\n portMoveableAreas={element.portMoveableAreas}\r\n portSlideRailSVGClassName={element.portSlideRailSVGClassName}\r\n portDirection={element.portDirection}\r\n defaultPortSize={element.defaultPortSize}\r\n onPortMoved={handlePortMoved}\r\n onPortMouseDown={handlePortMouseDown}\r\n onPortMouseUp={handlePortMouseUp}\r\n // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}\r\n onMouseUpAtLinkedPortPlaceholder={(elementLink, position) => handleMouseUpAtLinkedPortPlaceholder(elementLink, position, element)}\r\n onTextUpdated={(textId, newContent) => handleElementTextChange(element, textId, newContent)}\r\n\r\n textsPlaceHolderClassName={element.textsPlaceHolderClassName}\r\n textsPlaceHolderFlexStyle={element.textsPlaceHolderFlexStyle}\r\n textsPlaceHolderFlexboxPosition={element.textsPlaceHolderFlexboxPosition}\r\n >\r\n {element.childrenElements && element.childrenElements.map(renderElementInTree)}\r\n </ReactElement>\r\n }\r\n </g>)\r\n }\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <Ruler squareSize={100} border='1px dashed grey' ></Ruler>\r\n <svg tabIndex={0} width={size.width} height={size.height} ref={paperContainerRef} id=\"paper-container\" onMouseMove={handlePaperMouseMove} onMouseDown={handleMouseDownOnPaper} onMouseUp={handleMouseUpOnPaper}>\r\n {paperContainerRef.current ? elementsInTree.map((element, index) => {\r\n return renderElementInTree(element)\r\n }) : \"\"}\r\n {\r\n links && links.map((link, index) => {\r\n return (\r\n <ElementLink\r\n key={link.id}\r\n id={link.id}\r\n path={link.path}\r\n sourcePosition={{\r\n x: link.sourceElement.position.x + link.sourcePort.position.x,\r\n y: link.sourceElement.position.y + link.sourcePort.position.y\r\n }}\r\n targetPosition={{\r\n x: link.targetElement?.position.x! + link.targetPort?.position.x!,\r\n y: link.targetElement?.position.y! + link.targetPort?.position.y!\r\n }}\r\n points={link.points}\r\n onPathChanged={handlePathChange}\r\n onClickDelete={handleClickLinkDelete(link, index)}\r\n onSelected={() => handleSelectLink(link, index)}\r\n onDeselected={() => handleDeselectLink(link, index)}\r\n\r\n container={paperContainerRef.current}\r\n markerStart={link.markerStart}\r\n markerEnd={link.markerEnd}\r\n markerDistanceFromPort={link.markerDistanceFromPort}\r\n markerSize={link.markerSize}\r\n\r\n label={link.label}\r\n sourceLabel={link.sourceLabel}\r\n targetLabel={link.targetLabel}\r\n\r\n onLabelMoved={onLabelMoved(index)}\r\n onLabelResized={onLabelResized(index)}\r\n onLabelContentChanged={onLabelContentChanged(index)}\r\n />\r\n )\r\n })\r\n }\r\n {tempLink?.tempTargetPosition && <ElementLink\r\n id={tempLink.id}\r\n points={tempLink.points}\r\n sourcePosition={{\r\n x: tempLink.sourceElement.position.x + tempLink.sourcePort.position.x,\r\n y: tempLink.sourceElement.position.y + tempLink.sourcePort.position.y\r\n }}\r\n targetPosition={tempLink.tempTargetPosition}\r\n container={paperContainerRef.current}\r\n markerStart={tempLink.markerStart}\r\n markerEnd={tempLink.markerEnd}\r\n markerDistanceFromPort={tempLink.markerDistanceFromPort}\r\n markerSize={tempLink.markerSize}\r\n />}\r\n\r\n {texts.map((text, index) => (\r\n <Text\r\n key={text.id}\r\n id={text.id}\r\n x={text.position.x}\r\n y={text.position.y}\r\n width={text.size.width}\r\n height={text.size.height}\r\n fontSize={text.fontSize}\r\n border={text.border}\r\n\r\n container={paperContainerRef.current!}\r\n content={text.content}\r\n align={text.align}\r\n onSelected={() => {\r\n setSelectedText(text)\r\n }}\r\n />\r\n ))}\r\n </svg>\r\n <BBoxDebugger elementSVG={selectedElementSVG} />\r\n <LinkDebugger links={links} svgContainer={paperContainerRef.current!} />\r\n </div>\r\n\r\n );\r\n};\r\n\r\nexport default Paper;","import React, { useCallback } from 'react'\r\nimport { EditorContext } from \"../models/implementations/EditorContext\";\r\nimport Paper from \"./paper\";\r\nimport { IElement, IElementLink, IPort, IPosition, IText } from '../models';\r\n\r\ninterface IEditorProps {\r\n editorContext: EditorContext;\r\n}\r\n\r\nexport default function Editor({\r\n editorContext\r\n}: IEditorProps) {\r\n\r\n const handlePaperClicked = useCallback((position: IPosition) => {\r\n editorContext.onPaperClickedHandler(position);\r\n }, [editorContext]);\r\n\r\n const handlePortMoved = useCallback((position: { x: number; y: number }, port: IPort, element: IElement) => {\r\n editorContext.onPortMovedHandler(position, port, element);\r\n }, [editorContext]);\r\n\r\n const handlePortSelected = useCallback((port: IPort, element: IElement) => {\r\n editorContext.onPortSelectedHandler(port, element);\r\n }, [editorContext]);\r\n\r\n const handleElementContextMenu = useCallback((element: IElement, event: React.MouseEvent<SVGElement>) => {\r\n editorContext.onElementContextMenuHandler(element, event);\r\n }, [editorContext]);\r\n\r\n const handleElementMoved = useCallback((position: { x: number; y: number }, element: IElement) => {\r\n editorContext.onElementMovedHandler(position, element);\r\n }, [editorContext]);\r\n\r\n const handleElementResized = useCallback((size: { width: number; height: number }, element: IElement) => {\r\n editorContext.onElementResizedHandler(size, element);\r\n }, [editorContext]);\r\n\r\n const handleElementSelected = useCallback((element: IElement) => {\r\n editorContext.onElementSelectedHandler(element);\r\n }, [editorContext]);\r\n\r\n const handleLinkSelected = React.useCallback((link: IElementLink) => {\r\n editorContext.onLinkSelectedHandler(link);\r\n }, [editorContext]);\r\n\r\n const handleTextSelected = React.useCallback((text: IText) => {\r\n editorContext.onTextSelectedHandler(text);\r\n }, [editorContext]);\r\n\r\n return (\r\n <>\r\n <Paper\r\n size={{ width: 3000, height: 3000 }}\r\n elements={editorContext.elements}\r\n links={editorContext.links}\r\n texts={editorContext.texts}\r\n onPaperClicked={handlePaperClicked}\r\n onPortMoved={handlePortMoved}\r\n onPortSelected={handlePortSelected}\r\n onElementContextMenu={handleElementContextMenu}\r\n onElementMoved={handleElementMoved}\r\n onElementResized={handleElementResized}\r\n onElementSelected={handleElementSelected}\r\n onCreatingLink={editorContext.onCreatingLinkHandler}\r\n onCreatingPortByLinking={editorContext.onCreatingPortByLinkingHandler}\r\n onLinkSelected={handleLinkSelected}\r\n onTextSelected={handleTextSelected}\r\n />\r\n </>\r\n )\r\n}\r\n"],"names":["i","uuidv4","Element","React","Port","ElementLink","Text","Interval","require$$0","RB_TREE_COLOR_RED","RB_TREE_COLOR_BLACK","require$$1","Node","IntervalTree","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","Flatten","this","bundleModule","Flexbox"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,11,22,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,60,61]}
|