Skip to content

Instantly share code, notes, and snippets.

@tango238
Created December 8, 2012 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tango238/4239683 to your computer and use it in GitHub Desktop.
Save tango238/4239683 to your computer and use it in GitHub Desktop.
変態アドベントカレンダー2012 8日目
package controllers
import play.api._
import play.api.libs.concurrent._
import play.api.libs.ws._
import play.api.mvc._
import scala.xml._
object Application extends Controller {
def index = Action {
def dbl(point:Tuple2[NodeSeq,NodeSeq]):Tuple2[Double,Double] = (point._1.toString().toDouble, point._2.toString().toDouble)
def parseTail(x:Double, y:Double, node:NodeSeq):String = {
var cmds = ""
var skip = false
for(n <- node) {
var cmd = ""
if(!skip) {
val lineType = (n \ "@type").toString() match {
case "NORMAL" => "L"
case "BEZIER_CP" => "Q"
case _ => "L"
}
cmd += lineType + (x + (n \ "@x").toString().toDouble) + "," + (y + (n \ "@y").toString().toDouble) + " "
} else {
cmd += (x + (n \ "@x").toString().toDouble) + "," + (y + (n \ "@y").toString().toDouble) + " "
}
skip = !skip
cmds += cmd
}
cmds
}
def parse(x:Double, y:Double, node:NodeSeq):String = {
val points = node \\ "point"
val m = (points.head \ "@x", points.head \ "@y")
val mx = x + m._1.toString().toDouble
val my = y + m._2.toString().toDouble
val first = "M" + mx + "," + my + " "
val parsed = parseTail(x, y, points.tail)
first + parsed
}
Async {
//WS.url("https://cacoo.com/api/v1/diagrams/KEBT4JjUWVvQTbzP/contents.xml?returnValues=position,point").get().map { response =>
WS.url("http://localhost:9000/assets/contents.xml").get().map { response =>
val xml = response.xml
// Group
val groups = xml \\ "group"
// Points for each polygon
val points = for {
group <- groups
p1 = dbl((group \ "@x", group \ "@y"))
polys = group \ "polygon"
p2 = dbl((polys \ "@x", polys \ "@y"))
point = (p1._1 + p2._1, p1._2 + p2._2)
} yield point
var i = 0
// Polygons
val polygons = (xml \\ "polygon").map( poly => {
val polygon:Polygon = new Polygon((poly \ "path" \ "@close").toString.toBoolean, parse(points(i)._1, points(i)._2, poly))
i += 1
polygon
})
Ok(views.html.index(polygons))
}
}
}
}
class Polygon(val pathClose:Boolean, val path:String) {
def draw():String = {
if (this.pathClose) this.path + "z" else this.path
}
def listToJsArrayString(ls:List[Int]):String = {
val b = new StringBuilder
b.append("[")
for((value, i) <- ls.zipWithIndex){
if(i > 0)
b.append(", ")
b.append(value)
}
b.append("]")
b.result
}
}
<?xml version="1.0" encoding="utf-8"?><diagram><sheet name="Untitled"><group x="14.0" y="14.538238906099224" width="203.24005891016202" height="204.42516904726088" angle="0.0" attr-stencil-id="00002"><polygon x="0.0" y="0.0" width="203.240058910162" height="204.42516904726094" angle="0.0"><path close="true"><point type="NORMAL" x="203.240058910162" y="199.42516904726094"></point><point type="BEZIER_CP" x="203.240058910162" y="204.42516904726094"></point><point type="NORMAL" x="198.240058910162" y="204.42516904726094"></point><point type="NORMAL" x="5.0" y="204.42516904726094"></point><point type="BEZIER_CP" x="0.0" y="204.42516904726094"></point><point type="NORMAL" x="0.0" y="199.42516904726094"></point><point type="NORMAL" x="0.0" y="5.0"></point><point type="BEZIER_CP" x="0.0" y="0.0"></point><point type="NORMAL" x="5.0" y="0.0"></point><point type="NORMAL" x="198.240058910162" y="0.0"></point><point type="BEZIER_CP" x="203.240058910162" y="0.0"></point><point type="NORMAL" x="203.240058910162" y="5.0"></point><point type="NORMAL" x="203.240058910162" y="199.42516904726094"></point></path></polygon><text x="1.0" y="1.0" width="201.24005891016202" height="202.42516904726088" angle="0.0"></text></group><group x="91.23122238586154" y="86.6729164641502" width="198.76877761413846" height="179.25773195876292" angle="0.0" attr-stencil-id="00004"><polygon x="0.0" y="0.0" width="198.76877761413854" height="179.257731958763" angle="0.0"><path close="true"><point type="NORMAL" x="198.76877761413854" y="89.6288659793815"></point><point type="BEZIER_CP" x="198.76877761413854" y="126.75257939876296"></point><point type="NORMAL" x="169.6610778203239" y="153.00454082474235"></point><point type="BEZIER_CP" x="140.55198664506622" y="179.257731958763"></point><point type="NORMAL" x="99.38438880706927" y="179.257731958763"></point><point type="BEZIER_CP" x="58.218381119293056" y="179.257731958763"></point><point type="NORMAL" x="29.109195727634766" y="153.00588167257732"></point><point type="BEZIER_CP" x="0.0" y="126.75403855670105"></point><point type="NORMAL" x="0.0" y="89.6288659793815"></point><point type="BEZIER_CP" x="0.0" y="52.50369340206186"></point><point type="NORMAL" x="29.1091917522592" y="26.251851361731962"></point><point type="BEZIER_CP" x="58.218381119293056" y="0.0"></point><point type="NORMAL" x="99.38438880706927" y="0.0"></point><point type="BEZIER_CP" x="140.55269028653888" y="0.0"></point><point type="NORMAL" x="169.6610778203239" y="26.251847776577304"></point><point type="BEZIER_CP" x="198.76877761413854" y="52.50307675546393"></point><point type="NORMAL" x="198.76877761413854" y="89.6288659793815"></point></path></polygon><text x="27.517549299933947" y="28.541417668922662" width="143.74957936395072" height="121.35031269506075" angle="0.0"></text></group><group x="14.0" y="15.426930701296598" width="121.13107511045655" height="56.281952963058345" angle="0.0" attr-stencil-id="00042"><polygon x="0.0" y="0.0" width="121.13107511045655" height="56.28195296305832" angle="0.0"><path close="true"><point type="NORMAL" x="121.13107511045655" y="28.141827819495628"></point><point type="BEZIER_CP" x="121.13107511045655" y="39.79722349023049"></point><point type="NORMAL" x="103.39172956559646" y="48.03951160622747"></point><point type="BEZIER_CP" x="93.85874938964844" y="52.468849182128906"></point><point type="NORMAL" x="76.34825134277344" y="55.38126754760742"></point><point type="NORMAL" x="87.13107511045655" y="85.28195296305833"></point><point type="NORMAL" x="70.17672729492188" y="55.96122741699219"></point><point type="BEZIER_CP" x="65.51406860351562" y="56.281951904296875"></point><point type="NORMAL" x="60.565537555228275" y="56.28195296305832"></point><point type="BEZIER_CP" x="35.47902298886597" y="56.28195296305832"></point><point type="NORMAL" x="17.739346271646543" y="48.03951160622747"></point><point type="BEZIER_CP" x="0.0" y="39.7972285982583"></point><point type="NORMAL" x="0.0" y="28.141827819495628"></point><point type="BEZIER_CP" x="0.0" y="16.485282842506013"></point><point type="NORMAL" x="17.73934384902504" y="8.242653510252131"></point><point type="BEZIER_CP" x="35.478741964771736" y="0.0"></point><point type="NORMAL" x="60.565537555228275" y="0.0"></point><point type="BEZIER_CP" x="85.65234041354933" y="0.0"></point><point type="NORMAL" x="103.39172956559646" y="8.242654191322508"></point><point type="BEZIER_CP" x="121.13107511045655" y="16.485282842506013"></point><point type="NORMAL" x="121.13107511045655" y="28.141827819495628"></point></path></polygon><text x="16.900207192781927" y="6.911161637750666" width="87.33309125717687" height="42.46133194779761" angle="0.0"></text></group><group x="48.550810014727546" y="39.70634606353269" width="7.723122238586143" height="7.723122238586157" angle="0.0" attr-stencil-id="00004"><polygon x="0.0" y="0.0" width="7.723122238586142" height="7.723122238586157" angle="0.0"><path close="true"><point type="NORMAL" x="7.723122238586142" y="3.8615611192930785"></point><point type="BEZIER_CP" x="7.723122238586142" y="5.460995484300443"></point><point type="NORMAL" x="6.592148217967588" y="6.592032371134017"></point><point type="BEZIER_CP" x="5.461120135493364" y="7.723122238586157"></point><point type="NORMAL" x="3.861561119293071" y="7.723122238586157"></point><point type="BEZIER_CP" x="2.262063888070689" y="7.723122238586157"></point><point type="NORMAL" x="1.1310321448365221" y="6.5920901400883665"></point><point type="BEZIER_CP" x="0.0" y="5.461058350515463"></point><point type="NORMAL" x="0.0" y="3.8615611192930785"></point><point type="BEZIER_CP" x="0.0" y="2.2620638880706934"></point><point type="NORMAL" x="1.1310319903740775" y="1.1310321448365244"></point><point type="BEZIER_CP" x="2.262063888070689" y="0.0"></point><point type="NORMAL" x="3.861561119293071" y="0.0"></point><point type="BEZIER_CP" x="5.461147475346087" y="0.0"></point><point type="NORMAL" x="6.592148217967588" y="1.1310319903740798"></point><point type="BEZIER_CP" x="7.723122238586142" y="2.2620373205301916"></point><point type="NORMAL" x="7.723122238586142" y="3.8615611192930785"></point></path></polygon><text x="1.0691890321037714" y="1.229675591178074" width="5.585361979376401" height="5.228244764639809" angle="0.0"></text></group><group x="69.48453608247422" y="39.70634606353269" width="7.723122238586143" height="7.723122238586157" angle="0.0" attr-stencil-id="00004"><polygon x="0.0" y="0.0" width="7.723122238586142" height="7.723122238586162" angle="0.0"><path close="true"><point type="NORMAL" x="7.723122238586142" y="3.861561119293081"></point><point type="BEZIER_CP" x="7.723122238586142" y="5.4609954843004465"></point><point type="NORMAL" x="6.592148217967588" y="6.592032371134022"></point><point type="BEZIER_CP" x="5.461120135493364" y="7.723122238586162"></point><point type="NORMAL" x="3.861561119293071" y="7.723122238586162"></point><point type="BEZIER_CP" x="2.262063888070689" y="7.723122238586162"></point><point type="NORMAL" x="1.1310321448365221" y="6.592090140088371"></point><point type="BEZIER_CP" x="0.0" y="5.461058350515467"></point><point type="NORMAL" x="0.0" y="3.861561119293081"></point><point type="BEZIER_CP" x="0.0" y="2.2620638880706947"></point><point type="NORMAL" x="1.1310319903740775" y="1.131032144836525"></point><point type="BEZIER_CP" x="2.262063888070689" y="0.0"></point><point type="NORMAL" x="3.861561119293071" y="0.0"></point><point type="BEZIER_CP" x="5.461147475346087" y="0.0"></point><point type="NORMAL" x="6.592148217967588" y="1.1310319903740806"></point><point type="BEZIER_CP" x="7.723122238586142" y="2.262037320530193"></point><point type="NORMAL" x="7.723122238586142" y="3.861561119293081"></point></path></polygon><text x="1.0691890321037714" y="1.2296755911780748" width="5.585361979376401" height="5.228244764639813" angle="0.0"></text></group><group x="90.41826215022093" y="39.70634606353269" width="7.723122238586143" height="7.723122238586143" angle="0.0" attr-stencil-id="00004"><polygon x="0.0" y="0.0" width="7.723122238586142" height="7.7231222385861535" angle="0.0"><path close="true"><point type="NORMAL" x="7.723122238586142" y="3.8615611192930768"></point><point type="BEZIER_CP" x="7.723122238586142" y="5.460995484300441"></point><point type="NORMAL" x="6.592148217967588" y="6.592032371134015"></point><point type="BEZIER_CP" x="5.461120135493364" y="7.7231222385861535"></point><point type="NORMAL" x="3.861561119293071" y="7.7231222385861535"></point><point type="BEZIER_CP" x="2.262063888070689" y="7.7231222385861535"></point><point type="NORMAL" x="1.1310321448365221" y="6.592090140088364"></point><point type="BEZIER_CP" x="0.0" y="5.4610583505154615"></point><point type="NORMAL" x="0.0" y="3.8615611192930768"></point><point type="BEZIER_CP" x="0.0" y="2.2620638880706925"></point><point type="NORMAL" x="1.1310319903740775" y="1.131032144836524"></point><point type="BEZIER_CP" x="2.262063888070689" y="0.0"></point><point type="NORMAL" x="3.861561119293071" y="0.0"></point><point type="BEZIER_CP" x="5.461147475346087" y="0.0"></point><point type="NORMAL" x="6.592148217967588" y="1.1310319903740793"></point><point type="BEZIER_CP" x="7.723122238586142" y="2.2620373205301907"></point><point type="NORMAL" x="7.723122238586142" y="3.8615611192930768"></point></path></polygon><text x="1.0691890321037714" y="1.2296755911780735" width="5.585361979376401" height="5.228244764639808" angle="0.0"></text></group><group x="164.3976435935199" y="124.47556742144036" width="32.51840942562592" height="31.298969072164937" angle="0.0" attr-stencil-id="00004"><polygon x="0.0" y="0.0" width="32.51840942562591" height="31.298969072164937" angle="0.0"><path close="true"><point type="NORMAL" x="32.51840942562591" y="15.649484536082468"></point><point type="BEZIER_CP" x="32.51840942562591" y="22.131402752164938"></point><point type="NORMAL" x="27.756413549337253" y="26.71507855670102"></point><point type="BEZIER_CP" x="22.99419004418262" y="31.298969072164937"></point><point type="NORMAL" x="16.259204712812956" y="31.298969072164937"></point><point type="BEZIER_CP" x="9.524479528718702" y="31.298969072164937"></point><point type="NORMAL" x="4.762240609837997" y="26.71531267298968"></point><point type="BEZIER_CP" x="0.0" y="22.131657525773186"></point><point type="NORMAL" x="0.0" y="15.649484536082468"></point><point type="BEZIER_CP" x="0.0" y="9.167311546391748"></point><point type="NORMAL" x="4.7622399594698095" y="4.583656586969068"></point><point type="BEZIER_CP" x="9.524479528718702" y="0.0"></point><point type="NORMAL" x="16.259204712812956" y="0.0"></point><point type="BEZIER_CP" x="22.99430515935198" y="0.0"></point><point type="NORMAL" x="27.756413549337253" y="4.583655960989689"></point><point type="BEZIER_CP" x="32.51840942562591" y="9.167203877938135"></point><point type="NORMAL" x="32.51840942562591" y="15.649484536082468"></point></path></polygon><text x="4.501848556226415" y="4.983422132669032" width="23.517313597374354" height="21.18814983564554" angle="0.0"></text></group><group x="76.98475740110274" y="124.18420376497127" width="61.4556070775061" height="59.16465779042849" angle="6.026095145222705" attr-stencil-id="00007"><polygon x="0.0" y="0.0" width="61.45436892686487" height="59.164657790428464" angle="0.0"><path close="true"><point type="NORMAL" x="30.727184463432437" y="0.0"></point><point type="NORMAL" x="46.08891946918679" y="29.581640661984945"></point><point type="NORMAL" x="61.45436892686487" y="59.164657790428464"></point><point type="NORMAL" x="30.727184463432437" y="59.164657790428464"></point><point type="NORMAL" x="0.0" y="59.164657790428464"></point><point type="NORMAL" x="15.364211307036834" y="29.5816420384514"></point><point type="NORMAL" x="30.727184463432437" y="0.0"></point></path></polygon><text x="12.293597593981275" y="26.699319015521" width="36.86841217293377" height="31.69589373049972" angle="0.0"></text></group></sheet></diagram>
@(polygons : Seq[Polygon] )
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>ざっくりいろふ</title>
<script src="/assets/javascripts/raphael-min.js"></script>
<script src="/assets/javascripts/jquery-1.7.1.min.js"></script>
</head>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: #eee;
}
div#canvas {
margin: 30px;
width: 640px;
height: 480px;
}
</style>
<script type="text/javascript">
$(function() {
var paper = Raphael("canvas");
var paths = new Array();
@for((polygon,i) <- polygons.zipWithIndex) {
var path = paper.path("@polygon.draw()").attr({fill:"white", "storoke-width":1});
paths.push(path.id);
}
});
</script>
<body>
<div id="canvas"></div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment