mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
135 lines
6.8 KiB
JavaScript
135 lines
6.8 KiB
JavaScript
Volcanos("onfigure", {help: "图形绘制", list: [],
|
|
path: { // <path d="M10 10 H 90 V 90 H 10 Z" stroke="black" fill="transparent"/>
|
|
data: {size: {}, copy: ["d", "name", "meta", "tt", "xx", "yy"],
|
|
x: function(event, can, value, cmd, target) {
|
|
var tt = JSON.parse(target.Value("tt")||'{"tx":0, "ty":0}')
|
|
if (value != undefined) {
|
|
tt.tx = value-target.Val("xx")
|
|
target.Value("tt", JSON.stringify(tt))
|
|
target.Value("transform", "translate("+tt.tx+","+tt.ty+")")
|
|
}
|
|
return target.Val("xx")+tt.tx
|
|
},
|
|
y: function(event, can, value, cmd, target) {
|
|
var tt = JSON.parse(target.Value("tt")||'{"tx":0, "ty":0}')
|
|
if (value != undefined) {
|
|
tt.ty = value-target.Val("yy")
|
|
target.Value("tt", JSON.stringify(tt))
|
|
target.Value("transform", "translate("+tt.tx+","+tt.ty+")")
|
|
}
|
|
return target.Val("yy")+tt.ty
|
|
},
|
|
},
|
|
draw: function(event, can, point, style) {
|
|
if (style && style.d) { return style }
|
|
if (point.length == 1) { can._temp = {} }
|
|
if (point.length < 2) {return}
|
|
|
|
if (can.keys && can.keys.length > 0) { var k;
|
|
k = can._temp[point.length-1] = can.keys[0]
|
|
switch (k.toUpperCase()) {
|
|
case "C": can._temp[point.length+1] = ","
|
|
case "Q": can._temp[point.length] = ","; break
|
|
default:
|
|
}
|
|
can.keys = can.keys.slice(1)
|
|
}
|
|
|
|
var skip = 0
|
|
var end = false
|
|
var data = {
|
|
d: can.core.List(point, function(p, i) { var k = p.k
|
|
if (i < skip) {return}
|
|
switch (i) {
|
|
case 0: k = "M"; break
|
|
default: k = can._temp[i] || p.k || "L"; break
|
|
}
|
|
if (end) {return}
|
|
|
|
k = k.toUpperCase()
|
|
switch (k) {
|
|
case "Z": return can.point = [], can._temp = {}, k
|
|
case "L": return k+" " + p.x + " " + p.y
|
|
case "M": return k+" " + p.x + " " + p.y
|
|
case "H": return k+" " + p.x
|
|
case "V": return k+" " + p.y
|
|
case "A":
|
|
switch (point.length - i) {
|
|
case 1: end = true
|
|
return k+" " + (point[i-1].x+p.x)/2 + " " + (point[i-1].y+p.y)/2 + " 0 0 0 " + p.x + " " + p.y
|
|
case 2: end = true
|
|
var r = Math.sqrt(Math.pow(point[i+1].x - p.x, 2) + Math.pow(point[i+1].y - p.y, 2))
|
|
return k+" " + r + " " + r + " 0 0 0 " + p.x + " " + p.y
|
|
case 3:
|
|
if (!p.done) {
|
|
var r = Math.sqrt(Math.pow(point[i+1].x - p.x, 2) + Math.pow(point[i+1].y - p.y, 2))
|
|
var temp = point[i]
|
|
p = point[i] = point[i+1]
|
|
point[i+1] = temp
|
|
var temp = can.point[i]
|
|
p = can.point[i] = can.point[i+1]
|
|
can.point[i+1] = temp
|
|
p.x = r
|
|
p.y = r
|
|
p.done = true
|
|
p.arg = " 0 0 0 "
|
|
}
|
|
default:
|
|
skip = i + 2
|
|
return k+" " + p.x + " " + p.y + " 0 0 0 " + point[i+1].x + " " + point[i+1].y
|
|
}
|
|
break
|
|
case "C":
|
|
switch (point.length - i) {
|
|
case 1: end = true
|
|
return k+" " + (point[i-1].x+p.x)/2 + " " + (point[i-1].y+p.y)/2 + "," + (point[i-1].x+p.x)/2 + " " + (point[i-1].y+p.y)/2 + "," + p.x + " " + p.y
|
|
case 2: end = true
|
|
return k+" " + point[i+1].x + " " + point[i+1].y + "," + (point[i-1].x+p.x)/2 + " " + (point[i-1].y+p.y)/2 + "," + p.x + " " + p.y
|
|
case 3:
|
|
return k+" " + point[i+1].x + " " + point[i+1].y + "," + point[i+2].x + " " + point[i+2].y + "," + p.x + " " + p.y
|
|
case 4:
|
|
if (!p.done) {
|
|
var temp = point[i]
|
|
p = point[i] = point[i+1]
|
|
point[i+1] = temp
|
|
|
|
var temp = point[i+1]
|
|
point[i+1] = point[i+2]
|
|
point[i+2] = temp
|
|
p.done = true
|
|
}
|
|
default:
|
|
return k+" " + p.x + " " + p.y
|
|
}
|
|
case "Q":
|
|
switch (point.length - i) {
|
|
case 1: end = true
|
|
return k+" " + (point[i-1].x+p.x)/2 + " " + (point[i-1].y+p.y)/2 + "," + p.x + " " + p.y
|
|
case 2: end = true
|
|
return k+" " + point[i+1].x + " " + point[i+1].y + "," + p.x + " " + p.y
|
|
case 3:
|
|
if (!p.done) {
|
|
var temp = point[i]
|
|
p = point[i] = point[i+1]
|
|
point[i+1] = temp
|
|
p.done = true
|
|
}
|
|
default:
|
|
return k+" " + p.x + " " + p.y
|
|
}
|
|
default: return k+" " + p.x + " " + p.y
|
|
}
|
|
}).join(" ")
|
|
}
|
|
return data
|
|
},
|
|
text: function(can, target, data) {
|
|
data.x = (target.x1.baseVal.value + target.x2.baseVal.value) / 2
|
|
data.y = (target.y1.baseVal.value + target.y2.baseVal.value) / 2
|
|
return data
|
|
},
|
|
show: function(can, target) { return target.tagName + " " + target.Value("d") },
|
|
},
|
|
})
|
|
|