export to tikz

This commit is contained in:
Ian Jauslin 2022-02-18 17:21:55 -05:00
parent 28355777e1
commit 57fb407dea
3 changed files with 242 additions and 1 deletions

188
src/colors.py Normal file
View File

@ -0,0 +1,188 @@
# find named color that is closest to rgb values
def closest_color(rgb,names):
name=""
mindist=float('inf')
for i in range(len(names)):
dist=(rgb[0]-names[i][1])**2+(rgb[1]-names[i][2])**2+(rgb[2]-names[i][3])**2
if dist<mindist:
name=names[i][0]
mindist=dist
return name
# color names
## This is adapted from the LaTeX xcolor package
## which is licensed under the LaTeX Project Public License v1.3c
## by Dr. Uwe Kern
##
xcolor_names=[#
["red",1,0,0],#
["green",0,1,0],#
["blue",0,0,1],#
["brown",.75,.5,.25],#
["lime",.75,1,0],#
["orange",1,.5,0],#
["pink",1,.75,.75],#
["purple",.75,0,.25],#
["teal",0,.5,.5],#
["violet",.5,0,.5],#
["cyan",0,1,1],#
["magenta",1,0,1],#
["yellow",1,1,0],#
["olive",.5,.5,0],#
["black",0,0,0],#
["darkgray",.25,.25,.25],#
["gray",.5,.5,.5],#
["lightgray",.75,.75,.75],#
["white",1,1,1],#
##
["AliceBlue",.94,.972,1],#
["AntiqueWhite",.98,.92,.844],#
["Aquamarine",.498,1,.83],#
["Azure",.94,1,1],#
["Beige",.96,.96,.864],#
["Bisque",1,.894,.77],#
["Black",0,0,0],#
["BlanchedAlmond",1,.92,.804],#
["Blue",0,0,1],#
["BlueViolet",.54,.17,.888],#
["Brown",.648,.165,.165],#
["BurlyWood",.87,.72,.53],#
["CadetBlue",.372,.62,.628],#
["Chartreuse",.498,1,0],#
["Chocolate",.824,.41,.116],#
["Coral",1,.498,.312],#
["CornflowerBlue",.392,.585,.93],#
["Cornsilk",1,.972,.864],#
["Crimson",.864,.08,.235],#
["Cyan",0,1,1],#
["DarkBlue",0,0,.545],#
["DarkCyan",0,.545,.545],#
["DarkGoldenrod",.72,.525,.044],#
["DarkGray",.664,.664,.664],#
["DarkGreen",0,.392,0],#
["DarkGrey",.664,.664,.664],#
["DarkKhaki",.74,.716,.42],#
["DarkMagenta",.545,0,.545],#
["DarkOliveGreen",.332,.42,.185],#
["DarkOrange",1,.55,0],#
["DarkOrchid",.6,.196,.8],#
["DarkRed",.545,0,0],#
["DarkSalmon",.912,.59,.48],#
["DarkSeaGreen",.56,.736,.56],#
["DarkSlateBlue",.284,.24,.545],#
["DarkSlateGray",.185,.31,.31],#
["DarkSlateGrey",.185,.31,.31],#
["DarkTurquoise",0,.808,.82],#
["DarkViolet",.58,0,.828],#
["DeepPink",1,.08,.576],#
["DeepSkyBlue",0,.75,1],#
["DimGray",.41,.41,.41],#
["DimGrey",.41,.41,.41],#
["DodgerBlue",.116,.565,1],#
["FireBrick",.698,.132,.132],#
["FloralWhite",1,.98,.94],#
["ForestGreen",.132,.545,.132],#
["Gainsboro",.864,.864,.864],#
["GhostWhite",.972,.972,1],#
["Gold",1,.844,0],#
["Goldenrod",.855,.648,.125],#
["Gray",.5,.5,.5],#
["Green",0,.5,0],#
["GreenYellow",.68,1,.185],#
["Grey",.5,.5,.5],#
["Honeydew",.94,1,.94],#
["HotPink",1,.41,.705],#
["IndianRed",.804,.36,.36],#
["Indigo",.294,0,.51],#
["Ivory",1,1,.94],#
["Khaki",.94,.9,.55],#
["Lavender",.9,.9,.98],#
["LavenderBlush",1,.94,.96],#
["LawnGreen",.488,.99,0],#
["LemonChiffon",1,.98,.804],#
["LightBlue",.68,.848,.9],#
["LightCoral",.94,.5,.5],#
["LightCyan",.88,1,1],#
["LightGoldenrod",.933,.867,.51],#
["LightGoldenrodYellow",.98,.98,.824],#
["LightGray",.828,.828,.828],#
["LightGreen",.565,.932,.565],#
["LightGrey",.828,.828,.828],#
["LightPink",1,.712,.756],#
["LightSalmon",1,.628,.48],#
["LightSeaGreen",.125,.698,.668],#
["LightSkyBlue",.53,.808,.98],#
["LightSlateBlue",.518,.44,1],#
["LightSlateGray",.468,.532,.6],#
["LightSlateGrey",.468,.532,.6],#
["LightSteelBlue",.69,.77,.87],#
["LightYellow",1,1,.88],#
["Lime",0,1,0],#
["LimeGreen",.196,.804,.196],#
["Linen",.98,.94,.9],#
["Magenta",1,0,1],#
["Maroon",.5,0,0],#
["MediumAquamarine",.4,.804,.668],#
["MediumBlue",0,0,.804],#
["MediumOrchid",.73,.332,.828],#
["MediumPurple",.576,.44,.86],#
["MediumSeaGreen",.235,.7,.444],#
["MediumSlateBlue",.484,.408,.932],#
["MediumSpringGreen",0,.98,.604],#
["MediumTurquoise",.284,.82,.8],#
["MediumVioletRed",.78,.084,.52],#
["MidnightBlue",.098,.098,.44],#
["MintCream",.96,1,.98],#
["MistyRose",1,.894,.884],#
["Moccasin",1,.894,.71],#
["NavajoWhite",1,.87,.68],#
["Navy",0,0,.5],#
["NavyBlue",0,0,.5],#
["OldLace",.992,.96,.9],#
["Olive",.5,.5,0],#
["OliveDrab",.42,.556,.136],#
["Orange",1,.648,0],#
["OrangeRed",1,.27,0],#
["Orchid",.855,.44,.84],#
["PaleGoldenrod",.932,.91,.668],#
["PaleGreen",.596,.985,.596],#
["PaleTurquoise",.688,.932,.932],#
["PaleVioletRed",.86,.44,.576],#
["PapayaWhip",1,.936,.835],#
["PeachPuff",1,.855,.725],#
["Peru",.804,.52,.248],#
["Pink",1,.752,.796],#
["Plum",.868,.628,.868],#
["PowderBlue",.69,.88,.9],#
["Purple",.5,0,.5],#
["Red",1,0,0],#
["RosyBrown",.736,.56,.56],#
["RoyalBlue",.255,.41,.884],#
["SaddleBrown",.545,.27,.075],#
["Salmon",.98,.5,.448],#
["SandyBrown",.956,.644,.376],#
["SeaGreen",.18,.545,.34],#
["Seashell",1,.96,.932],#
["Sienna",.628,.32,.176],#
["Silver",.752,.752,.752],#
["SkyBlue",.53,.808,.92],#
["SlateBlue",.415,.352,.804],#
["SlateGray",.44,.5,.565],#
["SlateGrey",.44,.5,.565],#
["Snow",1,.98,.98],#
["SpringGreen",0,1,.498],#
["SteelBlue",.275,.51,.705],#
["Tan",.824,.705,.55],#
["Teal",0,.5,.5],#
["Thistle",.848,.75,.848],#
["Tomato",1,.39,.28],#
["Turquoise",.25,.88,.815],#
["Violet",.932,.51,.932],#
["VioletRed",.816,.125,.565],#
["Wheat",.96,.87,.7],#
["White",1,1,1],#
["WhiteSmoke",.96,.96,.96],#
["Yellow",1,1,0],#
["YellowGreen",.604,.804,.196]#
]

