User:Lieven Van Speybroeck/Prototyping/9-Constellate me

From XPUB & Lens-Based wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Star Vector Graphics

Find out what your real constellation is...

UPDATE (v0.2)

The constellator has been turned into a cgi-script.
User-friendly and all!


--- code ---

constellation.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Constellator</title>
<link href="constellation.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
function validate(){
	var name=document.forms["constellation"]["name"].value;
	var date=document.forms["constellation"]["date"].value;
	
	if (name==null || name==""){
  		alert("The stars need a name");
  		return false;
  	}
  	else if (date==null || date=="") {
  		alert("The stars need a date")
  		return false;
  	}
  	
  	if ((name.match(/[a-z]/))==null){
 		alert('The stars only understand an [a-z] name');
 		return false;
 	}
}

function doDate(){
	date = new Date();
	day = date.getDate();
	if (day < 10) {
		day = "0"+day;
	}
	if (month < 10) {
		month = "0"+month;
	}
	month = date.getMonth();
	year = date.getFullYear();
	document.forms["constellation"]["date"].value = year+"-"+month+"-"+day;
}
</script>
</head>
<body onload="doDate();">
<div class="container">
<form name="constellation" action="../cgi-bin/constellation.cgi" onsubmit="return validate()" method="get">
	<ul>
		<li>name:<br/><input type="text" name="name" size="30" Value="Your name here"></li>
		<li>date of birth:<br/><input type="date" name="date" size="30"></li>
		<li><input type="submit" value="*~*:._constellat0rrr_.:*~*" class="button"></li>
	</ul>
</form>
</div>
</body>
</html>

constellation.cgi

#!/usr/bin/python
#-*- coding:utf-8 -*-

import cgi, cgitb, random, string

alphabet = string.lowercase
form = cgi.FieldStorage()
name = (form.getvalue('name'))
date = (form.getvalue('date')).split("-")
clean = name.replace(" ","")
day = float(date[2])
month = float(date[1])
year = date[0]
year = float(year[2:])
characters = list(clean.lower());

print "Content-type: image/svg+xml"
print 

print """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="100%"
   height="100%"
   id="svg3040"
   version="1.1"
   inkscape:version="0.48.1 r9760"
   sodipodi:docname="New document 3">
  <defs
     id="defs3042" />
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.0"
     inkscape:pageshadow="2"
     inkscape:zoom="1.979899"
     inkscape:cx="335.42751"
     inkscape:cy="427.91605"
     inkscape:document-units="px"
     inkscape:current-layer="layer2"
     showgrid="false"
     inkscape:snap-global="false"
     inkscape:window-width="1918"
     inkscape:window-height="1177"
     inkscape:window-x="0"
     inkscape:window-y="21"
     inkscape:window-maximized="0" />
  <metadata
     id="metadata3045">
    <rdf:RDF>
      <cc:Work
	 rdf:about="">
	<dc:format>image/svg+xml</dc:format>
	<dc:type
	   rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
	<dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="sky"
     inkscape:groupmode="layer"
     id="layer1"
     sodipodi:insensitive="true">
    <rect
       style="fill:#000000;fill-opacity:1;stroke:none"
       id="rect3048"
       width="100%"
       height="100%" />
  </g>
  <g
     inkscape:groupmode="layer"
     id="layer2"
     inkscape:label="constellation">"""

circle = """<circle cx="{0}%" cy="{1}%" r="{2}%"
	fill="{3}" stroke="none" style="opacity:{4};" />"""
line = """<line x1="{0}%" y1="{1}%" x2="{2}%" y2="{3}%" stroke="#ff00ff" stroke-width="0.1%" />"""

text = """<text x="{0}%" y="{1}%" fill="#FF00FF" font-family="Courier"
font-size="13" text-anchor="middle">{2}</text>"""

for x in range(0,800):
	print circle.format(random.random()*100, random.random()*100, random.random()/5, 'grey', random.random())

x = 0
for n in characters:
	pos = ((alphabet.index(n))+1)
	if 1 <= pos <= 4:
		y1 = day*2
		x1 = (pos*10)+day*2
	elif 5 <= pos <= 8:
		y1 = month*2
		x1 = ((pos-4)*10)+day*2
	elif 9 <= pos <= 12:
		y1 = day*3
		x1 = ((pos-8)*10)+day*2
	elif 13 <= pos <= 16:
		y1 = month*3
		x1 = ((pos-12)*10)+month*2
	elif 17 <= pos <= 20:
		y1 = year/2
		x1 = ((pos-16)*10)+month*2
	elif 21 <= pos <= 24:
		y1 = day+month*2
		x1 = ((pos-20)*10)+month*2
	elif 25 <= pos <= 26:
		y1 = 90
		x1 = ((pos-24)*10)+day*2
	if x != 0:
		print line.format(x2, y2, x1, y1)
	else:
		textx = x1
		texty = y1-2
	print circle.format(x1, y1, random.random()/3+0.05, 'white',1)
	x2 = x1
	y2 = y1
	x+=1
