Material: allow to display Drawing Patterns in material editor - issue #2577
This commit is contained in:
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user