Compare commits
6 Commits
955aa8f10a
...
0070094b94
Author | SHA1 | Date | |
---|---|---|---|
0070094b94 | |||
37f8d181c2 | |||
5384d9a964 | |||
ff11c1ce84 | |||
0a8a0e3c53 | |||
b1d56fea04 |
@ -20,6 +20,7 @@ import os.path
|
|||||||
|
|
||||||
import filecheck
|
import filecheck
|
||||||
import colors
|
import colors
|
||||||
|
from polyomino import Cross,Disk
|
||||||
|
|
||||||
class Command_prompt(Label):
|
class Command_prompt(Label):
|
||||||
|
|
||||||
@ -338,6 +339,9 @@ class Command_prompt(Label):
|
|||||||
if argv[1]=="color":
|
if argv[1]=="color":
|
||||||
self.run_set_color(argv)
|
self.run_set_color(argv)
|
||||||
return
|
return
|
||||||
|
elif argv[1]=="shape":
|
||||||
|
self.run_set_shape(argv)
|
||||||
|
return
|
||||||
elif argv[1]=="grid":
|
elif argv[1]=="grid":
|
||||||
self.run_set_grid(argv)
|
self.run_set_grid(argv)
|
||||||
return
|
return
|
||||||
@ -350,7 +354,7 @@ class Command_prompt(Label):
|
|||||||
# set color
|
# set color
|
||||||
def run_set_color(self,argv):
|
def run_set_color(self,argv):
|
||||||
if len(argv)<3:
|
if len(argv)<3:
|
||||||
self.message="error: 'set color' command was run with without anargument -- usage: 'set color <color_descriptor>'"
|
self.message="error: 'set color' command was run with without an argument -- usage: 'set color <color_descriptor>'"
|
||||||
return
|
return
|
||||||
# find color name in list
|
# find color name in list
|
||||||
for color in colors.xcolor_names:
|
for color in colors.xcolor_names:
|
||||||
@ -372,6 +376,19 @@ class Command_prompt(Label):
|
|||||||
return
|
return
|
||||||
self.app.painter.set_color(color)
|
self.app.painter.set_color(color)
|
||||||
|
|
||||||
|
# set particle shape
|
||||||
|
def run_set_shape(self,argv):
|
||||||
|
if len(argv)<3:
|
||||||
|
self.message="error: 'set shape' command was run with without an argument -- usage: 'set shape <shape_descriptor>'"
|
||||||
|
return
|
||||||
|
elif argv[2]=="cross":
|
||||||
|
self.app.painter.shape=Cross
|
||||||
|
elif argv[2]=="disk":
|
||||||
|
self.app.painter.shape=Disk
|
||||||
|
else:
|
||||||
|
self.message="error: unrecognized shape '"+argv[2]+"'; supported shapes are cross|disk"
|
||||||
|
return
|
||||||
|
|
||||||
# toggle grid
|
# toggle grid
|
||||||
def run_set_grid(self,argv):
|
def run_set_grid(self,argv):
|
||||||
if len(argv)==2:
|
if len(argv)==2:
|
||||||
|
50
src/jam
50
src/jam
@ -40,6 +40,10 @@ def read_cli():
|
|||||||
# lattice
|
# lattice
|
||||||
if c=='L':
|
if c=='L':
|
||||||
flag="lattice"
|
flag="lattice"
|
||||||
|
else:
|
||||||
|
print("error: unrecognized option '"+c+"'\n", file=sys.stderr)
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# read lattice argument
|
# read lattice argument
|
||||||
@ -57,10 +61,56 @@ def read_cli():
|
|||||||
else:
|
else:
|
||||||
openfile=arg
|
openfile=arg
|
||||||
(ret,message)=filecheck.check_edit(openfile)
|
(ret,message)=filecheck.check_edit(openfile)
|
||||||
|
preread_conf(openfile)
|
||||||
if ret<0:
|
if ret<0:
|
||||||
print(message,file=sys.stderr)
|
print(message,file=sys.stderr)
|
||||||
exit(-1)
|
exit(-1)
|
||||||
|
|
||||||
|
# read command line arguments from configuration file
|
||||||
|
def preread_conf(file):
|
||||||
|
global lattice
|
||||||
|
try:
|
||||||
|
ff=open(file,"r")
|
||||||
|
except:
|
||||||
|
print("error: could not read file '"+file+"' (this should not happen and is probably a bug)", file=sys.stderr)
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
# counter
|
||||||
|
i=0
|
||||||
|
try:
|
||||||
|
lines=ff.readlines()
|
||||||
|
except:
|
||||||
|
print("error: could not read the contents of file '"+file+"'", file=sys.stderr)
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
i+=1
|
||||||
|
# remove newline
|
||||||
|
line=line[:len(line)-1]
|
||||||
|
# ignore comments
|
||||||
|
if '#' in line:
|
||||||
|
line=line[:line.find('#')]
|
||||||
|
# ignore empty lines
|
||||||
|
if len(line)==0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# read options
|
||||||
|
if line[0]=='%':
|
||||||
|
# ignore empty line
|
||||||
|
if len(line)==1:
|
||||||
|
continue
|
||||||
|
[key,val]=line[1:].split('=',1)
|
||||||
|
if key=="lattice":
|
||||||
|
# test the specification
|
||||||
|
(obj,message)=Lattice.new(val)
|
||||||
|
if obj==None:
|
||||||
|
print("error: line "+str(i)+" in file '"+file+"': "+message,file=sys.stderr)
|
||||||
|
exit(-1)
|
||||||
|
lattice=val
|
||||||
|
|
||||||
|
ff.close()
|
||||||
|
|
||||||
|
|
||||||
# read cli
|
# read cli
|
||||||
read_cli()
|
read_cli()
|
||||||
|
|
||||||
|
@ -35,6 +35,12 @@ class Painter(Widget):
|
|||||||
# list of particles
|
# list of particles
|
||||||
self.particles=[]
|
self.particles=[]
|
||||||
|
|
||||||
|
# shape of particle to add next
|
||||||
|
self.shape=Cross
|
||||||
|
|
||||||
|
# color of particle to add next
|
||||||
|
self.color=(0,0,1)
|
||||||
|
|
||||||
# underlying lattice
|
# underlying lattice
|
||||||
self.lattice=None
|
self.lattice=None
|
||||||
|
|
||||||
@ -229,8 +235,7 @@ class Painter(Widget):
|
|||||||
|
|
||||||
# create new particle
|
# create new particle
|
||||||
if touch.button=="right":
|
if touch.button=="right":
|
||||||
new=Cross(touchx,touchy)
|
new=self.shape(touchx,touchy,color=self.color)
|
||||||
#new=Disk(touchx,touchy)
|
|
||||||
# snap to lattice
|
# snap to lattice
|
||||||
if self.lattice!=None:
|
if self.lattice!=None:
|
||||||
new.move(self.lattice.nearest_delta(new.elements[0].pos))
|
new.move(self.lattice.nearest_delta(new.elements[0].pos))
|
||||||
@ -438,6 +443,9 @@ class Painter(Widget):
|
|||||||
|
|
||||||
# set color of selected particles
|
# set color of selected particles
|
||||||
def set_color(self,color):
|
def set_color(self,color):
|
||||||
|
# set color for next particles
|
||||||
|
self.color=color
|
||||||
|
# set color of selected particles
|
||||||
for particle in self.selected:
|
for particle in self.selected:
|
||||||
particle.color=color
|
particle.color=color
|
||||||
# redraw
|
# redraw
|
||||||
@ -461,6 +469,15 @@ class Painter(Widget):
|
|||||||
# write configuration to file
|
# write configuration to file
|
||||||
def write(self,file):
|
def write(self,file):
|
||||||
ff=open(file,"w")
|
ff=open(file,"w")
|
||||||
|
# save state (particle shape, zoom, lattice)
|
||||||
|
if self.shape==Cross:
|
||||||
|
ff.write("%shape=cross\n")
|
||||||
|
else:
|
||||||
|
ff.write("%shape=disk\n")
|
||||||
|
ff.write("%zoom={:1.1f}\n".format(self.base_size/50))
|
||||||
|
ff.write("%color={:d},{:d},{:d}\n".format(self.color[0],self.color[1],self.color[2]))
|
||||||
|
if self.lattice != None:
|
||||||
|
ff.write("%lattice="+self.lattice.type+':'+str(self.lattice.spacing)+"\n")
|
||||||
for particle in self.particles:
|
for particle in self.particles:
|
||||||
if type(particle)==Cross:
|
if type(particle)==Cross:
|
||||||
ff.write("{:d};".format(CROSS_INDEX))
|
ff.write("{:d};".format(CROSS_INDEX))
|
||||||
@ -500,12 +517,35 @@ class Painter(Widget):
|
|||||||
if len(line)==0:
|
if len(line)==0:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# read options
|
||||||
|
if line[0]=='%':
|
||||||
|
# ignore empty line
|
||||||
|
if len(line)==1:
|
||||||
|
continue
|
||||||
|
[key,val]=line[1:].split('=',1)
|
||||||
|
if key=="shape":
|
||||||
|
self.app.command_prompt.run_set_shape(["set","shape",val])
|
||||||
|
elif key=="zoom":
|
||||||
|
self.app.command_prompt.run_set_zoom(["set","zoom",val])
|
||||||
|
elif key=="color":
|
||||||
|
color_str=val.split(',')
|
||||||
|
try:
|
||||||
|
self.set_color((float(color_str[0]),float(color_str[1]),float(color_str[2])))
|
||||||
|
except:
|
||||||
|
print("warning: ignoring line "+str(i)+" in file '"+file+"': color '"+color_str+"' cannot be read",file=sys.stderr)
|
||||||
|
# lattice is handled by main function
|
||||||
|
elif key=="lattice":
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
print("warning: ignoring line "+str(i)+" in file '"+file+"': unrecognized option '"+key+"'",file=sys.stderr)
|
||||||
|
continue
|
||||||
|
|
||||||
entries=line.split(";")
|
entries=line.split(";")
|
||||||
# skip line if improperly formatted
|
# skip line if improperly formatted
|
||||||
if len(entries)>3:
|
if len(entries)>3:
|
||||||
print("warning: ignoring line "+str(i)+" in file '"+file+"': more than three ';' spearated entries in '"+line+"'",file=sys.stderr)
|
print("warning: ignoring line "+str(i)+" in file '"+file+"': more than three ';' separated entries in '"+line+"'",file=sys.stderr)
|
||||||
if len(entries)<2:
|
if len(entries)<2:
|
||||||
print("warning: ignoring line "+str(i)+" in file '"+file+"': fewer than two ';' spearated entries in '"+line+"'",file=sys.stderr)
|
print("warning: ignoring line "+str(i)+" in file '"+file+"': fewer than two ';' separated entries in '"+line+"'",file=sys.stderr)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# position
|
# position
|
||||||
|
Reference in New Issue
Block a user