View File

@ -259,7 +259,7 @@ class Command_prompt(Label):
cursor=self.parse_argv() cursor=self.parse_argv()
# write and edit commands # write and edit commands
if self.argv[0]=="w" or self.argv[0]=="e": if self.argv[0]=="w" or self.argv[0]=="e" or self.argv[0]=="export":
# check that cursor is in first argument # check that cursor is in first argument
if cursor[0]==1: if cursor[0]==1:
# complete filesystem path # complete filesystem path
@ -307,6 +307,9 @@ class Command_prompt(Label):
# edit file # edit file
if self.argv[0]=="e": if self.argv[0]=="e":
self.run_edit(self.argv) self.run_edit(self.argv)
# export to file
if self.argv[0]=="export":
self.run_export(self.argv)
# quit # quit
if self.argv[0]=="q" or self.argv=="wq": if self.argv[0]=="q" or self.argv=="wq":
self.app.stop() self.app.stop()
@ -461,3 +464,21 @@ class Command_prompt(Label):
self.app.openfile=argv[1] self.app.openfile=argv[1]
# update status bar # update status bar
self.app.status_bar.draw() self.app.status_bar.draw()
# export to file in Tikz format
def run_export(self,argv):
if len(argv)>2:
self.message="error: could not open file: too many arguments -- usage: ':export <path to file>'"
return
elif len(argv)==1:
self.message="error: could not open file: no argument found -- usage: ':export <path to file>'"
return
# check that the file can be edited
(ret,self.message)=filecheck.check_edit(argv[1])
# error
if ret<0:
return
# export
self.app.painter.export_tikz(argv[1])

View File

@ -10,6 +10,8 @@ from polyomino import Square_element
from tools import remove_fromlist from tools import remove_fromlist
import colors
# painter class # painter class
class Painter(Widget): class Painter(Widget):
@ -451,6 +453,36 @@ class Painter(Widget):
ff.close() ff.close()
self.draw() self.draw()
# export to tikz
def export_tikz(self,file):
# abort if no particles
if len(self.particles)==0:
return
ff=open(file,"w")
# header
ff.write("\documentclass{standalone}\n")
ff.write("\n")
ff.write("\\usepackage[svgnames]{xcolor}\n")
ff.write("\\usepackage{tikz}\n")
ff.write("\\usepackage{jam}\n")
ff.write("\n")
ff.write("\\begin{document}\n")
ff.write("\\begin{tikzpicture}\n")
ff.write("\n")
# write position of particles
for particle in self.particles:
if type(particle)==Cross:
ff.write("\cross{"+colors.closest_color(particle.color,colors.xcolor_names)+"}")
ff.write("{{({:05.2f},{:05.2f})}};\n".format(particle.squares[0].pos.x-self.particles[0].squares[0].pos.x,particle.squares[0].pos.y-self.particles[0].squares[0].pos.y))
ff.write("\\end{tikzpicture}\n")
ff.write("\\end{document}\n")
ff.write("\n")
ff.close()
# set zoom level # set zoom level
def set_zoom(self,level): def set_zoom(self,level):
Square_element.size=level*50 Square_element.size=level*50