print text.format(textx, texty, name)
print"""
</g>
</svg>"""


____DEPRECATED SECTION (v0.1)________

examples

constellate(.py)

#!/usr/bin/python
import sys, string, random

alphabet = string.lowercase
name = sys.argv[1]
clean = sys.argv[1].replace(" ",'')
try:
	characters = list(clean.lower());
	length = len(sys.argv[1]);
	f = open('constellations/'+name+'.svg', 'w')

	f.write("""<?xml version="1.0" encoding="UTF-8" standalone="no"?>
	<!-- Created with Inkscape (http://www.inkscape.org/) -->

	<svg
	   xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:cc="http://creativecommons.org/ns#"
	   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	   xmlns:svg="http://www.w3.org/2000/svg"
	   xmlns="http://www.w3.org/2000/svg"
	   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
	   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
	   width="100%"
	   height="100%"
	   id="svg3040"
	   version="1.1"
	   inkscape:version="0.48.1 r9760"
	   sodipodi:docname="New document 3">
	  <defs
	     id="defs3042" />
	  <sodipodi:namedview
	     id="base"
	     pagecolor="#ffffff"
	     bordercolor="#666666"
	     borderopacity="1.0"
	     inkscape:pageopacity="0.0"
	     inkscape:pageshadow="2"
	     inkscape:zoom="1.979899"
	     inkscape:cx="335.42751"
	     inkscape:cy="427.91605"
	     inkscape:document-units="px"
	     inkscape:current-layer="layer2"
	     showgrid="false"
	     inkscape:snap-global="false"
	     inkscape:window-width="1918"
	     inkscape:window-height="1177"
	     inkscape:window-x="0"
	     inkscape:window-y="21"
	     inkscape:window-maximized="0" />
	  <metadata
	     id="metadata3045">
	    <rdf:RDF>
	      <cc:Work
		 rdf:about="">
		<dc:format>image/svg+xml</dc:format>
		<dc:type
		   rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
		<dc:title></dc:title>
	      </cc:Work>
	    </rdf:RDF>
	  </metadata>
	  <g
	     inkscape:label="sky"
	     inkscape:groupmode="layer"
	     id="layer1"
	     sodipodi:insensitive="true">
	    <rect
	       style="fill:#000000;fill-opacity:1;stroke:none"
	       id="rect3048"
	       width="100%"
	       height="100%" />
	  </g>
	  <g
	     inkscape:groupmode="layer"
	     id="layer2"
	     inkscape:label="constellation">""")

	circle = """<circle cx="{0}%" cy="{1}%" r="{2}" fill="{3}" stroke="none" style="opacity:{4};" />"""
	line = """<line x1="{0}%" y1="{1}%" x2="{2}%" y2="{3}%" stroke="#ff00ff" stroke-width="0.1%" />"""
	text = """<text x="{0}%" y="{1}%" fill="#ff00ff" font-family="Courier" font-size="13" text-anchor="middle">{2}</text>"""

	for x in range(0,800):
		f.write(circle.format(random.random()*100, random.random()*100, random.randint(2,5), 'grey', random.random()))

	x = 0
	for n in characters:
		pos = ((alphabet.index(n))+1)
		if 1 <= pos <= 4:
			y1 = 20
			x1 = (pos*10)+20
		elif 5 <= pos <= 8:
			y1 = 30 
			x1 = ((pos-4)*10)+10
		elif 9 <= pos <= 12:
			y1 = 35
			x1 = ((pos-8)*10)+27
		elif 13 <= pos <= 16:
			y1 = 45
			x1 = ((pos-12)*10)+18
		elif 17 <= pos <= 20:
			y1 = 53
			x1 = ((pos-16)*10)+12
		elif 21 <= pos <= 24:
			y1 = 77
			x1 = ((pos-20)*10)+36
		elif 25 <= pos <= 26:
			y1 = 84
			x1 = ((pos-24)*10)+23
		f.write(circle.format(x1, y1, random.randint(2,6), 'white',1))
		if x != 0:
			f.write(line.format(x2, y2, x1, y1))
		else:
			textx = x1
			texty = y1-2
		x2 = x1
		y2 = y1
		x=1
	f.write(text.format(textx, texty, name))
	f.write("""
	</g>
	</svg>""")
except:
	print '\n!-------------------------------!\nOnly characters from a-z allowed\n!-------------------------------!\n'

run

  • $ chmod +x constellate
  • $ cp constellate /usr/local/bin
  • $ constellate 'Whatever you want to write in the stars'