Material: allow to display Drawing Patterns in material editor - issue #2577

This commit is contained in:
Yorik van Havre
2016-06-09 22:19:45 -03:00
parent ed07c9f7b7
commit 072f75a8a8
3 changed files with 144 additions and 33 deletions

View File

@@ -138,9 +138,10 @@ def buildPattern(name,scale=5,thickness=1,color="#000000"):
"""buildPattern(name,scale=5,thickness=1,color="#000000")
builds an SVG <pattern> fragment from a name and path data"""
name,scale,thickness = decodeName(name,scale,thickness)
if not (name in Patterns.keys()):
return None
pname = name + "_" + str(scale) + "_" + str(thickness)
pname = name + "_" + str(scale).replace(".","") + "_" + str(thickness).replace(".","")
data = Patterns[name]
template='''<pattern id="$name" patternUnits="userSpaceOnUse"
patternTransform="matrix($scale,0,0,$scale,0,0)" x="0" y="0" width="10" height="10">
@@ -155,25 +156,74 @@ def buildPattern(name,scale=5,thickness=1,color="#000000"):
return t
def buildTextureImage(name,scale,thickness,color="#000000",size=64):
def buildTextureImage(name,scale=5,thickness=1,color="#000000",size=64):
"""buildTextureImage(name,scale,thickness,color="#000000",size=64)
builds a 64x64 SVG image filled with the given texture"""
name,scale,thickness = decodeName(name,scale,thickness)
if not (name in Patterns.keys()):
return None
s = str(size)
template = '''<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="'''+s+'''" height="'''+s+'''"><defs>$pattern</defs><rect x="0"
y="$0" width="'''+s+'''" height="'''+s+'''" style="fill:url(#$name);
stroke:none; stroke-width:none"/></svg>'''
if not (name in Patterns.keys()):
return None
pat = buildPattern(name,scale,thickness,color)
t = template.replace("\n","")
t = t.replace("$pattern",pat+"\n")
t = t.replace("$name",name+"_"+str(scale)+"_"+str(thickness))
t = t.replace("$name",name+"_"+str(scale).replace(".","")+"_"+str(thickness).replace(".",""))
return t
def buildSwatch(name,scale=5,thickness=1,color="#000000",size=64):
"""buildSwatch(name,scale,thickness,color="#000000",size=64)
builds a 64x64 SVG image filled with the given texture, a
white background and a border, to serve as a sample"""
name,scale,thickness = decodeName(name,scale,thickness)
if not (name in Patterns.keys()):
return None
s = str(size)
template = '''<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="'''+s+'''" height="'''+s+'''"><defs>$pattern</defs><rect x="0"
y="$0" width="'''+s+'''" height="'''+s+'''" style="fill:#FFFFFF;
stroke:none; stroke-width:none"/><rect x="0" y="$0" width="'''+s+'''"
height="'''+s+'''" style="fill:url(#$name); stroke:#000000;
stroke-width:2"/></svg>'''
pat = buildPattern(name,scale,thickness,color)
t = template.replace("\n","")
t = t.replace("$pattern",pat+"\n")
t = t.replace("$name",name+"_"+str(scale).replace(".","")+"_"+str(thickness).replace(".",""))
return t
def buildFileSwatch(name,scale=5,thickness=1,color="#000000",size=64,png=False):
"""buildFileSwatch(name,scale,thickness,color="#000000",size=64,png=False)
builds a 64x64 SVG image filled with the given texture, a
white background and a border, to serve as a sample. The image
is saved as a temp file, the filepath is returned"""
s = buildSwatch(name,scale,thickness,color,size)
if s:
import tempfile
tf = tempfile.mkstemp(suffix=".svg")[1]
f = open(tf,"wb")
f.write(s)
f.close()
if png:
# we use imagemagick's convert because Qt4 doesn't support SVG patterns...
import os
if os.system("convert -version") == 0:
ptf = os.path.splitext(tf)[0]+".png"
os.system('convert "'+tf+'" "'+ptf+'"')
return ptf
else:
return tf
return None
def saveTestImage(filename,scales=[2.5,5],thicknesses=[0.1,0.2,1]):
"""saveTestImage(filename,scales=[2.5,5],thicknesses=[0.1,0.2,1])
@@ -212,6 +262,24 @@ def saveTestImage(filename,scales=[2.5,5],thicknesses=[0.1,0.2,1]):
f = open(filename,"wb")
f.write(t)
f.close()
def decodeName(name,scale,thickness):
"""decodeName(name,scale,thickness) : decodes names written in the form 'name_5_1'"""
name = name.split("_")
if len(name) > 1:
try:
scale = float(name[1])
except:
pass
if len(name) > 2:
try:
thickness = float(name[2])
except:
pass
return name[0],scale,thickness
def getPatternNames():