| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- "use strict";
- var __assign = (this && this.__assign) || function () {
- __assign = Object.assign || function(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
- t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- var __read = (this && this.__read) || function (o, n) {
- var m = typeof Symbol === "function" && o[Symbol.iterator];
- if (!m) return o;
- var i = m.call(o), r, ar = [], e;
- try {
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
- }
- catch (error) { e = { error: error }; }
- finally {
- try {
- if (r && !r.done && (m = i["return"])) m.call(i);
- }
- finally { if (e) throw e.error; }
- }
- return ar;
- };
- var __spread = (this && this.__spread) || function () {
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
- return ar;
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.Highlight = void 0;
- // 后续并入FlowPath
- var getPath = function (id, lf) {
- var el = lf.getModelById(id);
- return getNodePath(el.BaseType === 'node' ? el : el.targetNode, lf);
- };
- // dfs + 动态规划
- // todo 算法优化
- var getNodePath = function (node, lf) {
- var incomingPaths = [];
- var outgoingPaths = [];
- var getIncomingPaths = function (curNode, path, prevNode) {
- if (prevNode === void 0) { prevNode = null; }
- if (prevNode) {
- // * 上个节点和当前节点中间边
- path.unshift.apply(path, __spread(lf
- .getEdgeModels({
- sourceNodeId: curNode.id,
- targetNodeId: prevNode.id,
- })
- .map(function (item) { return item.id; })));
- }
- // * 路径中存在节点,则不再继续查找,说明出现环情况
- if (path.includes(curNode.id)) {
- incomingPaths.push(path);
- return;
- }
- // * 路径中当前加入节点
- path.unshift(curNode.id);
- if (!curNode.incoming.nodes.length) {
- incomingPaths.push(path);
- return;
- }
- // * 往下找
- curNode.incoming.nodes.forEach(function (nextNode) {
- getIncomingPaths(nextNode, path.slice(), curNode);
- });
- };
- // * 同上逻辑
- var getOutgoingPaths = function (curNode, path, prevNode) {
- if (prevNode === void 0) { prevNode = null; }
- if (prevNode) {
- path.push.apply(path, __spread(lf
- .getEdgeModels({
- sourceNodeId: prevNode.id,
- targetNodeId: curNode.id,
- })
- .map(function (item) { return item.id; })));
- }
- if (path.includes(curNode.id)) {
- outgoingPaths.push(path);
- return;
- }
- path.push(curNode.id);
- if (!curNode.outgoing.nodes.length) {
- outgoingPaths.push(path);
- return;
- }
- curNode.outgoing.nodes.forEach(function (nextNode) {
- getOutgoingPaths(nextNode, path.slice(), curNode);
- });
- };
- getIncomingPaths(node, []);
- getOutgoingPaths(node, []);
- return __spread(new Set(__spread(incomingPaths.flat(), outgoingPaths.flat())));
- };
- var Highlight = /** @class */ (function () {
- function Highlight(_a) {
- var lf = _a.lf;
- this.mode = 'path';
- this.manual = false;
- this.tempStyles = {};
- this.lf = lf;
- }
- Highlight.prototype.setMode = function (mode) {
- this.mode = mode;
- };
- Highlight.prototype.setManual = function (manual) {
- this.manual = manual;
- };
- Highlight.prototype.highlightSingle = function (id) {
- var model = this.lf.getModelById(id);
- if (model.BaseType === 'node') {
- // 高亮节点
- model.updateStyles(this.tempStyles[id]);
- }
- else if (model.BaseType === 'edge') {
- // 高亮边及对应的节点
- model.updateStyles(this.tempStyles[id]);
- model.sourceNode.updateStyles(this.tempStyles[model.sourceNode.id]);
- model.targetNode.updateStyles(this.tempStyles[model.targetNode.id]);
- }
- };
- Highlight.prototype.highlightPath = function (id) {
- var _this = this;
- var path = getPath(id, this.lf);
- path.forEach(function (_id) {
- // 高亮路径上所有的边和节点
- _this.lf.getModelById(_id).updateStyles(_this.tempStyles[_id]);
- });
- };
- Highlight.prototype.highlight = function (id, mode) {
- var _this = this;
- if (mode === void 0) { mode = this.mode; }
- if (this.manual)
- return;
- if (Object.keys(this.tempStyles).length) {
- this.restoreHighlight();
- }
- Object.values(this.lf.graphModel.modelsMap).forEach(function (item) {
- // 所有节点样式都进行备份
- var oStyle = item.BaseType === 'node' ? item.getNodeStyle() : item.getEdgeStyle();
- _this.tempStyles[item.id] = __assign({}, oStyle);
- // 所有节点都设置透明度为0.1
- item.setStyles({ opacity: 0.1 });
- });
- var modeTrigger = {
- single: this.highlightSingle.bind(this),
- path: this.highlightPath.bind(this),
- };
- modeTrigger[mode](id);
- };
- Highlight.prototype.restoreHighlight = function () {
- var _this = this;
- // 恢复所有节点的样式
- if (!Object.keys(this.tempStyles).length)
- return;
- Object.values(this.lf.graphModel.modelsMap).forEach(function (item) {
- var _a;
- var oStyle = (_a = _this.tempStyles[item.id]) !== null && _a !== void 0 ? _a : {};
- item.updateStyles(__assign({}, oStyle));
- });
- this.tempStyles = {};
- };
- Highlight.prototype.render = function (lf, domContainer) {
- var _this = this;
- this.lf.on('node:mouseenter', function (_a) {
- var data = _a.data;
- return _this.highlight(data.id);
- });
- this.lf.on('edge:mouseenter', function (_a) {
- var data = _a.data;
- return _this.highlight(data.id);
- });
- this.lf.on('node:mouseleave', this.restoreHighlight.bind(this));
- this.lf.on('edge:mouseleave', this.restoreHighlight.bind(this));
- this.lf.on('history:change', this.restoreHighlight.bind(this));
- };
- Highlight.prototype.destroy = function () { };
- Highlight.pluginName = 'highlight';
- return Highlight;
- }());
- exports.Highlight = Highlight;
|