-
Notifications
You must be signed in to change notification settings - Fork 2
/
graphics.js
103 lines (81 loc) · 2.55 KB
/
graphics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
let imageMap = {
Conveyor: 'img/conveyor.svg',
ConveyorElbow: 'img/conveyor-elbow.svg',
ConveyorTee: 'img/conveyor-tee.svg',
ConveyorTeeTwo: 'img/conveyor-tee-2.svg',
ConveyorEx: 'img/conveyor-ex.svg',
CrossConveyor: 'img/cross-conveyor.svg',
BranchBR: 'img/branch-br.svg',
BranchGY: 'img/branch-gy.svg',
WriteB: 'img/write-blue.svg',
WriteR: 'img/write-red.svg',
WriteY: 'img/write-yellow.svg',
WriteG: 'img/write-green.svg',
WriterConnector: 'img/writer-connector.svg',
Start: 'img/start.svg',
End: 'img/end.svg',
DeleteButton: 'img/delete-button.svg',
MirrorButton: 'img/mirror-button.svg',
PlayButton: 'img/play-button.svg',
PauseButton: 'img/pause-button.svg',
StopButton: 'img/stop-button.svg'
},
globalCanvas = null,
allImagePromises =
Object.keys(imageMap).map(function(key) {
var url = imageMap[key];
var p = getSVG(url);
p.then(function(svg) {
imageMap[key] = svg;
});
return p;
}),
preloadPromise = Promise.all(allImagePromises);
function preload(paper) {
globalCanvas = paper.g().attr({visibility: 'hidden'});
return preloadPromise;
};
function getGraphic(name) {
var original = imageMap[name];
if (original.parent() !== globalCanvas)
globalCanvas.append(original);
if (original) {
return globalCanvas.use(original).attr({visibility: 'visible'});
}
return null;
};
function screenPointToLocal(x, y, element) {
var svg = element.node.ownerSVGElement || element.node,
spt = svg.createSVGPoint(),
mat = element.node.getScreenCTM();
spt.x = x;
spt.y = y;
return spt.matrixTransform(mat.inverse());
};
export {preload, getGraphic, screenPointToLocal};
export default {preload, getGraphic, screenPointToLocal};
function getSVG(url) {
if (!getSVG.cache) {
getSVG.cache = {};
}
if (getSVG.cache[url] == undefined) {
// retrieve the graphic
var p = new Promise(
function(resolve, reject) {
Snap.load(
url,
function(fragment) {
var g = fragment.select('g');
getSVG.cache[url] = Promise.resolve(g);
resolve(g.clone());
});
}
);
getSVG.cache[url] = p;
return p;
} else {
return Promise.resolve(getSVG.cache[url]).then(function(g) {
return g.clone();
});
}
};